~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/fs/locks.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.