Dave Chinner
49641f1acf
Fix reference counting race on log buffers
...
When we release the iclog, we do an atomic_dec_and_lock to determine if
we are the last reference and need to trigger update of log headers and
writeout. However, in xlog_state_get_iclog_space() we also need to
check if we have the last reference count there. If we do, we release
the log buffer, otherwise we decrement the reference count.
But the compare and decrement in xlog_state_get_iclog_space() is not
atomic, so both places can see a reference count of 2 and neither will
release the iclog. That leads to a filesystem hang.
Close the race by replacing the atomic_read() and atomic_dec() pair with
atomic_add_unless() to ensure that they are executed atomically.
Signed-off-by: Dave Chinner <david@fromorbit.com>
Reviewed-by: Tim Shimmin <tes@sgi.com>
Tested-by: Eric Sandeen <sandeen@sandeen.net>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-11 11:37:18 -07:00
..
linux-2.6
[XFS] Fix memory corruption with small buffer reads
2008-05-23 18:12:49 +10:00
quota
[XFS] shrink mrlock_t
2008-04-29 15:54:02 +10:00
support
[XFS] Include linux/random.h in all builds, not just debug builds.
2008-04-30 18:17:44 +10:00
Kconfig
[XFS] allow enabling CONFIG_XFS_DEBUG
2008-04-29 16:07:48 +10:00
Makefile
[XFS] Added quota targets and removed dmapi directory
2008-02-18 13:06:17 +11:00
xfs.h
[XFS] Fix broken HAVE_SPLICE removal commit.
2008-04-29 15:57:49 +10:00
xfs_acl.c
[XFS] Cleanup xfs_attr a bit with xfs_name and remove cred
2008-04-29 15:54:55 +10:00
xfs_acl.h
[XFS] use generic_permission
2008-02-07 18:22:38 +11:00
xfs_ag.h
xfs_alloc.c
[XFS] fix logic error in xfs_alloc_ag_vextent_near()
2008-04-18 12:03:02 +10:00
xfs_alloc.h
xfs_alloc_btree.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_alloc_btree.h
xfs_arch.h
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_attr.c
[XFS] Cleanup xfs_attr a bit with xfs_name and remove cred
2008-04-29 15:54:55 +10:00
xfs_attr.h
[XFS] Cleanup xfs_attr a bit with xfs_name and remove cred
2008-04-29 15:54:55 +10:00
xfs_attr_leaf.c
[XFS] Always use di_forkoff when checking for attr space.
2008-04-18 12:03:40 +10:00
xfs_attr_leaf.h
xfs_attr_sf.h
xfs_bit.c
[XFS] Undo bit ops cleanup mod due to regression on 32-bit powermac
2008-02-26 17:05:44 +11:00
xfs_bit.h
[XFS] Undo bit ops cleanup mod due to regression on 32-bit powermac
2008-02-26 17:05:44 +11:00
xfs_bmap.c
[XFS] shrink mrlock_t
2008-04-29 15:54:02 +10:00
xfs_bmap.h
[XFS] replace remaining __FUNCTION__ occurrences
2008-04-18 11:51:26 +10:00
xfs_bmap_btree.c
[XFS] replace remaining __FUNCTION__ occurrences
2008-04-18 11:51:26 +10:00
xfs_bmap_btree.h
[XFS] remove shouting-indirection macros from xfs_sb.h
2008-04-10 16:24:45 +10:00
xfs_btree.c
xfs_btree.h
[XFS] Fix up sparse warnings.
2008-02-07 18:14:38 +11:00
xfs_buf_item.c
[XFS] Ensure xfs_bawrite() errors are checked.
2008-04-18 12:00:35 +10:00
xfs_buf_item.h
[XFS] Fix up sparse warnings.
2008-02-07 18:14:38 +11:00
xfs_clnt.h
[XFS] If you mount an XFS filesystem with no mount options at all, then
2008-02-28 20:37:56 -08:00
xfs_da_btree.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_da_btree.h
[XFS] Fix up sparse warnings.
2008-02-07 18:14:38 +11:00
xfs_dfrag.c
[XFS] remove manual lookup from xfs_rename and simplify locking
2008-04-29 15:54:12 +10:00
xfs_dfrag.h
xfs_dinode.h
[XFS] Remove CFORK macros and use code directly in IFORK and DFORK macros.
2008-02-07 18:19:24 +11:00
xfs_dir2.c
[XFS] remove bhv_vname_t and xfs_rename code
2008-04-18 12:00:12 +10:00
xfs_dir2.h
[XFS] remove bhv_vname_t and xfs_rename code
2008-04-18 12:00:12 +10:00
xfs_dir2_block.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_dir2_block.h
xfs_dir2_data.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_dir2_data.h
xfs_dir2_leaf.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_dir2_leaf.h
xfs_dir2_node.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_dir2_node.h
xfs_dir2_sf.c
xfs_dir2_sf.h
xfs_dir2_trace.c
xfs_dir2_trace.h
xfs_dmapi.h
xfs_dmops.c
xfs_error.c
[XFS] lose xfs_hex_dump in favor of print_hex_dump
2008-02-07 18:13:05 +11:00
xfs_error.h
[XFS] lose xfs_hex_dump in favor of print_hex_dump
2008-02-07 18:13:05 +11:00
xfs_extfree_item.c
xfs_extfree_item.h
xfs_filestream.c
[XFS] replace remaining __FUNCTION__ occurrences
2008-04-18 11:51:26 +10:00
xfs_filestream.h
xfs_fs.h
[XFS] fix 32-bit compat ioctls for GETXFLAGS, SETXFLAGS, GETVERSION
2008-02-07 18:13:17 +11:00
xfs_fsops.c
[XFS] Don't double count reserved block changes on UP.
2008-04-29 15:58:27 +10:00
xfs_fsops.h
xfs_ialloc.c
[XFS] Don't initialise new inode generation numbers to zero
2008-04-29 15:58:56 +10:00
xfs_ialloc.h
xfs_ialloc_btree.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_ialloc_btree.h
[XFS] kill XFS_INOBT_IS_FREE_DISK
2008-02-07 18:12:41 +11:00
xfs_iget.c
[XFS] shrink mrlock_t
2008-04-29 15:54:02 +10:00
xfs_imap.h
xfs_inode.c
[XFS] Fix inode list allocation size in writeback.
2008-05-23 15:26:15 +10:00
xfs_inode.h
[XFS] remove manual lookup from xfs_rename and simplify locking
2008-04-29 15:54:12 +10:00
xfs_inode_item.c
[XFS] shrink mrlock_t
2008-04-29 15:54:02 +10:00
xfs_inode_item.h
[XFS] Use xfs_inode_clean() in more places
2008-04-18 11:37:51 +10:00
xfs_inum.h
xfs_iomap.c
[XFS] Fix check for block zero access in xfs_write_iomap_allocate()
2008-04-29 15:58:40 +10:00
xfs_iomap.h
xfs_itable.c
[XFS] kill di_mode checks after xfs_iget
2008-04-29 15:53:31 +10:00
xfs_itable.h
xfs_log.c
Fix reference counting race on log buffers
2008-07-11 11:37:18 -07:00
xfs_log.h
[XFS] Sanitise xfs_log_force error checking.
2008-04-18 12:02:20 +10:00
xfs_log_priv.h
[XFS] Reorganise xlog_t for better cacheline isolation of contention
2008-04-18 11:50:53 +10:00
xfs_log_recover.c
[XFS] Check for errors when changing buffer pointers.
2008-04-18 12:02:10 +10:00
xfs_log_recover.h
xfs_mount.c
[XFS] kill XFS_ICSB_SB_LOCKED
2008-04-29 15:57:38 +10:00
xfs_mount.h
[XFS] fix non-smp xfs build
2008-04-29 15:58:00 +10:00
xfs_mru_cache.c
[XFS] Fix up sparse warnings.
2008-02-07 18:14:38 +11:00
xfs_mru_cache.h
xfs_qmops.c
xfs_quota.h
xfs_refcache.h
xfs_rename.c
[XFS] kill usesless IHOLD calls in xfs_rename
2008-04-29 15:54:24 +10:00
xfs_rtalloc.c
[XFS] Propagate errors from xfs_trans_commit().
2008-04-18 11:58:17 +10:00
xfs_rtalloc.h
[XFS] optimize XFS_IS_REALTIME_INODE w/o realtime config
2008-02-07 18:16:43 +11:00
xfs_rw.c
[XFS] Sanitise xfs_log_force error checking.
2008-04-18 12:02:20 +10:00
xfs_rw.h
[XFS] optimize XFS_IS_REALTIME_INODE w/o realtime config
2008-02-07 18:16:43 +11:00
xfs_sb.h
[XFS] Ensure "both" features2 slots are consistent
2008-04-10 16:25:26 +10:00
xfs_trans.c
xfs: convert beX_add to beX_add_cpu (new common API)
2008-02-13 16:21:19 -08:00
xfs_trans.h
[XFS] Replace custom AIL linked-list code with struct list_head
2008-04-18 11:41:57 +10:00
xfs_trans_ail.c
[XFS] replace remaining __FUNCTION__ occurrences
2008-04-18 11:51:26 +10:00
xfs_trans_buf.c
[XFS] Ensure errors from xfs_bdstrat() are correctly checked.
2008-04-18 12:00:24 +10:00
xfs_trans_extfree.c
xfs_trans_inode.c
[XFS] shrink mrlock_t
2008-04-29 15:54:02 +10:00
xfs_trans_item.c
[XFS] Fix up sparse warnings.
2008-02-07 18:14:38 +11:00
xfs_trans_priv.h
[XFS] Move AIL pushing into it's own thread
2008-02-07 18:22:51 +11:00
xfs_trans_space.h
xfs_types.h
[XFS] remove bhv_vname_t and xfs_rename code
2008-04-18 12:00:12 +10:00
xfs_utils.c
[XFS] remove manual lookup from xfs_rename and simplify locking
2008-04-29 15:54:12 +10:00
xfs_utils.h
[XFS] remove manual lookup from xfs_rename and simplify locking
2008-04-29 15:54:12 +10:00
xfs_vfsops.c
[XFS] remove xfs_log_ticket_zone on rmmod
2008-04-29 15:58:14 +10:00
xfs_vfsops.h
[XFS] kill xfs_root
2008-02-07 18:24:00 +11:00
xfs_vnodeops.c
[XFS] Fix fsync() b0rkage.
2008-05-23 15:25:25 +10:00
xfs_vnodeops.h
[XFS] Fix fsync() b0rkage.
2008-05-23 15:25:25 +10:00