From: Brian Foster <bfoster@redhat.com>
To: Xu Wang <xuw@redhat.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH] xfs: lock for removing item from cil->xc_cil in xlog_cil_push
Date: Fri, 10 Oct 2014 08:07:54 -0400 [thread overview]
Message-ID: <20141010120754.GB18297@bfoster.bfoster> (raw)
In-Reply-To: <2090211370.42327532.1412926306812.JavaMail.zimbra@redhat.com>
On Fri, Oct 10, 2014 at 03:31:46AM -0400, Xu Wang wrote:
> 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>
> ---
Isn't this fixed by the following commit?
8af3dcd3 xfs: xlog_cil_force_lsn doesn't always wait correctly
With that patch, xlog_cil_push() adds the ctx to the committing list
before draining the ctx and updating the current sequence number.
xlog_cil_force_lsn() walks the committing list and checks the sequence
number and ctx list, all under the push lock.
That means that xlog_cil_force_lsn() should see the ctx either on the
committing list and wait for it (commit_lsn != NULL), or not on the
committing list at all. If it's not on the committing list yet,
xlog_cil_push() won't have either drained the ctx or updated the
sequence number, as it adds to the committing list first and that
requires the push lock (which xlog_cil_force_lsn() holds and doesn't
release until after the restart check).
Am I missing something? Do you reproduce a problem with the latest tree
that includes the above patch?
Brian
> 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
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2014-10-10 12:08 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 ` [PATCH] xfs: lock for removing item from cil->xc_cil in xlog_cil_push Xu Wang
2014-10-10 12:07 ` Brian Foster [this message]
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=20141010120754.GB18297@bfoster.bfoster \
--to=bfoster@redhat.com \
--cc=xfs@oss.sgi.com \
--cc=xuw@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.