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 :(



On Mon, Jan 15, 2018 at 12:01 PM, Qu Wenruo <quwenruo.bt...@gmx.com> 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.bt...@gmx.com> 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.bt...@gmx.com> 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 <ila...@gmail.com> wrote:
>>>>>>> But both filesystems will have same fsid?
>>>>>>>
>>>>>>> On Jan 14, 2018 12:04, "Nikolay Borisov" <nbori...@suse.com> 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.bt...@gmx.com>
>>>>>>>>> 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 majord...@vger.kernel.org
>>>>>>>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>
>



-- 


-
Ilan Schwarts
--
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