Joseph Qi
2013-May-06 14:43 UTC
[Ocfs2-devel] [PATCH] ocfs2: unlock rw lock if inode lock failed
In ocfs2_file_aio_write, it does ocfs2_rw_lock first and then ocfs2_inode_lock. But if ocfs2_inode_lock failed, it goes to out_sems without unlocking rw lock. This will cause a bug in ocfs2_lock_res_free when testing res->l_ex_holders, which is increased in __ocfs2_cluster_lock and decreased in __ocfs2_cluster_unlock. Signed-off-by: Joseph Qi <joseph.qi at huawei.com> --- fs/ocfs2/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 6474cb4..e2cd7a8 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2290,7 +2290,7 @@ relock: ret = ocfs2_inode_lock(inode, NULL, 1); if (ret < 0) { mlog_errno(ret); - goto out_sems; + goto out; } ocfs2_inode_unlock(inode, 1); -- 1.7.9.7
Sunil Mushran
2013-May-06 16:34 UTC
[Ocfs2-devel] [PATCH] ocfs2: unlock rw lock if inode lock failed
Looks good to me. Acked-by: Sunil Mushran <sunil.mushran at gmail.com> On Mon, May 6, 2013 at 7:43 AM, Joseph Qi <joseph.qi at huawei.com> wrote:> In ocfs2_file_aio_write, it does ocfs2_rw_lock first and then > ocfs2_inode_lock. But if ocfs2_inode_lock failed, it goes to out_sems > without unlocking rw lock. This will cause a bug in ocfs2_lock_res_free > when testing res->l_ex_holders, which is increased in > __ocfs2_cluster_lock and decreased in __ocfs2_cluster_unlock. > > Signed-off-by: Joseph Qi <joseph.qi at huawei.com> > > --- > fs/ocfs2/file.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c > index 6474cb4..e2cd7a8 100644 > --- a/fs/ocfs2/file.c > +++ b/fs/ocfs2/file.c > @@ -2290,7 +2290,7 @@ relock: > ret = ocfs2_inode_lock(inode, NULL, 1); > if (ret < 0) { > mlog_errno(ret); > - goto out_sems; > + goto out; > } > > ocfs2_inode_unlock(inode, 1); > -- > 1.7.9.7 > > > _______________________________________________ > Ocfs2-devel mailing list > Ocfs2-devel at oss.oracle.com > https://oss.oracle.com/mailman/listinfo/ocfs2-devel >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://oss.oracle.com/pipermail/ocfs2-devel/attachments/20130506/5718074c/attachment.html
Andrew Morton
2013-May-08 19:38 UTC
[Ocfs2-devel] [PATCH] ocfs2: unlock rw lock if inode lock failed
On Mon, 6 May 2013 22:43:39 +0800 Joseph Qi <joseph.qi at huawei.com> wrote:> In ocfs2_file_aio_write, it does ocfs2_rw_lock first and then > ocfs2_inode_lock. But if ocfs2_inode_lock failed, it goes to out_sems > without unlocking rw lock. This will cause a bug in ocfs2_lock_res_free > when testing res->l_ex_holders, which is increased in > __ocfs2_cluster_lock and decreased in __ocfs2_cluster_unlock. > > ... > > --- a/fs/ocfs2/file.c > +++ b/fs/ocfs2/file.c > @@ -2290,7 +2290,7 @@ relock: > ret = ocfs2_inode_lock(inode, NULL, 1); > if (ret < 0) { > mlog_errno(ret); > - goto out_sems; > + goto out; > } > > ocfs2_inode_unlock(inode, 1);That seems like a fairly serious bug. How long has it been there and what userspace actions are required to trigger it? (I'm trying to work out which kernel versions we should merge the fix into, but the changelog didn't give me enough info to determine this)
Reasonably Related Threads
- [PATCH 1/2] Ocfs2: Add a mount option "coherency=*" for O_DIRECT writes.
- [PATCH 0/7] [RESEND] Fix some deadlocks in quota code and implement lockdep for cluster locks
- [PATCH 1/1] Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem.
- [PATCH 1/1] a fix of logging return value.
- [PATCH 0/9] remove i_alloc_sem V2