|
@@ -1076,13 +1076,24 @@ xfs_ialloc_get_rec(
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Return the offset of the first free inode in the record.
|
|
|
+ * Return the offset of the first free inode in the record. If the inode chunk
|
|
|
+ * is sparsely allocated, we convert the record holemask to inode granularity
|
|
|
+ * and mask off the unallocated regions from the inode free mask.
|
|
|
*/
|
|
|
STATIC int
|
|
|
xfs_inobt_first_free_inode(
|
|
|
struct xfs_inobt_rec_incore *rec)
|
|
|
{
|
|
|
- return xfs_lowbit64(rec->ir_free);
|
|
|
+ xfs_inofree_t realfree;
|
|
|
+
|
|
|
+ /* if there are no holes, return the first available offset */
|
|
|
+ if (!xfs_inobt_issparse(rec->ir_holemask))
|
|
|
+ return xfs_lowbit64(rec->ir_free);
|
|
|
+
|
|
|
+ realfree = xfs_inobt_irec_to_allocmask(rec);
|
|
|
+ realfree &= rec->ir_free;
|
|
|
+
|
|
|
+ return xfs_lowbit64(realfree);
|
|
|
}
|
|
|
|
|
|
/*
|