* Compute quota reservation if we think the quota block counter for
* this file could increase.
*
- * We start by reserving enough blocks to handle a bmbt split.
+ * Adding a written extent to the extent map can cause a bmbt split,
+ * and removing a mapped extent from the extent can cause a bmbt split.
+ * The two operations cannot both cause a split since they operate on
+ * the same index in the bmap btree, so we only need a reservation for
+ * one bmbt split if either thing is happening.
*
* If we are mapping a written extent into the file, we need to have
* enough quota block count reservation to handle the blocks in that
* before we started. That should have removed all the delalloc
* reservations, but we code defensively.
*/
- qdelta = 0;
- qres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK);
+ qres = qdelta = 0;
+ if (smap_real || dmap_written)
+ qres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK);
if (dmap_written)
qres += dmap->br_blockcount;
- error = xfs_trans_reserve_quota_nblks(tp, ip, qres, 0,
- XFS_QMOPT_RES_REGBLKS);
- if (error)
- goto out_cancel;
+ if (qres > 0) {
+ error = xfs_trans_reserve_quota_nblks(tp, ip, qres, 0,
+ XFS_QMOPT_RES_REGBLKS);
+ if (error)
+ goto out_cancel;
+ }
if (smap_real) {
/*