Lines Matching +full:op +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
27 _debug("STATE %u -> %u", vnode->lock_state, state); in afs_set_lock_state()
28 vnode->lock_state = state; in afs_set_lock_state()
38 _enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode); in afs_lock_may_be_available()
40 spin_lock(&vnode->lock); in afs_lock_may_be_available()
41 if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB) in afs_lock_may_be_available()
44 spin_unlock(&vnode->lock); in afs_lock_may_be_available()
56 expires_at = ktime_add_ms(vnode->locked_at, AFS_LOCKWAIT * 1000 / 2); in afs_schedule_lock_extension()
64 queue_delayed_work(afs_lock_manager, &vnode->lock_work, duration_j); in afs_schedule_lock_extension()
73 struct afs_operation *op = call->op; in afs_lock_op_done() local
74 struct afs_vnode *vnode = op->file[0].vnode; in afs_lock_op_done()
76 if (call->error == 0) { in afs_lock_op_done()
77 spin_lock(&vnode->lock); in afs_lock_op_done()
79 vnode->locked_at = call->reply_time; in afs_lock_op_done()
81 spin_unlock(&vnode->lock); in afs_lock_op_done()
88 * - the caller must hold the vnode lock
93 bool exclusive = (vnode->lock_type == AFS_LOCK_WRITE); in afs_grant_locks()
95 list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) { in afs_grant_locks()
96 if (!exclusive && p->fl_type == F_WRLCK) in afs_grant_locks()
99 list_move_tail(&p->fl_u.afs.link, &vnode->granted_locks); in afs_grant_locks()
100 p->fl_u.afs.state = AFS_LOCK_GRANTED; in afs_grant_locks()
102 wake_up(&p->fl_wait); in afs_grant_locks()
114 struct key *key = vnode->lock_key; in afs_next_locker()
119 if (vnode->lock_type == AFS_LOCK_WRITE) in afs_next_locker()
122 list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) { in afs_next_locker()
124 p->fl_type == fl_type && in afs_next_locker()
125 afs_file_key(p->fl_file) == key) { in afs_next_locker()
126 list_del_init(&p->fl_u.afs.link); in afs_next_locker()
127 p->fl_u.afs.state = error; in afs_next_locker()
128 wake_up(&p->fl_wait); in afs_next_locker()
133 (next->fl_type == F_WRLCK || p->fl_type == F_RDLCK)) in afs_next_locker()
138 vnode->lock_key = NULL; in afs_next_locker()
143 next->fl_u.afs.state = AFS_LOCK_YOUR_TRY; in afs_next_locker()
145 wake_up(&next->fl_wait); in afs_next_locker()
164 while (!list_empty(&vnode->pending_locks)) { in afs_kill_lockers_enoent()
165 p = list_entry(vnode->pending_locks.next, in afs_kill_lockers_enoent()
167 list_del_init(&p->fl_u.afs.link); in afs_kill_lockers_enoent()
168 p->fl_u.afs.state = -ENOENT; in afs_kill_lockers_enoent()
169 wake_up(&p->fl_wait); in afs_kill_lockers_enoent()
172 key_put(vnode->lock_key); in afs_kill_lockers_enoent()
173 vnode->lock_key = NULL; in afs_kill_lockers_enoent()
176 static void afs_lock_success(struct afs_operation *op) in afs_lock_success() argument
178 _enter("op=%08x", op->debug_id); in afs_lock_success()
179 afs_vnode_commit_status(op, &op->file[0]); in afs_lock_success()
195 struct afs_operation *op; in afs_set_lock() local
198 vnode->volume->name, in afs_set_lock()
199 vnode->fid.vid, in afs_set_lock()
200 vnode->fid.vnode, in afs_set_lock()
201 vnode->fid.unique, in afs_set_lock()
204 op = afs_alloc_operation(key, vnode->volume); in afs_set_lock()
205 if (IS_ERR(op)) in afs_set_lock()
206 return PTR_ERR(op); in afs_set_lock()
208 afs_op_set_vnode(op, 0, vnode); in afs_set_lock()
210 op->lock.type = type; in afs_set_lock()
211 op->ops = &afs_set_lock_operation; in afs_set_lock()
212 return afs_do_sync_operation(op); in afs_set_lock()
226 struct afs_operation *op; in afs_extend_lock() local
229 vnode->volume->name, in afs_extend_lock()
230 vnode->fid.vid, in afs_extend_lock()
231 vnode->fid.vnode, in afs_extend_lock()
232 vnode->fid.unique, in afs_extend_lock()
235 op = afs_alloc_operation(key, vnode->volume); in afs_extend_lock()
236 if (IS_ERR(op)) in afs_extend_lock()
237 return PTR_ERR(op); in afs_extend_lock()
239 afs_op_set_vnode(op, 0, vnode); in afs_extend_lock()
241 op->flags |= AFS_OPERATION_UNINTR; in afs_extend_lock()
242 op->ops = &afs_extend_lock_operation; in afs_extend_lock()
243 return afs_do_sync_operation(op); in afs_extend_lock()
257 struct afs_operation *op; in afs_release_lock() local
260 vnode->volume->name, in afs_release_lock()
261 vnode->fid.vid, in afs_release_lock()
262 vnode->fid.vnode, in afs_release_lock()
263 vnode->fid.unique, in afs_release_lock()
266 op = afs_alloc_operation(key, vnode->volume); in afs_release_lock()
267 if (IS_ERR(op)) in afs_release_lock()
268 return PTR_ERR(op); in afs_release_lock()
270 afs_op_set_vnode(op, 0, vnode); in afs_release_lock()
272 op->flags |= AFS_OPERATION_UNINTR; in afs_release_lock()
273 op->ops = &afs_release_lock_operation; in afs_release_lock()
274 return afs_do_sync_operation(op); in afs_release_lock()
279 * - probing for a lock we're waiting on but didn't get immediately
280 * - extending a lock that's close to timing out
289 _enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode); in afs_lock_work()
291 spin_lock(&vnode->lock); in afs_lock_work()
294 _debug("wstate %u for %p", vnode->lock_state, vnode); in afs_lock_work()
295 switch (vnode->lock_state) { in afs_lock_work()
299 spin_unlock(&vnode->lock); in afs_lock_work()
303 ret = afs_release_lock(vnode, vnode->lock_key); in afs_lock_work()
304 if (ret < 0 && vnode->lock_state != AFS_VNODE_LOCK_DELETED) { in afs_lock_work()
309 vnode->fid.vid, vnode->fid.vnode, ret); in afs_lock_work()
312 spin_lock(&vnode->lock); in afs_lock_work()
313 if (ret == -ENOENT) in afs_lock_work()
317 spin_unlock(&vnode->lock); in afs_lock_work()
326 ASSERT(!list_empty(&vnode->granted_locks)); in afs_lock_work()
328 key = key_get(vnode->lock_key); in afs_lock_work()
331 spin_unlock(&vnode->lock); in afs_lock_work()
340 vnode->fid.vid, vnode->fid.vnode, ret); in afs_lock_work()
343 spin_lock(&vnode->lock); in afs_lock_work()
345 if (ret == -ENOENT) { in afs_lock_work()
347 spin_unlock(&vnode->lock); in afs_lock_work()
351 if (vnode->lock_state != AFS_VNODE_LOCK_EXTENDING) in afs_lock_work()
356 queue_delayed_work(afs_lock_manager, &vnode->lock_work, in afs_lock_work()
358 spin_unlock(&vnode->lock); in afs_lock_work()
371 spin_unlock(&vnode->lock); in afs_lock_work()
376 spin_unlock(&vnode->lock); in afs_lock_work()
381 spin_unlock(&vnode->lock); in afs_lock_work()
391 * - the caller must hold the vnode lock
395 _enter("%u", vnode->lock_state); in afs_defer_unlock()
397 if (list_empty(&vnode->granted_locks) && in afs_defer_unlock()
398 (vnode->lock_state == AFS_VNODE_LOCK_GRANTED || in afs_defer_unlock()
399 vnode->lock_state == AFS_VNODE_LOCK_EXTENDING)) { in afs_defer_unlock()
400 cancel_delayed_work(&vnode->lock_work); in afs_defer_unlock()
404 queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0); in afs_defer_unlock()
413 enum afs_flock_mode mode, afs_lock_type_t type) in afs_do_setlk_check() argument
433 * read-lock a file and WRITE or INSERT perm to write-lock a file. in afs_do_setlk_check()
440 return -EACCES; in afs_do_setlk_check()
443 return -EACCES; in afs_do_setlk_check()
456 enum afs_flock_mode mode = AFS_FS_S(inode->i_sb)->flock_mode; in afs_do_setlk() local
462 if (mode == afs_flock_mode_unset) in afs_do_setlk()
463 mode = afs_flock_mode_openafs; in afs_do_setlk()
465 _enter("{%llx:%llu},%llu-%llu,%u,%u", in afs_do_setlk()
466 vnode->fid.vid, vnode->fid.vnode, in afs_do_setlk()
467 fl->fl_start, fl->fl_end, fl->fl_type, mode); in afs_do_setlk()
469 fl->fl_ops = &afs_lock_ops; in afs_do_setlk()
470 INIT_LIST_HEAD(&fl->fl_u.afs.link); in afs_do_setlk()
471 fl->fl_u.afs.state = AFS_LOCK_PENDING; in afs_do_setlk()
473 partial = (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX); in afs_do_setlk()
474 type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; in afs_do_setlk()
475 if (mode == afs_flock_mode_write && partial) in afs_do_setlk()
478 ret = afs_do_setlk_check(vnode, key, mode, type); in afs_do_setlk()
484 /* AFS3 protocol only supports full-file locks and doesn't provide any in afs_do_setlk()
485 * method of upgrade/downgrade, so we need to emulate for partial-file in afs_do_setlk()
488 * The OpenAFS client only gets a server lock for a full-file lock and in afs_do_setlk()
489 * keeps partial-file locks local. Allow this behaviour to be emulated in afs_do_setlk()
492 if (mode == afs_flock_mode_local || in afs_do_setlk()
493 (partial && mode == afs_flock_mode_openafs)) { in afs_do_setlk()
498 spin_lock(&vnode->lock); in afs_do_setlk()
499 list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks); in afs_do_setlk()
501 ret = -ENOENT; in afs_do_setlk()
502 if (vnode->lock_state == AFS_VNODE_LOCK_DELETED) in afs_do_setlk()
509 _debug("try %u", vnode->lock_state); in afs_do_setlk()
510 if (vnode->lock_state == AFS_VNODE_LOCK_GRANTED) { in afs_do_setlk()
513 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_do_setlk()
514 fl->fl_u.afs.state = AFS_LOCK_GRANTED; in afs_do_setlk()
518 if (vnode->lock_type == AFS_LOCK_WRITE) { in afs_do_setlk()
520 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_do_setlk()
521 fl->fl_u.afs.state = AFS_LOCK_GRANTED; in afs_do_setlk()
526 if (vnode->lock_state == AFS_VNODE_LOCK_NONE && in afs_do_setlk()
527 !(fl->fl_flags & FL_SLEEP)) { in afs_do_setlk()
528 ret = -EAGAIN; in afs_do_setlk()
530 if (vnode->status.lock_count == -1) in afs_do_setlk()
533 if (vnode->status.lock_count != 0) in afs_do_setlk()
538 if (vnode->lock_state != AFS_VNODE_LOCK_NONE) in afs_do_setlk()
547 * though we don't wait for the reply (it's not too bad a problem - the in afs_do_setlk()
551 vnode->lock_key = key_get(key); in afs_do_setlk()
552 vnode->lock_type = type; in afs_do_setlk()
554 spin_unlock(&vnode->lock); in afs_do_setlk()
558 spin_lock(&vnode->lock); in afs_do_setlk()
560 case -EKEYREJECTED: in afs_do_setlk()
561 case -EKEYEXPIRED: in afs_do_setlk()
562 case -EKEYREVOKED: in afs_do_setlk()
563 case -EPERM: in afs_do_setlk()
564 case -EACCES: in afs_do_setlk()
565 fl->fl_u.afs.state = ret; in afs_do_setlk()
567 list_del_init(&fl->fl_u.afs.link); in afs_do_setlk()
571 case -ENOENT: in afs_do_setlk()
572 fl->fl_u.afs.state = ret; in afs_do_setlk()
574 list_del_init(&fl->fl_u.afs.link); in afs_do_setlk()
579 fl->fl_u.afs.state = ret; in afs_do_setlk()
581 list_del_init(&fl->fl_u.afs.link); in afs_do_setlk()
585 case -EWOULDBLOCK: in afs_do_setlk()
586 /* The server doesn't have a lock-waiting queue, so the client in afs_do_setlk()
590 ASSERT(list_empty(&vnode->granted_locks)); in afs_do_setlk()
591 ASSERTCMP(vnode->pending_locks.next, ==, &fl->fl_u.afs.link); in afs_do_setlk()
602 spin_unlock(&vnode->lock); in afs_do_setlk()
605 ASSERTCMP(fl->fl_u.afs.state, ==, AFS_LOCK_GRANTED); in afs_do_setlk()
624 if (!(fl->fl_flags & FL_SLEEP)) { in afs_do_setlk()
625 list_del_init(&fl->fl_u.afs.link); in afs_do_setlk()
627 ret = -EAGAIN; in afs_do_setlk()
633 queue_delayed_work(afs_lock_manager, &vnode->lock_work, HZ * 5); in afs_do_setlk()
641 spin_unlock(&vnode->lock); in afs_do_setlk()
644 ret = wait_event_interruptible(fl->fl_wait, in afs_do_setlk()
645 fl->fl_u.afs.state != AFS_LOCK_PENDING); in afs_do_setlk()
648 if (fl->fl_u.afs.state >= 0 && fl->fl_u.afs.state != AFS_LOCK_GRANTED) { in afs_do_setlk()
649 spin_lock(&vnode->lock); in afs_do_setlk()
651 switch (fl->fl_u.afs.state) { in afs_do_setlk()
653 fl->fl_u.afs.state = AFS_LOCK_PENDING; in afs_do_setlk()
661 ASSERTCMP(vnode->lock_state, ==, AFS_VNODE_LOCK_WAITING_FOR_CB); in afs_do_setlk()
663 fl->fl_u.afs.state = AFS_LOCK_PENDING; in afs_do_setlk()
672 spin_unlock(&vnode->lock); in afs_do_setlk()
675 if (fl->fl_u.afs.state == AFS_LOCK_GRANTED) in afs_do_setlk()
677 ret = fl->fl_u.afs.state; in afs_do_setlk()
688 spin_lock(&vnode->lock); in afs_do_setlk()
689 list_del_init(&fl->fl_u.afs.link); in afs_do_setlk()
693 spin_unlock(&vnode->lock); in afs_do_setlk()
707 _enter("{%llx:%llu},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); in afs_do_unlk()
715 _leave(" = %d [%u]", ret, vnode->lock_state); in afs_do_unlk()
730 if (vnode->lock_state == AFS_VNODE_LOCK_DELETED) in afs_do_getlk()
731 return -ENOENT; in afs_do_getlk()
733 fl->fl_type = F_UNLCK; in afs_do_getlk()
737 if (fl->fl_type == F_UNLCK) { in afs_do_getlk()
743 lock_count = READ_ONCE(vnode->status.lock_count); in afs_do_getlk()
746 fl->fl_type = F_RDLCK; in afs_do_getlk()
748 fl->fl_type = F_WRLCK; in afs_do_getlk()
749 fl->fl_start = 0; in afs_do_getlk()
750 fl->fl_end = OFFSET_MAX; in afs_do_getlk()
751 fl->fl_pid = 0; in afs_do_getlk()
757 _leave(" = %d [%hd]", ret, fl->fl_type); in afs_do_getlk()
767 enum afs_flock_operation op; in afs_lock() local
771 vnode->fid.vid, vnode->fid.vnode, cmd, in afs_lock()
772 fl->fl_type, fl->fl_flags, in afs_lock()
773 (long long) fl->fl_start, (long long) fl->fl_end); in afs_lock()
776 if (__mandatory_lock(&vnode->vfs_inode) && fl->fl_type != F_UNLCK) in afs_lock()
777 return -ENOLCK; in afs_lock()
782 fl->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id); in afs_lock()
785 if (fl->fl_type == F_UNLCK) in afs_lock()
791 case 0: op = afs_flock_op_return_ok; break; in afs_lock()
792 case -EAGAIN: op = afs_flock_op_return_eagain; break; in afs_lock()
793 case -EDEADLK: op = afs_flock_op_return_edeadlk; break; in afs_lock()
794 default: op = afs_flock_op_return_error; break; in afs_lock()
796 trace_afs_flock_op(vnode, fl, op); in afs_lock()
806 enum afs_flock_operation op; in afs_flock() local
810 vnode->fid.vid, vnode->fid.vnode, cmd, in afs_flock()
811 fl->fl_type, fl->fl_flags); in afs_flock()
820 if (!(fl->fl_flags & FL_FLOCK)) in afs_flock()
821 return -ENOLCK; in afs_flock()
823 fl->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id); in afs_flock()
827 if (fl->fl_type == F_UNLCK) in afs_flock()
833 case 0: op = afs_flock_op_return_ok; break; in afs_flock()
834 case -EAGAIN: op = afs_flock_op_return_eagain; break; in afs_flock()
835 case -EDEADLK: op = afs_flock_op_return_edeadlk; break; in afs_flock()
836 default: op = afs_flock_op_return_error; break; in afs_flock()
838 trace_afs_flock_op(vnode, fl, op); in afs_flock()
850 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_copy_lock()
854 new->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id); in afs_fl_copy_lock()
856 spin_lock(&vnode->lock); in afs_fl_copy_lock()
858 list_add(&new->fl_u.afs.link, &fl->fl_u.afs.link); in afs_fl_copy_lock()
859 spin_unlock(&vnode->lock); in afs_fl_copy_lock()
868 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_release_private()
872 spin_lock(&vnode->lock); in afs_fl_release_private()
875 list_del_init(&fl->fl_u.afs.link); in afs_fl_release_private()
876 if (list_empty(&vnode->granted_locks)) in afs_fl_release_private()
879 _debug("state %u for %p", vnode->lock_state, vnode); in afs_fl_release_private()
880 spin_unlock(&vnode->lock); in afs_fl_release_private()