Re: Fwd: Fwd: Question regarding to Btrfs patchwork /2831525

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2018年01月15日 20:08, Ilan Schwarts wrote:
> Thanks for detailed information !
> Its a legacy code for kernel module i maintain.. dont talk to me about
> ancient when i need to maintain it to systems like solaris 8 or RHEL4
> 2.6.9 :(

Well, that's unfortunate, I mean real unforunate...

Despite that, if sticking to device number (dev_t), I think the one in
super_block->s_dev won't help much.
Especially it can change when btrfs tries to add/delete devices.

So it will be a very hard time for you to trace device number for btrfs.

Thanks,
Qu

> 
> 
> 
> On Mon, Jan 15, 2018 at 12:01 PM, Qu Wenruo <quwenruo.btrfs@xxxxxxx> wrote:
>>
>>
>> On 2018年01月15日 17:24, Ilan Schwarts wrote:
>>> Qu,
>>> Given inode, i get the fsid via: inode->i_sb->s_dev;
>>> this return dev_t and not u8/u16
>>
>> That's just a device number.
>>
>> Not really useful in btrfs, since btrfs is a multi-device filesystem.
>>
>> Thanks,
>> Qu
>>
>>>
>>>
>>> On Sun, Jan 14, 2018 at 12:44 PM, Qu Wenruo <quwenruo.btrfs@xxxxxxx> wrote:
>>>>
>>>>
>>>> On 2018年01月14日 18:32, Ilan Schwarts wrote:
>>>>> Thank you for clarification.
>>>>> Just 2 quick questions,
>>>>> 1. Sub volumes - 2 sub volumes cannot have 2 same inode numbers ?
>>>>
>>>> They can.
>>>>
>>>> So to really locate an inode in btrfs, you need:
>>>>
>>>> fsid (locate the fs) -> subvolume id (locate subvolume) -> inode number.
>>>>
>>>> fsid can be feteched from superblock as mentioned in previous reply.
>>>>
>>>> subvolume id can be get from BTRFS_I(inode)->root.
>>>> And normally root is what you need.
>>>>
>>>> If you really want the number, then either
>>>> BTRFS_I(inode)->root->objectid or
>>>> BTRFS_I(inode)->root->root_key->objectid will give you the u64 subvolume id.
>>>>
>>>>> 2. Why fsInfo fsid return u8 and the traditional file system return
>>>>> dev_t, usually 32 integer ?
>>>>
>>>> As far as I found in xfs or ext4, their fsid is still u8[16] or uuid_t,
>>>> same as btrfs.
>>>>
>>>> For ext4 it's ext4_super_block->s_uuid[16]
>>>> And for xfs, it's xfs_sb->sb_uuid.
>>>>
>>>> I don't know how you get the dev_t parameter.
>>>>
>>>> Thanks,
>>>> Qu
>>>>
>>>>>
>>>>>
>>>>> On Sun, Jan 14, 2018 at 12:22 PM, Qu Wenruo <quwenruo.btrfs@xxxxxxx> wrote:
>>>>>>
>>>>>>
>>>>>> On 2018年01月14日 18:13, Ilan Schwarts wrote:
>>>>>>> both btrfs filesystems will have same fsid ?
>>>>>>>
>>>>>>>
>>>>>>> On Sun, Jan 14, 2018 at 12:06 PM, Ilan Schwarts <ilan84@xxxxxxxxx> wrote:
>>>>>>>> But both filesystems will have same fsid?
>>>>>>>>
>>>>>>>> On Jan 14, 2018 12:04, "Nikolay Borisov" <nborisov@xxxxxxxx> wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 14.01.2018 12:02, Ilan Schwarts wrote:
>>>>>>>>>> First of all, Thanks for response !
>>>>>>>>>> So if i have 2 btrfs file system on the same machine (not your
>>>>>>>>>> everyday scenario, i know)
>>>>>>
>>>>>> Not a problem, the 2 filesystems will have 2 different fsid.
>>>>>>
>>>>>> (And it's my everyday scenario, since fstests neeeds TEST_DEV and
>>>>>> SCRATCH_DEV_POOL)
>>>>>>
>>>>>>>>>> Lets say a file is created on device A, the file gets inode number X
>>>>>>>>>> is it possible on device B to have inode number X also ?
>>>>>>>>>> or each device has its own Inode number range ?
>>>>>>
>>>>>> Forget the mess about device.
>>>>>>
>>>>>> Inode is bounded to a filesystem, not bounded to a device.
>>>>>>
>>>>>> Just traditional filesytems are normally bounded to a single device.
>>>>>> (Although even traditional filesystems can have external journal devices)
>>>>>>
>>>>>> So there is nothing to do with device at all.
>>>>>>
>>>>>> And you can have same inode numbers in different filesystems, but
>>>>>> BTRFS_I(inode)->root->fs_info will point to different fs_infos, with
>>>>>> different fsid.
>>>>>>
>>>>>> So return to your initial question:
>>>>>>> both btrfs filesystems will have same fsid ?
>>>>>>
>>>>>> No, different filesystems will have different fsid.
>>>>>>
>>>>>> (Unless you're SUUUUUUUUUUUUUUUUUUUPER lucky to have 2 filesystems with
>>>>>> same fsid)
>>>>>>
>>>>>> Thanks,
>>>>>> Qu
>>>>>>
>>>>>>
>>>>>>>>>
>>>>>>>>> Of course it is possible. Inodes are guaranteed to be unique only across
>>>>>>>>> filesystem instances. In your case you are going to have 2 fs instances.
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I need to create unique identifier for a file, I need to understand if
>>>>>>>>>> the identifier would be: GlobalFSID_DeviceID_Inode or DeviceID_Inode
>>>>>>>>>> is enough.
>>>>>>>>>>
>>>>>>>>>> Thanks
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Sun, Jan 14, 2018 at 11:13 AM, Qu Wenruo <quwenruo.btrfs@xxxxxxx>
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 2018年01月14日 16:33, Ilan Schwarts wrote:
>>>>>>>>>>>> Hello btrfs developers/users,
>>>>>>>>>>>>
>>>>>>>>>>>> I was wondering regarding to fetching the correct fsid on btrfs from
>>>>>>>>>>>> the context of a kernel module.
>>>>>>>>>>>
>>>>>>>>>>> There are two IDs for btrfs. (in fact more, but you properly won't need
>>>>>>>>>>> the extra ids)
>>>>>>>>>>>
>>>>>>>>>>> FSID: Global one, one fs one FSID.
>>>>>>>>>>> Device ID: Bonded to device, each device will have one.
>>>>>>>>>>>
>>>>>>>>>>> So in case of 2 devices btrfs, each device will has its own device id,
>>>>>>>>>>> while both of the devices have the same fsid.
>>>>>>>>>>>
>>>>>>>>>>> And I think you're talking about the global fsid instead of device id.
>>>>>>>>>>>
>>>>>>>>>>>> if on suse11.3 kernel 3.0.101-0.47.71-default in order to get fsid, I
>>>>>>>>>>>> do the following:
>>>>>>>>>>>> convert inode struct to btrfs_inode struct (use btrfsInode =
>>>>>>>>>>>> BTRFS_I(inode)), then from btrfs_inode struct i go to root field, and
>>>>>>>>>>>> from root i take anon_dev or anon_super.s_dev.
>>>>>>>>>>>>         struct btrfs_inode *btrfsInode;
>>>>>>>>>>>>         btrfsInode = BTRFS_I(inode);
>>>>>>>>>>>>        btrfsInode->root->anon_super.s_dev    or
>>>>>>>>>>>>        btrfsInode->root->anon_dev    - depend on kernel.
>>>>>>>>>>>
>>>>>>>>>>> The most directly method would be:
>>>>>>>>>>>
>>>>>>>>>>> btrfs_inode->root->fs_info->fsid.
>>>>>>>>>>> (For newer kernel, as I'm not familiar with older kernels)
>>>>>>>>>>>
>>>>>>>>>>> Or from superblock:
>>>>>>>>>>> btrfs_inode->root->fs_info->super_copy->fsid.
>>>>>>>>>>> (The most reliable one, no matter which kernel version you're using, as
>>>>>>>>>>> long as the super block format didn't change)
>>>>>>>>>>>
>>>>>>>>>>> For device id, it's not that commonly used unless you're dealing with
>>>>>>>>>>> chunk mapping, so I'm assuming you're referring to fsid.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Qu
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> In kernel 3.12.28-4-default in order to get the fsid, i need to go
>>>>>>>>>>>> to the inode -> superblock -> device id (inode->i_sb->s_dev)
>>>>>>>>>>>>
>>>>>>>>>>>> Why is this ? and is there a proper/an official way to get it ?
>>>>>>>>>>>> --
>>>>>>>>>>>> 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
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>
> 
> 
> 

Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux