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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to