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