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


  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  * TODO: If the send queue gets backlogged (e.g., if the server goes down),
                                                   >>  40  * we will keep filling the queue with periodic RENEW requests.  We need a
                                                   >>  41  * mechanism for ensuring that if renewd successfully sends off a request,
                                                   >>  42  * then it only wakes up when the request is finished.  Maybe use the
                                                   >>  43  * child task framework of the RPC layer?
 39  */                                                44  */
 40                                                    45 
 41 #include <linux/mm.h>                              46 #include <linux/mm.h>
 42 #include <linux/pagemap.h>                         47 #include <linux/pagemap.h>
 43 #include <linux/sunrpc/sched.h>                    48 #include <linux/sunrpc/sched.h>
 44 #include <linux/sunrpc/clnt.h>                     49 #include <linux/sunrpc/clnt.h>
 45                                                    50 
 46 #include <linux/nfs.h>                             51 #include <linux/nfs.h>
 47 #include <linux/nfs4.h>                            52 #include <linux/nfs4.h>
 48 #include <linux/nfs_fs.h>                          53 #include <linux/nfs_fs.h>
 49 #include "nfs4_fs.h"                               54 #include "nfs4_fs.h"
 50 #include "delegation.h"                            55 #include "delegation.h"
 51                                                    56 
 52 #define NFSDBG_FACILITY         NFSDBG_STATE   !!  57 #define NFSDBG_FACILITY NFSDBG_PROC
 53                                                    58 
 54 void                                               59 void
 55 nfs4_renew_state(struct work_struct *work)         60 nfs4_renew_state(struct work_struct *work)
 56 {                                                  61 {
 57         const struct nfs4_state_maintenance_op !!  62         struct nfs4_state_maintenance_ops *ops;
 58         struct nfs_client *clp =                   63         struct nfs_client *clp =
 59                 container_of(work, struct nfs_     64                 container_of(work, struct nfs_client, cl_renewd.work);
 60         const struct cred *cred;               !!  65         struct rpc_cred *cred;
 61         long lease;                            !!  66         long lease, timeout;
 62         unsigned long last, now;                   67         unsigned long last, now;
 63         unsigned renew_flags = 0;              << 
 64                                                    68 
 65         ops = clp->cl_mvops->state_renewal_ops !!  69         ops = nfs4_state_renewal_ops[clp->cl_minorversion];
 66         dprintk("%s: start\n", __func__);          70         dprintk("%s: start\n", __func__);
 67                                                !!  71         /* Are there any active superblocks? */
 68         if (test_bit(NFS_CS_STOP_RENEW, &clp-> !!  72         if (list_empty(&clp->cl_superblocks))
 69                 goto out;                          73                 goto out;
 70                                                !!  74         spin_lock(&clp->cl_lock);
 71         lease = clp->cl_lease_time;                75         lease = clp->cl_lease_time;
 72         last = clp->cl_last_renewal;               76         last = clp->cl_last_renewal;
 73         now = jiffies;                             77         now = jiffies;
                                                   >>  78         timeout = (2 * lease) / 3 + (long)last - (long)now;
 74         /* Are we close to a lease timeout? */     79         /* Are we close to a lease timeout? */
 75         if (time_after(now, last + lease/3))   !!  80         if (time_after(now, last + lease/3)) {
 76                 renew_flags |= NFS4_RENEW_TIME !!  81                 cred = ops->get_state_renewal_cred_locked(clp);
 77         if (nfs_delegations_present(clp))      !!  82                 spin_unlock(&clp->cl_lock);
 78                 renew_flags |= NFS4_RENEW_DELE << 
 79                                                << 
 80         if (renew_flags != 0) {                << 
 81                 cred = ops->get_state_renewal_ << 
 82                 if (cred == NULL) {                83                 if (cred == NULL) {
 83                         if (!(renew_flags & NF !!  84                         if (list_empty(&clp->cl_delegations)) {
 84                                 set_bit(NFS4CL     85                                 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
 85                                 goto out;          86                                 goto out;
 86                         }                          87                         }
 87                         nfs_expire_all_delegat     88                         nfs_expire_all_delegations(clp);
 88                 } else {                           89                 } else {
 89                         int ret;               << 
 90                                                << 
 91                         /* Queue an asynchrono     90                         /* Queue an asynchronous RENEW. */
 92                         ret = ops->sched_state !!  91                         ops->sched_state_renewal(clp, cred);
 93                         put_cred(cred);        !!  92                         put_rpccred(cred);
 94                         switch (ret) {         << 
 95                         default:               << 
 96                                 goto out_exp;  << 
 97                         case -EAGAIN:          << 
 98                         case -ENOMEM:          << 
 99                                 break;         << 
100                         }                      << 
101                 }                                  93                 }
102         } else {                               !!  94                 timeout = (2 * lease) / 3;
                                                   >>  95                 spin_lock(&clp->cl_lock);
                                                   >>  96         } else
103                 dprintk("%s: failed to call re     97                 dprintk("%s: failed to call renewd. Reason: lease not expired \n",
104                                 __func__);         98                                 __func__);
105         }                                      !!  99         if (timeout < 5 * HZ)    /* safeguard */
106         nfs4_schedule_state_renewal(clp);      !! 100                 timeout = 5 * HZ;
107 out_exp:                                       !! 101         dprintk("%s: requeueing work. Lease period = %ld\n",
                                                   >> 102                         __func__, (timeout + HZ - 1) / HZ);
                                                   >> 103         cancel_delayed_work(&clp->cl_renewd);
                                                   >> 104         schedule_delayed_work(&clp->cl_renewd, timeout);
                                                   >> 105         spin_unlock(&clp->cl_lock);
108         nfs_expire_unreferenced_delegations(cl    106         nfs_expire_unreferenced_delegations(clp);
109 out:                                              107 out:
110         dprintk("%s: done\n", __func__);          108         dprintk("%s: done\n", __func__);
111 }                                                 109 }
112                                                   110 
113 void                                              111 void
114 nfs4_schedule_state_renewal(struct nfs_client     112 nfs4_schedule_state_renewal(struct nfs_client *clp)
115 {                                                 113 {
116         long timeout;                             114         long timeout;
117                                                   115 
118         spin_lock(&clp->cl_lock);                 116         spin_lock(&clp->cl_lock);
119         timeout = (2 * clp->cl_lease_time) / 3    117         timeout = (2 * clp->cl_lease_time) / 3 + (long)clp->cl_last_renewal
120                 - (long)jiffies;                  118                 - (long)jiffies;
121         if (timeout < 5 * HZ)                     119         if (timeout < 5 * HZ)
122                 timeout = 5 * HZ;                 120                 timeout = 5 * HZ;
123         dprintk("%s: requeueing work. Lease pe    121         dprintk("%s: requeueing work. Lease period = %ld\n",
124                         __func__, (timeout + H    122                         __func__, (timeout + HZ - 1) / HZ);
125         mod_delayed_work(system_wq, &clp->cl_r !! 123         cancel_delayed_work(&clp->cl_renewd);
                                                   >> 124         schedule_delayed_work(&clp->cl_renewd, timeout);
126         set_bit(NFS_CS_RENEWD, &clp->cl_res_st    125         set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
127         spin_unlock(&clp->cl_lock);               126         spin_unlock(&clp->cl_lock);
128 }                                                 127 }
129                                                   128 
130 void                                              129 void
131 nfs4_kill_renewd(struct nfs_client *clp)          130 nfs4_kill_renewd(struct nfs_client *clp)
132 {                                                 131 {
133         cancel_delayed_work_sync(&clp->cl_rene    132         cancel_delayed_work_sync(&clp->cl_renewd);
134 }                                                 133 }
135                                                   134 
136 /**                                            !! 135 /*
137  * nfs4_set_lease_period - Sets the lease peri !! 136  * Local variables:
138  *                                             !! 137  *   c-basic-offset: 8
139  * @clp: pointer to nfs_client                 !! 138  * End:
140  * @lease: new value for lease period          << 
141  */                                               139  */
142 void nfs4_set_lease_period(struct nfs_client * << 
143                 unsigned long lease)           << 
144 {                                              << 
145         spin_lock(&clp->cl_lock);              << 
146         clp->cl_lease_time = lease;            << 
147         spin_unlock(&clp->cl_lock);            << 
148                                                << 
149         /* Cap maximum reconnect timeout at 1/ << 
150         rpc_set_connect_timeout(clp->cl_rpccli << 
151 }                                              << 
152                                                   140 

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