linux-bk/fs/locks.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/locks.c
   3 *
   4 *  Provide support for fcntl()'s F_GETLK, F_SETLK, and F_SETLKW calls.
   5 *  Doug Evans (dje@spiff.uucp), August 07, 1992
   6 *
   7 *  Deadlock detection added.
   8 *  FIXME: one thing isn't handled yet:
   9 *      - mandatory locks (requires lots of changes elsewhere)
  10 *  Kelly Carmichael (kelly@[142.24.8.65]), September 17, 1994.
  11 *
  12 *  Miscellaneous edits, and a total rewrite of posix_lock_file() code.
  13 *  Kai Petzke (wpp@marie.physik.tu-berlin.de), 1994
  14 *  
  15 *  Converted file_lock_table to a linked list from an array, which eliminates
  16 *  the limits on how many active file locks are open.
  17 *  Chad Page (pageone@netcom.com), November 27, 1994
  18 * 
  19 *  Removed dependency on file descriptors. dup()'ed file descriptors now
  20 *  get the same locks as the original file descriptors, and a close() on
  21 *  any file descriptor removes ALL the locks on the file for the current
  22 *  process. Since locks still depend on the process id, locks are inherited
  23 *  after an exec() but not after a fork(). This agrees with POSIX, and both
  24 *  BSD and SVR4 practice.
  25 *  Andy Walker (andy@lysaker.kvaerner.no), February 14, 1995
  26 *
  27 *  Scrapped free list which is redundant now that we allocate locks
  28 *  dynamically with kmalloc()/kfree().
  29 *  Andy Walker (andy@lysaker.kvaerner.no), February 21, 1995
  30 *
  31 *  Implemented two lock personalities - FL_FLOCK and FL_POSIX.
  32 *
  33 *  FL_POSIX locks are created with calls to fcntl() and lockf() through the
  34 *  fcntl() system call. They have the semantics described above.
  35 *
  36 *  FL_FLOCK locks are created with calls to flock(), through the flock()
  37 *  system call, which is new. Old C libraries implement flock() via fcntl()
  38 *  and will continue to use the old, broken implementation.
  39 *
  40 *  FL_FLOCK locks follow the 4.4 BSD flock() semantics. They are associated
  41 *  with a file pointer (filp). As a result they can be shared by a parent
  42 *  process and its children after a fork(). They are removed when the last
  43 *  file descriptor referring to the file pointer is closed (unless explicitly
  44 *  unlocked). 
  45 *
  46 *  FL_FLOCK locks never deadlock, an existing lock is always removed before
  47 *  upgrading from shared to exclusive (or vice versa). When this happens
  48 *  any processes blocked by the current lock are woken up and allowed to
  49 *  run before the new lock is applied.
  50 *  Andy Walker (andy@lysaker.kvaerner.no), June 09, 1995
  51 *
  52 *  Removed some race conditions in flock_lock_file(), marked other possible
  53 *  races. Just grep for FIXME to see them. 
  54 *  Dmitry Gorodchanin (pgmdsg@ibi.com), February 09, 1996.
  55 *
  56 *  Addressed Dmitry's concerns. Deadlock checking no longer recursive.
  57 *  Lock allocation changed to GFP_ATOMIC as we can't afford to sleep
  58 *  once we've checked for blocking and deadlocking.
  59 *  Andy Walker (andy@lysaker.kvaerner.no), April 03, 1996.
  60 *
  61 *  Initial implementation of mandatory locks. SunOS turned out to be
  62 *  a rotten model, so I implemented the "obvious" semantics.
  63 *  See 'Documentation/mandatory.txt' for details.
  64 *  Andy Walker (andy@lysaker.kvaerner.no), April 06, 1996.
  65 *
  66 *  Don't allow mandatory locks on mmap()'ed files. Added simple functions to
  67 *  check if a file has mandatory locks, used by mmap(), open() and creat() to
  68 *  see if system call should be rejected. Ref. HP-UX/SunOS/Solaris Reference
  69 *  Manual, Section 2.
  70 *  Andy Walker (andy@lysaker.kvaerner.no), April 09, 1996.
  71 *
  72 *  Tidied up block list handling. Added '/proc/locks' interface.
  73 *  Andy Walker (andy@lysaker.kvaerner.no), April 24, 1996.
  74 *
  75 *  Fixed deadlock condition for pathological code that mixes calls to
  76 *  flock() and fcntl().
  77 *  Andy Walker (andy@lysaker.kvaerner.no), April 29, 1996.
  78 *
  79 *  Allow only one type of locking scheme (FL_POSIX or FL_FLOCK) to be in use
  80 *  for a given file at a time. Changed the CONFIG_LOCK_MANDATORY scheme to
  81 *  guarantee sensible behaviour in the case where file system modules might
  82 *  be compiled with different options than the kernel itself.
  83 *  Andy Walker (andy@lysaker.kvaerner.no), May 15, 1996.
  84 *
  85 *  Added a couple of missing wake_up() calls. Thanks to Thomas Meckel
  86 *  (Thomas.Meckel@mni.fh-giessen.de) for spotting this.
  87 *  Andy Walker (andy@lysaker.kvaerner.no), May 15, 1996.
  88 *
  89 *  Changed FL_POSIX locks to use the block list in the same way as FL_FLOCK
  90 *  locks. Changed process synchronisation to avoid dereferencing locks that
  91 *  have already been freed.
  92 *  Andy Walker (andy@lysaker.kvaerner.no), Sep 21, 1996.
  93 *
  94 *  Made the block list a circular list to minimise searching in the list.
  95 *  Andy Walker (andy@lysaker.kvaerner.no), Sep 25, 1996.
  96 *
  97 *  Made mandatory locking a mount option. Default is not to allow mandatory
  98 *  locking.
  99 *  Andy Walker (andy@lysaker.kvaerner.no), Oct 04, 1996.
 100 *
 101 *  Some adaptations for NFS support.
 102 *  Olaf Kirch (okir@monad.swb.de), Dec 1996,
 103 *
 104 *  Fixed /proc/locks interface so that we can't overrun the buffer we are handed.
 105 *  Andy Walker (andy@lysaker.kvaerner.no), May 12, 1997.
 106 *
 107 *  Use slab allocator instead of kmalloc/kfree.
 108 *  Use generic list implementation from <linux/list.h>.
 109 *  Sped up posix_locks_deadlock by only considering blocked locks.
 110 *  Matthew Wilcox <willy@debian.org>, March, 2000.
 111 *
 112 *  Leases and LOCK_MAND
 113 *  Matthew Wilcox <willy@debian.org>, June, 2000.
 114 *  Stephen Rothwell <sfr@canb.auug.org.au>, June, 2000.
 115 */
 116
 117#include <linux/capability.h>
 118#include <linux/file.h>
 119#include <linux/fs.h>
 120#include <linux/init.h>
 121#include <linux/module.h>
 122#include <linux/security.h>
 123#include <linux/slab.h>
 124#include <linux/smp_lock.h>
 125#include <linux/syscalls.h>
 126#include <linux/time.h>
 127
 128#include <asm/semaphore.h>
 129#include <asm/uaccess.h>
 130
 131#define IS_POSIX(fl)    (fl->fl_flags & FL_POSIX)
 132#define IS_FLOCK(fl)    (fl->fl_flags & FL_FLOCK)
 133#define IS_LEASE(fl)    (fl->fl_flags & FL_LEASE)
 134
 135int leases_enable = 1;
 136int lease_break_time = 45;
 137
 138#define for_each_lock(inode, lockp) \
 139        for (lockp = &inode->i_flock; *lockp != NULL; lockp = &(*lockp)->fl_next)
 140
 141LIST_HEAD(file_lock_list);
 142
 143EXPORT_SYMBOL(file_lock_list);
 144
 145static LIST_HEAD(blocked_list);
 146
 147static kmem_cache_t *filelock_cache;
 148
 149/* Allocate an empty lock structure. */
 150static struct file_lock *locks_alloc_lock(void)
 151{
 152        return kmem_cache_alloc(filelock_cache, SLAB_KERNEL);
 153}
 154
 155/* Free a lock which is not in use. */
 156static inline void locks_free_lock(struct file_lock *fl)
 157{
 158        if (fl == NULL) {
 159                BUG();
 160                return;
 161        }
 162        if (waitqueue_active(&fl->fl_wait))
 163                panic("Attempting to free lock with active wait queue");
 164
 165        if (!list_empty(&fl->fl_block))
 166                panic("Attempting to free lock with active block list");
 167
 168        if (!list_empty(&fl->fl_link))
 169                panic("Attempting to free lock on active lock list");
 170
 171        if (fl->fl_ops) {
 172                if (fl->fl_ops->fl_release_private)
 173                        fl->fl_ops->fl_release_private(fl);
 174                fl->fl_ops = NULL;
 175        }
 176
 177        if (fl->fl_lmops) {
 178                if (fl->fl_lmops->fl_release_private)
 179                        fl->fl_lmops->fl_release_private(fl);
 180                fl->fl_lmops = NULL;
 181        }
 182
 183        kmem_cache_free(filelock_cache, fl);
 184}
 185
 186void locks_init_lock(struct file_lock *fl)
 187{
 188        INIT_LIST_HEAD(&fl->fl_link);
 189        INIT_LIST_HEAD(&fl->fl_block);
 190        init_waitqueue_head(&fl->fl_wait);
 191        fl->fl_next = NULL;
 192        fl->fl_fasync = NULL;
 193        fl->fl_owner = NULL;
 194        fl->fl_pid = 0;
 195        fl->fl_file = NULL;
 196        fl->fl_flags = 0;
 197        fl->fl_type = 0;
 198        fl->fl_start = fl->fl_end = 0;
 199        fl->fl_ops = NULL;
 200        fl->fl_lmops = NULL;
 201}
 202
 203EXPORT_SYMBOL(locks_init_lock);
 204
 205/*
 206 * Initialises the fields of the file lock which are invariant for
 207 * free file_locks.
 208 */
 209static void init_once(void *foo, kmem_cache_t *cache, unsigned long flags)
 210{
 211        struct file_lock *lock = (struct file_lock *) foo;
 212
 213        if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) !=
 214                                        SLAB_CTOR_CONSTRUCTOR)
 215                return;
 216
 217        locks_init_lock(lock);
 218}
 219
 220/*
 221 * Initialize a new lock from an existing file_lock structure.
 222 */
 223void locks_copy_lock(struct file_lock *new, struct file_lock *fl)
 224{
 225        new->fl_owner = fl->fl_owner;
 226        new->fl_pid = fl->fl_pid;
 227        new->fl_file = fl->fl_file;
 228        new->fl_flags = fl->fl_flags;
 229        new->fl_type = fl->fl_type;
 230        new->fl_start = fl->fl_start;
 231        new->fl_end = fl->fl_end;
 232        new->fl_ops = fl->fl_ops;
 233        new->fl_lmops = fl->fl_lmops;
 234        if (fl->fl_ops && fl->fl_ops->fl_copy_lock)
 235                fl->fl_ops->fl_copy_lock(new, fl);
 236        if (fl->fl_lmops && fl->fl_lmops->fl_copy_lock)
 237                fl->fl_lmops->fl_copy_lock(new, fl);
 238}
 239
 240EXPORT_SYMBOL(locks_copy_lock);
 241
 242static inline int flock_translate_cmd(int cmd) {
 243        if (cmd & LOCK_MAND)
 244                return cmd & (LOCK_MAND | LOCK_RW);
 245        switch (cmd) {
 246        case LOCK_SH:
 247                return F_RDLCK;
 248        case LOCK_EX:
 249                return F_WRLCK;
 250        case LOCK_UN:
 251                return F_UNLCK;
 252        }
 253        return -EINVAL;
 254}
 255
 256/* Fill in a file_lock structure with an appropriate FLOCK lock. */
 257static int flock_make_lock(struct file *filp, struct file_lock **lock,
 258                unsigned int cmd)
 259{
 260        struct file_lock *fl;
 261        int type = flock_translate_cmd(cmd);
 262        if (type < 0)
 263                return type;
 264        
 265        fl = locks_alloc_lock();
 266        if (fl == NULL)
 267                return -ENOMEM;
 268
 269        fl->fl_file = filp;
 270        fl->fl_pid = current->tgid;
 271        fl->fl_flags = FL_FLOCK;
 272        fl->fl_type = type;
 273        fl->fl_end = OFFSET_MAX;
 274        
 275        *lock = fl;
 276        return 0;
 277}
 278
 279static int assign_type(struct file_lock *fl, int type)
 280{
 281        switch (type) {
 282        case F_RDLCK:
 283        case F_WRLCK:
 284        case F_UNLCK:
 285                fl->fl_type = type;
 286                break;
 287        default:
 288                return -EINVAL;
 289        }
 290        return 0;
 291}
 292
 293/* Verify a "struct flock" and copy it to a "struct file_lock" as a POSIX
 294 * style lock.
 295 */
 296static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,
 297                               struct flock *l)
 298{
 299        off_t start, end;
 300
 301        switch (l->l_whence) {
 302        case 0: /*SEEK_SET*/
 303                start = 0;
 304                break;
 305        case 1: /*SEEK_CUR*/
 306                start = filp->f_pos;
 307                break;
 308        case 2: /*SEEK_END*/
 309                start = i_size_read(filp->f_dentry->d_inode);
 310                break;
 311        default:
 312                return -EINVAL;
 313        }
 314
 315        /* POSIX-1996 leaves the case l->l_len < 0 undefined;
 316           POSIX-2001 defines it. */
 317        start += l->l_start;
 318        end = start + l->l_len - 1;
 319        if (l->l_len < 0) {
 320                end = start - 1;
 321                start += l->l_len;
 322        }
 323
 324        if (start < 0)
 325                return -EINVAL;
 326        if (l->l_len > 0 && end < 0)
 327                return -EOVERFLOW;
 328
 329        fl->fl_start = start;   /* we record the absolute position */
 330        fl->fl_end = end;
 331        if (l->l_len == 0)
 332                fl->fl_end = OFFSET_MAX;
 333        
 334        fl->fl_owner = current->files;
 335        fl->fl_pid = current->tgid;
 336        fl->fl_file = filp;
 337        fl->fl_flags = FL_POSIX;
 338        fl->fl_ops = NULL;
 339        fl->fl_lmops = NULL;
 340
 341        return assign_type(fl, l->l_type);
 342}
 343
 344#if BITS_PER_LONG == 32
 345static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
 346                                 struct flock64 *l)
 347{
 348        loff_t start;
 349
 350        switch (l->l_whence) {
 351        case 0: /*SEEK_SET*/
 352                start = 0;
 353                break;
 354        case 1: /*SEEK_CUR*/
 355                start = filp->f_pos;
 356                break;
 357        case 2: /*SEEK_END*/
 358                start = i_size_read(filp->f_dentry->d_inode);
 359                break;
 360        default:
 361                return -EINVAL;
 362        }
 363
 364        if (((start += l->l_start) < 0) || (l->l_len < 0))
 365                return -EINVAL;
 366        fl->fl_end = start + l->l_len - 1;
 367        if (l->l_len > 0 && fl->fl_end < 0)
 368                return -EOVERFLOW;
 369        fl->fl_start = start;   /* we record the absolute position */
 370        if (l->l_len == 0)
 371                fl->fl_end = OFFSET_MAX;
 372        
 373        fl->fl_owner = current->files;
 374        fl->fl_pid = current->tgid;
 375        fl->fl_file = filp;
 376        fl->fl_flags = FL_POSIX;
 377        fl->fl_ops = NULL;
 378        fl->fl_lmops = NULL;
 379
 380        switch (l->l_type) {
 381        case F_RDLCK:
 382        case F_WRLCK:
 383        case F_UNLCK:
 384                fl->fl_type = l->l_type;
 385                break;
 386        default:
 387                return -EINVAL;
 388        }
 389
 390        return (0);
 391}
 392#endif
 393
 394/* default lease lock manager operations */
 395static void lease_break_callback(struct file_lock *fl)
 396{
 397        kill_fasync(&fl->fl_fasync, SIGIO, POLL_MSG);
 398}
 399
 400static void lease_release_private_callback(struct file_lock *fl)
 401{
 402        if (!fl->fl_file)
 403                return;
 404
 405        f_delown(fl->fl_file);
 406        fl->fl_file->f_owner.signum = 0;
 407}
 408
 409struct lock_manager_operations lease_manager_ops = {
 410        .fl_break = lease_break_callback,
 411        .fl_release_private = lease_release_private_callback,
 412};
 413
 414/*
 415 * Initialize a lease, use the default lock manager operations
 416 */
 417static int lease_init(struct file *filp, int type, struct file_lock *fl)
 418 {
 419        fl->fl_owner = current->files;
 420        fl->fl_pid = current->tgid;
 421
 422        fl->fl_file = filp;
 423        fl->fl_flags = FL_LEASE;
 424        if (assign_type(fl, type) != 0) {
 425                locks_free_lock(fl);
 426                return -EINVAL;
 427        }
 428        fl->fl_start = 0;
 429        fl->fl_end = OFFSET_MAX;
 430        fl->fl_ops = NULL;
 431        fl->fl_lmops = &lease_manager_ops;
 432        return 0;
 433}
 434
 435/* Allocate a file_lock initialised to this type of lease */
 436static int lease_alloc(struct file *filp, int type, struct file_lock **flp)
 437{
 438        struct file_lock *fl = locks_alloc_lock();
 439        int error;
 440
 441        if (fl == NULL)
 442                return -ENOMEM;
 443
 444        error = lease_init(filp, type, fl);
 445        if (error)
 446                return error;
 447        *flp = fl;
 448        return 0;
 449}
 450
 451/* Check if two locks overlap each other.
 452 */
 453static inline int locks_overlap(struct file_lock *fl1, struct file_lock *fl2)
 454{
 455        return ((fl1->fl_end >= fl2->fl_start) &&
 456                (fl2->fl_end >= fl1->fl_start));
 457}
 458
 459/*
 460 * Check whether two locks have the same owner.
 461 */
 462static inline int
 463posix_same_owner(struct file_lock *fl1, struct file_lock *fl2)
 464{
 465        if (fl1->fl_lmops && fl1->fl_lmops->fl_compare_owner)
 466                return fl2->fl_lmops == fl1->fl_lmops &&
 467                        fl1->fl_lmops->fl_compare_owner(fl1, fl2);
 468        return fl1->fl_owner == fl2->fl_owner;
 469}
 470
 471/* Remove waiter from blocker's block list.
 472 * When blocker ends up pointing to itself then the list is empty.
 473 */
 474static inline void __locks_delete_block(struct file_lock *waiter)
 475{
 476        list_del_init(&waiter->fl_block);
 477        list_del_init(&waiter->fl_link);
 478        waiter->fl_next = NULL;
 479}
 480
 481/*
 482 */
 483static void locks_delete_block(struct file_lock *waiter)
 484{
 485        lock_kernel();
 486        __locks_delete_block(waiter);
 487        unlock_kernel();
 488}
 489
 490/* Insert waiter into blocker's block list.
 491 * We use a circular list so that processes can be easily woken up in
 492 * the order they blocked. The documentation doesn't require this but
 493 * it seems like the reasonable thing to do.
 494 */
 495static void locks_insert_block(struct file_lock *blocker, 
 496                               struct file_lock *waiter)
 497{
 498        if (!list_empty(&waiter->fl_block)) {
 499                printk(KERN_ERR "locks_insert_block: removing duplicated lock "
 500                        "(pid=%d %Ld-%Ld type=%d)\n", waiter->fl_pid,
 501                        waiter->fl_start, waiter->fl_end, waiter->fl_type);
 502                __locks_delete_block(waiter);
 503        }
 504        list_add_tail(&waiter->fl_block, &blocker->fl_block);
 505        waiter->fl_next = blocker;
 506        if (IS_POSIX(blocker))
 507                list_add(&waiter->fl_link, &blocked_list);
 508}
 509
 510/* Wake up processes blocked waiting for blocker.
 511 * If told to wait then schedule the processes until the block list
 512 * is empty, otherwise empty the block list ourselves.
 513 */
 514static void locks_wake_up_blocks(struct file_lock *blocker)
 515{
 516        while (!list_empty(&blocker->fl_block)) {
 517                struct file_lock *waiter = list_entry(blocker->fl_block.next,
 518                                struct file_lock, fl_block);
 519                __locks_delete_block(waiter);
 520                if (waiter->fl_lmops && waiter->fl_lmops->fl_notify)
 521                        waiter->fl_lmops->fl_notify(waiter);
 522                else
 523                        wake_up(&waiter->fl_wait);
 524        }
 525}
 526
 527/* Insert file lock fl into an inode's lock list at the position indicated
 528 * by pos. At the same time add the lock to the global file lock list.
 529 */
 530static void locks_insert_lock(struct file_lock **pos, struct file_lock *fl)
 531{
 532        list_add(&fl->fl_link, &file_lock_list);
 533
 534        /* insert into file's list */
 535        fl->fl_next = *pos;
 536        *pos = fl;
 537
 538        if (fl->fl_ops && fl->fl_ops->fl_insert)
 539                fl->fl_ops->fl_insert(fl);
 540}
 541
 542/*
 543 * Delete a lock and then free it.
 544 * Wake up processes that are blocked waiting for this lock,
 545 * notify the FS that the lock has been cleared and
 546 * finally free the lock.
 547 */
 548static void locks_delete_lock(struct file_lock **thisfl_p)
 549{
 550        struct file_lock *fl = *thisfl_p;
 551
 552        *thisfl_p = fl->fl_next;
 553        fl->fl_next = NULL;
 554        list_del_init(&fl->fl_link);
 555
 556        fasync_helper(0, fl->fl_file, 0, &fl->fl_fasync);
 557        if (fl->fl_fasync != NULL) {
 558                printk(KERN_ERR "locks_delete_lock: fasync == %p\n", fl->fl_fasync);
 559                fl->fl_fasync = NULL;
 560        }
 561
 562        if (fl->fl_ops && fl->fl_ops->fl_remove)
 563                fl->fl_ops->fl_remove(fl);
 564
 565        locks_wake_up_blocks(fl);
 566        locks_free_lock(fl);
 567}
 568
 569/* Determine if lock sys_fl blocks lock caller_fl. Common functionality
 570 * checks for shared/exclusive status of overlapping locks.
 571 */
 572static int locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
 573{
 574        if (sys_fl->fl_type == F_WRLCK)
 575                return 1;
 576        if (caller_fl->fl_type == F_WRLCK)
 577                return 1;
 578        return 0;
 579}
 580
 581/* Determine if lock sys_fl blocks lock caller_fl. POSIX specific
 582 * checking before calling the locks_conflict().
 583 */
 584static int posix_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
 585{
 586        /* POSIX locks owned by the same process do not conflict with
 587         * each other.
 588         */
 589        if (!IS_POSIX(sys_fl) || posix_same_owner(caller_fl, sys_fl))
 590                return (0);
 591
 592        /* Check whether they overlap */
 593        if (!locks_overlap(caller_fl, sys_fl))
 594                return 0;
 595
 596        return (locks_conflict(caller_fl, sys_fl));
 597}
 598
 599/* Determine if lock sys_fl blocks lock caller_fl. FLOCK specific
 600 * checking before calling the locks_conflict().
 601 */
 602static int flock_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
 603{
 604        /* FLOCK locks referring to the same filp do not conflict with
 605         * each other.
 606         */
 607        if (!IS_FLOCK(sys_fl) || (caller_fl->fl_file == sys_fl->fl_file))
 608                return (0);
 609        if ((caller_fl->fl_type & LOCK_MAND) || (sys_fl->fl_type & LOCK_MAND))
 610                return 0;
 611
 612        return (locks_conflict(caller_fl, sys_fl));
 613}
 614
 615static int interruptible_sleep_on_locked(wait_queue_head_t *fl_wait, int timeout)
 616{
 617        int result = 0;
 618        DECLARE_WAITQUEUE(wait, current);
 619
 620        __set_current_state(TASK_INTERRUPTIBLE);
 621        add_wait_queue(fl_wait, &wait);
 622        if (timeout == 0)
 623                schedule();
 624        else
 625                result = schedule_timeout(timeout);
 626        if (signal_pending(current))
 627                result = -ERESTARTSYS;
 628        remove_wait_queue(fl_wait, &wait);
 629        __set_current_state(TASK_RUNNING);
 630        return result;
 631}
 632
 633static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *waiter, int time)
 634{
 635        int result;
 636        locks_insert_block(blocker, waiter);
 637        result = interruptible_sleep_on_locked(&waiter->fl_wait, time);
 638        __locks_delete_block(waiter);
 639        return result;
 640}
 641
 642struct file_lock *
 643posix_test_lock(struct file *filp, struct file_lock *fl)
 644{
 645        struct file_lock *cfl;
 646
 647        lock_kernel();
 648        for (cfl = filp->f_dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) {
 649                if (!IS_POSIX(cfl))
 650                        continue;
 651                if (posix_locks_conflict(cfl, fl))
 652                        break;
 653        }
 654        unlock_kernel();
 655
 656        return (cfl);
 657}
 658
 659EXPORT_SYMBOL(posix_test_lock);
 660
 661/* This function tests for deadlock condition before putting a process to
 662 * sleep. The detection scheme is no longer recursive. Recursive was neat,
 663 * but dangerous - we risked stack corruption if the lock data was bad, or
 664 * if the recursion was too deep for any other reason.
 665 *
 666 * We rely on the fact that a task can only be on one lock's wait queue
 667 * at a time. When we find blocked_task on a wait queue we can re-search
 668 * with blocked_task equal to that queue's owner, until either blocked_task
 669 * isn't found, or blocked_task is found on a queue owned by my_task.
 670 *
 671 * Note: the above assumption may not be true when handling lock requests
 672 * from a broken NFS client. But broken NFS clients have a lot more to
 673 * worry about than proper deadlock detection anyway... --okir
 674 */
 675int posix_locks_deadlock(struct file_lock *caller_fl,
 676                                struct file_lock *block_fl)
 677{
 678        struct list_head *tmp;
 679
 680next_task:
 681        if (posix_same_owner(caller_fl, block_fl))
 682                return 1;
 683        list_for_each(tmp, &blocked_list) {
 684                struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
 685                if (posix_same_owner(fl, block_fl)) {
 686                        fl = fl->fl_next;
 687                        block_fl = fl;
 688                        goto next_task;
 689                }
 690        }
 691        return 0;
 692}
 693
 694EXPORT_SYMBOL(posix_locks_deadlock);
 695
 696/* Try to create a FLOCK lock on filp. We always insert new FLOCK locks
 697 * at the head of the list, but that's secret knowledge known only to
 698 * flock_lock_file and posix_lock_file.
 699 */
 700static int flock_lock_file(struct file *filp, struct file_lock *new_fl)
 701{
 702        struct file_lock **before;
 703        struct inode * inode = filp->f_dentry->d_inode;
 704        int error = 0;
 705        int found = 0;
 706
 707        lock_kernel();
 708        for_each_lock(inode, before) {
 709                struct file_lock *fl = *before;
 710                if (IS_POSIX(fl))
 711                        break;
 712                if (IS_LEASE(fl))
 713                        continue;
 714                if (filp != fl->fl_file)
 715                        continue;
 716                if (new_fl->fl_type == fl->fl_type)
 717                        goto out;
 718                found = 1;
 719                locks_delete_lock(before);
 720                break;
 721        }
 722        unlock_kernel();
 723
 724        if (new_fl->fl_type == F_UNLCK)
 725                return 0;
 726
 727        /*
 728         * If a higher-priority process was blocked on the old file lock,
 729         * give it the opportunity to lock the file.
 730         */
 731        if (found)
 732                cond_resched();
 733
 734        lock_kernel();
 735        for_each_lock(inode, before) {
 736                struct file_lock *fl = *before;
 737                if (IS_POSIX(fl))
 738                        break;
 739                if (IS_LEASE(fl))
 740                        continue;
 741                if (!flock_locks_conflict(new_fl, fl))
 742                        continue;
 743                error = -EAGAIN;
 744                if (new_fl->fl_flags & FL_SLEEP) {
 745                        locks_insert_block(fl, new_fl);
 746                }
 747                goto out;
 748        }
 749        locks_insert_lock(&inode->i_flock, new_fl);
 750        error = 0;
 751
 752out:
 753        unlock_kernel();
 754        return error;
 755}
 756
 757EXPORT_SYMBOL(posix_lock_file);
 758
 759static int __posix_lock_file(struct inode *inode, struct file_lock *request)
 760{
 761        struct file_lock *fl;
 762        struct file_lock *new_fl, *new_fl2;
 763        struct file_lock *left = NULL;
 764        struct file_lock *right = NULL;
 765        struct file_lock **before;
 766        int error, added = 0;
 767
 768        /*
 769         * We may need two file_lock structures for this operation,
 770         * so we get them in advance to avoid races.
 771         */
 772        new_fl = locks_alloc_lock();
 773        new_fl2 = locks_alloc_lock();
 774
 775        lock_kernel();
 776        if (request->fl_type != F_UNLCK) {
 777                for_each_lock(inode, before) {
 778                        struct file_lock *fl = *before;
 779                        if (!IS_POSIX(fl))
 780                                continue;
 781                        if (!posix_locks_conflict(request, fl))
 782                                continue;
 783                        error = -EAGAIN;
 784                        if (!(request->fl_flags & FL_SLEEP))
 785                                goto out;
 786                        error = -EDEADLK;
 787                        if (posix_locks_deadlock(request, fl))
 788                                goto out;
 789                        error = -EAGAIN;
 790                        locks_insert_block(fl, request);
 791                        goto out;
 792                }
 793        }
 794
 795        /* If we're just looking for a conflict, we're done. */
 796        error = 0;
 797        if (request->fl_flags & FL_ACCESS)
 798                goto out;
 799
 800        error = -ENOLCK; /* "no luck" */
 801        if (!(new_fl && new_fl2))
 802                goto out;
 803
 804        /*
 805         * We've allocated the new locks in advance, so there are no
 806         * errors possible (and no blocking operations) from here on.
 807         * 
 808         * Find the first old lock with the same owner as the new lock.
 809         */
 810        
 811        before = &inode->i_flock;
 812
 813        /* First skip locks owned by other processes.  */
 814        while ((fl = *before) && (!IS_POSIX(fl) ||
 815                                  !posix_same_owner(request, fl))) {
 816                before = &fl->fl_next;
 817        }
 818
 819        /* Process locks with this owner.  */
 820        while ((fl = *before) && posix_same_owner(request, fl)) {
 821                /* Detect adjacent or overlapping regions (if same lock type)
 822                 */
 823                if (request->fl_type == fl->fl_type) {
 824                        if (fl->fl_end < request->fl_start - 1)
 825                                goto next_lock;
 826                        /* If the next lock in the list has entirely bigger
 827                         * addresses than the new one, insert the lock here.
 828                         */
 829                        if (fl->fl_start > request->fl_end + 1)
 830                                break;
 831
 832                        /* If we come here, the new and old lock are of the
 833                         * same type and adjacent or overlapping. Make one
 834                         * lock yielding from the lower start address of both
 835                         * locks to the higher end address.
 836                         */
 837                        if (fl->fl_start > request->fl_start)
 838                                fl->fl_start = request->fl_start;
 839                        else
 840                                request->fl_start = fl->fl_start;
 841                        if (fl->fl_end < request->fl_end)
 842                                fl->fl_end = request->fl_end;
 843                        else
 844                                request->fl_end = fl->fl_end;
 845                        if (added) {
 846                                locks_delete_lock(before);
 847                                continue;
 848                        }
 849                        request = fl;
 850                        added = 1;
 851                }
 852                else {
 853                        /* Processing for different lock types is a bit
 854                         * more complex.
 855                         */
 856                        if (fl->fl_end < request->fl_start)
 857                                goto next_lock;
 858                        if (fl->fl_start > request->fl_end)
 859                                break;
 860                        if (request->fl_type == F_UNLCK)
 861                                added = 1;
 862                        if (fl->fl_start < request->fl_start)
 863                                left = fl;
 864                        /* If the next lock in the list has a higher end
 865                         * address than the new one, insert the new one here.
 866                         */
 867                        if (fl->fl_end > request->fl_end) {
 868                                right = fl;
 869                                break;
 870                        }
 871                        if (fl->fl_start >= request->fl_start) {
 872                                /* The new lock completely replaces an old
 873                                 * one (This may happen several times).
 874                                 */
 875                                if (added) {
 876                                        locks_delete_lock(before);
 877                                        continue;
 878                                }
 879                                /* Replace the old lock with the new one.
 880                                 * Wake up anybody waiting for the old one,
 881                                 * as the change in lock type might satisfy
 882                                 * their needs.
 883                                 */
 884                                locks_wake_up_blocks(fl);
 885                                fl->fl_start = request->fl_start;
 886                                fl->fl_end = request->fl_end;
 887                                fl->fl_type = request->fl_type;
 888                                fl->fl_u = request->fl_u;
 889                                request = fl;
 890                                added = 1;
 891                        }
 892                }
 893                /* Go on to next lock.
 894                 */
 895        next_lock:
 896                before = &fl->fl_next;
 897        }
 898
 899        error = 0;
 900        if (!added) {
 901                if (request->fl_type == F_UNLCK)
 902                        goto out;
 903                locks_copy_lock(new_fl, request);
 904                locks_insert_lock(before, new_fl);
 905                new_fl = NULL;
 906        }
 907        if (right) {
 908                if (left == right) {
 909                        /* The new lock breaks the old one in two pieces,
 910                         * so we have to use the second new lock.
 911                         */
 912                        left = new_fl2;
 913                        new_fl2 = NULL;
 914                        locks_copy_lock(left, right);
 915                        locks_insert_lock(before, left);
 916                }
 917                right->fl_start = request->fl_end + 1;
 918                locks_wake_up_blocks(right);
 919        }
 920        if (left) {
 921                left->fl_end = request->fl_start - 1;
 922                locks_wake_up_blocks(left);
 923        }
 924 out:
 925        unlock_kernel();
 926        /*
 927         * Free any unused locks.
 928         */
 929        if (new_fl)
 930                locks_free_lock(new_fl);
 931        if (new_fl2)
 932                locks_free_lock(new_fl2);
 933        return error;
 934}
 935
 936/**
 937 * posix_lock_file - Apply a POSIX-style lock to a file
 938 * @filp: The file to apply the lock to
 939 * @fl: The lock to be applied
 940 *
 941 * Add a POSIX style lock to a file.
 942 * We merge adjacent & overlapping locks whenever possible.
 943 * POSIX locks are sorted by owner task, then by starting address
 944 */
 945int posix_lock_file(struct file *filp, struct file_lock *fl)
 946{
 947        return __posix_lock_file(filp->f_dentry->d_inode, fl);
 948}
 949
 950/**
 951 * posix_lock_file_wait - Apply a POSIX-style lock to a file
 952 * @filp: The file to apply the lock to
 953 * @fl: The lock to be applied
 954 *
 955 * Add a POSIX style lock to a file.
 956 * We merge adjacent & overlapping locks whenever possible.
 957 * POSIX locks are sorted by owner task, then by starting address
 958 */
 959int posix_lock_file_wait(struct file *filp, struct file_lock *fl)
 960{
 961        int error;
 962        might_sleep ();
 963        for (;;) {
 964                error = __posix_lock_file(filp->f_dentry->d_inode, fl);
 965                if ((error != -EAGAIN) || !(fl->fl_flags & FL_SLEEP))
 966                        break;
 967                error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
 968                if (!error)
 969                        continue;
 970
 971                locks_delete_block(fl);
 972                break;
 973        }
 974        return error;
 975}
 976EXPORT_SYMBOL(posix_lock_file_wait);
 977
 978/**
 979 * locks_mandatory_locked - Check for an active lock
 980 * @inode: the file to check
 981 *
 982 * Searches the inode's list of locks to find any POSIX locks which conflict.
 983 * This function is called from locks_verify_locked() only.
 984 */
 985int locks_mandatory_locked(struct inode *inode)
 986{
 987        fl_owner_t owner = current->files;
 988        struct file_lock *fl;
 989
 990        /*
 991         * Search the lock list for this inode for any POSIX locks.
 992         */
 993        lock_kernel();
 994        for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
 995                if (!IS_POSIX(fl))
 996                        continue;
 997                if (fl->fl_owner != owner)
 998                        break;
 999        }
