1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117#include <linux/capability.h>
118#include <linux/file.h>
119#include <linux/fdtable.h>
120#include <linux/fs.h>
121#include <linux/init.h>
122#include <linux/module.h>
123#include <linux/security.h>
124#include <linux/slab.h>
125#include <linux/smp_lock.h>
126#include <linux/syscalls.h>
127#include <linux/time.h>
128#include <linux/rcupdate.h>
129#include <linux/pid_namespace.h>
130
131#include <asm/uaccess.h>
132
133#define IS_POSIX(fl) (fl->fl_flags & FL_POSIX)
134#define IS_FLOCK(fl) (fl->fl_flags & FL_FLOCK)
135#define IS_LEASE(fl) (fl->fl_flags & FL_LEASE)
136
137int leases_enable = 1;
138int lease_break_time = 45;
139
140#define for_each_lock(inode, lockp) \
141 for (lockp = &inode->i_flock; *lockp != NULL; lockp = &(*lockp)->fl_next)
142
143static LIST_HEAD(file_lock_list);
144static LIST_HEAD(blocked_list);
145
146static struct kmem_cache *filelock_cache __read_mostly;
147
148
149static struct file_lock *locks_alloc_lock(void)
150{
151 return kmem_cache_alloc(filelock_cache, GFP_KERNEL);
152}
153
154void locks_release_private(struct file_lock *fl)
155{
156 if (fl->fl_ops) {
157 if (fl->fl_ops->fl_release_private)
158 fl->fl_ops->fl_release_private(fl);
159 fl->fl_ops = NULL;
160 }
161 if (fl->fl_lmops) {
162 if (fl->fl_lmops->fl_release_private)
163 fl->fl_lmops->fl_release_private(fl);
164 fl->fl_lmops = NULL;
165 }
166
167}
168EXPORT_SYMBOL_GPL(locks_release_private);
169
170
171static void locks_free_lock(struct file_lock *fl)
172{
173 BUG_ON(waitqueue_active(&fl->fl_wait));
174 BUG_ON(!list_empty(&fl->fl_block));
175 BUG_ON(!list_empty(&fl->fl_link));
176
177 locks_release_private(fl);
178 kmem_cache_free(filelock_cache, fl);
179}
180
181void locks_init_lock(struct file_lock *fl)
182{
183 INIT_LIST_HEAD(&fl->fl_link);
184 INIT_LIST_HEAD(&fl->fl_block);
185 init_waitqueue_head(&fl->fl_wait);
186 fl->fl_next = NULL;
187 fl->fl_fasync = NULL;
188 fl->fl_owner = NULL;
189 fl->fl_pid = 0;
190 fl->fl_nspid = NULL;
191 fl->fl_file = NULL;
192 fl->fl_flags = 0;
193 fl->fl_type = 0;
194 fl->fl_start = fl->fl_end = 0;
195 fl->fl_ops = NULL;
196 fl->fl_lmops = NULL;
197}
198
199EXPORT_SYMBOL(locks_init_lock);
200
201
202
203
204
205static void init_once(void *foo)
206{
207 struct file_lock *lock = (struct file_lock *) foo;
208
209 locks_init_lock(lock);
210}
211
212static void locks_copy_private(struct file_lock *new, struct file_lock *fl)
213{
214 if (fl->fl_ops) {
215 if (fl->fl_ops->fl_copy_lock)
216 fl->fl_ops->fl_copy_lock(new, fl);
217 new->fl_ops = fl->fl_ops;
218 }
219 if (fl->fl_lmops) {
220 if (fl->fl_lmops->fl_copy_lock)
221 fl->fl_lmops->fl_copy_lock(new, fl);
222 new->fl_lmops = fl->fl_lmops;
223 }
224}
225
226
227
228
229void __locks_copy_lock(struct file_lock *new, const struct file_lock *fl)
230{
231 new->fl_owner = fl->fl_owner;
232 new->fl_pid = fl->fl_pid;
233 new->fl_file = NULL;
234 new->fl_flags = fl->fl_flags;
235 new->fl_type = fl->fl_type;
236 new->fl_start = fl->fl_start;
237 new->fl_end = fl->fl_end;
238 new->fl_ops = NULL;
239 new->fl_lmops = NULL;
240}
241EXPORT_SYMBOL(__locks_copy_lock);
242
243void locks_copy_lock(struct file_lock *new, struct file_lock *fl)
244{
245 locks_release_private(new);
246
247 __locks_copy_lock(new, fl);
248 new->fl_file = fl->fl_file;
249 new->fl_ops = fl->fl_ops;
250 new->fl_lmops = fl->fl_lmops;
251
252 locks_copy_private(new, fl);
253}
254
255EXPORT_SYMBOL(locks_copy_lock);
256
257static inline int flock_translate_cmd(int cmd) {
258 if (cmd & LOCK_MAND)
259 return cmd & (LOCK_MAND | LOCK_RW);
260 switch (cmd) {
261 case LOCK_SH:
262 return F_RDLCK;
263 case LOCK_EX:
264 return F_WRLCK;
265 case LOCK_UN:
266 return F_UNLCK;
267 }
268 return -EINVAL;
269}
270
271
272static int flock_make_lock(struct file *filp, struct file_lock **lock,
273 unsigned int cmd)
274{
275 struct file_lock *fl;
276 int type = flock_translate_cmd(cmd);
277 if (type < 0)
278 return type;
279
280 fl = locks_alloc_lock();
281 if (fl == NULL)
282 return -ENOMEM;
283
284 fl->fl_file = filp;
285 fl->fl_pid = current->tgid;
286 fl->fl_flags = FL_FLOCK;
287 fl->fl_type = type;
288 fl->fl_end = OFFSET_MAX;
289
290 *lock = fl;
291 return 0;
292}
293
294static int assign_type(struct file_lock *fl, int type)
295{
296 switch (type) {
297 case F_RDLCK:
298 case F_WRLCK:
299 case F_UNLCK:
300 fl->fl_type = type;
301 break;
302 default:
303 return -EINVAL;
304 }
305 return 0;
306}
307
308
309
310
311static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,
312 struct flock *l)
313{
314 off_t start, end;
315
316 switch (l->l_whence) {
317 case SEEK_SET:
318 start = 0;
319 break;
320 case SEEK_CUR:
321 start = filp->f_pos;
322 break;
323 case SEEK_END:
324 start = i_size_read(filp->f_path.dentry->d_inode);
325 break;
326 default:
327 return -EINVAL;
328 }
329
330
331
332 start += l->l_start;
333 if (start < 0)
334 return -EINVAL;
335 fl->fl_end = OFFSET_MAX;
336 if (l->l_len > 0) {
337 end = start + l->l_len - 1;
338 fl->fl_end = end;
339 } else if (l->l_len < 0) {
340 end = start - 1;
341 fl->fl_end = end;
342 start += l->l_len;
343 if (start < 0)
344 return -EINVAL;
345 }
346 fl->fl_start = start;
347 if (fl->fl_end < fl->fl_start)
348 return -EOVERFLOW;
349
350 fl->fl_owner = current->files;
351 fl->fl_pid = current->tgid;
352 fl->fl_file = filp;
353 fl->fl_flags = FL_POSIX;
354 fl->fl_ops = NULL;
355 fl->fl_lmops = NULL;
356
357 return assign_type(fl, l->l_type);
358}
359
360#if BITS_PER_LONG == 32
361static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
362 struct flock64 *l)
363{
364 loff_t start;
365
366 switch (l->l_whence) {
367 case SEEK_SET:
368 start = 0;
369 break;
370 case SEEK_CUR:
371 start = filp->f_pos;
372 break;
373 case SEEK_END:
374 start = i_size_read(filp->f_path.dentry->d_inode);
375 break;
376 default:
377 return -EINVAL;
378 }
379
380 start += l->l_start;
381 if (start < 0)
382 return -EINVAL;
383 fl->fl_end = OFFSET_MAX;
384 if (l->l_len > 0) {
385 fl->fl_end = start + l->l_len - 1;
386 } else if (l->l_len < 0) {
387 fl->fl_end = start - 1;
388 start += l->l_len;
389 if (start < 0)
390 return -EINVAL;
391 }
392 fl->fl_start = start;
393 if (fl->fl_end < fl->fl_start)
394 return -EOVERFLOW;
395
396 fl->fl_owner = current->files;
397 fl->fl_pid = current->tgid;
398 fl->fl_file = filp;
399 fl->fl_flags = FL_POSIX;
400 fl->fl_ops = NULL;
401 fl->fl_lmops = NULL;
402
403 switch (l->l_type) {
404 case F_RDLCK:
405 case F_WRLCK:
406 case F_UNLCK:
407 fl->fl_type = l->l_type;
408 break;
409 default:
410 return -EINVAL;
411 }
412
413 return (0);
414}
415#endif
416
417
418static void lease_break_callback(struct file_lock *fl)
419{
420 kill_fasync(&fl->fl_fasync, SIGIO, POLL_MSG);
421}
422
423static void lease_release_private_callback(struct file_lock *fl)
424{
425 if (!fl->fl_file)
426 return;
427
428 f_delown(fl->fl_file);
429 fl->fl_file->f_owner.signum = 0;
430}
431
432static int lease_mylease_callback(struct file_lock *fl, struct file_lock *try)
433{
434 return fl->fl_file == try->fl_file;
435}
436
437static const struct lock_manager_operations lease_manager_ops = {
438 .fl_break = lease_break_callback,
439 .fl_release_private = lease_release_private_callback,
440 .fl_mylease = lease_mylease_callback,
441 .fl_change = lease_modify,
442};
443
444
445
446
447static int lease_init(struct file *filp, int type, struct file_lock *fl)
448 {
449 if (assign_type(fl, type) != 0)
450 return -EINVAL;
451
452 fl->fl_owner = current->files;
453 fl->fl_pid = current->tgid;
454
455 fl->fl_file = filp;
456 fl->fl_flags = FL_LEASE;
457 fl->fl_start = 0;
458 fl->fl_end = OFFSET_MAX;
459 fl->fl_ops = NULL;
460 fl->fl_lmops = &lease_manager_ops;
461 return 0;
462}
463
464
465static struct file_lock *lease_alloc(struct file *filp, int type)
466{
467 struct file_lock *fl = locks_alloc_lock();
468 int error = -ENOMEM;
469
470 if (fl == NULL)
471 return ERR_PTR(error);
472
473 error = lease_init(filp, type, fl);
474 if (error) {
475 locks_free_lock(fl);
476 return ERR_PTR(error);
477 }
478 return fl;
479}
480
481
482
483static inline int locks_overlap(struct file_lock *fl1, struct file_lock *fl2)
484{
485 return ((fl1->fl_end >= fl2->fl_start) &&
486 (fl2->fl_end >= fl1->fl_start));
487}
488
489
490
491
492static int posix_same_owner(struct file_lock *fl1, struct file_lock *fl2)
493{
494 if (fl1->fl_lmops && fl1->fl_lmops->fl_compare_owner)
495 return fl2->fl_lmops == fl1->fl_lmops &&
496 fl1->fl_lmops->fl_compare_owner(fl1, fl2);
497 return fl1->fl_owner == fl2->fl_owner;
498}
499
500
501
502
503static void __locks_delete_block(struct file_lock *waiter)
504{
505 list_del_init(&waiter->fl_block);
506 list_del_init(&waiter->fl_link);
507 waiter->fl_next = NULL;
508}
509
510
511
512static void locks_delete_block(struct file_lock *waiter)
513{
514 lock_kernel();
515 __locks_delete_block(waiter);
516 unlock_kernel();
517}
518
519
520
521
522
523
524static void locks_insert_block(struct file_lock *blocker,
525 struct file_lock *waiter)
526{
527 BUG_ON(!list_empty(&waiter->fl_block));
528 list_add_tail(&waiter->fl_block, &blocker->fl_block);
529 waiter->fl_next = blocker;
530 if (IS_POSIX(blocker))
531 list_add(&waiter->fl_link, &blocked_list);
532}
533
534
535
536
537
538static void locks_wake_up_blocks(struct file_lock *blocker)
539{
540 while (!list_empty(&blocker->fl_block)) {
541 struct file_lock *waiter;
542
543 waiter = list_first_entry(&blocker->fl_block,
544 struct file_lock, fl_block);
545 __locks_delete_block(waiter);
546 if (waiter->fl_lmops && waiter->fl_lmops->fl_notify)
547 waiter->fl_lmops->fl_notify(waiter);
548 else
549 wake_up(&waiter->fl_wait);
550 }
551}
552
553
554
555
556static void locks_insert_lock(struct file_lock **pos, struct file_lock *fl)
557{
558 list_add(&fl->fl_link, &file_lock_list);
559
560 fl->fl_nspid = get_pid(task_tgid(current));
561
562
563 fl->fl_next = *pos;
564 *pos = fl;
565}
566
567
568
569
570
571
572
573static void locks_delete_lock(struct file_lock **thisfl_p)
574{
575 struct file_lock *fl = *thisfl_p;
576
577 *thisfl_p = fl->fl_next;
578 fl->fl_next = NULL;
579 list_del_init(&fl->fl_link);
580
581 fasync_helper(0, fl->fl_file, 0, &fl->fl_fasync);
582 if (fl->fl_fasync != NULL) {
583 printk(KERN_ERR "locks_delete_lock: fasync == %p\n", fl->fl_fasync);
584 fl->fl_fasync = NULL;
585 }
586
587 if (fl->fl_nspid) {
588 put_pid(fl->fl_nspid);
589 fl->fl_nspid = NULL;
590 }
591
592 locks_wake_up_blocks(fl);
593 locks_free_lock(fl);
594}
595
596
597
598
599static int locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
600{
601 if (sys_fl->fl_type == F_WRLCK)
602 return 1;
603 if (caller_fl->fl_type == F_WRLCK)
604 return 1;
605 return 0;
606}
607
608
609
610
611static int posix_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
612{
613
614
615
616 if (!IS_POSIX(sys_fl) || posix_same_owner(caller_fl, sys_fl))
617 return (0);
618
619
620 if (!locks_overlap(caller_fl, sys_fl))
621 return 0;
622
623 return (locks_conflict(caller_fl, sys_fl));
624}
625
626
627
628
629static int flock_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
630{
631
632
633
634 if (!IS_FLOCK(sys_fl) || (caller_fl->fl_file == sys_fl->fl_file))
635 return (0);
636 if ((caller_fl->fl_type & LOCK_MAND) || (sys_fl->fl_type & LOCK_MAND))
637 return 0;
638
639 return (locks_conflict(caller_fl, sys_fl));
640}
641
642void
643posix_test_lock(struct file *filp, struct file_lock *fl)
644{
645 struct file_lock *cfl;
646
647 lock_kernel();
648 for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) {
649 if (!IS_POSIX(cfl))
650 continue;
651 if (posix_locks_conflict(fl, cfl))
652 break;
653 }
654 if (cfl) {
655 __locks_copy_lock(fl, cfl);
656 if (cfl->fl_nspid)
657 fl->fl_pid = pid_vnr(cfl->fl_nspid);
658 } else
659 fl->fl_type = F_UNLCK;
660 unlock_kernel();
661 return;
662}
663EXPORT_SYMBOL(posix_test_lock);
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690#define MAX_DEADLK_ITERATIONS 10
691
692
693static struct file_lock *what_owner_is_waiting_for(struct file_lock *block_fl)
694{
695 struct file_lock *fl;
696
697 list_for_each_entry(fl, &blocked_list, fl_link) {
698 if (posix_same_owner(fl, block_fl))
699 return fl->fl_next;
700 }
701 return NULL;
702}
703
704static int posix_locks_deadlock(struct file_lock *caller_fl,
705 struct file_lock *block_fl)
706{
707 int i = 0;
708
709 while ((block_fl = what_owner_is_waiting_for(block_fl))) {
710 if (i++ > MAX_DEADLK_ITERATIONS)
711 return 0;
712 if (posix_same_owner(caller_fl, block_fl))
713 return 1;
714 }
715 return 0;
716}
717
718
719
720
721
722
723
724
725static int flock_lock_file(struct file *filp, struct file_lock *request)
726{
727 struct file_lock *new_fl = NULL;
728 struct file_lock **before;
729 struct inode * inode = filp->f_path.dentry->d_inode;
730 int error = 0;
731 int found = 0;
732
733 lock_kernel();
734 if (request->fl_flags & FL_ACCESS)
735 goto find_conflict;
736
737 if (request->fl_type != F_UNLCK) {
738 error = -ENOMEM;
739 new_fl = locks_alloc_lock();
740 if (new_fl == NULL)
741 goto out;
742 error = 0;
743 }
744
745 for_each_lock(inode, before) {
746 struct file_lock *fl = *before;
747 if (IS_POSIX(fl))
748 break;
749 if (IS_LEASE(fl))
750 continue;
751 if (filp != fl->fl_file)
752 continue;
753 if (request->fl_type == fl->fl_type)
754 goto out;
755 found = 1;
756 locks_delete_lock(before);
757 break;
758 }
759
760 if (request->fl_type == F_UNLCK) {
761 if ((request->fl_flags & FL_EXISTS) && !found)
762 error = -ENOENT;
763 goto out;
764 }
765
766
767
768
769
770 if (found)
771 cond_resched();
772
773find_conflict:
774 for_each_lock(inode, before) {
775 struct file_lock *fl = *before;
776 if (IS_POSIX(fl))
777 break;
778 if (IS_LEASE(fl))
779 continue;
780 if (!flock_locks_conflict(request, fl))
781 continue;
782 error = -EAGAIN;
783 if (!(request->fl_flags & FL_SLEEP))
784 goto out;
785 error = FILE_LOCK_DEFERRED;
786 locks_insert_block(fl, request);
787 goto out;
788 }
789 if (request->fl_flags & FL_ACCESS)
790 goto out;
791 locks_copy_lock(new_fl, request);
792 locks_insert_lock(before, new_fl);
793 new_fl = NULL;
794 error = 0;
795
796out:
797 unlock_kernel();
798 if (new_fl)
799 locks_free_lock(new_fl);
800 return error;
801}
802
803static int __posix_lock_file(struct inode *inode, struct file_lock *request, struct file_lock *conflock)
804{
805 struct file_lock *fl;
806 struct file_lock *new_fl = NULL;
807 struct file_lock *new_fl2 = NULL;
808 struct file_lock *left = NULL;
809 struct file_lock *right = NULL;
810 struct file_lock **before;
811 int error, added = 0;
812
813
814
815
816
817
818
819 if (!(request->fl_flags & FL_ACCESS) &&
820 (request->fl_type != F_UNLCK ||
821 request->fl_start != 0 || request->fl_end != OFFSET_MAX)) {
822 new_fl = locks_alloc_lock();
823 new_fl2 = locks_alloc_lock();
824 }
825
826 lock_kernel();
827 if (request->fl_type != F_UNLCK) {
828 for_each_lock(inode, before) {
829 fl = *before;
830 if (!IS_POSIX(fl))
831 continue;
832 if (!posix_locks_conflict(request, fl))
833 continue;
834 if (conflock)
835 __locks_copy_lock(conflock, fl);
836 error = -EAGAIN;
837 if (!(request->fl_flags & FL_SLEEP))
838 goto out;
839 error = -EDEADLK;
840 if (posix_locks_deadlock(request, fl))
841 goto out;
842 error = FILE_LOCK_DEFERRED;
843 locks_insert_block(fl, request);
844 goto out;
845 }
846 }
847
848
849 error = 0;
850 if (request->fl_flags & FL_ACCESS)
851 goto out;
852
853
854
855
856
857 before = &inode->i_flock;
858
859
860 while ((fl = *before) && (!IS_POSIX(fl) ||
861 !posix_same_owner(request, fl))) {
862 before = &fl->fl_next;
863 }
864
865
866 while ((fl = *before) && posix_same_owner(request, fl)) {
867
868
869 if (request->fl_type == fl->fl_type) {
870
871
872
873
874 if (fl->fl_end < request->fl_start - 1)
875 goto next_lock;
876
877
878
879 if (fl->fl_start - 1 > request->fl_end)
880 break;
881
882
883
884
885
886
887 if (fl->fl_start > request->fl_start)
888 fl->fl_start = request->fl_start;
889 else
890 request->fl_start = fl->fl_start;
891 if (fl->fl_end < request->fl_end)
892 fl->fl_end = request->fl_end;
893 else
894 request->fl_end = fl->fl_end;
895 if (added) {
896 locks_delete_lock(before);
897 continue;
898 }
899 request = fl;
900 added = 1;
901 }
902 else {
903
904
905
906 if (fl->fl_end < request->fl_start)
907 goto next_lock;
908 if (fl->fl_start > request->fl_end)
909 break;
910 if (request->fl_type == F_UNLCK)
911 added = 1;
912 if (fl->fl_start < request->fl_start)
913 left = fl;
914
915
916
917 if (fl->fl_end > request->fl_end) {
918 right = fl;
919 break;
920 }
921 if (fl->fl_start >= request->fl_start) {
922
923
924
925 if (added) {
926 locks_delete_lock(before);
927 continue;
928 }
929
930
931
932
933
934 locks_wake_up_blocks(fl);
935 fl->fl_start = request->fl_start;
936 fl->fl_end = request->fl_end;
937 fl->fl_type = request->fl_type;
938 locks_release_private(fl);
939 locks_copy_private(fl, request);
940 request = fl;
941 added = 1;
942 }
943 }
944
945
946 next_lock:
947 before = &fl->fl_next;
948 }
949
950
951
952
953
954
955
956 error = -ENOLCK;
957 if (right && left == right && !new_fl2)
958 goto out;
959
960 error = 0;
961 if (!added) {
962 if (request->fl_type == F_UNLCK) {
963 if (request->fl_flags & FL_EXISTS)
964 error = -ENOENT;
965 goto out;
966 }
967
968 if (!new_fl) {
969 error = -ENOLCK;
970 goto out;
971 }
972 locks_copy_lock(new_fl, request);
973 locks_insert_lock(before, new_fl);
974 new_fl = NULL;
975 }
976 if (right) {
977 if (left == right) {
978
979
980
981 left = new_fl2;
982 new_fl2 = NULL;
983 locks_copy_lock(left, right);
984 locks_insert_lock(before, left);
985 }
986 right->fl_start = request->fl_end + 1;
987 locks_wake_up_blocks(right);
988 }
989 if (left) {
990 left->fl_end = request->fl_start - 1;
991 locks_wake_up_blocks(left);
992 }
993 out:
994 unlock_kernel();
995
996
997
998 if (new_fl)
999 locks_free_lock(new_fl);
1000 if (new_fl2)
1001 locks_free_lock(new_fl2);
1002 return error;
1003}
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019int posix_lock_file(struct file *filp, struct file_lock *fl,
1020 struct file_lock *conflock)
1021{
1022 return __posix_lock_file(filp->f_path.dentry->d_inode, fl, conflock);
1023}
1024EXPORT_SYMBOL(posix_lock_file);
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035int posix_lock_file_wait(struct file *filp, struct file_lock *fl)
1036{
1037 int error;
1038 might_sleep ();
1039 for (;;) {
1040 error = posix_lock_file(filp, fl, NULL);
1041 if (error != FILE_LOCK_DEFERRED)
1042 break;
1043 error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
1044 if (!error)
1045 continue;
1046
1047 locks_delete_block(fl);
1048 break;
1049 }
1050 return error;
1051}
1052EXPORT_SYMBOL(posix_lock_file_wait);
1053
1054
1055
1056
1057
1058
1059
1060
1061int locks_mandatory_locked(struct inode *inode)
1062{
1063 fl_owner_t owner = current->files;
1064 struct file_lock *fl;
1065
1066
1067
1068
1069 lock_kernel();
1070 for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
1071 if (!IS_POSIX(fl))
1072 continue;
1073 if (fl->fl_owner != owner)
1074 break;
1075 }
1076 unlock_kernel();
1077 return fl ? -EAGAIN : 0;
1078}
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093int locks_mandatory_area(int read_write, struct inode *inode,
1094 struct file *filp, loff_t offset,
1095 size_t count)
1096{
1097 struct file_lock fl;
1098 int error;
1099
1100 locks_init_lock(&fl);
1101 fl.fl_owner = current->files;
1102 fl.fl_pid = current->tgid;
1103 fl.fl_file = filp;
1104 fl.fl_flags = FL_POSIX | FL_ACCESS;
1105 if (filp && !(filp->f_flags & O_NONBLOCK))
1106 fl.fl_flags |= FL_SLEEP;
1107 fl.fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK;
1108 fl.fl_start = offset;
1109 fl.fl_end = offset + count - 1;
1110
1111 for (;;) {
1112 error = __posix_lock_file(inode, &fl, NULL);
1113 if (error != FILE_LOCK_DEFERRED)
1114 break;
1115 error = wait_event_interruptible(fl.fl_wait, !fl.fl_next);
1116 if (!error) {
1117
1118
1119
1120
1121 if (__mandatory_lock(inode))
1122 continue;
1123 }
1124
1125 locks_delete_block(&fl);
1126 break;
1127 }
1128
1129 return error;
1130}
1131
1132EXPORT_SYMBOL(locks_mandatory_area);
1133
1134
1135int lease_modify(struct file_lock **before, int arg)
1136{
1137 struct file_lock *fl = *before;
1138 int error = assign_type(fl, arg);
1139
1140 if (error)
1141 return error;
1142 locks_wake_up_blocks(fl);
1143 if (arg == F_UNLCK)
1144 locks_delete_lock(before);
1145 return 0;
1146}
1147
1148EXPORT_SYMBOL(lease_modify);
1149
1150static void time_out_leases(struct inode *inode)
1151{
1152 struct file_lock **before;
1153 struct file_lock *fl;
1154
1155 before = &inode->i_flock;
1156 while ((fl = *before) && IS_LEASE(fl) && (fl->fl_type & F_INPROGRESS)) {
1157 if ((fl->fl_break_time == 0)
1158 || time_before(jiffies, fl->fl_break_time)) {
1159 before = &fl->fl_next;
1160 continue;
1161 }
1162 lease_modify(before, fl->fl_type & ~F_INPROGRESS);
1163 if (fl == *before)
1164 before = &fl->fl_next;
1165 }
1166}
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178int __break_lease(struct inode *inode, unsigned int mode)
1179{
1180 int error = 0, future;
1181 struct file_lock *new_fl, *flock;
1182 struct file_lock *fl;
1183 unsigned long break_time;
1184 int i_have_this_lease = 0;
1185 int want_write = (mode & O_ACCMODE) != O_RDONLY;
1186
1187 new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK);
1188
1189 lock_kernel();
1190
1191 time_out_leases(inode);
1192
1193 flock = inode->i_flock;
1194 if ((flock == NULL) || !IS_LEASE(flock))
1195 goto out;
1196
1197 for (fl = flock; fl && IS_LEASE(fl); fl = fl->fl_next)
1198 if (fl->fl_owner == current->files)
1199 i_have_this_lease = 1;
1200
1201 if (want_write) {
1202
1203 future = F_UNLCK | F_INPROGRESS;
1204 } else if (flock->fl_type & F_INPROGRESS) {
1205
1206 future = flock->fl_type;
1207 } else if (flock->fl_type & F_WRLCK) {
1208
1209 future = F_RDLCK | F_INPROGRESS;
1210 } else {
1211
1212 goto out;
1213 }
1214
1215 if (IS_ERR(new_fl) && !i_have_this_lease
1216 && ((mode & O_NONBLOCK) == 0)) {
1217 error = PTR_ERR(new_fl);
1218 goto out;
1219 }
1220
1221 break_time = 0;
1222 if (lease_break_time > 0) {
1223 break_time = jiffies + lease_break_time * HZ;
1224 if (break_time == 0)
1225 break_time++;
1226 }
1227
1228 for (fl = flock; fl && IS_LEASE(fl); fl = fl->fl_next) {
1229 if (fl->fl_type != future) {
1230 fl->fl_type = future;
1231 fl->fl_break_time = break_time;
1232
1233 fl->fl_lmops->fl_break(fl);
1234 }
1235 }
1236
1237 if (i_have_this_lease || (mode & O_NONBLOCK)) {
1238 error = -EWOULDBLOCK;
1239 goto out;
1240 }
1241
1242restart:
1243 break_time = flock->fl_break_time;
1244 if (break_time != 0) {
1245 break_time -= jiffies;
1246 if (break_time == 0)
1247 break_time++;
1248 }
1249 locks_insert_block(flock, new_fl);
1250 error = wait_event_interruptible_timeout(new_fl->fl_wait,
1251 !new_fl->fl_next, break_time);
1252 __locks_delete_block(new_fl);
1253 if (error >= 0) {
1254 if (error == 0)
1255 time_out_leases(inode);
1256
1257 for (flock = inode->i_flock; flock && IS_LEASE(flock);
1258 flock = flock->fl_next) {
1259 if (flock->fl_type & F_INPROGRESS)
1260 goto restart;
1261 }
1262 error = 0;
1263 }
1264
1265out:
1266 unlock_kernel();
1267 if (!IS_ERR(new_fl))
1268 locks_free_lock(new_fl);
1269 return error;
1270}
1271
1272EXPORT_SYMBOL(__break_lease);
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283void lease_get_mtime(struct inode *inode, struct timespec *time)
1284{
1285 struct file_lock *flock = inode->i_flock;
1286 if (flock && IS_LEASE(flock) && (flock->fl_type & F_WRLCK))
1287 *time = current_fs_time(inode->i_sb);
1288 else
1289 *time = inode->i_mtime;
1290}
1291
1292EXPORT_SYMBOL(lease_get_mtime);
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317int fcntl_getlease(struct file *filp)
1318{
1319 struct file_lock *fl;
1320 int type = F_UNLCK;
1321
1322 lock_kernel();
1323 time_out_leases(filp->f_path.dentry->d_inode);
1324 for (fl = filp->f_path.dentry->d_inode->i_flock; fl && IS_LEASE(fl);
1325 fl = fl->fl_next) {
1326 if (fl->fl_file == filp) {
1327 type = fl->fl_type & ~F_INPROGRESS;
1328 break;
1329 }
1330 }
1331 unlock_kernel();
1332 return type;
1333}
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346int generic_setlease(struct file *filp, long arg, struct file_lock **flp)
1347{
1348 struct file_lock *fl, **before, **my_before = NULL, *lease;
1349 struct file_lock *new_fl = NULL;
1350 struct dentry *dentry = filp->f_path.dentry;
1351 struct inode *inode = dentry->d_inode;
1352 int error, rdlease_count = 0, wrlease_count = 0;
1353
1354 if ((current_fsuid() != inode->i_uid) && !capable(CAP_LEASE))
1355 return -EACCES;
1356 if (!S_ISREG(inode->i_mode))
1357 return -EINVAL;
1358 error = security_file_lock(filp, arg);
1359 if (error)
1360 return error;
1361
1362 time_out_leases(inode);
1363
1364 BUG_ON(!(*flp)->fl_lmops->fl_break);
1365
1366 lease = *flp;
1367
1368 if (arg != F_UNLCK) {
1369 error = -ENOMEM;
1370 new_fl = locks_alloc_lock();
1371 if (new_fl == NULL)
1372 goto out;
1373
1374 error = -EAGAIN;
1375 if ((arg == F_RDLCK) && (atomic_read(&inode->i_writecount) > 0))
1376 goto out;
1377 if ((arg == F_WRLCK)
1378 && ((atomic_read(&dentry->d_count) > 1)
1379 || (atomic_read(&inode->i_count) > 1)))
1380 goto out;
1381 }
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391 for (before = &inode->i_flock;
1392 ((fl = *before) != NULL) && IS_LEASE(fl);
1393 before = &fl->fl_next) {
1394 if (lease->fl_lmops->fl_mylease(fl, lease))
1395 my_before = before;
1396 else if (fl->fl_type == (F_INPROGRESS | F_UNLCK))
1397
1398
1399
1400
1401
1402 wrlease_count++;
1403 else
1404 rdlease_count++;
1405 }
1406
1407 error = -EAGAIN;
1408 if ((arg == F_RDLCK && (wrlease_count > 0)) ||
1409 (arg == F_WRLCK && ((rdlease_count + wrlease_count) > 0)))
1410 goto out;
1411
1412 if (my_before != NULL) {
1413 *flp = *my_before;
1414 error = lease->fl_lmops->fl_change(my_before, arg);
1415 goto out;
1416 }
1417
1418 error = 0;
1419 if (arg == F_UNLCK)
1420 goto out;
1421
1422 error = -EINVAL;
1423 if (!leases_enable)
1424 goto out;
1425
1426 locks_copy_lock(new_fl, lease);
1427 locks_insert_lock(before, new_fl);
1428
1429 *flp = new_fl;
1430 return 0;
1431
1432out:
1433 if (new_fl != NULL)
1434 locks_free_lock(new_fl);
1435 return error;
1436}
1437EXPORT_SYMBOL(generic_setlease);
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466int vfs_setlease(struct file *filp, long arg, struct file_lock **lease)
1467{
1468 int error;
1469
1470 lock_kernel();
1471 if (filp->f_op && filp->f_op->setlease)
1472 error = filp->f_op->setlease(filp, arg, lease);
1473 else
1474 error = generic_setlease(filp, arg, lease);
1475 unlock_kernel();
1476
1477 return error;
1478}
1479EXPORT_SYMBOL_GPL(vfs_setlease);
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
1492{
1493 struct file_lock fl, *flp = &fl;
1494 struct inode *inode = filp->f_path.dentry->d_inode;
1495 int error;
1496
1497 locks_init_lock(&fl);
1498 error = lease_init(filp, arg, &fl);
1499 if (error)
1500 return error;
1501
1502 lock_kernel();
1503
1504 error = vfs_setlease(filp, arg, &flp);
1505 if (error || arg == F_UNLCK)
1506 goto out_unlock;
1507
1508 error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
1509 if (error < 0) {
1510
1511 flp->fl_type = F_UNLCK | F_INPROGRESS;
1512 flp->fl_break_time = jiffies - 10;
1513 time_out_leases(inode);
1514 goto out_unlock;
1515 }
1516
1517 error = __f_setown(filp, task_pid(current), PIDTYPE_PID, 0);
1518out_unlock:
1519 unlock_kernel();
1520 return error;
1521}
1522
1523
1524
1525
1526
1527
1528
1529
1530int flock_lock_file_wait(struct file *filp, struct file_lock *fl)
1531{
1532 int error;
1533 might_sleep();
1534 for (;;) {
1535 error = flock_lock_file(filp, fl);
1536 if (error != FILE_LOCK_DEFERRED)
1537 break;
1538 error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
1539 if (!error)
1540 continue;
1541
1542 locks_delete_block(fl);
1543 break;
1544 }
1545 return error;
1546}
1547
1548EXPORT_SYMBOL(flock_lock_file_wait);
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
1570{
1571 struct file *filp;
1572 struct file_lock *lock;
1573 int can_sleep, unlock;
1574 int error;
1575
1576 error = -EBADF;
1577 filp = fget(fd);
1578 if (!filp)
1579 goto out;
1580
1581 can_sleep = !(cmd & LOCK_NB);
1582 cmd &= ~LOCK_NB;
1583 unlock = (cmd == LOCK_UN);
1584
1585 if (!unlock && !(cmd & LOCK_MAND) &&
1586 !(filp->f_mode & (FMODE_READ|FMODE_WRITE)))
1587 goto out_putf;
1588
1589 error = flock_make_lock(filp, &lock, cmd);
1590 if (error)
1591 goto out_putf;
1592 if (can_sleep)
1593 lock->fl_flags |= FL_SLEEP;
1594
1595 error = security_file_lock(filp, lock->fl_type);
1596 if (error)
1597 goto out_free;
1598
1599 if (filp->f_op && filp->f_op->flock)
1600 error = filp->f_op->flock(filp,
1601 (can_sleep) ? F_SETLKW : F_SETLK,
1602 lock);
1603 else
1604 error = flock_lock_file_wait(filp, lock);
1605
1606 out_free:
1607 locks_free_lock(lock);
1608
1609 out_putf:
1610 fput(filp);
1611 out:
1612 return error;
1613}
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623int vfs_test_lock(struct file *filp, struct file_lock *fl)
1624{
1625 if (filp->f_op && filp->f_op->lock)
1626 return filp->f_op->lock(filp, F_GETLK, fl);
1627 posix_test_lock(filp, fl);
1628 return 0;
1629}
1630EXPORT_SYMBOL_GPL(vfs_test_lock);
1631
1632static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl)
1633{
1634 flock->l_pid = fl->fl_pid;
1635#if BITS_PER_LONG == 32
1636
1637
1638
1639
1640 if (fl->fl_start > OFFT_OFFSET_MAX)
1641 return -EOVERFLOW;
1642 if (fl->fl_end != OFFSET_MAX && fl->fl_end > OFFT_OFFSET_MAX)
1643 return -EOVERFLOW;
1644#endif
1645 flock->l_start = fl->fl_start;
1646 flock->l_len = fl->fl_end == OFFSET_MAX ? 0 :
1647 fl->fl_end - fl->fl_start + 1;
1648 flock->l_whence = 0;
1649 flock->l_type = fl->fl_type;
1650 return 0;
1651}
1652
1653#if BITS_PER_LONG == 32
1654static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)
1655{
1656 flock->l_pid = fl->fl_pid;
1657 flock->l_start = fl->fl_start;
1658 flock->l_len = fl->fl_end == OFFSET_MAX ? 0 :
1659 fl->fl_end - fl->fl_start + 1;
1660 flock->l_whence = 0;
1661 flock->l_type = fl->fl_type;
1662}
1663#endif
1664
1665
1666
1667
1668int fcntl_getlk(struct file *filp, struct flock __user *l)
1669{
1670 struct file_lock file_lock;
1671 struct flock flock;
1672 int error;
1673
1674 error = -EFAULT;
1675 if (copy_from_user(&flock, l, sizeof(flock)))
1676 goto out;
1677 error = -EINVAL;
1678 if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK))
1679 goto out;
1680
1681 error = flock_to_posix_lock(filp, &file_lock, &flock);
1682 if (error)
1683 goto out;
1684
1685 error = vfs_test_lock(filp, &file_lock);
1686 if (error)
1687 goto out;
1688
1689 flock.l_type = file_lock.fl_type;
1690 if (file_lock.fl_type != F_UNLCK) {
1691 error = posix_lock_to_flock(&flock, &file_lock);
1692 if (error)
1693 goto out;
1694 }
1695 error = -EFAULT;
1696 if (!copy_to_user(l, &flock, sizeof(flock)))
1697 error = 0;
1698out:
1699 return error;
1700}
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl, struct file_lock *conf)
1736{
1737 if (filp->f_op && filp->f_op->lock)
1738 return filp->f_op->lock(filp, cmd, fl);
1739 else
1740 return posix_lock_file(filp, fl, conf);
1741}
1742EXPORT_SYMBOL_GPL(vfs_lock_file);
1743
1744static int do_lock_file_wait(struct file *filp, unsigned int cmd,
1745 struct file_lock *fl)
1746{
1747 int error;
1748
1749 error = security_file_lock(filp, fl->fl_type);
1750 if (error)
1751 return error;
1752
1753 for (;;) {
1754 error = vfs_lock_file(filp, cmd, fl, NULL);
1755 if (error != FILE_LOCK_DEFERRED)
1756 break;
1757 error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
1758 if (!error)
1759 continue;
1760
1761 locks_delete_block(fl);
1762 break;
1763 }
1764
1765 return error;
1766}
1767
1768
1769
1770
1771int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
1772 struct flock __user *l)
1773{
1774 struct file_lock *file_lock = locks_alloc_lock();
1775 struct flock flock;
1776 struct inode *inode;
1777 struct file *f;
1778 int error;
1779
1780 if (file_lock == NULL)
1781 return -ENOLCK;
1782
1783
1784
1785
1786 error = -EFAULT;
1787 if (copy_from_user(&flock, l, sizeof(flock)))
1788 goto out;
1789
1790 inode = filp->f_path.dentry->d_inode;
1791
1792
1793
1794
1795 if (mandatory_lock(inode) && mapping_writably_mapped(filp->f_mapping)) {
1796 error = -EAGAIN;
1797 goto out;
1798 }
1799
1800again:
1801 error = flock_to_posix_lock(filp, file_lock, &flock);
1802 if (error)
1803 goto out;
1804 if (cmd == F_SETLKW) {
1805 file_lock->fl_flags |= FL_SLEEP;
1806 }
1807
1808 error = -EBADF;
1809 switch (flock.l_type) {
1810 case F_RDLCK:
1811 if (!(filp->f_mode & FMODE_READ))
1812 goto out;
1813 break;
1814 case F_WRLCK:
1815 if (!(filp->f_mode & FMODE_WRITE))
1816 goto out;
1817 break;
1818 case F_UNLCK:
1819 break;
1820 default:
1821 error = -EINVAL;
1822 goto out;
1823 }
1824
1825 error = do_lock_file_wait(filp, cmd, file_lock);
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836 spin_lock(¤t->files->file_lock);
1837 f = fcheck(fd);
1838 spin_unlock(¤t->files->file_lock);
1839 if (!error && f != filp && flock.l_type != F_UNLCK) {
1840 flock.l_type = F_UNLCK;
1841 goto again;
1842 }
1843
1844out:
1845 locks_free_lock(file_lock);
1846 return error;
1847}
1848
1849#if BITS_PER_LONG == 32
1850
1851
1852
1853int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
1854{
1855 struct file_lock file_lock;
1856 struct flock64 flock;
1857 int error;
1858
1859 error = -EFAULT;
1860 if (copy_from_user(&flock, l, sizeof(flock)))
1861 goto out;
1862 error = -EINVAL;
1863 if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK))
1864 goto out;
1865
1866 error = flock64_to_posix_lock(filp, &file_lock, &flock);
1867 if (error)
1868 goto out;
1869
1870 error = vfs_test_lock(filp, &file_lock);
1871 if (error)
1872 goto out;
1873
1874 flock.l_type = file_lock.fl_type;
1875 if (file_lock.fl_type != F_UNLCK)
1876 posix_lock_to_flock64(&flock, &file_lock);
1877
1878 error = -EFAULT;
1879 if (!copy_to_user(l, &flock, sizeof(flock)))
1880 error = 0;
1881
1882out:
1883 return error;
1884}
1885
1886
1887
1888
1889int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,
1890 struct flock64 __user *l)
1891{
1892 struct file_lock *file_lock = locks_alloc_lock();
1893 struct flock64 flock;
1894 struct inode *inode;
1895 struct file *f;
1896 int error;
1897
1898 if (file_lock == NULL)
1899 return -ENOLCK;
1900
1901
1902
1903
1904 error = -EFAULT;
1905 if (copy_from_user(&flock, l, sizeof(flock)))
1906 goto out;
1907
1908 inode = filp->f_path.dentry->d_inode;
1909
1910
1911
1912
1913 if (mandatory_lock(inode) && mapping_writably_mapped(filp->f_mapping)) {
1914 error = -EAGAIN;
1915 goto out;
1916 }
1917
1918again:
1919 error = flock64_to_posix_lock(filp, file_lock, &flock);
1920 if (error)
1921 goto out;
1922 if (cmd == F_SETLKW64) {
1923 file_lock->fl_flags |= FL_SLEEP;
1924 }
1925
1926 error = -EBADF;
1927 switch (flock.l_type) {
1928 case F_RDLCK:
1929 if (!(filp->f_mode & FMODE_READ))
1930 goto out;
1931 break;
1932 case F_WRLCK:
1933 if (!(filp->f_mode & FMODE_WRITE))
1934 goto out;
1935 break;
1936 case F_UNLCK:
1937 break;
1938 default:
1939 error = -EINVAL;
1940 goto out;
1941 }
1942
1943 error = do_lock_file_wait(filp, cmd, file_lock);
1944
1945
1946
1947
1948
1949 spin_lock(¤t->files->file_lock);
1950 f = fcheck(fd);
1951 spin_unlock(¤t->files->file_lock);
1952 if (!error && f != filp && flock.l_type != F_UNLCK) {
1953 flock.l_type = F_UNLCK;
1954 goto again;
1955 }
1956
1957out:
1958 locks_free_lock(file_lock);
1959 return error;
1960}
1961#endif
1962
1963
1964
1965
1966
1967
1968void locks_remove_posix(struct file *filp, fl_owner_t owner)
1969{
1970 struct file_lock lock;
1971
1972
1973
1974
1975
1976
1977 if (!filp->f_path.dentry->d_inode->i_flock)
1978 return;
1979
1980 lock.fl_type = F_UNLCK;
1981 lock.fl_flags = FL_POSIX | FL_CLOSE;
1982 lock.fl_start = 0;
1983 lock.fl_end = OFFSET_MAX;
1984 lock.fl_owner = owner;
1985 lock.fl_pid = current->tgid;
1986 lock.fl_file = filp;
1987 lock.fl_ops = NULL;
1988 lock.fl_lmops = NULL;
1989
1990 vfs_lock_file(filp, F_SETLK, &lock, NULL);
1991
1992 if (lock.fl_ops && lock.fl_ops->fl_release_private)
1993 lock.fl_ops->fl_release_private(&lock);
1994}
1995
1996EXPORT_SYMBOL(locks_remove_posix);
1997
1998
1999
2000
2001void locks_remove_flock(struct file *filp)
2002{
2003 struct inode * inode = filp->f_path.dentry->d_inode;
2004 struct file_lock *fl;
2005 struct file_lock **before;
2006
2007 if (!inode->i_flock)
2008 return;
2009
2010 if (filp->f_op && filp->f_op->flock) {
2011 struct file_lock fl = {
2012 .fl_pid = current->tgid,
2013 .fl_file = filp,
2014 .fl_flags = FL_FLOCK,
2015 .fl_type = F_UNLCK,
2016 .fl_end = OFFSET_MAX,
2017 };
2018 filp->f_op->flock(filp, F_SETLKW, &fl);
2019 if (fl.fl_ops && fl.fl_ops->fl_release_private)
2020 fl.fl_ops->fl_release_private(&fl);
2021 }
2022
2023 lock_kernel();
2024 before = &inode->i_flock;
2025
2026 while ((fl = *before) != NULL) {
2027 if (fl->fl_file == filp) {
2028 if (IS_FLOCK(fl)) {
2029 locks_delete_lock(before);
2030 continue;
2031 }
2032 if (IS_LEASE(fl)) {
2033 lease_modify(before, F_UNLCK);
2034 continue;
2035 }
2036
2037 BUG();
2038 }
2039 before = &fl->fl_next;
2040 }
2041 unlock_kernel();
2042}
2043
2044
2045
2046
2047
2048
2049
2050
2051int
2052posix_unblock_lock(struct file *filp, struct file_lock *waiter)
2053{
2054 int status = 0;
2055
2056 lock_kernel();
2057 if (waiter->fl_next)
2058 __locks_delete_block(waiter);
2059 else
2060 status = -ENOENT;
2061 unlock_kernel();
2062 return status;
2063}
2064
2065EXPORT_SYMBOL(posix_unblock_lock);
2066
2067
2068
2069
2070
2071
2072
2073
2074int vfs_cancel_lock(struct file *filp, struct file_lock *fl)
2075{
2076 if (filp->f_op && filp->f_op->lock)
2077 return filp->f_op->lock(filp, F_CANCELLK, fl);
2078 return 0;
2079}
2080
2081EXPORT_SYMBOL_GPL(vfs_cancel_lock);
2082
2083#ifdef CONFIG_PROC_FS
2084#include <linux/proc_fs.h>
2085#include <linux/seq_file.h>
2086
2087static void lock_get_status(struct seq_file *f, struct file_lock *fl,
2088 int id, char *pfx)
2089{
2090 struct inode *inode = NULL;
2091 unsigned int fl_pid;
2092
2093 if (fl->fl_nspid)
2094 fl_pid = pid_vnr(fl->fl_nspid);
2095 else
2096 fl_pid = fl->fl_pid;
2097
2098 if (fl->fl_file != NULL)
2099 inode = fl->fl_file->f_path.dentry->d_inode;
2100
2101 seq_printf(f, "%d:%s ", id, pfx);
2102 if (IS_POSIX(fl)) {
2103 seq_printf(f, "%6s %s ",
2104 (fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ",
2105 (inode == NULL) ? "*NOINODE*" :
2106 mandatory_lock(inode) ? "MANDATORY" : "ADVISORY ");
2107 } else if (IS_FLOCK(fl)) {
2108 if (fl->fl_type & LOCK_MAND) {
2109 seq_printf(f, "FLOCK MSNFS ");
2110 } else {
2111 seq_printf(f, "FLOCK ADVISORY ");
2112 }
2113 } else if (IS_LEASE(fl)) {
2114 seq_printf(f, "LEASE ");
2115 if (fl->fl_type & F_INPROGRESS)
2116 seq_printf(f, "BREAKING ");
2117 else if (fl->fl_file)
2118 seq_printf(f, "ACTIVE ");
2119 else
2120 seq_printf(f, "BREAKER ");
2121 } else {
2122 seq_printf(f, "UNKNOWN UNKNOWN ");
2123 }
2124 if (fl->fl_type & LOCK_MAND) {
2125 seq_printf(f, "%s ",
2126 (fl->fl_type & LOCK_READ)
2127 ? (fl->fl_type & LOCK_WRITE) ? "RW " : "READ "
2128 : (fl->fl_type & LOCK_WRITE) ? "WRITE" : "NONE ");
2129 } else {
2130 seq_printf(f, "%s ",
2131 (fl->fl_type & F_INPROGRESS)
2132 ? (fl->fl_type & F_UNLCK) ? "UNLCK" : "READ "
2133 : (fl->fl_type & F_WRLCK) ? "WRITE" : "READ ");
2134 }
2135 if (inode) {
2136#ifdef WE_CAN_BREAK_LSLK_NOW
2137 seq_printf(f, "%d %s:%ld ", fl_pid,
2138 inode->i_sb->s_id, inode->i_ino);
2139#else
2140
2141 seq_printf(f, "%d %02x:%02x:%ld ", fl_pid,
2142 MAJOR(inode->i_sb->s_dev),
2143 MINOR(inode->i_sb->s_dev), inode->i_ino);
2144#endif
2145 } else {
2146 seq_printf(f, "%d <none>:0 ", fl_pid);
2147 }
2148 if (IS_POSIX(fl)) {
2149 if (fl->fl_end == OFFSET_MAX)
2150 seq_printf(f, "%Ld EOF\n", fl->fl_start);
2151 else
2152 seq_printf(f, "%Ld %Ld\n", fl->fl_start, fl->fl_end);
2153 } else {
2154 seq_printf(f, "0 EOF\n");
2155 }
2156}
2157
2158static int locks_show(struct seq_file *f, void *v)
2159{
2160 struct file_lock *fl, *bfl;
2161
2162 fl = list_entry(v, struct file_lock, fl_link);
2163
2164 lock_get_status(f, fl, (long)f->private, "");
2165
2166 list_for_each_entry(bfl, &fl->fl_block, fl_block)
2167 lock_get_status(f, bfl, (long)f->private, " ->");
2168
2169 f->private++;
2170 return 0;
2171}
2172
2173static void *locks_start(struct seq_file *f, loff_t *pos)
2174{
2175 lock_kernel();
2176 f->private = (void *)1;
2177 return seq_list_start(&file_lock_list, *pos);
2178}
2179
2180static void *locks_next(struct seq_file *f, void *v, loff_t *pos)
2181{
2182 return seq_list_next(v, &file_lock_list, pos);
2183}
2184
2185static void locks_stop(struct seq_file *f, void *v)
2186{
2187 unlock_kernel();
2188}
2189
2190static const struct seq_operations locks_seq_operations = {
2191 .start = locks_start,
2192 .next = locks_next,
2193 .stop = locks_stop,
2194 .show = locks_show,
2195};
2196
2197static int locks_open(struct inode *inode, struct file *filp)
2198{
2199 return seq_open(filp, &locks_seq_operations);
2200}
2201
2202static const struct file_operations proc_locks_operations = {
2203 .open = locks_open,
2204 .read = seq_read,
2205 .llseek = seq_lseek,
2206 .release = seq_release,
2207};
2208
2209static int __init proc_locks_init(void)
2210{
2211 proc_create("locks", 0, NULL, &proc_locks_operations);
2212 return 0;
2213}
2214module_init(proc_locks_init);
2215#endif
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230int lock_may_read(struct inode *inode, loff_t start, unsigned long len)
2231{
2232 struct file_lock *fl;
2233 int result = 1;
2234 lock_kernel();
2235 for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
2236 if (IS_POSIX(fl)) {
2237 if (fl->fl_type == F_RDLCK)
2238 continue;
2239 if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
2240 continue;
2241 } else if (IS_FLOCK(fl)) {
2242 if (!(fl->fl_type & LOCK_MAND))
2243 continue;
2244 if (fl->fl_type & LOCK_READ)
2245 continue;
2246 } else
2247 continue;
2248 result = 0;
2249 break;
2250 }
2251 unlock_kernel();
2252 return result;
2253}
2254
2255EXPORT_SYMBOL(lock_may_read);
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270int lock_may_write(struct inode *inode, loff_t start, unsigned long len)
2271{
2272 struct file_lock *fl;
2273 int result = 1;
2274 lock_kernel();
2275 for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
2276 if (IS_POSIX(fl)) {
2277 if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
2278 continue;
2279 } else if (IS_FLOCK(fl)) {
2280 if (!(fl->fl_type & LOCK_MAND))
2281 continue;
2282 if (fl->fl_type & LOCK_WRITE)
2283 continue;
2284 } else
2285 continue;
2286 result = 0;
2287 break;
2288 }
2289 unlock_kernel();
2290 return result;
2291}
2292
2293EXPORT_SYMBOL(lock_may_write);
2294
2295static int __init filelock_init(void)
2296{
2297 filelock_cache = kmem_cache_create("file_lock_cache",
2298 sizeof(struct file_lock), 0, SLAB_PANIC,
2299 init_once);
2300 return 0;
2301}
2302
2303core_initcall(filelock_init);
2304