Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55e298e6 authored by JP Abgrall's avatar JP Abgrall Committed by Android (Google) Code Review
Browse files

Merge "fsmgr: revert multiple fs-types/mountpoint (fix N5 boot)"

parents 6bd72bef f786fe54
Loading
Loading
Loading
Loading
+22 −47
Original line number Diff line number Diff line
@@ -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);
    }

out:
    return ret;
+4 −26
Original line number Diff line number Diff line
@@ -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++) {
        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)
+0 −5
Original line number Diff line number Diff line
@@ -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;