1000        unlock_kernel();
1001        return fl ? -EAGAIN : 0;
1002}
1003
1004/**
1005 * locks_mandatory_area - Check for a conflicting lock
1006 * @read_write: %FLOCK_VERIFY_WRITE for exclusive access, %FLOCK_VERIFY_READ
1007 *              for shared
1008 * @inode:      the file to check
1009 * @filp:       how the file was opened (if it was)
1010 * @offset:     start of area to check
1011 * @count:      length of area to check
1012 *
1013 * Searches the inode's list of locks to find any POSIX locks which conflict.
1014 * This function is called from rw_verify_area() and
1015 * locks_verify_truncate().
1016 */
1017int locks_mandatory_area(int read_write, struct inode *inode,
1018                         struct file *filp, loff_t offset,
1019                         size_t count)
1020{
1021        struct file_lock fl;
1022        int error;
1023
1024        locks_init_lock(&fl);
1025        fl.fl_owner = current->files;
1026        fl.fl_pid = current->tgid;
1027        fl.fl_file = filp;
1028        fl.fl_flags = FL_POSIX | FL_ACCESS;
1029        if (filp && !(filp->f_flags & O_NONBLOCK))
1030                fl.fl_flags |= FL_SLEEP;
1031        fl.fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK;
1032        fl.fl_start = offset;
1033        fl.fl_end = offset + count - 1;
1034
1035        for (;;) {
1036                error = __posix_lock_file(inode, &fl);
1037                if (error != -EAGAIN)
1038                        break;
1039                if (!(fl.fl_flags & FL_SLEEP))
1040                        break;
1041                error = wait_event_interruptible(fl.fl_wait, !fl.fl_next);
1042                if (!error) {
1043                        /*
1044                         * If we've been sleeping someone might have
1045                         * changed the permissions behind our back.
1046                         */
1047                        if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID)
1048                                continue;
1049                }
1050
1051                locks_delete_block(&fl);
1052                break;
1053        }
1054
1055        return error;
1056}
1057
1058EXPORT_SYMBOL(locks_mandatory_area);
1059
1060/* We already had a lease on this file; just change its type */
1061static int lease_modify(struct file_lock **before, int arg)
1062{
1063        struct file_lock *fl = *before;
1064        int error = assign_type(fl, arg);
1065
1066        if (error)
1067                return error;
1068        locks_wake_up_blocks(fl);
1069        if (arg == F_UNLCK)
1070                locks_delete_lock(before);
1071        return 0;
1072}
1073
1074static void time_out_leases(struct inode *inode)
1075{
1076        struct file_lock **before;
1077        struct file_lock *fl;
1078
1079        before = &inode->i_flock;
1080        while ((fl = *before) && IS_LEASE(fl) && (fl->fl_type & F_INPROGRESS)) {
1081                if ((fl->fl_break_time == 0)
1082                                || time_before(jiffies, fl->fl_break_time)) {
1083                        before = &fl->fl_next;
1084                        continue;
1085                }
1086                printk(KERN_INFO "lease broken - owner pid = %d\n", fl->fl_pid);
1087                lease_modify(before, fl->fl_type & ~F_INPROGRESS);
1088                if (fl == *before)      /* lease_modify may have freed fl */
1089                        before = &fl->fl_next;
1090        }
1091}
1092
1093 /**
1094*       remove_lease - let time_out_leases remove the lease.
1095*       @@file_lock: the lease to remove
1096*/
1097void remove_lease(struct file_lock *fl)
1098{
1099        lock_kernel();
1100        if (!fl || !IS_LEASE(fl))
1101                goto out;
1102        fl->fl_type = F_UNLCK | F_INPROGRESS;
1103        fl->fl_break_time = jiffies - 10;
1104        time_out_leases(fl->fl_file->f_dentry->d_inode);
1105out:
1106        unlock_kernel();
1107}
1108
1109EXPORT_SYMBOL(remove_lease);
1110
1111/**
1112 *      __break_lease   -       revoke all outstanding leases on file
1113 *      @inode: the inode of the file to return
1114 *      @mode: the open mode (read or write)
1115 *
1116 *      break_lease (inlined for speed) has checked there already
1117 *      is a lease on this file.  Leases are broken on a call to open()
1118 *      or truncate().  This function can sleep unless you
1119 *      specified %O_NONBLOCK to your open().
1120 */
1121int __break_lease(struct inode *inode, unsigned int mode)
1122{
1123        int error = 0, future;
1124        struct file_lock *new_fl, *flock;
1125        struct file_lock *fl;
1126        int alloc_err;
1127        unsigned long break_time;
1128        int i_have_this_lease = 0;
1129
1130        alloc_err = lease_alloc(NULL, mode & FMODE_WRITE ? F_WRLCK : F_RDLCK,
1131                        &new_fl);
1132
1133        lock_kernel();
1134
1135        time_out_leases(inode);
1136
1137        flock = inode->i_flock;
1138        if ((flock == NULL) || !IS_LEASE(flock))
1139                goto out;
1140
1141        for (fl = flock; fl && IS_LEASE(fl); fl = fl->fl_next)
1142                if (fl->fl_owner == current->files)
1143                        i_have_this_lease = 1;
1144
1145        if (mode & FMODE_WRITE) {
1146                /* If we want write access, we have to revoke any lease. */
1147                future = F_UNLCK | F_INPROGRESS;
1148        } else if (flock->fl_type & F_INPROGRESS) {
1149                /* If the lease is already being broken, we just leave it */
1150                future = flock->fl_type;
1151        } else if (flock->fl_type & F_WRLCK) {
1152                /* Downgrade the exclusive lease to a read-only lease. */
1153                future = F_RDLCK | F_INPROGRESS;
1154        } else {
1155                /* the existing lease was read-only, so we can read too. */
1156                goto out;
1157        }
1158
1159        if (alloc_err && !i_have_this_lease && ((mode & O_NONBLOCK) == 0)) {
1160                error = alloc_err;
1161                goto out;
1162        }
1163
1164        break_time = 0;
1165        if (lease_break_time > 0) {
1166                break_time = jiffies + lease_break_time * HZ;
1167                if (break_time == 0)
1168                        break_time++;   /* so that 0 means no break time */
1169        }
1170
1171        for (fl = flock; fl && IS_LEASE(fl); fl = fl->fl_next) {
1172                if (fl->fl_type != future) {
1173                        fl->fl_type = future;
1174                        fl->fl_break_time = break_time;
1175                        if (fl->fl_lmops && fl->fl_lmops->fl_break)
1176                                fl->fl_lmops->fl_break(fl);
1177                        else    /* lease must have lmops break callback */
1178                                BUG();
1179                }
1180        }
1181
1182        if (i_have_this_lease || (mode & O_NONBLOCK)) {
1183                error = -EWOULDBLOCK;
1184                goto out;
1185        }
1186
1187restart:
1188        break_time = flock->fl_break_time;
1189        if (break_time != 0) {
1190                break_time -= jiffies;
1191                if (break_time == 0)
1192                        break_time++;
1193        }
1194        error = locks_block_on_timeout(flock, new_fl, break_time);
1195        if (error >= 0) {
1196                if (error == 0)
1197                        time_out_leases(inode);
1198                /* Wait for the next lease that has not been broken yet */
1199                for (flock = inode->i_flock; flock && IS_LEASE(flock);
1200                                flock = flock->fl_next) {
1201                        if (flock->fl_type & F_INPROGRESS)
1202                                goto restart;
1203                }
1204                error = 0;
1205        }
1206
1207out:
1208        unlock_kernel();
1209        if (!alloc_err)
1210                locks_free_lock(new_fl);
1211        return error;
1212}
1213
1214EXPORT_SYMBOL(__break_lease);
1215
1216/**
1217 *      lease_get_mtime
1218 *      @inode: the inode
1219 *      @time:  pointer to a timespec which will contain the last modified time
1220 *
1221 * This is to force NFS clients to flush their caches for files with
1222 * exclusive leases.  The justification is that if someone has an
1223 * exclusive lease, then they could be modifiying it.
1224 */
1225void lease_get_mtime(struct inode *inode, struct timespec *time)
1226{
1227        struct file_lock *flock = inode->i_flock;
1228        if (flock && IS_LEASE(flock) && (flock->fl_type & F_WRLCK))
1229                *time = current_fs_time(inode->i_sb);
1230        else
1231                *time = inode->i_mtime;
1232}
1233
1234EXPORT_SYMBOL(lease_get_mtime);
1235
1236/**
1237 *      fcntl_getlease - Enquire what lease is currently active
1238 *      @filp: the file
1239 *
1240 *      The value returned by this function will be one of
1241 *      (if no lease break is pending):
1242 *
1243 *      %F_RDLCK to indicate a shared lease is held.
1244 *
1245 *      %F_WRLCK to indicate an exclusive lease is held.
1246 *
1247 *      %F_UNLCK to indicate no lease is held.
1248 *
1249 *      (if a lease break is pending):
1250 *
1251 *      %F_RDLCK to indicate an exclusive lease needs to be
1252 *              changed to a shared lease (or removed).
1253 *
1254 *      %F_UNLCK to indicate the lease needs to be removed.
1255 *
1256 *      XXX: sfr & willy disagree over whether F_INPROGRESS
1257 *      should be returned to userspace.
1258 */
1259int fcntl_getlease(struct file *filp)
1260{
1261        struct file_lock *fl;
1262        int type = F_UNLCK;
1263
1264        lock_kernel();
1265        time_out_leases(filp->f_dentry->d_inode);
1266        for (fl = filp->f_dentry->d_inode->i_flock; fl && IS_LEASE(fl);
1267                        fl = fl->fl_next) {
1268                if (fl->fl_file == filp) {
1269                        type = fl->fl_type & ~F_INPROGRESS;
1270                        break;
1271                }
1272        }
1273        unlock_kernel();
1274        return type;
1275}
1276
1277/**
1278 *      __setlease      -       sets a lease on an open file
1279 *      @filp: file pointer
1280 *      @arg: type of lease to obtain
1281 *      @flp: input - file_lock to use, output - file_lock inserted
1282 *
1283 *      The (input) flp->fl_lmops->fl_break function is required
1284 *      by break_lease().
1285 *
1286 *      Called with kernel lock held.
1287 */
1288int __setlease(struct file *filp, long arg, struct file_lock **flp)
1289{
1290        struct file_lock *fl, **before, **my_before = NULL, *lease = *flp;
1291        struct dentry *dentry = filp->f_dentry;
1292        struct inode *inode = dentry->d_inode;
1293        int error, rdlease_count = 0, wrlease_count = 0;
1294
1295        time_out_leases(inode);
1296
1297        error = -EINVAL;
1298        if (!flp || !(*flp) || !(*flp)->fl_lmops || !(*flp)->fl_lmops->fl_break)
1299                goto out;
1300
1301        error = -EAGAIN;
1302        if ((arg == F_RDLCK) && (atomic_read(&inode->i_writecount) > 0))
1303                goto out;
1304        if ((arg == F_WRLCK)
1305            && ((atomic_read(&dentry->d_count) > 1)
1306                || (atomic_read(&inode->i_count) > 1)))
1307                goto out;
1308
1309        /*
1310         * At this point, we know that if there is an exclusive
1311         * lease on this file, then we hold it on this filp
1312         * (otherwise our open of this file would have blocked).
1313         * And if we are trying to acquire an exclusive lease,
1314         * then the file is not open by anyone (including us)
1315         * except for this filp.
1316         */
1317        for (before = &inode->i_flock;
1318                        ((fl = *before) != NULL) && IS_LEASE(fl);
1319                        before = &fl->fl_next) {
1320                if (fl->fl_file == filp)
1321                        my_before = before;
1322                else if (fl->fl_type == (F_INPROGRESS | F_UNLCK))
1323                        /*
1324                         * Someone is in the process of opening this
1325                         * file for writing so we may not take an
1326                         * exclusive lease on it.
1327                         */
1328                        wrlease_count++;
1329                else
1330                        rdlease_count++;
1331        }
1332
1333        if ((arg == F_RDLCK && (wrlease_count > 0)) ||
1334            (arg == F_WRLCK && ((rdlease_count + wrlease_count) > 0)))
1335                goto out;
1336
1337        if (my_before != NULL) {
1338                error = lease_modify(my_before, arg);
1339                goto out;
1340        }
1341
1342        error = 0;
1343        if (arg == F_UNLCK)
1344                goto out;
1345
1346        error = -EINVAL;
1347        if (!leases_enable)
1348                goto out;
1349
1350        error = lease_alloc(filp, arg, &fl);
1351        if (error)
1352                goto out;
1353
1354        locks_copy_lock(fl, lease);
1355
1356        locks_insert_lock(before, fl);
1357
1358        *flp = fl;
1359out:
1360        return error;
1361}
1362
1363 /**
1364 *      setlease        -       sets a lease on an open file
1365 *      @filp: file pointer
1366 *      @arg: type of lease to obtain
1367 *      @lease: file_lock to use
1368 *
1369 *      Call this to establish a lease on the file.
1370 *      The fl_lmops fl_break function is required by break_lease
1371 */
1372
1373int setlease(struct file *filp, long arg, struct file_lock **lease)
1374{
1375        struct dentry *dentry = filp->f_dentry;
1376        struct inode *inode = dentry->d_inode;
1377        int error;
1378
1379        if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE))
1380                return -EACCES;
1381        if (!S_ISREG(inode->i_mode))
1382                return -EINVAL;
1383        error = security_file_lock(filp, arg);
1384        if (error)
1385                return error;
1386
1387        lock_kernel();
1388        error = __setlease(filp, arg, lease);
1389        unlock_kernel();
1390
1391        return error;
1392}
1393
1394EXPORT_SYMBOL(setlease);
1395
1396/**
1397 *      fcntl_setlease  -       sets a lease on an open file
1398 *      @fd: open file descriptor
1399 *      @filp: file pointer
1400 *      @arg: type of lease to obtain
1401 *
1402 *      Call this fcntl to establish a lease on the file.
1403 *      Note that you also need to call %F_SETSIG to
1404 *      receive a signal when the lease is broken.
1405 */
1406int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
1407{
1408        struct file_lock fl, *flp = &fl;
1409        struct dentry *dentry = filp->f_dentry;
1410        struct inode *inode = dentry->d_inode;
1411        int error;
1412
1413        if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE))
1414                return -EACCES;
1415        if (!S_ISREG(inode->i_mode))
1416                return -EINVAL;
1417        error = security_file_lock(filp, arg);
1418        if (error)
1419                return error;
1420
1421        locks_init_lock(&fl);
1422        error = lease_init(filp, arg, &fl);
1423        if (error)
1424                return error;
1425
1426        lock_kernel();
1427
1428        error = __setlease(filp, arg, &flp);
1429        if (error)
1430                goto out_unlock;
1431
1432        error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
1433        if (error < 0) {
1434                /* remove lease just inserted by __setlease */
1435                flp->fl_type = F_UNLCK | F_INPROGRESS;
1436                flp->fl_break_time = jiffies- 10;
1437                time_out_leases(inode);
1438                goto out_unlock;
1439        }
1440
1441        error = f_setown(filp, current->pid, 0);
1442out_unlock:
1443        unlock_kernel();
1444        return error;
1445}
1446
1447/**
1448 * flock_lock_file_wait - Apply a FLOCK-style lock to a file
1449 * @filp: The file to apply the lock to
1450 * @fl: The lock to be applied
1451 *
1452 * Add a FLOCK style lock to a file.
1453 */
1454int flock_lock_file_wait(struct file *filp, struct file_lock *fl)
1455{
1456        int error;
1457        might_sleep();
1458        for (;;) {
1459                error = flock_lock_file(filp, fl);
1460                if ((error != -EAGAIN) || !(fl->fl_flags & FL_SLEEP))
1461                        break;
1462                error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
1463                if (!error)
1464                        continue;
1465
1466                locks_delete_block(fl);
1467                break;
1468        }
1469        return error;
1470}
1471
1472EXPORT_SYMBOL(flock_lock_file_wait);
1473
1474/**
1475 *      sys_flock: - flock() system call.
1476 *      @fd: the file descriptor to lock.
1477 *      @cmd: the type of lock to apply.
1478 *
1479 *      Apply a %FL_FLOCK style lock to an open file descriptor.
1480 *      The @cmd can be one of
1481 *
1482 *      %LOCK_SH -- a shared lock.
1483 *
1484 *      %LOCK_EX -- an exclusive lock.
1485 *
1486 *      %LOCK_UN -- remove an existing lock.
1487 *
1488 *      %LOCK_MAND -- a `mandatory' flock.  This exists to emulate Windows Share Modes.
1489 *
1490 *      %LOCK_MAND can be combined with %LOCK_READ or %LOCK_WRITE to allow other
1491 *      processes read and write access respectively.
1492 */
1493asmlinkage long sys_flock(unsigned int fd, unsigned int cmd)
1494{
1495        struct file *filp;
1496        struct file_lock *lock;
1497        int can_sleep, unlock;
1498        int error;
1499
1500        error = -EBADF;
1501        filp = fget(fd);
1502        if (!filp)
1503                goto out;
1504
1505        can_sleep = !(cmd & LOCK_NB);
1506        cmd &= ~LOCK_NB;
1507        unlock = (cmd == LOCK_UN);
1508
1509        if (!unlock && !(cmd & LOCK_MAND) && !(filp->f_mode & 3))
1510                goto out_putf;
1511
1512        error = flock_make_lock(filp, &lock, cmd);
1513        if (error)
1514                goto out_putf;
1515        if (can_sleep)
1516                lock->fl_flags |= FL_SLEEP;
1517
1518        error = security_file_lock(filp, cmd);
1519        if (error)
1520                goto out_free;
1521
1522        if (filp->f_op && filp->f_op->flock)
1523                error = filp->f_op->flock(filp,
1524                                          (can_sleep) ? F_SETLKW : F_SETLK,
1525                                          lock);
1526        else
1527                error = flock_lock_file_wait(filp, lock);
1528
1529 out_free:
1530        if (list_empty(&lock->fl_link)) {
1531                locks_free_lock(lock);
1532        }
1533
1534 out_putf:
1535        fput(filp);
1536 out:
1537        return error;
1538}
1539
1540/* Report the first existing lock that would conflict with l.
1541 * This implements the F_GETLK command of fcntl().
1542 */
1543int fcntl_getlk(struct file *filp, struct flock __user *l)
1544{
1545        struct file_lock *fl, file_lock;
1546        struct flock flock;
1547        int error;
1548
1549        error = -EFAULT;
1550        if (copy_from_user(&flock, l, sizeof(flock)))
1551                goto out;
1552        error = -EINVAL;
1553        if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK))
1554                goto out;
1555
1556        error = flock_to_posix_lock(filp, &file_lock, &flock);
1557        if (error)
1558                goto out;
1559
1560        if (filp->f_op && filp->f_op->lock) {
1561                error = filp->f_op->lock(filp, F_GETLK, &file_lock);
1562                if (error < 0)
1563                        goto out;
1564                else
1565                  fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock);
1566        } else {
1567                fl = posix_test_lock(filp, &file_lock);
1568        }
1569 
1570        flock.l_type = F_UNLCK;
1571        if (fl != NULL) {
1572                flock.l_pid = fl->fl_pid;
1573#if BITS_PER_LONG == 32
1574                /*
1575                 * Make sure we can represent the posix lock via
1576                 * legacy 32bit flock.
1577                 */
1578                error = -EOVERFLOW;
1579                if (fl->fl_start > OFFT_OFFSET_MAX)
1580                        goto out;
1581                if ((fl->fl_end != OFFSET_MAX)
1582                    && (fl->fl_end > OFFT_OFFSET_MAX))
1583                        goto out;
1584#endif
1585                flock.l_start = fl->fl_start;
1586                flock.l_len = fl->fl_end == OFFSET_MAX ? 0 :
1587                        fl->fl_end - fl->fl_start + 1;
1588                flock.l_whence = 0;
1589                flock.l_type = fl->fl_type;
1590        }
1591        error = -EFAULT;
1592        if (!copy_to_user(l, &flock, sizeof(flock)))
1593                error = 0;
1594out:
1595        return error;
1596}
1597
1598/* Apply the lock described by l to an open file descriptor.
1599 * This implements both the F_SETLK and F_SETLKW commands of fcntl().
1600 */
1601int fcntl_setlk(struct file *filp, unsigned int cmd, struct flock __user *l)
1602{
1603        struct file_lock *file_lock = locks_alloc_lock();
1604        struct flock flock;
1605        struct inode *inode;
1606        int error;
1607
1608        if (file_lock == NULL)
1609                return -ENOLCK;
1610
1611        /*
1612         * This might block, so we do it before checking the inode.
1613         */
1614        error = -EFAULT;
1615        if (copy_from_user(&flock, l, sizeof(flock)))
1616                goto out;
1617
1618        inode = filp->f_dentry->d_inode;
1619
1620        /* Don't allow mandatory locks on files that may be memory mapped
1621         * and shared.
1622         */
1623        if (IS_MANDLOCK(inode) &&
1624            (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
1625            mapping_writably_mapped(filp->f_mapping)) {
1626                error = -EAGAIN;
1627                goto out;
1628        }
1629
1630        error = flock_to_posix_lock(filp, file_lock, &flock);
1631        if (error)
1632                goto out;
1633        if (cmd == F_SETLKW) {
1634                file_lock->fl_flags |= FL_SLEEP;
1635        }
1636        
1637        error = -EBADF;
1638        switch (flock.l_type) {
1639        case F_RDLCK:
1640                if (!(filp->f_mode & FMODE_READ))
1641                        goto out;
1642                break;
1643        case F_WRLCK:
1644                if (!(filp->f_mode & FMODE_WRITE))
1645                        goto out;
1646                break;
1647        case F_UNLCK:
1648                break;
1649        default:
1650                error = -EINVAL;
1651                goto out;
1652        }
1653
1654        error = security_file_lock(filp, file_lock->fl_type);
1655        if (error)
1656                goto out;
1657
1658        if (filp->f_op && filp->f_op->lock != NULL) {
1659                error = filp->f_op->lock(filp, cmd, file_lock);
1660                goto out;
1661        }
1662
1663        for (;;) {
1664                error = __posix_lock_file(inode, file_lock);
1665                if ((error != -EAGAIN) || (cmd == F_SETLK))
1666                        break;
1667                error = wait_event_interruptible(file_lock->fl_wait,
1668                                !file_lock->fl_next);
1669                if (!error)
1670                        continue;
1671
1672                locks_delete_block(file_lock);
1673                break;
1674        }
1675
1676 out:
1677        locks_free_lock(file_lock);
1678        return error;
1679}
1680
1681#if BITS_PER_LONG == 32
1682/* Report the first existing lock that would conflict with l.
1683 * This implements the F_GETLK command of fcntl().
1684 */
1685int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
1686{
1687        struct file_lock *fl, file_lock;
1688        struct flock64 flock;
1689        int error;
1690
1691        error = -EFAULT;
1692        if (copy_from_user(&flock, l, sizeof(flock)))
1693                goto out;
1694        error = -EINVAL;
1695        if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK))
1696                goto out;
1697
1698        error = flock64_to_posix_lock(filp, &file_lock, &flock);
1699        if (error)
1700                goto out;
1701
1702        if (filp->f_op && filp->f_op->lock) {
1703                error = filp->f_op->lock(filp, F_GETLK, &file_lock);
1704                if (error < 0)
1705                        goto out;
1706                else
1707                  fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock);
1708        } else {
1709                fl = posix_test_lock(filp, &file_lock);
1710        }
1711 
1712        flock.l_type = F_UNLCK;
1713        if (fl != NULL) {
1714                flock.l_pid = fl->fl_pid;
1715                flock.l_start = fl->fl_start;
1716                flock.l_len = fl->fl_end == OFFSET_MAX ? 0 :
1717                        fl->fl_end - fl->fl_start + 1;
1718                flock.l_whence = 0;
1719                flock.l_type = fl->fl_type;
1720        }
1721        error = -EFAULT;
1722        if (!copy_to_user(l, &flock, sizeof(flock)))
1723                error = 0;
1724  
1725out:
1726        return error;
1727}
1728
1729/* Apply the lock described by l to an open file descriptor.
1730 * This implements both the F_SETLK and F_SETLKW commands of fcntl().
1731 */
1732int fcntl_setlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l)
1733{
1734        struct file_lock *file_lock = locks_alloc_lock();
1735        struct flock64 flock;
1736        struct inode *inode;
1737        int error;
1738
1739        if (file_lock == NULL)
1740                return -ENOLCK;
1741
1742        /*
1743         * This might block, so we do it before checking the inode.
1744         */
1745        error = -EFAULT;
1746        if (copy_from_user(&flock, l, sizeof(flock)))
1747                goto out;
1748
1749        inode = filp->f_dentry->d_inode;
1750
1751        /* Don't allow mandatory locks on files that may be memory mapped
1752         * and shared.
1753         */
1754        if (IS_MANDLOCK(inode) &&
1755            (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
1756            mapping_writably_mapped(filp->f_mapping)) {
1757                error = -EAGAIN;
1758                goto out;
1759        }
1760
1761        error = flock64_to_posix_lock(filp, file_lock, &flock);
1762        if (error)
1763                goto out;
1764        if (cmd == F_SETLKW64) {
1765                file_lock->fl_flags |= FL_SLEEP;
1766        }
1767        
1768        error = -EBADF;
1769        switch (flock.l_type) {
1770        case F_RDLCK:
1771                if (!(filp->f_mode & FMODE_READ))
1772                        goto out;
1773                break;
1774        case F_WRLCK:
1775                if (!(filp->f_mode & FMODE_WRITE))
1776                        goto out;
1777                break;
1778        case F_UNLCK:
1779                break;
1780        default:
1781                error = -EINVAL;
1782                goto out;
1783        }
1784
1785        error = security_file_lock(filp, file_lock->fl_type);
1786        if (error)
1787                goto out;
1788
1789        if (filp->f_op && filp->f_op->lock != NULL) {
1790                error = filp->f_op->lock(filp, cmd, file_lock);
1791                goto out;
1792        }
1793
1794        for (;;) {
1795                error = __posix_lock_file(inode, file_lock);
1796                if ((error != -EAGAIN) || (cmd == F_SETLK64))
1797                        break;
1798                error = wait_event_interruptible(file_lock->fl_wait,
1799                                !file_lock->fl_next);
1800                if (!error)
1801                        continue;
1802
1803                locks_delete_block(file_lock);
1804                break;
1805        }
1806
1807out:
1808        locks_free_lock(file_lock);
1809        return error;
1810}
1811#endif /* BITS_PER_LONG == 32 */
1812
1813/*
1814 * This function is called when the file is being removed
1815 * from the task's fd array.  POSIX locks belonging to this task
1816 * are deleted at this time.
1817 */
1818void locks_remove_posix(struct file *filp, fl_owner_t owner)
1819{
1820        struct file_lock lock, **before;
1821
1822        /*
1823         * If there are no locks held on this file, we don't need to call
1824         * posix_lock_file().  Another process could be setting a lock on this
1825         * file at the same time, but we wouldn't remove that lock anyway.
1826         */
1827        before = &filp->f_dentry->d_inode->i_flock;
1828        if (*before == NULL)
1829                return;
1830
1831        lock.fl_type = F_UNLCK;
1832        lock.fl_flags = FL_POSIX;
1833        lock.fl_start = 0;
1834        lock.fl_end = OFFSET_MAX;
1835        lock.fl_owner = owner;
1836        lock.fl_pid = current->tgid;
1837        lock.fl_file = filp;
1838        lock.fl_ops = NULL;
1839        lock.fl_lmops = NULL;
1840
1841        if (filp->f_op && filp->f_op->lock != NULL) {
1842                filp->f_op->lock(filp, F_SETLK, &lock);
1843                goto out;
1844        }
1845
1846        /* Can't use posix_lock_file here; we need to remove it no matter
1847         * which pid we have.
1848         */
1849        lock_kernel();
1850        while (*before != NULL) {
1851                struct file_lock *fl = *before;
1852                if (IS_POSIX(fl) && posix_same_owner(fl, &lock)) {
1853                        locks_delete_lock(before);
1854                        continue;
1855                }
1856                before = &fl->fl_next;
1857        }
1858        unlock_kernel();
1859out:
1860        if (lock.fl_ops && lock.fl_ops->fl_release_private)
1861                lock.fl_ops->fl_release_private(&lock);
1862}
1863
1864EXPORT_SYMBOL(locks_remove_posix);
1865
1866/*
1867 * This function is called on the last close of an open file.
1868 */
1869void locks_remove_flock(struct file *filp)
1870{
1871        struct inode * inode = filp->f_dentry->d_inode; 
1872        struct file_lock *fl;
1873        struct file_lock **before;
1874
1875        if (!inode->i_flock)
1876                return;
1877
1878        if (filp->f_op && filp->f_op->flock) {
1879                struct file_lock fl = { .fl_flags = FL_FLOCK,
1880                                        .fl_type = F_UNLCK };
1881                filp->f_op->flock(filp, F_SETLKW, &fl);
1882        }
1883
1884        lock_kernel();
1885        before = &inode->i_flock;
1886
1887        while ((fl = *before) != NULL) {
1888                if (fl->fl_file == filp) {
1889                        /*
1890                         * We might have a POSIX lock that was created at the same time
1891                         * the filp was closed for the last time. Just remove that too,
1892                         * regardless of ownership, since nobody can own it.
1893                         */
1894                        if (IS_FLOCK(fl) || IS_POSIX(fl)) {
1895                                locks_delete_lock(before);
1896                                continue;
1897                        }
1898                        if (IS_LEASE(fl)) {
1899                                lease_modify(before, F_UNLCK);
1900                                continue;
1901                        }
1902                        /* What? */
1903                        BUG();
1904                }
1905                before = &fl->fl_next;
1906        }
1907        unlock_kernel();
1908}
1909
1910/**
1911 *      posix_block_lock - blocks waiting for a file lock
1912 *      @blocker: the lock which is blocking
1913 *      @waiter: the lock which conflicts and has to wait
1914 *
1915 * lockd needs to block waiting for locks.
1916 */
1917void
1918posix_block_lock(struct file_lock *blocker, struct file_lock *waiter)
1919{
1920        locks_insert_block(blocker, waiter);
1921}
1922
1923EXPORT_SYMBOL(posix_block_lock);
1924
1925/**
1926 *      posix_unblock_lock - stop waiting for a file lock
1927 *      @filp:   how the file was opened
1928 *      @waiter: the lock which was waiting
1929 *
1930 *      lockd needs to block waiting for locks.
1931 */
1932void
1933posix_unblock_lock(struct file *filp, struct file_lock *waiter)
1934{
1935        /* 
1936         * A remote machine may cancel the lock request after it's been
1937         * granted locally.  If that happens, we need to delete the lock.
1938         */
1939        lock_kernel();
1940        if (waiter->fl_next) {
1941                __locks_delete_block(waiter);
1942                unlock_kernel();
1943        } else {
1944                unlock_kernel();
1945                waiter->fl_type = F_UNLCK;
1946                posix_lock_file(filp, waiter);
1947        }
1948}
1949
1950EXPORT_SYMBOL(posix_unblock_lock);
1951
1952static void lock_get_status(char* out, struct file_lock *fl, int id, char *pfx)
1953{
1954        struct inode *inode = NULL;
1955
1956        if (fl->fl_file != NULL)
1957                inode = fl->fl_file->f_dentry->d_inode;
1958
1959        out += sprintf(out, "%d:%s ", id, pfx);
1960        if (IS_POSIX(fl)) {
1961                out += sprintf(out, "%6s %s ",
1962                             (fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ",
1963                             (inode == NULL) ? "*NOINODE*" :
1964                             (IS_MANDLOCK(inode) &&
1965                              (inode->i_mode & (S_IXGRP | S_ISGID)) == S_ISGID) ?
1966                             "MANDATORY" : "ADVISORY ");
1967        } else if (IS_FLOCK(fl)) {
1968                if (fl->fl_type & LOCK_MAND) {
1969                        out += sprintf(out, "FLOCK  MSNFS     ");
1970                } else {
1971                        out += sprintf(out, "FLOCK  ADVISORY  ");
1972                }
1973        } else if (IS_LEASE(fl)) {
1974                out += sprintf(out, "LEASE  ");
1975                if (fl->fl_type & F_INPROGRESS)
1976                        out += sprintf(out, "BREAKING  ");
1977                else if (fl->fl_file)
1978                        out += sprintf(out, "ACTIVE    ");
1979                else
1980                        out += sprintf(out, "BREAKER   ");
1981        } else {
1982                out += sprintf(out, "UNKNOWN UNKNOWN  ");
1983        }
1984        if (fl->fl_type & LOCK_MAND) {
1985                out += sprintf(out, "%s ",
1986                               (fl->fl_type & LOCK_READ)
1987                               ? (fl->fl_type & LOCK_WRITE) ? "RW   " : "READ "
1988                               : (fl->fl_type & LOCK_WRITE) ? "WRITE" : "NONE ");
1989        } else {
1990                out += sprintf(out, "%s ",
1991                               (fl->fl_type & F_INPROGRESS)
1992                               ? (fl->fl_type & F_UNLCK) ? "UNLCK" : "READ "
1993                               : (fl->fl_type & F_WRLCK) ? "WRITE" : "READ ");
1994        }
1995        if (inode) {
1996#ifdef WE_CAN_BREAK_LSLK_NOW
1997                out += sprintf(out, "%d %s:%ld ", fl->fl_pid,
1998                                inode->i_sb->s_id, inode->i_ino);
1999#else
2000                /* userspace relies on this representation of dev_t ;-( */
2001                out += sprintf(out, "%d %02x:%02x:%ld ", fl->fl_pid,
2002                                MAJOR(inode->i_sb->s_dev),
2003                                MINOR(inode->i_sb->s_dev), inode->i_ino);
2004#endif
2005        } else {
2006                out += sprintf(out, "%d <none>:0 ", fl->fl_pid);
2007        }
2008        if (IS_POSIX(fl)) {
2009                if (fl->fl_end == OFFSET_MAX)
2010                        out += sprintf(out, "%Ld EOF\n", fl->fl_start);
2011                else
2012                        out += sprintf(out, "%Ld %Ld\n", fl->fl_start,
2013                                        fl->fl_end);
2014        } else {
2015                out += sprintf(out, "0 EOF\n");
2016        }
2017}
2018
2019static void move_lock_status(char **p, off_t* pos, off_t offset)
2020{
2021        int len;
2022        len = strlen(*p);
2023        if(*pos >= offset) {
2024                /* the complete line is valid */
2025                *p += len;
2026                *pos += len;
2027                return;
2028        }
2029        if(*pos+len > offset) {
2030                /* use the second part of the line */
2031                int i = offset-*pos;
2032                memmove(*p,*p+i,len-i);
2033                *p += len-i;
2034                *pos += len;
2035                return;
2036        }
2037        /* discard the complete line */
2038        *pos += len;
2039}
2040
2041/**
2042 *      get_locks_status        -       reports lock usage in /proc/locks
2043 *      @buffer: address in userspace to write into
2044 *      @start: ?
2045 *      @offset: how far we are through the buffer
2046 *      @length: how much to read
2047 */
2048
2049int get_locks_status(char *buffer, char **start, off_t offset, int length)
2050{
2051        struct list_head *tmp;
2052        char *q = buffer;
2053        off_t pos = 0;
2054        int i = 0;
2055
2056        lock_kernel();
2057        list_for_each(tmp, &file_lock_list) {
2058                struct list_head *btmp;
2059                struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
2060                lock_get_status(q, fl, ++i, "");
2061                move_lock_status(&q, &pos, offset);
2062
2063                if(pos >= offset+length)
2064                        goto done;
2065
2066                list_for_each(btmp, &fl->fl_block) {
2067                        struct file_lock *bfl = list_entry(btmp,
2068                                        struct file_lock, fl_block);
2069                        lock_get_status(q, bfl, i, " ->");
2070                        move_lock_status(&q, &pos, offset);
2071
2072                        if(pos >= offset+length)
2073                                goto done;
2074                }
2075        }
2076done:
2077        unlock_kernel();
2078        *start = buffer;
2079        if(q-buffer < length)
2080                return (q-buffer);
2081        return length;
2082}
2083
2084/**
2085 *      lock_may_read - checks that the region is free of locks
2086 *      @inode: the inode that is being read
2087 *      @start: the first byte to read
2088 *      @len: the number of bytes to read
2089 *
2090 *      Emulates Windows locking requirements.  Whole-file
2091 *      mandatory locks (share modes) can prohibit a read and
2092 *      byte-range POSIX locks can prohibit a read if they overlap.
2093 *
2094 *      N.B. this function is only ever called
2095 *      from knfsd and ownership of locks is never checked.
2096 */
2097int lock_may_read(struct inode *inode, loff_t start, unsigned long len)
2098{
2099        struct file_lock *fl;
2100        int result = 1;
2101        lock_kernel();
2102        for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
2103                if (IS_POSIX(fl)) {
2104                        if (fl->fl_type == F_RDLCK)
2105                                continue;
2106                        if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
2107                                continue;
2108                } else if (IS_FLOCK(fl)) {
2109                        if (!(fl->fl_type & LOCK_MAND))
2110                                continue;
2111                        if (fl->fl_type & LOCK_READ)
2112                                continue;
2113                } else
2114                        continue;
2115                result = 0;
2116                break;
2117        }
2118        unlock_kernel();
2119        return result;
2120}
2121
2122EXPORT_SYMBOL(lock_may_read);
2123
2124/**
2125 *      lock_may_write - checks that the region is free of locks
2126 *      @inode: the inode that is being written
2127 *      @start: the first byte to write
2128 *      @len: the number of bytes to write
2129 *
2130 *      Emulates Windows locking requirements.  Whole-file
2131 *      mandatory locks (share modes) can prohibit a write and
2132 *      byte-range POSIX locks can prohibit a write if they overlap.
2133 *
2134 *      N.B. this function is only ever called
2135 *      from knfsd and ownership of locks is never checked.
2136 */
2137int lock_may_write(struct inode *inode, loff_t start, unsigned long len)
2138{
2139        struct file_lock *fl;
2140        int result = 1;
2141        lock_kernel();
2142        for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
2143                if (IS_POSIX(fl)) {
2144                        if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
2145                                continue;
2146                } else if (IS_FLOCK(fl)) {
2147                        if (!(fl->fl_type & LOCK_MAND))
2148                                continue;
2149                        if (fl->fl_type & LOCK_WRITE)
2150                                continue;
2151                } else
2152                        continue;
2153                result = 0;
2154                break;
2155        }
2156        unlock_kernel();
2157        return result;
2158}
2159
2160EXPORT_SYMBOL(lock_may_write);
2161
2162static inline void __steal_locks(struct file *file, fl_owner_t from)
2163{
2164        struct inode *inode = file->f_dentry->d_inode;
2165        struct file_lock *fl = inode->i_flock;
2166
2167        while (fl) {
2168                if (fl->fl_file == file && fl->fl_owner == from)
2169                        fl->fl_owner = current->files;
2170                fl = fl->fl_next;
2171        }
2172}
2173
2174/* When getting ready for executing a binary, we make sure that current
2175 * has a files_struct on its own. Before dropping the old files_struct,
2176 * we take over ownership of all locks for all file descriptors we own.
2177 * Note that we may accidentally steal a lock for a file that a sibling
2178 * has created since the unshare_files() call.
2179 */
2180void steal_locks(fl_owner_t from)
2181{
2182        struct files_struct *files = current->files;
2183        int i, j;
2184
2185        if (from == files)
2186                return;
2187
2188        lock_kernel();
2189        j = 0;
2190        for (;;) {
2191                unsigned long set;
2192                i = j * __NFDBITS;
2193                if (i >= files->max_fdset || i >= files->max_fds)
2194                        break;
2195                set = files->open_fds->fds_bits[j++];
2196                while (set) {
2197                        if (set & 1) {
2198                                struct file *file = files->fd[i];
2199                                if (file)
2200                                        __steal_locks(file, from);
2201                        }
2202                        i++;
2203                        set >>= 1;
2204                }
2205        }
2206        unlock_kernel();
2207}
2208EXPORT_SYMBOL(steal_locks);
2209
2210static int __init filelock_init(void)
2211{
2212        filelock_cache = kmem_cache_create("file_lock_cache",
2213                        sizeof(struct file_lock), 0, SLAB_PANIC,
2214                        init_once, NULL);
2215        return 0;
2216}
2217
2218core_initcall(filelock_init);
2219
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.