summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 65107894a5bb..6c778043207d 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -641,8 +641,9 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
if (ret == -ENOENT || ret == -EFBIG)
ret = 0;
csum = 0;
- printk("no csum found for inode %lu start %Lu\n", inode->i_ino,
- start);
+ if (printk_ratelimit())
+ printk("no csum found for inode %lu start %Lu\n", inode->i_ino,
+ start);
goto out;
}
read_extent_buffer(path->nodes[0], &csum, (unsigned long)item,
@@ -1653,8 +1654,20 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr)
btrfs_truncate_page(inode->i_mapping, inode->i_size);
hole_size = block_end - hole_start;
- btrfs_wait_ordered_range(inode, hole_start, hole_size);
- lock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS);
+ while(1) {
+ struct btrfs_ordered_extent *ordered;
+ btrfs_wait_ordered_range(inode, hole_start, hole_size);
+
+ lock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS);
+ ordered = btrfs_lookup_ordered_extent(inode, hole_start);
+ if (ordered) {
+ unlock_extent(io_tree, hole_start,
+ block_end - 1, GFP_NOFS);
+ btrfs_put_ordered_extent(ordered);
+ } else {
+ break;
+ }
+ }
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);
OpenPOWER on IntegriCloud