X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmds-fi-usage.c;h=de7ad668ba2de26a92201de2b625276fe1236f79;hb=669ba89e52945e26528d498221c8ecd576b10d2d;hp=a72fb4e3854198f3eaa7611ce4034e9c69296f30;hpb=94afa11d832901cd63766ec38b60752058722a7b;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-fi-usage.c b/cmds-fi-usage.c index a72fb4e..de7ad66 100644 --- a/cmds-fi-usage.c +++ b/cmds-fi-usage.c @@ -164,8 +164,7 @@ static int load_chunk_info(int fd, struct chunk_info **info_ptr, int *info_count return -e; if (ret < 0) { - error("cannot look up chunk tree info: %s", - strerror(e)); + error("cannot look up chunk tree info: %m"); return 1; } /* the ioctl returns the number of item it found in nr_items */ @@ -244,8 +243,7 @@ static struct btrfs_ioctl_space_args *load_space_info(int fd, char *path) ret = ioctl(fd, BTRFS_IOC_SPACE_INFO, sargs); if (ret < 0) { - error("cannot get space info on '%s': %s", path, - strerror(errno)); + error("cannot get space info on '%s': %m", path); free(sargs); return NULL; } @@ -270,8 +268,8 @@ static struct btrfs_ioctl_space_args *load_space_info(int fd, char *path) ret = ioctl(fd, BTRFS_IOC_SPACE_INFO, sargs); if (ret < 0) { - error("cannot get space info with %u slots: %s", - count, strerror(errno)); + error("cannot get space info with %u slots: %m", + count); free(sargs); return NULL; } @@ -356,8 +354,7 @@ static int print_filesystem_usage_overall(int fd, struct chunk_info *chunkinfo, } if (r_total_size == 0) { - error("cannot get space info on '%s': %s", - path, strerror(errno)); + error("cannot get space info on '%s': %m", path); ret = 1; goto exit; @@ -508,7 +505,7 @@ static int cmp_device_info(const void *a, const void *b) ((struct device_info *)b)->path); } -int dev_to_fsid(const char *dev, __u8 *fsid) +int dev_to_fsid(const char *dev, u8 *fsid) { struct btrfs_super_block *disk_super; char buf[BTRFS_SUPER_INFO_SIZE]; @@ -545,6 +542,7 @@ static int load_device_info(int fd, struct device_info **device_info_ptr, struct btrfs_ioctl_fs_info_args fi_args; struct btrfs_ioctl_dev_info_args dev_info; struct device_info *info; + u8 fsid[BTRFS_UUID_SIZE]; *device_info_count = 0; *device_info_ptr = NULL; @@ -553,8 +551,7 @@ static int load_device_info(int fd, struct device_info **device_info_ptr, if (ret < 0) { if (errno == EPERM) return -errno; - error("cannot get filesystem info: %s", - strerror(errno)); + error("cannot get filesystem info: %m"); return 1; } @@ -568,6 +565,8 @@ static int load_device_info(int fd, struct device_info **device_info_ptr, if (ndevs >= fi_args.num_devices) { error("unexpected number of devices: %d >= %llu", ndevs, (unsigned long long)fi_args.num_devices); + error( + "if seed device is used, try running this command as root"); goto out; } memset(&dev_info, 0, sizeof(dev_info)); @@ -580,6 +579,17 @@ static int load_device_info(int fd, struct device_info **device_info_ptr, goto out; } + /* + * Skip seed device by checking device's fsid (requires root). + * And we will skip only if dev_to_fsid is successful and dev + * is a seed device. + * Ignore any other error including -EACCES, which is seen when + * a non-root process calls dev_to_fsid(path)->open(path). + */ + ret = dev_to_fsid((const char *)dev_info.path, fsid); + if (!ret && memcmp(fi_args.fsid, fsid, BTRFS_FSID_SIZE) != 0) + continue; + info[ndevs].devid = dev_info.devid; if (!dev_info.path[0]) { strcpy(info[ndevs].path, "missing");