Tao Ma
2009-Aug-27 06:46 UTC
[Ocfs2-devel] [PATCH] ocfs2: invalidate dentry if its dentry_lock isn't initialized.
In commit a5a0a630922a2f6a774b6dac19f70cb5abd86bb0, when ocfs2_attch_dentry_lock fails, we call an extra iput and reset dentry->d_fsdata to NULL. This resolve a bug, but it isn't completed and the dentry is still there. When we want to use it again, ocfs2_dentry_revalidate doesn't catch it and return true. That make future ocfs2_dentry_lock panic out. One bug is http://oss.oracle.com/bugzilla/show_bug.cgi?id=1162. The resolution is to add a check for dentry->d_fsdata in revalidate process and return false if dentry->d_fsdata is NULL, so that a new ocfs2_lookup will be called again. Signed-off-by: Tao Ma <tao.ma at oracle.com> --- fs/ocfs2/dcache.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 2f28b7d..b4957c7 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c @@ -85,6 +85,17 @@ static int ocfs2_dentry_revalidate(struct dentry *dentry, goto bail; } + /* + * If the last lookup failed to create dentry lock, let us + * redo it. + */ + if (!dentry->d_fsdata) { + mlog(0, "Inode %llu doesn't have dentry lock, " + "returning false\n", + (unsigned long long)OCFS2_I(inode)->ip_blkno); + goto bail; + } + ret = 1; bail: -- 1.5.5
Joel Becker
2009-Aug-28 01:17 UTC
[Ocfs2-devel] [PATCH] ocfs2: invalidate dentry if its dentry_lock isn't initialized.
On Thu, Aug 27, 2009 at 02:46:56PM +0800, Tao Ma wrote:> In commit a5a0a630922a2f6a774b6dac19f70cb5abd86bb0, when > ocfs2_attch_dentry_lock fails, we call an extra iput and reset > dentry->d_fsdata to NULL. This resolve a bug, but it isn't > completed and the dentry is still there. When we want to use > it again, ocfs2_dentry_revalidate doesn't catch it and return > true. That make future ocfs2_dentry_lock panic out. > One bug is http://oss.oracle.com/bugzilla/show_bug.cgi?id=1162. > > The resolution is to add a check for dentry->d_fsdata in > revalidate process and return false if dentry->d_fsdata is NULL, > so that a new ocfs2_lookup will be called again. > > Signed-off-by: Tao Ma <tao.ma at oracle.com>This is now in the fixes branch of ocfs2.git. Joel -- "Lately I've been talking in my sleep. Can't imagine what I'd have to say. Except my world will be right When love comes back my way." Joel Becker Principal Software Developer Oracle E-mail: joel.becker at oracle.com Phone: (650) 506-8127
Sunil Mushran
2009-Sep-01 17:47 UTC
[Ocfs2-devel] [PATCH] ocfs2: invalidate dentry if its dentry_lock isn't initialized.
Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> Tao Ma wrote:> In commit a5a0a630922a2f6a774b6dac19f70cb5abd86bb0, when > ocfs2_attch_dentry_lock fails, we call an extra iput and reset > dentry->d_fsdata to NULL. This resolve a bug, but it isn't > completed and the dentry is still there. When we want to use > it again, ocfs2_dentry_revalidate doesn't catch it and return > true. That make future ocfs2_dentry_lock panic out. > One bug is http://oss.oracle.com/bugzilla/show_bug.cgi?id=1162. > > The resolution is to add a check for dentry->d_fsdata in > revalidate process and return false if dentry->d_fsdata is NULL, > so that a new ocfs2_lookup will be called again. > > Signed-off-by: Tao Ma <tao.ma at oracle.com> > --- > fs/ocfs2/dcache.c | 11 +++++++++++ > 1 files changed, 11 insertions(+), 0 deletions(-) > > diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c > index 2f28b7d..b4957c7 100644 > --- a/fs/ocfs2/dcache.c > +++ b/fs/ocfs2/dcache.c > @@ -85,6 +85,17 @@ static int ocfs2_dentry_revalidate(struct dentry *dentry, > goto bail; > } > > + /* > + * If the last lookup failed to create dentry lock, let us > + * redo it. > + */ > + if (!dentry->d_fsdata) { > + mlog(0, "Inode %llu doesn't have dentry lock, " > + "returning false\n", > + (unsigned long long)OCFS2_I(inode)->ip_blkno); > + goto bail; > + } > + > ret = 1; > > bail: >