diff options
author | Jeff Layton <jlayton@redhat.com> | 2011-11-04 13:31:21 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-11-26 09:09:59 -0800 |
commit | 124e35242a58c479cea2a3d6d2b2605737e27309 (patch) | |
tree | 2b487f31afc0cb7b296ecc121ceaa6a6c742ecdf /fs/nfs/dir.c | |
parent | ecaaa92488e2589cc6b0a409ce44e7e47a3bb846 (diff) | |
download | kernel_samsung_smdk4412-124e35242a58c479cea2a3d6d2b2605737e27309.zip kernel_samsung_smdk4412-124e35242a58c479cea2a3d6d2b2605737e27309.tar.gz kernel_samsung_smdk4412-124e35242a58c479cea2a3d6d2b2605737e27309.tar.bz2 |
nfs: when attempting to open a directory, fall back on normal lookup (try #5)
commit 1788ea6e3b2a58cf4fb00206e362d9caff8d86a7 upstream.
commit d953126 changed how nfs_atomic_lookup handles an -EISDIR return
from an OPEN call. Prior to that patch, that caused the client to fall
back to doing a normal lookup. When that patch went in, the code began
returning that error to userspace. The d_revalidate codepath however
never had the corresponding change, so it was still possible to end up
with a NULL ctx->state pointer after that.
That patch caused a regression. When we attempt to open a directory that
does not have a cached dentry, that open now errors out with EISDIR. If
you attempt the same open with a cached dentry, it will succeed.
Fix this by reverting the change in nfs_atomic_lookup and allowing
attempts to open directories to fall back to a normal lookup
Also, add a NFSv4-specific f_ops->open routine that just returns
-ENOTDIR. This should never be called if things are working properly,
but if it ever is, then the dprintk may help in debugging.
To facilitate this, a new file_operations field is also added to the
nfs_rpc_ops struct.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/nfs/dir.c')
-rw-r--r-- | fs/nfs/dir.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index f91c62d..462a006 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1458,12 +1458,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry res = NULL; goto out; /* This turned out not to be a regular file */ + case -EISDIR: case -ENOTDIR: goto no_open; case -ELOOP: if (!(nd->intent.open.flags & O_NOFOLLOW)) goto no_open; - /* case -EISDIR: */ /* case -EINVAL: */ default: res = ERR_CAST(inode); |