diff options
| -rw-r--r-- | fs/btrfs/extent_io.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index aaa12c1eb348..01c21b6c6d43 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -3324,6 +3324,7 @@ static int extent_write_cache_pages(struct extent_io_tree *tree, | |||
| 3324 | writepage_t writepage, void *data, | 3324 | writepage_t writepage, void *data, |
| 3325 | void (*flush_fn)(void *)) | 3325 | void (*flush_fn)(void *)) |
| 3326 | { | 3326 | { |
| 3327 | struct inode *inode = mapping->host; | ||
| 3327 | int ret = 0; | 3328 | int ret = 0; |
| 3328 | int done = 0; | 3329 | int done = 0; |
| 3329 | int nr_to_write_done = 0; | 3330 | int nr_to_write_done = 0; |
| @@ -3334,6 +3335,18 @@ static int extent_write_cache_pages(struct extent_io_tree *tree, | |||
| 3334 | int scanned = 0; | 3335 | int scanned = 0; |
| 3335 | int tag; | 3336 | int tag; |
| 3336 | 3337 | ||
| 3338 | /* | ||
| 3339 | * We have to hold onto the inode so that ordered extents can do their | ||
| 3340 | * work when the IO finishes. The alternative to this is failing to add | ||
| 3341 | * an ordered extent if the igrab() fails there and that is a huge pain | ||
| 3342 | * to deal with, so instead just hold onto the inode throughout the | ||
| 3343 | * writepages operation. If it fails here we are freeing up the inode | ||
| 3344 | * anyway and we'd rather not waste our time writing out stuff that is | ||
| 3345 | * going to be truncated anyway. | ||
| 3346 | */ | ||
| 3347 | if (!igrab(inode)) | ||
| 3348 | return 0; | ||
| 3349 | |||
| 3337 | pagevec_init(&pvec, 0); | 3350 | pagevec_init(&pvec, 0); |
| 3338 | if (wbc->range_cyclic) { | 3351 | if (wbc->range_cyclic) { |
| 3339 | index = mapping->writeback_index; /* Start from prev offset */ | 3352 | index = mapping->writeback_index; /* Start from prev offset */ |
| @@ -3428,6 +3441,7 @@ retry: | |||
| 3428 | index = 0; | 3441 | index = 0; |
| 3429 | goto retry; | 3442 | goto retry; |
| 3430 | } | 3443 | } |
| 3444 | btrfs_add_delayed_iput(inode); | ||
| 3431 | return ret; | 3445 | return ret; |
| 3432 | } | 3446 | } |
| 3433 | 3447 | ||
