diff options
| author | Christoph Hellwig <hch@infradead.org> | 2007-12-18 00:26:55 -0500 |
|---|---|---|
| committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-02-07 02:20:11 -0500 |
| commit | f71354bc3a96c657a70e36dcf980cbad6c9fc63f (patch) | |
| tree | 1f32c9281e224fd067ff78ebc6dc0b763824bd98 | |
| parent | edd319dc527733e61eec5bdc9ce20c94634b6482 (diff) | |
[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>
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_export.c | 25 | ||||
| -rw-r--r-- | fs/xfs/xfs_vfsops.c | 53 | ||||
| -rw-r--r-- | fs/xfs/xfs_vfsops.h | 1 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 21 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.h | 1 |
5 files changed, 17 insertions, 84 deletions
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 15bd4948832c..ca4f66c4de16 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c | |||
| @@ -118,20 +118,29 @@ xfs_nfs_get_inode( | |||
| 118 | u64 ino, | 118 | u64 ino, |
| 119 | u32 generation) | 119 | u32 generation) |
| 120 | { | 120 | { |
| 121 | xfs_fid_t xfid; | 121 | xfs_mount_t *mp = XFS_M(sb); |
| 122 | bhv_vnode_t *vp; | 122 | xfs_inode_t *ip; |
| 123 | int error; | 123 | int error; |
| 124 | 124 | ||
| 125 | xfid.fid_len = sizeof(xfs_fid_t) - sizeof(xfid.fid_len); | 125 | /* |
| 126 | xfid.fid_pad = 0; | 126 | * NFS can sometimes send requests for ino 0. Fail them gracefully. |
| 127 | xfid.fid_ino = ino; | 127 | */ |
| 128 | xfid.fid_gen = generation; | 128 | if (ino == 0) |
| 129 | return ERR_PTR(-ESTALE); | ||
| 129 | 130 | ||
| 130 | error = xfs_vget(XFS_M(sb), &vp, &xfid); | 131 | error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0); |
| 131 | if (error) | 132 | if (error) |
| 132 | return ERR_PTR(-error); | 133 | return ERR_PTR(-error); |
| 134 | if (!ip) | ||
| 135 | return ERR_PTR(-EIO); | ||
| 136 | |||
| 137 | if (!ip->i_d.di_mode || ip->i_d.di_gen != generation) { | ||
| 138 | xfs_iput_new(ip, XFS_ILOCK_SHARED); | ||
| 139 | return ERR_PTR(-ENOENT); | ||
| 140 | } | ||
| 133 | 141 | ||
| 134 | return vp ? vn_to_inode(vp) : NULL; | 142 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
| 143 | return ip->i_vnode; | ||
| 135 | } | 144 | } |
| 136 | 145 | ||
| 137 | STATIC struct dentry * | 146 | STATIC struct dentry * |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index b8e16a6952be..43b78d9dc119 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
| @@ -1408,56 +1408,3 @@ xfs_syncsub( | |||
| 1408 | 1408 | ||
| 1409 | return XFS_ERROR(last_error); | 1409 | return XFS_ERROR(last_error); |
| 1410 | } | 1410 | } |
| 1411 | |||
| 1412 | /* | ||
| 1413 | * xfs_vget - called by DMAPI and NFSD to get vnode from file handle | ||
| 1414 | */ | ||
| 1415 | int | ||
| 1416 | xfs_vget( | ||
| 1417 | xfs_mount_t *mp, | ||
| 1418 | bhv_vnode_t **vpp, | ||
| 1419 | xfs_fid_t *xfid) | ||
| 1420 | { | ||
| 1421 | xfs_inode_t *ip; | ||
| 1422 | int error; | ||
| 1423 | xfs_ino_t ino; | ||
| 1424 | unsigned int igen; | ||
| 1425 | |||
| 1426 | /* | ||
| 1427 | * Invalid. Since handles can be created in user space and passed in | ||
| 1428 | * via gethandle(), this is not cause for a panic. | ||
| 1429 | */ | ||
| 1430 | if (xfid->fid_len != sizeof(*xfid) - sizeof(xfid->fid_len)) | ||
| 1431 | return XFS_ERROR(EINVAL); | ||
| 1432 | |||
| 1433 | ino = xfid->fid_ino; | ||
| 1434 | igen = xfid->fid_gen; | ||
| 1435 | |||
| 1436 | /* | ||
| 1437 | * NFS can sometimes send requests for ino 0. Fail them gracefully. | ||
| 1438 | */ | ||
| 1439 | if (ino == 0) | ||
| 1440 | return XFS_ERROR(ESTALE); | ||
| 1441 | |||
| 1442 | error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0); | ||
| 1443 | if (error) { | ||
| 1444 | *vpp = NULL; | ||
| 1445 | return error; | ||
| 1446 | } | ||
| 1447 | |||
| 1448 | if (ip == NULL) { | ||
| 1449 | *vpp = NULL; | ||
| 1450 | return XFS_ERROR(EIO); | ||
| 1451 | } | ||
| 1452 | |||
| 1453 | if (ip->i_d.di_mode == 0 || ip->i_d.di_gen != igen) { | ||
| 1454 | xfs_iput_new(ip, XFS_ILOCK_SHARED); | ||
| 1455 | *vpp = NULL; | ||
| 1456 | return XFS_ERROR(ENOENT); | ||
| 1457 | } | ||
| 1458 | |||
| 1459 | *vpp = XFS_ITOV(ip); | ||
| 1460 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | ||
| 1461 | return 0; | ||
| 1462 | } | ||
| 1463 | |||
diff --git a/fs/xfs/xfs_vfsops.h b/fs/xfs/xfs_vfsops.h index bf1c083513dd..ca3ae7c879c9 100644 --- a/fs/xfs/xfs_vfsops.h +++ b/fs/xfs/xfs_vfsops.h | |||
| @@ -15,7 +15,6 @@ int xfs_mntupdate(struct xfs_mount *mp, int *flags, | |||
| 15 | struct xfs_mount_args *args); | 15 | struct xfs_mount_args *args); |
| 16 | int xfs_root(struct xfs_mount *mp, bhv_vnode_t **vpp); | 16 | int xfs_root(struct xfs_mount *mp, bhv_vnode_t **vpp); |
| 17 | int xfs_sync(struct xfs_mount *mp, int flags); | 17 | int xfs_sync(struct xfs_mount *mp, int flags); |
| 18 | int xfs_vget(struct xfs_mount *mp, bhv_vnode_t **vpp, struct xfs_fid *xfid); | ||
| 19 | void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, | 18 | void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, |
| 20 | int lnnum); | 19 | int lnnum); |
| 21 | void xfs_attr_quiesce(struct xfs_mount *mp); | 20 | void xfs_attr_quiesce(struct xfs_mount *mp); |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 7f380e885a6f..6b71d9f763c7 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -3457,27 +3457,6 @@ std_return: | |||
| 3457 | goto std_return; | 3457 | goto std_return; |
| 3458 | } | 3458 | } |
| 3459 | 3459 | ||
| 3460 | |||
| 3461 | int | ||
| 3462 | xfs_fid2( | ||
| 3463 | xfs_inode_t *ip, | ||
| 3464 | xfs_fid_t *xfid) | ||
| 3465 | { | ||
| 3466 | xfs_itrace_entry(ip); | ||
| 3467 | |||
| 3468 | xfid->fid_len = sizeof(xfs_fid_t) - sizeof(xfid->fid_len); | ||
| 3469 | xfid->fid_pad = 0; | ||
| 3470 | /* | ||
| 3471 | * use memcpy because the inode is a long long and there's no | ||
| 3472 | * assurance that xfid->fid_ino is properly aligned. | ||
| 3473 | */ | ||
| 3474 | memcpy(&xfid->fid_ino, &ip->i_ino, sizeof(xfid->fid_ino)); | ||
| 3475 | xfid->fid_gen = ip->i_d.di_gen; | ||
| 3476 | |||
| 3477 | return 0; | ||
| 3478 | } | ||
| 3479 | |||
| 3480 | |||
| 3481 | int | 3460 | int |
| 3482 | xfs_rwlock( | 3461 | xfs_rwlock( |
| 3483 | xfs_inode_t *ip, | 3462 | xfs_inode_t *ip, |
diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index b7e461c40cfb..a501aeffb808 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h | |||
| @@ -39,7 +39,6 @@ int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize, | |||
| 39 | int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry, | 39 | int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry, |
| 40 | char *target_path, mode_t mode, bhv_vnode_t **vpp, | 40 | char *target_path, mode_t mode, bhv_vnode_t **vpp, |
| 41 | struct cred *credp); | 41 | struct cred *credp); |
| 42 | int xfs_fid2(struct xfs_inode *ip, struct xfs_fid *xfid); | ||
| 43 | int xfs_rwlock(struct xfs_inode *ip, bhv_vrwlock_t locktype); | 42 | int xfs_rwlock(struct xfs_inode *ip, bhv_vrwlock_t locktype); |
| 44 | void xfs_rwunlock(struct xfs_inode *ip, bhv_vrwlock_t locktype); | 43 | void xfs_rwunlock(struct xfs_inode *ip, bhv_vrwlock_t locktype); |
| 45 | int xfs_inode_flush(struct xfs_inode *ip, int flags); | 44 | int xfs_inode_flush(struct xfs_inode *ip, int flags); |
