diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/nfs/delegation.c | 35 | ||||
| -rw-r--r-- | fs/nfs/delegation.h | 6 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 12 |
3 files changed, 34 insertions, 19 deletions
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index a5cb44375100..1819d0d0ba4b 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c | |||
| @@ -172,11 +172,15 @@ again: | |||
| 172 | * nfs_inode_reclaim_delegation - process a delegation reclaim request | 172 | * nfs_inode_reclaim_delegation - process a delegation reclaim request |
| 173 | * @inode: inode to process | 173 | * @inode: inode to process |
| 174 | * @cred: credential to use for request | 174 | * @cred: credential to use for request |
| 175 | * @res: new delegation state from server | 175 | * @type: delegation type |
| 176 | * @stateid: delegation stateid | ||
| 177 | * @pagemod_limit: write delegation "space_limit" | ||
| 176 | * | 178 | * |
| 177 | */ | 179 | */ |
| 178 | void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, | 180 | void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, |
| 179 | struct nfs_openres *res) | 181 | fmode_t type, |
| 182 | const nfs4_stateid *stateid, | ||
| 183 | unsigned long pagemod_limit) | ||
| 180 | { | 184 | { |
| 181 | struct nfs_delegation *delegation; | 185 | struct nfs_delegation *delegation; |
| 182 | struct rpc_cred *oldcred = NULL; | 186 | struct rpc_cred *oldcred = NULL; |
| @@ -186,9 +190,9 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, | |||
| 186 | if (delegation != NULL) { | 190 | if (delegation != NULL) { |
| 187 | spin_lock(&delegation->lock); | 191 | spin_lock(&delegation->lock); |
| 188 | if (delegation->inode != NULL) { | 192 | if (delegation->inode != NULL) { |
| 189 | nfs4_stateid_copy(&delegation->stateid, &res->delegation); | 193 | nfs4_stateid_copy(&delegation->stateid, stateid); |
| 190 | delegation->type = res->delegation_type; | 194 | delegation->type = type; |
| 191 | delegation->pagemod_limit = res->pagemod_limit; | 195 | delegation->pagemod_limit = pagemod_limit; |
| 192 | oldcred = delegation->cred; | 196 | oldcred = delegation->cred; |
| 193 | delegation->cred = get_rpccred(cred); | 197 | delegation->cred = get_rpccred(cred); |
| 194 | clear_bit(NFS_DELEGATION_NEED_RECLAIM, | 198 | clear_bit(NFS_DELEGATION_NEED_RECLAIM, |
| @@ -196,14 +200,14 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, | |||
| 196 | spin_unlock(&delegation->lock); | 200 | spin_unlock(&delegation->lock); |
| 197 | rcu_read_unlock(); | 201 | rcu_read_unlock(); |
| 198 | put_rpccred(oldcred); | 202 | put_rpccred(oldcred); |
| 199 | trace_nfs4_reclaim_delegation(inode, res->delegation_type); | 203 | trace_nfs4_reclaim_delegation(inode, type); |
| 200 | return; | 204 | return; |
| 201 | } | 205 | } |
| 202 | /* We appear to have raced with a delegation return. */ | 206 | /* We appear to have raced with a delegation return. */ |
| 203 | spin_unlock(&delegation->lock); | 207 | spin_unlock(&delegation->lock); |
| 204 | } | 208 | } |
| 205 | rcu_read_unlock(); | 209 | rcu_read_unlock(); |
| 206 | nfs_inode_set_delegation(inode, cred, res); | 210 | nfs_inode_set_delegation(inode, cred, type, stateid, pagemod_limit); |
| 207 | } | 211 | } |
| 208 | 212 | ||
| 209 | static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync) | 213 | static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync) |
| @@ -330,11 +334,16 @@ nfs_update_inplace_delegation(struct nfs_delegation *delegation, | |||
| 330 | * nfs_inode_set_delegation - set up a delegation on an inode | 334 | * nfs_inode_set_delegation - set up a delegation on an inode |
| 331 | * @inode: inode to which delegation applies | 335 | * @inode: inode to which delegation applies |
| 332 | * @cred: cred to use for subsequent delegation processing | 336 | * @cred: cred to use for subsequent delegation processing |
| 333 | * @res: new delegation state from server | 337 | * @type: delegation type |
| 338 | * @stateid: delegation stateid | ||
| 339 | * @pagemod_limit: write delegation "space_limit" | ||
| 334 | * | 340 | * |
| 335 | * Returns zero on success, or a negative errno value. | 341 | * Returns zero on success, or a negative errno value. |
| 336 | */ | 342 | */ |
| 337 | int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res) | 343 | int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, |
| 344 | fmode_t type, | ||
| 345 | const nfs4_stateid *stateid, | ||
| 346 | unsigned long pagemod_limit) | ||
| 338 | { | 347 | { |
| 339 | struct nfs_server *server = NFS_SERVER(inode); | 348 | struct nfs_server *server = NFS_SERVER(inode); |
| 340 | struct nfs_client *clp = server->nfs_client; | 349 | struct nfs_client *clp = server->nfs_client; |
| @@ -346,9 +355,9 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct | |||
| 346 | delegation = kmalloc(sizeof(*delegation), GFP_NOFS); | 355 | delegation = kmalloc(sizeof(*delegation), GFP_NOFS); |
| 347 | if (delegation == NULL) | 356 | if (delegation == NULL) |
| 348 | return -ENOMEM; | 357 | return -ENOMEM; |
| 349 | nfs4_stateid_copy(&delegation->stateid, &res->delegation); | 358 | nfs4_stateid_copy(&delegation->stateid, stateid); |
| 350 | delegation->type = res->delegation_type; | 359 | delegation->type = type; |
| 351 | delegation->pagemod_limit = res->pagemod_limit; | 360 | delegation->pagemod_limit = pagemod_limit; |
| 352 | delegation->change_attr = inode_peek_iversion_raw(inode); | 361 | delegation->change_attr = inode_peek_iversion_raw(inode); |
| 353 | delegation->cred = get_rpccred(cred); | 362 | delegation->cred = get_rpccred(cred); |
| 354 | delegation->inode = inode; | 363 | delegation->inode = inode; |
| @@ -393,7 +402,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct | |||
| 393 | rcu_assign_pointer(nfsi->delegation, delegation); | 402 | rcu_assign_pointer(nfsi->delegation, delegation); |
| 394 | delegation = NULL; | 403 | delegation = NULL; |
| 395 | 404 | ||
| 396 | trace_nfs4_set_delegation(inode, res->delegation_type); | 405 | trace_nfs4_set_delegation(inode, type); |
| 397 | 406 | ||
| 398 | out: | 407 | out: |
| 399 | spin_unlock(&clp->cl_lock); | 408 | spin_unlock(&clp->cl_lock); |
diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h index dcc8a783a6e1..bb1ef8c37af4 100644 --- a/fs/nfs/delegation.h +++ b/fs/nfs/delegation.h | |||
| @@ -36,8 +36,10 @@ enum { | |||
| 36 | NFS_DELEGATION_TEST_EXPIRED, | 36 | NFS_DELEGATION_TEST_EXPIRED, |
| 37 | }; | 37 | }; |
| 38 | 38 | ||
| 39 | int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); | 39 | int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, |
| 40 | void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); | 40 | fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit); |
| 41 | void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, | ||
| 42 | fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit); | ||
| 41 | int nfs4_inode_return_delegation(struct inode *inode); | 43 | int nfs4_inode_return_delegation(struct inode *inode); |
| 42 | int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid); | 44 | int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid); |
| 43 | void nfs_inode_return_delegation_noreclaim(struct inode *inode); | 45 | void nfs_inode_return_delegation_noreclaim(struct inode *inode); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 924238db5983..3eb53d7784e2 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -1754,12 +1754,16 @@ nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state) | |||
| 1754 | } | 1754 | } |
| 1755 | if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | 1755 | if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) |
| 1756 | nfs_inode_set_delegation(state->inode, | 1756 | nfs_inode_set_delegation(state->inode, |
| 1757 | data->owner->so_cred, | 1757 | data->owner->so_cred, |
| 1758 | &data->o_res); | 1758 | data->o_res.delegation_type, |
| 1759 | &data->o_res.delegation, | ||
| 1760 | data->o_res.pagemod_limit); | ||
| 1759 | else | 1761 | else |
| 1760 | nfs_inode_reclaim_delegation(state->inode, | 1762 | nfs_inode_reclaim_delegation(state->inode, |
| 1761 | data->owner->so_cred, | 1763 | data->owner->so_cred, |
| 1762 | &data->o_res); | 1764 | data->o_res.delegation_type, |
| 1765 | &data->o_res.delegation, | ||
| 1766 | data->o_res.pagemod_limit); | ||
| 1763 | } | 1767 | } |
| 1764 | 1768 | ||
| 1765 | /* | 1769 | /* |
