LCOV - code coverage report
Current view: top level - fs - locks.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 499 1188 42.0 %
Date: 2021-04-22 12:43:58 Functions: 46 85 54.1 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  *  linux/fs/locks.c
       4             :  *
       5             :  *  Provide support for fcntl()'s F_GETLK, F_SETLK, and F_SETLKW calls.
       6             :  *  Doug Evans (dje@spiff.uucp), August 07, 1992
       7             :  *
       8             :  *  Deadlock detection added.
       9             :  *  FIXME: one thing isn't handled yet:
      10             :  *      - mandatory locks (requires lots of changes elsewhere)
      11             :  *  Kelly Carmichael (kelly@[142.24.8.65]), September 17, 1994.
      12             :  *
      13             :  *  Miscellaneous edits, and a total rewrite of posix_lock_file() code.
      14             :  *  Kai Petzke (wpp@marie.physik.tu-berlin.de), 1994
      15             :  *
      16             :  *  Converted file_lock_table to a linked list from an array, which eliminates
      17             :  *  the limits on how many active file locks are open.
      18             :  *  Chad Page (pageone@netcom.com), November 27, 1994
      19             :  *
      20             :  *  Removed dependency on file descriptors. dup()'ed file descriptors now
      21             :  *  get the same locks as the original file descriptors, and a close() on
      22             :  *  any file descriptor removes ALL the locks on the file for the current
      23             :  *  process. Since locks still depend on the process id, locks are inherited
      24             :  *  after an exec() but not after a fork(). This agrees with POSIX, and both
      25             :  *  BSD and SVR4 practice.
      26             :  *  Andy Walker (andy@lysaker.kvaerner.no), February 14, 1995
      27             :  *
      28             :  *  Scrapped free list which is redundant now that we allocate locks
      29             :  *  dynamically with kmalloc()/kfree().
      30             :  *  Andy Walker (andy@lysaker.kvaerner.no), February 21, 1995
      31             :  *
      32             :  *  Implemented two lock personalities - FL_FLOCK and FL_POSIX.
      33             :  *
      34             :  *  FL_POSIX locks are created with calls to fcntl() and lockf() through the
      35             :  *  fcntl() system call. They have the semantics described above.
      36             :  *
      37             :  *  FL_FLOCK locks are created with calls to flock(), through the flock()
      38             :  *  system call, which is new. Old C libraries implement flock() via fcntl()
      39             :  *  and will continue to use the old, broken implementation.
      40             :  *
      41             :  *  FL_FLOCK locks follow the 4.4 BSD flock() semantics. They are associated
      42             :  *  with a file pointer (filp). As a result they can be shared by a parent
      43             :  *  process and its children after a fork(). They are removed when the last
      44             :  *  file descriptor referring to the file pointer is closed (unless explicitly
      45             :  *  unlocked).
      46             :  *
      47             :  *  FL_FLOCK locks never deadlock, an existing lock is always removed before
      48             :  *  upgrading from shared to exclusive (or vice versa). When this happens
      49             :  *  any processes blocked by the current lock are woken up and allowed to
      50             :  *  run before the new lock is applied.
      51             :  *  Andy Walker (andy@lysaker.kvaerner.no), June 09, 1995
      52             :  *
      53             :  *  Removed some race conditions in flock_lock_file(), marked other possible
      54             :  *  races. Just grep for FIXME to see them.
      55             :  *  Dmitry Gorodchanin (pgmdsg@ibi.com), February 09, 1996.
      56             :  *
      57             :  *  Addressed Dmitry's concerns. Deadlock checking no longer recursive.
      58             :  *  Lock allocation changed to GFP_ATOMIC as we can't afford to sleep
      59             :  *  once we've checked for blocking and deadlocking.
      60             :  *  Andy Walker (andy@lysaker.kvaerner.no), April 03, 1996.
      61             :  *
      62             :  *  Initial implementation of mandatory locks. SunOS turned out to be
      63             :  *  a rotten model, so I implemented the "obvious" semantics.
      64             :  *  See 'Documentation/filesystems/mandatory-locking.rst' for details.
      65             :  *  Andy Walker (andy@lysaker.kvaerner.no), April 06, 1996.
      66             :  *
      67             :  *  Don't allow mandatory locks on mmap()'ed files. Added simple functions to
      68             :  *  check if a file has mandatory locks, used by mmap(), open() and creat() to
      69             :  *  see if system call should be rejected. Ref. HP-UX/SunOS/Solaris Reference
      70             :  *  Manual, Section 2.
      71             :  *  Andy Walker (andy@lysaker.kvaerner.no), April 09, 1996.
      72             :  *
      73             :  *  Tidied up block list handling. Added '/proc/locks' interface.
      74             :  *  Andy Walker (andy@lysaker.kvaerner.no), April 24, 1996.
      75             :  *
      76             :  *  Fixed deadlock condition for pathological code that mixes calls to
      77             :  *  flock() and fcntl().
      78             :  *  Andy Walker (andy@lysaker.kvaerner.no), April 29, 1996.
      79             :  *
      80             :  *  Allow only one type of locking scheme (FL_POSIX or FL_FLOCK) to be in use
      81             :  *  for a given file at a time. Changed the CONFIG_LOCK_MANDATORY scheme to
      82             :  *  guarantee sensible behaviour in the case where file system modules might
      83             :  *  be compiled with different options than the kernel itself.
      84             :  *  Andy Walker (andy@lysaker.kvaerner.no), May 15, 1996.
      85             :  *
      86             :  *  Added a couple of missing wake_up() calls. Thanks to Thomas Meckel
      87             :  *  (Thomas.Meckel@mni.fh-giessen.de) for spotting this.
      88             :  *  Andy Walker (andy@lysaker.kvaerner.no), May 15, 1996.
      89             :  *
      90             :  *  Changed FL_POSIX locks to use the block list in the same way as FL_FLOCK
      91             :  *  locks. Changed process synchronisation to avoid dereferencing locks that
      92             :  *  have already been freed.
      93             :  *  Andy Walker (andy@lysaker.kvaerner.no), Sep 21, 1996.
      94             :  *
      95             :  *  Made the block list a circular list to minimise searching in the list.
      96             :  *  Andy Walker (andy@lysaker.kvaerner.no), Sep 25, 1996.
      97             :  *
      98             :  *  Made mandatory locking a mount option. Default is not to allow mandatory
      99             :  *  locking.
     100             :  *  Andy Walker (andy@lysaker.kvaerner.no), Oct 04, 1996.
     101             :  *
     102             :  *  Some adaptations for NFS support.
     103             :  *  Olaf Kirch (okir@monad.swb.de), Dec 1996,
     104             :  *
     105             :  *  Fixed /proc/locks interface so that we can't overrun the buffer we are handed.
     106             :  *  Andy Walker (andy@lysaker.kvaerner.no), May 12, 1997.
     107             :  *
     108             :  *  Use slab allocator instead of kmalloc/kfree.
     109             :  *  Use generic list implementation from <linux/list.h>.
     110             :  *  Sped up posix_locks_deadlock by only considering blocked locks.
     111             :  *  Matthew Wilcox <willy@debian.org>, March, 2000.
     112             :  *
     113             :  *  Leases and LOCK_MAND
     114             :  *  Matthew Wilcox <willy@debian.org>, June, 2000.
     115             :  *  Stephen Rothwell <sfr@canb.auug.org.au>, June, 2000.
     116             :  *
     117             :  * Locking conflicts and dependencies:
     118             :  * If multiple threads attempt to lock the same byte (or flock the same file)
     119             :  * only one can be granted the lock, and other must wait their turn.
     120             :  * The first lock has been "applied" or "granted", the others are "waiting"
     121             :  * and are "blocked" by the "applied" lock..
     122             :  *
     123             :  * Waiting and applied locks are all kept in trees whose properties are:
     124             :  *
     125             :  *      - the root of a tree may be an applied or waiting lock.
     126             :  *      - every other node in the tree is a waiting lock that
     127             :  *        conflicts with every ancestor of that node.
     128             :  *
     129             :  * Every such tree begins life as a waiting singleton which obviously
     130             :  * satisfies the above properties.
     131             :  *
     132             :  * The only ways we modify trees preserve these properties:
     133             :  *
     134             :  *      1. We may add a new leaf node, but only after first verifying that it
     135             :  *         conflicts with all of its ancestors.
     136             :  *      2. We may remove the root of a tree, creating a new singleton
     137             :  *         tree from the root and N new trees rooted in the immediate
     138             :  *         children.
     139             :  *      3. If the root of a tree is not currently an applied lock, we may
     140             :  *         apply it (if possible).
     141             :  *      4. We may upgrade the root of the tree (either extend its range,
     142             :  *         or upgrade its entire range from read to write).
     143             :  *
     144             :  * When an applied lock is modified in a way that reduces or downgrades any
     145             :  * part of its range, we remove all its children (2 above).  This particularly
     146             :  * happens when a lock is unlocked.
     147             :  *
     148             :  * For each of those child trees we "wake up" the thread which is
     149             :  * waiting for the lock so it can continue handling as follows: if the
     150             :  * root of the tree applies, we do so (3).  If it doesn't, it must
     151             :  * conflict with some applied lock.  We remove (wake up) all of its children
     152             :  * (2), and add it is a new leaf to the tree rooted in the applied
     153             :  * lock (1).  We then repeat the process recursively with those
     154             :  * children.
     155             :  *
     156             :  */
     157             : 
     158             : #include <linux/capability.h>
     159             : #include <linux/file.h>
     160             : #include <linux/fdtable.h>
     161             : #include <linux/fs.h>
     162             : #include <linux/init.h>
     163             : #include <linux/security.h>
     164             : #include <linux/slab.h>
     165             : #include <linux/syscalls.h>
     166             : #include <linux/time.h>
     167             : #include <linux/rcupdate.h>
     168             : #include <linux/pid_namespace.h>
     169             : #include <linux/hashtable.h>
     170             : #include <linux/percpu.h>
     171             : 
     172             : #define CREATE_TRACE_POINTS
     173             : #include <trace/events/filelock.h>
     174             : 
     175             : #include <linux/uaccess.h>
     176             : 
     177             : #define IS_POSIX(fl)    (fl->fl_flags & FL_POSIX)
     178             : #define IS_FLOCK(fl)    (fl->fl_flags & FL_FLOCK)
     179             : #define IS_LEASE(fl)    (fl->fl_flags & (FL_LEASE|FL_DELEG|FL_LAYOUT))
     180             : #define IS_OFDLCK(fl)   (fl->fl_flags & FL_OFDLCK)
     181             : #define IS_REMOTELCK(fl)        (fl->fl_pid <= 0)
     182             : 
     183           0 : static bool lease_breaking(struct file_lock *fl)
     184             : {
     185           0 :         return fl->fl_flags & (FL_UNLOCK_PENDING | FL_DOWNGRADE_PENDING);
     186             : }
     187             : 
     188           0 : static int target_leasetype(struct file_lock *fl)
     189             : {
     190           0 :         if (fl->fl_flags & FL_UNLOCK_PENDING)
     191             :                 return F_UNLCK;
     192           0 :         if (fl->fl_flags & FL_DOWNGRADE_PENDING)
     193             :                 return F_RDLCK;
     194           0 :         return fl->fl_type;
     195             : }
     196             : 
     197             : int leases_enable = 1;
     198             : int lease_break_time = 45;
     199             : 
     200             : /*
     201             :  * The global file_lock_list is only used for displaying /proc/locks, so we
     202             :  * keep a list on each CPU, with each list protected by its own spinlock.
     203             :  * Global serialization is done using file_rwsem.
     204             :  *
     205             :  * Note that alterations to the list also require that the relevant flc_lock is
     206             :  * held.
     207             :  */
     208             : struct file_lock_list_struct {
     209             :         spinlock_t              lock;
     210             :         struct hlist_head       hlist;
     211             : };
     212             : static DEFINE_PER_CPU(struct file_lock_list_struct, file_lock_list);
     213             : DEFINE_STATIC_PERCPU_RWSEM(file_rwsem);
     214             : 
     215             : 
     216             : /*
     217             :  * The blocked_hash is used to find POSIX lock loops for deadlock detection.
     218             :  * It is protected by blocked_lock_lock.
     219             :  *
     220             :  * We hash locks by lockowner in order to optimize searching for the lock a
     221             :  * particular lockowner is waiting on.
     222             :  *
     223             :  * FIXME: make this value scale via some heuristic? We generally will want more
     224             :  * buckets when we have more lockowners holding locks, but that's a little
     225             :  * difficult to determine without knowing what the workload will look like.
     226             :  */
     227             : #define BLOCKED_HASH_BITS       7
     228             : static DEFINE_HASHTABLE(blocked_hash, BLOCKED_HASH_BITS);
     229             : 
     230             : /*
     231             :  * This lock protects the blocked_hash. Generally, if you're accessing it, you
     232             :  * want to be holding this lock.
     233             :  *
     234             :  * In addition, it also protects the fl->fl_blocked_requests list, and the
     235             :  * fl->fl_blocker pointer for file_lock structures that are acting as lock
     236             :  * requests (in contrast to those that are acting as records of acquired locks).
     237             :  *
     238             :  * Note that when we acquire this lock in order to change the above fields,
     239             :  * we often hold the flc_lock as well. In certain cases, when reading the fields
     240             :  * protected by this lock, we can skip acquiring it iff we already hold the
     241             :  * flc_lock.
     242             :  */
     243             : static DEFINE_SPINLOCK(blocked_lock_lock);
     244             : 
     245             : static struct kmem_cache *flctx_cache __read_mostly;
     246             : static struct kmem_cache *filelock_cache __read_mostly;
     247             : 
     248             : static struct file_lock_context *
     249         361 : locks_get_lock_context(struct inode *inode, int type)
     250             : {
     251         361 :         struct file_lock_context *ctx;
     252             : 
     253             :         /* paired with cmpxchg() below */
     254         361 :         ctx = smp_load_acquire(&inode->i_flctx);
     255         361 :         if (likely(ctx) || type == F_UNLCK)
     256         242 :                 goto out;
     257             : 
     258         119 :         ctx = kmem_cache_alloc(flctx_cache, GFP_KERNEL);
     259         119 :         if (!ctx)
     260           0 :                 goto out;
     261             : 
     262         119 :         spin_lock_init(&ctx->flc_lock);
     263         119 :         INIT_LIST_HEAD(&ctx->flc_flock);
     264         119 :         INIT_LIST_HEAD(&ctx->flc_posix);
     265         119 :         INIT_LIST_HEAD(&ctx->flc_lease);
     266             : 
     267             :         /*
     268             :          * Assign the pointer if it's not already assigned. If it is, then
     269             :          * free the context we just allocated.
     270             :          */
     271         119 :         if (cmpxchg(&inode->i_flctx, NULL, ctx)) {
     272           0 :                 kmem_cache_free(flctx_cache, ctx);
     273           0 :                 ctx = smp_load_acquire(&inode->i_flctx);
     274             :         }
     275         119 : out:
     276         361 :         trace_locks_get_lock_context(inode, type, ctx);
     277         361 :         return ctx;
     278             : }
     279             : 
     280             : static void
     281           0 : locks_dump_ctx_list(struct list_head *list, char *list_type)
     282             : {
     283           0 :         struct file_lock *fl;
     284             : 
     285           0 :         list_for_each_entry(fl, list, fl_list) {
     286           0 :                 pr_warn("%s: fl_owner=%p fl_flags=0x%x fl_type=0x%x fl_pid=%u\n", list_type, fl->fl_owner, fl->fl_flags, fl->fl_type, fl->fl_pid);
     287             :         }
     288           0 : }
     289             : 
     290             : static void
     291          58 : locks_check_ctx_lists(struct inode *inode)
     292             : {
     293          58 :         struct file_lock_context *ctx = inode->i_flctx;
     294             : 
     295          58 :         if (unlikely(!list_empty(&ctx->flc_flock) ||
     296             :                      !list_empty(&ctx->flc_posix) ||
     297             :                      !list_empty(&ctx->flc_lease))) {
     298           0 :                 pr_warn("Leaked locks on dev=0x%x:0x%x ino=0x%lx:\n",
     299             :                         MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev),
     300             :                         inode->i_ino);
     301           0 :                 locks_dump_ctx_list(&ctx->flc_flock, "FLOCK");
     302           0 :                 locks_dump_ctx_list(&ctx->flc_posix, "POSIX");
     303           0 :                 locks_dump_ctx_list(&ctx->flc_lease, "LEASE");
     304             :         }
     305          58 : }
     306             : 
     307             : static void
     308         534 : locks_check_ctx_file_list(struct file *filp, struct list_head *list,
     309             :                                 char *list_type)
     310             : {
     311         534 :         struct file_lock *fl;
     312         534 :         struct inode *inode = locks_inode(filp);
     313             : 
     314         571 :         list_for_each_entry(fl, list, fl_list)
     315          37 :                 if (fl->fl_file == filp)
     316           0 :                         pr_warn("Leaked %s lock on dev=0x%x:0x%x ino=0x%lx "
     317             :                                 " fl_owner=%p fl_flags=0x%x fl_type=0x%x fl_pid=%u\n",
     318             :                                 list_type, MAJOR(inode->i_sb->s_dev),
     319             :                                 MINOR(inode->i_sb->s_dev), inode->i_ino,
     320             :                                 fl->fl_owner, fl->fl_flags, fl->fl_type, fl->fl_pid);
     321         534 : }
     322             : 
     323             : void
     324        5292 : locks_free_lock_context(struct inode *inode)
     325             : {
     326        5292 :         struct file_lock_context *ctx = inode->i_flctx;
     327             : 
     328        5292 :         if (unlikely(ctx)) {
     329          58 :                 locks_check_ctx_lists(inode);
     330          58 :                 kmem_cache_free(flctx_cache, ctx);
     331             :         }
     332        5292 : }
     333             : 
     334         577 : static void locks_init_lock_heads(struct file_lock *fl)
     335             : {
     336         577 :         INIT_HLIST_NODE(&fl->fl_link);
     337         577 :         INIT_LIST_HEAD(&fl->fl_list);
     338         577 :         INIT_LIST_HEAD(&fl->fl_blocked_requests);
     339         577 :         INIT_LIST_HEAD(&fl->fl_blocked_member);
     340         577 :         init_waitqueue_head(&fl->fl_wait);
     341         577 : }
     342             : 
     343             : /* Allocate an empty lock structure. */
     344         458 : struct file_lock *locks_alloc_lock(void)
     345             : {
     346         458 :         struct file_lock *fl = kmem_cache_zalloc(filelock_cache, GFP_KERNEL);
     347             : 
     348         458 :         if (fl)
     349         458 :                 locks_init_lock_heads(fl);
     350             : 
     351         458 :         return fl;
     352             : }
     353             : EXPORT_SYMBOL_GPL(locks_alloc_lock);
     354             : 
     355         453 : void locks_release_private(struct file_lock *fl)
     356             : {
     357         453 :         BUG_ON(waitqueue_active(&fl->fl_wait));
     358         453 :         BUG_ON(!list_empty(&fl->fl_list));
     359         453 :         BUG_ON(!list_empty(&fl->fl_blocked_requests));
     360         453 :         BUG_ON(!list_empty(&fl->fl_blocked_member));
     361         453 :         BUG_ON(!hlist_unhashed(&fl->fl_link));
     362             : 
     363         453 :         if (fl->fl_ops) {
     364           0 :                 if (fl->fl_ops->fl_release_private)
     365           0 :                         fl->fl_ops->fl_release_private(fl);
     366           0 :                 fl->fl_ops = NULL;
     367             :         }
     368             : 
     369         453 :         if (fl->fl_lmops) {
     370           0 :                 if (fl->fl_lmops->lm_put_owner) {
     371           0 :                         fl->fl_lmops->lm_put_owner(fl->fl_owner);
     372           0 :                         fl->fl_owner = NULL;
     373             :                 }
     374           0 :                 fl->fl_lmops = NULL;
     375             :         }
     376         453 : }
     377             : EXPORT_SYMBOL_GPL(locks_release_private);
     378             : 
     379             : /* Free a lock which is not in use. */
     380         453 : void locks_free_lock(struct file_lock *fl)
     381             : {
     382         453 :         locks_release_private(fl);
     383         453 :         kmem_cache_free(filelock_cache, fl);
     384         453 : }
     385             : EXPORT_SYMBOL(locks_free_lock);
     386             : 
     387             : static void
     388         361 : locks_dispose_list(struct list_head *dispose)
     389             : {
     390         361 :         struct file_lock *fl;
     391             : 
     392         511 :         while (!list_empty(dispose)) {
     393         150 :                 fl = list_first_entry(dispose, struct file_lock, fl_list);
     394         150 :                 list_del_init(&fl->fl_list);
     395         150 :                 locks_free_lock(fl);
     396             :         }
     397         361 : }
     398             : 
     399         119 : void locks_init_lock(struct file_lock *fl)
     400             : {
     401         119 :         memset(fl, 0, sizeof(struct file_lock));
     402         119 :         locks_init_lock_heads(fl);
     403         119 : }
     404             : EXPORT_SYMBOL(locks_init_lock);
     405             : 
     406             : /*
     407             :  * Initialize a new lock from an existing file_lock structure.
     408             :  */
     409         155 : void locks_copy_conflock(struct file_lock *new, struct file_lock *fl)
     410             : {
     411         155 :         new->fl_owner = fl->fl_owner;
     412         155 :         new->fl_pid = fl->fl_pid;
     413         155 :         new->fl_file = NULL;
     414         155 :         new->fl_flags = fl->fl_flags;
     415         155 :         new->fl_type = fl->fl_type;
     416         155 :         new->fl_start = fl->fl_start;
     417         155 :         new->fl_end = fl->fl_end;
     418         155 :         new->fl_lmops = fl->fl_lmops;
     419         155 :         new->fl_ops = NULL;
     420             : 
     421         155 :         if (fl->fl_lmops) {
     422           0 :                 if (fl->fl_lmops->lm_get_owner)
     423           0 :                         fl->fl_lmops->lm_get_owner(fl->fl_owner);
     424             :         }
     425         155 : }
     426             : EXPORT_SYMBOL(locks_copy_conflock);
     427             : 
     428         155 : void locks_copy_lock(struct file_lock *new, struct file_lock *fl)
     429             : {
     430             :         /* "new" must be a freshly-initialized lock */
     431         155 :         WARN_ON_ONCE(new->fl_ops);
     432             : 
     433         155 :         locks_copy_conflock(new, fl);
     434             : 
     435         155 :         new->fl_file = fl->fl_file;
     436         155 :         new->fl_ops = fl->fl_ops;
     437             : 
     438         155 :         if (fl->fl_ops) {
     439           0 :                 if (fl->fl_ops->fl_copy_lock)
     440           0 :                         fl->fl_ops->fl_copy_lock(new, fl);
     441             :         }
     442         155 : }
     443             : EXPORT_SYMBOL(locks_copy_lock);
     444             : 
     445         155 : static void locks_move_blocks(struct file_lock *new, struct file_lock *fl)
     446             : {
     447         155 :         struct file_lock *f;
     448             : 
     449             :         /*
     450             :          * As ctx->flc_lock is held, new requests cannot be added to
     451             :          * ->fl_blocked_requests, so we don't need a lock to check if it
     452             :          * is empty.
     453             :          */
     454         155 :         if (list_empty(&fl->fl_blocked_requests))
     455             :                 return;
     456           0 :         spin_lock(&blocked_lock_lock);
     457           0 :         list_splice_init(&fl->fl_blocked_requests, &new->fl_blocked_requests);
     458           0 :         list_for_each_entry(f, &new->fl_blocked_requests, fl_blocked_member)
     459           0 :                 f->fl_blocker = new;
     460           0 :         spin_unlock(&blocked_lock_lock);
     461             : }
     462             : 
     463         227 : static inline int flock_translate_cmd(int cmd) {
     464         227 :         if (cmd & LOCK_MAND)
     465           0 :                 return cmd & (LOCK_MAND | LOCK_RW);
     466         227 :         switch (cmd) {
     467             :         case LOCK_SH:
     468             :                 return F_RDLCK;
     469             :         case LOCK_EX:
     470             :                 return F_WRLCK;
     471             :         case LOCK_UN:
     472             :                 return F_UNLCK;
     473             :         }
     474             :         return -EINVAL;
     475             : }
     476             : 
     477             : /* Fill in a file_lock structure with an appropriate FLOCK lock. */
     478             : static struct file_lock *
     479         227 : flock_make_lock(struct file *filp, unsigned int cmd, struct file_lock *fl)
     480             : {
     481         227 :         int type = flock_translate_cmd(cmd);
     482             : 
     483         227 :         if (type < 0)
     484           0 :                 return ERR_PTR(type);
     485             : 
     486         227 :         if (fl == NULL) {
     487         150 :                 fl = locks_alloc_lock();
     488         150 :                 if (fl == NULL)
     489         227 :                         return ERR_PTR(-ENOMEM);
     490             :         } else {
     491          77 :                 locks_init_lock(fl);
     492             :         }
     493             : 
     494         227 :         fl->fl_file = filp;
     495         227 :         fl->fl_owner = filp;
     496         227 :         fl->fl_pid = current->tgid;
     497         227 :         fl->fl_flags = FL_FLOCK;
     498         227 :         fl->fl_type = type;
     499         227 :         fl->fl_end = OFFSET_MAX;
     500             : 
     501         227 :         return fl;
     502             : }
     503             : 
     504          90 : static int assign_type(struct file_lock *fl, long type)
     505             : {
     506          90 :         switch (type) {
     507          90 :         case F_RDLCK:
     508             :         case F_WRLCK:
     509             :         case F_UNLCK:
     510          90 :                 fl->fl_type = type;
     511          90 :                 break;
     512             :         default:
     513             :                 return -EINVAL;
     514             :         }
     515          90 :         return 0;
     516             : }
     517             : 
     518          90 : static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
     519             :                                  struct flock64 *l)
     520             : {
     521          90 :         switch (l->l_whence) {
     522          90 :         case SEEK_SET:
     523          90 :                 fl->fl_start = 0;
     524          90 :                 break;
     525           0 :         case SEEK_CUR:
     526           0 :                 fl->fl_start = filp->f_pos;
     527           0 :                 break;
     528             :         case SEEK_END:
     529           0 :                 fl->fl_start = i_size_read(file_inode(filp));
     530           0 :                 break;
     531             :         default:
     532             :                 return -EINVAL;
     533             :         }
     534          90 :         if (l->l_start > OFFSET_MAX - fl->fl_start)
     535             :                 return -EOVERFLOW;
     536          90 :         fl->fl_start += l->l_start;
     537          90 :         if (fl->fl_start < 0)
     538             :                 return -EINVAL;
     539             : 
     540             :         /* POSIX-1996 leaves the case l->l_len < 0 undefined;
     541             :            POSIX-2001 defines it. */
     542          90 :         if (l->l_len > 0) {
     543           0 :                 if (l->l_len - 1 > OFFSET_MAX - fl->fl_start)
     544             :                         return -EOVERFLOW;
     545           0 :                 fl->fl_end = fl->fl_start + (l->l_len - 1);
     546             : 
     547          90 :         } else if (l->l_len < 0) {
     548           0 :                 if (fl->fl_start + l->l_len < 0)
     549             :                         return -EINVAL;
     550           0 :                 fl->fl_end = fl->fl_start - 1;
     551           0 :                 fl->fl_start += l->l_len;
     552             :         } else
     553          90 :                 fl->fl_end = OFFSET_MAX;
     554             : 
     555          90 :         fl->fl_owner = current->files;
     556          90 :         fl->fl_pid = current->tgid;
     557          90 :         fl->fl_file = filp;
     558          90 :         fl->fl_flags = FL_POSIX;
     559          90 :         fl->fl_ops = NULL;
     560          90 :         fl->fl_lmops = NULL;
     561             : 
     562          90 :         return assign_type(fl, l->l_type);
     563             : }
     564             : 
     565             : /* Verify a "struct flock" and copy it to a "struct file_lock" as a POSIX
     566             :  * style lock.
     567             :  */
     568          90 : static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,
     569             :                                struct flock *l)
     570             : {
     571          90 :         struct flock64 ll = {
     572          90 :                 .l_type = l->l_type,
     573          90 :                 .l_whence = l->l_whence,
     574          90 :                 .l_start = l->l_start,
     575          90 :                 .l_len = l->l_len,
     576             :         };
     577             : 
     578          90 :         return flock64_to_posix_lock(filp, fl, &ll);
     579             : }
     580             : 
     581             : /* default lease lock manager operations */
     582             : static bool
     583           0 : lease_break_callback(struct file_lock *fl)
     584             : {
     585           0 :         kill_fasync(&fl->fl_fasync, SIGIO, POLL_MSG);
     586           0 :         return false;
     587             : }
     588             : 
     589             : static void
     590           0 : lease_setup(struct file_lock *fl, void **priv)
     591             : {
     592           0 :         struct file *filp = fl->fl_file;
     593           0 :         struct fasync_struct *fa = *priv;
     594             : 
     595             :         /*
     596             :          * fasync_insert_entry() returns the old entry if any. If there was no
     597             :          * old entry, then it used "priv" and inserted it into the fasync list.
     598             :          * Clear the pointer to indicate that it shouldn't be freed.
     599             :          */
     600           0 :         if (!fasync_insert_entry(fa->fa_fd, filp, &fl->fl_fasync, fa))
     601           0 :                 *priv = NULL;
     602             : 
     603           0 :         __f_setown(filp, task_pid(current), PIDTYPE_TGID, 0);
     604           0 : }
     605             : 
     606             : static const struct lock_manager_operations lease_manager_ops = {
     607             :         .lm_break = lease_break_callback,
     608             :         .lm_change = lease_modify,
     609             :         .lm_setup = lease_setup,
     610             : };
     611             : 
     612             : /*
     613             :  * Initialize a lease, use the default lock manager operations
     614             :  */
     615           0 : static int lease_init(struct file *filp, long type, struct file_lock *fl)
     616             : {
     617           0 :         if (assign_type(fl, type) != 0)
     618             :                 return -EINVAL;
     619             : 
     620           0 :         fl->fl_owner = filp;
     621           0 :         fl->fl_pid = current->tgid;
     622             : 
     623           0 :         fl->fl_file = filp;
     624           0 :         fl->fl_flags = FL_LEASE;
     625           0 :         fl->fl_start = 0;
     626           0 :         fl->fl_end = OFFSET_MAX;
     627           0 :         fl->fl_ops = NULL;
     628           0 :         fl->fl_lmops = &lease_manager_ops;
     629           0 :         return 0;
     630             : }
     631             : 
     632             : /* Allocate a file_lock initialised to this type of lease */
     633           0 : static struct file_lock *lease_alloc(struct file *filp, long type)
     634             : {
     635           0 :         struct file_lock *fl = locks_alloc_lock();
     636           0 :         int error = -ENOMEM;
     637             : 
     638           0 :         if (fl == NULL)
     639           0 :                 return ERR_PTR(error);
     640             : 
     641           0 :         error = lease_init(filp, type, fl);
     642           0 :         if (error) {
     643           0 :                 locks_free_lock(fl);
     644           0 :                 return ERR_PTR(error);
     645             :         }
     646             :         return fl;
     647             : }
     648             : 
     649             : /* Check if two locks overlap each other.
     650             :  */
     651           2 : static inline int locks_overlap(struct file_lock *fl1, struct file_lock *fl2)
     652             : {
     653           4 :         return ((fl1->fl_end >= fl2->fl_start) &&
     654           2 :                 (fl2->fl_end >= fl1->fl_start));
     655             : }
     656             : 
     657             : /*
     658             :  * Check whether two locks have the same owner.
     659             :  */
     660         131 : static int posix_same_owner(struct file_lock *fl1, struct file_lock *fl2)
     661             : {
     662         131 :         return fl1->fl_owner == fl2->fl_owner;
     663             : }
     664             : 
     665             : /* Must be called with the flc_lock held! */
     666         155 : static void locks_insert_global_locks(struct file_lock *fl)
     667             : {
     668         155 :         struct file_lock_list_struct *fll = this_cpu_ptr(&file_lock_list);
     669             : 
     670         465 :         percpu_rwsem_assert_held(&file_rwsem);
     671             : 
     672         155 :         spin_lock(&fll->lock);
     673         155 :         fl->fl_link_cpu = smp_processor_id();
     674         155 :         hlist_add_head(&fl->fl_link, &fll->hlist);
     675         155 :         spin_unlock(&fll->lock);
     676         155 : }
     677             : 
     678             : /* Must be called with the flc_lock held! */
     679         150 : static void locks_delete_global_locks(struct file_lock *fl)
     680             : {
     681         150 :         struct file_lock_list_struct *fll;
     682             : 
     683         450 :         percpu_rwsem_assert_held(&file_rwsem);
     684             : 
     685             :         /*
     686             :          * Avoid taking lock if already unhashed. This is safe since this check
     687             :          * is done while holding the flc_lock, and new insertions into the list
     688             :          * also require that it be held.
     689             :          */
     690         150 :         if (hlist_unhashed(&fl->fl_link))
     691             :                 return;
     692             : 
     693         150 :         fll = per_cpu_ptr(&file_lock_list, fl->fl_link_cpu);
     694         150 :         spin_lock(&fll->lock);
     695         150 :         hlist_del_init(&fl->fl_link);
     696         150 :         spin_unlock(&fll->lock);
     697             : }
     698             : 
     699             : static unsigned long
     700           4 : posix_owner_key(struct file_lock *fl)
     701             : {
     702           4 :         return (unsigned long)fl->fl_owner;
     703             : }
     704             : 
     705           2 : static void locks_insert_global_blocked(struct file_lock *waiter)
     706             : {
     707           6 :         lockdep_assert_held(&blocked_lock_lock);
     708             : 
     709           2 :         hash_add(blocked_hash, &waiter->fl_link, posix_owner_key(waiter));
     710           2 : }
     711             : 
     712           2 : static void locks_delete_global_blocked(struct file_lock *waiter)
     713             : {
     714           6 :         lockdep_assert_held(&blocked_lock_lock);
     715             : 
     716           2 :         hash_del(&waiter->fl_link);
     717           2 : }
     718             : 
     719             : /* Remove waiter from blocker's block list.
     720             :  * When blocker ends up pointing to itself then the list is empty.
     721             :  *
     722             :  * Must be called with blocked_lock_lock held.
     723             :  */
     724           2 : static void __locks_delete_block(struct file_lock *waiter)
     725             : {
     726           2 :         locks_delete_global_blocked(waiter);
     727           2 :         list_del_init(&waiter->fl_blocked_member);
     728           2 : }
     729             : 
     730           6 : static void __locks_wake_up_blocks(struct file_lock *blocker)
     731             : {
     732           6 :         while (!list_empty(&blocker->fl_blocked_requests)) {
     733           2 :                 struct file_lock *waiter;
     734             : 
     735           2 :                 waiter = list_first_entry(&blocker->fl_blocked_requests,
     736             :                                           struct file_lock, fl_blocked_member);
     737           2 :                 __locks_delete_block(waiter);
     738           2 :                 if (waiter->fl_lmops && waiter->fl_lmops->lm_notify)
     739           0 :                         waiter->fl_lmops->lm_notify(waiter);
     740             :                 else
     741           2 :                         wake_up(&waiter->fl_wait);
     742             : 
     743             :                 /*
     744             :                  * The setting of fl_blocker to NULL marks the "done"
     745             :                  * point in deleting a block. Paired with acquire at the top
     746             :                  * of locks_delete_block().
     747             :                  */
     748           8 :                 smp_store_release(&waiter->fl_blocker, NULL);
     749             :         }
     750           6 : }
     751             : 
     752             : /**
     753             :  *      locks_delete_block - stop waiting for a file lock
     754             :  *      @waiter: the lock which was waiting
     755             :  *
     756             :  *      lockd/nfsd need to disconnect the lock while working on it.
     757             :  */
     758         240 : int locks_delete_block(struct file_lock *waiter)
     759             : {
     760         240 :         int status = -ENOENT;
     761             : 
     762             :         /*
     763             :          * If fl_blocker is NULL, it won't be set again as this thread "owns"
     764             :          * the lock and is the only one that might try to claim the lock.
     765             :          *
     766             :          * We use acquire/release to manage fl_blocker so that we can
     767             :          * optimize away taking the blocked_lock_lock in many cases.
     768             :          *
     769             :          * The smp_load_acquire guarantees two things:
     770             :          *
     771             :          * 1/ that fl_blocked_requests can be tested locklessly. If something
     772             :          * was recently added to that list it must have been in a locked region
     773             :          * *before* the locked region when fl_blocker was set to NULL.
     774             :          *
     775             :          * 2/ that no other thread is accessing 'waiter', so it is safe to free
     776             :          * it.  __locks_wake_up_blocks is careful not to touch waiter after
     777             :          * fl_blocker is released.
     778             :          *
     779             :          * If a lockless check of fl_blocker shows it to be NULL, we know that
     780             :          * no new locks can be inserted into its fl_blocked_requests list, and
     781             :          * can avoid doing anything further if the list is empty.
     782             :          */
     783         240 :         if (!smp_load_acquire(&waiter->fl_blocker) &&
     784         240 :             list_empty(&waiter->fl_blocked_requests))
     785             :                 return status;
     786             : 
     787           0 :         spin_lock(&blocked_lock_lock);
     788           0 :         if (waiter->fl_blocker)
     789           0 :                 status = 0;
     790           0 :         __locks_wake_up_blocks(waiter);
     791           0 :         __locks_delete_block(waiter);
     792             : 
     793             :         /*
     794             :          * The setting of fl_blocker to NULL marks the "done" point in deleting
     795             :          * a block. Paired with acquire at the top of this function.
     796             :          */
     797           0 :         smp_store_release(&waiter->fl_blocker, NULL);
     798           0 :         spin_unlock(&blocked_lock_lock);
     799           0 :         return status;
     800             : }
     801             : EXPORT_SYMBOL(locks_delete_block);
     802             : 
     803             : /* Insert waiter into blocker's block list.
     804             :  * We use a circular list so that processes can be easily woken up in
     805             :  * the order they blocked. The documentation doesn't require this but
     806             :  * it seems like the reasonable thing to do.
     807             :  *
     808             :  * Must be called with both the flc_lock and blocked_lock_lock held. The
     809             :  * fl_blocked_requests list itself is protected by the blocked_lock_lock,
     810             :  * but by ensuring that the flc_lock is also held on insertions we can avoid
     811             :  * taking the blocked_lock_lock in some cases when we see that the
     812             :  * fl_blocked_requests list is empty.
     813             :  *
     814             :  * Rather than just adding to the list, we check for conflicts with any existing
     815             :  * waiters, and add beneath any waiter that blocks the new waiter.
     816             :  * Thus wakeups don't happen until needed.
     817             :  */
     818           2 : static void __locks_insert_block(struct file_lock *blocker,
     819             :                                  struct file_lock *waiter,
     820             :                                  bool conflict(struct file_lock *,
     821             :                                                struct file_lock *))
     822             : {
     823           2 :         struct file_lock *fl;
     824           2 :         BUG_ON(!list_empty(&waiter->fl_blocked_member));
     825             : 
     826           2 : new_blocker:
     827           2 :         list_for_each_entry(fl, &blocker->fl_blocked_requests, fl_blocked_member)
     828           0 :                 if (conflict(fl, waiter)) {
     829           0 :                         blocker =  fl;
     830           0 :                         goto new_blocker;
     831             :                 }
     832           2 :         waiter->fl_blocker = blocker;
     833           2 :         list_add_tail(&waiter->fl_blocked_member, &blocker->fl_blocked_requests);
     834           2 :         if (IS_POSIX(blocker) && !IS_OFDLCK(blocker))
     835           2 :                 locks_insert_global_blocked(waiter);
     836             : 
     837             :         /* The requests in waiter->fl_blocked are known to conflict with
     838             :          * waiter, but might not conflict with blocker, or the requests
     839             :          * and lock which block it.  So they all need to be woken.
     840             :          */
     841           2 :         __locks_wake_up_blocks(waiter);
     842           2 : }
     843             : 
     844             : /* Must be called with flc_lock held. */
     845           0 : static void locks_insert_block(struct file_lock *blocker,
     846             :                                struct file_lock *waiter,
     847             :                                bool conflict(struct file_lock *,
     848             :                                              struct file_lock *))
     849             : {
     850           0 :         spin_lock(&blocked_lock_lock);
     851           0 :         __locks_insert_block(blocker, waiter, conflict);
     852           0 :         spin_unlock(&blocked_lock_lock);
     853           0 : }
     854             : 
     855             : /*
     856             :  * Wake up processes blocked waiting for blocker.
     857             :  *
     858             :  * Must be called with the inode->flc_lock held!
     859             :  */
     860         150 : static void locks_wake_up_blocks(struct file_lock *blocker)
     861             : {
     862             :         /*
     863             :          * Avoid taking global lock if list is empty. This is safe since new
     864             :          * blocked requests are only added to the list under the flc_lock, and
     865             :          * the flc_lock is always held here. Note that removal from the
     866             :          * fl_blocked_requests list does not require the flc_lock, so we must
     867             :          * recheck list_empty() after acquiring the blocked_lock_lock.
     868             :          */
     869         150 :         if (list_empty(&blocker->fl_blocked_requests))
     870             :                 return;
     871             : 
     872           2 :         spin_lock(&blocked_lock_lock);
     873           2 :         __locks_wake_up_blocks(blocker);
     874           2 :         spin_unlock(&blocked_lock_lock);
     875             : }
     876             : 
     877             : static void
     878         155 : locks_insert_lock_ctx(struct file_lock *fl, struct list_head *before)
     879             : {
     880         155 :         list_add_tail(&fl->fl_list, before);
     881           0 :         locks_insert_global_locks(fl);
     882           0 : }
     883             : 
     884             : static void
     885         150 : locks_unlink_lock_ctx(struct file_lock *fl)
     886             : {
     887         150 :         locks_delete_global_locks(fl);
     888         150 :         list_del_init(&fl->fl_list);
     889         150 :         locks_wake_up_blocks(fl);
     890         150 : }
     891             : 
     892             : static void
     893         150 : locks_delete_lock_ctx(struct file_lock *fl, struct list_head *dispose)
     894             : {
     895           0 :         locks_unlink_lock_ctx(fl);
     896           0 :         if (dispose)
     897         150 :                 list_add(&fl->fl_list, dispose);
     898             :         else
     899           0 :                 locks_free_lock(fl);
     900           0 : }
     901             : 
     902             : /* Determine if lock sys_fl blocks lock caller_fl. Common functionality
     903             :  * checks for shared/exclusive status of overlapping locks.
     904             :  */
     905           2 : static bool locks_conflict(struct file_lock *caller_fl,
     906             :                            struct file_lock *sys_fl)
     907             : {
     908           2 :         if (sys_fl->fl_type == F_WRLCK)
     909             :                 return true;
     910           0 :         if (caller_fl->fl_type == F_WRLCK)
     911           0 :                 return true;
     912             :         return false;
     913             : }
     914             : 
     915             : /* Determine if lock sys_fl blocks lock caller_fl. POSIX specific
     916             :  * checking before calling the locks_conflict().
     917             :  */
     918           2 : static bool posix_locks_conflict(struct file_lock *caller_fl,
     919             :                                  struct file_lock *sys_fl)
     920             : {
     921             :         /* POSIX locks owned by the same process do not conflict with
     922             :          * each other.
     923             :          */
     924           2 :         if (posix_same_owner(caller_fl, sys_fl))
     925             :                 return false;
     926             : 
     927             :         /* Check whether they overlap */
     928           2 :         if (!locks_overlap(caller_fl, sys_fl))
     929             :                 return false;
     930             : 
     931           2 :         return locks_conflict(caller_fl, sys_fl);
     932             : }
     933             : 
     934             : /* Determine if lock sys_fl blocks lock caller_fl. FLOCK specific
     935             :  * checking before calling the locks_conflict().
     936             :  */
     937           0 : static bool flock_locks_conflict(struct file_lock *caller_fl,
     938             :                                  struct file_lock *sys_fl)
     939             : {
     940             :         /* FLOCK locks referring to the same filp do not conflict with
     941             :          * each other.
     942             :          */
     943           0 :         if (caller_fl->fl_file == sys_fl->fl_file)
     944             :                 return false;
     945           0 :         if ((caller_fl->fl_type & LOCK_MAND) || (sys_fl->fl_type & LOCK_MAND))
     946             :                 return false;
     947             : 
     948           0 :         return locks_conflict(caller_fl, sys_fl);
     949             : }
     950             : 
     951             : void
     952           0 : posix_test_lock(struct file *filp, struct file_lock *fl)
     953             : {
     954           0 :         struct file_lock *cfl;
     955           0 :         struct file_lock_context *ctx;
     956           0 :         struct inode *inode = locks_inode(filp);
     957             : 
     958           0 :         ctx = smp_load_acquire(&inode->i_flctx);
     959           0 :         if (!ctx || list_empty_careful(&ctx->flc_posix)) {
     960           0 :                 fl->fl_type = F_UNLCK;
     961           0 :                 return;
     962             :         }
     963             : 
     964           0 :         spin_lock(&ctx->flc_lock);
     965           0 :         list_for_each_entry(cfl, &ctx->flc_posix, fl_list) {
     966           0 :                 if (posix_locks_conflict(fl, cfl)) {
     967           0 :                         locks_copy_conflock(fl, cfl);
     968           0 :                         goto out;
     969             :                 }
     970             :         }
     971           0 :         fl->fl_type = F_UNLCK;
     972           0 : out:
     973           0 :         spin_unlock(&ctx->flc_lock);
     974             :         return;
     975             : }
     976             : EXPORT_SYMBOL(posix_test_lock);
     977             : 
     978             : /*
     979             :  * Deadlock detection:
     980             :  *
     981             :  * We attempt to detect deadlocks that are due purely to posix file
     982             :  * locks.
     983             :  *
     984             :  * We assume that a task can be waiting for at most one lock at a time.
     985             :  * So for any acquired lock, the process holding that lock may be
     986             :  * waiting on at most one other lock.  That lock in turns may be held by
     987             :  * someone waiting for at most one other lock.  Given a requested lock
     988             :  * caller_fl which is about to wait for a conflicting lock block_fl, we
     989             :  * follow this chain of waiters to ensure we are not about to create a
     990             :  * cycle.
     991             :  *
     992             :  * Since we do this before we ever put a process to sleep on a lock, we
     993             :  * are ensured that there is never a cycle; that is what guarantees that
     994             :  * the while() loop in posix_locks_deadlock() eventually completes.
     995             :  *
     996             :  * Note: the above assumption may not be true when handling lock
     997             :  * requests from a broken NFS client. It may also fail in the presence
     998             :  * of tasks (such as posix threads) sharing the same open file table.
     999             :  * To handle those cases, we just bail out after a few iterations.
    1000             :  *
    1001             :  * For FL_OFDLCK locks, the owner is the filp, not the files_struct.
    1002             :  * Because the owner is not even nominally tied to a thread of
    1003             :  * execution, the deadlock detection below can't reasonably work well. Just
    1004             :  * skip it for those.
    1005             :  *
    1006             :  * In principle, we could do a more limited deadlock detection on FL_OFDLCK
    1007             :  * locks that just checks for the case where two tasks are attempting to
    1008             :  * upgrade from read to write locks on the same inode.
    1009             :  */
    1010             : 
    1011             : #define MAX_DEADLK_ITERATIONS 10
    1012             : 
    1013             : /* Find a lock that the owner of the given block_fl is blocking on. */
    1014           2 : static struct file_lock *what_owner_is_waiting_for(struct file_lock *block_fl)
    1015             : {
    1016           2 :         struct file_lock *fl;
    1017             : 
    1018           4 :         hash_for_each_possible(blocked_hash, fl, fl_link, posix_owner_key(block_fl)) {
    1019           0 :                 if (posix_same_owner(fl, block_fl)) {
    1020           0 :                         while (fl->fl_blocker)
    1021             :                                 fl = fl->fl_blocker;
    1022           0 :                         return fl;
    1023             :                 }
    1024             :         }
    1025             :         return NULL;
    1026             : }
    1027             : 
    1028             : /* Must be called with the blocked_lock_lock held! */
    1029           2 : static int posix_locks_deadlock(struct file_lock *caller_fl,
    1030             :                                 struct file_lock *block_fl)
    1031             : {
    1032           2 :         int i = 0;
    1033             : 
    1034           6 :         lockdep_assert_held(&blocked_lock_lock);
    1035             : 
    1036             :         /*
    1037             :          * This deadlock detector can't reasonably detect deadlocks with
    1038             :          * FL_OFDLCK locks, since they aren't owned by a process, per-se.
    1039             :          */
    1040           2 :         if (IS_OFDLCK(caller_fl))
    1041             :                 return 0;
    1042             : 
    1043           2 :         while ((block_fl = what_owner_is_waiting_for(block_fl))) {
    1044           0 :                 if (i++ > MAX_DEADLK_ITERATIONS)
    1045             :                         return 0;
    1046           0 :                 if (posix_same_owner(caller_fl, block_fl))
    1047             :                         return 1;
    1048             :         }
    1049             :         return 0;
    1050             : }
    1051             : 
    1052             : /* Try to create a FLOCK lock on filp. We always insert new FLOCK locks
    1053             :  * after any leases, but before any posix locks.
    1054             :  *
    1055             :  * Note that if called with an FL_EXISTS argument, the caller may determine
    1056             :  * whether or not a lock was successfully freed by testing the return
    1057             :  * value for -ENOENT.
    1058             :  */
    1059         227 : static int flock_lock_inode(struct inode *inode, struct file_lock *request)
    1060             : {
    1061         227 :         struct file_lock *new_fl = NULL;
    1062         227 :         struct file_lock *fl;
    1063         227 :         struct file_lock_context *ctx;
    1064         227 :         int error = 0;
    1065         227 :         bool found = false;
    1066         227 :         LIST_HEAD(dispose);
    1067             : 
    1068         227 :         ctx = locks_get_lock_context(inode, request->fl_type);
    1069         227 :         if (!ctx) {
    1070           0 :                 if (request->fl_type != F_UNLCK)
    1071             :                         return -ENOMEM;
    1072           0 :                 return (request->fl_flags & FL_EXISTS) ? -ENOENT : 0;
    1073             :         }
    1074             : 
    1075         227 :         if (!(request->fl_flags & FL_ACCESS) && (request->fl_type != F_UNLCK)) {
    1076          96 :                 new_fl = locks_alloc_lock();
    1077          96 :                 if (!new_fl)
    1078             :                         return -ENOMEM;
    1079             :         }
    1080             : 
    1081         227 :         percpu_down_read(&file_rwsem);
    1082         227 :         spin_lock(&ctx->flc_lock);
    1083         227 :         if (request->fl_flags & FL_ACCESS)
    1084           0 :                 goto find_conflict;
    1085             : 
    1086         264 :         list_for_each_entry(fl, &ctx->flc_flock, fl_list) {
    1087         131 :                 if (request->fl_file != fl->fl_file)
    1088          37 :                         continue;
    1089          94 :                 if (request->fl_type == fl->fl_type)
    1090           0 :                         goto out;
    1091          94 :                 found = true;
    1092          94 :                 locks_delete_lock_ctx(fl, &dispose);
    1093             :                 break;
    1094             :         }
    1095             : 
    1096         227 :         if (request->fl_type == F_UNLCK) {
    1097         131 :                 if ((request->fl_flags & FL_EXISTS) && !found)
    1098           0 :                         error = -ENOENT;
    1099         131 :                 goto out;
    1100             :         }
    1101             : 
    1102          96 : find_conflict:
    1103          96 :         list_for_each_entry(fl, &ctx->flc_flock, fl_list) {
    1104           0 :                 if (!flock_locks_conflict(request, fl))
    1105           0 :                         continue;
    1106           0 :                 error = -EAGAIN;
    1107           0 :                 if (!(request->fl_flags & FL_SLEEP))
    1108           0 :                         goto out;
    1109           0 :                 error = FILE_LOCK_DEFERRED;
    1110           0 :                 locks_insert_block(fl, request, flock_locks_conflict);
    1111           0 :                 goto out;
    1112             :         }
    1113          96 :         if (request->fl_flags & FL_ACCESS)
    1114           0 :                 goto out;
    1115          96 :         locks_copy_lock(new_fl, request);
    1116          96 :         locks_move_blocks(new_fl, request);
    1117          96 :         locks_insert_lock_ctx(new_fl, &ctx->flc_flock);
    1118          96 :         new_fl = NULL;
    1119          96 :         error = 0;
    1120             : 
    1121         227 : out:
    1122         227 :         spin_unlock(&ctx->flc_lock);
    1123         227 :         percpu_up_read(&file_rwsem);
    1124         227 :         if (new_fl)
    1125           0 :                 locks_free_lock(new_fl);
    1126         227 :         locks_dispose_list(&dispose);
    1127         227 :         trace_flock_lock_inode(inode, request, error);
    1128         227 :         return error;
    1129             : }
    1130             : 
    1131         134 : static int posix_lock_inode(struct inode *inode, struct file_lock *request,
    1132             :                             struct file_lock *conflock)
    1133             : {
    1134         134 :         struct file_lock *fl, *tmp;
    1135         134 :         struct file_lock *new_fl = NULL;
    1136         134 :         struct file_lock *new_fl2 = NULL;
    1137         134 :         struct file_lock *left = NULL;
    1138         134 :         struct file_lock *right = NULL;
    1139         134 :         struct file_lock_context *ctx;
    1140         134 :         int error;
    1141         134 :         bool added = false;
    1142         134 :         LIST_HEAD(dispose);
    1143             : 
    1144         134 :         ctx = locks_get_lock_context(inode, request->fl_type);
    1145         134 :         if (!ctx)
    1146           0 :                 return (request->fl_type == F_UNLCK) ? 0 : -ENOMEM;
    1147             : 
    1148             :         /*
    1149             :          * We may need two file_lock structures for this operation,
    1150             :          * so we get them in advance to avoid races.
    1151             :          *
    1152             :          * In some cases we can be sure, that no new locks will be needed
    1153             :          */
    1154         134 :         if (!(request->fl_flags & FL_ACCESS) &&
    1155         134 :             (request->fl_type != F_UNLCK ||
    1156          73 :              request->fl_start != 0 || request->fl_end != OFFSET_MAX)) {
    1157          61 :                 new_fl = locks_alloc_lock();
    1158          61 :                 new_fl2 = locks_alloc_lock();
    1159             :         }
    1160             : 
    1161         134 :         percpu_down_read(&file_rwsem);
    1162         134 :         spin_lock(&ctx->flc_lock);
    1163             :         /*
    1164             :          * New lock request. Walk all POSIX locks and look for conflicts. If
    1165             :          * there are any, either return error or put the request on the
    1166             :          * blocker's list of waiters and the global blocked_hash.
    1167             :          */
    1168         134 :         if (request->fl_type != F_UNLCK) {
    1169          61 :                 list_for_each_entry(fl, &ctx->flc_posix, fl_list) {
    1170           2 :                         if (!posix_locks_conflict(request, fl))
    1171           0 :                                 continue;
    1172           2 :                         if (conflock)
    1173           0 :                                 locks_copy_conflock(conflock, fl);
    1174           2 :                         error = -EAGAIN;
    1175           2 :                         if (!(request->fl_flags & FL_SLEEP))
    1176           0 :                                 goto out;
    1177             :                         /*
    1178             :                          * Deadlock detection and insertion into the blocked
    1179             :                          * locks list must be done while holding the same lock!
    1180             :                          */
    1181           2 :                         error = -EDEADLK;
    1182           2 :                         spin_lock(&blocked_lock_lock);
    1183             :                         /*
    1184             :                          * Ensure that we don't find any locks blocked on this
    1185             :                          * request during deadlock detection.
    1186             :                          */
    1187           2 :                         __locks_wake_up_blocks(request);
    1188           2 :                         if (likely(!posix_locks_deadlock(request, fl))) {
    1189           2 :                                 error = FILE_LOCK_DEFERRED;
    1190           2 :                                 __locks_insert_block(fl, request,
    1191             :                                                      posix_locks_conflict);
    1192             :                         }
    1193           2 :                         spin_unlock(&blocked_lock_lock);
    1194           2 :                         goto out;
    1195             :                 }
    1196             :         }
    1197             : 
    1198             :         /* If we're just looking for a conflict, we're done. */
    1199         132 :         error = 0;
    1200         132 :         if (request->fl_flags & FL_ACCESS)
    1201           0 :                 goto out;
    1202             : 
    1203             :         /* Find the first old lock with the same owner as the new lock */
    1204         149 :         list_for_each_entry(fl, &ctx->flc_posix, fl_list) {
    1205          73 :                 if (posix_same_owner(request, fl))
    1206             :                         break;
    1207             :         }
    1208             : 
    1209             :         /* Process locks with this owner. */
    1210         188 :         list_for_each_entry_safe_from(fl, tmp, &ctx->flc_posix, fl_list) {
    1211          56 :                 if (!posix_same_owner(request, fl))
    1212             :                         break;
    1213             : 
    1214             :                 /* Detect adjacent or overlapping regions (if same lock type) */
    1215          56 :                 if (request->fl_type == fl->fl_type) {
    1216             :                         /* In all comparisons of start vs end, use
    1217             :                          * "start - 1" rather than "end + 1". If end
    1218             :                          * is OFFSET_MAX, end + 1 will become negative.
    1219             :                          */
    1220           0 :                         if (fl->fl_end < request->fl_start - 1)
    1221           0 :                                 continue;
    1222             :                         /* If the next lock in the list has entirely bigger
    1223             :                          * addresses than the new one, insert the lock here.
    1224             :                          */
    1225           0 :                         if (fl->fl_start - 1 > request->fl_end)
    1226             :                                 break;
    1227             : 
    1228             :                         /* If we come here, the new and old lock are of the
    1229             :                          * same type and adjacent or overlapping. Make one
    1230             :                          * lock yielding from the lower start address of both
    1231             :                          * locks to the higher end address.
    1232             :                          */
    1233           0 :                         if (fl->fl_start > request->fl_start)
    1234           0 :                                 fl->fl_start = request->fl_start;
    1235             :                         else
    1236           0 :                                 request->fl_start = fl->fl_start;
    1237           0 :                         if (fl->fl_end < request->fl_end)
    1238           0 :                                 fl->fl_end = request->fl_end;
    1239             :                         else
    1240           0 :                                 request->fl_end = fl->fl_end;
    1241           0 :                         if (added) {
    1242           0 :                                 locks_delete_lock_ctx(fl, &dispose);
    1243           0 :                                 continue;
    1244             :                         }
    1245             :                         request = fl;
    1246             :                         added = true;
    1247             :                 } else {
    1248             :                         /* Processing for different lock types is a bit
    1249             :                          * more complex.
    1250             :                          */
    1251          56 :                         if (fl->fl_end < request->fl_start)
    1252           0 :                                 continue;
    1253          56 :                         if (fl->fl_start > request->fl_end)
    1254             :                                 break;
    1255          56 :                         if (request->fl_type == F_UNLCK)
    1256          56 :                                 added = true;
    1257          56 :                         if (fl->fl_start < request->fl_start)
    1258           0 :                                 left = fl;
    1259             :                         /* If the next lock in the list has a higher end
    1260             :                          * address than the new one, insert the new one here.
    1261             :                          */
    1262          56 :                         if (fl->fl_end > request->fl_end) {
    1263             :                                 right = fl;
    1264             :                                 break;
    1265             :                         }
    1266          56 :                         if (fl->fl_start >= request->fl_start) {
    1267             :                                 /* The new lock completely replaces an old
    1268             :                                  * one (This may happen several times).
    1269             :                                  */
    1270          56 :                                 if (added) {
    1271          56 :                                         locks_delete_lock_ctx(fl, &dispose);
    1272          56 :                                         continue;
    1273             :                                 }
    1274             :                                 /*
    1275             :                                  * Replace the old lock with new_fl, and
    1276             :                                  * remove the old one. It's safe to do the
    1277             :                                  * insert here since we know that we won't be
    1278             :                                  * using new_fl later, and that the lock is
    1279             :                                  * just replacing an existing lock.
    1280             :                                  */
    1281           0 :                                 error = -ENOLCK;
    1282           0 :                                 if (!new_fl)
    1283           0 :                                         goto out;
    1284           0 :                                 locks_copy_lock(new_fl, request);
    1285           0 :                                 locks_move_blocks(new_fl, request);
    1286           0 :                                 request = new_fl;
    1287           0 :                                 new_fl = NULL;
    1288           0 :                                 locks_insert_lock_ctx(request, &fl->fl_list);
    1289           0 :                                 locks_delete_lock_ctx(fl, &dispose);
    1290           0 :                                 added = true;
    1291             :                         }
    1292             :                 }
    1293             :         }
    1294             : 
    1295             :         /*
    1296             :          * The above code only modifies existing locks in case of merging or
    1297             :          * replacing. If new lock(s) need to be inserted all modifications are
    1298             :          * done below this, so it's safe yet to bail out.
    1299             :          */
    1300         132 :         error = -ENOLCK; /* "no luck" */
    1301         132 :         if (right && left == right && !new_fl2)
    1302           0 :                 goto out;
    1303             : 
    1304         132 :         error = 0;
    1305         132 :         if (!added) {
    1306          76 :                 if (request->fl_type == F_UNLCK) {
    1307          17 :                         if (request->fl_flags & FL_EXISTS)
    1308           0 :                                 error = -ENOENT;
    1309          17 :                         goto out;
    1310             :                 }
    1311             : 
    1312          59 :                 if (!new_fl) {
    1313           0 :                         error = -ENOLCK;
    1314           0 :                         goto out;
    1315             :                 }
    1316          59 :                 locks_copy_lock(new_fl, request);
    1317          59 :                 locks_move_blocks(new_fl, request);
    1318          59 :                 locks_insert_lock_ctx(new_fl, &fl->fl_list);
    1319          59 :                 fl = new_fl;
    1320          59 :                 new_fl = NULL;
    1321             :         }
    1322         115 :         if (right) {
    1323           0 :                 if (left == right) {
    1324             :                         /* The new lock breaks the old one in two pieces,
    1325             :                          * so we have to use the second new lock.
    1326             :                          */
    1327           0 :                         left = new_fl2;
    1328           0 :                         new_fl2 = NULL;
    1329           0 :                         locks_copy_lock(left, right);
    1330           0 :                         locks_insert_lock_ctx(left, &fl->fl_list);
    1331             :                 }
    1332           0 :                 right->fl_start = request->fl_end + 1;
    1333           0 :                 locks_wake_up_blocks(right);
    1334             :         }
    1335         115 :         if (left) {
    1336           0 :                 left->fl_end = request->fl_start - 1;
    1337           0 :                 locks_wake_up_blocks(left);
    1338             :         }
    1339         115 :  out:
    1340         134 :         spin_unlock(&ctx->flc_lock);
    1341         134 :         percpu_up_read(&file_rwsem);
    1342             :         /*
    1343             :          * Free any unused locks.
    1344             :          */
    1345         134 :         if (new_fl)
    1346           2 :                 locks_free_lock(new_fl);
    1347         134 :         if (new_fl2)
    1348          61 :                 locks_free_lock(new_fl2);
    1349         134 :         locks_dispose_list(&dispose);
    1350         134 :         trace_posix_lock_inode(inode, request, error);
    1351             : 
    1352         134 :         return error;
    1353             : }
    1354             : 
    1355             : /**
    1356             :  * posix_lock_file - Apply a POSIX-style lock to a file
    1357             :  * @filp: The file to apply the lock to
    1358             :  * @fl: The lock to be applied
    1359             :  * @conflock: Place to return a copy of the conflicting lock, if found.
    1360             :  *
    1361             :  * Add a POSIX style lock to a file.
    1362             :  * We merge adjacent & overlapping locks whenever possible.
    1363             :  * POSIX locks are sorted by owner task, then by starting address
    1364             :  *
    1365             :  * Note that if called with an FL_EXISTS argument, the caller may determine
    1366             :  * whether or not a lock was successfully freed by testing the return
    1367             :  * value for -ENOENT.
    1368             :  */
    1369         134 : int posix_lock_file(struct file *filp, struct file_lock *fl,
    1370             :                         struct file_lock *conflock)
    1371             : {
    1372           0 :         return posix_lock_inode(locks_inode(filp), fl, conflock);
    1373             : }
    1374             : EXPORT_SYMBOL(posix_lock_file);
    1375             : 
    1376             : /**
    1377             :  * posix_lock_inode_wait - Apply a POSIX-style lock to a file
    1378             :  * @inode: inode of file to which lock request should be applied
    1379             :  * @fl: The lock to be applied
    1380             :  *
    1381             :  * Apply a POSIX style lock request to an inode.
    1382             :  */
    1383           0 : static int posix_lock_inode_wait(struct inode *inode, struct file_lock *fl)
    1384             : {
    1385           0 :         int error;
    1386           0 :         might_sleep ();
    1387           0 :         for (;;) {
    1388           0 :                 error = posix_lock_inode(inode, fl, NULL);
    1389           0 :                 if (error != FILE_LOCK_DEFERRED)
    1390             :                         break;
    1391           0 :                 error = wait_event_interruptible(fl->fl_wait,
    1392             :                                         list_empty(&fl->fl_blocked_member));
    1393           0 :                 if (error)
    1394             :                         break;
    1395             :         }
    1396           0 :         locks_delete_block(fl);
    1397           0 :         return error;
    1398             : }
    1399             : 
    1400             : #ifdef CONFIG_MANDATORY_FILE_LOCKING
    1401             : /**
    1402             :  * locks_mandatory_locked - Check for an active lock
    1403             :  * @file: the file to check
    1404             :  *
    1405             :  * Searches the inode's list of locks to find any POSIX locks which conflict.
    1406             :  * This function is called from locks_verify_locked() only.
    1407             :  */
    1408             : int locks_mandatory_locked(struct file *file)
    1409             : {
    1410             :         int ret;
    1411             :         struct inode *inode = locks_inode(file);
    1412             :         struct file_lock_context *ctx;
    1413             :         struct file_lock *fl;
    1414             : 
    1415             :         ctx = smp_load_acquire(&inode->i_flctx);
    1416             :         if (!ctx || list_empty_careful(&ctx->flc_posix))
    1417             :                 return 0;
    1418             : 
    1419             :         /*
    1420             :          * Search the lock list for this inode for any POSIX locks.
    1421             :          */
    1422             :         spin_lock(&ctx->flc_lock);
    1423             :         ret = 0;
    1424             :         list_for_each_entry(fl, &ctx->flc_posix, fl_list) {
    1425             :                 if (fl->fl_owner != current->files &&
    1426             :                     fl->fl_owner != file) {
    1427             :                         ret = -EAGAIN;
    1428             :                         break;
    1429             :                 }
    1430             :         }
    1431             :         spin_unlock(&ctx->flc_lock);
    1432             :         return ret;
    1433             : }
    1434             : 
    1435             : /**
    1436             :  * locks_mandatory_area - Check for a conflicting lock
    1437             :  * @inode:      the file to check
    1438             :  * @filp:       how the file was opened (if it was)
    1439             :  * @start:      first byte in the file to check
    1440             :  * @end:        lastbyte in the file to check
    1441             :  * @type:       %F_WRLCK for a write lock, else %F_RDLCK
    1442             :  *
    1443             :  * Searches the inode's list of locks to find any POSIX locks which conflict.
    1444             :  */
    1445             : int locks_mandatory_area(struct inode *inode, struct file *filp, loff_t start,
    1446             :                          loff_t end, unsigned char type)
    1447             : {
    1448             :         struct file_lock fl;
    1449             :         int error;
    1450             :         bool sleep = false;
    1451             : 
    1452             :         locks_init_lock(&fl);
    1453             :         fl.fl_pid = current->tgid;
    1454             :         fl.fl_file = filp;
    1455             :         fl.fl_flags = FL_POSIX | FL_ACCESS;
    1456             :         if (filp && !(filp->f_flags & O_NONBLOCK))
    1457             :                 sleep = true;
    1458             :         fl.fl_type = type;
    1459             :         fl.fl_start = start;
    1460             :         fl.fl_end = end;
    1461             : 
    1462             :         for (;;) {
    1463             :                 if (filp) {
    1464             :                         fl.fl_owner = filp;
    1465             :                         fl.fl_flags &= ~FL_SLEEP;
    1466             :                         error = posix_lock_inode(inode, &fl, NULL);
    1467             :                         if (!error)
    1468             :                                 break;
    1469             :                 }
    1470             : 
    1471             :                 if (sleep)
    1472             :                         fl.fl_flags |= FL_SLEEP;
    1473             :                 fl.fl_owner = current->files;
    1474             :                 error = posix_lock_inode(inode, &fl, NULL);
    1475             :                 if (error != FILE_LOCK_DEFERRED)
    1476             :                         break;
    1477             :                 error = wait_event_interruptible(fl.fl_wait,
    1478             :                                         list_empty(&fl.fl_blocked_member));
    1479             :                 if (!error) {
    1480             :                         /*
    1481             :                          * If we've been sleeping someone might have
    1482             :                          * changed the permissions behind our back.
    1483             :                          */
    1484             :                         if (__mandatory_lock(inode))
    1485             :                                 continue;
    1486             :                 }
    1487             : 
    1488             :                 break;
    1489             :         }
    1490             :         locks_delete_block(&fl);
    1491             : 
    1492             :         return error;
    1493             : }
    1494             : EXPORT_SYMBOL(locks_mandatory_area);
    1495             : #endif /* CONFIG_MANDATORY_FILE_LOCKING */
    1496             : 
    1497           0 : static void lease_clear_pending(struct file_lock *fl, int arg)
    1498             : {
    1499           0 :         switch (arg) {
    1500           0 :         case F_UNLCK:
    1501           0 :                 fl->fl_flags &= ~FL_UNLOCK_PENDING;
    1502           0 :                 fallthrough;
    1503           0 :         case F_RDLCK:
    1504           0 :                 fl->fl_flags &= ~FL_DOWNGRADE_PENDING;
    1505             :         }
    1506           0 : }
    1507             : 
    1508             : /* We already had a lease on this file; just change its type */
    1509           0 : int lease_modify(struct file_lock *fl, int arg, struct list_head *dispose)
    1510             : {
    1511           0 :         int error = assign_type(fl, arg);
    1512             : 
    1513           0 :         if (error)
    1514             :                 return error;
    1515           0 :         lease_clear_pending(fl, arg);
    1516           0 :         locks_wake_up_blocks(fl);
    1517           0 :         if (arg == F_UNLCK) {
    1518           0 :                 struct file *filp = fl->fl_file;
    1519             : 
    1520           0 :                 f_delown(filp);
    1521           0 :                 filp->f_owner.signum = 0;
    1522           0 :                 fasync_helper(0, fl->fl_file, 0, &fl->fl_fasync);
    1523           0 :                 if (fl->fl_fasync != NULL) {
    1524           0 :                         printk(KERN_ERR "locks_delete_lock: fasync == %p\n", fl->fl_fasync);
    1525           0 :                         fl->fl_fasync = NULL;
    1526             :                 }
    1527           0 :                 locks_delete_lock_ctx(fl, dispose);
    1528             :         }
    1529             :         return 0;
    1530             : }
    1531             : EXPORT_SYMBOL(lease_modify);
    1532             : 
    1533           0 : static bool past_time(unsigned long then)
    1534             : {
    1535           0 :         if (!then)
    1536             :                 /* 0 is a special value meaning "this never expires": */
    1537             :                 return false;
    1538           0 :         return time_after(jiffies, then);
    1539             : }
    1540             : 
    1541           0 : static void time_out_leases(struct inode *inode, struct list_head *dispose)
    1542             : {
    1543           0 :         struct file_lock_context *ctx = inode->i_flctx;
    1544           0 :         struct file_lock *fl, *tmp;
    1545             : 
    1546           0 :         lockdep_assert_held(&ctx->flc_lock);
    1547             : 
    1548           0 :         list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list) {
    1549           0 :                 trace_time_out_leases(inode, fl);
    1550           0 :                 if (past_time(fl->fl_downgrade_time))
    1551           0 :                         lease_modify(fl, F_RDLCK, dispose);
    1552           0 :                 if (past_time(fl->fl_break_time))
    1553           0 :                         lease_modify(fl, F_UNLCK, dispose);
    1554             :         }
    1555           0 : }
    1556             : 
    1557           0 : static bool leases_conflict(struct file_lock *lease, struct file_lock *breaker)
    1558             : {
    1559           0 :         bool rc;
    1560             : 
    1561           0 :         if (lease->fl_lmops->lm_breaker_owns_lease
    1562           0 :                         && lease->fl_lmops->lm_breaker_owns_lease(lease))
    1563             :                 return false;
    1564           0 :         if ((breaker->fl_flags & FL_LAYOUT) != (lease->fl_flags & FL_LAYOUT)) {
    1565           0 :                 rc = false;
    1566           0 :                 goto trace;
    1567             :         }
    1568           0 :         if ((breaker->fl_flags & FL_DELEG) && (lease->fl_flags & FL_LEASE)) {
    1569           0 :                 rc = false;
    1570           0 :                 goto trace;
    1571             :         }
    1572             : 
    1573           0 :         rc = locks_conflict(breaker, lease);
    1574           0 : trace:
    1575           0 :         trace_leases_conflict(rc, lease, breaker);
    1576           0 :         return rc;
    1577             : }
    1578             : 
    1579             : static bool
    1580           0 : any_leases_conflict(struct inode *inode, struct file_lock *breaker)
    1581             : {
    1582           0 :         struct file_lock_context *ctx = inode->i_flctx;
    1583           0 :         struct file_lock *fl;
    1584             : 
    1585           0 :         lockdep_assert_held(&ctx->flc_lock);
    1586             : 
    1587           0 :         list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
    1588           0 :                 if (leases_conflict(fl, breaker))
    1589             :                         return true;
    1590             :         }
    1591             :         return false;
    1592             : }
    1593             : 
    1594             : /**
    1595             :  *      __break_lease   -       revoke all outstanding leases on file
    1596             :  *      @inode: the inode of the file to return
    1597             :  *      @mode: O_RDONLY: break only write leases; O_WRONLY or O_RDWR:
    1598             :  *          break all leases
    1599             :  *      @type: FL_LEASE: break leases and delegations; FL_DELEG: break
    1600             :  *          only delegations
    1601             :  *
    1602             :  *      break_lease (inlined for speed) has checked there already is at least
    1603             :  *      some kind of lock (maybe a lease) on this file.  Leases are broken on
    1604             :  *      a call to open() or truncate().  This function can sleep unless you
    1605             :  *      specified %O_NONBLOCK to your open().
    1606             :  */
    1607           0 : int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
    1608             : {
    1609           0 :         int error = 0;
    1610           0 :         struct file_lock_context *ctx;
    1611           0 :         struct file_lock *new_fl, *fl, *tmp;
    1612           0 :         unsigned long break_time;
    1613           0 :         int want_write = (mode & O_ACCMODE) != O_RDONLY;
    1614           0 :         LIST_HEAD(dispose);
    1615             : 
    1616           0 :         new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK);
    1617           0 :         if (IS_ERR(new_fl))
    1618           0 :                 return PTR_ERR(new_fl);
    1619           0 :         new_fl->fl_flags = type;
    1620             : 
    1621             :         /* typically we will check that ctx is non-NULL before calling */
    1622           0 :         ctx = smp_load_acquire(&inode->i_flctx);
    1623           0 :         if (!ctx) {
    1624           0 :                 WARN_ON_ONCE(1);
    1625           0 :                 goto free_lock;
    1626             :         }
    1627             : 
    1628           0 :         percpu_down_read(&file_rwsem);
    1629           0 :         spin_lock(&ctx->flc_lock);
    1630             : 
    1631           0 :         time_out_leases(inode, &dispose);
    1632             : 
    1633           0 :         if (!any_leases_conflict(inode, new_fl))
    1634           0 :                 goto out;
    1635             : 
    1636           0 :         break_time = 0;
    1637           0 :         if (lease_break_time > 0) {
    1638           0 :                 break_time = jiffies + lease_break_time * HZ;
    1639           0 :                 if (break_time == 0)
    1640             :                         break_time++;   /* so that 0 means no break time */
    1641             :         }
    1642             : 
    1643           0 :         list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list) {
    1644           0 :                 if (!leases_conflict(fl, new_fl))
    1645           0 :                         continue;
    1646           0 :                 if (want_write) {
    1647           0 :                         if (fl->fl_flags & FL_UNLOCK_PENDING)
    1648           0 :                                 continue;
    1649           0 :                         fl->fl_flags |= FL_UNLOCK_PENDING;
    1650           0 :                         fl->fl_break_time = break_time;
    1651             :                 } else {
    1652           0 :                         if (lease_breaking(fl))
    1653           0 :                                 continue;
    1654           0 :                         fl->fl_flags |= FL_DOWNGRADE_PENDING;
    1655           0 :                         fl->fl_downgrade_time = break_time;
    1656             :                 }
    1657           0 :                 if (fl->fl_lmops->lm_break(fl))
    1658           0 :                         locks_delete_lock_ctx(fl, &dispose);
    1659             :         }
    1660             : 
    1661           0 :         if (list_empty(&ctx->flc_lease))
    1662           0 :                 goto out;
    1663             : 
    1664           0 :         if (mode & O_NONBLOCK) {
    1665           0 :                 trace_break_lease_noblock(inode, new_fl);
    1666           0 :                 error = -EWOULDBLOCK;
    1667           0 :                 goto out;
    1668             :         }
    1669             : 
    1670           0 : restart:
    1671           0 :         fl = list_first_entry(&ctx->flc_lease, struct file_lock, fl_list);
    1672           0 :         break_time = fl->fl_break_time;
    1673           0 :         if (break_time != 0)
    1674           0 :                 break_time -= jiffies;
    1675           0 :         if (break_time == 0)
    1676             :                 break_time++;
    1677           0 :         locks_insert_block(fl, new_fl, leases_conflict);
    1678           0 :         trace_break_lease_block(inode, new_fl);
    1679           0 :         spin_unlock(&ctx->flc_lock);
    1680           0 :         percpu_up_read(&file_rwsem);
    1681             : 
    1682           0 :         locks_dispose_list(&dispose);
    1683           0 :         error = wait_event_interruptible_timeout(new_fl->fl_wait,
    1684             :                                         list_empty(&new_fl->fl_blocked_member),
    1685             :                                         break_time);
    1686             : 
    1687           0 :         percpu_down_read(&file_rwsem);
    1688           0 :         spin_lock(&ctx->flc_lock);
    1689           0 :         trace_break_lease_unblock(inode, new_fl);
    1690           0 :         locks_delete_block(new_fl);
    1691           0 :         if (error >= 0) {
    1692             :                 /*
    1693             :                  * Wait for the next conflicting lease that has not been
    1694             :                  * broken yet
    1695             :                  */
    1696           0 :                 if (error == 0)
    1697           0 :                         time_out_leases(inode, &dispose);
    1698           0 :                 if (any_leases_conflict(inode, new_fl))
    1699           0 :                         goto restart;
    1700             :                 error = 0;
    1701             :         }
    1702           0 : out:
    1703           0 :         spin_unlock(&ctx->flc_lock);
    1704           0 :         percpu_up_read(&file_rwsem);
    1705           0 :         locks_dispose_list(&dispose);
    1706           0 : free_lock:
    1707           0 :         locks_free_lock(new_fl);
    1708           0 :         return error;
    1709             : }
    1710             : EXPORT_SYMBOL(__break_lease);
    1711             : 
    1712             : /**
    1713             :  *      lease_get_mtime - update modified time of an inode with exclusive lease
    1714             :  *      @inode: the inode
    1715             :  *      @time:  pointer to a timespec which contains the last modified time
    1716             :  *
    1717             :  * This is to force NFS clients to flush their caches for files with
    1718             :  * exclusive leases.  The justification is that if someone has an
    1719             :  * exclusive lease, then they could be modifying it.
    1720             :  */
    1721           0 : void lease_get_mtime(struct inode *inode, struct timespec64 *time)
    1722             : {
    1723           0 :         bool has_lease = false;
    1724           0 :         struct file_lock_context *ctx;
    1725           0 :         struct file_lock *fl;
    1726             : 
    1727           0 :         ctx = smp_load_acquire(&inode->i_flctx);
    1728           0 :         if (ctx && !list_empty_careful(&ctx->flc_lease)) {
    1729           0 :                 spin_lock(&ctx->flc_lock);
    1730           0 :                 fl = list_first_entry_or_null(&ctx->flc_lease,
    1731             :                                               struct file_lock, fl_list);
    1732           0 :                 if (fl && (fl->fl_type == F_WRLCK))
    1733           0 :                         has_lease = true;
    1734           0 :                 spin_unlock(&ctx->flc_lock);
    1735             :         }
    1736             : 
    1737           0 :         if (has_lease)
    1738           0 :                 *time = current_time(inode);
    1739           0 : }
    1740             : EXPORT_SYMBOL(lease_get_mtime);
    1741             : 
    1742             : /**
    1743             :  *      fcntl_getlease - Enquire what lease is currently active
    1744             :  *      @filp: the file
    1745             :  *
    1746             :  *      The value returned by this function will be one of
    1747             :  *      (if no lease break is pending):
    1748             :  *
    1749             :  *      %F_RDLCK to indicate a shared lease is held.
    1750             :  *
    1751             :  *      %F_WRLCK to indicate an exclusive lease is held.
    1752             :  *
    1753             :  *      %F_UNLCK to indicate no lease is held.
    1754             :  *
    1755             :  *      (if a lease break is pending):
    1756             :  *
    1757             :  *      %F_RDLCK to indicate an exclusive lease needs to be
    1758             :  *              changed to a shared lease (or removed).
    1759             :  *
    1760             :  *      %F_UNLCK to indicate the lease needs to be removed.
    1761             :  *
    1762             :  *      XXX: sfr & willy disagree over whether F_INPROGRESS
    1763             :  *      should be returned to userspace.
    1764             :  */
    1765           0 : int fcntl_getlease(struct file *filp)
    1766             : {
    1767           0 :         struct file_lock *fl;
    1768           0 :         struct inode *inode = locks_inode(filp);
    1769           0 :         struct file_lock_context *ctx;
    1770           0 :         int type = F_UNLCK;
    1771           0 :         LIST_HEAD(dispose);
    1772             : 
    1773           0 :         ctx = smp_load_acquire(&inode->i_flctx);
    1774           0 :         if (ctx && !list_empty_careful(&ctx->flc_lease)) {
    1775           0 :                 percpu_down_read(&file_rwsem);
    1776           0 :                 spin_lock(&ctx->flc_lock);
    1777           0 :                 time_out_leases(inode, &dispose);
    1778           0 :                 list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
    1779           0 :                         if (fl->fl_file != filp)
    1780           0 :                                 continue;
    1781           0 :                         type = target_leasetype(fl);
    1782             :                         break;
    1783             :                 }
    1784           0 :                 spin_unlock(&ctx->flc_lock);
    1785           0 :                 percpu_up_read(&file_rwsem);
    1786             : 
    1787           0 :                 locks_dispose_list(&dispose);
    1788             :         }
    1789           0 :         return type;
    1790             : }
    1791             : 
    1792             : /**
    1793             :  * check_conflicting_open - see if the given file points to an inode that has
    1794             :  *                          an existing open that would conflict with the
    1795             :  *                          desired lease.
    1796             :  * @filp:       file to check
    1797             :  * @arg:        type of lease that we're trying to acquire
    1798             :  * @flags:      current lock flags
    1799             :  *
    1800             :  * Check to see if there's an existing open fd on this file that would
    1801             :  * conflict with the lease we're trying to set.
    1802             :  */
    1803             : static int
    1804           0 : check_conflicting_open(struct file *filp, const long arg, int flags)
    1805             : {
    1806           0 :         struct inode *inode = locks_inode(filp);
    1807           0 :         int self_wcount = 0, self_rcount = 0;
    1808             : 
    1809           0 :         if (flags & FL_LAYOUT)
    1810             :                 return 0;
    1811           0 :         if (flags & FL_DELEG)
    1812             :                 /* We leave these checks to the caller. */
    1813             :                 return 0;
    1814             : 
    1815           0 :         if (arg == F_RDLCK)
    1816           0 :                 return inode_is_open_for_write(inode) ? -EAGAIN : 0;
    1817           0 :         else if (arg != F_WRLCK)
    1818             :                 return 0;
    1819             : 
    1820             :         /*
    1821             :          * Make sure that only read/write count is from lease requestor.
    1822             :          * Note that this will result in denying write leases when i_writecount
    1823             :          * is negative, which is what we want.  (We shouldn't grant write leases
    1824             :          * on files open for execution.)
    1825             :          */
    1826           0 :         if (filp->f_mode & FMODE_WRITE)
    1827             :                 self_wcount = 1;
    1828           0 :         else if (filp->f_mode & FMODE_READ)
    1829             :                 self_rcount = 1;
    1830             : 
    1831           0 :         if (atomic_read(&inode->i_writecount) != self_wcount ||
    1832           0 :             atomic_read(&inode->i_readcount) != self_rcount)
    1833           0 :                 return -EAGAIN;
    1834             : 
    1835             :         return 0;
    1836             : }
    1837             : 
    1838             : static int
    1839           0 : generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **priv)
    1840             : {
    1841           0 :         struct file_lock *fl, *my_fl = NULL, *lease;
    1842           0 :         struct inode *inode = locks_inode(filp);
    1843           0 :         struct file_lock_context *ctx;
    1844           0 :         bool is_deleg = (*flp)->fl_flags & FL_DELEG;
    1845           0 :         int error;
    1846           0 :         LIST_HEAD(dispose);
    1847             : 
    1848           0 :         lease = *flp;
    1849           0 :         trace_generic_add_lease(inode, lease);
    1850             : 
    1851             :         /* Note that arg is never F_UNLCK here */
    1852           0 :         ctx = locks_get_lock_context(inode, arg);
    1853           0 :         if (!ctx)
    1854             :                 return -ENOMEM;
    1855             : 
    1856             :         /*
    1857             :          * In the delegation case we need mutual exclusion with
    1858             :          * a number of operations that take the i_mutex.  We trylock
    1859             :          * because delegations are an optional optimization, and if
    1860             :          * there's some chance of a conflict--we'd rather not
    1861             :          * bother, maybe that's a sign this just isn't a good file to
    1862             :          * hand out a delegation on.
    1863             :          */
    1864           0 :         if (is_deleg && !inode_trylock(inode))
    1865             :                 return -EAGAIN;
    1866             : 
    1867           0 :         if (is_deleg && arg == F_WRLCK) {
    1868             :                 /* Write delegations are not currently supported: */
    1869           0 :                 inode_unlock(inode);
    1870           0 :                 WARN_ON_ONCE(1);
    1871           0 :                 return -EINVAL;
    1872             :         }
    1873             : 
    1874           0 :         percpu_down_read(&file_rwsem);
    1875           0 :         spin_lock(&ctx->flc_lock);
    1876           0 :         time_out_leases(inode, &dispose);
    1877           0 :         error = check_conflicting_open(filp, arg, lease->fl_flags);
    1878           0 :         if (error)
    1879           0 :                 goto out;
    1880             : 
    1881             :         /*
    1882             :          * At this point, we know that if there is an exclusive
    1883             :          * lease on this file, then we hold it on this filp
    1884             :          * (otherwise our open of this file would have blocked).
    1885             :          * And if we are trying to acquire an exclusive lease,
    1886             :          * then the file is not open by anyone (including us)
    1887             :          * except for this filp.
    1888             :          */
    1889           0 :         error = -EAGAIN;
    1890           0 :         list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
    1891           0 :                 if (fl->fl_file == filp &&
    1892           0 :                     fl->fl_owner == lease->fl_owner) {
    1893           0 :                         my_fl = fl;
    1894           0 :                         continue;
    1895             :                 }
    1896             : 
    1897             :                 /*
    1898             :                  * No exclusive leases if someone else has a lease on
    1899             :                  * this file:
    1900             :                  */
    1901           0 :                 if (arg == F_WRLCK)
    1902           0 :                         goto out;
    1903             :                 /*
    1904             :                  * Modifying our existing lease is OK, but no getting a
    1905             :                  * new lease if someone else is opening for write:
    1906             :                  */
    1907           0 :                 if (fl->fl_flags & FL_UNLOCK_PENDING)
    1908           0 :                         goto out;
    1909             :         }
    1910             : 
    1911           0 :         if (my_fl != NULL) {
    1912           0 :                 lease = my_fl;
    1913           0 :                 error = lease->fl_lmops->lm_change(lease, arg, &dispose);
    1914           0 :                 if (error)
    1915           0 :                         goto out;
    1916           0 :                 goto out_setup;
    1917             :         }
    1918             : 
    1919           0 :         error = -EINVAL;
    1920           0 :         if (!leases_enable)
    1921           0 :                 goto out;
    1922             : 
    1923           0 :         locks_insert_lock_ctx(lease, &ctx->flc_lease);
    1924             :         /*
    1925             :          * The check in break_lease() is lockless. It's possible for another
    1926             :          * open to race in after we did the earlier check for a conflicting
    1927             :          * open but before the lease was inserted. Check again for a
    1928             :          * conflicting open and cancel the lease if there is one.
    1929             :          *
    1930             :          * We also add a barrier here to ensure that the insertion of the lock
    1931             :          * precedes these checks.
    1932             :          */
    1933           0 :         smp_mb();
    1934           0 :         error = check_conflicting_open(filp, arg, lease->fl_flags);
    1935           0 :         if (error) {
    1936           0 :                 locks_unlink_lock_ctx(lease);
    1937           0 :                 goto out;
    1938             :         }
    1939             : 
    1940           0 : out_setup:
    1941           0 :         if (lease->fl_lmops->lm_setup)
    1942           0 :                 lease->fl_lmops->lm_setup(lease, priv);
    1943           0 : out:
    1944           0 :         spin_unlock(&ctx->flc_lock);
    1945           0 :         percpu_up_read(&file_rwsem);
    1946           0 :         locks_dispose_list(&dispose);
    1947           0 :         if (is_deleg)
    1948           0 :                 inode_unlock(inode);
    1949           0 :         if (!error && !my_fl)
    1950           0 :                 *flp = NULL;
    1951             :         return error;
    1952             : }
    1953             : 
    1954           0 : static int generic_delete_lease(struct file *filp, void *owner)
    1955             : {
    1956           0 :         int error = -EAGAIN;
    1957           0 :         struct file_lock *fl, *victim = NULL;
    1958           0 :         struct inode *inode = locks_inode(filp);
    1959           0 :         struct file_lock_context *ctx;
    1960           0 :         LIST_HEAD(dispose);
    1961             : 
    1962           0 :         ctx = smp_load_acquire(&inode->i_flctx);
    1963           0 :         if (!ctx) {
    1964           0 :                 trace_generic_delete_lease(inode, NULL);
    1965           0 :                 return error;
    1966             :         }
    1967             : 
    1968           0 :         percpu_down_read(&file_rwsem);
    1969           0 :         spin_lock(&ctx->flc_lock);
    1970           0 :         list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
    1971           0 :                 if (fl->fl_file == filp &&
    1972           0 :                     fl->fl_owner == owner) {
    1973             :                         victim = fl;
    1974             :                         break;
    1975             :                 }
    1976             :         }
    1977           0 :         trace_generic_delete_lease(inode, victim);
    1978           0 :         if (victim)
    1979           0 :                 error = fl->fl_lmops->lm_change(victim, F_UNLCK, &dispose);
    1980           0 :         spin_unlock(&ctx->flc_lock);
    1981           0 :         percpu_up_read(&file_rwsem);
    1982           0 :         locks_dispose_list(&dispose);
    1983           0 :         return error;
    1984             : }
    1985             : 
    1986             : /**
    1987             :  *      generic_setlease        -       sets a lease on an open file
    1988             :  *      @filp:  file pointer
    1989             :  *      @arg:   type of lease to obtain
    1990             :  *      @flp:   input - file_lock to use, output - file_lock inserted
    1991             :  *      @priv:  private data for lm_setup (may be NULL if lm_setup
    1992             :  *              doesn't require it)
    1993             :  *
    1994             :  *      The (input) flp->fl_lmops->lm_break function is required
    1995             :  *      by break_lease().
    1996             :  */
    1997           0 : int generic_setlease(struct file *filp, long arg, struct file_lock **flp,
    1998             :                         void **priv)
    1999             : {
    2000           0 :         struct inode *inode = locks_inode(filp);
    2001           0 :         int error;
    2002             : 
    2003           0 :         if ((!uid_eq(current_fsuid(), inode->i_uid)) && !capable(CAP_LEASE))
    2004             :                 return -EACCES;
    2005           0 :         if (!S_ISREG(inode->i_mode))
    2006             :                 return -EINVAL;
    2007           0 :         error = security_file_lock(filp, arg);
    2008           0 :         if (error)
    2009             :                 return error;
    2010             : 
    2011           0 :         switch (arg) {
    2012           0 :         case F_UNLCK:
    2013           0 :                 return generic_delete_lease(filp, *priv);
    2014           0 :         case F_RDLCK:
    2015             :         case F_WRLCK:
    2016           0 :                 if (!(*flp)->fl_lmops->lm_break) {
    2017           0 :                         WARN_ON_ONCE(1);
    2018           0 :                         return -ENOLCK;
    2019             :                 }
    2020             : 
    2021           0 :                 return generic_add_lease(filp, arg, flp, priv);
    2022             :         default:
    2023             :                 return -EINVAL;
    2024             :         }
    2025             : }
    2026             : EXPORT_SYMBOL(generic_setlease);
    2027             : 
    2028             : #if IS_ENABLED(CONFIG_SRCU)
    2029             : /*
    2030             :  * Kernel subsystems can register to be notified on any attempt to set
    2031             :  * a new lease with the lease_notifier_chain. This is used by (e.g.) nfsd
    2032             :  * to close files that it may have cached when there is an attempt to set a
    2033             :  * conflicting lease.
    2034             :  */
    2035             : static struct srcu_notifier_head lease_notifier_chain;
    2036             : 
    2037             : static inline void
    2038           1 : lease_notifier_chain_init(void)
    2039             : {
    2040           1 :         srcu_init_notifier_head(&lease_notifier_chain);
    2041             : }
    2042             : 
    2043             : static inline void
    2044           0 : setlease_notifier(long arg, struct file_lock *lease)
    2045             : {
    2046           0 :         if (arg != F_UNLCK)
    2047           0 :                 srcu_notifier_call_chain(&lease_notifier_chain, arg, lease);
    2048             : }
    2049             : 
    2050           0 : int lease_register_notifier(struct notifier_block *nb)
    2051             : {
    2052           0 :         return srcu_notifier_chain_register(&lease_notifier_chain, nb);
    2053             : }
    2054             : EXPORT_SYMBOL_GPL(lease_register_notifier);
    2055             : 
    2056           0 : void lease_unregister_notifier(struct notifier_block *nb)
    2057             : {
    2058           0 :         srcu_notifier_chain_unregister(&lease_notifier_chain, nb);
    2059           0 : }
    2060             : EXPORT_SYMBOL_GPL(lease_unregister_notifier);
    2061             : 
    2062             : #else /* !IS_ENABLED(CONFIG_SRCU) */
    2063             : static inline void
    2064             : lease_notifier_chain_init(void)
    2065             : {
    2066             : }
    2067             : 
    2068             : static inline void
    2069             : setlease_notifier(long arg, struct file_lock *lease)
    2070             : {
    2071             : }
    2072             : 
    2073             : int lease_register_notifier(struct notifier_block *nb)
    2074             : {
    2075             :         return 0;
    2076             : }
    2077             : EXPORT_SYMBOL_GPL(lease_register_notifier);
    2078             : 
    2079             : void lease_unregister_notifier(struct notifier_block *nb)
    2080             : {
    2081             : }
    2082             : EXPORT_SYMBOL_GPL(lease_unregister_notifier);
    2083             : 
    2084             : #endif /* IS_ENABLED(CONFIG_SRCU) */
    2085             : 
    2086             : /**
    2087             :  * vfs_setlease        -       sets a lease on an open file
    2088             :  * @filp:       file pointer
    2089             :  * @arg:        type of lease to obtain
    2090             :  * @lease:      file_lock to use when adding a lease
    2091             :  * @priv:       private info for lm_setup when adding a lease (may be
    2092             :  *              NULL if lm_setup doesn't require it)
    2093             :  *
    2094             :  * Call this to establish a lease on the file. The "lease" argument is not
    2095             :  * used for F_UNLCK requests and may be NULL. For commands that set or alter
    2096             :  * an existing lease, the ``(*lease)->fl_lmops->lm_break`` operation must be
    2097             :  * set; if not, this function will return -ENOLCK (and generate a scary-looking
    2098             :  * stack trace).
    2099             :  *
    2100             :  * The "priv" pointer is passed directly to the lm_setup function as-is. It
    2101             :  * may be NULL if the lm_setup operation doesn't require it.
    2102             :  */
    2103             : int
    2104           0 : vfs_setlease(struct file *filp, long arg, struct file_lock **lease, void **priv)
    2105             : {
    2106           0 :         if (lease)
    2107           0 :                 setlease_notifier(arg, *lease);
    2108           0 :         if (filp->f_op->setlease)
    2109           0 :                 return filp->f_op->setlease(filp, arg, lease, priv);
    2110             :         else
    2111           0 :                 return generic_setlease(filp, arg, lease, priv);
    2112             : }
    2113             : EXPORT_SYMBOL_GPL(vfs_setlease);
    2114             : 
    2115           0 : static int do_fcntl_add_lease(unsigned int fd, struct file *filp, long arg)
    2116             : {
    2117           0 :         struct file_lock *fl;
    2118           0 :         struct fasync_struct *new;
    2119           0 :         int error;
    2120             : 
    2121           0 :         fl = lease_alloc(filp, arg);
    2122           0 :         if (IS_ERR(fl))
    2123           0 :                 return PTR_ERR(fl);
    2124             : 
    2125           0 :         new = fasync_alloc();
    2126           0 :         if (!new) {
    2127           0 :                 locks_free_lock(fl);
    2128           0 :                 return -ENOMEM;
    2129             :         }
    2130           0 :         new->fa_fd = fd;
    2131             : 
    2132           0 :         error = vfs_setlease(filp, arg, &fl, (void **)&new);
    2133           0 :         if (fl)
    2134           0 :                 locks_free_lock(fl);
    2135           0 :         if (new)
    2136           0 :                 fasync_free(new);
    2137             :         return error;
    2138             : }
    2139             : 
    2140             : /**
    2141             :  *      fcntl_setlease  -       sets a lease on an open file
    2142             :  *      @fd: open file descriptor
    2143             :  *      @filp: file pointer
    2144             :  *      @arg: type of lease to obtain
    2145             :  *
    2146             :  *      Call this fcntl to establish a lease on the file.
    2147             :  *      Note that you also need to call %F_SETSIG to
    2148             :  *      receive a signal when the lease is broken.
    2149             :  */
    2150           0 : int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
    2151             : {
    2152           0 :         if (arg == F_UNLCK)
    2153           0 :                 return vfs_setlease(filp, F_UNLCK, NULL, (void **)&filp);
    2154           0 :         return do_fcntl_add_lease(fd, filp, arg);
    2155             : }
    2156             : 
    2157             : /**
    2158             :  * flock_lock_inode_wait - Apply a FLOCK-style lock to a file
    2159             :  * @inode: inode of the file to apply to
    2160             :  * @fl: The lock to be applied
    2161             :  *
    2162             :  * Apply a FLOCK style lock request to an inode.
    2163             :  */
    2164         150 : static int flock_lock_inode_wait(struct inode *inode, struct file_lock *fl)
    2165             : {
    2166         150 :         int error;
    2167         150 :         might_sleep();
    2168         150 :         for (;;) {
    2169         300 :                 error = flock_lock_inode(inode, fl);
    2170         150 :                 if (error != FILE_LOCK_DEFERRED)
    2171             :                         break;
    2172         150 :                 error = wait_event_interruptible(fl->fl_wait,
    2173             :                                 list_empty(&fl->fl_blocked_member));
    2174           0 :                 if (error)
    2175             :                         break;
    2176             :         }
    2177         150 :         locks_delete_block(fl);
    2178         150 :         return error;
    2179             : }
    2180             : 
    2181             : /**
    2182             :  * locks_lock_inode_wait - Apply a lock to an inode
    2183             :  * @inode: inode of the file to apply to
    2184             :  * @fl: The lock to be applied
    2185             :  *
    2186             :  * Apply a POSIX or FLOCK style lock request to an inode.
    2187             :  */
    2188         150 : int locks_lock_inode_wait(struct inode *inode, struct file_lock *fl)
    2189             : {
    2190         150 :         int res = 0;
    2191         150 :         switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
    2192           0 :                 case FL_POSIX:
    2193           0 :                         res = posix_lock_inode_wait(inode, fl);
    2194           0 :                         break;
    2195         150 :                 case FL_FLOCK:
    2196         150 :                         res = flock_lock_inode_wait(inode, fl);
    2197         150 :                         break;
    2198           0 :                 default:
    2199           0 :                         BUG();
    2200             :         }
    2201         150 :         return res;
    2202             : }
    2203             : EXPORT_SYMBOL(locks_lock_inode_wait);
    2204             : 
    2205             : /**
    2206             :  *      sys_flock: - flock() system call.
    2207             :  *      @fd: the file descriptor to lock.
    2208             :  *      @cmd: the type of lock to apply.
    2209             :  *
    2210             :  *      Apply a %FL_FLOCK style lock to an open file descriptor.
    2211             :  *      The @cmd can be one of:
    2212             :  *
    2213             :  *      - %LOCK_SH -- a shared lock.
    2214             :  *      - %LOCK_EX -- an exclusive lock.
    2215             :  *      - %LOCK_UN -- remove an existing lock.
    2216             :  *      - %LOCK_MAND -- a 'mandatory' flock.
    2217             :  *        This exists to emulate Windows Share Modes.
    2218             :  *
    2219             :  *      %LOCK_MAND can be combined with %LOCK_READ or %LOCK_WRITE to allow other
    2220             :  *      processes read and write access respectively.
    2221             :  */
    2222         300 : SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
    2223             : {
    2224         150 :         struct fd f = fdget(fd);
    2225         150 :         struct file_lock *lock;
    2226         150 :         int can_sleep, unlock;
    2227         150 :         int error;
    2228             : 
    2229         150 :         error = -EBADF;
    2230         150 :         if (!f.file)
    2231           0 :                 goto out;
    2232             : 
    2233         150 :         can_sleep = !(cmd & LOCK_NB);
    2234         150 :         cmd &= ~LOCK_NB;
    2235         150 :         unlock = (cmd == LOCK_UN);
    2236             : 
    2237         150 :         if (!unlock && !(cmd & LOCK_MAND) &&
    2238          96 :             !(f.file->f_mode & (FMODE_READ|FMODE_WRITE)))
    2239           0 :                 goto out_putf;
    2240             : 
    2241         150 :         lock = flock_make_lock(f.file, cmd, NULL);
    2242         150 :         if (IS_ERR(lock)) {
    2243           0 :                 error = PTR_ERR(lock);
    2244           0 :                 goto out_putf;
    2245             :         }
    2246             : 
    2247         150 :         if (can_sleep)
    2248          57 :                 lock->fl_flags |= FL_SLEEP;
    2249             : 
    2250         150 :         error = security_file_lock(f.file, lock->fl_type);
    2251         150 :         if (error)
    2252           0 :                 goto out_free;
    2253             : 
    2254         150 :         if (f.file->f_op->flock)
    2255           0 :                 error = f.file->f_op->flock(f.file,
    2256             :                                           (can_sleep) ? F_SETLKW : F_SETLK,
    2257             :                                           lock);
    2258             :         else
    2259         150 :                 error = locks_lock_file_wait(f.file, lock);
    2260             : 
    2261         150 :  out_free:
    2262         150 :         locks_free_lock(lock);
    2263             : 
    2264         150 :  out_putf:
    2265         150 :         fdput(f);
    2266         150 :  out:
    2267         150 :         return error;
    2268             : }
    2269             : 
    2270             : /**
    2271             :  * vfs_test_lock - test file byte range lock
    2272             :  * @filp: The file to test lock for
    2273             :  * @fl: The lock to test; also used to hold result
    2274             :  *
    2275             :  * Returns -ERRNO on failure.  Indicates presence of conflicting lock by
    2276             :  * setting conf->fl_type to something other than F_UNLCK.
    2277             :  */
    2278           0 : int vfs_test_lock(struct file *filp, struct file_lock *fl)
    2279             : {
    2280           0 :         if (filp->f_op->lock)
    2281           0 :                 return filp->f_op->lock(filp, F_GETLK, fl);
    2282           0 :         posix_test_lock(filp, fl);
    2283           0 :         return 0;
    2284             : }
    2285             : EXPORT_SYMBOL_GPL(vfs_test_lock);
    2286             : 
    2287             : /**
    2288             :  * locks_translate_pid - translate a file_lock's fl_pid number into a namespace
    2289             :  * @fl: The file_lock who's fl_pid should be translated
    2290             :  * @ns: The namespace into which the pid should be translated
    2291             :  *
    2292             :  * Used to tranlate a fl_pid into a namespace virtual pid number
    2293             :  */
    2294           0 : static pid_t locks_translate_pid(struct file_lock *fl, struct pid_namespace *ns)
    2295             : {
    2296           0 :         pid_t vnr;
    2297           0 :         struct pid *pid;
    2298             : 
    2299           0 :         if (IS_OFDLCK(fl))
    2300             :                 return -1;
    2301           0 :         if (IS_REMOTELCK(fl))
    2302             :                 return fl->fl_pid;
    2303             :         /*
    2304             :          * If the flock owner process is dead and its pid has been already
    2305             :          * freed, the translation below won't work, but we still want to show
    2306             :          * flock owner pid number in init pidns.
    2307             :          */
    2308           0 :         if (ns == &init_pid_ns)
    2309           0 :                 return (pid_t)fl->fl_pid;
    2310             : 
    2311           0 :         rcu_read_lock();
    2312           0 :         pid = find_pid_ns(fl->fl_pid, &init_pid_ns);
    2313           0 :         vnr = pid_nr_ns(pid, ns);
    2314           0 :         rcu_read_unlock();
    2315           0 :         return vnr;
    2316             : }
    2317             : 
    2318           0 : static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl)
    2319             : {
    2320           0 :         flock->l_pid = locks_translate_pid(fl, task_active_pid_ns(current));
    2321             : #if BITS_PER_LONG == 32
    2322             :         /*
    2323             :          * Make sure we can represent the posix lock via
    2324             :          * legacy 32bit flock.
    2325             :          */
    2326             :         if (fl->fl_start > OFFT_OFFSET_MAX)
    2327             :                 return -EOVERFLOW;
    2328             :         if (fl->fl_end != OFFSET_MAX && fl->fl_end > OFFT_OFFSET_MAX)
    2329             :                 return -EOVERFLOW;
    2330             : #endif
    2331           0 :         flock->l_start = fl->fl_start;
    2332           0 :         flock->l_len = fl->fl_end == OFFSET_MAX ? 0 :
    2333           0 :                 fl->fl_end - fl->fl_start + 1;
    2334           0 :         flock->l_whence = 0;
    2335           0 :         flock->l_type = fl->fl_type;
    2336           0 :         return 0;
    2337             : }
    2338             : 
    2339             : #if BITS_PER_LONG == 32
    2340             : static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)
    2341             : {
    2342             :         flock->l_pid = locks_translate_pid(fl, task_active_pid_ns(current));
    2343             :         flock->l_start = fl->fl_start;
    2344             :         flock->l_len = fl->fl_end == OFFSET_MAX ? 0 :
    2345             :                 fl->fl_end - fl->fl_start + 1;
    2346             :         flock->l_whence = 0;
    2347             :         flock->l_type = fl->fl_type;
    2348             : }
    2349             : #endif
    2350             : 
    2351             : /* Report the first existing lock that would conflict with l.
    2352             :  * This implements the F_GETLK command of fcntl().
    2353             :  */
    2354           0 : int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock)
    2355             : {
    2356           0 :         struct file_lock *fl;
    2357           0 :         int error;
    2358             : 
    2359           0 :         fl = locks_alloc_lock();
    2360           0 :         if (fl == NULL)
    2361             :                 return -ENOMEM;
    2362           0 :         error = -EINVAL;
    2363           0 :         if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK)
    2364           0 :                 goto out;
    2365             : 
    2366           0 :         error = flock_to_posix_lock(filp, fl, flock);
    2367           0 :         if (error)
    2368           0 :                 goto out;
    2369             : 
    2370           0 :         if (cmd == F_OFD_GETLK) {
    2371           0 :                 error = -EINVAL;
    2372           0 :                 if (flock->l_pid != 0)
    2373           0 :                         goto out;
    2374             : 
    2375           0 :                 cmd = F_GETLK;
    2376           0 :                 fl->fl_flags |= FL_OFDLCK;
    2377           0 :                 fl->fl_owner = filp;
    2378             :         }
    2379             : 
    2380           0 :         error = vfs_test_lock(filp, fl);
    2381           0 :         if (error)
    2382           0 :                 goto out;
    2383             : 
    2384           0 :         flock->l_type = fl->fl_type;
    2385           0 :         if (fl->fl_type != F_UNLCK) {
    2386           0 :                 error = posix_lock_to_flock(flock, fl);
    2387           0 :                 if (error)
    2388           0 :                         goto out;
    2389             :         }
    2390           0 : out:
    2391           0 :         locks_free_lock(fl);
    2392           0 :         return error;
    2393             : }
    2394             : 
    2395             : /**
    2396             :  * vfs_lock_file - file byte range lock
    2397             :  * @filp: The file to apply the lock to
    2398             :  * @cmd: type of locking operation (F_SETLK, F_GETLK, etc.)
    2399             :  * @fl: The lock to be applied
    2400             :  * @conf: Place to return a copy of the conflicting lock, if found.
    2401             :  *
    2402             :  * A caller that doesn't care about the conflicting lock may pass NULL
    2403             :  * as the final argument.
    2404             :  *
    2405             :  * If the filesystem defines a private ->lock() method, then @conf will
    2406             :  * be left unchanged; so a caller that cares should initialize it to
    2407             :  * some acceptable default.
    2408             :  *
    2409             :  * To avoid blocking kernel daemons, such as lockd, that need to acquire POSIX
    2410             :  * locks, the ->lock() interface may return asynchronously, before the lock has
    2411             :  * been granted or denied by the underlying filesystem, if (and only if)
    2412             :  * lm_grant is set. Callers expecting ->lock() to return asynchronously
    2413             :  * will only use F_SETLK, not F_SETLKW; they will set FL_SLEEP if (and only if)
    2414             :  * the request is for a blocking lock. When ->lock() does return asynchronously,
    2415             :  * it must return FILE_LOCK_DEFERRED, and call ->lm_grant() when the lock
    2416             :  * request completes.
    2417             :  * If the request is for non-blocking lock the file system should return
    2418             :  * FILE_LOCK_DEFERRED then try to get the lock and call the callback routine
    2419             :  * with the result. If the request timed out the callback routine will return a
    2420             :  * nonzero return code and the file system should release the lock. The file
    2421             :  * system is also responsible to keep a corresponding posix lock when it
    2422             :  * grants a lock so the VFS can find out which locks are locally held and do
    2423             :  * the correct lock cleanup when required.
    2424             :  * The underlying filesystem must not drop the kernel lock or call
    2425             :  * ->lm_grant() before returning to the caller with a FILE_LOCK_DEFERRED
    2426             :  * return code.
    2427             :  */
    2428         134 : int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl, struct file_lock *conf)
    2429             : {
    2430         134 :         if (filp->f_op->lock)
    2431           0 :                 return filp->f_op->lock(filp, cmd, fl);
    2432             :         else
    2433         134 :                 return posix_lock_file(filp, fl, conf);
    2434             : }
    2435             : EXPORT_SYMBOL_GPL(vfs_lock_file);
    2436             : 
    2437          90 : static int do_lock_file_wait(struct file *filp, unsigned int cmd,
    2438             :                              struct file_lock *fl)
    2439             : {
    2440          90 :         int error;
    2441             : 
    2442          90 :         error = security_file_lock(filp, fl->fl_type);
    2443          90 :         if (error)
    2444             :                 return error;
    2445             : 
    2446          92 :         for (;;) {
    2447         184 :                 error = vfs_lock_file(filp, cmd, fl, NULL);
    2448          92 :                 if (error != FILE_LOCK_DEFERRED)
    2449             :                         break;
    2450          96 :                 error = wait_event_interruptible(fl->fl_wait,
    2451             :                                         list_empty(&fl->fl_blocked_member));
    2452           2 :                 if (error)
    2453             :                         break;
    2454             :         }
    2455          90 :         locks_delete_block(fl);
    2456             : 
    2457          90 :         return error;
    2458             : }
    2459             : 
    2460             : /* Ensure that fl->fl_file has compatible f_mode for F_SETLK calls */
    2461             : static int
    2462          90 : check_fmode_for_setlk(struct file_lock *fl)
    2463             : {
    2464          90 :         switch (fl->fl_type) {
    2465          33 :         case F_RDLCK:
    2466          33 :                 if (!(fl->fl_file->f_mode & FMODE_READ))
    2467           0 :                         return -EBADF;
    2468             :                 break;
    2469          26 :         case F_WRLCK:
    2470          26 :                 if (!(fl->fl_file->f_mode & FMODE_WRITE))
    2471           0 :                         return -EBADF;
    2472             :         }
    2473             :         return 0;
    2474             : }
    2475             : 
    2476             : /* Apply the lock described by l to an open file descriptor.
    2477             :  * This implements both the F_SETLK and F_SETLKW commands of fcntl().
    2478             :  */
    2479          90 : int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
    2480             :                 struct flock *flock)
    2481             : {
    2482          90 :         struct file_lock *file_lock = locks_alloc_lock();
    2483          90 :         struct inode *inode = locks_inode(filp);
    2484          90 :         struct file *f;
    2485          90 :         int error;
    2486             : 
    2487          90 :         if (file_lock == NULL)
    2488             :                 return -ENOLCK;
    2489             : 
    2490             :         /* Don't allow mandatory locks on files that may be memory mapped
    2491             :          * and shared.
    2492             :          */
    2493          90 :         if (mandatory_lock(inode) && mapping_writably_mapped(filp->f_mapping)) {
    2494             :                 error = -EAGAIN;
    2495             :                 goto out;
    2496             :         }
    2497             : 
    2498          90 :         error = flock_to_posix_lock(filp, file_lock, flock);
    2499          90 :         if (error)
    2500           0 :                 goto out;
    2501             : 
    2502          90 :         error = check_fmode_for_setlk(file_lock);
    2503          90 :         if (error)
    2504           0 :                 goto out;
    2505             : 
    2506             :         /*
    2507             :          * If the cmd is requesting file-private locks, then set the
    2508             :          * FL_OFDLCK flag and override the owner.
    2509             :          */
    2510          90 :         switch (cmd) {
    2511           0 :         case F_OFD_SETLK:
    2512           0 :                 error = -EINVAL;
    2513           0 :                 if (flock->l_pid != 0)
    2514           0 :                         goto out;
    2515             : 
    2516           0 :                 cmd = F_SETLK;
    2517           0 :                 file_lock->fl_flags |= FL_OFDLCK;
    2518           0 :                 file_lock->fl_owner = filp;
    2519           0 :                 break;
    2520           0 :         case F_OFD_SETLKW:
    2521           0 :                 error = -EINVAL;
    2522           0 :                 if (flock->l_pid != 0)
    2523           0 :                         goto out;
    2524             : 
    2525           0 :                 cmd = F_SETLKW;
    2526           0 :                 file_lock->fl_flags |= FL_OFDLCK;
    2527           0 :                 file_lock->fl_owner = filp;
    2528          71 :                 fallthrough;
    2529          71 :         case F_SETLKW:
    2530          71 :                 file_lock->fl_flags |= FL_SLEEP;
    2531             :         }
    2532             : 
    2533          90 :         error = do_lock_file_wait(filp, cmd, file_lock);
    2534             : 
    2535             :         /*
    2536             :          * Attempt to detect a close/fcntl race and recover by releasing the
    2537             :          * lock that was just acquired. There is no need to do that when we're
    2538             :          * unlocking though, or for OFD locks.
    2539             :          */
    2540          90 :         if (!error && file_lock->fl_type != F_UNLCK &&
    2541          59 :             !(file_lock->fl_flags & FL_OFDLCK)) {
    2542          59 :                 struct files_struct *files = current->files;
    2543             :                 /*
    2544             :                  * We need that spin_lock here - it prevents reordering between
    2545             :                  * update of i_flctx->flc_posix and check for it done in
    2546             :                  * close(). rcu_read_lock() wouldn't do.
    2547             :                  */
    2548          59 :                 spin_lock(&files->file_lock);
    2549          59 :                 f = files_lookup_fd_locked(files, fd);
    2550          59 :                 spin_unlock(&files->file_lock);
    2551          59 :                 if (f != filp) {
    2552           0 :                         file_lock->fl_type = F_UNLCK;
    2553           0 :                         error = do_lock_file_wait(filp, cmd, file_lock);
    2554           0 :                         WARN_ON_ONCE(error);
    2555             :                         error = -EBADF;
    2556             :                 }
    2557             :         }
    2558          90 : out:
    2559          90 :         trace_fcntl_setlk(inode, file_lock, error);
    2560          90 :         locks_free_lock(file_lock);
    2561          90 :         return error;
    2562             : }
    2563             : 
    2564             : #if BITS_PER_LONG == 32
    2565             : /* Report the first existing lock that would conflict with l.
    2566             :  * This implements the F_GETLK command of fcntl().
    2567             :  */
    2568             : int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 *flock)
    2569             : {
    2570             :         struct file_lock *fl;
    2571             :         int error;
    2572             : 
    2573             :         fl = locks_alloc_lock();
    2574             :         if (fl == NULL)
    2575             :                 return -ENOMEM;
    2576             : 
    2577             :         error = -EINVAL;
    2578             :         if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK)
    2579             :                 goto out;
    2580             : 
    2581             :         error = flock64_to_posix_lock(filp, fl, flock);
    2582             :         if (error)
    2583             :                 goto out;
    2584             : 
    2585             :         if (cmd == F_OFD_GETLK) {
    2586             :                 error = -EINVAL;
    2587             :                 if (flock->l_pid != 0)
    2588             :                         goto out;
    2589             : 
    2590             :                 cmd = F_GETLK64;
    2591             :                 fl->fl_flags |= FL_OFDLCK;
    2592             :                 fl->fl_owner = filp;
    2593             :         }
    2594             : 
    2595             :         error = vfs_test_lock(filp, fl);
    2596             :         if (error)
    2597             :                 goto out;
    2598             : 
    2599             :         flock->l_type = fl->fl_type;
    2600             :         if (fl->fl_type != F_UNLCK)
    2601             :                 posix_lock_to_flock64(flock, fl);
    2602             : 
    2603             : out:
    2604             :         locks_free_lock(fl);
    2605             :         return error;
    2606             : }
    2607             : 
    2608             : /* Apply the lock described by l to an open file descriptor.
    2609             :  * This implements both the F_SETLK and F_SETLKW commands of fcntl().
    2610             :  */
    2611             : int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,
    2612             :                 struct flock64 *flock)
    2613             : {
    2614             :         struct file_lock *file_lock = locks_alloc_lock();
    2615             :         struct inode *inode = locks_inode(filp);
    2616             :         struct file *f;
    2617             :         int error;
    2618             : 
    2619             :         if (file_lock == NULL)
    2620             :                 return -ENOLCK;
    2621             : 
    2622             :         /* Don't allow mandatory locks on files that may be memory mapped
    2623             :          * and shared.
    2624             :          */
    2625             :         if (mandatory_lock(inode) && mapping_writably_mapped(filp->f_mapping)) {
    2626             :                 error = -EAGAIN;
    2627             :                 goto out;
    2628             :         }
    2629             : 
    2630             :         error = flock64_to_posix_lock(filp, file_lock, flock);
    2631             :         if (error)
    2632             :                 goto out;
    2633             : 
    2634             :         error = check_fmode_for_setlk(file_lock);
    2635             :         if (error)
    2636             :                 goto out;
    2637             : 
    2638             :         /*
    2639             :          * If the cmd is requesting file-private locks, then set the
    2640             :          * FL_OFDLCK flag and override the owner.
    2641             :          */
    2642             :         switch (cmd) {
    2643             :         case F_OFD_SETLK:
    2644             :                 error = -EINVAL;
    2645             :                 if (flock->l_pid != 0)
    2646             :                         goto out;
    2647             : 
    2648             :                 cmd = F_SETLK64;
    2649             :                 file_lock->fl_flags |= FL_OFDLCK;
    2650             :                 file_lock->fl_owner = filp;
    2651             :                 break;
    2652             :         case F_OFD_SETLKW:
    2653             :                 error = -EINVAL;
    2654             :                 if (flock->l_pid != 0)
    2655             :                         goto out;
    2656             : 
    2657             :                 cmd = F_SETLKW64;
    2658             :                 file_lock->fl_flags |= FL_OFDLCK;
    2659             :                 file_lock->fl_owner = filp;
    2660             :                 fallthrough;
    2661             :         case F_SETLKW64:
    2662             :                 file_lock->fl_flags |= FL_SLEEP;
    2663             :         }
    2664             : 
    2665             :         error = do_lock_file_wait(filp, cmd, file_lock);
    2666             : 
    2667             :         /*
    2668             :          * Attempt to detect a close/fcntl race and recover by releasing the
    2669             :          * lock that was just acquired. There is no need to do that when we're
    2670             :          * unlocking though, or for OFD locks.
    2671             :          */
    2672             :         if (!error && file_lock->fl_type != F_UNLCK &&
    2673             :             !(file_lock->fl_flags & FL_OFDLCK)) {
    2674             :                 struct files_struct *files = current->files;
    2675             :                 /*
    2676             :                  * We need that spin_lock here - it prevents reordering between
    2677             :                  * update of i_flctx->flc_posix and check for it done in
    2678             :                  * close(). rcu_read_lock() wouldn't do.
    2679             :                  */
    2680             :                 spin_lock(&files->file_lock);
    2681             :                 f = files_lookup_fd_locked(files, fd);
    2682             :                 spin_unlock(&files->file_lock);
    2683             :                 if (f != filp) {
    2684             :                         file_lock->fl_type = F_UNLCK;
    2685             :                         error = do_lock_file_wait(filp, cmd, file_lock);
    2686             :                         WARN_ON_ONCE(error);
    2687             :                         error = -EBADF;
    2688             :                 }
    2689             :         }
    2690             : out:
    2691             :         locks_free_lock(file_lock);
    2692             :         return error;
    2693             : }
    2694             : #endif /* BITS_PER_LONG == 32 */
    2695             : 
    2696             : /*
    2697             :  * This function is called when the file is being removed
    2698             :  * from the task's fd array.  POSIX locks belonging to this task
    2699             :  * are deleted at this time.
    2700             :  */
    2701       29535 : void locks_remove_posix(struct file *filp, fl_owner_t owner)
    2702             : {
    2703       29535 :         int error;
    2704       29535 :         struct inode *inode = locks_inode(filp);
    2705       29535 :         struct file_lock lock;
    2706       29535 :         struct file_lock_context *ctx;
    2707             : 
    2708             :         /*
    2709             :          * If there are no locks held on this file, we don't need to call
    2710             :          * posix_lock_file().  Another process could be setting a lock on this
    2711             :          * file at the same time, but we wouldn't remove that lock anyway.
    2712             :          */
    2713       29535 :         ctx =  smp_load_acquire(&inode->i_flctx);
    2714       29537 :         if (!ctx || list_empty(&ctx->flc_posix))
    2715       29495 :                 return;
    2716             : 
    2717          42 :         locks_init_lock(&lock);
    2718          42 :         lock.fl_type = F_UNLCK;
    2719          42 :         lock.fl_flags = FL_POSIX | FL_CLOSE;
    2720          42 :         lock.fl_start = 0;
    2721          42 :         lock.fl_end = OFFSET_MAX;
    2722          42 :         lock.fl_owner = owner;
    2723          42 :         lock.fl_pid = current->tgid;
    2724          42 :         lock.fl_file = filp;
    2725          42 :         lock.fl_ops = NULL;
    2726          42 :         lock.fl_lmops = NULL;
    2727             : 
    2728          42 :         error = vfs_lock_file(filp, F_SETLK, &lock, NULL);
    2729             : 
    2730          42 :         if (lock.fl_ops && lock.fl_ops->fl_release_private)
    2731           0 :                 lock.fl_ops->fl_release_private(&lock);
    2732          42 :         trace_locks_remove_posix(inode, &lock, error);
    2733             : }
    2734             : EXPORT_SYMBOL(locks_remove_posix);
    2735             : 
    2736             : /* The i_flctx must be valid when calling into here */
    2737             : static void
    2738         178 : locks_remove_flock(struct file *filp, struct file_lock_context *flctx)
    2739             : {
    2740         178 :         struct file_lock fl;
    2741         178 :         struct inode *inode = locks_inode(filp);
    2742             : 
    2743         178 :         if (list_empty(&flctx->flc_flock))
    2744         101 :                 return;
    2745             : 
    2746          77 :         flock_make_lock(filp, LOCK_UN, &fl);
    2747          77 :         fl.fl_flags |= FL_CLOSE;
    2748             : 
    2749          77 :         if (filp->f_op->flock)
    2750           0 :                 filp->f_op->flock(filp, F_SETLKW, &fl);
    2751             :         else
    2752          77 :                 flock_lock_inode(inode, &fl);
    2753             : 
    2754          77 :         if (fl.fl_ops && fl.fl_ops->fl_release_private)
    2755           0 :                 fl.fl_ops->fl_release_private(&fl);
    2756             : }
    2757             : 
    2758             : /* The i_flctx must be valid when calling into here */
    2759             : static void
    2760         178 : locks_remove_lease(struct file *filp, struct file_lock_context *ctx)
    2761             : {
    2762         178 :         struct file_lock *fl, *tmp;
    2763         178 :         LIST_HEAD(dispose);
    2764             : 
    2765         178 :         if (list_empty(&ctx->flc_lease))
    2766         178 :                 return;
    2767             : 
    2768           0 :         percpu_down_read(&file_rwsem);
    2769           0 :         spin_lock(&ctx->flc_lock);
    2770           0 :         list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list)
    2771           0 :                 if (filp == fl->fl_file)
    2772           0 :                         lease_modify(fl, F_UNLCK, &dispose);
    2773           0 :         spin_unlock(&ctx->flc_lock);
    2774           0 :         percpu_up_read(&file_rwsem);
    2775             : 
    2776           0 :         locks_dispose_list(&dispose);
    2777             : }
    2778             : 
    2779             : /*
    2780             :  * This function is called on the last close of an open file.
    2781             :  */
    2782       47140 : void locks_remove_file(struct file *filp)
    2783             : {
    2784       47140 :         struct file_lock_context *ctx;
    2785             : 
    2786       47140 :         ctx = smp_load_acquire(&locks_inode(filp)->i_flctx);
    2787       47155 :         if (!ctx)
    2788             :                 return;
    2789             : 
    2790             :         /* remove any OFD locks */
    2791         178 :         locks_remove_posix(filp, filp);
    2792             : 
    2793             :         /* remove flock locks */
    2794         178 :         locks_remove_flock(filp, ctx);
    2795             : 
    2796             :         /* remove any leases */
    2797         178 :         locks_remove_lease(filp, ctx);
    2798             : 
    2799         178 :         spin_lock(&ctx->flc_lock);
    2800         178 :         locks_check_ctx_file_list(filp, &ctx->flc_posix, "POSIX");
    2801         178 :         locks_check_ctx_file_list(filp, &ctx->flc_flock, "FLOCK");
    2802         178 :         locks_check_ctx_file_list(filp, &ctx->flc_lease, "LEASE");
    2803         178 :         spin_unlock(&ctx->flc_lock);
    2804             : }
    2805             : 
    2806             : /**
    2807             :  * vfs_cancel_lock - file byte range unblock lock
    2808             :  * @filp: The file to apply the unblock to
    2809             :  * @fl: The lock to be unblocked
    2810             :  *
    2811             :  * Used by lock managers to cancel blocked requests
    2812             :  */
    2813           0 : int vfs_cancel_lock(struct file *filp, struct file_lock *fl)
    2814             : {
    2815           0 :         if (filp->f_op->lock)
    2816           0 :                 return filp->f_op->lock(filp, F_CANCELLK, fl);
    2817             :         return 0;
    2818             : }
    2819             : EXPORT_SYMBOL_GPL(vfs_cancel_lock);
    2820             : 
    2821             : #ifdef CONFIG_PROC_FS
    2822             : #include <linux/proc_fs.h>
    2823             : #include <linux/seq_file.h>
    2824             : 
    2825             : struct locks_iterator {
    2826             :         int     li_cpu;
    2827             :         loff_t  li_pos;
    2828             : };
    2829             : 
    2830           0 : static void lock_get_status(struct seq_file *f, struct file_lock *fl,
    2831             :                             loff_t id, char *pfx)
    2832             : {
    2833           0 :         struct inode *inode = NULL;
    2834           0 :         unsigned int fl_pid;
    2835           0 :         struct pid_namespace *proc_pidns = proc_pid_ns(file_inode(f->file)->i_sb);
    2836             : 
    2837           0 :         fl_pid = locks_translate_pid(fl, proc_pidns);
    2838             :         /*
    2839             :          * If lock owner is dead (and pid is freed) or not visible in current
    2840             :          * pidns, zero is shown as a pid value. Check lock info from
    2841             :          * init_pid_ns to get saved lock pid value.
    2842             :          */
    2843             : 
    2844           0 :         if (fl->fl_file != NULL)
    2845           0 :                 inode = locks_inode(fl->fl_file);
    2846             : 
    2847           0 :         seq_printf(f, "%lld:%s ", id, pfx);
    2848           0 :         if (IS_POSIX(fl)) {
    2849           0 :                 if (fl->fl_flags & FL_ACCESS)
    2850           0 :                         seq_puts(f, "ACCESS");
    2851           0 :                 else if (IS_OFDLCK(fl))
    2852           0 :                         seq_puts(f, "OFDLCK");
    2853             :                 else
    2854           0 :                         seq_puts(f, "POSIX ");
    2855             : 
    2856           0 :                 seq_printf(f, " %s ",
    2857             :                              (inode == NULL) ? "*NOINODE*" :
    2858           0 :                              mandatory_lock(inode) ? "MANDATORY" : "ADVISORY ");
    2859           0 :         } else if (IS_FLOCK(fl)) {
    2860           0 :                 if (fl->fl_type & LOCK_MAND) {
    2861           0 :                         seq_puts(f, "FLOCK  MSNFS     ");
    2862             :                 } else {
    2863           0 :                         seq_puts(f, "FLOCK  ADVISORY  ");
    2864             :                 }
    2865           0 :         } else if (IS_LEASE(fl)) {
    2866           0 :                 if (fl->fl_flags & FL_DELEG)
    2867           0 :                         seq_puts(f, "DELEG  ");
    2868             :                 else
    2869           0 :                         seq_puts(f, "LEASE  ");
    2870             : 
    2871           0 :                 if (lease_breaking(fl))
    2872           0 :                         seq_puts(f, "BREAKING  ");
    2873           0 :                 else if (fl->fl_file)
    2874           0 :                         seq_puts(f, "ACTIVE    ");
    2875             :                 else
    2876           0 :                         seq_puts(f, "BREAKER   ");
    2877             :         } else {
    2878           0 :                 seq_puts(f, "UNKNOWN UNKNOWN  ");
    2879             :         }
    2880           0 :         if (fl->fl_type & LOCK_MAND) {
    2881           0 :                 seq_printf(f, "%s ",
    2882             :                                (fl->fl_type & LOCK_READ)
    2883           0 :                                ? (fl->fl_type & LOCK_WRITE) ? "RW   " : "READ "
    2884           0 :                                : (fl->fl_type & LOCK_WRITE) ? "WRITE" : "NONE ");
    2885             :         } else {
    2886           0 :                 int type = IS_LEASE(fl) ? target_leasetype(fl) : fl->fl_type;
    2887             : 
    2888           0 :                 seq_printf(f, "%s ", (type == F_WRLCK) ? "WRITE" :
    2889           0 :                                      (type == F_RDLCK) ? "READ" : "UNLCK");
    2890             :         }
    2891           0 :         if (inode) {
    2892             :                 /* userspace relies on this representation of dev_t */
    2893           0 :                 seq_printf(f, "%d %02x:%02x:%lu ", fl_pid,
    2894           0 :                                 MAJOR(inode->i_sb->s_dev),
    2895           0 :                                 MINOR(inode->i_sb->s_dev), inode->i_ino);
    2896             :         } else {
    2897           0 :                 seq_printf(f, "%d <none>:0 ", fl_pid);
    2898             :         }
    2899           0 :         if (IS_POSIX(fl)) {
    2900           0 :                 if (fl->fl_end == OFFSET_MAX)
    2901           0 :                         seq_printf(f, "%Ld EOF\n", fl->fl_start);
    2902             :                 else
    2903           0 :                         seq_printf(f, "%Ld %Ld\n", fl->fl_start, fl->fl_end);
    2904             :         } else {
    2905           0 :                 seq_puts(f, "0 EOF\n");
    2906             :         }
    2907           0 : }
    2908             : 
    2909           0 : static int locks_show(struct seq_file *f, void *v)
    2910             : {
    2911           0 :         struct locks_iterator *iter = f->private;
    2912           0 :         struct file_lock *fl, *bfl;
    2913           0 :         struct pid_namespace *proc_pidns = proc_pid_ns(file_inode(f->file)->i_sb);
    2914             : 
    2915           0 :         fl = hlist_entry(v, struct file_lock, fl_link);
    2916             : 
    2917           0 :         if (locks_translate_pid(fl, proc_pidns) == 0)
    2918             :                 return 0;
    2919             : 
    2920           0 :         lock_get_status(f, fl, iter->li_pos, "");
    2921             : 
    2922           0 :         list_for_each_entry(bfl, &fl->fl_blocked_requests, fl_blocked_member)
    2923           0 :                 lock_get_status(f, bfl, iter->li_pos, " ->");
    2924             : 
    2925             :         return 0;
    2926             : }
    2927             : 
    2928           0 : static void __show_fd_locks(struct seq_file *f,
    2929             :                         struct list_head *head, int *id,
    2930             :                         struct file *filp, struct files_struct *files)
    2931             : {
    2932           0 :         struct file_lock *fl;
    2933             : 
    2934           0 :         list_for_each_entry(fl, head, fl_list) {
    2935             : 
    2936           0 :                 if (filp != fl->fl_file)
    2937           0 :                         continue;
    2938           0 :                 if (fl->fl_owner != files &&
    2939             :                     fl->fl_owner != filp)
    2940           0 :                         continue;
    2941             : 
    2942           0 :                 (*id)++;
    2943           0 :                 seq_puts(f, "lock:\t");
    2944           0 :                 lock_get_status(f, fl, *id, "");
    2945             :         }
    2946           0 : }
    2947             : 
    2948         139 : void show_fd_locks(struct seq_file *f,
    2949             :                   struct file *filp, struct files_struct *files)
    2950             : {
    2951         139 :         struct inode *inode = locks_inode(filp);
    2952         139 :         struct file_lock_context *ctx;
    2953         139 :         int id = 0;
    2954             : 
    2955         139 :         ctx = smp_load_acquire(&inode->i_flctx);
    2956         139 :         if (!ctx)
    2957         139 :                 return;
    2958             : 
    2959           0 :         spin_lock(&ctx->flc_lock);
    2960           0 :         __show_fd_locks(f, &ctx->flc_flock, &id, filp, files);
    2961           0 :         __show_fd_locks(f, &ctx->flc_posix, &id, filp, files);
    2962           0 :         __show_fd_locks(f, &ctx->flc_lease, &id, filp, files);
    2963           0 :         spin_unlock(&ctx->flc_lock);
    2964             : }
    2965             : 
    2966           0 : static void *locks_start(struct seq_file *f, loff_t *pos)
    2967             :         __acquires(&blocked_lock_lock)
    2968             : {
    2969           0 :         struct locks_iterator *iter = f->private;
    2970             : 
    2971           0 :         iter->li_pos = *pos + 1;
    2972           0 :         percpu_down_write(&file_rwsem);
    2973           0 :         spin_lock(&blocked_lock_lock);
    2974           0 :         return seq_hlist_start_percpu(&file_lock_list.hlist, &iter->li_cpu, *pos);
    2975             : }
    2976             : 
    2977           0 : static void *locks_next(struct seq_file *f, void *v, loff_t *pos)
    2978             : {
    2979           0 :         struct locks_iterator *iter = f->private;
    2980             : 
    2981           0 :         ++iter->li_pos;
    2982           0 :         return seq_hlist_next_percpu(v, &file_lock_list.hlist, &iter->li_cpu, pos);
    2983             : }
    2984             : 
    2985           0 : static void locks_stop(struct seq_file *f, void *v)
    2986             :         __releases(&blocked_lock_lock)
    2987             : {
    2988           0 :         spin_unlock(&blocked_lock_lock);
    2989           0 :         percpu_up_write(&file_rwsem);
    2990           0 : }
    2991             : 
    2992             : static const struct seq_operations locks_seq_operations = {
    2993             :         .start  = locks_start,
    2994             :         .next   = locks_next,
    2995             :         .stop   = locks_stop,
    2996             :         .show   = locks_show,
    2997             : };
    2998             : 
    2999           1 : static int __init proc_locks_init(void)
    3000             : {
    3001           1 :         proc_create_seq_private("locks", 0, NULL, &locks_seq_operations,
    3002             :                         sizeof(struct locks_iterator), NULL);
    3003           1 :         return 0;
    3004             : }
    3005             : fs_initcall(proc_locks_init);
    3006             : #endif
    3007             : 
    3008           1 : static int __init filelock_init(void)
    3009             : {
    3010           1 :         int i;
    3011             : 
    3012           1 :         flctx_cache = kmem_cache_create("file_lock_ctx",
    3013             :                         sizeof(struct file_lock_context), 0, SLAB_PANIC, NULL);
    3014             : 
    3015           1 :         filelock_cache = kmem_cache_create("file_lock_cache",
    3016             :                         sizeof(struct file_lock), 0, SLAB_PANIC, NULL);
    3017             : 
    3018           5 :         for_each_possible_cpu(i) {
    3019           4 :                 struct file_lock_list_struct *fll = per_cpu_ptr(&file_lock_list, i);
    3020             : 
    3021           4 :                 spin_lock_init(&fll->lock);
    3022           4 :                 INIT_HLIST_HEAD(&fll->hlist);
    3023             :         }
    3024             : 
    3025           1 :         lease_notifier_chain_init();
    3026           1 :         return 0;
    3027             : }
    3028             : core_initcall(filelock_init);

Generated by: LCOV version 1.14