From: Olaf Kirch <okir@suse.de>
To: nfs@lists.sourceforge.net
Cc: akpm@osdl.org
Subject: [PATCH fs/locks 2 of 3] Use proper tgid in locks_remove_posix
Date: Mon, 11 Jul 2005 12:32:50 +0200 [thread overview]
Message-ID: <20050711103250.GH27163@suse.de> (raw)
# Subject: [NFS] Use proper tgid in locks_remove_posix
#
# This patch fixes a problem with lost unlock calls in multithreaded
# applications. locks_remove_posix would send a single unlock call with
# the task group ID of the current process, which may not be the same as
# the tgid of the lock. This patch ensures that we send separate unlock
# calls for different fl_pid values.
#
# Signed-off-by: Olaf Kirch <okir@suse.de>
Index: linux-2.6.12/fs/locks.c
===================================================================
--- linux-2.6.12.orig/fs/locks.c 2005-07-11 12:16:41.000000000 +0200
+++ linux-2.6.12/fs/locks.c 2005-07-11 12:17:15.000000000 +0200
@@ -1811,47 +1811,60 @@ out:
void locks_remove_posix(struct file *filp, fl_owner_t owner)
{
struct file_lock lock, **before;
+ pid_t tgid;
+ int more;
- /*
- * 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.
- */
- before = &filp->f_dentry->d_inode->i_flock;
- if (*before == NULL)
- return;
-
- lock.fl_type = F_UNLCK;
- lock.fl_flags = FL_POSIX;
- lock.fl_start = 0;
- lock.fl_end = OFFSET_MAX;
- lock.fl_owner = owner;
- lock.fl_pid = current->tgid;
- lock.fl_file = filp;
- lock.fl_ops = NULL;
- lock.fl_lmops = NULL;
-
- if (filp->f_op && filp->f_op->lock != NULL) {
- filp->f_op->lock(filp, F_SETLK, &lock);
- goto out;
- }
+ do {
+ /*
+ * 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.
+ */
+ before = &filp->f_dentry->d_inode->i_flock;
+ if (*before == NULL)
+ return;
+
+ more = 0;
+ tgid = 0;
+
+ /* Can't use posix_lock_file here; we need to remove it no matter
+ * which pid we have.
+ */
+ lock_kernel();
+ while (*before != NULL) {
+ struct file_lock *fl = *before;
+ if (IS_POSIX(fl) && posix_same_owner(fl, &lock)) {
+ if (tgid == 0 || tgid == fl->fl_pid) {
+ tgid = fl->fl_pid;
+ locks_delete_lock(before);
+ continue;
+ }
+ /* We have locks owned by a different tgid.
+ * Need to come back. */
+ more = 1;
+ }
+ before = &fl->fl_next;
+ }
+ unlock_kernel();
- /* Can't use posix_lock_file here; we need to remove it no matter
- * which pid we have.
- */
- lock_kernel();
- while (*before != NULL) {
- struct file_lock *fl = *before;
- if (IS_POSIX(fl) && posix_same_owner(fl, &lock)) {
- locks_delete_lock(before);
- continue;
+ if (tgid != 0) {
+ lock.fl_type = F_UNLCK;
+ lock.fl_flags = FL_POSIX;
+ lock.fl_start = 0;
+ lock.fl_end = OFFSET_MAX;
+ lock.fl_owner = owner;
+ lock.fl_pid = tgid;
+ lock.fl_file = filp;
+ lock.fl_ops = NULL;
+ lock.fl_lmops = NULL;
+
+ if (filp->f_op && filp->f_op->lock != NULL) {
+ filp->f_op->lock(filp, F_SETLK, &lock);
+ if (lock.fl_ops && lock.fl_ops->fl_release_private)
+ lock.fl_ops->fl_release_private(&lock);
+ }
}
- before = &fl->fl_next;
- }
- unlock_kernel();
-out:
- if (lock.fl_ops && lock.fl_ops->fl_release_private)
- lock.fl_ops->fl_release_private(&lock);
+ } while (more);
}
EXPORT_SYMBOL(locks_remove_posix);
--
Olaf Kirch | --- o --- Nous sommes du soleil we love when we play
okir@suse.de | / | \ sol.dhoop.naytheet.ah kin.ir.samse.qurax
-------------------------------------------------------
This SF.Net email is sponsored by the 'Do More With Dual!' webinar happening
July 14 at 8am PDT/11am EDT. We invite you to explore the latest in dual
core and dual graphics technology at this free one hour event hosted by HP,
AMD, and NVIDIA. To register visit http://www.hp.com/go/dualwebinar
_______________________________________________
NFS maillist - NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs
next reply other threads:[~2005-07-11 10:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-11 10:32 Olaf Kirch [this message]
2005-07-11 12:16 ` [PATCH fs/locks 2 of 3] Use proper tgid in locks_remove_posix Trond Myklebust
2005-07-11 12:48 ` Olaf Kirch
2005-07-11 13:02 ` Trond Myklebust
2005-07-11 13:16 ` Olaf Kirch
2005-07-11 13:33 ` Peter Staubach
2005-07-11 13:52 ` Trond Myklebust
2005-07-11 14:23 ` Olaf Kirch
2005-07-16 15:15 ` Olaf Hering
2005-07-17 16:42 ` Olaf Kirch
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=20050711103250.GH27163@suse.de \
--to=okir@suse.de \
--cc=akpm@osdl.org \
--cc=nfs@lists.sourceforge.net \
/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.