diff options
| author | Jan Kara <jack@suse.cz> | 2012-05-03 08:47:58 -0400 |
|---|---|---|
| committer | Fengguang Wu <fengguang.wu@intel.com> | 2012-05-06 01:43:39 -0400 |
| commit | ccb26b5a65867839d95156e02ea4861f64a8cbf3 (patch) | |
| tree | 36ee626d4525171d6a8bb2e4582bd9e0a811bb2d | |
| parent | 6290be1c1dc6589eeda213aa40946b27fa4faac8 (diff) | |
writeback: Separate inode requeueing after writeback
Move inode requeueing after inode has been written out into a separate
function.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
| -rw-r--r-- | fs/fs-writeback.c | 102 |
1 files changed, 55 insertions, 47 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 3804a10f2be7..5d3de002cb8e 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -345,6 +345,60 @@ static void inode_wait_for_writeback(struct inode *inode, | |||
| 345 | } | 345 | } |
| 346 | 346 | ||
| 347 | /* | 347 | /* |
| 348 | * Find proper writeback list for the inode depending on its current state and | ||
| 349 | * possibly also change of its state while we were doing writeback. Here we | ||
| 350 | * handle things such as livelock prevention or fairness of writeback among | ||
| 351 | * inodes. This function can be called only by flusher thread - noone else | ||
| 352 | * processes all inodes in writeback lists and requeueing inodes behind flusher | ||
| 353 | * thread's back can have unexpected consequences. | ||
| 354 | */ | ||
| 355 | static void requeue_inode(struct inode *inode, struct bdi_writeback *wb, | ||
| 356 | struct writeback_control *wbc) | ||
| 357 | { | ||
| 358 | if (inode->i_state & I_FREEING) | ||
| 359 | return; | ||
| 360 | |||
| 361 | /* | ||
| 362 | * Sync livelock prevention. Each inode is tagged and synced in one | ||
| 363 | * shot. If still dirty, it will be redirty_tail()'ed below. Update | ||
| 364 | * the dirty time to prevent enqueue and sync it again. | ||
| 365 | */ | ||
| 366 | if ((inode->i_state & I_DIRTY) && | ||
| 367 | (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)) | ||
| 368 | inode->dirtied_when = jiffies; | ||
| 369 | |||
| 370 | if (mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) { | ||
| 371 | /* | ||
| 372 | * We didn't write back all the pages. nfs_writepages() | ||
| 373 | * sometimes bales out without doing anything. | ||
| 374 | */ | ||
| 375 | if (wbc->nr_to_write <= 0) { | ||
| 376 | /* Slice used up. Queue for next turn. */ | ||
| 377 | requeue_io(inode, wb); | ||
| 378 | } else { | ||
| 379 | /* | ||
| 380 | * Writeback blocked by something other than | ||
| 381 | * congestion. Delay the inode for some time to | ||
| 382 | * avoid spinning on the CPU (100% iowait) | ||
| 383 | * retrying writeback of the dirty page/inode | ||
| 384 | * that cannot be performed immediately. | ||
| 385 | */ | ||
| 386 | redirty_tail(inode, wb); | ||
| 387 | } | ||
| 388 | } else if (inode->i_state & I_DIRTY) { | ||
| 389 | /* | ||
| 390 | * Filesystems can dirty the inode during writeback operations, | ||
| 391 | * such as delayed allocation during submission or metadata | ||
| 392 | * updates after data IO completion. | ||
| 393 | */ | ||
| 394 | redirty_tail(inode, wb); | ||
| 395 | } else { | ||
| 396 | /* The inode is clean. Remove from writeback lists. */ | ||
| 397 | list_del_init(&inode->i_wb_list); | ||
| 398 | } | ||
| 399 | } | ||
| 400 | |||
| 401 | /* | ||
| 348 | * Write out an inode's dirty pages. Called under wb->list_lock and | 402 | * Write out an inode's dirty pages. Called under wb->list_lock and |
| 349 | * inode->i_lock. Either the caller has an active reference on the inode or | 403 | * inode->i_lock. Either the caller has an active reference on the inode or |
| 350 | * the inode has I_WILL_FREE set. | 404 | * the inode has I_WILL_FREE set. |
| @@ -422,53 +476,7 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb, | |||
| 422 | 476 | ||
| 423 | spin_lock(&wb->list_lock); | 477 | spin_lock(&wb->list_lock); |
| 424 | spin_lock(&inode->i_lock); | 478 | spin_lock(&inode->i_lock); |
| 425 | if (!(inode->i_state & I_FREEING)) { | 479 | requeue_inode(inode, wb, wbc); |
| 426 | /* | ||
| 427 | * Sync livelock prevention. Each inode is tagged and synced in | ||
| 428 | * one shot. If still dirty, it will be redirty_tail()'ed below. | ||
| 429 | * Update the dirty time to prevent enqueue and sync it again. | ||
| 430 | */ | ||
| 431 | if ((inode->i_state & I_DIRTY) && | ||
| 432 | (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)) | ||
| 433 | inode->dirtied_when = jiffies; | ||
| 434 | |||
| 435 | if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { | ||
| 436 | /* | ||
| 437 | * We didn't write back all the pages. nfs_writepages() | ||
| 438 | * sometimes bales out without doing anything. | ||
| 439 | */ | ||
| 440 | if (wbc->nr_to_write <= 0) { | ||
| 441 | /* | ||
| 442 | * slice used up: queue for next turn | ||
| 443 | */ | ||
| 444 | requeue_io(inode, wb); | ||
| 445 | } else { | ||
| 446 | /* | ||
| 447 | * Writeback blocked by something other than | ||
| 448 | * congestion. Delay the inode for some time to | ||
| 449 | * avoid spinning on the CPU (100% iowait) | ||
| 450 | * retrying writeback of the dirty page/inode | ||
| 451 | * that cannot be performed immediately. | ||
| 452 | */ | ||
| 453 | redirty_tail(inode, wb); | ||
| 454 | } | ||
| 455 | } else if (inode->i_state & I_DIRTY) { | ||
| 456 | /* | ||
| 457 | * Filesystems can dirty the inode during writeback | ||
| 458 | * operations, such as delayed allocation during | ||
| 459 | * submission or metadata updates after data IO | ||
| 460 | * completion. | ||
| 461 | */ | ||
| 462 | redirty_tail(inode, wb); | ||
| 463 | } else { | ||
| 464 | /* | ||
| 465 | * The inode is clean. At this point we either have | ||
| 466 | * a reference to the inode or it's on it's way out. | ||
| 467 | * No need to add it back to the LRU. | ||
| 468 | */ | ||
| 469 | list_del_init(&inode->i_wb_list); | ||
| 470 | } | ||
| 471 | } | ||
| 472 | inode_sync_complete(inode); | 480 | inode_sync_complete(inode); |
| 473 | trace_writeback_single_inode(inode, wbc, nr_to_write); | 481 | trace_writeback_single_inode(inode, wbc, nr_to_write); |
| 474 | return ret; | 482 | return ret; |
