From: Xu Wang <xuw@redhat.com>
To: xfs@oss.sgi.com
Subject: [PATCH] xfs: lock for removing item from cil->xc_cil in xlog_cil_push
Date: Fri, 10 Oct 2014 03:31:46 -0400 (EDT) [thread overview]
Message-ID: <2090211370.42327532.1412926306812.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <929991500.42327290.1412926226461.JavaMail.zimbra@redhat.com>
From 59c6babab7c4ce8708036018143d2acc1477cc7f Mon Sep 17 00:00:00 2001
From: George Wang <xuw@redhat.com>
Date: Fri, 10 Oct 2014 15:02:14 +0800
Subject: [PATCH] [PATCH] xfs: lock for removing item from cil->xc_cil in
xlog_cil_push
There is a race condition when xlog_cil_force_lsn and xlog_cil_push for
cil->xc_cil items. When function xlog_cil_push_now called in
xlog_cil_force_lsn, and the xlog_cil_push run in workqueue just reaches the point for
setting cil->xc_current_sequence, the xlog_cil_force_lsn got the lock
and check the "sequence == cil->xc_current_sequence &&
!list_empty(&cil->xc_cil)" for restart. The statement "sequence ==
cil->xc_current_sequence" is true, but the cil->xc_cil is empty
according to the xlog_cil_push removed the items in cil->xc_cil without
lock protectionl. So the function xlog_cil_force_lsn will return
NULLCOMMITLSN, which means the cil log for current sequence will not be
submitted to disk. And if there is no more operations(for example, when
unmount fs, this situation happened in
xfs_unmountfs->xfs_log_sbcount->xfs_trans_commit), the xfs will hang up.
Signed-off-by: George Wang <xuw@redhat.com>
---
fs/xfs/xfs_log_cil.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c
index f6b79e5..97ba527 100644
--- a/fs/xfs/xfs_log_cil.c
+++ b/fs/xfs/xfs_log_cil.c
@@ -478,6 +478,8 @@ xlog_cil_push(
*/
lv = NULL;
num_iovecs = 0;
+
+ spin_lock(&cil->xc_push_lock);
while (!list_empty(&cil->xc_cil)) {
struct xfs_log_item *item;
@@ -530,7 +532,6 @@ xlog_cil_push(
* against the current sequence in log forces without risking
* deferencing a freed context pointer.
*/
- spin_lock(&cil->xc_push_lock);
cil->xc_current_sequence = new_ctx->sequence;
list_add(&ctx->committing, &cil->xc_committing);
spin_unlock(&cil->xc_push_lock);
--
1.9.3
--
George Wang 王旭
Kernel Quantity Engineer
Red Hat Software (Beijing) Co.,Ltd
IRC:xuw
Tel:+86-010-62608041
Phone:15901231579
9/F, Tower C, Raycom
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next parent reply other threads:[~2014-10-10 7:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <929991500.42327290.1412926226461.JavaMail.zimbra@redhat.com>
2014-10-10 7:31 ` Xu Wang [this message]
2014-10-10 12:07 ` [PATCH] xfs: lock for removing item from cil->xc_cil in xlog_cil_push Brian Foster
2014-10-11 4:19 ` Eric Sandeen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2090211370.42327532.1412926306812.JavaMail.zimbra@redhat.com \
--to=xuw@redhat.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox