On Fri, 2011-08-19 at 12:56 -0400, David Teigland wrote: > When i_flock contains only flocks, the posix unlock is > unnecessary, but called anyway. On gfs2, ocfs2, and > possibly others with f_op->lock, the posix unlock can > be costly, so only do it if posix locks exist. > > Signed-off-by: David Teigland <teigland@xxxxxxxxxx> > --- > fs/locks.c | 17 ++++++++++++++++- > 1 files changed, 16 insertions(+), 1 deletions(-) > > diff --git a/fs/locks.c b/fs/locks.c > index 703f545..d47f497 100644 > --- a/fs/locks.c > +++ b/fs/locks.c > @@ -1982,15 +1982,30 @@ out: > void locks_remove_posix(struct file *filp, fl_owner_t owner) > { > struct file_lock lock; > + struct file_lock **before; > + struct inode *inode; > > /* > * If there are no locks held on this file, we don't need to call > * posix_lock_file(). Another process could be setting a lock on this > * file at the same time, but we wouldn't remove that lock anyway. > */ > - if (!filp->f_path.dentry->d_inode->i_flock) > + inode = filp->f_path.dentry->d_inode; > + > + if (!inode->i_flock) > return; > > + lock_flocks(); > + for_each_lock(inode, before) { > + struct file_lock *fl = *before; > + if (IS_POSIX(fl)) > + goto do_unlock; > + } > + unlock_flocks(); > + return; > + > +do_unlock: > + unlock_flocks(); > lock.fl_type = F_UNLCK; > lock.fl_flags = FL_POSIX | FL_CLOSE; > lock.fl_start = 0; This assumes that all locks are mirrored in inode->i_flock, which may not be the case if the filesystem implements its own f_op->lock(). The right place for this optimisation would be in your filesystem callback. Cheers Trond -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@xxxxxxxxxx www.netapp.com -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html