All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Ceph fixes for 3.2 final
@ 2011-12-29  2:05 Sage Weil
  2011-12-29  2:05 ` [PATCH 1/3] ceph: take inode lock when finding an inode alias Sage Weil
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Sage Weil @ 2011-12-29  2:05 UTC (permalink / raw)
  To: ceph-devel; +Cc: Sage Weil

This is a final set of fixes for 3.2.  The main issue is with the 
d_find_any_alias() code, which used to rely on the caller holding i_lock 
(this is no longer the case).  The last patch adds a mount option to 
enable/disable use of the dcache for negative lookups and readdir on 
directories the client has completely cached; there are some bugs 
lurking in that code so it is disabled for now.

I'll be sending this to Linus tomorrow, unless anyone see any problems!

sage


Alex Elder (2):
  ceph: take inode lock when finding an inode alias
  ceph: take a reference to the dentry in d_find_any_alias()

Sage Weil (1):
  ceph: enable/disable dentry complete flags via mount option

 fs/ceph/dir.c   |   50 +++++++++++++++++++++++++++++++++++++++++---------
 fs/ceph/super.c |   14 ++++++++++++++
 fs/ceph/super.h |    1 +
 3 files changed, 56 insertions(+), 9 deletions(-)

-- 
1.7.2.5


^ permalink raw reply	[flat|nested] 10+ messages in thread
* [PATCH 1/3] ceph: take inode lock when finding an inode alias
@ 2011-12-22 20:13 Sage Weil
  0 siblings, 0 replies; 10+ messages in thread
From: Sage Weil @ 2011-12-22 20:13 UTC (permalink / raw)
  To: ceph-devel; +Cc: Alex Elder

From: Alex Elder <elder@dreamhost.com>

In the ceph_dir_*_complete() functions, a call to
__d_find_any_alias() is used to get a dentry for a inode.
Previously this was done under the inode's i_lock, but
recently this change converted things to use the ceph
inode's i_ceph_lock instead:
    be655596 ceph: use i_ceph_lock instead of i_lock

Finding an inode alias operates (only) on the Linux inode, so
we really do need to take the Linux lock for this.  Since i_lock
is ordered inside i_ceph_lock, we can safely do this for all
these ceph cases.

For now, just copy the d_find_any_alias() function from
"fs/dcache.c" and use that instead.

Signed-off-by: Alex Elder <elder@dreamhost.com>
---
 fs/ceph/dir.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index 3eeb976..e58b0d1 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -1104,9 +1104,21 @@ static struct dentry * __d_find_any_alias(struct inode *inode)
 	return alias;
 }
 
+/* The following code copied from "fs/dcache.c" */
+static struct dentry * d_find_any_alias(struct inode *inode)
+{
+	struct dentry *de;
+
+	spin_lock(&inode->i_lock);
+	de = __d_find_any_alias(inode);
+	spin_unlock(&inode->i_lock);
+	return de;
+}
+/* End of code copied from "fs/dcache.c" */
+
 void ceph_dir_set_complete(struct inode *inode)
 {
-	struct dentry *dentry = __d_find_any_alias(inode);
+	struct dentry *dentry = d_find_any_alias(inode);
 	
 	if (dentry && ceph_dentry(dentry)) {
 		dout(" marking %p (%p) complete\n", inode, dentry);
@@ -1116,7 +1128,7 @@ void ceph_dir_set_complete(struct inode *inode)
 
 void ceph_dir_clear_complete(struct inode *inode)
 {
-	struct dentry *dentry = __d_find_any_alias(inode);
+	struct dentry *dentry = d_find_any_alias(inode);
 
 	if (dentry && ceph_dentry(dentry)) {
 		dout(" marking %p (%p) NOT complete\n", inode, dentry);
@@ -1126,7 +1138,7 @@ void ceph_dir_clear_complete(struct inode *inode)
 
 bool ceph_dir_test_complete(struct inode *inode)
 {
-	struct dentry *dentry = __d_find_any_alias(inode);
+	struct dentry *dentry = d_find_any_alias(inode);
 
 	if (dentry && ceph_dentry(dentry))
 		return test_bit(CEPH_D_COMPLETE, &ceph_dentry(dentry)->flags);
-- 
1.7.5.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2011-12-29 14:54 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-29  2:05 [PATCH 0/3] Ceph fixes for 3.2 final Sage Weil
2011-12-29  2:05 ` [PATCH 1/3] ceph: take inode lock when finding an inode alias Sage Weil
2011-12-29  9:10   ` Christoph Hellwig
2011-12-29  2:05 ` [PATCH 2/3] ceph: take a reference to the dentry in d_find_any_alias() Sage Weil
2011-12-29  9:11   ` Christoph Hellwig
2011-12-29 14:34     ` Alex Elder
2011-12-29 14:54       ` Christoph Hellwig
2011-12-29  2:05 ` [PATCH 3/3] ceph: enable/disable dentry complete flags via mount option Sage Weil
2011-12-29  9:11   ` Christoph Hellwig
  -- strict thread matches above, loose matches on Subject: below --
2011-12-22 20:13 [PATCH 1/3] ceph: take inode lock when finding an inode alias Sage Weil

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.