|
@@ -2493,6 +2493,19 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
|
|
}
|
|
}
|
|
|
|
|
|
trans->block_rsv = &root->fs_info->trans_block_rsv;
|
|
trans->block_rsv = &root->fs_info->trans_block_rsv;
|
|
|
|
+ /*
|
|
|
|
+ * If we are using the NO_HOLES feature we might have had already an
|
|
|
|
+ * hole that overlaps a part of the region [lockstart, lockend] and
|
|
|
|
+ * ends at (or beyond) lockend. Since we have no file extent items to
|
|
|
|
+ * represent holes, drop_end can be less than lockend and so we must
|
|
|
|
+ * make sure we have an extent map representing the existing hole (the
|
|
|
|
+ * call to __btrfs_drop_extents() might have dropped the existing extent
|
|
|
|
+ * map representing the existing hole), otherwise the fast fsync path
|
|
|
|
+ * will not record the existence of the hole region
|
|
|
|
+ * [existing_hole_start, lockend].
|
|
|
|
+ */
|
|
|
|
+ if (drop_end <= lockend)
|
|
|
|
+ drop_end = lockend + 1;
|
|
/*
|
|
/*
|
|
* Don't insert file hole extent item if it's for a range beyond eof
|
|
* Don't insert file hole extent item if it's for a range beyond eof
|
|
* (because it's useless) or if it represents a 0 bytes range (when
|
|
* (because it's useless) or if it represents a 0 bytes range (when
|