xfs
[Top] [All Lists]

Re: vfs dmapi handle generation problem

To: Tim J?dicke <tim.joedicke@xxxxxxxxxxx>
Subject: Re: vfs dmapi handle generation problem
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Wed, 4 Jun 2008 11:16:51 -0400
Cc: xfs@xxxxxxxxxxx
In-reply-to: <8efbf9761cbff87b03e5326866cd914d.squirrel@webmailer.fh-worms.de>
References: <8efbf9761cbff87b03e5326866cd914d.squirrel@webmailer.fh-worms.de>
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Mutt/1.5.17 (2007-11-01)
On Wed, Jun 04, 2008 at 03:55:04PM +0200, Tim J?dicke wrote:
> int
> vfs_dm_inode_to_fh(struct inode *ip, dm_fid_t *dmfid, dm_fsid_t *dmfsid)
> {
>    dmfid->dm_fid_len = sizeof(dm_fid_t) - sizeof(dmfid->dm_fid_len);
>    dmfid->dm_fid_pad = 0;
>    memcpy(&dmfid->dm_fid_ino, &ip->i_ino, sizeof(dmfid->dm_fid_ino));
>    dmfid->dm_fid_gen = ip->i_generation;
> 
>    *dmfsid = 11; // need generation system
> 
>    return 0;

i_ino in struct inode is unsigned long.  If you run the above code
on a 32bit system you'll get crap in the upper half of dm_fid_ino.

Try:

int
vfs_dm_inode_to_fh(struct inode *ip, dm_fid_t *dmfid, dm_fsid_t *dmfsid)
{
        dmfid->dm_fid_len = sizeof(dm_fid_t) - sizeof(dmfid->dm_fid_len);
        dmfid->dm_fid_pad = 0;
        dmfid->dm_fid_ino = ip->i_ino;
        dmfid->dm_fid_gen = ip->i_generation;

        *dmfsid = 11; // need generation system
        return 0;
}

instead.  If you actually want to support 64bit inode numbers on 32bit
systems you'll have to query for it with vfs_getattr, though.


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