Qu,
Given inode, i get the fsid via: inode->i_sb->s_dev;
this return dev_t and not u8/u16



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