Lines Matching refs:fl
19 static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl);
20 static void afs_fl_release_private(struct file_lock *fl);
52 static void afs_grant_locks(struct afs_vnode *vnode, struct file_lock *fl) in afs_grant_locks() argument
56 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_grant_locks()
57 if (fl->fl_type == F_RDLCK) { in afs_grant_locks()
173 struct file_lock *fl, *next; in afs_lock_work() local
286 fl = list_entry(vnode->pending_locks.next, in afs_lock_work()
288 type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; in afs_lock_work()
295 fl->fl_u.afs.state = ret; in afs_lock_work()
297 afs_grant_locks(vnode, fl); in afs_lock_work()
299 list_del_init(&fl->fl_u.afs.link); in afs_lock_work()
300 wake_up(&fl->fl_wait); in afs_lock_work()
382 static void afs_dequeue_lock(struct afs_vnode *vnode, struct file_lock *fl) in afs_dequeue_lock() argument
392 if (vnode->granted_locks.next == &fl->fl_u.afs.link && in afs_dequeue_lock()
393 vnode->granted_locks.prev == &fl->fl_u.afs.link) { in afs_dequeue_lock()
394 list_del_init(&fl->fl_u.afs.link); in afs_dequeue_lock()
400 vnode->pending_locks.next != &fl->fl_u.afs.link) { in afs_dequeue_lock()
401 list_del_init(&fl->fl_u.afs.link); in afs_dequeue_lock()
405 list_del_init(&fl->fl_u.afs.link); in afs_dequeue_lock()
425 static int afs_do_setlk(struct file *file, struct file_lock *fl) in afs_do_setlk() argument
433 _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); in afs_do_setlk()
436 if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX) in afs_do_setlk()
439 fl->fl_ops = &afs_lock_ops; in afs_do_setlk()
440 INIT_LIST_HEAD(&fl->fl_u.afs.link); in afs_do_setlk()
441 fl->fl_u.afs.state = AFS_LOCK_PENDING; in afs_do_setlk()
443 type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; in afs_do_setlk()
445 ret = afs_do_setlk_check(vnode, key, type, fl->fl_flags & FL_SLEEP); in afs_do_setlk()
463 list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks); in afs_do_setlk()
496 ASSERTCMP(vnode->pending_locks.next, ==, &fl->fl_u.afs.link); in afs_do_setlk()
512 fl->fl_u.afs.state = AFS_LOCK_GRANTED; in afs_do_setlk()
513 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_do_setlk()
519 ret = posix_lock_file(file, fl, NULL); in afs_do_setlk()
538 if (fl->fl_flags & FL_SLEEP) { in afs_do_setlk()
542 ret = wait_event_interruptible(fl->fl_wait, in afs_do_setlk()
543 fl->fl_u.afs.state != AFS_LOCK_PENDING); in afs_do_setlk()
548 if (fl->fl_u.afs.state == AFS_LOCK_GRANTED) in afs_do_setlk()
550 if (fl->fl_u.afs.state < 0) in afs_do_setlk()
551 ret = fl->fl_u.afs.state; in afs_do_setlk()
557 afs_dequeue_lock(vnode, fl); in afs_do_setlk()
571 list_del_init(&fl->fl_u.afs.link); in afs_do_setlk()
580 static int afs_do_unlk(struct file *file, struct file_lock *fl) in afs_do_unlk() argument
585 _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); in afs_do_unlk()
591 if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX) in afs_do_unlk()
594 ret = posix_lock_file(file, fl, NULL); in afs_do_unlk()
602 static int afs_do_getlk(struct file *file, struct file_lock *fl) in afs_do_getlk() argument
610 fl->fl_type = F_UNLCK; in afs_do_getlk()
613 posix_test_lock(file, fl); in afs_do_getlk()
614 if (fl->fl_type == F_UNLCK) { in afs_do_getlk()
622 fl->fl_type = F_RDLCK; in afs_do_getlk()
624 fl->fl_type = F_WRLCK; in afs_do_getlk()
625 fl->fl_start = 0; in afs_do_getlk()
626 fl->fl_end = OFFSET_MAX; in afs_do_getlk()
631 _leave(" = %d [%hd]", ret, fl->fl_type); in afs_do_getlk()
638 int afs_lock(struct file *file, int cmd, struct file_lock *fl) in afs_lock() argument
644 fl->fl_type, fl->fl_flags, in afs_lock()
645 (long long) fl->fl_start, (long long) fl->fl_end); in afs_lock()
648 if (__mandatory_lock(&vnode->vfs_inode) && fl->fl_type != F_UNLCK) in afs_lock()
652 return afs_do_getlk(file, fl); in afs_lock()
653 if (fl->fl_type == F_UNLCK) in afs_lock()
654 return afs_do_unlk(file, fl); in afs_lock()
655 return afs_do_setlk(file, fl); in afs_lock()
661 int afs_flock(struct file *file, int cmd, struct file_lock *fl) in afs_flock() argument
667 fl->fl_type, fl->fl_flags); in afs_flock()
676 if (!(fl->fl_flags & FL_FLOCK)) in afs_flock()
680 if (fl->fl_type == F_UNLCK) in afs_flock()
681 return afs_do_unlk(file, fl); in afs_flock()
682 return afs_do_setlk(file, fl); in afs_flock()
691 static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl) in afs_fl_copy_lock() argument
693 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_copy_lock()
698 list_add(&new->fl_u.afs.link, &fl->fl_u.afs.link); in afs_fl_copy_lock()
706 static void afs_fl_release_private(struct file_lock *fl) in afs_fl_release_private() argument
708 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_release_private()
713 afs_dequeue_lock(vnode, fl); in afs_fl_release_private()