|
@@ -374,45 +374,22 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
|
|
|
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
|
|
|
/*
|
|
|
* We didn't write back all the pages. nfs_writepages()
|
|
|
- * sometimes bales out without doing anything. Redirty
|
|
|
- * the inode; Move it from b_io onto b_more_io/b_dirty.
|
|
|
+ * sometimes bales out without doing anything.
|
|
|
*/
|
|
|
- /*
|
|
|
- * akpm: if the caller was the kupdate function we put
|
|
|
- * this inode at the head of b_dirty so it gets first
|
|
|
- * consideration. Otherwise, move it to the tail, for
|
|
|
- * the reasons described there. I'm not really sure
|
|
|
- * how much sense this makes. Presumably I had a good
|
|
|
- * reasons for doing it this way, and I'd rather not
|
|
|
- * muck with it at present.
|
|
|
- */
|
|
|
- if (wbc->for_kupdate) {
|
|
|
+ inode->i_state |= I_DIRTY_PAGES;
|
|
|
+ if (wbc->nr_to_write <= 0) {
|
|
|
/*
|
|
|
- * For the kupdate function we move the inode
|
|
|
- * to b_more_io so it will get more writeout as
|
|
|
- * soon as the queue becomes uncongested.
|
|
|
+ * slice used up: queue for next turn
|
|
|
*/
|
|
|
- inode->i_state |= I_DIRTY_PAGES;
|
|
|
- if (wbc->nr_to_write <= 0) {
|
|
|
- /*
|
|
|
- * slice used up: queue for next turn
|
|
|
- */
|
|
|
- requeue_io(inode);
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * somehow blocked: retry later
|
|
|
- */
|
|
|
- redirty_tail(inode);
|
|
|
- }
|
|
|
+ requeue_io(inode);
|
|
|
} else {
|
|
|
/*
|
|
|
- * Otherwise fully redirty the inode so that
|
|
|
- * other inodes on this superblock will get some
|
|
|
- * writeout. Otherwise heavy writing to one
|
|
|
- * file would indefinitely suspend writeout of
|
|
|
- * all the other files.
|
|
|
+ * Writeback blocked by something other than
|
|
|
+ * congestion. Delay the inode for some time to
|
|
|
+ * avoid spinning on the CPU (100% iowait)
|
|
|
+ * retrying writeback of the dirty page/inode
|
|
|
+ * that cannot be performed immediately.
|
|
|
*/
|
|
|
- inode->i_state |= I_DIRTY_PAGES;
|
|
|
redirty_tail(inode);
|
|
|
}
|
|
|
} else if (inode->i_state & I_DIRTY) {
|