On 06/20/2012 03:37 PM, Chris Mason wrote: > On Tue, Jun 19, 2012 at 06:00:11PM -0600, H. Peter Anvin wrote: >> On 06/19/2012 04:51 PM, Chris Mason wrote: >>> >>> At mount time, we go through and verify the path names still belong to >>> the filesystem you thought they belonged to. The bdev is locked during >>> the verification, so it won't be able to go away or change. >>> >>> This is a long way of saying right we don't spit out device numbers. >>> Even device numbers can change. We can easily add a uuid based listing, >>> which I think is what you want. >>> >> >> No, I want to find the actual devices. I know I can get the UUID, but >> scanning all the block devices in the system looking for that UUID is a >> nonstarter. >> >> Device path names can change while the system is operating (and, worse, >> are dependent on namespace changes and chroot); device *numbers* cannot >> as long as the device is in use (e.g. mounted.) They can indeed change >> while not in use, of course. > > Ok, my two choices for exporting this to you are a /sys/btrfs kind of > directory (representing the mounted filesystems) or an ioctl. Which one > is most usable for you?
As short term solution, I suggest to update the BTRFS_IOC_DEV_INFO to export also the major:minor pair. This should be a minor change and also should be backward compatible (there is a lot of space in the struct btrfs_ioctl_dev_info_args ) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 14f8e1f..79fdd83 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -2261,6 +2261,8 @@ static long btrfs_ioctl_dev_info(struct btrfs_root *root, di_args->devid = dev->devid; di_args->bytes_used = dev->bytes_used; di_args->total_bytes = dev->total_bytes; + di_args->major = imajor(dev->bdev->bd_inode); + di_args->minor = iminor(dev->bdev->bd_inode); memcpy(di_args->uuid, dev->uuid, sizeof(di_args->uuid)); if (dev->name) strncpy(di_args->path, dev->name, sizeof(di_args->path)); diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h index 086e6bd..7afa688 100644 --- a/fs/btrfs/ioctl.h +++ b/fs/btrfs/ioctl.h @@ -98,7 +98,9 @@ struct btrfs_ioctl_dev_info_args { __u8 uuid[BTRFS_UUID_SIZE]; /* in/out */ __u64 bytes_used; /* out */ __u64 total_bytes; /* out */ - __u64 unused[379]; /* pad to 4k */ + __u64 major; /* out */ + __u64 minor; /* out */ + __u64 unused[377]; /* pad to 4k */ __u8 path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */ }; As long term solution, exporting all this kind of information in /sys/btrfs/... could be a more robust solution, which could simplify the "backward compatible" problem. Only my 2ยข... GB > > You want to map from /some_dir to a definitive list of devices you need > to find in syslinux to later boot off that FS, right? > > -chris > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > . > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html