linux/fs/lockd/grace.c
<<
>>
Prefs
   1/*
   2 * Common code for control of lockd and nfsv4 grace periods.
   3 */
   4
   5#include <linux/module.h>
   6#include <linux/lockd/bind.h>
   7#include <net/net_namespace.h>
   8
   9#include "netns.h"
  10
  11static DEFINE_SPINLOCK(grace_lock);
  12
  13/**
  14 * locks_start_grace
  15 * @lm: who this grace period is for
  16 *
  17 * A grace period is a period during which locks should not be given
  18 * out.  Currently grace periods are only enforced by the two lock
  19 * managers (lockd and nfsd), using the locks_in_grace() function to
  20 * check when they are in a grace period.
  21 *
  22 * This function is called to start a grace period.
  23 */
  24void locks_start_grace(struct net *net, struct lock_manager *lm)
  25{
  26        struct lockd_net *ln = net_generic(net, lockd_net_id);
  27
  28        spin_lock(&grace_lock);
  29        list_add(&lm->list, &ln->grace_list);
  30        spin_unlock(&grace_lock);
  31}
  32EXPORT_SYMBOL_GPL(locks_start_grace);
  33
  34/**
  35 * locks_end_grace
  36 * @lm: who this grace period is for
  37 *
  38 * Call this function to state that the given lock manager is ready to
  39 * resume regular locking.  The grace period will not end until all lock
  40 * managers that called locks_start_grace() also call locks_end_grace().
  41 * Note that callers count on it being safe to call this more than once,
  42 * and the second call should be a no-op.
  43 */
  44void locks_end_grace(struct lock_manager *lm)
  45{
  46        spin_lock(&grace_lock);
  47        list_del_init(&lm->list);
  48        spin_unlock(&grace_lock);
  49}
  50EXPORT_SYMBOL_GPL(locks_end_grace);
  51
  52/**
  53 * locks_in_grace
  54 *
  55 * Lock managers call this function to determine when it is OK for them
  56 * to answer ordinary lock requests, and when they should accept only
  57 * lock reclaims.
  58 */
  59int locks_in_grace(struct net *net)
  60{
  61        struct lockd_net *ln = net_generic(net, lockd_net_id);
  62
  63        return !list_empty(&ln->grace_list);
  64}
  65EXPORT_SYMBOL_GPL(locks_in_grace);
  66