On Tue, 2006-09-05 at 12:06 +0800, Ian Kent wrote: > > One way to fix this is to simply not hash the dentry when we're doing > > the O_EXCL intent optimisation, but rather to only hash it _after_ we've > > successfully created the file on the server. Something like the attached > > patch ought to do it. > > No. > > This patch simply marks the dentry negative and returns ENOMEM from the > lookup which, as would be expected, results in this error being returned > to userspace. Oops. You are right. I forgot to set res=NULL...
--- Begin Message ---
- Subject: No Subject
- From: Trond Myklebust <[email protected]>
- Date:
- Nfs: nfs_lookup - don't hash dentry when optimising away the lookup
Signed-off-by: Trond Myklebust <[email protected]> --- fs/nfs/dir.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 51328ae..3419c2d 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -904,9 +904,15 @@ static struct dentry *nfs_lookup(struct lock_kernel(); - /* If we're doing an exclusive create, optimize away the lookup */ - if (nfs_is_exclusive_create(dir, nd)) - goto no_entry; + /* + * If we're doing an exclusive create, optimize away the lookup + * but don't hash the dentry. + */ + if (nfs_is_exclusive_create(dir, nd)) { + d_instantiate(dentry, NULL); + res = NULL; + goto out_unlock; + } error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr); if (error == -ENOENT) @@ -1161,6 +1167,8 @@ int nfs_instantiate(struct dentry *dentr if (IS_ERR(inode)) return error; d_instantiate(dentry, inode); + if (d_unhashed(dentry)) + d_rehash(dentry); return 0; }
--- End Message ---
- Follow-Ups:
- References:
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Andrew Morton <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Andrew Morton <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Andrew Morton <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Andrew Morton <[email protected]>
- [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: David Howells <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: David Howells <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: David Howells <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: David Howells <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Andrew Morton <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Trond Myklebust <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: David Howells <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Trond Myklebust <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- From: Ian Kent <[email protected]>
- Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- Prev by Date: Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- Next by Date: [PATCH] Clean up expand_fdtable() and expand_files().
- Previous by thread: Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- Next by thread: Re: [PATCH 0/7] Permit filesystem local caching and NFS superblock sharing [try #13]
- Index(es):