From patchwork Tue Sep 28 20:53:39 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 215922 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o8SL1Gvo016449 for ; Tue, 28 Sep 2010 21:01:16 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752861Ab0I1VBN (ORCPT ); Tue, 28 Sep 2010 17:01:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49670 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752692Ab0I1VBN (ORCPT ); Tue, 28 Sep 2010 17:01:13 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o8SL1Cbn016691 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 28 Sep 2010 17:01:13 -0400 Received: from localhost.localdomain (test1244.test.redhat.com [10.10.10.244]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o8SL1Cdf007455 for ; Tue, 28 Sep 2010 17:01:12 -0400 From: Josef Bacik To: linux-btrfs@vger.kernel.org Subject: [PATCH] Btrfs-progs: add btrfs filesystem disk-info command Date: Tue, 28 Sep 2010 16:53:39 -0400 Message-Id: <1285707219-16304-1-git-send-email-josef@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Tue, 28 Sep 2010 21:01:16 +0000 (UTC) diff --git a/btrfs.c b/btrfs.c index ab5e57f..22b241b 100644 --- a/btrfs.c +++ b/btrfs.c @@ -91,6 +91,10 @@ static struct Command commands[] = { "filesystem df", "\n" "Show space usage information for a mount point\n." }, + { do_disk_info, 1, + "filesystem disk-info", "\n" + "Show disks contained within this filesysten." + }, { do_balance, 1, "filesystem balance", "\n" "Balance the chunks across the device." diff --git a/btrfs_cmds.c b/btrfs_cmds.c index 683aec0..b1a4d8d 100644 --- a/btrfs_cmds.c +++ b/btrfs_cmds.c @@ -835,6 +835,107 @@ int do_set_default_subvol(int nargs, char **argv) return 0; } +int do_disk_info(int nargs, char **argv) +{ + struct btrfs_ioctl_disk_info_args *args; + char *path = argv[1]; + int devs; + int fd; + int ret; + int i; + + fd = open_file_or_dir(path); + if (fd < 0) { + fprintf(stderr, "Error: can't access '%s'\n", path); + return 12; + } + + args = malloc(sizeof(*args)); + if (!args) + return -ENOMEM; + + args->num_devices = 0; + + ret = ioctl(fd, BTRFS_IOC_DISK_INFO, args); + if (ret) { + printf("failed ioctl\n"); + free(args); + return ret; + } + + if (!args->num_devices) { + printf("no devs\n"); + free(args); + return 0; + } + + devs = args->num_devices; + args = realloc(args, sizeof(*args) + (devs * sizeof(dev_t))); + if (!args) { + printf("enomem\n"); + return -ENOMEM; + } + args->num_devices = devs; + + ret = ioctl(fd, BTRFS_IOC_DISK_INFO, args); + if (ret) { + printf("ioctl failed second time\n"); + free(args); + return -ENOMEM; + } + close(fd); + + fd = open_file_or_dir("/proc/partitions"); + if (fd < 0) { +print: + printf("Devices in %s\n", path); + for (i = 0; i < args->num_devices; i++) + printf("\t%d:%d\n", major(args->devices[i]), + minor(args->devices[i])); + close(fd); + } else { + int major, minor; + unsigned long long blocks; + char buf[128]; + char name[32]; + FILE *f; + int found_devices = 0; + + f = fdopen(fd, "r"); + if (!f) + goto print; + + printf("Devices in %s\n", path); + while (!feof(f)) { + char *blah; + + memset(name, 0, 32); + memset(buf, 0, 128); + + blah = fgets(buf, 128, f); + + ret = sscanf(buf, "%d %d %llu %32s", &major, &minor, &blocks, name); + if (!ret) + continue; + + for (i = 0; i < args->num_devices; i++) { + if (major(args->devices[i]) != major) + continue; + if (minor(args->devices[i]) != minor) + continue; + found_devices++; + printf("\t/dev/%s\n", name); + break; + } + if (found_devices == args->num_devices) + break; + } + fclose(f); + } + free(args); + return 0; +} + int do_df_filesystem(int nargs, char **argv) { struct btrfs_ioctl_space_args *sargs; diff --git a/btrfs_cmds.h b/btrfs_cmds.h index 7bde191..0b5038a 100644 --- a/btrfs_cmds.h +++ b/btrfs_cmds.h @@ -31,4 +31,5 @@ int do_set_default_subvol(int nargs, char **argv); int list_subvols(int fd); int do_df_filesystem(int nargs, char **argv); int find_updated_files(int fd, u64 root_id, u64 oldest_gen); +int do_disk_info(int nargs, char **argv); int do_find_newer(int argc, char **argv); diff --git a/ioctl.h b/ioctl.h index 776d7a9..4ace64f 100644 --- a/ioctl.h +++ b/ioctl.h @@ -19,6 +19,7 @@ #ifndef __IOCTL_ #define __IOCTL_ #include +#include #include #define BTRFS_IOCTL_MAGIC 0x94 @@ -132,6 +133,11 @@ struct btrfs_ioctl_space_args { struct btrfs_ioctl_space_info spaces[0]; }; +struct btrfs_ioctl_disk_info_args { + __u32 num_devices; + __u64 devices[0]; +}; + #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ struct btrfs_ioctl_vol_args) #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ @@ -169,4 +175,6 @@ struct btrfs_ioctl_space_args { #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ struct btrfs_ioctl_space_args) +#define BTRFS_IOC_DISK_INFO _IOWR(BTRFS_IOCTL_MAGIC, 21, \ + struct btrfs_ioctl_disk_info_args) #endif