From: Carlos Maiolino <cmaiolino@redhat.com>
To: linux-xfs@vger.kernel.org
Subject: [PATCH] [WIP] Propagate error state from buffers to the objects attached
Date: Thu, 12 Jan 2017 15:22:09 +0100 [thread overview]
Message-ID: <20170112142209.23458-1-cmaiolino@redhat.com> (raw)
Hi folks,
this is a new version of my possible fix to the error propagation model plus the
fix to the locked AIL items, both things are merged together since I'm using the
fix to the locked items to test the error propagation model, I'll split them
between different patches and also include dquot fixes when we agree that I'm on
the right path.
This new version adds Brian's suggestion to use a new flag for the xfs_log_item
instead of a callback. and uses the flag into xfs_inode_item_push, to resubmit
the buffer or not.
Also, the logic about when to set the flag has been moved into
xfs_buf_iodone_callback_error, so we only check that after the last buffer
resubmission.
Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
---
fs/xfs/xfs_buf_item.c | 6 ++++++
fs/xfs/xfs_inode_item.c | 33 +++++++++++++++++++++++++++++++--
fs/xfs/xfs_trans.h | 4 +++-
3 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 2975cb2..16896d5 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -1123,6 +1123,12 @@ xfs_buf_iodone_callback_error(
/* still a transient error, higher layers will retry */
xfs_buf_ioerror(bp, 0);
xfs_buf_relse(bp);
+
+ /*
+ * Notify log item that the buffer has been failed so it can be retried
+ * later if needed
+ */
+ lip->li_flags |= XFS_LI_FAILED;
return true;
/*
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
index d90e781..308aa27 100644
--- a/fs/xfs/xfs_inode_item.c
+++ b/fs/xfs/xfs_inode_item.c
@@ -517,8 +517,37 @@ xfs_inode_item_push(
* the AIL.
*/
if (!xfs_iflock_nowait(ip)) {
- rval = XFS_ITEM_FLUSHING;
- goto out_unlock;
+ int error;
+ struct xfs_dinode *dip;
+
+ /* Buffer carrying this item has been failed, we must resubmit
+ * the buffer or the item will be locked forever
+ */
+ if (lip->li_flags & XFS_LI_FAILED) {
+ printk("#### ITEM BUFFER FAILED PREVIOUSLY, inode: %llu\n",
+ ip->i_ino);
+ error = xfs_imap_to_bp(ip->i_mount, NULL, &ip->i_imap,
+ &dip, &bp, XBF_TRYLOCK, 0);
+
+ if (error) {
+ rval = XFS_ITEM_FLUSHING;
+ goto out_unlock;
+ }
+
+ if (!(bp->b_flags & XBF_WRITE_FAIL)) {
+ rval = XFS_ITEM_FLUSHING;
+ xfs_buf_relse(bp);
+ goto out_unlock;
+ }
+
+ if (!xfs_buf_delwri_queue(bp, buffer_list)) {
+ printk("#### QUEUEING AGAIN\n");
+ rval = XFS_ITEM_FLUSHING;
+ }
+
+ xfs_buf_relse(bp);
+ goto out_unlock;
+ }
}
ASSERT(iip->ili_fields != 0 || XFS_FORCED_SHUTDOWN(ip->i_mount));
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
index 61b7fbd..d62d174 100644
--- a/fs/xfs/xfs_trans.h
+++ b/fs/xfs/xfs_trans.h
@@ -66,10 +66,12 @@ typedef struct xfs_log_item {
#define XFS_LI_IN_AIL 0x1
#define XFS_LI_ABORTED 0x2
+#define XFS_LI_FAILED 0x3
#define XFS_LI_FLAGS \
{ XFS_LI_IN_AIL, "IN_AIL" }, \
- { XFS_LI_ABORTED, "ABORTED" }
+ { XFS_LI_ABORTED, "ABORTED"}, \
+ { XFS_LI_FAILED, "FAILED" }
struct xfs_item_ops {
void (*iop_size)(xfs_log_item_t *, int *, int *);
--
2.9.3
next reply other threads:[~2017-01-12 14:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-12 14:22 Carlos Maiolino [this message]
2017-01-12 15:38 ` [PATCH] [WIP] Propagate error state from buffers to the objects attached Brian Foster
2017-02-21 9:30 ` Carlos Maiolino
2017-02-21 13:25 ` Brian Foster
2017-02-23 22:42 ` Dave Chinner
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=20170112142209.23458-1-cmaiolino@redhat.com \
--to=cmaiolino@redhat.com \
--cc=linux-xfs@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).