Lines Matching refs:vnode

16 static void afs_next_locker(struct afs_vnode *vnode, int error);
25 static inline void afs_set_lock_state(struct afs_vnode *vnode, enum afs_lock_state state) in afs_set_lock_state() argument
27 _debug("STATE %u -> %u", vnode->lock_state, state); in afs_set_lock_state()
28 vnode->lock_state = state; in afs_set_lock_state()
36 void afs_lock_may_be_available(struct afs_vnode *vnode) in afs_lock_may_be_available() argument
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()
42 afs_next_locker(vnode, 0); in afs_lock_may_be_available()
43 trace_afs_flock_ev(vnode, NULL, afs_flock_callback_break, 0); in afs_lock_may_be_available()
44 spin_unlock(&vnode->lock); in afs_lock_may_be_available()
51 static void afs_schedule_lock_extension(struct afs_vnode *vnode) in afs_schedule_lock_extension() argument
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_vnode *vnode = call->lvnode; in afs_lock_op_done() local
76 spin_lock(&vnode->lock); in afs_lock_op_done()
77 trace_afs_flock_ev(vnode, NULL, afs_flock_timestamp, 0); in afs_lock_op_done()
78 vnode->locked_at = call->reply_time; in afs_lock_op_done()
79 afs_schedule_lock_extension(vnode); in afs_lock_op_done()
80 spin_unlock(&vnode->lock); in afs_lock_op_done()
89 static void afs_grant_locks(struct afs_vnode *vnode) in afs_grant_locks() argument
92 bool exclusive = (vnode->lock_type == AFS_LOCK_WRITE); in afs_grant_locks()
94 list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) { in afs_grant_locks()
98 list_move_tail(&p->fl_u.afs.link, &vnode->granted_locks); in afs_grant_locks()
100 trace_afs_flock_op(vnode, p, afs_flock_op_grant); in afs_grant_locks()
110 static void afs_next_locker(struct afs_vnode *vnode, int error) in afs_next_locker() argument
113 struct key *key = vnode->lock_key; in afs_next_locker()
118 if (vnode->lock_type == AFS_LOCK_WRITE) in afs_next_locker()
121 list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) { in afs_next_locker()
137 vnode->lock_key = NULL; in afs_next_locker()
141 afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING); in afs_next_locker()
143 trace_afs_flock_op(vnode, next, afs_flock_op_wake); in afs_next_locker()
146 afs_set_lock_state(vnode, AFS_VNODE_LOCK_NONE); in afs_next_locker()
147 trace_afs_flock_ev(vnode, NULL, afs_flock_no_lockers, 0); in afs_next_locker()
157 static void afs_kill_lockers_enoent(struct afs_vnode *vnode) in afs_kill_lockers_enoent() argument
161 afs_set_lock_state(vnode, AFS_VNODE_LOCK_DELETED); in afs_kill_lockers_enoent()
163 while (!list_empty(&vnode->pending_locks)) { in afs_kill_lockers_enoent()
164 p = list_entry(vnode->pending_locks.next, in afs_kill_lockers_enoent()
171 key_put(vnode->lock_key); in afs_kill_lockers_enoent()
172 vnode->lock_key = NULL; in afs_kill_lockers_enoent()
178 static int afs_set_lock(struct afs_vnode *vnode, struct key *key, in afs_set_lock() argument
186 vnode->volume->name, in afs_set_lock()
187 vnode->fid.vid, in afs_set_lock()
188 vnode->fid.vnode, in afs_set_lock()
189 vnode->fid.unique, in afs_set_lock()
197 if (afs_begin_vnode_operation(&fc, vnode, key, true)) { in afs_set_lock()
199 fc.cb_break = afs_calc_vnode_cb_break(vnode); in afs_set_lock()
203 afs_check_for_remote_deletion(&fc, vnode); in afs_set_lock()
204 afs_vnode_commit_status(&fc, vnode, fc.cb_break, NULL, scb); in afs_set_lock()
216 static int afs_extend_lock(struct afs_vnode *vnode, struct key *key) in afs_extend_lock() argument
223 vnode->volume->name, in afs_extend_lock()
224 vnode->fid.vid, in afs_extend_lock()
225 vnode->fid.vnode, in afs_extend_lock()
226 vnode->fid.unique, in afs_extend_lock()
234 if (afs_begin_vnode_operation(&fc, vnode, key, false)) { in afs_extend_lock()
236 fc.cb_break = afs_calc_vnode_cb_break(vnode); in afs_extend_lock()
240 afs_check_for_remote_deletion(&fc, vnode); in afs_extend_lock()
241 afs_vnode_commit_status(&fc, vnode, fc.cb_break, NULL, scb); in afs_extend_lock()
253 static int afs_release_lock(struct afs_vnode *vnode, struct key *key) in afs_release_lock() argument
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()
271 if (afs_begin_vnode_operation(&fc, vnode, key, false)) { in afs_release_lock()
273 fc.cb_break = afs_calc_vnode_cb_break(vnode); in afs_release_lock()
277 afs_check_for_remote_deletion(&fc, vnode); in afs_release_lock()
278 afs_vnode_commit_status(&fc, vnode, fc.cb_break, NULL, scb); in afs_release_lock()
294 struct afs_vnode *vnode = in afs_lock_work() local
299 _enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode); in afs_lock_work()
301 spin_lock(&vnode->lock); in afs_lock_work()
304 _debug("wstate %u for %p", vnode->lock_state, vnode); in afs_lock_work()
305 switch (vnode->lock_state) { in afs_lock_work()
307 afs_set_lock_state(vnode, AFS_VNODE_LOCK_UNLOCKING); in afs_lock_work()
308 trace_afs_flock_ev(vnode, NULL, afs_flock_work_unlocking, 0); in afs_lock_work()
309 spin_unlock(&vnode->lock); in afs_lock_work()
313 ret = afs_release_lock(vnode, vnode->lock_key); in afs_lock_work()
314 if (ret < 0 && vnode->lock_state != AFS_VNODE_LOCK_DELETED) { in afs_lock_work()
315 trace_afs_flock_ev(vnode, NULL, afs_flock_release_fail, in afs_lock_work()
319 vnode->fid.vid, vnode->fid.vnode, ret); in afs_lock_work()
322 spin_lock(&vnode->lock); in afs_lock_work()
324 afs_kill_lockers_enoent(vnode); in afs_lock_work()
326 afs_next_locker(vnode, 0); in afs_lock_work()
327 spin_unlock(&vnode->lock); in afs_lock_work()
336 ASSERT(!list_empty(&vnode->granted_locks)); in afs_lock_work()
338 key = key_get(vnode->lock_key); in afs_lock_work()
339 afs_set_lock_state(vnode, AFS_VNODE_LOCK_EXTENDING); in afs_lock_work()
340 trace_afs_flock_ev(vnode, NULL, afs_flock_work_extending, 0); in afs_lock_work()
341 spin_unlock(&vnode->lock); in afs_lock_work()
343 ret = afs_extend_lock(vnode, key); /* RPC */ in afs_lock_work()
347 trace_afs_flock_ev(vnode, NULL, afs_flock_extend_fail, in afs_lock_work()
350 vnode->fid.vid, vnode->fid.vnode, ret); in afs_lock_work()
353 spin_lock(&vnode->lock); in afs_lock_work()
356 afs_kill_lockers_enoent(vnode); in afs_lock_work()
357 spin_unlock(&vnode->lock); in afs_lock_work()
361 if (vnode->lock_state != AFS_VNODE_LOCK_EXTENDING) in afs_lock_work()
363 afs_set_lock_state(vnode, AFS_VNODE_LOCK_GRANTED); in afs_lock_work()
366 queue_delayed_work(afs_lock_manager, &vnode->lock_work, in afs_lock_work()
368 spin_unlock(&vnode->lock); in afs_lock_work()
380 afs_next_locker(vnode, 0); in afs_lock_work()
381 spin_unlock(&vnode->lock); in afs_lock_work()
385 afs_kill_lockers_enoent(vnode); in afs_lock_work()
386 spin_unlock(&vnode->lock); in afs_lock_work()
392 spin_unlock(&vnode->lock); in afs_lock_work()
404 static void afs_defer_unlock(struct afs_vnode *vnode) in afs_defer_unlock() argument
406 _enter("%u", vnode->lock_state); in afs_defer_unlock()
408 if (list_empty(&vnode->granted_locks) && in afs_defer_unlock()
409 (vnode->lock_state == AFS_VNODE_LOCK_GRANTED || in afs_defer_unlock()
410 vnode->lock_state == AFS_VNODE_LOCK_EXTENDING)) { in afs_defer_unlock()
411 cancel_delayed_work(&vnode->lock_work); in afs_defer_unlock()
413 afs_set_lock_state(vnode, AFS_VNODE_LOCK_NEED_UNLOCK); in afs_defer_unlock()
414 trace_afs_flock_ev(vnode, NULL, afs_flock_defer_unlock, 0); in afs_defer_unlock()
415 queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0); in afs_defer_unlock()
423 static int afs_do_setlk_check(struct afs_vnode *vnode, struct key *key, in afs_do_setlk_check() argument
432 ret = afs_validate(vnode, key); in afs_do_setlk_check()
439 ret = afs_check_permit(vnode, key, &access); in afs_do_setlk_check()
466 struct afs_vnode *vnode = AFS_FS_I(inode); in afs_do_setlk() local
477 vnode->fid.vid, vnode->fid.vnode, in afs_do_setlk()
489 ret = afs_do_setlk_check(vnode, key, mode, type); in afs_do_setlk()
493 trace_afs_flock_op(vnode, fl, afs_flock_op_set_lock); in afs_do_setlk()
509 spin_lock(&vnode->lock); in afs_do_setlk()
510 list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks); in afs_do_setlk()
513 if (vnode->lock_state == AFS_VNODE_LOCK_DELETED) in afs_do_setlk()
520 _debug("try %u", vnode->lock_state); in afs_do_setlk()
521 if (vnode->lock_state == AFS_VNODE_LOCK_GRANTED) { in afs_do_setlk()
524 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_do_setlk()
529 if (vnode->lock_type == AFS_LOCK_WRITE) { in afs_do_setlk()
531 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_do_setlk()
537 if (vnode->lock_state == AFS_VNODE_LOCK_NONE && in afs_do_setlk()
541 if (vnode->status.lock_count == -1) in afs_do_setlk()
544 if (vnode->status.lock_count != 0) in afs_do_setlk()
549 if (vnode->lock_state != AFS_VNODE_LOCK_NONE) in afs_do_setlk()
561 trace_afs_flock_ev(vnode, fl, afs_flock_try_to_lock, 0); in afs_do_setlk()
562 vnode->lock_key = key_get(key); in afs_do_setlk()
563 vnode->lock_type = type; in afs_do_setlk()
564 afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING); in afs_do_setlk()
565 spin_unlock(&vnode->lock); in afs_do_setlk()
567 ret = afs_set_lock(vnode, key, type); /* RPC */ in afs_do_setlk()
569 spin_lock(&vnode->lock); in afs_do_setlk()
577 trace_afs_flock_ev(vnode, fl, afs_flock_fail_perm, ret); in afs_do_setlk()
579 afs_next_locker(vnode, ret); in afs_do_setlk()
584 trace_afs_flock_ev(vnode, fl, afs_flock_fail_other, ret); in afs_do_setlk()
586 afs_kill_lockers_enoent(vnode); in afs_do_setlk()
591 trace_afs_flock_ev(vnode, fl, afs_flock_fail_other, ret); in afs_do_setlk()
593 afs_next_locker(vnode, 0); in afs_do_setlk()
601 ASSERT(list_empty(&vnode->granted_locks)); in afs_do_setlk()
602 ASSERTCMP(vnode->pending_locks.next, ==, &fl->fl_u.afs.link); in afs_do_setlk()
606 afs_set_lock_state(vnode, AFS_VNODE_LOCK_GRANTED); in afs_do_setlk()
607 trace_afs_flock_ev(vnode, fl, afs_flock_acquired, type); in afs_do_setlk()
608 afs_grant_locks(vnode); in afs_do_setlk()
613 spin_unlock(&vnode->lock); in afs_do_setlk()
620 trace_afs_flock_ev(vnode, fl, afs_flock_vfs_locking, 0); in afs_do_setlk()
622 trace_afs_flock_ev(vnode, fl, afs_flock_vfs_lock, ret); in afs_do_setlk()
630 afs_validate(vnode, key); in afs_do_setlk()
637 afs_next_locker(vnode, 0); in afs_do_setlk()
642 afs_set_lock_state(vnode, AFS_VNODE_LOCK_WAITING_FOR_CB); in afs_do_setlk()
643 trace_afs_flock_ev(vnode, fl, afs_flock_would_block, ret); in afs_do_setlk()
644 queue_delayed_work(afs_lock_manager, &vnode->lock_work, HZ * 5); in afs_do_setlk()
652 spin_unlock(&vnode->lock); in afs_do_setlk()
654 trace_afs_flock_ev(vnode, fl, afs_flock_waiting, 0); in afs_do_setlk()
657 trace_afs_flock_ev(vnode, fl, afs_flock_waited, ret); in afs_do_setlk()
660 spin_lock(&vnode->lock); in afs_do_setlk()
672 ASSERTCMP(vnode->lock_state, ==, AFS_VNODE_LOCK_WAITING_FOR_CB); in afs_do_setlk()
673 afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING); in afs_do_setlk()
683 spin_unlock(&vnode->lock); in afs_do_setlk()
699 spin_lock(&vnode->lock); in afs_do_setlk()
701 afs_defer_unlock(vnode); in afs_do_setlk()
704 spin_unlock(&vnode->lock); in afs_do_setlk()
715 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_do_unlk() local
718 _enter("{%llx:%llu},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); in afs_do_unlk()
720 trace_afs_flock_op(vnode, fl, afs_flock_op_unlock); in afs_do_unlk()
726 _leave(" = %d [%u]", ret, vnode->lock_state); in afs_do_unlk()
735 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_do_getlk() local
741 if (vnode->lock_state == AFS_VNODE_LOCK_DELETED) in afs_do_getlk()
750 ret = afs_fetch_status(vnode, key, false, NULL); in afs_do_getlk()
754 lock_count = READ_ONCE(vnode->status.lock_count); in afs_do_getlk()
777 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_lock() local
782 vnode->fid.vid, vnode->fid.vnode, cmd, in afs_lock()
787 if (__mandatory_lock(&vnode->vfs_inode) && fl->fl_type != F_UNLCK) in afs_lock()
794 trace_afs_flock_op(vnode, fl, afs_flock_op_lock); in afs_lock()
807 trace_afs_flock_op(vnode, fl, op); in afs_lock()
816 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_flock() local
821 vnode->fid.vid, vnode->fid.vnode, cmd, in afs_flock()
835 trace_afs_flock_op(vnode, fl, afs_flock_op_flock); in afs_flock()
849 trace_afs_flock_op(vnode, fl, op); in afs_flock()
861 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_copy_lock() local
867 spin_lock(&vnode->lock); in afs_fl_copy_lock()
868 trace_afs_flock_op(vnode, new, afs_flock_op_copy_lock); in afs_fl_copy_lock()
870 spin_unlock(&vnode->lock); in afs_fl_copy_lock()
879 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_release_private() local
883 spin_lock(&vnode->lock); in afs_fl_release_private()
885 trace_afs_flock_op(vnode, fl, afs_flock_op_release_lock); in afs_fl_release_private()
887 if (list_empty(&vnode->granted_locks)) in afs_fl_release_private()
888 afs_defer_unlock(vnode); in afs_fl_release_private()
890 _debug("state %u for %p", vnode->lock_state, vnode); in afs_fl_release_private()
891 spin_unlock(&vnode->lock); in afs_fl_release_private()