~ [ 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-4.16.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         struct rpc_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         spin_lock(&clp->cl_lock);
 71         lease = clp->cl_lease_time;                72         lease = clp->cl_lease_time;
 72         last = clp->cl_last_renewal;               73         last = clp->cl_last_renewal;
 73         now = jiffies;                             74         now = jiffies;
 74         /* Are we close to a lease timeout? */     75         /* Are we close to a lease timeout? */
 75         if (time_after(now, last + lease/3))       76         if (time_after(now, last + lease/3))
 76                 renew_flags |= NFS4_RENEW_TIME     77                 renew_flags |= NFS4_RENEW_TIMEOUT;
 77         if (nfs_delegations_present(clp))          78         if (nfs_delegations_present(clp))
 78                 renew_flags |= NFS4_RENEW_DELE     79                 renew_flags |= NFS4_RENEW_DELEGATION_CB;
 79                                                    80 
 80         if (renew_flags != 0) {                    81         if (renew_flags != 0) {
 81                 cred = ops->get_state_renewal_ !!  82                 cred = ops->get_state_renewal_cred_locked(clp);
                                                   >>  83                 spin_unlock(&clp->cl_lock);
 82                 if (cred == NULL) {                84                 if (cred == NULL) {
 83                         if (!(renew_flags & NF     85                         if (!(renew_flags & NFS4_RENEW_DELEGATION_CB)) {
 84                                 set_bit(NFS4CL     86                                 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
 85                                 goto out;          87                                 goto out;
 86                         }                          88                         }
 87                         nfs_expire_all_delegat     89                         nfs_expire_all_delegations(clp);
 88                 } else {                           90                 } else {
 89                         int ret;                   91                         int ret;
 90                                                    92 
 91                         /* Queue an asynchrono     93                         /* Queue an asynchronous RENEW. */
 92                         ret = ops->sched_state     94                         ret = ops->sched_state_renewal(clp, cred, renew_flags);
 93                         put_cred(cred);        !!  95                         put_rpccred(cred);
 94                         switch (ret) {             96                         switch (ret) {
 95                         default:                   97                         default:
 96                                 goto out_exp;      98                                 goto out_exp;
 97                         case -EAGAIN:              99                         case -EAGAIN:
 98                         case -ENOMEM:             100                         case -ENOMEM:
 99                                 break;            101                                 break;
100                         }                         102                         }
101                 }                                 103                 }
102         } else {                                  104         } else {
103                 dprintk("%s: failed to call re    105                 dprintk("%s: failed to call renewd. Reason: lease not expired \n",
104                                 __func__);        106                                 __func__);
                                                   >> 107                 spin_unlock(&clp->cl_lock);
105         }                                         108         }
106         nfs4_schedule_state_renewal(clp);         109         nfs4_schedule_state_renewal(clp);
107 out_exp:                                          110 out_exp:
108         nfs_expire_unreferenced_delegations(cl    111         nfs_expire_unreferenced_delegations(clp);
109 out:                                              112 out:
110         dprintk("%s: done\n", __func__);          113         dprintk("%s: done\n", __func__);
111 }                                                 114 }
112                                                   115 
113 void                                              116 void
114 nfs4_schedule_state_renewal(struct nfs_client     117 nfs4_schedule_state_renewal(struct nfs_client *clp)
115 {                                                 118 {
116         long timeout;                             119         long timeout;
117                                                   120 
118         spin_lock(&clp->cl_lock);                 121         spin_lock(&clp->cl_lock);
119         timeout = (2 * clp->cl_lease_time) / 3    122         timeout = (2 * clp->cl_lease_time) / 3 + (long)clp->cl_last_renewal
120                 - (long)jiffies;                  123                 - (long)jiffies;
121         if (timeout < 5 * HZ)                     124         if (timeout < 5 * HZ)
122                 timeout = 5 * HZ;                 125                 timeout = 5 * HZ;
123         dprintk("%s: requeueing work. Lease pe    126         dprintk("%s: requeueing work. Lease period = %ld\n",
124                         __func__, (timeout + H    127                         __func__, (timeout + HZ - 1) / HZ);
125         mod_delayed_work(system_wq, &clp->cl_r    128         mod_delayed_work(system_wq, &clp->cl_renewd, timeout);
126         set_bit(NFS_CS_RENEWD, &clp->cl_res_st    129         set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
127         spin_unlock(&clp->cl_lock);               130         spin_unlock(&clp->cl_lock);
128 }                                                 131 }
129                                                   132 
130 void                                              133 void
131 nfs4_kill_renewd(struct nfs_client *clp)          134 nfs4_kill_renewd(struct nfs_client *clp)
132 {                                                 135 {
133         cancel_delayed_work_sync(&clp->cl_rene    136         cancel_delayed_work_sync(&clp->cl_renewd);
134 }                                                 137 }
135                                                   138 
136 /**                                               139 /**
137  * nfs4_set_lease_period - Sets the lease peri    140  * nfs4_set_lease_period - Sets the lease period on a nfs_client
138  *                                                141  *
139  * @clp: pointer to nfs_client                    142  * @clp: pointer to nfs_client
140  * @lease: new value for lease period             143  * @lease: new value for lease period
                                                   >> 144  * @lastrenewed: time at which lease was last renewed
141  */                                               145  */
142 void nfs4_set_lease_period(struct nfs_client *    146 void nfs4_set_lease_period(struct nfs_client *clp,
143                 unsigned long lease)           !! 147                 unsigned long lease,
                                                   >> 148                 unsigned long lastrenewed)
144 {                                                 149 {
145         spin_lock(&clp->cl_lock);                 150         spin_lock(&clp->cl_lock);
146         clp->cl_lease_time = lease;               151         clp->cl_lease_time = lease;
                                                   >> 152         clp->cl_last_renewal = lastrenewed;
147         spin_unlock(&clp->cl_lock);               153         spin_unlock(&clp->cl_lock);
148                                                   154 
149         /* Cap maximum reconnect timeout at 1/    155         /* Cap maximum reconnect timeout at 1/2 lease period */
150         rpc_set_connect_timeout(clp->cl_rpccli    156         rpc_set_connect_timeout(clp->cl_rpcclient, lease, lease >> 1);
151 }                                                 157 }
                                                   >> 158 
                                                   >> 159 /*
                                                   >> 160  * Local variables:
                                                   >> 161  *   c-basic-offset: 8
                                                   >> 162  * End:
                                                   >> 163  */
152                                                   164 

~ [ 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