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