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

Reply via email to