diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-01-22 10:03:02 +0100 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-01-22 10:03:02 +0100 |
commit | 6552ebae25ffd57574c6e72d17fce67fea08b918 (patch) | |
tree | cde6cc932c7e47d818154b011dfd8a6997d5c18e /fs/xfs/linux-2.6/xfs_export.c | |
parent | 749a440b2218e9937dca8c68e23e51ca4d8d37fe (diff) | |
parent | 336f6c322d87806ef93afad6308ac65083a865e5 (diff) |
Merge branch 'core/debugobjects' into core/urgent
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_export.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_export.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 595751f7835..87b8cbd23d4 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -126,11 +126,26 @@ xfs_nfs_get_inode( if (ino == 0) return ERR_PTR(-ESTALE); - error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0); - if (error) + /* + * The XFS_IGET_BULKSTAT means that an invalid inode number is just + * fine and not an indication of a corrupted filesystem. Because + * clients can send any kind of invalid file handle, e.g. after + * a restore on the server we have to deal with this case gracefully. + */ + error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, + XFS_ILOCK_SHARED, &ip, 0); + if (error) { + /* + * EINVAL means the inode cluster doesn't exist anymore. + * This implies the filehandle is stale, so we should + * translate it here. + * We don't use ESTALE directly down the chain to not + * confuse applications using bulkstat that expect EINVAL. + */ + if (error == EINVAL) + error = ESTALE; return ERR_PTR(-error); - if (!ip) - return ERR_PTR(-EIO); + } if (ip->i_d.di_gen != generation) { xfs_iput_new(ip, XFS_ILOCK_SHARED); |