lkml.org 
[lkml]   [2021]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 4/5] virtiofs: Skip submounts in sget_fc()
    Date
    All submounts share the same virtio-fs device instance as the root
    mount. If the same virtiofs filesystem is mounted again, sget_fc()
    is likely to pick up any of these submounts and reuse it instead of
    the root mount.

    On the server side:

    # mkdir ${some_dir}
    # mkdir ${some_dir}/mnt1
    # mount -t tmpfs none ${some_dir}/mnt1
    # touch ${some_dir}/mnt1/THIS_IS_MNT1
    # mkdir ${some_dir}/mnt2
    # mount -t tmpfs none ${some_dir}/mnt2
    # touch ${some_dir}/mnt2/THIS_IS_MNT2

    On the client side:

    # mkdir /mnt/virtiofs1
    # mount -t virtiofs myfs /mnt/virtiofs1
    # ls /mnt/virtiofs1
    mnt1 mnt2
    # grep virtiofs /proc/mounts
    myfs /mnt/virtiofs1 virtiofs rw,seclabel,relatime 0 0
    none on /mnt/mnt1 type virtiofs (rw,relatime,seclabel)
    none on /mnt/mnt2 type virtiofs (rw,relatime,seclabel)

    And now remount it again:

    # mount -t virtiofs myfs /mnt/virtiofs2
    # grep virtiofs /proc/mounts
    myfs /mnt/virtiofs1 virtiofs rw,seclabel,relatime 0 0
    none on /mnt/mnt1 type virtiofs (rw,relatime,seclabel)
    none on /mnt/mnt2 type virtiofs (rw,relatime,seclabel)
    myfs /mnt/virtiofs2 virtiofs rw,seclabel,relatime 0 0
    # ls /mnt/virtiofs2
    THIS_IS_MNT2

    Submount mnt2 was picked-up instead of the root mount.

    Just skip submounts in virtio_fs_test_super().

    Signed-off-by: Greg Kurz <groug@kaod.org>
    ---
    fs/fuse/virtio_fs.c | 5 +++++
    1 file changed, 5 insertions(+)

    diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
    index e12e5190352c..8962cd033016 100644
    --- a/fs/fuse/virtio_fs.c
    +++ b/fs/fuse/virtio_fs.c
    @@ -1408,6 +1408,11 @@ static int virtio_fs_test_super(struct super_block *sb,
    struct fuse_mount *fsc_fm = fsc->s_fs_info;
    struct fuse_mount *sb_fm = get_fuse_mount_super(sb);

    +
    + /* Skip submounts */
    + if (!list_is_first(&sb_fm->fc_entry, &sb_fm->fc->mounts))
    + return 0;
    +
    return fsc_fm->fc->iq.priv == sb_fm->fc->iq.priv;
    }

    --
    2.26.3
    \
     
     \ /
      Last update: 2021-05-20 17:48    [W:4.124 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site