diff options
author | JP Abgrall <jpa@google.com> | 2014-06-18 07:28:14 +0000 |
---|---|---|
committer | JP Abgrall <jpa@google.com> | 2014-06-18 07:28:14 +0000 |
commit | f786fe54388cb4461f8e13845ca6a1df0d2e1236 (patch) | |
tree | 281e8e34a649d2fe05062228e10a25650965faa1 | |
parent | a794f86522f9125f2547c94ebc7c74d1e7ace013 (diff) | |
download | system_core-f786fe54388cb4461f8e13845ca6a1df0d2e1236.tar.gz system_core-f786fe54388cb4461f8e13845ca6a1df0d2e1236.tar.bz2 system_core-f786fe54388cb4461f8e13845ca6a1df0d2e1236.zip |
fsmgr: revert multiple fs-types/mountpoint (fix N5 boot)
This is apparently breaking N5, so reverting for now.
This reverts commit a794f86522f9125f2547c94ebc7c74d1e7ace013.
Bug: 15709256
Change-Id: I37a5160eead17e153e2c83fa94632ffa5d8553c2
-rw-r--r-- | fs_mgr/fs_mgr.c | 69 | ||||
-rw-r--r-- | fs_mgr/fs_mgr_fstab.c | 30 | ||||
-rw-r--r-- | fs_mgr/include/fs_mgr.h | 5 |
3 files changed, 26 insertions, 78 deletions
diff --git a/fs_mgr/fs_mgr.c b/fs_mgr/fs_mgr.c index 798007d8b..d2938cf31 100644 --- a/fs_mgr/fs_mgr.c +++ b/fs_mgr/fs_mgr.c @@ -190,12 +190,12 @@ static void fs_set_blk_ro(const char *blockdev) * sets the underlying block device to read-only if the mount is read-only. * See "man 2 mount" for return values. */ -static int __mount(const char *source, const char *target, const struct fstab_rec *rec) +static int __mount(const char *source, const char *target, + const char *filesystemtype, unsigned long mountflags, + const void *data) { - unsigned long mountflags = rec->flags; - int ret; + int ret = mount(source, target, filesystemtype, mountflags, data); - ret = mount(source, target, rec->fs_type, mountflags, rec->fs_options); if ((ret == 0) && (mountflags & MS_RDONLY) != 0) { fs_set_blk_ro(source); } @@ -232,18 +232,13 @@ static int device_is_debuggable() { return strcmp(value, "1") ? 0 : 1; } -/* When multiple fstab records share the same mount_point, it will - * try to mount each one in turn, and ignore any duplicates after a - * first successful mount. - */ int fs_mgr_mount_all(struct fstab *fstab) { - int i = 0, j = 0; + int i = 0; int encryptable = 0; int error_count = 0; int mret; int mount_errno; - const char *last_ok_mount_point = NULL; if (!fstab) { return -1; @@ -279,26 +274,10 @@ int fs_mgr_mount_all(struct fstab *fstab) } } - /* - * Don't try to mount/encrypt the same mount point again. - * Deal with alternate entries for the same point which are required to be all following - * each other. - */ - if (last_ok_mount_point && !strcmp(last_ok_mount_point, fstab->recs[i].mount_point)) { - continue; - } - /* Hunt down an fstab entry for the same mount point that might succeed */ - for (j = i, mret = -1; - /* We required that fstab entries for the same mountpoint be consecutive */ - mret && j < fstab->num_entries && !strcmp(fstab->recs[i].mount_point, fstab->recs[j].mount_point); - j++) { - mret = __mount(fstab->recs[j].blk_device, fstab->recs[j].mount_point, &fstab->recs[j]); - } - /* Did one of the same mount points mount? If so pick it. */ - if (!mret) { - i = j; - last_ok_mount_point = fstab->recs[i].mount_point; - } + mret = __mount(fstab->recs[i].blk_device, fstab->recs[i].mount_point, + fstab->recs[i].fs_type, fstab->recs[i].flags, + fstab->recs[i].fs_options); + if (!mret) { /* If this is encryptable, need to trigger encryption */ if ((fstab->recs[i].fs_mgr_flags & MF_FORCECRYPT)) { @@ -315,6 +294,7 @@ int fs_mgr_mount_all(struct fstab *fstab) continue; } } + /* Success! Go get the next one */ continue; } @@ -328,7 +308,10 @@ int fs_mgr_mount_all(struct fstab *fstab) /* Need to mount a tmpfs at this mountpoint for now, and set * properties that vold will query later for decrypting */ - if (fs_mgr_do_tmpfs_mount(fstab->recs[i].mount_point) < 0) { + if (mount("tmpfs", fstab->recs[i].mount_point, "tmpfs", + MS_NOATIME | MS_NOSUID | MS_NODEV, CRYPTO_TMPFS_OPTIONS) < 0) { + ERROR("Cannot mount tmpfs filesystem for encryptable fs at %s error: %s\n", + fstab->recs[i].mount_point, strerror(errno)); ++error_count; continue; } @@ -352,16 +335,12 @@ int fs_mgr_mount_all(struct fstab *fstab) /* If tmp_mount_point is non-null, mount the filesystem there. This is for the * tmp mount we do to check the user password - * If multiple fstab entries are to be mounted on "n_name", it will try to mount each one - * in turn, and stop on 1st success, or no more match. */ int fs_mgr_do_mount(struct fstab *fstab, char *n_name, char *n_blk_device, char *tmp_mount_point) { int i = 0; int ret = -1; - int mount_errors = 0; - int first_mount_errno = 0; char *m; if (!fstab) { @@ -407,23 +386,19 @@ int fs_mgr_do_mount(struct fstab *fstab, char *n_name, char *n_blk_device, } else { m = fstab->recs[i].mount_point; } - if (__mount(n_blk_device, m, &fstab->recs[i])) { - if (!first_mount_errno) first_mount_errno = errno; - mount_errors++; - continue; + if (__mount(n_blk_device, m, fstab->recs[i].fs_type, + fstab->recs[i].flags, fstab->recs[i].fs_options)) { + ERROR("Cannot mount filesystem on %s at %s options: %s error: %s\n", + n_blk_device, m, fstab->recs[i].fs_options, strerror(errno)); + goto out; } else { ret = 0; goto out; } } - if (mount_errors) { - ERROR("Cannot mount filesystem on %s at %s. error: %s\n", - n_blk_device, m, strerror(first_mount_errno)); - ret = -1; - } else { - /* We didn't find a match, say so and return an error */ - ERROR("Cannot find mount point %s in fstab\n", fstab->recs[i].mount_point); - } + + /* We didn't find a match, say so and return an error */ + ERROR("Cannot find mount point %s in fstab\n", fstab->recs[i].mount_point); out: return ret; diff --git a/fs_mgr/fs_mgr_fstab.c b/fs_mgr/fs_mgr_fstab.c index 3f841792c..6c21425bd 100644 --- a/fs_mgr/fs_mgr_fstab.c +++ b/fs_mgr/fs_mgr_fstab.c @@ -367,45 +367,23 @@ int fs_mgr_add_entry(struct fstab *fstab, return 0; } -/* - * Returns the 1st matching fstab_rec that follows the start_rec. - * start_rec is the result of a previous search or NULL. - */ -struct fstab_rec *fs_mgr_get_entry_for_mount_point_after(struct fstab_rec *start_rec, struct fstab *fstab, const char *path) +struct fstab_rec *fs_mgr_get_entry_for_mount_point(struct fstab *fstab, const char *path) { int i; + if (!fstab) { return NULL; } - if (start_rec) { - for (i = 0; i < fstab->num_entries; i++) { - if (&fstab->recs[i] == start_rec) { - i++; - break; - } - } - } else { - i = 0; - } - for (; i < fstab->num_entries; i++) { + for (i = 0; i < fstab->num_entries; i++) { int len = strlen(fstab->recs[i].mount_point); if (strncmp(path, fstab->recs[i].mount_point, len) == 0 && (path[len] == '\0' || path[len] == '/')) { return &fstab->recs[i]; } } - return NULL; -} -/* - * Returns the 1st matching mount point. - * There might be more. To look for others, use fs_mgr_get_entry_for_mount_point_after() - * and give the fstab_rec from the previous search. - */ -struct fstab_rec *fs_mgr_get_entry_for_mount_point(struct fstab *fstab, const char *path) -{ - return fs_mgr_get_entry_for_mount_point_after(NULL, fstab, path); + return NULL; } int fs_mgr_is_voldmanaged(struct fstab_rec *fstab) diff --git a/fs_mgr/include/fs_mgr.h b/fs_mgr/include/fs_mgr.h index b8bb5aa16..835cf6456 100644 --- a/fs_mgr/include/fs_mgr.h +++ b/fs_mgr/include/fs_mgr.h @@ -24,11 +24,6 @@ extern "C" { #endif -/* - * The entries must be kept in the same order as they were seen in the fstab. - * Unless explicitly requested, a lookup on mount point should always - * return the 1st one. - */ struct fstab { int num_entries; struct fstab_rec *recs; |