Denis Kirjanov be23a9
From c74821447915812231409bc1ee815007c1602a24 Mon Sep 17 00:00:00 2001
Denis Kirjanov be23a9
From: Pavel Machek <pavel@ucw.cz>
Denis Kirjanov be23a9
Date: Thu, 6 Aug 2020 23:18:09 -0700
Denis Kirjanov be23a9
Subject: [PATCH 2/6] ocfs2: fix unbalanced locking
Denis Kirjanov be23a9
Git-commit: 57c720d4144a9c2b88105c3e8f7b0e97e4b5cc93
Denis Kirjanov be23a9
Patch-mainline: v5.9-rc1
Denis Kirjanov be23a9
References: git-fixes
Denis Kirjanov be23a9
Denis Kirjanov be23a9
Based on what fails, function can return with nfs_sync_rwlock either
Denis Kirjanov be23a9
locked or unlocked. That can not be right.
Denis Kirjanov be23a9
Denis Kirjanov be23a9
Always return with lock unlocked on error.
Denis Kirjanov be23a9
Denis Kirjanov be23a9
Fixes: 4cd9973f9ff6 ("ocfs2: avoid inode removal while nfsd is accessing it")
Denis Kirjanov be23a9
Signed-off-by: Pavel Machek (CIP) <pavel@denx.de>
Denis Kirjanov be23a9
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Denis Kirjanov be23a9
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Denis Kirjanov be23a9
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Denis Kirjanov be23a9
Cc: Mark Fasheh <mark@fasheh.com>
Denis Kirjanov be23a9
Cc: Joel Becker <jlbec@evilplan.org>
Denis Kirjanov be23a9
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Denis Kirjanov be23a9
Cc: Changwei Ge <gechangwei@live.cn>
Denis Kirjanov be23a9
Cc: Gang He <ghe@suse.com>
Denis Kirjanov be23a9
Cc: Jun Piao <piaojun@huawei.com>
Denis Kirjanov be23a9
Link: http://lkml.kernel.org/r/20200724124443.GA28164@duo.ucw.cz
Denis Kirjanov be23a9
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Denis Kirjanov be23a9
Acked-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov be23a9
---
Denis Kirjanov be23a9
 fs/ocfs2/dlmglue.c | 8 +++++++-
Denis Kirjanov be23a9
 1 file changed, 7 insertions(+), 1 deletion(-)
Denis Kirjanov be23a9
Denis Kirjanov be23a9
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
Denis Kirjanov be23a9
index 586b083e723e..9ccbf868f264 100644
Denis Kirjanov be23a9
--- a/fs/ocfs2/dlmglue.c
Denis Kirjanov be23a9
+++ b/fs/ocfs2/dlmglue.c
Denis Kirjanov be23a9
@@ -2801,9 +2801,15 @@ int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex)
Denis Kirjanov be23a9
 
Denis Kirjanov be23a9
 	status = ocfs2_cluster_lock(osb, lockres, ex ? LKM_EXMODE : LKM_PRMODE,
Denis Kirjanov be23a9
 				    0, 0);
Denis Kirjanov be23a9
-	if (status < 0)
Denis Kirjanov be23a9
+	if (status < 0) {
Denis Kirjanov be23a9
 		mlog(ML_ERROR, "lock on nfs sync lock failed %d\n", status);
Denis Kirjanov be23a9
 
Denis Kirjanov be23a9
+		if (ex)
Denis Kirjanov be23a9
+			up_write(&osb->nfs_sync_rwlock);
Denis Kirjanov be23a9
+		else
Denis Kirjanov be23a9
+			up_read(&osb->nfs_sync_rwlock);
Denis Kirjanov be23a9
+	}
Denis Kirjanov be23a9
+
Denis Kirjanov be23a9
 	return status;
Denis Kirjanov be23a9
 }
Denis Kirjanov be23a9
 
Denis Kirjanov be23a9
-- 
Denis Kirjanov be23a9
2.16.4
Denis Kirjanov be23a9