2018-06-06 10:42:14 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
2005-11-02 11:58:39 +08:00
|
|
|
* Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
|
|
|
|
* All Rights Reserved.
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
|
|
|
#ifndef __XFS_BUF_ITEM_H__
|
|
|
|
#define __XFS_BUF_ITEM_H__
|
|
|
|
|
2013-08-12 18:49:24 +08:00
|
|
|
/* kernel only definitions */
|
2012-06-22 16:50:07 +08:00
|
|
|
|
2013-08-12 18:49:24 +08:00
|
|
|
/* buf log item flags */
|
2005-04-17 06:20:36 +08:00
|
|
|
#define XFS_BLI_HOLD 0x01
|
|
|
|
#define XFS_BLI_DIRTY 0x02
|
|
|
|
#define XFS_BLI_STALE 0x04
|
|
|
|
#define XFS_BLI_LOGGED 0x08
|
|
|
|
#define XFS_BLI_INODE_ALLOC_BUF 0x10
|
|
|
|
#define XFS_BLI_STALE_INODE 0x20
|
2010-05-20 21:19:42 +08:00
|
|
|
#define XFS_BLI_INODE_BUF 0x40
|
2013-06-27 14:04:52 +08:00
|
|
|
#define XFS_BLI_ORDERED 0x80
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-12-15 07:14:59 +08:00
|
|
|
#define XFS_BLI_FLAGS \
|
|
|
|
{ XFS_BLI_HOLD, "HOLD" }, \
|
|
|
|
{ XFS_BLI_DIRTY, "DIRTY" }, \
|
|
|
|
{ XFS_BLI_STALE, "STALE" }, \
|
|
|
|
{ XFS_BLI_LOGGED, "LOGGED" }, \
|
|
|
|
{ XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \
|
2010-05-20 21:19:42 +08:00
|
|
|
{ XFS_BLI_STALE_INODE, "STALE_INODE" }, \
|
2013-06-27 14:04:52 +08:00
|
|
|
{ XFS_BLI_INODE_BUF, "INODE_BUF" }, \
|
|
|
|
{ XFS_BLI_ORDERED, "ORDERED" }
|
2009-12-15 07:14:59 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
struct xfs_buf;
|
|
|
|
struct xfs_mount;
|
|
|
|
struct xfs_buf_log_item;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This is the in core log item structure used to track information
|
|
|
|
* needed to log buffers. It tracks how many times the lock has been
|
|
|
|
* locked, and which 128 byte chunks of the buffer are dirty.
|
|
|
|
*/
|
2018-01-25 05:38:48 +08:00
|
|
|
struct xfs_buf_log_item {
|
2005-04-17 06:20:36 +08:00
|
|
|
xfs_log_item_t bli_item; /* common item structure */
|
|
|
|
struct xfs_buf *bli_buf; /* real buffer pointer */
|
|
|
|
unsigned int bli_flags; /* misc flags */
|
|
|
|
unsigned int bli_recur; /* lock recursion count */
|
|
|
|
atomic_t bli_refcount; /* cnt of tp refs */
|
2012-06-22 16:50:12 +08:00
|
|
|
int bli_format_count; /* count of headers */
|
|
|
|
struct xfs_buf_log_format *bli_formats; /* array of in-log header ptrs */
|
2012-12-05 07:18:03 +08:00
|
|
|
struct xfs_buf_log_format __bli_format; /* embedded in-log header */
|
2018-01-25 05:38:48 +08:00
|
|
|
};
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2015-08-25 08:05:13 +08:00
|
|
|
int xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *);
|
2005-04-17 06:20:36 +08:00
|
|
|
void xfs_buf_item_relse(struct xfs_buf *);
|
2018-01-25 05:38:48 +08:00
|
|
|
void xfs_buf_item_log(struct xfs_buf_log_item *, uint, uint);
|
2017-08-30 01:08:37 +08:00
|
|
|
bool xfs_buf_item_dirty_format(struct xfs_buf_log_item *);
|
2005-04-17 06:20:36 +08:00
|
|
|
void xfs_buf_attach_iodone(struct xfs_buf *,
|
|
|
|
void(*)(struct xfs_buf *, xfs_log_item_t *),
|
|
|
|
xfs_log_item_t *);
|
|
|
|
void xfs_buf_iodone_callbacks(struct xfs_buf *);
|
2010-06-23 16:11:15 +08:00
|
|
|
void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *);
|
xfs: Properly retry failed inode items in case of error during buffer writeback
When a buffer has been failed during writeback, the inode items into it
are kept flush locked, and are never resubmitted due the flush lock, so,
if any buffer fails to be written, the items in AIL are never written to
disk and never unlocked.
This causes unmount operation to hang due these items flush locked in AIL,
but this also causes the items in AIL to never be written back, even when
the IO device comes back to normal.
I've been testing this patch with a DM-thin device, creating a
filesystem larger than the real device.
When writing enough data to fill the DM-thin device, XFS receives ENOSPC
errors from the device, and keep spinning on xfsaild (when 'retry
forever' configuration is set).
At this point, the filesystem can not be unmounted because of the flush locked
items in AIL, but worse, the items in AIL are never retried at all
(once xfs_inode_item_push() will skip the items that are flush locked),
even if the underlying DM-thin device is expanded to the proper size.
This patch fixes both cases, retrying any item that has been failed
previously, using the infra-structure provided by the previous patch.
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2017-08-09 09:21:50 +08:00
|
|
|
bool xfs_buf_resubmit_failed_buffers(struct xfs_buf *,
|
|
|
|
struct list_head *);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2013-08-12 18:49:24 +08:00
|
|
|
extern kmem_zone_t *xfs_buf_item_zone;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#endif /* __XFS_BUF_ITEM_H__ */
|