On Tuesday January 15, [EMAIL PROTECTED] wrote: > > I don't feel comfortable to change the existing code structure, > especially a BUG() statement. It would be better to separate lock > failover function away from lockd code clean-up. This is to make it > easier for problem isolations (just in case).
Fair enough. > > On the other hand, if we view "ret" as a file count that tells us how > many files fail to get unlocked, it would be great for debugging > purpose. So the changes I made (currently in the middle of cluster > testing) end up like this: > > if (likely(is_failover_file == NULL) || > is_failover_file(data, file)) { > /* > * Note that nlm_inspect_file updates f_locks > * and ret is the number of files that can't > * be unlocked. > */ > ret += nlm_inspect_file(data, file, match); > } else > file->f_locks = nlm_file_inuse(file); Looks good. > >> mutex_lock(&nlm_file_mutex); > >> file->f_count--; > >> /* No more references to this file. Let go of it. */ > >> - if (list_empty(&file->f_blocks) && !file->f_locks > >> + if (!file->f_locks && list_empty(&file->f_blocks) > >> > > > > Is this change actually achieving something? or is it just noise? > > > Not really - but I thought checking for f_locks would be faster (tiny > bit of optimization :)) You don't want to put the fastest operation first. You want the one that is most likely to fail (as it is an '&&' where failure aborts the sequence). So you would need some argument (preferably with measurements) to say which of the conditions will fail most often, before rearranging as an optimisation. NeilBrown