Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 319867
b: refs/heads/master
c: 8375f92
h: refs/heads/master
i:
  319865: 5920528
  319863: fa9c61c
v: v3
  • Loading branch information
Brian Foster authored and Ben Myers committed Jul 29, 2012
1 parent 723ba5f commit 6d15557
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4f59af758f9092bc7b266ca919ce6067170e5172
refs/heads/master: 8375f922aaa6e7a880022529202fb486315568c3
35 changes: 32 additions & 3 deletions trunk/fs/xfs/xfs_trans_ail.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,12 @@ xfsaild_push(
}

spin_lock(&ailp->xa_lock);

/* barrier matches the xa_target update in xfs_ail_push() */
smp_rmb();
target = ailp->xa_target;
ailp->xa_target_prev = target;

lip = xfs_trans_ail_cursor_first(ailp, &cur, ailp->xa_last_pushed_lsn);
if (!lip) {
/*
Expand All @@ -397,7 +403,6 @@ xfsaild_push(
XFS_STATS_INC(xs_push_ail);

lsn = lip->li_lsn;
target = ailp->xa_target;
while ((XFS_LSN_CMP(lip->li_lsn, target) <= 0)) {
int lock_result;

Expand Down Expand Up @@ -527,8 +532,32 @@ xfsaild(
__set_current_state(TASK_KILLABLE);
else
__set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(tout ?
msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT);

spin_lock(&ailp->xa_lock);

/*
* Idle if the AIL is empty and we are not racing with a target
* update. We check the AIL after we set the task to a sleep
* state to guarantee that we either catch an xa_target update
* or that a wake_up resets the state to TASK_RUNNING.
* Otherwise, we run the risk of sleeping indefinitely.
*
* The barrier matches the xa_target update in xfs_ail_push().
*/
smp_rmb();
if (!xfs_ail_min(ailp) &&
ailp->xa_target == ailp->xa_target_prev) {
spin_unlock(&ailp->xa_lock);
schedule();
tout = 0;
continue;
}
spin_unlock(&ailp->xa_lock);

if (tout)
schedule_timeout(msecs_to_jiffies(tout));

__set_current_state(TASK_RUNNING);

try_to_freeze();

Expand Down
1 change: 1 addition & 0 deletions trunk/fs/xfs/xfs_trans_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ struct xfs_ail {
struct task_struct *xa_task;
struct list_head xa_ail;
xfs_lsn_t xa_target;
xfs_lsn_t xa_target_prev;
struct list_head xa_cursors;
spinlock_t xa_lock;
xfs_lsn_t xa_last_pushed_lsn;
Expand Down

0 comments on commit 6d15557

Please sign in to comment.