[JFFS2] Quiet lockdep false positive.

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Thu May 1 10:59:02 EDT 2008


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=590fe34c47cb5c2d836ac76fabc5f160bf31a3f1
Commit:     590fe34c47cb5c2d836ac76fabc5f160bf31a3f1
Parent:     4e571aba7bb25a3a069a7b88c0f63fe5a14c05c6
Author:     David Woodhouse <dwmw2 at infradead.org>
AuthorDate: Thu May 1 15:53:28 2008 +0100
Committer:  David Woodhouse <dwmw2 at infradead.org>
CommitDate: Thu May 1 15:53:28 2008 +0100

    [JFFS2] Quiet lockdep false positive.
    
    Don't hold f->sem while calling into jffs2_do_create(). It makes lockdep
    unhappy, and we don't really need it -- the _reason_ it's a false
    positive is because nobody else can see this inode yet and so nobody
    will be trying to lock it anyway.
    
    Signed-off-by: David Woodhouse <dwmw2 at infradead.org>
---
 fs/jffs2/dir.c   |    7 +++++++
 fs/jffs2/write.c |    6 +++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index c63e7a9..2bba3d3 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c
@@ -208,6 +208,13 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
 	f = JFFS2_INODE_INFO(inode);
 	dir_f = JFFS2_INODE_INFO(dir_i);
 
+	/* jffs2_do_create() will want to lock it, _after_ reserving
+	   space and taking c-alloc_sem. If we keep it locked here,
+	   lockdep gets unhappy (although it's a false positive;
+	   nothing else will be looking at this inode yet so there's
+	   no chance of AB-BA deadlock involving its f->sem). */
+	mutex_unlock(&f->sem);
+
 	ret = jffs2_do_create(c, dir_f, f, ri,
 			      dentry->d_name.name, dentry->d_name.len);
 	if (ret)
diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c
index 665fce9..87891bd 100644
--- a/fs/jffs2/write.c
+++ b/fs/jffs2/write.c
@@ -438,10 +438,10 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str
 	ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
 				JFFS2_SUMMARY_INODE_SIZE);
 	D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen));
-	if (ret) {
-		mutex_unlock(&f->sem);
+	if (ret)
 		return ret;
-	}
+
+	mutex_lock(&f->sem);
 
 	ri->data_crc = cpu_to_je32(0);
 	ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));



More information about the linux-mtd-cvs mailing list