Dave Chinner
d69043c42d
xfs: drop buffer io reference when a bad bio is built
...
Error handling in xfs_buf_ioapply_map() does not handle IO reference
counts correctly. We increment the b_io_remaining count before
building the bio, but then fail to decrement it in the failure case.
This leads to the buffer never running IO completion and releasing
the reference that the IO holds, so at unmount we can leak the
buffer. This leak is captured by this assert failure during unmount:
XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0, file: fs/xfs/xfs_mount.c, line: 273
This is not a new bug - the b_io_remaining accounting has had this
problem for a long, long time - it's just very hard to get a
zero length bio being built by this code...
Further, the buffer IO error can be overwritten on a multi-segment
buffer by subsequent bio completions for partial sections of the
buffer. Hence we should only set the buffer error status if the
buffer is not already carrying an error status. This ensures that a
partial IO error on a multi-segment buffer will not be lost. This
part of the problem is a regression, however.
cc: <[email protected] >
Signed-off-by: Dave Chinner <[email protected] >
Reviewed-by: Mark Tinguely <[email protected] >
Signed-off-by: Ben Myers <[email protected] >
2012-11-17 09:36:57 -06:00
..
Kconfig
kmem.c
xfs: switch to proper __bitwise type for KM_... flags
2012-05-29 23:28:32 -04:00
kmem.h
xfs: switch to proper __bitwise type for KM_... flags
2012-05-29 23:28:32 -04:00
Makefile
xfs: move xfs_do_force_shutdown() and kill xfs_rw.c
2012-05-14 16:20:59 -05:00
mrlock.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
time.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
uuid.c
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
uuid.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs.h
xfs: don't expect xfs headers to be in subdirectories
2011-08-12 13:57:55 -05:00
xfs_acl.c
userns: Pass a userns parameter into posix_acl_to_xattr and posix_acl_from_xattr
2012-09-18 01:01:35 -07:00
xfs_acl.h
xfs: Fix build breakage in xfs_iops.c when CONFIG_FS_POSIX_ACL is not set
2011-08-01 02:35:04 -04:00
xfs_ag.h
xfs: move busy extent handling to it's own file
2012-05-14 16:20:55 -05:00
xfs_alloc.c
xfs: move allocation stack switch up to xfs_bmapi_allocate
2012-11-08 11:08:46 -06:00
xfs_alloc.h
xfs: move allocation stack switch up to xfs_bmapi_allocate
2012-11-08 11:08:46 -06:00
xfs_alloc_btree.c
xfs: invalidate allocbt blocks moved to the free list
2012-11-08 11:09:44 -06:00
xfs_alloc_btree.h
xfs: struct xfs_buf_log_format isn't variable sized.
2012-07-01 14:50:04 -05:00
xfs_aops.c
xfs: fix broken error handling in xfs_vm_writepage
2012-11-17 09:35:42 -06:00
xfs_aops.h
Prefix IO_XX flags with XFS_IO_XX to avoid namespace colision.
2012-07-22 11:00:55 -05:00
xfs_attr.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_attr.h
xfs_attr_leaf.c
xfs: fix attr tree double split corruption
2012-11-17 09:34:13 -06:00
xfs_attr_leaf.h
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_attr_sf.h
xfs_bit.c
xfs_bit.h
xfs_bmap.c
xfs: move allocation stack switch up to xfs_bmapi_allocate
2012-11-08 11:08:46 -06:00
xfs_bmap.h
xfs: move allocation stack switch up to xfs_bmapi_allocate
2012-11-08 11:08:46 -06:00
xfs_bmap_btree.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_bmap_btree.h
xfs_btree.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_btree.h
xfs: Remove the macro XFS_BUF_PTR
2011-07-25 15:03:13 -05:00
xfs_buf.c
xfs: drop buffer io reference when a bad bio is built
2012-11-17 09:36:57 -06:00
xfs_buf.h
xfs: fix race while discarding buffers [V4]
2012-08-29 15:01:11 -05:00
xfs_buf_item.c
xfs: fix buffer shudown reference count mismatch
2012-11-08 11:10:35 -06:00
xfs_buf_item.h
xfs: support discontiguous buffers in the xfs_buf_log_item
2012-07-01 14:50:06 -05:00
xfs_da_btree.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_da_btree.h
xfs: fix comment typo of struct xfs_da_blkinfo.
2012-07-22 10:34:42 -05:00
xfs_dfrag.c
switch simple cases of fget_light to fdget
2012-09-26 22:20:08 -04:00
xfs_dfrag.h
xfs_dinode.h
xfs: fix typo in comment of xfs_dinode_t.
2012-06-14 12:28:26 -05:00
xfs_dir2.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_dir2.h
xfs: reshuffle dir2 headers
2011-07-13 13:43:48 +02:00
xfs_dir2_block.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_dir2_data.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_dir2_format.h
xfs: cleanup struct xfs_dir2_free
2011-07-13 13:43:48 +02:00
xfs_dir2_leaf.c
xfs: factor buffer reading from xfs_dir2_leaf_getdents
2012-07-01 14:50:08 -05:00
xfs_dir2_node.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_dir2_priv.h
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_dir2_sf.c
xfs: remove struct xfs_dabuf and infrastructure
2012-07-01 14:50:07 -05:00
xfs_discard.c
xfs: check for possible overflow in xfs_ioc_trim
2012-08-23 14:48:44 -05:00
xfs_discard.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_dquot.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_dquot.h
xfs: on-stack delayed write buffer lists
2012-05-14 16:20:31 -05:00
xfs_dquot_item.c
xfs: clean up xfs_bit.h includes
2012-05-14 16:21:00 -05:00
xfs_dquot_item.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_error.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_error.h
xfs: kill support/debug.[ch]
2011-03-07 10:09:35 +11:00
xfs_export.c
tmpfs,ceph,gfs2,isofs,reiserfs,xfs: fix fh_len checking
2012-10-09 23:33:55 -04:00
xfs_export.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_extent_busy.c
xfs: make xfs_extent_busy_trim not static
2012-05-14 16:21:04 -05:00
xfs_extent_busy.h
xfs: make xfs_extent_busy_trim not static
2012-05-14 16:21:04 -05:00
xfs_extfree_item.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_extfree_item.h
xfs: Pull EFI/EFD handling out from under the AIL lock
2010-12-20 11:59:49 +11:00
xfs_file.c
mm: kill vma flag VM_CAN_NONLINEAR
2012-10-09 16:22:17 +09:00
xfs_filestream.c
xfs: rename allocation range fields in struct xfs_bmalloca
2011-10-11 21:15:06 -05:00
xfs_filestream.h
xfs_fs.h
xfs: consolidate & clarify mount sanity checks
2011-07-08 11:32:51 -05:00
xfs_fs_subr.c
xfs: remove the i_size field in struct xfs_inode
2012-01-17 15:08:53 -06:00
xfs_fsops.c
xfs: growfs: don't read garbage for new secondary superblocks
2012-11-08 11:08:57 -06:00
xfs_fsops.h
xfs: ensure log covering transactions are synchronous
2011-01-11 20:28:17 -06:00
xfs_globals.c
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_ialloc.c
xfs: zero allocation_args on the kernel stack
2012-11-08 11:08:10 -06:00
xfs_ialloc.h
xfs: remove the alloc_done argument to xfs_dialloc
2012-07-29 16:00:31 -05:00
xfs_ialloc_btree.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_ialloc_btree.h
xfs_iget.c
xfs: remove iolock lock classes
2012-07-29 16:23:51 -05:00
xfs_inode.c
xfs: don't vmap inode cluster buffers during free
2012-11-08 11:10:18 -06:00
xfs_inode.h
xfs: remove iolock lock classes
2012-07-29 16:23:51 -05:00
xfs_inode_item.c
xfs: check for stale inode before acquiring iflock on push
2012-06-21 14:20:06 -05:00
xfs_inode_item.h
xfs: pass shutdown method into xfs_trans_ail_delete_bulk
2012-05-14 16:20:33 -05:00
xfs_inum.h
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_ioctl.c
xfs: silence uninitialised f.file warning.
2012-11-08 11:09:17 -06:00
xfs_ioctl.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_ioctl32.c
xfs: Convert to new freezing code
2012-07-31 09:45:48 +04:00
xfs_ioctl32.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_iomap.c
xfs: introduce XFS_BMAPI_STACK_SWITCH
2012-11-08 11:08:27 -06:00
xfs_iomap.h
xfs: kill xfs_iomap
2010-12-16 16:05:51 -06:00
xfs_iops.c
xfs: update for 3.6-rc1
2012-07-30 13:37:53 -07:00
xfs_iops.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_itable.c
xfs: merge xfs_itobp into xfs_imap_to_bp
2012-07-22 10:46:56 -05:00
xfs_itable.h
xfs_linux.h
xfs: revert to using a kthread for AIL pushing
2011-10-11 11:02:49 -05:00
xfs_log.c
xfs: only update the last_sync_lsn when a transaction completes
2012-11-08 11:07:38 -06:00
xfs_log.h
xfs: allow assigning the tail lsn with the AIL lock held
2012-05-14 16:20:26 -05:00
xfs_log_cil.c
xfs: rename log structure to xlog
2012-06-21 14:21:11 -05:00
xfs_log_priv.h
xfs: remove xlog_t typedef
2012-06-21 14:22:27 -05:00
xfs_log_recover.c
xfs: fix reading of wrapped log data
2012-11-08 11:10:51 -06:00
xfs_log_recover.h
xfs_message.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_message.h
treewide: use __printf not __attribute__((format(printf,...)))
2011-10-31 17:30:54 -07:00
xfs_mount.c
xfs: reduce code duplication handling inode32/64 options
2012-09-26 15:56:33 -05:00
xfs_mount.h
xfs: kill struct declarations in xfs_mount.h
2012-08-16 13:29:35 -05:00
xfs_mru_cache.c
xfs: convert to alloc_workqueue()
2011-02-01 11:42:43 +01:00
xfs_mru_cache.h
xfs_qm.c
xfs: make largest supported offset less shouty
2012-06-14 12:28:24 -05:00
xfs_qm.h
xfs: remove the global xfs_Gqm structure
2012-03-14 12:06:32 -05:00
xfs_qm_bhv.c
xfs: clean up xfs_bit.h includes
2012-05-14 16:21:00 -05:00
xfs_qm_syscalls.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_quota.h
Define new macro XFS_ALL_QUOTA_ACTIVE and simply some usage
2012-02-03 11:32:20 -06:00
xfs_quota_priv.h
xfs: use per-filesystem radix trees for dquot lookup
2012-03-14 11:09:06 -05:00
xfs_quotaops.c
userns: Convert qutoactl
2012-09-18 01:01:39 -07:00
xfs_rename.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_rtalloc.c
xfs: fix uninitialised variable in xfs_rtbuf_get()
2012-08-23 14:48:16 -05:00
xfs_rtalloc.h
xfs: Remove the macro XFS_BUF_PTR
2011-07-25 15:03:13 -05:00
xfs_sb.h
xfs: kill the unused XFS_BB_FSB_OFFSET macro
2012-02-02 17:08:04 -06:00
xfs_stats.c
xfs: use common code for quota statistics
2012-03-14 11:09:06 -05:00
xfs_stats.h
xfs: use common code for quota statistics
2012-03-14 11:09:06 -05:00
xfs_super.c
xfs: update for 3.7-rc1
2012-10-02 20:42:58 -07:00
xfs_super.h
xfs: reduce code duplication handling inode32/64 options
2012-09-26 15:56:33 -05:00
xfs_sync.c
workqueue: deprecate flush[_delayed]_work_sync()
2012-08-20 14:51:24 -07:00
xfs_sync.h
xfs: log timestamp updates
2012-03-13 17:01:15 -05:00
xfs_sysctl.c
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_sysctl.h
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00
xfs_trace.c
xfs: clean up xfs_bit.h includes
2012-05-14 16:21:00 -05:00
xfs_trace.h
xfs: kill struct declarations in xfs_mount.h
2012-08-16 13:29:35 -05:00
xfs_trans.c
xfs: Convert to new freezing code
2012-07-31 09:45:48 +04:00
xfs_trans.h
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2012-08-01 10:26:23 -07:00
xfs_trans_ail.c
xfs: re-enable xfsaild idle mode and fix associated races
2012-07-29 16:27:57 -05:00
xfs_trans_buf.c
xfs: add discontiguous buffer support to transactions
2012-07-01 14:50:06 -05:00
xfs_trans_dquot.c
userns: Convert quota netlink aka quota_send_warning
2012-09-18 01:01:40 -07:00
xfs_trans_extfree.c
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_trans_inode.c
xfs: clean up xfs_bit.h includes
2012-05-14 16:21:00 -05:00
xfs_trans_priv.h
xfs: re-enable xfsaild idle mode and fix associated races
2012-07-29 16:27:57 -05:00
xfs_trans_space.h
xfs_types.h
xfs: struct xfs_buf_log_format isn't variable sized.
2012-07-01 14:50:04 -05:00
xfs_utils.c
xfs: remove the alloc_done argument to xfs_dialloc
2012-07-29 16:00:31 -05:00
xfs_utils.h
xfs: propagate umode_t
2012-01-03 22:55:00 -05:00
xfs_vnode.h
xfs: remove remaining scraps of struct xfs_iomap
2012-03-15 13:40:16 -05:00
xfs_vnodeops.c
xfs: avoid the iolock in xfs_free_eofblocks for evicted inodes
2012-07-29 16:22:20 -05:00
xfs_vnodeops.h
xfs: remove remaining scraps of struct xfs_iomap
2012-03-15 13:40:16 -05:00
xfs_xattr.c
xfs: remove subdirectories
2011-08-12 16:21:35 -05:00