diff options
author | J. Bruce Fields <bfields@redhat.com> | 2010-10-30 23:35:04 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2011-01-04 16:49:27 -0500 |
commit | c84d500bc41658165ceb0dd04dc6a75249940fba (patch) | |
tree | 95ad867b5fb4807f5f8c1172a0797e70d5e96168 /fs/nfsd | |
parent | e63eb9375089f9d2041305d04c3f33a194e0e014 (diff) |
nfsd4: use a single struct file for delegations
When we converted to sharing struct filess between nfs4 opens I went too
far and also used the same mechanism for delegations. But keeping
a reference to the struct file ensures it will outlast the lease, and
allows us to remove the lease with the same file as we added it.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4state.c | 10 | ||||
-rw-r--r-- | fs/nfsd/state.h | 1 |
2 files changed, 6 insertions, 5 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 2e44ad2539ab..cbe1b81c147d 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -230,7 +230,8 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_stateid *stp, struct svc_f | |||
230 | dp->dl_client = clp; | 230 | dp->dl_client = clp; |
231 | get_nfs4_file(fp); | 231 | get_nfs4_file(fp); |
232 | dp->dl_file = fp; | 232 | dp->dl_file = fp; |
233 | nfs4_file_get_access(fp, O_RDONLY); | 233 | dp->dl_vfs_file = find_readable_file(fp); |
234 | get_file(dp->dl_vfs_file); | ||
234 | dp->dl_flock = NULL; | 235 | dp->dl_flock = NULL; |
235 | dp->dl_type = type; | 236 | dp->dl_type = type; |
236 | dp->dl_stateid.si_boot = boot_time; | 237 | dp->dl_stateid.si_boot = boot_time; |
@@ -252,6 +253,7 @@ nfs4_put_delegation(struct nfs4_delegation *dp) | |||
252 | if (atomic_dec_and_test(&dp->dl_count)) { | 253 | if (atomic_dec_and_test(&dp->dl_count)) { |
253 | dprintk("NFSD: freeing dp %p\n",dp); | 254 | dprintk("NFSD: freeing dp %p\n",dp); |
254 | put_nfs4_file(dp->dl_file); | 255 | put_nfs4_file(dp->dl_file); |
256 | fput(dp->dl_vfs_file); | ||
255 | kmem_cache_free(deleg_slab, dp); | 257 | kmem_cache_free(deleg_slab, dp); |
256 | num_delegations--; | 258 | num_delegations--; |
257 | } | 259 | } |
@@ -265,12 +267,10 @@ nfs4_put_delegation(struct nfs4_delegation *dp) | |||
265 | static void | 267 | static void |
266 | nfs4_close_delegation(struct nfs4_delegation *dp) | 268 | nfs4_close_delegation(struct nfs4_delegation *dp) |
267 | { | 269 | { |
268 | struct file *filp = find_readable_file(dp->dl_file); | ||
269 | |||
270 | dprintk("NFSD: close_delegation dp %p\n",dp); | 270 | dprintk("NFSD: close_delegation dp %p\n",dp); |
271 | /* XXX: do we even need this check?: */ | ||
271 | if (dp->dl_flock) | 272 | if (dp->dl_flock) |
272 | vfs_setlease(filp, F_UNLCK, &dp->dl_flock); | 273 | vfs_setlease(dp->dl_vfs_file, F_UNLCK, &dp->dl_flock); |
273 | nfs4_file_put_access(dp->dl_file, O_RDONLY); | ||
274 | } | 274 | } |
275 | 275 | ||
276 | /* Called under the state lock. */ | 276 | /* Called under the state lock. */ |
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 39adc27b0685..84b230217b1b 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h | |||
@@ -81,6 +81,7 @@ struct nfs4_delegation { | |||
81 | atomic_t dl_count; /* ref count */ | 81 | atomic_t dl_count; /* ref count */ |
82 | struct nfs4_client *dl_client; | 82 | struct nfs4_client *dl_client; |
83 | struct nfs4_file *dl_file; | 83 | struct nfs4_file *dl_file; |
84 | struct file *dl_vfs_file; | ||
84 | struct file_lock *dl_flock; | 85 | struct file_lock *dl_flock; |
85 | u32 dl_type; | 86 | u32 dl_type; |
86 | time_t dl_time; | 87 | time_t dl_time; |