|
@@ -1280,6 +1280,7 @@ again:
|
|
|
}
|
|
|
wait_on_page_writeback(pages[i]);
|
|
|
}
|
|
|
+ faili = num_pages - 1;
|
|
|
err = 0;
|
|
|
if (start_pos < inode->i_size) {
|
|
|
struct btrfs_ordered_extent *ordered;
|
|
@@ -1298,8 +1299,10 @@ again:
|
|
|
unlock_page(pages[i]);
|
|
|
page_cache_release(pages[i]);
|
|
|
}
|
|
|
- btrfs_wait_ordered_range(inode, start_pos,
|
|
|
- last_pos - start_pos);
|
|
|
+ err = btrfs_wait_ordered_range(inode, start_pos,
|
|
|
+ last_pos - start_pos);
|
|
|
+ if (err)
|
|
|
+ goto fail;
|
|
|
goto again;
|
|
|
}
|
|
|
if (ordered)
|
|
@@ -1808,8 +1811,13 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
|
|
atomic_inc(&root->log_batch);
|
|
|
full_sync = test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
|
|
|
&BTRFS_I(inode)->runtime_flags);
|
|
|
- if (full_sync)
|
|
|
- btrfs_wait_ordered_range(inode, start, end - start + 1);
|
|
|
+ if (full_sync) {
|
|
|
+ ret = btrfs_wait_ordered_range(inode, start, end - start + 1);
|
|
|
+ if (ret) {
|
|
|
+ mutex_unlock(&inode->i_mutex);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
atomic_inc(&root->log_batch);
|
|
|
|
|
|
/*
|
|
@@ -1875,27 +1883,20 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
|
|
|
if (ret != BTRFS_NO_LOG_SYNC) {
|
|
|
- if (ret > 0) {
|
|
|
- /*
|
|
|
- * If we didn't already wait for ordered extents we need
|
|
|
- * to do that now.
|
|
|
- */
|
|
|
- if (!full_sync)
|
|
|
- btrfs_wait_ordered_range(inode, start,
|
|
|
- end - start + 1);
|
|
|
- ret = btrfs_commit_transaction(trans, root);
|
|
|
- } else {
|
|
|
+ if (!ret) {
|
|
|
ret = btrfs_sync_log(trans, root);
|
|
|
- if (ret == 0) {
|
|
|
+ if (!ret) {
|
|
|
ret = btrfs_end_transaction(trans, root);
|
|
|
- } else {
|
|
|
- if (!full_sync)
|
|
|
- btrfs_wait_ordered_range(inode, start,
|
|
|
- end -
|
|
|
- start + 1);
|
|
|
- ret = btrfs_commit_transaction(trans, root);
|
|
|
+ goto out;
|
|
|
}
|
|
|
}
|
|
|
+ if (!full_sync) {
|
|
|
+ ret = btrfs_wait_ordered_range(inode, start,
|
|
|
+ end - start + 1);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ ret = btrfs_commit_transaction(trans, root);
|
|
|
} else {
|
|
|
ret = btrfs_end_transaction(trans, root);
|
|
|
}
|
|
@@ -2066,7 +2067,9 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
|
|
|
bool same_page = ((offset >> PAGE_CACHE_SHIFT) ==
|
|
|
((offset + len - 1) >> PAGE_CACHE_SHIFT));
|
|
|
|
|
|
- btrfs_wait_ordered_range(inode, offset, len);
|
|
|
+ ret = btrfs_wait_ordered_range(inode, offset, len);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
mutex_lock(&inode->i_mutex);
|
|
|
/*
|
|
@@ -2135,8 +2138,12 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
|
|
|
btrfs_put_ordered_extent(ordered);
|
|
|
unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart,
|
|
|
lockend, &cached_state, GFP_NOFS);
|
|
|
- btrfs_wait_ordered_range(inode, lockstart,
|
|
|
- lockend - lockstart + 1);
|
|
|
+ ret = btrfs_wait_ordered_range(inode, lockstart,
|
|
|
+ lockend - lockstart + 1);
|
|
|
+ if (ret) {
|
|
|
+ mutex_unlock(&inode->i_mutex);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
path = btrfs_alloc_path();
|
|
@@ -2307,7 +2314,10 @@ static long btrfs_fallocate(struct file *file, int mode,
|
|
|
* wait for ordered IO before we have any locks. We'll loop again
|
|
|
* below with the locks held.
|
|
|
*/
|
|
|
- btrfs_wait_ordered_range(inode, alloc_start, alloc_end - alloc_start);
|
|
|
+ ret = btrfs_wait_ordered_range(inode, alloc_start,
|
|
|
+ alloc_end - alloc_start);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
|
|
|
locked_end = alloc_end - 1;
|
|
|
while (1) {
|
|
@@ -2331,8 +2341,10 @@ static long btrfs_fallocate(struct file *file, int mode,
|
|
|
* we can't wait on the range with the transaction
|
|
|
* running or with the extent lock held
|
|
|
*/
|
|
|
- btrfs_wait_ordered_range(inode, alloc_start,
|
|
|
- alloc_end - alloc_start);
|
|
|
+ ret = btrfs_wait_ordered_range(inode, alloc_start,
|
|
|
+ alloc_end - alloc_start);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
} else {
|
|
|
if (ordered)
|
|
|
btrfs_put_ordered_extent(ordered);
|