All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Teigland <teigland@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: swhiteho@redhat.com, bfields@redhat.com
Subject: [PATCH v2] locks: skip posix unlock when there are no posix locks
Date: Fri, 19 Aug 2011 12:56:13 -0400	[thread overview]
Message-ID: <20110819165613.GB14345@redhat.com> (raw)

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@redhat.com>
---
 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;
-- 
1.7.6


             reply	other threads:[~2011-08-19 16:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-19 16:56 David Teigland [this message]
2011-08-19 17:09 ` [PATCH v2] locks: skip posix unlock when there are no posix locks Trond Myklebust
2011-08-19 17:46   ` David Teigland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110819165613.GB14345@redhat.com \
    --to=teigland@redhat.com \
    --cc=bfields@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=swhiteho@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.