Lines Matching refs:vnode

30 void afs_lock_may_be_available(struct afs_vnode *vnode)  in afs_lock_may_be_available()  argument
32 _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode); in afs_lock_may_be_available()
34 queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0); in afs_lock_may_be_available()
41 static void afs_schedule_lock_extension(struct afs_vnode *vnode) in afs_schedule_lock_extension() argument
43 queue_delayed_work(afs_lock_manager, &vnode->lock_work, in afs_schedule_lock_extension()
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()
58 list_for_each_entry_safe(p, _p, &vnode->pending_locks, in afs_grant_locks()
63 &vnode->granted_locks); in afs_grant_locks()
73 static int afs_set_lock(struct afs_vnode *vnode, struct key *key, in afs_set_lock() argument
80 vnode->volume->name, in afs_set_lock()
81 vnode->fid.vid, in afs_set_lock()
82 vnode->fid.vnode, in afs_set_lock()
83 vnode->fid.unique, in afs_set_lock()
87 if (afs_begin_vnode_operation(&fc, vnode, key)) { in afs_set_lock()
89 fc.cb_break = afs_calc_vnode_cb_break(vnode); in afs_set_lock()
93 afs_check_for_remote_deletion(&fc, fc.vnode); in afs_set_lock()
94 afs_vnode_commit_status(&fc, vnode, fc.cb_break); in afs_set_lock()
105 static int afs_extend_lock(struct afs_vnode *vnode, struct key *key) in afs_extend_lock() argument
111 vnode->volume->name, in afs_extend_lock()
112 vnode->fid.vid, in afs_extend_lock()
113 vnode->fid.vnode, in afs_extend_lock()
114 vnode->fid.unique, in afs_extend_lock()
118 if (afs_begin_vnode_operation(&fc, vnode, key)) { in afs_extend_lock()
120 fc.cb_break = afs_calc_vnode_cb_break(vnode); in afs_extend_lock()
124 afs_check_for_remote_deletion(&fc, fc.vnode); in afs_extend_lock()
125 afs_vnode_commit_status(&fc, vnode, fc.cb_break); in afs_extend_lock()
136 static int afs_release_lock(struct afs_vnode *vnode, struct key *key) in afs_release_lock() argument
142 vnode->volume->name, in afs_release_lock()
143 vnode->fid.vid, in afs_release_lock()
144 vnode->fid.vnode, in afs_release_lock()
145 vnode->fid.unique, in afs_release_lock()
149 if (afs_begin_vnode_operation(&fc, vnode, key)) { in afs_release_lock()
151 fc.cb_break = afs_calc_vnode_cb_break(vnode); in afs_release_lock()
155 afs_check_for_remote_deletion(&fc, fc.vnode); in afs_release_lock()
156 afs_vnode_commit_status(&fc, vnode, fc.cb_break); in afs_release_lock()
171 struct afs_vnode *vnode = in afs_lock_work() local
178 _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode); in afs_lock_work()
180 spin_lock(&vnode->lock); in afs_lock_work()
183 _debug("wstate %u for %p", vnode->lock_state, vnode); in afs_lock_work()
184 switch (vnode->lock_state) { in afs_lock_work()
187 vnode->lock_state = AFS_VNODE_LOCK_UNLOCKING; in afs_lock_work()
188 spin_unlock(&vnode->lock); in afs_lock_work()
192 ret = afs_release_lock(vnode, vnode->lock_key); in afs_lock_work()
196 vnode->fid.vid, vnode->fid.vnode, ret); in afs_lock_work()
198 spin_lock(&vnode->lock); in afs_lock_work()
199 key_put(vnode->lock_key); in afs_lock_work()
200 vnode->lock_key = NULL; in afs_lock_work()
201 vnode->lock_state = AFS_VNODE_LOCK_NONE; in afs_lock_work()
203 if (list_empty(&vnode->pending_locks)) { in afs_lock_work()
204 spin_unlock(&vnode->lock); in afs_lock_work()
209 next = list_entry(vnode->pending_locks.next, in afs_lock_work()
211 vnode->lock_key = afs_file_key(next->fl_file); in afs_lock_work()
212 vnode->lock_type = (next->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; in afs_lock_work()
213 vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB; in afs_lock_work()
222 ASSERT(!list_empty(&vnode->granted_locks)); in afs_lock_work()
224 key = key_get(vnode->lock_key); in afs_lock_work()
225 vnode->lock_state = AFS_VNODE_LOCK_EXTENDING; in afs_lock_work()
226 spin_unlock(&vnode->lock); in afs_lock_work()
228 ret = afs_extend_lock(vnode, key); /* RPC */ in afs_lock_work()
233 vnode->fid.vid, vnode->fid.vnode, ret); in afs_lock_work()
235 spin_lock(&vnode->lock); in afs_lock_work()
237 if (vnode->lock_state != AFS_VNODE_LOCK_EXTENDING) in afs_lock_work()
239 vnode->lock_state = AFS_VNODE_LOCK_GRANTED; in afs_lock_work()
242 afs_schedule_lock_extension(vnode); in afs_lock_work()
244 queue_delayed_work(afs_lock_manager, &vnode->lock_work, in afs_lock_work()
246 spin_unlock(&vnode->lock); in afs_lock_work()
257 key = key_get(vnode->lock_key); in afs_lock_work()
258 type = vnode->lock_type; in afs_lock_work()
259 vnode->lock_state = AFS_VNODE_LOCK_SETTING; in afs_lock_work()
260 spin_unlock(&vnode->lock); in afs_lock_work()
262 ret = afs_set_lock(vnode, key, type); /* RPC */ in afs_lock_work()
265 spin_lock(&vnode->lock); in afs_lock_work()
272 vnode->lock_state = AFS_VNODE_LOCK_GRANTED; in afs_lock_work()
280 if (list_empty(&vnode->pending_locks)) { in afs_lock_work()
282 vnode->lock_state = AFS_VNODE_LOCK_NEED_UNLOCK; in afs_lock_work()
286 fl = list_entry(vnode->pending_locks.next, in afs_lock_work()
289 if (vnode->lock_type != type) { in afs_lock_work()
291 vnode->lock_state = AFS_VNODE_LOCK_NEED_UNLOCK; in afs_lock_work()
297 afs_grant_locks(vnode, fl); in afs_lock_work()
301 spin_unlock(&vnode->lock); in afs_lock_work()
308 spin_unlock(&vnode->lock); in afs_lock_work()
320 static void afs_defer_unlock(struct afs_vnode *vnode) in afs_defer_unlock() argument
324 if (vnode->lock_state == AFS_VNODE_LOCK_GRANTED || in afs_defer_unlock()
325 vnode->lock_state == AFS_VNODE_LOCK_EXTENDING) { in afs_defer_unlock()
326 cancel_delayed_work(&vnode->lock_work); in afs_defer_unlock()
328 vnode->lock_state = AFS_VNODE_LOCK_NEED_UNLOCK; in afs_defer_unlock()
329 afs_lock_may_be_available(vnode); in afs_defer_unlock()
337 static int afs_do_setlk_check(struct afs_vnode *vnode, struct key *key, in afs_do_setlk_check() argument
346 ret = afs_validate(vnode, key); in afs_do_setlk_check()
353 ret = afs_check_permit(vnode, key, &access); in afs_do_setlk_check()
366 if (vnode->status.lock_count == -1 && !can_sleep) in afs_do_setlk_check()
371 if (vnode->status.lock_count != 0 && !can_sleep) in afs_do_setlk_check()
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()
395 afs_defer_unlock(vnode); in afs_dequeue_lock()
399 if (!list_empty(&vnode->granted_locks) || in afs_dequeue_lock()
400 vnode->pending_locks.next != &fl->fl_u.afs.link) { in afs_dequeue_lock()
406 key_put(vnode->lock_key); in afs_dequeue_lock()
407 vnode->lock_key = NULL; in afs_dequeue_lock()
408 vnode->lock_state = AFS_VNODE_LOCK_NONE; in afs_dequeue_lock()
410 if (list_empty(&vnode->pending_locks)) in afs_dequeue_lock()
414 next = list_entry(vnode->pending_locks.next, in afs_dequeue_lock()
416 vnode->lock_key = afs_file_key(next->fl_file); in afs_dequeue_lock()
417 vnode->lock_type = (next->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; in afs_dequeue_lock()
418 vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB; in afs_dequeue_lock()
419 afs_lock_may_be_available(vnode); in afs_dequeue_lock()
428 struct afs_vnode *vnode = AFS_FS_I(inode); in afs_do_setlk() local
433 _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); in afs_do_setlk()
445 ret = afs_do_setlk_check(vnode, key, type, fl->fl_flags & FL_SLEEP); in afs_do_setlk()
449 spin_lock(&vnode->lock); in afs_do_setlk()
456 vnode->lock_state == AFS_VNODE_LOCK_GRANTED && in afs_do_setlk()
457 vnode->lock_type == AFS_LOCK_READ) { in afs_do_setlk()
459 ASSERT(!list_empty(&vnode->granted_locks)); in afs_do_setlk()
463 list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks); in afs_do_setlk()
465 if (vnode->lock_state != AFS_VNODE_LOCK_NONE) in afs_do_setlk()
477 vnode->lock_key = key_get(key); in afs_do_setlk()
478 vnode->lock_type = type; in afs_do_setlk()
479 vnode->lock_state = AFS_VNODE_LOCK_SETTING; in afs_do_setlk()
480 spin_unlock(&vnode->lock); in afs_do_setlk()
482 ret = afs_set_lock(vnode, key, type); /* RPC */ in afs_do_setlk()
484 spin_lock(&vnode->lock); in afs_do_setlk()
495 ASSERT(list_empty(&vnode->granted_locks)); in afs_do_setlk()
496 ASSERTCMP(vnode->pending_locks.next, ==, &fl->fl_u.afs.link); in afs_do_setlk()
497 vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB; in afs_do_setlk()
507 vnode->lock_state = AFS_VNODE_LOCK_GRANTED; in afs_do_setlk()
508 afs_schedule_lock_extension(vnode); in afs_do_setlk()
513 list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); in afs_do_setlk()
517 spin_unlock(&vnode->lock); in afs_do_setlk()
527 afs_validate(vnode, key); in afs_do_setlk()
539 spin_unlock(&vnode->lock); in afs_do_setlk()
545 spin_lock(&vnode->lock); in afs_do_setlk()
557 afs_dequeue_lock(vnode, fl); in afs_do_setlk()
560 spin_unlock(&vnode->lock); in afs_do_setlk()
570 spin_lock(&vnode->lock); in afs_do_setlk()
572 if (list_empty(&vnode->granted_locks)) in afs_do_setlk()
573 afs_defer_unlock(vnode); in afs_do_setlk()
582 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_do_unlk() local
585 _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); in afs_do_unlk()
595 _leave(" = %d [%u]", ret, vnode->lock_state); in afs_do_unlk()
604 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_do_getlk() local
616 ret = afs_fetch_status(vnode, key, false); in afs_do_getlk()
620 lock_count = READ_ONCE(vnode->status.lock_count); in afs_do_getlk()
640 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_lock() local
643 vnode->fid.vid, vnode->fid.vnode, cmd, in afs_lock()
648 if (__mandatory_lock(&vnode->vfs_inode) && fl->fl_type != F_UNLCK) in afs_lock()
663 struct afs_vnode *vnode = AFS_FS_I(locks_inode(file)); in afs_flock() local
666 vnode->fid.vid, vnode->fid.vnode, cmd, in afs_flock()
693 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_copy_lock() local
697 spin_lock(&vnode->lock); in afs_fl_copy_lock()
699 spin_unlock(&vnode->lock); in afs_fl_copy_lock()
708 struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file)); in afs_fl_release_private() local
712 spin_lock(&vnode->lock); in afs_fl_release_private()
713 afs_dequeue_lock(vnode, fl); in afs_fl_release_private()
714 _debug("state %u for %p", vnode->lock_state, vnode); in afs_fl_release_private()
715 spin_unlock(&vnode->lock); in afs_fl_release_private()