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 majordomo@xxxxxxxxxxxxxxx
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html