Various userspace scripts/tools may expect mount entries in
/proc/mounts to reflect the device path names used to mount the
associated filesystem. bcachefs seems to normalize the device path
to the underlying device name based on the block device. This
confuses tools like fstests when the test devices might be lvm or
device-mapper based.

The default behavior for show_vfsmnt() appers to be to use the
string passed to alloc_vfsmnt(), so tweak bcachefs to copy the path
at device superblock read time and to display it via
->show_devname().

Signed-off-by: Brian Foster <[email protected]>
---

I was looking into the freeze related generic/459 test failures and it
seems like there are two issues. One is the same reason fstests seems to
fall over any time the test/scratch devices are lvm based, which is that
bcachefs will show the /dev/dm-N devices in mount output vs. the
/dev/mapper/xxx format that the test scripts use. AFAICT most other
filesystems present the mount entry device based on the device path with
a slight difference with btrfs, which does the same thing but only shows
the "latest" device rather than listing all devices associated with the
fs.

The second issue is I think more of a test problem in that it assumes fs
shutdown reflects as "ro" mount status, which isn't always true for
bcachefs (or XFS). I have a tweak to the test to try and improve that
particular check, which combined with this patch allows the test to pass
reliably on bcachefs. The scope of fstests changes probably depends on
what we do on the kernel side, however, so I wanted to see what thoughts
we have on something like this. Hm?

Brian

 fs/bcachefs/fs.c          | 3 +--
 fs/bcachefs/super-io.c    | 5 +++++
 fs/bcachefs/super_types.h | 1 +
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index f76d403ccb76..424c3da188bb 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -1667,8 +1667,7 @@ static int bch2_show_devname(struct seq_file *seq, struct 
dentry *root)
                if (!first)
                        seq_putc(seq, ':');
                first = false;
-               seq_puts(seq, "/dev/");
-               seq_puts(seq, ca->name);
+               seq_puts(seq, ca->disk_sb.sb_name);
        }
 
        return 0;
diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c
index f4cad903f4d6..f3e12f7979d5 100644
--- a/fs/bcachefs/super-io.c
+++ b/fs/bcachefs/super-io.c
@@ -166,6 +166,7 @@ void bch2_free_super(struct bch_sb_handle *sb)
        if (!IS_ERR_OR_NULL(sb->bdev))
                blkdev_put(sb->bdev, sb->holder);
        kfree(sb->holder);
+       kfree(sb->sb_name);
 
        kfree(sb->sb);
        memset(sb, 0, sizeof(*sb));
@@ -675,6 +676,10 @@ int bch2_read_super(const char *path, struct bch_opts 
*opts,
        if (!sb->holder)
                return -ENOMEM;
 
+       sb->sb_name = kstrdup(path, GFP_KERNEL);
+       if (!sb->sb_name)
+               return -ENOMEM;
+
 #ifndef __KERNEL__
        if (opt_get(*opts, direct_io) == false)
                sb->mode |= BLK_OPEN_BUFFERED;
diff --git a/fs/bcachefs/super_types.h b/fs/bcachefs/super_types.h
index 7dda4985b99f..9c1fd4ca2b10 100644
--- a/fs/bcachefs/super_types.h
+++ b/fs/bcachefs/super_types.h
@@ -5,6 +5,7 @@
 struct bch_sb_handle {
        struct bch_sb           *sb;
        struct block_device     *bdev;
+       char                    *sb_name;
        struct bio              *bio;
        void                    *holder;
        size_t                  buffer_size;
-- 
2.41.0


Reply via email to