Maybe we should throw out struct dm_fsfid and just use struct dm_fid? Then
XFS, for example, would have to translate its fid_t into a struct dm_fid on
its own and DMAPI shouldn't have to guess about how they match up. I
wonder how that would work?
Dean
>From: Aurelien Degremont - Stagiaire <degremont@xxxxxxxxxxx>
>Hello,
>
>I'm still working on DMAPI code and I found a problem in
>dm_ip_to_handle() function. In fact, the problem is not specific to this
>function, I just found it here.
>
>To sum up, I found, in the XFS+DMAPI code, along all the different
>calls, you successively cast some structures and recopy data without
>verifying their content. With XFS, all is ok because 2 errors fix each
>others, but, when i try adding dmapi support to ext3, the problem appears.
>
>In order to create a dmapi handle, you must call dm_ip_to_handle().
>This function will fill a dm_handle_t structure. The data recopied came
>from a dm_fsfid structure which do not have the same fields.
>
>ex: memcpy( &[DM_HANDLE_T], &[DM_FSID_T], ...)
>
>This copy the content of the len field without errors.
>**But the first byte of the fid_data buffer will be recopied in the
>padding field (dm_fid_pad) of the dm_fid structure !** (which is not
>what is expected)
>When DMAPI will try to extract the inode number, it will be wrong !
>
>This code works correctly with XFS because XFS uses the same kind of
>structure as DMAPI, and so, when the datas are copied, the padding is ok.
>XFS will copied the data from :
>
>xfs_fid2_t --> fid_t -//pad error//-> dm_fsfid_t -//pad error//-> dm_fid_t
>
>Their 2 errors with byte alignement when data are cast and copied, but
>the first is the opposite of the second, so the data are correct at the end.
>
>This is not true when you correctly fill the dm_fsfid_t structure :)
>
>________________________________________________________
>#define MAXDMFSFIDSZ 46
>
>typedef struct dm_fsfid {
> __u16 fid_len; /* length of data in bytes */
> unsigned char fid_data[MAXDMFSFIDSZ]; /* data (fid_len worth) */
>} dm_fsfid_t;
>
>struct dm_fid {
> __u16 dm_fid_len; /* length of remainder */
> __u16 dm_fid_pad;
> __u32 dm_fid_gen; /* generation number */
> __u64 dm_fid_ino; /* 64 bits inode number */
>};
>typedef struct dm_fid dm_fid_t;
>
>
>struct dm_handle {
> union {
> __s64 align; /* force alignment of ha_fid */
> dm_fsid_t _ha_fsid; /* unique file system identifier */
> } ha_u;
> dm_fid_t ha_fid; /* file system specific file ID */
>};
>typedef struct dm_handle dm_handle_t;
>________________________________________________________
>
>
>
>
>Aurélien
>
|