diff options
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index e5eaa62fd17f..e3fe9918faaf 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -274,6 +274,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 274 | int ret; | 274 | int ret; |
| 275 | 275 | ||
| 276 | BUG_ON(inode->i_state & I_SYNC); | 276 | BUG_ON(inode->i_state & I_SYNC); |
| 277 | WARN_ON(inode->i_state & I_NEW); | ||
| 277 | 278 | ||
| 278 | /* Set I_SYNC, reset I_DIRTY */ | 279 | /* Set I_SYNC, reset I_DIRTY */ |
| 279 | dirty = inode->i_state & I_DIRTY; | 280 | dirty = inode->i_state & I_DIRTY; |
| @@ -298,6 +299,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 298 | } | 299 | } |
| 299 | 300 | ||
| 300 | spin_lock(&inode_lock); | 301 | spin_lock(&inode_lock); |
| 302 | WARN_ON(inode->i_state & I_NEW); | ||
| 301 | inode->i_state &= ~I_SYNC; | 303 | inode->i_state &= ~I_SYNC; |
| 302 | if (!(inode->i_state & I_FREEING)) { | 304 | if (!(inode->i_state & I_FREEING)) { |
| 303 | if (!(inode->i_state & I_DIRTY) && | 305 | if (!(inode->i_state & I_DIRTY) && |
| @@ -470,6 +472,11 @@ void generic_sync_sb_inodes(struct super_block *sb, | |||
| 470 | break; | 472 | break; |
| 471 | } | 473 | } |
| 472 | 474 | ||
| 475 | if (inode->i_state & I_NEW) { | ||
| 476 | requeue_io(inode); | ||
| 477 | continue; | ||
| 478 | } | ||
| 479 | |||
| 473 | if (wbc->nonblocking && bdi_write_congested(bdi)) { | 480 | if (wbc->nonblocking && bdi_write_congested(bdi)) { |
| 474 | wbc->encountered_congestion = 1; | 481 | wbc->encountered_congestion = 1; |
| 475 | if (!sb_is_blkdev_sb(sb)) | 482 | if (!sb_is_blkdev_sb(sb)) |
| @@ -531,7 +538,7 @@ void generic_sync_sb_inodes(struct super_block *sb, | |||
| 531 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 538 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
| 532 | struct address_space *mapping; | 539 | struct address_space *mapping; |
| 533 | 540 | ||
| 534 | if (inode->i_state & (I_FREEING|I_WILL_FREE)) | 541 | if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) |
| 535 | continue; | 542 | continue; |
| 536 | mapping = inode->i_mapping; | 543 | mapping = inode->i_mapping; |
| 537 | if (mapping->nrpages == 0) | 544 | if (mapping->nrpages == 0) |
