0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/completion.h>
0011 #include <linux/kthread.h>
0012 #include <linux/module.h>
0013 #include <linux/sched.h>
0014 #include <linux/slab.h>
0015 #include <linux/spinlock.h>
0016 #include <linux/iversion.h>
0017
0018 #include <linux/nfs4.h>
0019 #include <linux/nfs_fs.h>
0020 #include <linux/nfs_xdr.h>
0021
0022 #include "nfs4_fs.h"
0023 #include "nfs4session.h"
0024 #include "delegation.h"
0025 #include "internal.h"
0026 #include "nfs4trace.h"
0027
0028 #define NFS_DEFAULT_DELEGATION_WATERMARK (5000U)
0029
0030 static atomic_long_t nfs_active_delegations;
0031 static unsigned nfs_delegation_watermark = NFS_DEFAULT_DELEGATION_WATERMARK;
0032
0033 static void __nfs_free_delegation(struct nfs_delegation *delegation)
0034 {
0035 put_cred(delegation->cred);
0036 delegation->cred = NULL;
0037 kfree_rcu(delegation, rcu);
0038 }
0039
0040 static void nfs_mark_delegation_revoked(struct nfs_delegation *delegation)
0041 {
0042 if (!test_and_set_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) {
0043 delegation->stateid.type = NFS4_INVALID_STATEID_TYPE;
0044 atomic_long_dec(&nfs_active_delegations);
0045 if (!test_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
0046 nfs_clear_verifier_delegated(delegation->inode);
0047 }
0048 }
0049
0050 static struct nfs_delegation *nfs_get_delegation(struct nfs_delegation *delegation)
0051 {
0052 refcount_inc(&delegation->refcount);
0053 return delegation;
0054 }
0055
0056 static void nfs_put_delegation(struct nfs_delegation *delegation)
0057 {
0058 if (refcount_dec_and_test(&delegation->refcount))
0059 __nfs_free_delegation(delegation);
0060 }
0061
0062 static void nfs_free_delegation(struct nfs_delegation *delegation)
0063 {
0064 nfs_mark_delegation_revoked(delegation);
0065 nfs_put_delegation(delegation);
0066 }
0067
0068
0069
0070
0071
0072
0073 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation)
0074 {
0075 set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags);
0076 }
0077
0078 static void nfs_mark_return_delegation(struct nfs_server *server,
0079 struct nfs_delegation *delegation)
0080 {
0081 set_bit(NFS_DELEGATION_RETURN, &delegation->flags);
0082 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
0083 }
0084
0085 static bool
0086 nfs4_is_valid_delegation(const struct nfs_delegation *delegation,
0087 fmode_t flags)
0088 {
0089 if (delegation != NULL && (delegation->type & flags) == flags &&
0090 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) &&
0091 !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
0092 return true;
0093 return false;
0094 }
0095
0096 struct nfs_delegation *nfs4_get_valid_delegation(const struct inode *inode)
0097 {
0098 struct nfs_delegation *delegation;
0099
0100 delegation = rcu_dereference(NFS_I(inode)->delegation);
0101 if (nfs4_is_valid_delegation(delegation, 0))
0102 return delegation;
0103 return NULL;
0104 }
0105
0106 static int
0107 nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark)
0108 {
0109 struct nfs_delegation *delegation;
0110 int ret = 0;
0111
0112 flags &= FMODE_READ|FMODE_WRITE;
0113 rcu_read_lock();
0114 delegation = rcu_dereference(NFS_I(inode)->delegation);
0115 if (nfs4_is_valid_delegation(delegation, flags)) {
0116 if (mark)
0117 nfs_mark_delegation_referenced(delegation);
0118 ret = 1;
0119 }
0120 rcu_read_unlock();
0121 return ret;
0122 }
0123
0124
0125
0126
0127
0128
0129
0130
0131 int nfs4_have_delegation(struct inode *inode, fmode_t flags)
0132 {
0133 return nfs4_do_check_delegation(inode, flags, true);
0134 }
0135
0136
0137
0138
0139
0140 int nfs4_check_delegation(struct inode *inode, fmode_t flags)
0141 {
0142 return nfs4_do_check_delegation(inode, flags, false);
0143 }
0144
0145 static int nfs_delegation_claim_locks(struct nfs4_state *state, const nfs4_stateid *stateid)
0146 {
0147 struct inode *inode = state->inode;
0148 struct file_lock *fl;
0149 struct file_lock_context *flctx = inode->i_flctx;
0150 struct list_head *list;
0151 int status = 0;
0152
0153 if (flctx == NULL)
0154 goto out;
0155
0156 list = &flctx->flc_posix;
0157 spin_lock(&flctx->flc_lock);
0158 restart:
0159 list_for_each_entry(fl, list, fl_list) {
0160 if (nfs_file_open_context(fl->fl_file)->state != state)
0161 continue;
0162 spin_unlock(&flctx->flc_lock);
0163 status = nfs4_lock_delegation_recall(fl, state, stateid);
0164 if (status < 0)
0165 goto out;
0166 spin_lock(&flctx->flc_lock);
0167 }
0168 if (list == &flctx->flc_posix) {
0169 list = &flctx->flc_flock;
0170 goto restart;
0171 }
0172 spin_unlock(&flctx->flc_lock);
0173 out:
0174 return status;
0175 }
0176
0177 static int nfs_delegation_claim_opens(struct inode *inode,
0178 const nfs4_stateid *stateid, fmode_t type)
0179 {
0180 struct nfs_inode *nfsi = NFS_I(inode);
0181 struct nfs_open_context *ctx;
0182 struct nfs4_state_owner *sp;
0183 struct nfs4_state *state;
0184 unsigned int seq;
0185 int err;
0186
0187 again:
0188 rcu_read_lock();
0189 list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
0190 state = ctx->state;
0191 if (state == NULL)
0192 continue;
0193 if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
0194 continue;
0195 if (!nfs4_valid_open_stateid(state))
0196 continue;
0197 if (!nfs4_stateid_match(&state->stateid, stateid))
0198 continue;
0199 if (!get_nfs_open_context(ctx))
0200 continue;
0201 rcu_read_unlock();
0202 sp = state->owner;
0203
0204 mutex_lock(&sp->so_delegreturn_mutex);
0205 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
0206 err = nfs4_open_delegation_recall(ctx, state, stateid);
0207 if (!err)
0208 err = nfs_delegation_claim_locks(state, stateid);
0209 if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
0210 err = -EAGAIN;
0211 mutex_unlock(&sp->so_delegreturn_mutex);
0212 put_nfs_open_context(ctx);
0213 if (err != 0)
0214 return err;
0215 goto again;
0216 }
0217 rcu_read_unlock();
0218 return 0;
0219 }
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230 void nfs_inode_reclaim_delegation(struct inode *inode, const struct cred *cred,
0231 fmode_t type,
0232 const nfs4_stateid *stateid,
0233 unsigned long pagemod_limit)
0234 {
0235 struct nfs_delegation *delegation;
0236 const struct cred *oldcred = NULL;
0237
0238 rcu_read_lock();
0239 delegation = rcu_dereference(NFS_I(inode)->delegation);
0240 if (delegation != NULL) {
0241 spin_lock(&delegation->lock);
0242 if (nfs4_is_valid_delegation(delegation, 0)) {
0243 nfs4_stateid_copy(&delegation->stateid, stateid);
0244 delegation->type = type;
0245 delegation->pagemod_limit = pagemod_limit;
0246 oldcred = delegation->cred;
0247 delegation->cred = get_cred(cred);
0248 clear_bit(NFS_DELEGATION_NEED_RECLAIM,
0249 &delegation->flags);
0250 spin_unlock(&delegation->lock);
0251 rcu_read_unlock();
0252 put_cred(oldcred);
0253 trace_nfs4_reclaim_delegation(inode, type);
0254 return;
0255 }
0256
0257 spin_unlock(&delegation->lock);
0258 }
0259 rcu_read_unlock();
0260 nfs_inode_set_delegation(inode, cred, type, stateid, pagemod_limit);
0261 }
0262
0263 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)
0264 {
0265 const struct cred *cred;
0266 int res = 0;
0267
0268 if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) {
0269 spin_lock(&delegation->lock);
0270 cred = get_cred(delegation->cred);
0271 spin_unlock(&delegation->lock);
0272 res = nfs4_proc_delegreturn(inode, cred,
0273 &delegation->stateid,
0274 issync);
0275 put_cred(cred);
0276 }
0277 return res;
0278 }
0279
0280 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation)
0281 {
0282 struct inode *inode = NULL;
0283
0284 spin_lock(&delegation->lock);
0285 if (delegation->inode != NULL)
0286 inode = igrab(delegation->inode);
0287 if (!inode)
0288 set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags);
0289 spin_unlock(&delegation->lock);
0290 return inode;
0291 }
0292
0293 static struct nfs_delegation *
0294 nfs_start_delegation_return_locked(struct nfs_inode *nfsi)
0295 {
0296 struct nfs_delegation *ret = NULL;
0297 struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation);
0298
0299 if (delegation == NULL)
0300 goto out;
0301 spin_lock(&delegation->lock);
0302 if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) {
0303 clear_bit(NFS_DELEGATION_RETURN_DELAYED, &delegation->flags);
0304
0305 ret = nfs_get_delegation(delegation);
0306 }
0307 spin_unlock(&delegation->lock);
0308 if (ret)
0309 nfs_clear_verifier_delegated(&nfsi->vfs_inode);
0310 out:
0311 return ret;
0312 }
0313
0314 static struct nfs_delegation *
0315 nfs_start_delegation_return(struct nfs_inode *nfsi)
0316 {
0317 struct nfs_delegation *delegation;
0318
0319 rcu_read_lock();
0320 delegation = nfs_start_delegation_return_locked(nfsi);
0321 rcu_read_unlock();
0322 return delegation;
0323 }
0324
0325 static void nfs_abort_delegation_return(struct nfs_delegation *delegation,
0326 struct nfs_client *clp, int err)
0327 {
0328
0329 spin_lock(&delegation->lock);
0330 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
0331 if (err == -EAGAIN) {
0332 set_bit(NFS_DELEGATION_RETURN_DELAYED, &delegation->flags);
0333 set_bit(NFS4CLNT_DELEGRETURN_DELAYED, &clp->cl_state);
0334 }
0335 spin_unlock(&delegation->lock);
0336 }
0337
0338 static struct nfs_delegation *
0339 nfs_detach_delegation_locked(struct nfs_inode *nfsi,
0340 struct nfs_delegation *delegation,
0341 struct nfs_client *clp)
0342 {
0343 struct nfs_delegation *deleg_cur =
0344 rcu_dereference_protected(nfsi->delegation,
0345 lockdep_is_held(&clp->cl_lock));
0346
0347 if (deleg_cur == NULL || delegation != deleg_cur)
0348 return NULL;
0349
0350 spin_lock(&delegation->lock);
0351 if (!delegation->inode) {
0352 spin_unlock(&delegation->lock);
0353 return NULL;
0354 }
0355 list_del_rcu(&delegation->super_list);
0356 delegation->inode = NULL;
0357 rcu_assign_pointer(nfsi->delegation, NULL);
0358 spin_unlock(&delegation->lock);
0359 return delegation;
0360 }
0361
0362 static struct nfs_delegation *nfs_detach_delegation(struct nfs_inode *nfsi,
0363 struct nfs_delegation *delegation,
0364 struct nfs_server *server)
0365 {
0366 struct nfs_client *clp = server->nfs_client;
0367
0368 spin_lock(&clp->cl_lock);
0369 delegation = nfs_detach_delegation_locked(nfsi, delegation, clp);
0370 spin_unlock(&clp->cl_lock);
0371 return delegation;
0372 }
0373
0374 static struct nfs_delegation *
0375 nfs_inode_detach_delegation(struct inode *inode)
0376 {
0377 struct nfs_inode *nfsi = NFS_I(inode);
0378 struct nfs_server *server = NFS_SERVER(inode);
0379 struct nfs_delegation *delegation;
0380
0381 rcu_read_lock();
0382 delegation = rcu_dereference(nfsi->delegation);
0383 if (delegation != NULL)
0384 delegation = nfs_detach_delegation(nfsi, delegation, server);
0385 rcu_read_unlock();
0386 return delegation;
0387 }
0388
0389 static void
0390 nfs_update_delegation_cred(struct nfs_delegation *delegation,
0391 const struct cred *cred)
0392 {
0393 const struct cred *old;
0394
0395 if (cred_fscmp(delegation->cred, cred) != 0) {
0396 old = xchg(&delegation->cred, get_cred(cred));
0397 put_cred(old);
0398 }
0399 }
0400
0401 static void
0402 nfs_update_inplace_delegation(struct nfs_delegation *delegation,
0403 const struct nfs_delegation *update)
0404 {
0405 if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) {
0406 delegation->stateid.seqid = update->stateid.seqid;
0407 smp_wmb();
0408 delegation->type = update->type;
0409 delegation->pagemod_limit = update->pagemod_limit;
0410 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) {
0411 delegation->change_attr = update->change_attr;
0412 nfs_update_delegation_cred(delegation, update->cred);
0413
0414 clear_bit(NFS_DELEGATION_REVOKED, &delegation->flags);
0415 atomic_long_inc(&nfs_active_delegations);
0416 }
0417 }
0418 }
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430 int nfs_inode_set_delegation(struct inode *inode, const struct cred *cred,
0431 fmode_t type,
0432 const nfs4_stateid *stateid,
0433 unsigned long pagemod_limit)
0434 {
0435 struct nfs_server *server = NFS_SERVER(inode);
0436 struct nfs_client *clp = server->nfs_client;
0437 struct nfs_inode *nfsi = NFS_I(inode);
0438 struct nfs_delegation *delegation, *old_delegation;
0439 struct nfs_delegation *freeme = NULL;
0440 int status = 0;
0441
0442 delegation = kmalloc(sizeof(*delegation), GFP_KERNEL_ACCOUNT);
0443 if (delegation == NULL)
0444 return -ENOMEM;
0445 nfs4_stateid_copy(&delegation->stateid, stateid);
0446 refcount_set(&delegation->refcount, 1);
0447 delegation->type = type;
0448 delegation->pagemod_limit = pagemod_limit;
0449 delegation->change_attr = inode_peek_iversion_raw(inode);
0450 delegation->cred = get_cred(cred);
0451 delegation->inode = inode;
0452 delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
0453 spin_lock_init(&delegation->lock);
0454
0455 spin_lock(&clp->cl_lock);
0456 old_delegation = rcu_dereference_protected(nfsi->delegation,
0457 lockdep_is_held(&clp->cl_lock));
0458 if (old_delegation == NULL)
0459 goto add_new;
0460
0461 if (nfs4_stateid_match_other(&old_delegation->stateid,
0462 &delegation->stateid)) {
0463 spin_lock(&old_delegation->lock);
0464 nfs_update_inplace_delegation(old_delegation,
0465 delegation);
0466 spin_unlock(&old_delegation->lock);
0467 goto out;
0468 }
0469 if (!test_bit(NFS_DELEGATION_REVOKED, &old_delegation->flags)) {
0470
0471
0472
0473
0474
0475
0476 dfprintk(FILE, "%s: server %s handed out "
0477 "a duplicate delegation!\n",
0478 __func__, clp->cl_hostname);
0479 if (delegation->type == old_delegation->type ||
0480 !(delegation->type & FMODE_WRITE)) {
0481 freeme = delegation;
0482 delegation = NULL;
0483 goto out;
0484 }
0485 if (test_and_set_bit(NFS_DELEGATION_RETURNING,
0486 &old_delegation->flags))
0487 goto out;
0488 }
0489 freeme = nfs_detach_delegation_locked(nfsi, old_delegation, clp);
0490 if (freeme == NULL)
0491 goto out;
0492 add_new:
0493
0494
0495
0496
0497
0498 spin_lock(&inode->i_lock);
0499 if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_CHANGE)
0500 nfs_set_cache_invalid(inode,
0501 NFS_INO_INVALID_ATIME | NFS_INO_INVALID_CTIME |
0502 NFS_INO_INVALID_MTIME | NFS_INO_INVALID_SIZE |
0503 NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_NLINK |
0504 NFS_INO_INVALID_OTHER | NFS_INO_INVALID_DATA |
0505 NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL |
0506 NFS_INO_INVALID_XATTR);
0507 spin_unlock(&inode->i_lock);
0508
0509 list_add_tail_rcu(&delegation->super_list, &server->delegations);
0510 rcu_assign_pointer(nfsi->delegation, delegation);
0511 delegation = NULL;
0512
0513 atomic_long_inc(&nfs_active_delegations);
0514
0515 trace_nfs4_set_delegation(inode, type);
0516 out:
0517 spin_unlock(&clp->cl_lock);
0518 if (delegation != NULL)
0519 __nfs_free_delegation(delegation);
0520 if (freeme != NULL) {
0521 nfs_do_return_delegation(inode, freeme, 0);
0522 nfs_free_delegation(freeme);
0523 }
0524 return status;
0525 }
0526
0527
0528
0529
0530 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int issync)
0531 {
0532 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
0533 unsigned int mode = O_WRONLY | O_RDWR;
0534 int err = 0;
0535
0536 if (delegation == NULL)
0537 return 0;
0538
0539 if (!issync)
0540 mode |= O_NONBLOCK;
0541
0542 err = break_lease(inode, mode);
0543
0544 while (err == 0) {
0545 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
0546 break;
0547 err = nfs_delegation_claim_opens(inode, &delegation->stateid,
0548 delegation->type);
0549 if (!issync || err != -EAGAIN)
0550 break;
0551
0552
0553
0554 err = nfs4_wait_clnt_recover(clp);
0555 }
0556
0557 if (err) {
0558 nfs_abort_delegation_return(delegation, clp, err);
0559 goto out;
0560 }
0561
0562 err = nfs_do_return_delegation(inode, delegation, issync);
0563 out:
0564
0565 nfs_put_delegation(delegation);
0566 return err;
0567 }
0568
0569 static bool nfs_delegation_need_return(struct nfs_delegation *delegation)
0570 {
0571 bool ret = false;
0572
0573 if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags))
0574 ret = true;
0575 else if (test_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags)) {
0576 struct inode *inode;
0577
0578 spin_lock(&delegation->lock);
0579 inode = delegation->inode;
0580 if (inode && list_empty(&NFS_I(inode)->open_files))
0581 ret = true;
0582 spin_unlock(&delegation->lock);
0583 }
0584 if (ret)
0585 clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags);
0586 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags) ||
0587 test_bit(NFS_DELEGATION_RETURN_DELAYED, &delegation->flags) ||
0588 test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
0589 ret = false;
0590
0591 return ret;
0592 }
0593
0594 static int nfs_server_return_marked_delegations(struct nfs_server *server,
0595 void __always_unused *data)
0596 {
0597 struct nfs_delegation *delegation;
0598 struct nfs_delegation *prev;
0599 struct inode *inode;
0600 struct inode *place_holder = NULL;
0601 struct nfs_delegation *place_holder_deleg = NULL;
0602 int err = 0;
0603
0604 restart:
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614 prev = NULL;
0615 delegation = NULL;
0616 rcu_read_lock();
0617 if (place_holder)
0618 delegation = rcu_dereference(NFS_I(place_holder)->delegation);
0619 if (!delegation || delegation != place_holder_deleg)
0620 delegation = list_entry_rcu(server->delegations.next,
0621 struct nfs_delegation, super_list);
0622 list_for_each_entry_from_rcu(delegation, &server->delegations, super_list) {
0623 struct inode *to_put = NULL;
0624
0625 if (test_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags))
0626 continue;
0627 if (!nfs_delegation_need_return(delegation)) {
0628 if (nfs4_is_valid_delegation(delegation, 0))
0629 prev = delegation;
0630 continue;
0631 }
0632
0633 if (prev) {
0634 struct inode *tmp = nfs_delegation_grab_inode(prev);
0635 if (tmp) {
0636 to_put = place_holder;
0637 place_holder = tmp;
0638 place_holder_deleg = prev;
0639 }
0640 }
0641
0642 inode = nfs_delegation_grab_inode(delegation);
0643 if (inode == NULL) {
0644 rcu_read_unlock();
0645 iput(to_put);
0646 goto restart;
0647 }
0648 delegation = nfs_start_delegation_return_locked(NFS_I(inode));
0649 rcu_read_unlock();
0650
0651 iput(to_put);
0652
0653 err = nfs_end_delegation_return(inode, delegation, 0);
0654 iput(inode);
0655 cond_resched();
0656 if (!err)
0657 goto restart;
0658 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
0659 goto out;
0660 }
0661 rcu_read_unlock();
0662 out:
0663 iput(place_holder);
0664 return err;
0665 }
0666
0667 static bool nfs_server_clear_delayed_delegations(struct nfs_server *server)
0668 {
0669 struct nfs_delegation *d;
0670 bool ret = false;
0671
0672 list_for_each_entry_rcu (d, &server->delegations, super_list) {
0673 if (!test_bit(NFS_DELEGATION_RETURN_DELAYED, &d->flags))
0674 continue;
0675 nfs_mark_return_delegation(server, d);
0676 clear_bit(NFS_DELEGATION_RETURN_DELAYED, &d->flags);
0677 ret = true;
0678 }
0679 return ret;
0680 }
0681
0682 static bool nfs_client_clear_delayed_delegations(struct nfs_client *clp)
0683 {
0684 struct nfs_server *server;
0685 bool ret = false;
0686
0687 if (!test_and_clear_bit(NFS4CLNT_DELEGRETURN_DELAYED, &clp->cl_state))
0688 goto out;
0689 rcu_read_lock();
0690 list_for_each_entry_rcu (server, &clp->cl_superblocks, client_link) {
0691 if (nfs_server_clear_delayed_delegations(server))
0692 ret = true;
0693 }
0694 rcu_read_unlock();
0695 out:
0696 return ret;
0697 }
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709 int nfs_client_return_marked_delegations(struct nfs_client *clp)
0710 {
0711 int err = nfs_client_for_each_server(
0712 clp, nfs_server_return_marked_delegations, NULL);
0713 if (err)
0714 return err;
0715
0716 if (nfs_client_clear_delayed_delegations(clp))
0717 ssleep(1);
0718 return 0;
0719 }
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729 void nfs_inode_evict_delegation(struct inode *inode)
0730 {
0731 struct nfs_delegation *delegation;
0732
0733 delegation = nfs_inode_detach_delegation(inode);
0734 if (delegation != NULL) {
0735 set_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
0736 set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags);
0737 nfs_do_return_delegation(inode, delegation, 1);
0738 nfs_free_delegation(delegation);
0739 }
0740 }
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752 int nfs4_inode_return_delegation(struct inode *inode)
0753 {
0754 struct nfs_inode *nfsi = NFS_I(inode);
0755 struct nfs_delegation *delegation;
0756
0757 delegation = nfs_start_delegation_return(nfsi);
0758 if (delegation != NULL) {
0759
0760 break_lease(inode, O_WRONLY | O_RDWR);
0761 if (S_ISREG(inode->i_mode))
0762 nfs_wb_all(inode);
0763 return nfs_end_delegation_return(inode, delegation, 1);
0764 }
0765 return 0;
0766 }
0767
0768
0769
0770
0771
0772
0773
0774
0775 void nfs4_inode_return_delegation_on_close(struct inode *inode)
0776 {
0777 struct nfs_delegation *delegation;
0778 struct nfs_delegation *ret = NULL;
0779
0780 if (!inode)
0781 return;
0782 rcu_read_lock();
0783 delegation = nfs4_get_valid_delegation(inode);
0784 if (!delegation)
0785 goto out;
0786 if (test_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) ||
0787 atomic_long_read(&nfs_active_delegations) >= nfs_delegation_watermark) {
0788 spin_lock(&delegation->lock);
0789 if (delegation->inode &&
0790 list_empty(&NFS_I(inode)->open_files) &&
0791 !test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) {
0792 clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags);
0793
0794 ret = nfs_get_delegation(delegation);
0795 }
0796 spin_unlock(&delegation->lock);
0797 if (ret)
0798 nfs_clear_verifier_delegated(inode);
0799 }
0800 out:
0801 rcu_read_unlock();
0802 nfs_end_delegation_return(inode, ret, 0);
0803 }
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813 int nfs4_inode_make_writeable(struct inode *inode)
0814 {
0815 struct nfs_delegation *delegation;
0816
0817 rcu_read_lock();
0818 delegation = nfs4_get_valid_delegation(inode);
0819 if (delegation == NULL ||
0820 (nfs4_has_session(NFS_SERVER(inode)->nfs_client) &&
0821 (delegation->type & FMODE_WRITE))) {
0822 rcu_read_unlock();
0823 return 0;
0824 }
0825 rcu_read_unlock();
0826 return nfs4_inode_return_delegation(inode);
0827 }
0828
0829 static void nfs_mark_return_if_closed_delegation(struct nfs_server *server,
0830 struct nfs_delegation *delegation)
0831 {
0832 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags);
0833 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
0834 }
0835
0836 static bool nfs_server_mark_return_all_delegations(struct nfs_server *server)
0837 {
0838 struct nfs_delegation *delegation;
0839 bool ret = false;
0840
0841 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
0842 nfs_mark_return_delegation(server, delegation);
0843 ret = true;
0844 }
0845 return ret;
0846 }
0847
0848 static void nfs_client_mark_return_all_delegations(struct nfs_client *clp)
0849 {
0850 struct nfs_server *server;
0851
0852 rcu_read_lock();
0853 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
0854 nfs_server_mark_return_all_delegations(server);
0855 rcu_read_unlock();
0856 }
0857
0858 static void nfs_delegation_run_state_manager(struct nfs_client *clp)
0859 {
0860 if (test_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state))
0861 nfs4_schedule_state_manager(clp);
0862 }
0863
0864
0865
0866
0867
0868
0869 void nfs_expire_all_delegations(struct nfs_client *clp)
0870 {
0871 nfs_client_mark_return_all_delegations(clp);
0872 nfs_delegation_run_state_manager(clp);
0873 }
0874
0875
0876
0877
0878
0879
0880 void nfs_server_return_all_delegations(struct nfs_server *server)
0881 {
0882 struct nfs_client *clp = server->nfs_client;
0883 bool need_wait;
0884
0885 if (clp == NULL)
0886 return;
0887
0888 rcu_read_lock();
0889 need_wait = nfs_server_mark_return_all_delegations(server);
0890 rcu_read_unlock();
0891
0892 if (need_wait) {
0893 nfs4_schedule_state_manager(clp);
0894 nfs4_wait_clnt_recover(clp);
0895 }
0896 }
0897
0898 static void nfs_mark_return_unused_delegation_types(struct nfs_server *server,
0899 fmode_t flags)
0900 {
0901 struct nfs_delegation *delegation;
0902
0903 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
0904 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE))
0905 continue;
0906 if (delegation->type & flags)
0907 nfs_mark_return_if_closed_delegation(server, delegation);
0908 }
0909 }
0910
0911 static void nfs_client_mark_return_unused_delegation_types(struct nfs_client *clp,
0912 fmode_t flags)
0913 {
0914 struct nfs_server *server;
0915
0916 rcu_read_lock();
0917 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
0918 nfs_mark_return_unused_delegation_types(server, flags);
0919 rcu_read_unlock();
0920 }
0921
0922 static void nfs_revoke_delegation(struct inode *inode,
0923 const nfs4_stateid *stateid)
0924 {
0925 struct nfs_delegation *delegation;
0926 nfs4_stateid tmp;
0927 bool ret = false;
0928
0929 rcu_read_lock();
0930 delegation = rcu_dereference(NFS_I(inode)->delegation);
0931 if (delegation == NULL)
0932 goto out;
0933 if (stateid == NULL) {
0934 nfs4_stateid_copy(&tmp, &delegation->stateid);
0935 stateid = &tmp;
0936 } else {
0937 if (!nfs4_stateid_match_other(stateid, &delegation->stateid))
0938 goto out;
0939 spin_lock(&delegation->lock);
0940 if (stateid->seqid) {
0941 if (nfs4_stateid_is_newer(&delegation->stateid, stateid)) {
0942 spin_unlock(&delegation->lock);
0943 goto out;
0944 }
0945 delegation->stateid.seqid = stateid->seqid;
0946 }
0947 spin_unlock(&delegation->lock);
0948 }
0949 nfs_mark_delegation_revoked(delegation);
0950 ret = true;
0951 out:
0952 rcu_read_unlock();
0953 if (ret)
0954 nfs_inode_find_state_and_recover(inode, stateid);
0955 }
0956
0957 void nfs_remove_bad_delegation(struct inode *inode,
0958 const nfs4_stateid *stateid)
0959 {
0960 nfs_revoke_delegation(inode, stateid);
0961 }
0962 EXPORT_SYMBOL_GPL(nfs_remove_bad_delegation);
0963
0964 void nfs_delegation_mark_returned(struct inode *inode,
0965 const nfs4_stateid *stateid)
0966 {
0967 struct nfs_delegation *delegation;
0968
0969 if (!inode)
0970 return;
0971
0972 rcu_read_lock();
0973 delegation = rcu_dereference(NFS_I(inode)->delegation);
0974 if (!delegation)
0975 goto out_rcu_unlock;
0976
0977 spin_lock(&delegation->lock);
0978 if (!nfs4_stateid_match_other(stateid, &delegation->stateid))
0979 goto out_spin_unlock;
0980 if (stateid->seqid) {
0981
0982 if (nfs4_stateid_is_newer(&delegation->stateid, stateid))
0983 goto out_clear_returning;
0984 if (delegation->stateid.seqid != stateid->seqid)
0985 delegation->stateid.seqid = stateid->seqid;
0986 }
0987
0988 nfs_mark_delegation_revoked(delegation);
0989
0990 out_clear_returning:
0991 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
0992 out_spin_unlock:
0993 spin_unlock(&delegation->lock);
0994 out_rcu_unlock:
0995 rcu_read_unlock();
0996
0997 nfs_inode_find_state_and_recover(inode, stateid);
0998 }
0999
1000
1001
1002
1003
1004
1005
1006 void nfs_expire_unused_delegation_types(struct nfs_client *clp, fmode_t flags)
1007 {
1008 nfs_client_mark_return_unused_delegation_types(clp, flags);
1009 nfs_delegation_run_state_manager(clp);
1010 }
1011
1012 static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server)
1013 {
1014 struct nfs_delegation *delegation;
1015
1016 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
1017 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags))
1018 continue;
1019 nfs_mark_return_if_closed_delegation(server, delegation);
1020 }
1021 }
1022
1023
1024
1025
1026
1027
1028 void nfs_expire_unreferenced_delegations(struct nfs_client *clp)
1029 {
1030 struct nfs_server *server;
1031
1032 rcu_read_lock();
1033 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1034 nfs_mark_return_unreferenced_delegations(server);
1035 rcu_read_unlock();
1036
1037 nfs_delegation_run_state_manager(clp);
1038 }
1039
1040
1041
1042
1043
1044
1045
1046
1047 int nfs_async_inode_return_delegation(struct inode *inode,
1048 const nfs4_stateid *stateid)
1049 {
1050 struct nfs_server *server = NFS_SERVER(inode);
1051 struct nfs_client *clp = server->nfs_client;
1052 struct nfs_delegation *delegation;
1053
1054 rcu_read_lock();
1055 delegation = nfs4_get_valid_delegation(inode);
1056 if (delegation == NULL)
1057 goto out_enoent;
1058 if (stateid != NULL &&
1059 !clp->cl_mvops->match_stateid(&delegation->stateid, stateid))
1060 goto out_enoent;
1061 nfs_mark_return_delegation(server, delegation);
1062 rcu_read_unlock();
1063
1064
1065 break_lease(inode, O_WRONLY | O_RDWR | O_NONBLOCK);
1066
1067 nfs_delegation_run_state_manager(clp);
1068 return 0;
1069 out_enoent:
1070 rcu_read_unlock();
1071 return -ENOENT;
1072 }
1073
1074 static struct inode *
1075 nfs_delegation_find_inode_server(struct nfs_server *server,
1076 const struct nfs_fh *fhandle)
1077 {
1078 struct nfs_delegation *delegation;
1079 struct super_block *freeme = NULL;
1080 struct inode *res = NULL;
1081
1082 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
1083 spin_lock(&delegation->lock);
1084 if (delegation->inode != NULL &&
1085 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) &&
1086 nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) {
1087 if (nfs_sb_active(server->super)) {
1088 freeme = server->super;
1089 res = igrab(delegation->inode);
1090 }
1091 spin_unlock(&delegation->lock);
1092 if (res != NULL)
1093 return res;
1094 if (freeme) {
1095 rcu_read_unlock();
1096 nfs_sb_deactive(freeme);
1097 rcu_read_lock();
1098 }
1099 return ERR_PTR(-EAGAIN);
1100 }
1101 spin_unlock(&delegation->lock);
1102 }
1103 return ERR_PTR(-ENOENT);
1104 }
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114 struct inode *nfs_delegation_find_inode(struct nfs_client *clp,
1115 const struct nfs_fh *fhandle)
1116 {
1117 struct nfs_server *server;
1118 struct inode *res;
1119
1120 rcu_read_lock();
1121 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1122 res = nfs_delegation_find_inode_server(server, fhandle);
1123 if (res != ERR_PTR(-ENOENT)) {
1124 rcu_read_unlock();
1125 return res;
1126 }
1127 }
1128 rcu_read_unlock();
1129 return ERR_PTR(-ENOENT);
1130 }
1131
1132 static void nfs_delegation_mark_reclaim_server(struct nfs_server *server)
1133 {
1134 struct nfs_delegation *delegation;
1135
1136 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
1137
1138
1139
1140
1141 if (test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags))
1142 continue;
1143 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags);
1144 }
1145 }
1146
1147
1148
1149
1150
1151
1152 void nfs_delegation_mark_reclaim(struct nfs_client *clp)
1153 {
1154 struct nfs_server *server;
1155
1156 rcu_read_lock();
1157 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1158 nfs_delegation_mark_reclaim_server(server);
1159 rcu_read_unlock();
1160 }
1161
1162 static int nfs_server_reap_unclaimed_delegations(struct nfs_server *server,
1163 void __always_unused *data)
1164 {
1165 struct nfs_delegation *delegation;
1166 struct inode *inode;
1167 restart:
1168 rcu_read_lock();
1169 restart_locked:
1170 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
1171 if (test_bit(NFS_DELEGATION_INODE_FREEING,
1172 &delegation->flags) ||
1173 test_bit(NFS_DELEGATION_RETURNING,
1174 &delegation->flags) ||
1175 test_bit(NFS_DELEGATION_NEED_RECLAIM,
1176 &delegation->flags) == 0)
1177 continue;
1178 inode = nfs_delegation_grab_inode(delegation);
1179 if (inode == NULL)
1180 goto restart_locked;
1181 delegation = nfs_start_delegation_return_locked(NFS_I(inode));
1182 rcu_read_unlock();
1183 if (delegation != NULL) {
1184 if (nfs_detach_delegation(NFS_I(inode), delegation,
1185 server) != NULL)
1186 nfs_free_delegation(delegation);
1187
1188 nfs_put_delegation(delegation);
1189 }
1190 iput(inode);
1191 cond_resched();
1192 goto restart;
1193 }
1194 rcu_read_unlock();
1195 return 0;
1196 }
1197
1198
1199
1200
1201
1202
1203 void nfs_delegation_reap_unclaimed(struct nfs_client *clp)
1204 {
1205 nfs_client_for_each_server(clp, nfs_server_reap_unclaimed_delegations,
1206 NULL);
1207 }
1208
1209 static inline bool nfs4_server_rebooted(const struct nfs_client *clp)
1210 {
1211 return (clp->cl_state & (BIT(NFS4CLNT_CHECK_LEASE) |
1212 BIT(NFS4CLNT_LEASE_EXPIRED) |
1213 BIT(NFS4CLNT_SESSION_RESET))) != 0;
1214 }
1215
1216 static void nfs_mark_test_expired_delegation(struct nfs_server *server,
1217 struct nfs_delegation *delegation)
1218 {
1219 if (delegation->stateid.type == NFS4_INVALID_STATEID_TYPE)
1220 return;
1221 clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags);
1222 set_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags);
1223 set_bit(NFS4CLNT_DELEGATION_EXPIRED, &server->nfs_client->cl_state);
1224 }
1225
1226 static void nfs_inode_mark_test_expired_delegation(struct nfs_server *server,
1227 struct inode *inode)
1228 {
1229 struct nfs_delegation *delegation;
1230
1231 rcu_read_lock();
1232 delegation = rcu_dereference(NFS_I(inode)->delegation);
1233 if (delegation)
1234 nfs_mark_test_expired_delegation(server, delegation);
1235 rcu_read_unlock();
1236
1237 }
1238
1239 static void nfs_delegation_mark_test_expired_server(struct nfs_server *server)
1240 {
1241 struct nfs_delegation *delegation;
1242
1243 list_for_each_entry_rcu(delegation, &server->delegations, super_list)
1244 nfs_mark_test_expired_delegation(server, delegation);
1245 }
1246
1247
1248
1249
1250
1251
1252
1253
1254 void nfs_mark_test_expired_all_delegations(struct nfs_client *clp)
1255 {
1256 struct nfs_server *server;
1257
1258 rcu_read_lock();
1259 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1260 nfs_delegation_mark_test_expired_server(server);
1261 rcu_read_unlock();
1262 }
1263
1264
1265
1266
1267
1268
1269
1270 void nfs_test_expired_all_delegations(struct nfs_client *clp)
1271 {
1272 nfs_mark_test_expired_all_delegations(clp);
1273 nfs4_schedule_state_manager(clp);
1274 }
1275
1276 static void
1277 nfs_delegation_test_free_expired(struct inode *inode,
1278 nfs4_stateid *stateid,
1279 const struct cred *cred)
1280 {
1281 struct nfs_server *server = NFS_SERVER(inode);
1282 const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
1283 int status;
1284
1285 if (!cred)
1286 return;
1287 status = ops->test_and_free_expired(server, stateid, cred);
1288 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
1289 nfs_remove_bad_delegation(inode, stateid);
1290 }
1291
1292 static int nfs_server_reap_expired_delegations(struct nfs_server *server,
1293 void __always_unused *data)
1294 {
1295 struct nfs_delegation *delegation;
1296 struct inode *inode;
1297 const struct cred *cred;
1298 nfs4_stateid stateid;
1299 restart:
1300 rcu_read_lock();
1301 restart_locked:
1302 list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
1303 if (test_bit(NFS_DELEGATION_INODE_FREEING,
1304 &delegation->flags) ||
1305 test_bit(NFS_DELEGATION_RETURNING,
1306 &delegation->flags) ||
1307 test_bit(NFS_DELEGATION_TEST_EXPIRED,
1308 &delegation->flags) == 0)
1309 continue;
1310 inode = nfs_delegation_grab_inode(delegation);
1311 if (inode == NULL)
1312 goto restart_locked;
1313 spin_lock(&delegation->lock);
1314 cred = get_cred_rcu(delegation->cred);
1315 nfs4_stateid_copy(&stateid, &delegation->stateid);
1316 spin_unlock(&delegation->lock);
1317 clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags);
1318 rcu_read_unlock();
1319 nfs_delegation_test_free_expired(inode, &stateid, cred);
1320 put_cred(cred);
1321 if (!nfs4_server_rebooted(server->nfs_client)) {
1322 iput(inode);
1323 cond_resched();
1324 goto restart;
1325 }
1326 nfs_inode_mark_test_expired_delegation(server,inode);
1327 iput(inode);
1328 return -EAGAIN;
1329 }
1330 rcu_read_unlock();
1331 return 0;
1332 }
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343 void nfs_reap_expired_delegations(struct nfs_client *clp)
1344 {
1345 nfs_client_for_each_server(clp, nfs_server_reap_expired_delegations,
1346 NULL);
1347 }
1348
1349 void nfs_inode_find_delegation_state_and_recover(struct inode *inode,
1350 const nfs4_stateid *stateid)
1351 {
1352 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
1353 struct nfs_delegation *delegation;
1354 bool found = false;
1355
1356 rcu_read_lock();
1357 delegation = rcu_dereference(NFS_I(inode)->delegation);
1358 if (delegation &&
1359 nfs4_stateid_match_or_older(&delegation->stateid, stateid) &&
1360 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) {
1361 nfs_mark_test_expired_delegation(NFS_SERVER(inode), delegation);
1362 found = true;
1363 }
1364 rcu_read_unlock();
1365 if (found)
1366 nfs4_schedule_state_manager(clp);
1367 }
1368
1369
1370
1371
1372
1373
1374
1375
1376 int nfs_delegations_present(struct nfs_client *clp)
1377 {
1378 struct nfs_server *server;
1379 int ret = 0;
1380
1381 rcu_read_lock();
1382 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1383 if (!list_empty(&server->delegations)) {
1384 ret = 1;
1385 break;
1386 }
1387 rcu_read_unlock();
1388 return ret;
1389 }
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399 bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode)
1400 {
1401 struct nfs_delegation *delegation;
1402 bool ret = false;
1403 if (!inode)
1404 goto out;
1405
1406 rcu_read_lock();
1407 delegation = rcu_dereference(NFS_I(inode)->delegation);
1408 if (delegation != NULL &&
1409 nfs4_stateid_match_other(dst, &delegation->stateid) &&
1410 nfs4_stateid_is_newer(&delegation->stateid, dst) &&
1411 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) {
1412 dst->seqid = delegation->stateid.seqid;
1413 ret = true;
1414 }
1415 rcu_read_unlock();
1416 out:
1417 return ret;
1418 }
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430 bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags,
1431 nfs4_stateid *dst, const struct cred **cred)
1432 {
1433 struct nfs_inode *nfsi = NFS_I(inode);
1434 struct nfs_delegation *delegation;
1435 bool ret = false;
1436
1437 flags &= FMODE_READ|FMODE_WRITE;
1438 rcu_read_lock();
1439 delegation = rcu_dereference(nfsi->delegation);
1440 if (!delegation)
1441 goto out;
1442 spin_lock(&delegation->lock);
1443 ret = nfs4_is_valid_delegation(delegation, flags);
1444 if (ret) {
1445 nfs4_stateid_copy(dst, &delegation->stateid);
1446 nfs_mark_delegation_referenced(delegation);
1447 if (cred)
1448 *cred = get_cred(delegation->cred);
1449 }
1450 spin_unlock(&delegation->lock);
1451 out:
1452 rcu_read_unlock();
1453 return ret;
1454 }
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464 bool nfs4_delegation_flush_on_close(const struct inode *inode)
1465 {
1466 struct nfs_inode *nfsi = NFS_I(inode);
1467 struct nfs_delegation *delegation;
1468 bool ret = true;
1469
1470 rcu_read_lock();
1471 delegation = rcu_dereference(nfsi->delegation);
1472 if (delegation == NULL || !(delegation->type & FMODE_WRITE))
1473 goto out;
1474 if (atomic_long_read(&nfsi->nrequests) < delegation->pagemod_limit)
1475 ret = false;
1476 out:
1477 rcu_read_unlock();
1478 return ret;
1479 }
1480
1481 module_param_named(delegation_watermark, nfs_delegation_watermark, uint, 0644);