Merge branch 'xfs-sparse-inode' into for-next
This commit is contained in:
@@ -2235,9 +2235,9 @@ xfs_iunlink_remove(
|
||||
*/
|
||||
STATIC int
|
||||
xfs_ifree_cluster(
|
||||
xfs_inode_t *free_ip,
|
||||
xfs_trans_t *tp,
|
||||
xfs_ino_t inum)
|
||||
xfs_inode_t *free_ip,
|
||||
xfs_trans_t *tp,
|
||||
struct xfs_icluster *xic)
|
||||
{
|
||||
xfs_mount_t *mp = free_ip->i_mount;
|
||||
int blks_per_cluster;
|
||||
@@ -2250,13 +2250,26 @@ xfs_ifree_cluster(
|
||||
xfs_inode_log_item_t *iip;
|
||||
xfs_log_item_t *lip;
|
||||
struct xfs_perag *pag;
|
||||
xfs_ino_t inum;
|
||||
|
||||
inum = xic->first_ino;
|
||||
pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum));
|
||||
blks_per_cluster = xfs_icluster_size_fsb(mp);
|
||||
inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog;
|
||||
nbufs = mp->m_ialloc_blks / blks_per_cluster;
|
||||
|
||||
for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) {
|
||||
/*
|
||||
* The allocation bitmap tells us which inodes of the chunk were
|
||||
* physically allocated. Skip the cluster if an inode falls into
|
||||
* a sparse region.
|
||||
*/
|
||||
if ((xic->alloc & XFS_INOBT_MASK(inum - xic->first_ino)) == 0) {
|
||||
ASSERT(((inum - xic->first_ino) %
|
||||
inodes_per_cluster) == 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum),
|
||||
XFS_INO_TO_AGBNO(mp, inum));
|
||||
|
||||
@@ -2414,8 +2427,7 @@ xfs_ifree(
|
||||
xfs_bmap_free_t *flist)
|
||||
{
|
||||
int error;
|
||||
int delete;
|
||||
xfs_ino_t first_ino;
|
||||
struct xfs_icluster xic = { 0 };
|
||||
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
ASSERT(ip->i_d.di_nlink == 0);
|
||||
@@ -2431,7 +2443,7 @@ xfs_ifree(
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino);
|
||||
error = xfs_difree(tp, ip->i_ino, flist, &xic);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -2448,8 +2460,8 @@ xfs_ifree(
|
||||
ip->i_d.di_gen++;
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
|
||||
if (delete)
|
||||
error = xfs_ifree_cluster(ip, tp, first_ino);
|
||||
if (xic.deleted)
|
||||
error = xfs_ifree_cluster(ip, tp, &xic);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
Reference in New Issue
Block a user