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