summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGui Hecheng <guihc.fnst@cn.fujitsu.com>2014-11-27 10:01:35 +0800
committerDavid Sterba <dsterba@suse.cz>2014-11-27 18:37:00 +0100
commit8be2fff1295c39e11d5cf6a40517b0538620f7cb (patch)
treebb4d6adc0c4e781ff68896466d5fab6f23a8dedd
parent05afee34683f5a57fba0b2f55375bef592bb3987 (diff)
btrfs-progs: apply realpath for btrfs fi show when mount point is given
For now, # btrfs fi show /mnt/btrfs gives info correctly, while # btrfs fi show /mnt/btrfs/ gives nothing. This implies that the @realpath() function should be applied to unify the behavior. Made a more clear comment right above the call as well. Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.cz>
-rw-r--r--cmds-filesystem.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index cd6b3c69..253f105b 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -901,39 +901,45 @@ static int cmd_show(int argc, char **argv)
if (strlen(search) == 0)
usage(cmd_show_usage);
type = check_arg_type(search);
+
/*
- * needs spl handling if input arg is block dev
- * And if input arg is mount-point just print it
- * right away
+ * For search is a device:
+ * realpath do /dev/mapper/XX => /dev/dm-X
+ * which is required by BTRFS_SCAN_DEV
+ * For search is a mountpoint:
+ * realpath do /mnt/btrfs/ => /mnt/btrfs
+ * which shall be recognized by btrfs_scan_kernel()
*/
- if (type == BTRFS_ARG_BLKDEV) {
- if (where == BTRFS_SCAN_LBLKID) {
- /* we need to do this because
- * legacy BTRFS_SCAN_DEV
- * provides /dev/dm-x paths
- */
- if (realpath(search, path))
- search = path;
+ if (!realpath(search, path)) {
+ fprintf(stderr, "ERROR: Could not show %s: %s\n",
+ search, strerror(errno));
+ return 1;
+ }
+
+ search = path;
+
+ /*
+ * Needs special handling if input arg is block dev And if
+ * input arg is mount-point just print it right away
+ */
+ if (type == BTRFS_ARG_BLKDEV && where != BTRFS_SCAN_LBLKID) {
+ ret = get_btrfs_mount(search, mp, sizeof(mp));
+ if (!ret) {
+ /* given block dev is mounted */
+ search = mp;
+ type = BTRFS_ARG_MNTPOINT;
} else {
- ret = get_btrfs_mount(search,
- mp, sizeof(mp));
- if (!ret) {
- /* given block dev is mounted*/
- search = mp;
- type = BTRFS_ARG_MNTPOINT;
- } else {
- ret = dev_to_fsid(search, fsid);
- if (ret) {
- fprintf(stderr,
- "ERROR: No btrfs on %s\n",
- search);
- return 1;
- }
- uuid_unparse(fsid, uuid_buf);
- search = uuid_buf;
- type = BTRFS_ARG_UUID;
- goto devs_only;
+ ret = dev_to_fsid(search, fsid);
+ if (ret) {
+ fprintf(stderr,
+ "ERROR: No btrfs on %s\n",
+ search);
+ return 1;
}
+ uuid_unparse(fsid, uuid_buf);
+ search = uuid_buf;
+ type = BTRFS_ARG_UUID;
+ goto devs_only;
}
}
}