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