| From e52292f89964b8c709f8441efd880ad404b09094 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 22 Jul 2020 11:12:46 -0400 |
| Subject: btrfs: don't show full path of bind mounts in subvol= |
| |
| 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 |
| |