~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/nfs/nfs4renewd.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/nfs/nfs4renewd.c (Version linux-6.12-rc7) and /fs/nfs/nfs4renewd.c (Version linux-5.3.18)


  1 /*                                                  1 /*
  2  *  fs/nfs/nfs4renewd.c                             2  *  fs/nfs/nfs4renewd.c
  3  *                                                  3  *
  4  *  Copyright (c) 2002 The Regents of the Univ      4  *  Copyright (c) 2002 The Regents of the University of Michigan.
  5  *  All rights reserved.                            5  *  All rights reserved.
  6  *                                                  6  *
  7  *  Kendrick Smith <kmsmith@umich.edu>              7  *  Kendrick Smith <kmsmith@umich.edu>
  8  *                                                  8  *
  9  *  Redistribution and use in source and binar      9  *  Redistribution and use in source and binary forms, with or without
 10  *  modification, are permitted provided that      10  *  modification, are permitted provided that the following conditions
 11  *  are met:                                       11  *  are met:
 12  *                                                 12  *
 13  *  1. Redistributions of source code must ret     13  *  1. Redistributions of source code must retain the above copyright
 14  *     notice, this list of conditions and the     14  *     notice, this list of conditions and the following disclaimer.
 15  *  2. Redistributions in binary form must rep     15  *  2. Redistributions in binary form must reproduce the above copyright
 16  *     notice, this list of conditions and the     16  *     notice, this list of conditions and the following disclaimer in the
 17  *     documentation and/or other materials pr     17  *     documentation and/or other materials provided with the distribution.
 18  *  3. Neither the name of the University nor      18  *  3. Neither the name of the University nor the names of its
 19  *     contributors may be used to endorse or      19  *     contributors may be used to endorse or promote products derived
 20  *     from this software without specific pri     20  *     from this software without specific prior written permission.
 21  *                                                 21  *
 22  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND AN     22  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 23  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO,     23  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 24  *  MERCHANTABILITY AND FITNESS FOR A PARTICUL     24  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 25  *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS      25  *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 26  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPEC     26  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 27  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      27  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 28  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     28  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 29  *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND      29  *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 30  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIA     30  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 31  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WA     31  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 32  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILI     32  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 33  *                                                 33  *
 34  * Implementation of the NFSv4 "renew daemon",     34  * Implementation of the NFSv4 "renew daemon", which wakes up periodically to
 35  * send a RENEW, to keep state alive on the se     35  * send a RENEW, to keep state alive on the server.  The daemon is implemented
 36  * as an rpc_task, not a real kernel thread, s     36  * as an rpc_task, not a real kernel thread, so it always runs in rpciod's
 37  * context.  There is one renewd per nfs_serve     37  * context.  There is one renewd per nfs_server.
 38  *                                                 38  *
 39  */                                                39  */
 40                                                    40 
 41 #include <linux/mm.h>                              41 #include <linux/mm.h>
 42 #include <linux/pagemap.h>                         42 #include <linux/pagemap.h>
 43 #include <linux/sunrpc/sched.h>                    43 #include <linux/sunrpc/sched.h>
 44 #include <linux/sunrpc/clnt.h>                     44 #include <linux/sunrpc/clnt.h>
 45                                                    45 
 46 #include <linux/nfs.h>                             46 #include <linux/nfs.h>
 47 #include <linux/nfs4.h>                            47 #include <linux/nfs4.h>
 48 #include <linux/nfs_fs.h>                          48 #include <linux/nfs_fs.h>
 49 #include "nfs4_fs.h"                               49 #include "nfs4_fs.h"
 50 #include "delegation.h"                            50 #include "delegation.h"
 51                                                    51 
 52 #define NFSDBG_FACILITY         NFSDBG_STATE       52 #define NFSDBG_FACILITY         NFSDBG_STATE
 53                                                    53 
 54 void                                               54 void
 55 nfs4_renew_state(struct work_struct *work)         55 nfs4_renew_state(struct work_struct *work)
 56 {                                                  56 {
 57         const struct nfs4_state_maintenance_op     57         const struct nfs4_state_maintenance_ops *ops;
 58         struct nfs_client *clp =                   58         struct nfs_client *clp =
 59                 container_of(work, struct nfs_     59                 container_of(work, struct nfs_client, cl_renewd.work);
 60         const struct cred *cred;                   60         const struct cred *cred;
 61         long lease;                                61         long lease;
 62         unsigned long last, now;                   62         unsigned long last, now;
 63         unsigned renew_flags = 0;                  63         unsigned renew_flags = 0;
 64                                                    64 
 65         ops = clp->cl_mvops->state_renewal_ops     65         ops = clp->cl_mvops->state_renewal_ops;
 66         dprintk("%s: start\n", __func__);          66         dprintk("%s: start\n", __func__);
 67                                                    67 
 68         if (test_bit(NFS_CS_STOP_RENEW, &clp->     68         if (test_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state))
 69                 goto out;                          69                 goto out;
 70                                                    70 
 71         lease = clp->cl_lease_time;                71         lease = clp->cl_lease_time;
 72         last = clp->cl_last_renewal;               72         last = clp->cl_last_renewal;
 73         now = jiffies;                             73         now = jiffies;
 74         /* Are we close to a lease timeout? */     74         /* Are we close to a lease timeout? */
 75         if (time_after(now, last + lease/3))       75         if (time_after(now, last + lease/3))
 76                 renew_flags |= NFS4_RENEW_TIME     76                 renew_flags |= NFS4_RENEW_TIMEOUT;
 77         if (nfs_delegations_present(clp))          77         if (nfs_delegations_present(clp))
 78                 renew_flags |= NFS4_RENEW_DELE     78                 renew_flags |= NFS4_RENEW_DELEGATION_CB;
 79                                                    79 
 80         if (renew_flags != 0) {                    80         if (renew_flags != 0) {
 81                 cred = ops->get_state_renewal_     81                 cred = ops->get_state_renewal_cred(clp);
 82                 if (cred == NULL) {                82                 if (cred == NULL) {
 83                         if (!(renew_flags & NF     83                         if (!(renew_flags & NFS4_RENEW_DELEGATION_CB)) {
 84                                 set_bit(NFS4CL     84                                 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
 85                                 goto out;          85                                 goto out;
 86                         }                          86                         }
 87                         nfs_expire_all_delegat     87                         nfs_expire_all_delegations(clp);
 88                 } else {                           88                 } else {
 89                         int ret;                   89                         int ret;
 90                                                    90 
 91                         /* Queue an asynchrono     91                         /* Queue an asynchronous RENEW. */
 92                         ret = ops->sched_state     92                         ret = ops->sched_state_renewal(clp, cred, renew_flags);
 93                         put_cred(cred);            93                         put_cred(cred);
 94                         switch (ret) {             94                         switch (ret) {
 95                         default:                   95                         default:
 96                                 goto out_exp;      96                                 goto out_exp;
 97                         case -EAGAIN:              97                         case -EAGAIN:
 98                         case -ENOMEM:              98                         case -ENOMEM:
 99                                 break;             99                                 break;
100                         }                         100                         }
101                 }                                 101                 }
102         } else {                                  102         } else {
103                 dprintk("%s: failed to call re    103                 dprintk("%s: failed to call renewd. Reason: lease not expired \n",
104                                 __func__);        104                                 __func__);
105         }                                         105         }
106         nfs4_schedule_state_renewal(clp);         106         nfs4_schedule_state_renewal(clp);
107 out_exp:                                          107 out_exp:
108         nfs_expire_unreferenced_delegations(cl    108         nfs_expire_unreferenced_delegations(clp);
109 out:                                              109 out:
110         dprintk("%s: done\n", __func__);          110         dprintk("%s: done\n", __func__);
111 }                                                 111 }
112                                                   112 
113 void                                              113 void
114 nfs4_schedule_state_renewal(struct nfs_client     114 nfs4_schedule_state_renewal(struct nfs_client *clp)
115 {                                                 115 {
116         long timeout;                             116         long timeout;
117                                                   117 
118         spin_lock(&clp->cl_lock);                 118         spin_lock(&clp->cl_lock);
119         timeout = (2 * clp->cl_lease_time) / 3    119         timeout = (2 * clp->cl_lease_time) / 3 + (long)clp->cl_last_renewal
120                 - (long)jiffies;                  120                 - (long)jiffies;
121         if (timeout < 5 * HZ)                     121         if (timeout < 5 * HZ)
122                 timeout = 5 * HZ;                 122                 timeout = 5 * HZ;
123         dprintk("%s: requeueing work. Lease pe    123         dprintk("%s: requeueing work. Lease period = %ld\n",
124                         __func__, (timeout + H    124                         __func__, (timeout + HZ - 1) / HZ);
125         mod_delayed_work(system_wq, &clp->cl_r    125         mod_delayed_work(system_wq, &clp->cl_renewd, timeout);
126         set_bit(NFS_CS_RENEWD, &clp->cl_res_st    126         set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
127         spin_unlock(&clp->cl_lock);               127         spin_unlock(&clp->cl_lock);
128 }                                                 128 }
129                                                   129 
130 void                                              130 void
131 nfs4_kill_renewd(struct nfs_client *clp)          131 nfs4_kill_renewd(struct nfs_client *clp)
132 {                                                 132 {
133         cancel_delayed_work_sync(&clp->cl_rene    133         cancel_delayed_work_sync(&clp->cl_renewd);
134 }                                                 134 }
135                                                   135 
136 /**                                               136 /**
137  * nfs4_set_lease_period - Sets the lease peri    137  * nfs4_set_lease_period - Sets the lease period on a nfs_client
138  *                                                138  *
139  * @clp: pointer to nfs_client                    139  * @clp: pointer to nfs_client
140  * @lease: new value for lease period             140  * @lease: new value for lease period
                                                   >> 141  * @lastrenewed: time at which lease was last renewed
141  */                                               142  */
142 void nfs4_set_lease_period(struct nfs_client *    143 void nfs4_set_lease_period(struct nfs_client *clp,
143                 unsigned long lease)           !! 144                 unsigned long lease,
                                                   >> 145                 unsigned long lastrenewed)
144 {                                                 146 {
145         spin_lock(&clp->cl_lock);                 147         spin_lock(&clp->cl_lock);
146         clp->cl_lease_time = lease;               148         clp->cl_lease_time = lease;
                                                   >> 149         clp->cl_last_renewal = lastrenewed;
147         spin_unlock(&clp->cl_lock);               150         spin_unlock(&clp->cl_lock);
148                                                   151 
149         /* Cap maximum reconnect timeout at 1/    152         /* Cap maximum reconnect timeout at 1/2 lease period */
150         rpc_set_connect_timeout(clp->cl_rpccli    153         rpc_set_connect_timeout(clp->cl_rpcclient, lease, lease >> 1);
151 }                                                 154 }
                                                   >> 155 
                                                   >> 156 /*
                                                   >> 157  * Local variables:
                                                   >> 158  *   c-basic-offset: 8
                                                   >> 159  * End:
                                                   >> 160  */
152                                                   161 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php