[XFS] Cleanup various fid related bits:
- merge xfs_fid2 into it's only caller xfs_dm_inode_to_fh. - remove xfs_vget and opencode it in the two callers, simplifying both of them by avoiding the awkward calling convetion. - assign directly to the dm_fid_t members in various places in the dmapi code instead of casting them to xfs_fid_t first (which is identical to dm_fid_t) SGI-PV: 974747 SGI-Modid: xfs-linux-melb:xfs-kern:30258a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Vlad Apostolov <vapo@sgi.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
parent
edd319dc52
commit
f71354bc3a
|
@ -118,20 +118,29 @@ xfs_nfs_get_inode(
|
||||||
u64 ino,
|
u64 ino,
|
||||||
u32 generation)
|
u32 generation)
|
||||||
{
|
{
|
||||||
xfs_fid_t xfid;
|
xfs_mount_t *mp = XFS_M(sb);
|
||||||
bhv_vnode_t *vp;
|
xfs_inode_t *ip;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
xfid.fid_len = sizeof(xfs_fid_t) - sizeof(xfid.fid_len);
|
/*
|
||||||
xfid.fid_pad = 0;
|
* NFS can sometimes send requests for ino 0. Fail them gracefully.
|
||||||
xfid.fid_ino = ino;
|
*/
|
||||||
xfid.fid_gen = generation;
|
if (ino == 0)
|
||||||
|
return ERR_PTR(-ESTALE);
|
||||||
|
|
||||||
error = xfs_vget(XFS_M(sb), &vp, &xfid);
|
error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0);
|
||||||
if (error)
|
if (error)
|
||||||
return ERR_PTR(-error);
|
return ERR_PTR(-error);
|
||||||
|
if (!ip)
|
||||||
|
return ERR_PTR(-EIO);
|
||||||
|
|
||||||
return vp ? vn_to_inode(vp) : NULL;
|
if (!ip->i_d.di_mode || ip->i_d.di_gen != generation) {
|
||||||
|
xfs_iput_new(ip, XFS_ILOCK_SHARED);
|
||||||
|
return ERR_PTR(-ENOENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
||||||
|
return ip->i_vnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC struct dentry *
|
STATIC struct dentry *
|
||||||
|
|
|
@ -1408,56 +1408,3 @@ xfs_syncsub(
|
||||||
|
|
||||||
return XFS_ERROR(last_error);
|
return XFS_ERROR(last_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* xfs_vget - called by DMAPI and NFSD to get vnode from file handle
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
xfs_vget(
|
|
||||||
xfs_mount_t *mp,
|
|
||||||
bhv_vnode_t **vpp,
|
|
||||||
xfs_fid_t *xfid)
|
|
||||||
{
|
|
||||||
xfs_inode_t *ip;
|
|
||||||
int error;
|
|
||||||
xfs_ino_t ino;
|
|
||||||
unsigned int igen;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Invalid. Since handles can be created in user space and passed in
|
|
||||||
* via gethandle(), this is not cause for a panic.
|
|
||||||
*/
|
|
||||||
if (xfid->fid_len != sizeof(*xfid) - sizeof(xfid->fid_len))
|
|
||||||
return XFS_ERROR(EINVAL);
|
|
||||||
|
|
||||||
ino = xfid->fid_ino;
|
|
||||||
igen = xfid->fid_gen;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NFS can sometimes send requests for ino 0. Fail them gracefully.
|
|
||||||
*/
|
|
||||||
if (ino == 0)
|
|
||||||
return XFS_ERROR(ESTALE);
|
|
||||||
|
|
||||||
error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0);
|
|
||||||
if (error) {
|
|
||||||
*vpp = NULL;
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ip == NULL) {
|
|
||||||
*vpp = NULL;
|
|
||||||
return XFS_ERROR(EIO);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ip->i_d.di_mode == 0 || ip->i_d.di_gen != igen) {
|
|
||||||
xfs_iput_new(ip, XFS_ILOCK_SHARED);
|
|
||||||
*vpp = NULL;
|
|
||||||
return XFS_ERROR(ENOENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
*vpp = XFS_ITOV(ip);
|
|
||||||
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ int xfs_mntupdate(struct xfs_mount *mp, int *flags,
|
||||||
struct xfs_mount_args *args);
|
struct xfs_mount_args *args);
|
||||||
int xfs_root(struct xfs_mount *mp, bhv_vnode_t **vpp);
|
int xfs_root(struct xfs_mount *mp, bhv_vnode_t **vpp);
|
||||||
int xfs_sync(struct xfs_mount *mp, int flags);
|
int xfs_sync(struct xfs_mount *mp, int flags);
|
||||||
int xfs_vget(struct xfs_mount *mp, bhv_vnode_t **vpp, struct xfs_fid *xfid);
|
|
||||||
void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
|
void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
|
||||||
int lnnum);
|
int lnnum);
|
||||||
void xfs_attr_quiesce(struct xfs_mount *mp);
|
void xfs_attr_quiesce(struct xfs_mount *mp);
|
||||||
|
|
|
@ -3457,27 +3457,6 @@ std_return:
|
||||||
goto std_return;
|
goto std_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
xfs_fid2(
|
|
||||||
xfs_inode_t *ip,
|
|
||||||
xfs_fid_t *xfid)
|
|
||||||
{
|
|
||||||
xfs_itrace_entry(ip);
|
|
||||||
|
|
||||||
xfid->fid_len = sizeof(xfs_fid_t) - sizeof(xfid->fid_len);
|
|
||||||
xfid->fid_pad = 0;
|
|
||||||
/*
|
|
||||||
* use memcpy because the inode is a long long and there's no
|
|
||||||
* assurance that xfid->fid_ino is properly aligned.
|
|
||||||
*/
|
|
||||||
memcpy(&xfid->fid_ino, &ip->i_ino, sizeof(xfid->fid_ino));
|
|
||||||
xfid->fid_gen = ip->i_d.di_gen;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
xfs_rwlock(
|
xfs_rwlock(
|
||||||
xfs_inode_t *ip,
|
xfs_inode_t *ip,
|
||||||
|
|
|
@ -39,7 +39,6 @@ int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize,
|
||||||
int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry,
|
int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry,
|
||||||
char *target_path, mode_t mode, bhv_vnode_t **vpp,
|
char *target_path, mode_t mode, bhv_vnode_t **vpp,
|
||||||
struct cred *credp);
|
struct cred *credp);
|
||||||
int xfs_fid2(struct xfs_inode *ip, struct xfs_fid *xfid);
|
|
||||||
int xfs_rwlock(struct xfs_inode *ip, bhv_vrwlock_t locktype);
|
int xfs_rwlock(struct xfs_inode *ip, bhv_vrwlock_t locktype);
|
||||||
void xfs_rwunlock(struct xfs_inode *ip, bhv_vrwlock_t locktype);
|
void xfs_rwunlock(struct xfs_inode *ip, bhv_vrwlock_t locktype);
|
||||||
int xfs_inode_flush(struct xfs_inode *ip, int flags);
|
int xfs_inode_flush(struct xfs_inode *ip, int flags);
|
||||||
|
|
Loading…
Reference in a new issue