lkml.org 
[lkml]   [2020]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 018/107] btrfs: dont show full path of bind mounts in subvol=
    Date
    From: Josef Bacik <josef@toxicpanda.com>

    [ Upstream commit 3ef3959b29c4a5bd65526ab310a1a18ae533172a ]

    Chris Murphy reported a problem where rpm ostree will bind mount a bunch
    of things for whatever voodoo it's doing. But when it does this
    /proc/mounts shows something like

    /dev/sda /mnt/test btrfs rw,relatime,subvolid=256,subvol=/foo 0 0
    /dev/sda /mnt/test/baz btrfs rw,relatime,subvolid=256,subvol=/foo/bar 0 0

    Despite subvolid=256 being subvol=/foo. This is because we're just
    spitting out the dentry of the mount point, which in the case of bind
    mounts is the source path for the mountpoint. Instead we should spit
    out the path to the actual subvol. Fix this by looking up the name for
    the subvolid we have mounted. With this fix the same test looks like
    this

    /dev/sda /mnt/test btrfs rw,relatime,subvolid=256,subvol=/foo 0 0
    /dev/sda /mnt/test/baz btrfs rw,relatime,subvolid=256,subvol=/foo 0 0

    Reported-by: Chris Murphy <chris@colorremedies.com>
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/btrfs/super.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
    index 32c36821cc7b4..e21cae80c6d58 100644
    --- a/fs/btrfs/super.c
    +++ b/fs/btrfs/super.c
    @@ -1291,6 +1291,7 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
    {
    struct btrfs_fs_info *info = btrfs_sb(dentry->d_sb);
    const char *compress_type;
    + const char *subvol_name;

    if (btrfs_test_opt(info, DEGRADED))
    seq_puts(seq, ",degraded");
    @@ -1375,8 +1376,13 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
    seq_puts(seq, ",ref_verify");
    seq_printf(seq, ",subvolid=%llu",
    BTRFS_I(d_inode(dentry))->root->root_key.objectid);
    - seq_puts(seq, ",subvol=");
    - seq_dentry(seq, dentry, " \t\n\\");
    + subvol_name = btrfs_get_subvol_name_from_objectid(info,
    + BTRFS_I(d_inode(dentry))->root->root_key.objectid);
    + if (!IS_ERR(subvol_name)) {
    + seq_puts(seq, ",subvol=");
    + seq_escape(seq, subvol_name, " \t\n\\");
    + kfree(subvol_name);
    + }
    return 0;
    }

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-08-24 11:41    [W:4.049 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site