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] Unwrap pagb_lock.
2008-02-07 16:46:39 +11:00
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] Lazy Superblock Counters
2007-07-14 15:28:50 +10:00
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] Remove unused arguments from the XFS_BTREE_*_ADDR macros.
2007-02-10 18:37:33 +11:00
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] Add EA list callbacks for xfs kernel use. Cleanup some namespace
2006-09-28 11:01:37 +10:00
xfs_attr_sf.h
[XFS] endianess annotations for xfs_attr_shortform_t
2006-03-17 17:29:25 +11:00
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] endianess annotations for xfs_bmbt_key Trivial as there are no
2006-09-28 10:58:17 +10:00
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] Add parameters to xfs_bmapi() and xfs_bunmapi() to have them report
2006-06-09 14:48:12 +10:00
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] use filldir internally
2007-10-15 16:49:49 +10:00
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] Reduce shouting by removing unnecessary macros from dir2 code.
2007-07-14 15:37:02 +10:00
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] use filldir internally
2007-10-15 16:49:49 +10:00
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] Reduce shouting by removing unnecessary macros from dir2 code.
2007-07-14 15:37:02 +10:00
xfs_dir2_sf.c
[XFS] Put the correct offset in dirent d_off
2007-12-18 17:16:23 +11:00
xfs_dir2_sf.h
[XFS] use filldir internally
2007-10-15 16:49:49 +10:00
xfs_dir2_trace.c
[XFS] Remove version 1 directory code. Never functioned on Linux, just
2006-06-20 13:04:51 +10:00
xfs_dir2_trace.h
[XFS] Update license/copyright notices to match the prefered SGI
2005-11-02 14:58:39 +11:00
xfs_dmapi.h
[XFS] kill the vfs_flags member in struct bhv_vfs
2007-10-16 11:45:57 +10:00
xfs_dmops.c
[XFS] fixups after behavior removal merge into mainline git
2007-10-19 17:14:45 +10:00
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] Unwrap AIL_LOCK
2008-02-07 16:44:23 +11:00
xfs_extfree_item.h
[XFS] cleanup the field types of some item format structures
2006-09-28 10:55:43 +10:00
xfs_filestream.c
[XFS] replace remaining __FUNCTION__ occurrences
2008-04-18 11:51:26 +10:00
xfs_filestream.h
[XFS] Concurrent Multi-File Data Streams
2007-07-14 15:40:53 +10:00
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] Write log dummy record when freezing filesystem
2006-01-11 15:30:08 +11:00
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] Pick a single default inode cluster size.
2007-10-15 16:39:35 +10:00
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] Update license/copyright notices to match the prefered SGI
2005-11-02 14:58:39 +11:00
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] Update license/copyright notices to match the prefered SGI
2005-11-02 14:58:39 +11:00
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] kill unnessecary ioops indirection
2008-02-07 16:44:14 +11:00
xfs_itable.c
[XFS] kill di_mode checks after xfs_iget
2008-04-29 15:53:31 +10:00
xfs_itable.h
[XFS] Fix XFS_IOC_FSBULKSTAT{,_SINGLE} & XFS_IOC_FSINUMBERS in compat mode
2007-07-14 15:42:50 +10:00
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] Update license/copyright notices to match the prefered SGI
2005-11-02 14:58:39 +11:00
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] On-demand reaping of the MRU cache
2007-09-17 16:42:02 +10:00
xfs_qmops.c
[XFS] Unwrap XFS_SB_LOCK.
2008-02-07 16:47:15 +11:00
xfs_quota.h
[XFS] remove dependency of the quota module on behaviors
2007-10-16 11:43:26 +10:00
xfs_refcache.h
[XFS] Cleanup cosmetic differences between source trees.
2005-11-03 16:14:31 +11:00
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] Radix tree based inode caching
2007-10-15 16:50:50 +10:00
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] Remove version 1 directory code. Never functioned on Linux, just
2006-06-20 13:04:51 +10:00
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