btrfs-progs: canonicalize pathnames for device commands
authorJeff Mahoney <jeffm@suse.com>
Wed, 4 Jun 2014 20:43:11 +0000 (16:43 -0400)
committerDavid Sterba <dsterba@suse.cz>
Fri, 22 Aug 2014 12:39:34 +0000 (14:39 +0200)
commitb276e4bc50b6ca99056a45315ea859c68d58fc1b
tree28a5c42642a658d46fd1b9c5d473d65fbfd1c955
parent350bb14bc6b925418e9ecc9852261085d38224df
btrfs-progs: canonicalize pathnames for device commands

mount(8) will canonicalize pathnames before passing them to the kernel.
Links to e.g. /dev/sda will be resolved to /dev/sda. Links to /dev/dm-#
will be resolved using the name of the device mapper table to
/dev/mapper/<name>.

Btrfs will use whatever name the user passes to it, regardless of whether
it is canonical or not. That means that if a 'btrfs device ready' is
issued on any device node pointing to the original device, it will adopt
the new name instead of the name that was used during mount.

Mounting using /dev/sdb2 will result in df:
/dev/sdb2      209715200 39328 207577088   1% /mnt

lrwxrwxrwx 1 root root 4 Jun  4 13:36 /dev/whatever-i-like -> sdb2
/dev/whatever-i-like 209715200 39328 207577088   1% /mnt

Likewise, mounting with /dev/mapper/whatever and using /dev/dm-0 with a
btrfs device command results in df showing /dev/dm-0. This can happen with
multipath devices with friendly names enabled and doing something like
'partprobe' which (at least with our version) ends up issuing a 'change'
uevent on the sysfs node. That *always* uses the dm-# name, and we get
confused users.

This patch does the same canonicalization of the paths that mount does
so that we don't end up having inconsistent names reported by ->show_devices
later.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
[use PATH_MAX in canonicalize_dm_name]
Signed-off-by: David Sterba <dsterba@suse.cz>
cmds-device.c
cmds-replace.c
utils.c
utils.h