diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 16:37:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 16:37:53 -0400 |
commit | 37cd9600a9e20359b0283983c9e3a55d84347168 (patch) | |
tree | fea12ce0ecbaf417b0d835b3cbee14e973103fad /fs/xfs/xfs_trans_ail.c | |
parent | 95b18e69950ca7fd9acfa55964e929f58bec9379 (diff) | |
parent | 9a57fa8ee7c29e11c2a29ce058573ba99157eda7 (diff) |
Merge tag 'for-linus-v3.6-rc1' of git://oss.sgi.com/xfs/xfs
Pull xfs update from Ben Myers:
"Numerous cleanups and several bug fixes. Here are some highlights:
- Discontiguous directory buffer support
- Inode allocator refactoring
- Removal of the IO lock in inode reclaim
- Implementation of .update_time
- Fix for handling of EOF in xfs_vm_writepage
- Fix for races in xfsaild, and idle mode is re-enabled
- Fix for a crash in xfs_buf completion handlers on unmount."
Fix up trivial conflicts in fs/xfs/{xfs_buf.c,xfs_log.c,xfs_log_priv.h}
due to duplicate patches that had already been merged for 3.5.
* tag 'for-linus-v3.6-rc1' of git://oss.sgi.com/xfs/xfs: (44 commits)
xfs: wait for the write the superblock on unmount
xfs: re-enable xfsaild idle mode and fix associated races
xfs: remove iolock lock classes
xfs: avoid the iolock in xfs_free_eofblocks for evicted inodes
xfs: do not take the iolock in xfs_inactive
xfs: remove xfs_inactive_attrs
xfs: clean up xfs_inactive
xfs: do not read the AGI buffer in xfs_dialloc until nessecary
xfs: refactor xfs_ialloc_ag_select
xfs: add a short cut to xfs_dialloc for the non-NULL agbp case
xfs: remove the alloc_done argument to xfs_dialloc
xfs: split xfs_dialloc
xfs: remove xfs_ialloc_find_free
Prefix IO_XX flags with XFS_IO_XX to avoid namespace colision.
xfs: remove xfs_inotobp
xfs: merge xfs_itobp into xfs_imap_to_bp
xfs: handle EOF correctly in xfs_vm_writepage
xfs: implement ->update_time
xfs: fix comment typo of struct xfs_da_blkinfo.
xfs: do not call xfs_bdstrat_cb in xfs_buf_iodone_callbacks
...
Diffstat (limited to 'fs/xfs/xfs_trans_ail.c')
-rw-r--r-- | fs/xfs/xfs_trans_ail.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 9c514483e599..6011ee661339 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
@@ -383,6 +383,12 @@ xfsaild_push( | |||
383 | } | 383 | } |
384 | 384 | ||
385 | spin_lock(&ailp->xa_lock); | 385 | spin_lock(&ailp->xa_lock); |
386 | |||
387 | /* barrier matches the xa_target update in xfs_ail_push() */ | ||
388 | smp_rmb(); | ||
389 | target = ailp->xa_target; | ||
390 | ailp->xa_target_prev = target; | ||
391 | |||
386 | lip = xfs_trans_ail_cursor_first(ailp, &cur, ailp->xa_last_pushed_lsn); | 392 | lip = xfs_trans_ail_cursor_first(ailp, &cur, ailp->xa_last_pushed_lsn); |
387 | if (!lip) { | 393 | if (!lip) { |
388 | /* | 394 | /* |
@@ -397,7 +403,6 @@ xfsaild_push( | |||
397 | XFS_STATS_INC(xs_push_ail); | 403 | XFS_STATS_INC(xs_push_ail); |
398 | 404 | ||
399 | lsn = lip->li_lsn; | 405 | lsn = lip->li_lsn; |
400 | target = ailp->xa_target; | ||
401 | while ((XFS_LSN_CMP(lip->li_lsn, target) <= 0)) { | 406 | while ((XFS_LSN_CMP(lip->li_lsn, target) <= 0)) { |
402 | int lock_result; | 407 | int lock_result; |
403 | 408 | ||
@@ -527,8 +532,32 @@ xfsaild( | |||
527 | __set_current_state(TASK_KILLABLE); | 532 | __set_current_state(TASK_KILLABLE); |
528 | else | 533 | else |
529 | __set_current_state(TASK_INTERRUPTIBLE); | 534 | __set_current_state(TASK_INTERRUPTIBLE); |
530 | schedule_timeout(tout ? | 535 | |
531 | msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); | 536 | spin_lock(&ailp->xa_lock); |
537 | |||
538 | /* | ||
539 | * Idle if the AIL is empty and we are not racing with a target | ||
540 | * update. We check the AIL after we set the task to a sleep | ||
541 | * state to guarantee that we either catch an xa_target update | ||
542 | * or that a wake_up resets the state to TASK_RUNNING. | ||
543 | * Otherwise, we run the risk of sleeping indefinitely. | ||
544 | * | ||
545 | * The barrier matches the xa_target update in xfs_ail_push(). | ||
546 | */ | ||
547 | smp_rmb(); | ||
548 | if (!xfs_ail_min(ailp) && | ||
549 | ailp->xa_target == ailp->xa_target_prev) { | ||
550 | spin_unlock(&ailp->xa_lock); | ||
551 | schedule(); | ||
552 | tout = 0; | ||
553 | continue; | ||
554 | } | ||
555 | spin_unlock(&ailp->xa_lock); | ||
556 | |||
557 | if (tout) | ||
558 | schedule_timeout(msecs_to_jiffies(tout)); | ||
559 | |||
560 | __set_current_state(TASK_RUNNING); | ||
532 | 561 | ||
533 | try_to_freeze(); | 562 | try_to_freeze(); |
534 | 563 | ||