|
@@ -1786,7 +1786,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
|
|
|
&ordered_extent->list);
|
|
|
|
|
|
ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent);
|
|
|
- if (!ret) {
|
|
|
+ if (!ret || !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) {
|
|
|
ret = btrfs_update_inode(trans, root, inode);
|
|
|
BUG_ON(ret);
|
|
|
}
|
|
@@ -3510,15 +3510,19 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
|
|
|
err = btrfs_drop_extents(trans, inode, cur_offset,
|
|
|
cur_offset + hole_size,
|
|
|
&hint_byte, 1);
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ btrfs_end_transaction(trans, root);
|
|
|
break;
|
|
|
+ }
|
|
|
|
|
|
err = btrfs_insert_file_extent(trans, root,
|
|
|
btrfs_ino(inode), cur_offset, 0,
|
|
|
0, hole_size, 0, hole_size,
|
|
|
0, 0, 0);
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ btrfs_end_transaction(trans, root);
|
|
|
break;
|
|
|
+ }
|
|
|
|
|
|
btrfs_drop_extent_cache(inode, hole_start,
|
|
|
last_byte - 1, 0);
|
|
@@ -3952,7 +3956,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location,
|
|
|
struct btrfs_root *root, int *new)
|
|
|
{
|
|
|
struct inode *inode;
|
|
|
- int bad_inode = 0;
|
|
|
|
|
|
inode = btrfs_iget_locked(s, location->objectid, root);
|
|
|
if (!inode)
|
|
@@ -3968,15 +3971,12 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location,
|
|
|
if (new)
|
|
|
*new = 1;
|
|
|
} else {
|
|
|
- bad_inode = 1;
|
|
|
+ unlock_new_inode(inode);
|
|
|
+ iput(inode);
|
|
|
+ inode = ERR_PTR(-ESTALE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (bad_inode) {
|
|
|
- iput(inode);
|
|
|
- inode = ERR_PTR(-ESTALE);
|
|
|
- }
|
|
|
-
|
|
|
return inode;
|
|
|
}
|
|
|
|
|
@@ -5823,7 +5823,7 @@ again:
|
|
|
|
|
|
add_pending_csums(trans, inode, ordered->file_offset, &ordered->list);
|
|
|
ret = btrfs_ordered_update_i_size(inode, 0, ordered);
|
|
|
- if (!ret)
|
|
|
+ if (!ret || !test_bit(BTRFS_ORDERED_PREALLOC, &ordered->flags))
|
|
|
btrfs_update_inode(trans, root, inode);
|
|
|
ret = 0;
|
|
|
out_unlock:
|