On Wed, Jun 30, 2021 at 10:51:27AM -0700, dai.ngo@xxxxxxxxxx wrote: > >On 6/28/21 1:23 PM, J. Bruce Fields wrote: > >> > >>where ->fl_expire_lock is a new lock callback with second > >>argument "check" > >>where: > >> > >> check = 1 means: just check whether this lock could be freed > > Why do we need this, is there a use case for it? can we just always try > to expire the lock and return success/fail? We can't expire the client while holding the flc_lock. And once we drop that lock we need to restart the loop. Clearly we can't do that every time. (So, my code was wrong, it should have been: if (fl->fl_lops->fl_expire_lock(fl, 1)) { spin_unlock(&ct->flc_lock); fl->fl_lops->fl_expire_locks(fl, 0); goto retry; } ) But the 1 and 0 cases are starting to look pretty different; maybe they should be two different callbacks. --b.