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