|
@@ -46,6 +46,7 @@
|
|
|
#include "xfs_symlink.h"
|
|
|
#include "xfs_attr_leaf.h"
|
|
|
#include "xfs_filestream.h"
|
|
|
+#include "xfs_rmap.h"
|
|
|
|
|
|
|
|
|
kmem_zone_t *xfs_bmap_free_item_zone;
|
|
@@ -571,10 +572,11 @@ xfs_bmap_validate_ret(
|
|
|
*/
|
|
|
void
|
|
|
xfs_bmap_add_free(
|
|
|
- struct xfs_mount *mp, /* mount point structure */
|
|
|
- struct xfs_defer_ops *dfops, /* list of extents */
|
|
|
- xfs_fsblock_t bno, /* fs block number of extent */
|
|
|
- xfs_filblks_t len) /* length of extent */
|
|
|
+ struct xfs_mount *mp,
|
|
|
+ struct xfs_defer_ops *dfops,
|
|
|
+ xfs_fsblock_t bno,
|
|
|
+ xfs_filblks_t len,
|
|
|
+ struct xfs_owner_info *oinfo)
|
|
|
{
|
|
|
struct xfs_extent_free_item *new; /* new element */
|
|
|
#ifdef DEBUG
|
|
@@ -593,9 +595,14 @@ xfs_bmap_add_free(
|
|
|
ASSERT(agbno + len <= mp->m_sb.sb_agblocks);
|
|
|
#endif
|
|
|
ASSERT(xfs_bmap_free_item_zone != NULL);
|
|
|
+
|
|
|
new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP);
|
|
|
new->xefi_startblock = bno;
|
|
|
new->xefi_blockcount = (xfs_extlen_t)len;
|
|
|
+ if (oinfo)
|
|
|
+ new->xefi_oinfo = *oinfo;
|
|
|
+ else
|
|
|
+ xfs_rmap_skip_owner_update(&new->xefi_oinfo);
|
|
|
trace_xfs_bmap_free_defer(mp, XFS_FSB_TO_AGNO(mp, bno), 0,
|
|
|
XFS_FSB_TO_AGBNO(mp, bno), len);
|
|
|
xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list);
|
|
@@ -628,6 +635,7 @@ xfs_bmap_btree_to_extents(
|
|
|
xfs_mount_t *mp; /* mount point structure */
|
|
|
__be64 *pp; /* ptr to block address */
|
|
|
struct xfs_btree_block *rblock;/* root btree block */
|
|
|
+ struct xfs_owner_info oinfo;
|
|
|
|
|
|
mp = ip->i_mount;
|
|
|
ifp = XFS_IFORK_PTR(ip, whichfork);
|
|
@@ -651,7 +659,8 @@ xfs_bmap_btree_to_extents(
|
|
|
cblock = XFS_BUF_TO_BLOCK(cbp);
|
|
|
if ((error = xfs_btree_check_block(cur, cblock, 0, cbp)))
|
|
|
return error;
|
|
|
- xfs_bmap_add_free(mp, cur->bc_private.b.dfops, cbno, 1);
|
|
|
+ xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, whichfork);
|
|
|
+ xfs_bmap_add_free(mp, cur->bc_private.b.dfops, cbno, 1, &oinfo);
|
|
|
ip->i_d.di_nblocks--;
|
|
|
xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
|
|
|
xfs_trans_binval(tp, cbp);
|
|
@@ -732,6 +741,7 @@ xfs_bmap_extents_to_btree(
|
|
|
memset(&args, 0, sizeof(args));
|
|
|
args.tp = tp;
|
|
|
args.mp = mp;
|
|
|
+ xfs_rmap_ino_bmbt_owner(&args.oinfo, ip->i_ino, whichfork);
|
|
|
args.firstblock = *firstblock;
|
|
|
if (*firstblock == NULLFSBLOCK) {
|
|
|
args.type = XFS_ALLOCTYPE_START_BNO;
|
|
@@ -878,6 +888,7 @@ xfs_bmap_local_to_extents(
|
|
|
memset(&args, 0, sizeof(args));
|
|
|
args.tp = tp;
|
|
|
args.mp = ip->i_mount;
|
|
|
+ xfs_rmap_ino_owner(&args.oinfo, ip->i_ino, whichfork, 0);
|
|
|
args.firstblock = *firstblock;
|
|
|
/*
|
|
|
* Allocate a block. We know we need only one, since the
|
|
@@ -3660,6 +3671,7 @@ xfs_bmap_btalloc(
|
|
|
args.tp = ap->tp;
|
|
|
args.mp = mp;
|
|
|
args.fsbno = ap->blkno;
|
|
|
+ xfs_rmap_skip_owner_update(&args.oinfo);
|
|
|
|
|
|
/* Trim the allocation back to the maximum an AG can fit. */
|
|
|
args.maxlen = MIN(ap->length, XFS_ALLOC_AG_MAX_USABLE(mp));
|
|
@@ -4839,6 +4851,7 @@ xfs_bmap_del_extent(
|
|
|
nblks = 0;
|
|
|
do_fx = 0;
|
|
|
}
|
|
|
+
|
|
|
/*
|
|
|
* Set flag value to use in switch statement.
|
|
|
* Left-contig is 2, right-contig is 1.
|
|
@@ -5026,7 +5039,7 @@ xfs_bmap_del_extent(
|
|
|
*/
|
|
|
if (do_fx)
|
|
|
xfs_bmap_add_free(mp, dfops, del->br_startblock,
|
|
|
- del->br_blockcount);
|
|
|
+ del->br_blockcount, NULL);
|
|
|
/*
|
|
|
* Adjust inode # blocks in the file.
|
|
|
*/
|