xfs
[Top] [All Lists]

Re: [DMAPI] code error in dm_ip_to_handle()

To: Aurelien Degremont - Stagiaire <degremont@xxxxxxxxxxx>
Subject: Re: [DMAPI] code error in dm_ip_to_handle()
From: Dean Roehrich <roehrich@xxxxxxx>
Date: Wed, 11 May 2005 15:45:38 -0500
Cc: linux-xfs@xxxxxxxxxxx
Sender: linux-xfs-bounce@xxxxxxxxxxx
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
>


<Prev in Thread] Current Thread [Next in Thread>