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
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.