From: "J. Bruce Fields" <bfields@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: linux-nfs@vger.kernel.org, samba-technical@lists.samba.org,
Christoph Hellwig <hch@infradead.org>,
Al Viro <viro@zeniv.linux.org.uk>,
Mimi Zohar <zohar@linux.vnet.ibm.com>,
"J. Bruce Fields" <bfields@redhat.com>
Subject: [PATCH 3/6] leases: break read leases on unlink
Date: Wed, 21 Sep 2011 10:58:14 -0400 [thread overview]
Message-ID: <1316617097-21384-4-git-send-email-bfields@redhat.com> (raw)
In-Reply-To: <1316617097-21384-1-git-send-email-bfields@redhat.com>
A read lease is used by NFSv4 as a guarantee that a client can perform
local read opens without informing the server.
The open operation takes the last component of the pathname as an
argument, thus is also a lookup operation, and giving the client the
above guarantee means informing the client before we allow anything that
would change the set of names pointing to the inode.
Samba, from what I can tell, has similar requirements, so this is really
a bug in the lease code, I think, not just a strange requirement from
NFS.
Therefore, we need to break leases on rename, link, and unlink.
Start with unlink.
The simplest thing to do is just to use the fact that unlink always
takes the i_mutex to prevent new leases from being acquired while the
unlink is in progress.
The lease is generally just an optimization--it's always OK not to give
one out. So we can just do a mutex_trylock() in setlease() and fail the
setlease if we don't get the lock.
It's annoying that the lease break--which will require acknowledgement
from an nfs client or an application--happens while holding the i_mutex.
But the time for that is limited by lease_break_time, so at least
there's no (permanent) deadlock there.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
---
fs/locks.c | 7 +++++--
fs/namei.c | 3 +++
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/locks.c b/fs/locks.c
index b342902..61130c1 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -1361,6 +1361,9 @@ int generic_add_lease(struct file *filp, long arg, struct file_lock **flp)
lease = *flp;
+ if (!mutex_trylock(&inode->i_mutex))
+ return -EAGAIN;
+
error = -EAGAIN;
if ((arg == F_RDLCK) && (atomic_read(&inode->i_writecount) > 0))
goto out;
@@ -1411,9 +1414,9 @@ int generic_add_lease(struct file *filp, long arg, struct file_lock **flp)
goto out;
locks_insert_lock(before, lease);
- return 0;
-
+ error = 0;
out:
+ mutex_unlock(&inode->i_mutex);
return error;
}
diff --git a/fs/namei.c b/fs/namei.c
index 6ff59e5..5c78f72 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2772,6 +2772,9 @@ static long do_unlinkat(int dfd, const char __user *pathname)
error = security_path_unlink(&nd.path, dentry);
if (error)
goto exit3;
+ error = break_lease(inode, O_WRONLY);
+ if (error)
+ goto exit3;
error = vfs_unlink(nd.path.dentry->d_inode, dentry);
exit3:
mnt_drop_write(nd.path.mnt);
--
1.7.4.1
next prev parent reply other threads:[~2011-09-21 14:58 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-21 14:58 breaking leases on metadata changes J. Bruce Fields
2011-09-21 14:58 ` [PATCH 2/6] leases: fix write-open/read-lease race J. Bruce Fields
2011-09-21 15:01 ` J. Bruce Fields
2011-09-22 17:17 ` Mimi Zohar
[not found] ` <1316617097-21384-3-git-send-email-bfields-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-10-10 21:59 ` J. Bruce Fields
2011-10-11 6:19 ` Need information about the net ads user command Pankaj Baranwal
[not found] ` <20111010215911.GC17936-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2011-10-28 8:46 ` [PATCH 2/6] leases: fix write-open/read-lease race J. Bruce Fields
2011-09-21 14:58 ` J. Bruce Fields [this message]
[not found] ` <1316617097-21384-4-git-send-email-bfields-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-09-21 15:02 ` [PATCH 3/6] leases: break read leases on unlink Christoph Hellwig
[not found] ` <20110921150241.GA11452-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2011-09-21 17:41 ` J. Bruce Fields
2011-09-21 14:58 ` [PATCH 4/6] leases: break read leases on rename J. Bruce Fields
[not found] ` <1316617097-21384-5-git-send-email-bfields-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-09-22 17:17 ` Mimi Zohar
2011-09-23 16:55 ` J. Bruce Fields
[not found] ` <20110923165510.GA807-spRCxval1Z7TsXDwO4sDpg@public.gmane.org>
2011-09-23 18:55 ` J. Bruce Fields
2011-09-23 19:58 ` Mimi Zohar
2011-09-23 20:13 ` J. Bruce Fields
[not found] ` <1316617097-21384-1-git-send-email-bfields-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-09-21 14:58 ` [PATCH 1/6] leases: split up generic_setlease into lock/unlock cases J. Bruce Fields
2011-09-22 17:16 ` Mimi Zohar
[not found] ` <1316711774.3159.52.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2011-09-23 18:57 ` J. Bruce Fields
2011-09-21 14:58 ` [PATCH 5/6] leases: break leases on any attribute modification J. Bruce Fields
2011-09-21 15:35 ` J. Bruce Fields
2011-09-21 14:58 ` [PATCH 6/6] leases: break read leases on link J. Bruce Fields
2011-09-24 18:36 ` breaking leases on metadata changes Stefan (metze) Metzmacher
2011-09-26 14:10 ` J. Bruce Fields
2011-09-26 16:16 ` J. Bruce Fields
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=1316617097-21384-4-git-send-email-bfields@redhat.com \
--to=bfields@redhat.com \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=samba-technical@lists.samba.org \
--cc=viro@zeniv.linux.org.uk \
--cc=zohar@linux.vnet.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).