From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Teigland Subject: [RFC PATCH] locks: skip posix unlock when there are no posix locks Date: Thu, 18 Aug 2011 16:38:16 -0400 Message-ID: <20110818203816.GB315@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: linux-fsdevel@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:63244 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751240Ab1HRUiS (ORCPT ); Thu, 18 Aug 2011 16:38:18 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p7IKcIZn007061 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 18 Aug 2011 16:38:18 -0400 Received: from redhat.com (s01.msp.redhat.com [10.15.95.15]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p7IKcG4Z031173 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 18 Aug 2011 16:38:18 -0400 Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: When i_flock contains only flocks, the posix unlock is extraneous. On gfs2, ocfs2, and possibly others, the posix unlock can be costly, and something to avoid if possible. As the comment implies, there will be races here. The question is, do those races become harmful with this new loop? Signed-off-by: David Teigland --- fs/locks.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index 703f545..4507401 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1982,15 +1982,27 @@ 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; + for_each_lock(inode, before) { + struct file_lock *fl = *before; + if (IS_POSIX(fl)) + goto do_unlock; + } + return; + +do_unlock: lock.fl_type = F_UNLCK; lock.fl_flags = FL_POSIX | FL_CLOSE; lock.fl_start = 0; -- 1.7.6