Merge 90c90cda05 ("Merge tag 'xfs-5.15-merge-6' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux") into android-mainline

Steps on the way to 5.15-rc1

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Id0e9064c101f599601a6d864ce7ac2ed88083562
This commit is contained in:
Greg Kroah-Hartman
2021-09-07 18:54:15 +02:00
153 changed files with 4085 additions and 3204 deletions

View File

@@ -29,67 +29,3 @@ kmem_alloc(size_t size, xfs_km_flags_t flags)
congestion_wait(BLK_RW_ASYNC, HZ/50); congestion_wait(BLK_RW_ASYNC, HZ/50);
} while (1); } while (1);
} }
/*
* __vmalloc() will allocate data pages and auxiliary structures (e.g.
* pagetables) with GFP_KERNEL, yet we may be under GFP_NOFS context here. Hence
* we need to tell memory reclaim that we are in such a context via
* PF_MEMALLOC_NOFS to prevent memory reclaim re-entering the filesystem here
* and potentially deadlocking.
*/
static void *
__kmem_vmalloc(size_t size, xfs_km_flags_t flags)
{
unsigned nofs_flag = 0;
void *ptr;
gfp_t lflags = kmem_flags_convert(flags);
if (flags & KM_NOFS)
nofs_flag = memalloc_nofs_save();
ptr = __vmalloc(size, lflags);
if (flags & KM_NOFS)
memalloc_nofs_restore(nofs_flag);
return ptr;
}
/*
* Same as kmem_alloc_large, except we guarantee the buffer returned is aligned
* to the @align_mask. We only guarantee alignment up to page size, we'll clamp
* alignment at page size if it is larger. vmalloc always returns a PAGE_SIZE
* aligned region.
*/
void *
kmem_alloc_io(size_t size, int align_mask, xfs_km_flags_t flags)
{
void *ptr;
trace_kmem_alloc_io(size, flags, _RET_IP_);
if (WARN_ON_ONCE(align_mask >= PAGE_SIZE))
align_mask = PAGE_SIZE - 1;
ptr = kmem_alloc(size, flags | KM_MAYFAIL);
if (ptr) {
if (!((uintptr_t)ptr & align_mask))
return ptr;
kfree(ptr);
}
return __kmem_vmalloc(size, flags);
}
void *
kmem_alloc_large(size_t size, xfs_km_flags_t flags)
{
void *ptr;
trace_kmem_alloc_large(size, flags, _RET_IP_);
ptr = kmem_alloc(size, flags | KM_MAYFAIL);
if (ptr)
return ptr;
return __kmem_vmalloc(size, flags);
}

View File

@@ -57,8 +57,6 @@ kmem_flags_convert(xfs_km_flags_t flags)
} }
extern void *kmem_alloc(size_t, xfs_km_flags_t); extern void *kmem_alloc(size_t, xfs_km_flags_t);
extern void *kmem_alloc_io(size_t size, int align_mask, xfs_km_flags_t flags);
extern void *kmem_alloc_large(size_t size, xfs_km_flags_t);
static inline void kmem_free(const void *ptr) static inline void kmem_free(const void *ptr)
{ {
kvfree(ptr); kvfree(ptr);

View File

@@ -313,7 +313,6 @@ xfs_get_aghdr_buf(
if (error) if (error)
return error; return error;
bp->b_bn = blkno;
bp->b_maps[0].bm_bn = blkno; bp->b_maps[0].bm_bn = blkno;
bp->b_ops = ops; bp->b_ops = ops;
@@ -469,7 +468,7 @@ xfs_rmaproot_init(
rrec->rm_offset = 0; rrec->rm_offset = 0;
/* account for refc btree root */ /* account for refc btree root */
if (xfs_sb_version_hasreflink(&mp->m_sb)) { if (xfs_has_reflink(mp)) {
rrec = XFS_RMAP_REC_ADDR(block, 5); rrec = XFS_RMAP_REC_ADDR(block, 5);
rrec->rm_startblock = cpu_to_be32(xfs_refc_block(mp)); rrec->rm_startblock = cpu_to_be32(xfs_refc_block(mp));
rrec->rm_blockcount = cpu_to_be32(1); rrec->rm_blockcount = cpu_to_be32(1);
@@ -528,7 +527,7 @@ xfs_agfblock_init(
agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp));
agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1);
agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1);
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { if (xfs_has_rmapbt(mp)) {
agf->agf_roots[XFS_BTNUM_RMAPi] = agf->agf_roots[XFS_BTNUM_RMAPi] =
cpu_to_be32(XFS_RMAP_BLOCK(mp)); cpu_to_be32(XFS_RMAP_BLOCK(mp));
agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1); agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1);
@@ -541,9 +540,9 @@ xfs_agfblock_init(
tmpsize = id->agsize - mp->m_ag_prealloc_blocks; tmpsize = id->agsize - mp->m_ag_prealloc_blocks;
agf->agf_freeblks = cpu_to_be32(tmpsize); agf->agf_freeblks = cpu_to_be32(tmpsize);
agf->agf_longest = cpu_to_be32(tmpsize); agf->agf_longest = cpu_to_be32(tmpsize);
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid);
if (xfs_sb_version_hasreflink(&mp->m_sb)) { if (xfs_has_reflink(mp)) {
agf->agf_refcount_root = cpu_to_be32( agf->agf_refcount_root = cpu_to_be32(
xfs_refc_block(mp)); xfs_refc_block(mp));
agf->agf_refcount_level = cpu_to_be32(1); agf->agf_refcount_level = cpu_to_be32(1);
@@ -569,7 +568,7 @@ xfs_agflblock_init(
__be32 *agfl_bno; __be32 *agfl_bno;
int bucket; int bucket;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC);
agfl->agfl_seqno = cpu_to_be32(id->agno); agfl->agfl_seqno = cpu_to_be32(id->agno);
uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid);
@@ -599,17 +598,17 @@ xfs_agiblock_init(
agi->agi_freecount = 0; agi->agi_freecount = 0;
agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_newino = cpu_to_be32(NULLAGINO);
agi->agi_dirino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO);
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid);
if (xfs_sb_version_hasfinobt(&mp->m_sb)) { if (xfs_has_finobt(mp)) {
agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp));
agi->agi_free_level = cpu_to_be32(1); agi->agi_free_level = cpu_to_be32(1);
} }
for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++) for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++)
agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO); agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO);
if (xfs_sb_version_hasinobtcounts(&mp->m_sb)) { if (xfs_has_inobtcounts(mp)) {
agi->agi_iblocks = cpu_to_be32(1); agi->agi_iblocks = cpu_to_be32(1);
if (xfs_sb_version_hasfinobt(&mp->m_sb)) if (xfs_has_finobt(mp))
agi->agi_fblocks = cpu_to_be32(1); agi->agi_fblocks = cpu_to_be32(1);
} }
} }
@@ -719,14 +718,14 @@ xfs_ag_init_headers(
.ops = &xfs_finobt_buf_ops, .ops = &xfs_finobt_buf_ops,
.work = &xfs_btroot_init, .work = &xfs_btroot_init,
.type = XFS_BTNUM_FINO, .type = XFS_BTNUM_FINO,
.need_init = xfs_sb_version_hasfinobt(&mp->m_sb) .need_init = xfs_has_finobt(mp)
}, },
{ /* RMAP root block */ { /* RMAP root block */
.daddr = XFS_AGB_TO_DADDR(mp, id->agno, XFS_RMAP_BLOCK(mp)), .daddr = XFS_AGB_TO_DADDR(mp, id->agno, XFS_RMAP_BLOCK(mp)),
.numblks = BTOBB(mp->m_sb.sb_blocksize), .numblks = BTOBB(mp->m_sb.sb_blocksize),
.ops = &xfs_rmapbt_buf_ops, .ops = &xfs_rmapbt_buf_ops,
.work = &xfs_rmaproot_init, .work = &xfs_rmaproot_init,
.need_init = xfs_sb_version_hasrmapbt(&mp->m_sb) .need_init = xfs_has_rmapbt(mp)
}, },
{ /* REFC root block */ { /* REFC root block */
.daddr = XFS_AGB_TO_DADDR(mp, id->agno, xfs_refc_block(mp)), .daddr = XFS_AGB_TO_DADDR(mp, id->agno, xfs_refc_block(mp)),
@@ -734,7 +733,7 @@ xfs_ag_init_headers(
.ops = &xfs_refcountbt_buf_ops, .ops = &xfs_refcountbt_buf_ops,
.work = &xfs_btroot_init, .work = &xfs_btroot_init,
.type = XFS_BTNUM_REFC, .type = XFS_BTNUM_REFC,
.need_init = xfs_sb_version_hasreflink(&mp->m_sb) .need_init = xfs_has_reflink(mp)
}, },
{ /* NULL terminating block */ { /* NULL terminating block */
.daddr = XFS_BUF_DADDR_NULL, .daddr = XFS_BUF_DADDR_NULL,

View File

@@ -51,7 +51,7 @@ xfs_agfl_size(
{ {
unsigned int size = mp->m_sb.sb_sectsize; unsigned int size = mp->m_sb.sb_sectsize;
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
size -= sizeof(struct xfs_agfl); size -= sizeof(struct xfs_agfl);
return size / sizeof(xfs_agblock_t); return size / sizeof(xfs_agblock_t);
@@ -61,9 +61,9 @@ unsigned int
xfs_refc_block( xfs_refc_block(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
return XFS_RMAP_BLOCK(mp) + 1; return XFS_RMAP_BLOCK(mp) + 1;
if (xfs_sb_version_hasfinobt(&mp->m_sb)) if (xfs_has_finobt(mp))
return XFS_FIBT_BLOCK(mp) + 1; return XFS_FIBT_BLOCK(mp) + 1;
return XFS_IBT_BLOCK(mp) + 1; return XFS_IBT_BLOCK(mp) + 1;
} }
@@ -72,11 +72,11 @@ xfs_extlen_t
xfs_prealloc_blocks( xfs_prealloc_blocks(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
return xfs_refc_block(mp) + 1; return xfs_refc_block(mp) + 1;
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
return XFS_RMAP_BLOCK(mp) + 1; return XFS_RMAP_BLOCK(mp) + 1;
if (xfs_sb_version_hasfinobt(&mp->m_sb)) if (xfs_has_finobt(mp))
return XFS_FIBT_BLOCK(mp) + 1; return XFS_FIBT_BLOCK(mp) + 1;
return XFS_IBT_BLOCK(mp) + 1; return XFS_IBT_BLOCK(mp) + 1;
} }
@@ -126,11 +126,11 @@ xfs_alloc_ag_max_usable(
blocks = XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)); /* ag headers */ blocks = XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)); /* ag headers */
blocks += XFS_ALLOC_AGFL_RESERVE; blocks += XFS_ALLOC_AGFL_RESERVE;
blocks += 3; /* AGF, AGI btree root blocks */ blocks += 3; /* AGF, AGI btree root blocks */
if (xfs_sb_version_hasfinobt(&mp->m_sb)) if (xfs_has_finobt(mp))
blocks++; /* finobt root block */ blocks++; /* finobt root block */
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
blocks++; /* rmap root block */ blocks++; /* rmap root block */
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
blocks++; /* refcount root block */ blocks++; /* refcount root block */
return mp->m_sb.sb_agblocks - blocks; return mp->m_sb.sb_agblocks - blocks;
@@ -598,7 +598,7 @@ xfs_agfl_verify(
* AGFL is what the AGF says is active. We can't get to the AGF, so we * AGFL is what the AGF says is active. We can't get to the AGF, so we
* can't verify just those entries are valid. * can't verify just those entries are valid.
*/ */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return NULL; return NULL;
if (!xfs_verify_magic(bp, agfl->agfl_magicnum)) if (!xfs_verify_magic(bp, agfl->agfl_magicnum))
@@ -638,7 +638,7 @@ xfs_agfl_read_verify(
* AGFL is what the AGF says is active. We can't get to the AGF, so we * AGFL is what the AGF says is active. We can't get to the AGF, so we
* can't verify just those entries are valid. * can't verify just those entries are valid.
*/ */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF)) if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF))
@@ -659,7 +659,7 @@ xfs_agfl_write_verify(
xfs_failaddr_t fa; xfs_failaddr_t fa;
/* no verification of non-crc AGFLs */ /* no verification of non-crc AGFLs */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
fa = xfs_agfl_verify(bp); fa = xfs_agfl_verify(bp);
@@ -2264,7 +2264,7 @@ xfs_alloc_min_freelist(
min_free += min_t(unsigned int, levels[XFS_BTNUM_CNTi] + 1, min_free += min_t(unsigned int, levels[XFS_BTNUM_CNTi] + 1,
mp->m_ag_maxlevels); mp->m_ag_maxlevels);
/* space needed reverse mapping used space btree */ /* space needed reverse mapping used space btree */
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
min_free += min_t(unsigned int, levels[XFS_BTNUM_RMAPi] + 1, min_free += min_t(unsigned int, levels[XFS_BTNUM_RMAPi] + 1,
mp->m_rmap_maxlevels); mp->m_rmap_maxlevels);
@@ -2373,7 +2373,7 @@ xfs_agfl_needs_reset(
int active; int active;
/* no agfl header on v4 supers */ /* no agfl header on v4 supers */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return false; return false;
/* /*
@@ -2877,7 +2877,7 @@ xfs_agf_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
struct xfs_agf *agf = bp->b_addr; struct xfs_agf *agf = bp->b_addr;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (!xfs_log_check_lsn(mp, be64_to_cpu(agf->agf_lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(agf->agf_lsn)))
@@ -2907,12 +2907,12 @@ xfs_agf_verify(
be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > mp->m_ag_maxlevels) be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > mp->m_ag_maxlevels)
return __this_address; return __this_address;
if (xfs_sb_version_hasrmapbt(&mp->m_sb) && if (xfs_has_rmapbt(mp) &&
(be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) < 1 || (be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) < 1 ||
be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > mp->m_rmap_maxlevels)) be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > mp->m_rmap_maxlevels))
return __this_address; return __this_address;
if (xfs_sb_version_hasrmapbt(&mp->m_sb) && if (xfs_has_rmapbt(mp) &&
be32_to_cpu(agf->agf_rmap_blocks) > be32_to_cpu(agf->agf_length)) be32_to_cpu(agf->agf_rmap_blocks) > be32_to_cpu(agf->agf_length))
return __this_address; return __this_address;
@@ -2925,16 +2925,16 @@ xfs_agf_verify(
if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno) if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno)
return __this_address; return __this_address;
if (xfs_sb_version_haslazysbcount(&mp->m_sb) && if (xfs_has_lazysbcount(mp) &&
be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length))
return __this_address; return __this_address;
if (xfs_sb_version_hasreflink(&mp->m_sb) && if (xfs_has_reflink(mp) &&
be32_to_cpu(agf->agf_refcount_blocks) > be32_to_cpu(agf->agf_refcount_blocks) >
be32_to_cpu(agf->agf_length)) be32_to_cpu(agf->agf_length))
return __this_address; return __this_address;
if (xfs_sb_version_hasreflink(&mp->m_sb) && if (xfs_has_reflink(mp) &&
(be32_to_cpu(agf->agf_refcount_level) < 1 || (be32_to_cpu(agf->agf_refcount_level) < 1 ||
be32_to_cpu(agf->agf_refcount_level) > mp->m_refc_maxlevels)) be32_to_cpu(agf->agf_refcount_level) > mp->m_refc_maxlevels))
return __this_address; return __this_address;
@@ -2950,7 +2950,7 @@ xfs_agf_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -2975,7 +2975,7 @@ xfs_agf_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -3073,13 +3073,13 @@ xfs_alloc_read_agf(
* counter only tracks non-root blocks. * counter only tracks non-root blocks.
*/ */
allocbt_blks = pag->pagf_btreeblks; allocbt_blks = pag->pagf_btreeblks;
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
allocbt_blks -= be32_to_cpu(agf->agf_rmap_blocks) - 1; allocbt_blks -= be32_to_cpu(agf->agf_rmap_blocks) - 1;
if (allocbt_blks > 0) if (allocbt_blks > 0)
atomic64_add(allocbt_blks, &mp->m_allocbt_blks); atomic64_add(allocbt_blks, &mp->m_allocbt_blks);
} }
#ifdef DEBUG #ifdef DEBUG
else if (!XFS_FORCED_SHUTDOWN(mp)) { else if (!xfs_is_shutdown(mp)) {
ASSERT(pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks)); ASSERT(pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks));
ASSERT(pag->pagf_btreeblks == be32_to_cpu(agf->agf_btreeblks)); ASSERT(pag->pagf_btreeblks == be32_to_cpu(agf->agf_btreeblks));
ASSERT(pag->pagf_flcount == be32_to_cpu(agf->agf_flcount)); ASSERT(pag->pagf_flcount == be32_to_cpu(agf->agf_flcount));
@@ -3166,7 +3166,7 @@ xfs_alloc_vextent(
* the first a.g. fails. * the first a.g. fails.
*/ */
if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) && if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) &&
(mp->m_flags & XFS_MOUNT_32BITINODES)) { xfs_is_inode32(mp)) {
args->fsbno = XFS_AGB_TO_FSB(mp, args->fsbno = XFS_AGB_TO_FSB(mp,
((mp->m_agfrotor / rotorstep) % ((mp->m_agfrotor / rotorstep) %
mp->m_sb.sb_agcount), 0); mp->m_sb.sb_agcount), 0);
@@ -3392,7 +3392,7 @@ struct xfs_alloc_query_range_info {
STATIC int STATIC int
xfs_alloc_query_range_helper( xfs_alloc_query_range_helper(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
void *priv) void *priv)
{ {
struct xfs_alloc_query_range_info *query = priv; struct xfs_alloc_query_range_info *query = priv;
@@ -3407,8 +3407,8 @@ xfs_alloc_query_range_helper(
int int
xfs_alloc_query_range( xfs_alloc_query_range(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_alloc_rec_incore *low_rec, const struct xfs_alloc_rec_incore *low_rec,
struct xfs_alloc_rec_incore *high_rec, const struct xfs_alloc_rec_incore *high_rec,
xfs_alloc_query_range_fn fn, xfs_alloc_query_range_fn fn,
void *priv) void *priv)
{ {

View File

@@ -221,12 +221,12 @@ xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp);
typedef int (*xfs_alloc_query_range_fn)( typedef int (*xfs_alloc_query_range_fn)(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_alloc_rec_incore *rec, const struct xfs_alloc_rec_incore *rec,
void *priv); void *priv);
int xfs_alloc_query_range(struct xfs_btree_cur *cur, int xfs_alloc_query_range(struct xfs_btree_cur *cur,
struct xfs_alloc_rec_incore *low_rec, const struct xfs_alloc_rec_incore *low_rec,
struct xfs_alloc_rec_incore *high_rec, const struct xfs_alloc_rec_incore *high_rec,
xfs_alloc_query_range_fn fn, void *priv); xfs_alloc_query_range_fn fn, void *priv);
int xfs_alloc_query_all(struct xfs_btree_cur *cur, xfs_alloc_query_range_fn fn, int xfs_alloc_query_all(struct xfs_btree_cur *cur, xfs_alloc_query_range_fn fn,
void *priv); void *priv);
@@ -243,7 +243,7 @@ static inline __be32 *
xfs_buf_to_agfl_bno( xfs_buf_to_agfl_bno(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
if (xfs_sb_version_hascrc(&bp->b_mount->m_sb)) if (xfs_has_crc(bp->b_mount))
return bp->b_addr + sizeof(struct xfs_agfl); return bp->b_addr + sizeof(struct xfs_agfl);
return bp->b_addr; return bp->b_addr;
} }

View File

@@ -32,7 +32,7 @@ xfs_allocbt_dup_cursor(
STATIC void STATIC void
xfs_allocbt_set_root( xfs_allocbt_set_root(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int inc) int inc)
{ {
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
@@ -51,7 +51,7 @@ xfs_allocbt_set_root(
STATIC int STATIC int
xfs_allocbt_alloc_block( xfs_allocbt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat) int *stat)
{ {
@@ -87,7 +87,7 @@ xfs_allocbt_free_block(
xfs_agblock_t bno; xfs_agblock_t bno;
int error; int error;
bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); bno = xfs_daddr_to_agbno(cur->bc_mp, xfs_buf_daddr(bp));
error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1);
if (error) if (error)
return error; return error;
@@ -104,8 +104,8 @@ xfs_allocbt_free_block(
STATIC void STATIC void
xfs_allocbt_update_lastrec( xfs_allocbt_update_lastrec(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_btree_block *block, const struct xfs_btree_block *block,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
int ptr, int ptr,
int reason) int reason)
{ {
@@ -178,7 +178,7 @@ xfs_allocbt_get_maxrecs(
STATIC void STATIC void
xfs_allocbt_init_key_from_rec( xfs_allocbt_init_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->alloc.ar_startblock = rec->alloc.ar_startblock; key->alloc.ar_startblock = rec->alloc.ar_startblock;
key->alloc.ar_blockcount = rec->alloc.ar_blockcount; key->alloc.ar_blockcount = rec->alloc.ar_blockcount;
@@ -187,7 +187,7 @@ xfs_allocbt_init_key_from_rec(
STATIC void STATIC void
xfs_bnobt_init_high_key_from_rec( xfs_bnobt_init_high_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
__u32 x; __u32 x;
@@ -200,7 +200,7 @@ xfs_bnobt_init_high_key_from_rec(
STATIC void STATIC void
xfs_cntbt_init_high_key_from_rec( xfs_cntbt_init_high_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->alloc.ar_blockcount = rec->alloc.ar_blockcount; key->alloc.ar_blockcount = rec->alloc.ar_blockcount;
key->alloc.ar_startblock = 0; key->alloc.ar_startblock = 0;
@@ -230,10 +230,10 @@ xfs_allocbt_init_ptr_from_cur(
STATIC int64_t STATIC int64_t
xfs_bnobt_key_diff( xfs_bnobt_key_diff(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *key) const union xfs_btree_key *key)
{ {
xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; struct xfs_alloc_rec_incore *rec = &cur->bc_rec.a;
xfs_alloc_key_t *kp = &key->alloc; const struct xfs_alloc_rec *kp = &key->alloc;
return (int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; return (int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock;
} }
@@ -241,10 +241,10 @@ xfs_bnobt_key_diff(
STATIC int64_t STATIC int64_t
xfs_cntbt_key_diff( xfs_cntbt_key_diff(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *key) const union xfs_btree_key *key)
{ {
xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; struct xfs_alloc_rec_incore *rec = &cur->bc_rec.a;
xfs_alloc_key_t *kp = &key->alloc; const struct xfs_alloc_rec *kp = &key->alloc;
int64_t diff; int64_t diff;
diff = (int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount; diff = (int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount;
@@ -257,8 +257,8 @@ xfs_cntbt_key_diff(
STATIC int64_t STATIC int64_t
xfs_bnobt_diff_two_keys( xfs_bnobt_diff_two_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return (int64_t)be32_to_cpu(k1->alloc.ar_startblock) - return (int64_t)be32_to_cpu(k1->alloc.ar_startblock) -
be32_to_cpu(k2->alloc.ar_startblock); be32_to_cpu(k2->alloc.ar_startblock);
@@ -267,8 +267,8 @@ xfs_bnobt_diff_two_keys(
STATIC int64_t STATIC int64_t
xfs_cntbt_diff_two_keys( xfs_cntbt_diff_two_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
int64_t diff; int64_t diff;
@@ -295,7 +295,7 @@ xfs_allocbt_verify(
if (!xfs_verify_magic(bp, block->bb_magic)) if (!xfs_verify_magic(bp, block->bb_magic))
return __this_address; return __this_address;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
fa = xfs_btree_sblock_v5hdr_verify(bp); fa = xfs_btree_sblock_v5hdr_verify(bp);
if (fa) if (fa)
return fa; return fa;
@@ -377,8 +377,8 @@ const struct xfs_buf_ops xfs_cntbt_buf_ops = {
STATIC int STATIC int
xfs_bnobt_keys_inorder( xfs_bnobt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return be32_to_cpu(k1->alloc.ar_startblock) < return be32_to_cpu(k1->alloc.ar_startblock) <
be32_to_cpu(k2->alloc.ar_startblock); be32_to_cpu(k2->alloc.ar_startblock);
@@ -387,8 +387,8 @@ xfs_bnobt_keys_inorder(
STATIC int STATIC int
xfs_bnobt_recs_inorder( xfs_bnobt_recs_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2) const union xfs_btree_rec *r2)
{ {
return be32_to_cpu(r1->alloc.ar_startblock) + return be32_to_cpu(r1->alloc.ar_startblock) +
be32_to_cpu(r1->alloc.ar_blockcount) <= be32_to_cpu(r1->alloc.ar_blockcount) <=
@@ -398,8 +398,8 @@ xfs_bnobt_recs_inorder(
STATIC int STATIC int
xfs_cntbt_keys_inorder( xfs_cntbt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return be32_to_cpu(k1->alloc.ar_blockcount) < return be32_to_cpu(k1->alloc.ar_blockcount) <
be32_to_cpu(k2->alloc.ar_blockcount) || be32_to_cpu(k2->alloc.ar_blockcount) ||
@@ -411,8 +411,8 @@ xfs_cntbt_keys_inorder(
STATIC int STATIC int
xfs_cntbt_recs_inorder( xfs_cntbt_recs_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2) const union xfs_btree_rec *r2)
{ {
return be32_to_cpu(r1->alloc.ar_blockcount) < return be32_to_cpu(r1->alloc.ar_blockcount) <
be32_to_cpu(r2->alloc.ar_blockcount) || be32_to_cpu(r2->alloc.ar_blockcount) ||
@@ -498,7 +498,7 @@ xfs_allocbt_init_common(
atomic_inc(&pag->pag_ref); atomic_inc(&pag->pag_ref);
cur->bc_ag.pag = pag; cur->bc_ag.pag = pag;
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_flags |= XFS_BTREE_CRC_BLOCKS;
return cur; return cur;

View File

@@ -20,7 +20,7 @@ struct xbtree_afakeroot;
* Btree block header size depends on a superblock flag. * Btree block header size depends on a superblock flag.
*/ */
#define XFS_ALLOC_BLOCK_LEN(mp) \ #define XFS_ALLOC_BLOCK_LEN(mp) \
(xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ (xfs_has_crc(((mp))) ? \
XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN)
/* /*

View File

@@ -146,7 +146,7 @@ xfs_attr_get(
XFS_STATS_INC(args->dp->i_mount, xs_attr_get); XFS_STATS_INC(args->dp->i_mount, xs_attr_get);
if (XFS_FORCED_SHUTDOWN(args->dp->i_mount)) if (xfs_is_shutdown(args->dp->i_mount))
return -EIO; return -EIO;
args->geo = args->dp->i_mount->m_attr_geo; args->geo = args->dp->i_mount->m_attr_geo;
@@ -224,7 +224,7 @@ xfs_attr_try_sf_addname(
if (!error && !(args->op_flags & XFS_DA_OP_NOTIME)) if (!error && !(args->op_flags & XFS_DA_OP_NOTIME))
xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG);
if (dp->i_mount->m_flags & XFS_MOUNT_WSYNC) if (xfs_has_wsync(dp->i_mount))
xfs_trans_set_sync(args->trans); xfs_trans_set_sync(args->trans);
return error; return error;
@@ -335,6 +335,7 @@ xfs_attr_sf_addname(
* the attr fork to leaf format and will restart with the leaf * the attr fork to leaf format and will restart with the leaf
* add. * add.
*/ */
trace_xfs_attr_sf_addname_return(XFS_DAS_UNINIT, args->dp);
dac->flags |= XFS_DAC_DEFER_FINISH; dac->flags |= XFS_DAC_DEFER_FINISH;
return -EAGAIN; return -EAGAIN;
} }
@@ -394,6 +395,8 @@ xfs_attr_set_iter(
* handling code below * handling code below
*/ */
dac->flags |= XFS_DAC_DEFER_FINISH; dac->flags |= XFS_DAC_DEFER_FINISH;
trace_xfs_attr_set_iter_return(
dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} else if (error) { } else if (error) {
return error; return error;
@@ -411,6 +414,7 @@ xfs_attr_set_iter(
dac->dela_state = XFS_DAS_FOUND_NBLK; dac->dela_state = XFS_DAS_FOUND_NBLK;
} }
trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
case XFS_DAS_FOUND_LBLK: case XFS_DAS_FOUND_LBLK:
/* /*
@@ -438,6 +442,8 @@ xfs_attr_set_iter(
error = xfs_attr_rmtval_set_blk(dac); error = xfs_attr_rmtval_set_blk(dac);
if (error) if (error)
return error; return error;
trace_xfs_attr_set_iter_return(dac->dela_state,
args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -472,6 +478,7 @@ xfs_attr_set_iter(
* series. * series.
*/ */
dac->dela_state = XFS_DAS_FLIP_LFLAG; dac->dela_state = XFS_DAS_FLIP_LFLAG;
trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
case XFS_DAS_FLIP_LFLAG: case XFS_DAS_FLIP_LFLAG:
/* /*
@@ -488,11 +495,15 @@ xfs_attr_set_iter(
/* Set state in case xfs_attr_rmtval_remove returns -EAGAIN */ /* Set state in case xfs_attr_rmtval_remove returns -EAGAIN */
dac->dela_state = XFS_DAS_RM_LBLK; dac->dela_state = XFS_DAS_RM_LBLK;
if (args->rmtblkno) { if (args->rmtblkno) {
error = __xfs_attr_rmtval_remove(dac); error = xfs_attr_rmtval_remove(dac);
if (error == -EAGAIN)
trace_xfs_attr_set_iter_return(
dac->dela_state, args->dp);
if (error) if (error)
return error; return error;
dac->dela_state = XFS_DAS_RD_LEAF; dac->dela_state = XFS_DAS_RD_LEAF;
trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -542,6 +553,8 @@ xfs_attr_set_iter(
error = xfs_attr_rmtval_set_blk(dac); error = xfs_attr_rmtval_set_blk(dac);
if (error) if (error)
return error; return error;
trace_xfs_attr_set_iter_return(
dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -577,6 +590,7 @@ xfs_attr_set_iter(
* series * series
*/ */
dac->dela_state = XFS_DAS_FLIP_NFLAG; dac->dela_state = XFS_DAS_FLIP_NFLAG;
trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
case XFS_DAS_FLIP_NFLAG: case XFS_DAS_FLIP_NFLAG:
@@ -595,11 +609,16 @@ xfs_attr_set_iter(
/* Set state in case xfs_attr_rmtval_remove returns -EAGAIN */ /* Set state in case xfs_attr_rmtval_remove returns -EAGAIN */
dac->dela_state = XFS_DAS_RM_NBLK; dac->dela_state = XFS_DAS_RM_NBLK;
if (args->rmtblkno) { if (args->rmtblkno) {
error = __xfs_attr_rmtval_remove(dac); error = xfs_attr_rmtval_remove(dac);
if (error == -EAGAIN)
trace_xfs_attr_set_iter_return(
dac->dela_state, args->dp);
if (error) if (error)
return error; return error;
dac->dela_state = XFS_DAS_CLR_FLAG; dac->dela_state = XFS_DAS_CLR_FLAG;
trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -623,8 +642,8 @@ out:
/* /*
* Return EEXIST if attr is found, or ENOATTR if not * Return EEXIST if attr is found, or ENOATTR if not
*/ */
int static int
xfs_has_attr( xfs_attr_lookup(
struct xfs_da_args *args) struct xfs_da_args *args)
{ {
struct xfs_inode *dp = args->dp; struct xfs_inode *dp = args->dp;
@@ -691,7 +710,7 @@ xfs_attr_set(
int rmt_blks = 0; int rmt_blks = 0;
unsigned int total; unsigned int total;
if (XFS_FORCED_SHUTDOWN(dp->i_mount)) if (xfs_is_shutdown(dp->i_mount))
return -EIO; return -EIO;
error = xfs_qm_dqattach(dp); error = xfs_qm_dqattach(dp);
@@ -761,8 +780,8 @@ xfs_attr_set(
goto out_trans_cancel; goto out_trans_cancel;
} }
error = xfs_attr_lookup(args);
if (args->value) { if (args->value) {
error = xfs_has_attr(args);
if (error == -EEXIST && (args->attr_flags & XATTR_CREATE)) if (error == -EEXIST && (args->attr_flags & XATTR_CREATE))
goto out_trans_cancel; goto out_trans_cancel;
if (error == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) if (error == -ENOATTR && (args->attr_flags & XATTR_REPLACE))
@@ -777,7 +796,6 @@ xfs_attr_set(
if (!args->trans) if (!args->trans)
goto out_unlock; goto out_unlock;
} else { } else {
error = xfs_has_attr(args);
if (error != -EEXIST) if (error != -EEXIST)
goto out_trans_cancel; goto out_trans_cancel;
@@ -790,7 +808,7 @@ xfs_attr_set(
* If this is a synchronous mount, make sure that the * If this is a synchronous mount, make sure that the
* transaction goes to disk before returning to the user. * transaction goes to disk before returning to the user.
*/ */
if (mp->m_flags & XFS_MOUNT_WSYNC) if (xfs_has_wsync(mp))
xfs_trans_set_sync(args->trans); xfs_trans_set_sync(args->trans);
if (!(args->op_flags & XFS_DA_OP_NOTIME)) if (!(args->op_flags & XFS_DA_OP_NOTIME))
@@ -1176,6 +1194,8 @@ xfs_attr_node_addname(
* this point. * this point.
*/ */
dac->flags |= XFS_DAC_DEFER_FINISH; dac->flags |= XFS_DAC_DEFER_FINISH;
trace_xfs_attr_node_addname_return(
dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -1421,11 +1441,14 @@ xfs_attr_remove_iter(
* May return -EAGAIN. Roll and repeat until all remote * May return -EAGAIN. Roll and repeat until all remote
* blocks are removed. * blocks are removed.
*/ */
error = __xfs_attr_rmtval_remove(dac); error = xfs_attr_rmtval_remove(dac);
if (error == -EAGAIN) if (error == -EAGAIN) {
trace_xfs_attr_remove_iter_return(
dac->dela_state, args->dp);
return error; return error;
else if (error) } else if (error) {
goto out; goto out;
}
/* /*
* Refill the state structure with buffers (the prior * Refill the state structure with buffers (the prior
@@ -1438,6 +1461,7 @@ xfs_attr_remove_iter(
goto out; goto out;
dac->dela_state = XFS_DAS_RM_NAME; dac->dela_state = XFS_DAS_RM_NAME;
dac->flags |= XFS_DAC_DEFER_FINISH; dac->flags |= XFS_DAC_DEFER_FINISH;
trace_xfs_attr_remove_iter_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -1466,6 +1490,8 @@ xfs_attr_remove_iter(
dac->flags |= XFS_DAC_DEFER_FINISH; dac->flags |= XFS_DAC_DEFER_FINISH;
dac->dela_state = XFS_DAS_RM_SHRINK; dac->dela_state = XFS_DAS_RM_SHRINK;
trace_xfs_attr_remove_iter_return(
dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }
@@ -1514,7 +1540,7 @@ xfs_attr_fillstate(xfs_da_state_t *state)
ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
for (blk = path->blk, level = 0; level < path->active; blk++, level++) { for (blk = path->blk, level = 0; level < path->active; blk++, level++) {
if (blk->bp) { if (blk->bp) {
blk->disk_blkno = XFS_BUF_ADDR(blk->bp); blk->disk_blkno = xfs_buf_daddr(blk->bp);
blk->bp = NULL; blk->bp = NULL;
} else { } else {
blk->disk_blkno = 0; blk->disk_blkno = 0;
@@ -1529,7 +1555,7 @@ xfs_attr_fillstate(xfs_da_state_t *state)
ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
for (blk = path->blk, level = 0; level < path->active; blk++, level++) { for (blk = path->blk, level = 0; level < path->active; blk++, level++) {
if (blk->bp) { if (blk->bp) {
blk->disk_blkno = XFS_BUF_ADDR(blk->bp); blk->disk_blkno = xfs_buf_daddr(blk->bp);
blk->bp = NULL; blk->bp = NULL;
} else { } else {
blk->disk_blkno = 0; blk->disk_blkno = 0;

View File

@@ -490,7 +490,6 @@ int xfs_attr_get_ilocked(struct xfs_da_args *args);
int xfs_attr_get(struct xfs_da_args *args); int xfs_attr_get(struct xfs_da_args *args);
int xfs_attr_set(struct xfs_da_args *args); int xfs_attr_set(struct xfs_da_args *args);
int xfs_attr_set_args(struct xfs_da_args *args); int xfs_attr_set_args(struct xfs_da_args *args);
int xfs_has_attr(struct xfs_da_args *args);
int xfs_attr_remove_args(struct xfs_da_args *args); int xfs_attr_remove_args(struct xfs_da_args *args);
int xfs_attr_remove_iter(struct xfs_delattr_context *dac); int xfs_attr_remove_iter(struct xfs_delattr_context *dac);
bool xfs_attr_namecheck(const void *name, size_t length); bool xfs_attr_namecheck(const void *name, size_t length);

View File

@@ -384,7 +384,7 @@ xfs_attr3_leaf_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -406,7 +406,7 @@ xfs_attr3_leaf_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -489,7 +489,7 @@ xfs_attr_copy_value(
} }
if (!args->value) { if (!args->value) {
args->value = kmem_alloc_large(valuelen, KM_NOLOCKDEP); args->value = kvmalloc(valuelen, GFP_KERNEL | __GFP_NOLOCKDEP);
if (!args->value) if (!args->value)
return -ENOMEM; return -ENOMEM;
} }
@@ -568,7 +568,7 @@ xfs_attr_shortform_bytesfit(
* literal area, but for the old format we are done if there is no * literal area, but for the old format we are done if there is no
* space in the fixed attribute fork. * space in the fixed attribute fork.
*/ */
if (!(mp->m_flags & XFS_MOUNT_ATTR2)) if (!xfs_has_attr2(mp))
return 0; return 0;
dsize = dp->i_df.if_bytes; dsize = dp->i_df.if_bytes;
@@ -621,21 +621,27 @@ xfs_attr_shortform_bytesfit(
} }
/* /*
* Switch on the ATTR2 superblock bit (implies also FEATURES2) * Switch on the ATTR2 superblock bit (implies also FEATURES2) unless:
* - noattr2 mount option is set,
* - on-disk version bit says it is already set, or
* - the attr2 mount option is not set to enable automatic upgrade from attr1.
*/ */
STATIC void STATIC void
xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) xfs_sbversion_add_attr2(
struct xfs_mount *mp,
struct xfs_trans *tp)
{ {
if ((mp->m_flags & XFS_MOUNT_ATTR2) && if (xfs_has_noattr2(mp))
!(xfs_sb_version_hasattr2(&mp->m_sb))) { return;
if (mp->m_sb.sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
return;
if (!xfs_has_attr2(mp))
return;
spin_lock(&mp->m_sb_lock); spin_lock(&mp->m_sb_lock);
if (!xfs_sb_version_hasattr2(&mp->m_sb)) { xfs_add_attr2(mp);
xfs_sb_version_addattr2(&mp->m_sb);
spin_unlock(&mp->m_sb_lock); spin_unlock(&mp->m_sb_lock);
xfs_log_sb(tp); xfs_log_sb(tp);
} else
spin_unlock(&mp->m_sb_lock);
}
} }
/* /*
@@ -810,8 +816,7 @@ xfs_attr_sf_removename(
* Fix up the start offset of the attribute fork * Fix up the start offset of the attribute fork
*/ */
totsize -= size; totsize -= size;
if (totsize == sizeof(xfs_attr_sf_hdr_t) && if (totsize == sizeof(xfs_attr_sf_hdr_t) && xfs_has_attr2(mp) &&
(mp->m_flags & XFS_MOUNT_ATTR2) &&
(dp->i_df.if_format != XFS_DINODE_FMT_BTREE) && (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
!(args->op_flags & XFS_DA_OP_ADDNAME)) { !(args->op_flags & XFS_DA_OP_ADDNAME)) {
xfs_attr_fork_remove(dp, args->trans); xfs_attr_fork_remove(dp, args->trans);
@@ -821,7 +826,7 @@ xfs_attr_sf_removename(
ASSERT(dp->i_forkoff); ASSERT(dp->i_forkoff);
ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) ||
(args->op_flags & XFS_DA_OP_ADDNAME) || (args->op_flags & XFS_DA_OP_ADDNAME) ||
!(mp->m_flags & XFS_MOUNT_ATTR2) || !xfs_has_attr2(mp) ||
dp->i_df.if_format == XFS_DINODE_FMT_BTREE); dp->i_df.if_format == XFS_DINODE_FMT_BTREE);
xfs_trans_log_inode(args->trans, dp, xfs_trans_log_inode(args->trans, dp,
XFS_ILOG_CORE | XFS_ILOG_ADATA); XFS_ILOG_CORE | XFS_ILOG_ADATA);
@@ -997,7 +1002,7 @@ xfs_attr_shortform_allfit(
bytes += xfs_attr_sf_entsize_byname(name_loc->namelen, bytes += xfs_attr_sf_entsize_byname(name_loc->namelen,
be16_to_cpu(name_loc->valuelen)); be16_to_cpu(name_loc->valuelen));
} }
if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) && if (xfs_has_attr2(dp->i_mount) &&
(dp->i_df.if_format != XFS_DINODE_FMT_BTREE) && (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) &&
(bytes == sizeof(struct xfs_attr_sf_hdr))) (bytes == sizeof(struct xfs_attr_sf_hdr)))
return -1; return -1;
@@ -1122,7 +1127,7 @@ xfs_attr3_leaf_to_shortform(
goto out; goto out;
if (forkoff == -1) { if (forkoff == -1) {
ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); ASSERT(xfs_has_attr2(dp->i_mount));
ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE); ASSERT(dp->i_df.if_format != XFS_DINODE_FMT_BTREE);
xfs_attr_fork_remove(dp, args->trans); xfs_attr_fork_remove(dp, args->trans);
goto out; goto out;
@@ -1199,9 +1204,9 @@ xfs_attr3_leaf_to_node(
xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF);
bp2->b_ops = bp1->b_ops; bp2->b_ops = bp1->b_ops;
memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize);
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; struct xfs_da3_blkinfo *hdr3 = bp2->b_addr;
hdr3->blkno = cpu_to_be64(bp2->b_bn); hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp2));
} }
xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1);
@@ -1264,12 +1269,12 @@ xfs_attr3_leaf_create(
memset(&ichdr, 0, sizeof(ichdr)); memset(&ichdr, 0, sizeof(ichdr));
ichdr.firstused = args->geo->blksize; ichdr.firstused = args->geo->blksize;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_da3_blkinfo *hdr3 = bp->b_addr; struct xfs_da3_blkinfo *hdr3 = bp->b_addr;
ichdr.magic = XFS_ATTR3_LEAF_MAGIC; ichdr.magic = XFS_ATTR3_LEAF_MAGIC;
hdr3->blkno = cpu_to_be64(bp->b_bn); hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp));
hdr3->owner = cpu_to_be64(dp->i_ino); hdr3->owner = cpu_to_be64(dp->i_ino);
uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);

View File

@@ -51,7 +51,7 @@ xfs_attr3_rmt_blocks(
struct xfs_mount *mp, struct xfs_mount *mp,
int attrlen) int attrlen)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
int buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); int buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize);
return (attrlen + buflen - 1) / buflen; return (attrlen + buflen - 1) / buflen;
} }
@@ -126,11 +126,11 @@ __xfs_attr3_rmt_read_verify(
int blksize = mp->m_attr_geo->blksize; int blksize = mp->m_attr_geo->blksize;
/* no verification of non-crc buffers */ /* no verification of non-crc buffers */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return 0; return 0;
ptr = bp->b_addr; ptr = bp->b_addr;
bno = bp->b_bn; bno = xfs_buf_daddr(bp);
len = BBTOB(bp->b_length); len = BBTOB(bp->b_length);
ASSERT(len >= blksize); ASSERT(len >= blksize);
@@ -191,11 +191,11 @@ xfs_attr3_rmt_write_verify(
xfs_daddr_t bno; xfs_daddr_t bno;
/* no verification of non-crc buffers */ /* no verification of non-crc buffers */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
ptr = bp->b_addr; ptr = bp->b_addr;
bno = bp->b_bn; bno = xfs_buf_daddr(bp);
len = BBTOB(bp->b_length); len = BBTOB(bp->b_length);
ASSERT(len >= blksize); ASSERT(len >= blksize);
@@ -246,7 +246,7 @@ xfs_attr3_rmt_hdr_set(
{ {
struct xfs_attr3_rmt_hdr *rmt = ptr; struct xfs_attr3_rmt_hdr *rmt = ptr;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return 0; return 0;
rmt->rm_magic = cpu_to_be32(XFS_ATTR3_RMT_MAGIC); rmt->rm_magic = cpu_to_be32(XFS_ATTR3_RMT_MAGIC);
@@ -284,7 +284,7 @@ xfs_attr_rmtval_copyout(
uint8_t **dst) uint8_t **dst)
{ {
char *src = bp->b_addr; char *src = bp->b_addr;
xfs_daddr_t bno = bp->b_bn; xfs_daddr_t bno = xfs_buf_daddr(bp);
int len = BBTOB(bp->b_length); int len = BBTOB(bp->b_length);
int blksize = mp->m_attr_geo->blksize; int blksize = mp->m_attr_geo->blksize;
@@ -296,7 +296,7 @@ xfs_attr_rmtval_copyout(
byte_cnt = min(*valuelen, byte_cnt); byte_cnt = min(*valuelen, byte_cnt);
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (xfs_attr3_rmt_hdr_ok(src, ino, *offset, if (xfs_attr3_rmt_hdr_ok(src, ino, *offset,
byte_cnt, bno)) { byte_cnt, bno)) {
xfs_alert(mp, xfs_alert(mp,
@@ -332,7 +332,7 @@ xfs_attr_rmtval_copyin(
uint8_t **src) uint8_t **src)
{ {
char *dst = bp->b_addr; char *dst = bp->b_addr;
xfs_daddr_t bno = bp->b_bn; xfs_daddr_t bno = xfs_buf_daddr(bp);
int len = BBTOB(bp->b_length); int len = BBTOB(bp->b_length);
int blksize = mp->m_attr_geo->blksize; int blksize = mp->m_attr_geo->blksize;
@@ -672,7 +672,7 @@ xfs_attr_rmtval_invalidate(
* routine until it returns something other than -EAGAIN. * routine until it returns something other than -EAGAIN.
*/ */
int int
__xfs_attr_rmtval_remove( xfs_attr_rmtval_remove(
struct xfs_delattr_context *dac) struct xfs_delattr_context *dac)
{ {
struct xfs_da_args *args = dac->da_args; struct xfs_da_args *args = dac->da_args;
@@ -696,6 +696,7 @@ __xfs_attr_rmtval_remove(
*/ */
if (!done) { if (!done) {
dac->flags |= XFS_DAC_DEFER_FINISH; dac->flags |= XFS_DAC_DEFER_FINISH;
trace_xfs_attr_rmtval_remove_return(dac->dela_state, args->dp);
return -EAGAIN; return -EAGAIN;
} }

View File

@@ -12,7 +12,7 @@ int xfs_attr_rmtval_get(struct xfs_da_args *args);
int xfs_attr_rmtval_stale(struct xfs_inode *ip, struct xfs_bmbt_irec *map, int xfs_attr_rmtval_stale(struct xfs_inode *ip, struct xfs_bmbt_irec *map,
xfs_buf_flags_t incore_flags); xfs_buf_flags_t incore_flags);
int xfs_attr_rmtval_invalidate(struct xfs_da_args *args); int xfs_attr_rmtval_invalidate(struct xfs_da_args *args);
int __xfs_attr_rmtval_remove(struct xfs_delattr_context *dac); int xfs_attr_rmtval_remove(struct xfs_delattr_context *dac);
int xfs_attr_rmt_find_hole(struct xfs_da_args *args); int xfs_attr_rmt_find_hole(struct xfs_da_args *args);
int xfs_attr_rmtval_set_value(struct xfs_da_args *args); int xfs_attr_rmtval_set_value(struct xfs_da_args *args);
int xfs_attr_rmtval_set_blk(struct xfs_delattr_context *dac); int xfs_attr_rmtval_set_blk(struct xfs_delattr_context *dac);

View File

@@ -242,7 +242,7 @@ xfs_bmap_get_bp(
for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) { for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) {
if (!cur->bc_bufs[i]) if (!cur->bc_bufs[i])
break; break;
if (XFS_BUF_ADDR(cur->bc_bufs[i]) == bno) if (xfs_buf_daddr(cur->bc_bufs[i]) == bno)
return cur->bc_bufs[i]; return cur->bc_bufs[i];
} }
@@ -251,7 +251,7 @@ xfs_bmap_get_bp(
struct xfs_buf_log_item *bip = (struct xfs_buf_log_item *)lip; struct xfs_buf_log_item *bip = (struct xfs_buf_log_item *)lip;
if (bip->bli_item.li_type == XFS_LI_BUF && if (bip->bli_item.li_type == XFS_LI_BUF &&
XFS_BUF_ADDR(bip->bli_buf) == bno) xfs_buf_daddr(bip->bli_buf) == bno)
return bip->bli_buf; return bip->bli_buf;
} }
@@ -739,7 +739,7 @@ xfs_bmap_extents_to_btree(
*/ */
abp->b_ops = &xfs_bmbt_buf_ops; abp->b_ops = &xfs_bmbt_buf_ops;
ablock = XFS_BUF_TO_BLOCK(abp); ablock = XFS_BUF_TO_BLOCK(abp);
xfs_btree_init_block_int(mp, ablock, abp->b_bn, xfs_btree_init_block_int(mp, ablock, xfs_buf_daddr(abp),
XFS_BTNUM_BMAP, 0, 0, ip->i_ino, XFS_BTNUM_BMAP, 0, 0, ip->i_ino,
XFS_BTREE_LONG_PTRS); XFS_BTREE_LONG_PTRS);
@@ -1047,7 +1047,7 @@ xfs_bmap_set_attrforkoff(
ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size); ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size);
if (!ip->i_forkoff) if (!ip->i_forkoff)
ip->i_forkoff = default_size; ip->i_forkoff = default_size;
else if ((ip->i_mount->m_flags & XFS_MOUNT_ATTR2) && version) else if (xfs_has_attr2(ip->i_mount) && version)
*version = 2; *version = 2;
break; break;
default: default:
@@ -1115,17 +1115,17 @@ xfs_bmap_add_attrfork(
xfs_trans_log_inode(tp, ip, logflags); xfs_trans_log_inode(tp, ip, logflags);
if (error) if (error)
goto trans_cancel; goto trans_cancel;
if (!xfs_sb_version_hasattr(&mp->m_sb) || if (!xfs_has_attr(mp) ||
(!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { (!xfs_has_attr2(mp) && version == 2)) {
bool log_sb = false; bool log_sb = false;
spin_lock(&mp->m_sb_lock); spin_lock(&mp->m_sb_lock);
if (!xfs_sb_version_hasattr(&mp->m_sb)) { if (!xfs_has_attr(mp)) {
xfs_sb_version_addattr(&mp->m_sb); xfs_add_attr(mp);
log_sb = true; log_sb = true;
} }
if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { if (!xfs_has_attr2(mp) && version == 2) {
xfs_sb_version_addattr2(&mp->m_sb); xfs_add_attr2(mp);
log_sb = true; log_sb = true;
} }
spin_unlock(&mp->m_sb_lock); spin_unlock(&mp->m_sb_lock);
@@ -3422,7 +3422,7 @@ xfs_bmap_compute_alignments(
int stripe_align = 0; int stripe_align = 0;
/* stripe alignment for allocation is determined by mount parameters */ /* stripe alignment for allocation is determined by mount parameters */
if (mp->m_swidth && (mp->m_flags & XFS_MOUNT_SWALLOC)) if (mp->m_swidth && xfs_has_swalloc(mp))
stripe_align = mp->m_swidth; stripe_align = mp->m_swidth;
else if (mp->m_dalign) else if (mp->m_dalign)
stripe_align = mp->m_dalign; stripe_align = mp->m_dalign;
@@ -3938,7 +3938,7 @@ xfs_bmapi_read(
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT))
return -EFSCORRUPTED; return -EFSCORRUPTED;
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
XFS_STATS_INC(mp, xs_blk_mapr); XFS_STATS_INC(mp, xs_blk_mapr);
@@ -4420,7 +4420,7 @@ xfs_bmapi_write(
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
XFS_STATS_INC(mp, xs_blk_mapw); XFS_STATS_INC(mp, xs_blk_mapw);
@@ -4703,7 +4703,7 @@ xfs_bmapi_remap(
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
error = xfs_iread_extents(tp, ip, whichfork); error = xfs_iread_extents(tp, ip, whichfork);
@@ -5361,7 +5361,7 @@ __xfs_bunmapi(
ifp = XFS_IFORK_PTR(ip, whichfork); ifp = XFS_IFORK_PTR(ip, whichfork);
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp))) if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)))
return -EFSCORRUPTED; return -EFSCORRUPTED;
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
@@ -5852,7 +5852,7 @@ xfs_bmap_collapse_extents(
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL));
@@ -5930,7 +5930,7 @@ xfs_bmap_can_insert_extents(
ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
if (XFS_FORCED_SHUTDOWN(ip->i_mount)) if (xfs_is_shutdown(ip->i_mount))
return -EIO; return -EIO;
xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_ilock(ip, XFS_ILOCK_EXCL);
@@ -5967,7 +5967,7 @@ xfs_bmap_insert_extents(
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL));
@@ -6070,7 +6070,7 @@ xfs_bmap_split_extent(
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
/* Read in all the extents */ /* Read in all the extents */

View File

@@ -58,7 +58,7 @@ xfs_bmdr_to_bmbt(
void void
xfs_bmbt_disk_get_all( xfs_bmbt_disk_get_all(
struct xfs_bmbt_rec *rec, const struct xfs_bmbt_rec *rec,
struct xfs_bmbt_irec *irec) struct xfs_bmbt_irec *irec)
{ {
uint64_t l0 = get_unaligned_be64(&rec->l0); uint64_t l0 = get_unaligned_be64(&rec->l0);
@@ -78,7 +78,7 @@ xfs_bmbt_disk_get_all(
*/ */
xfs_filblks_t xfs_filblks_t
xfs_bmbt_disk_get_blockcount( xfs_bmbt_disk_get_blockcount(
xfs_bmbt_rec_t *r) const struct xfs_bmbt_rec *r)
{ {
return (xfs_filblks_t)(be64_to_cpu(r->l1) & xfs_mask64lo(21)); return (xfs_filblks_t)(be64_to_cpu(r->l1) & xfs_mask64lo(21));
} }
@@ -88,7 +88,7 @@ xfs_bmbt_disk_get_blockcount(
*/ */
xfs_fileoff_t xfs_fileoff_t
xfs_bmbt_disk_get_startoff( xfs_bmbt_disk_get_startoff(
xfs_bmbt_rec_t *r) const struct xfs_bmbt_rec *r)
{ {
return ((xfs_fileoff_t)be64_to_cpu(r->l0) & return ((xfs_fileoff_t)be64_to_cpu(r->l0) &
xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9;
@@ -136,7 +136,7 @@ xfs_bmbt_to_bmdr(
xfs_bmbt_key_t *tkp; xfs_bmbt_key_t *tkp;
__be64 *tpp; __be64 *tpp;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_CRC_MAGIC)); ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_CRC_MAGIC));
ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid,
&mp->m_sb.sb_meta_uuid)); &mp->m_sb.sb_meta_uuid));
@@ -194,7 +194,7 @@ xfs_bmbt_update_cursor(
STATIC int STATIC int
xfs_bmbt_alloc_block( xfs_bmbt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat) int *stat)
{ {
@@ -282,7 +282,7 @@ xfs_bmbt_free_block(
struct xfs_mount *mp = cur->bc_mp; struct xfs_mount *mp = cur->bc_mp;
struct xfs_inode *ip = cur->bc_ino.ip; struct xfs_inode *ip = cur->bc_ino.ip;
struct xfs_trans *tp = cur->bc_tp; struct xfs_trans *tp = cur->bc_tp;
xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, xfs_buf_daddr(bp));
struct xfs_owner_info oinfo; struct xfs_owner_info oinfo;
xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_ino.whichfork); xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_ino.whichfork);
@@ -353,7 +353,7 @@ xfs_bmbt_get_dmaxrecs(
STATIC void STATIC void
xfs_bmbt_init_key_from_rec( xfs_bmbt_init_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->bmbt.br_startoff = key->bmbt.br_startoff =
cpu_to_be64(xfs_bmbt_disk_get_startoff(&rec->bmbt)); cpu_to_be64(xfs_bmbt_disk_get_startoff(&rec->bmbt));
@@ -362,7 +362,7 @@ xfs_bmbt_init_key_from_rec(
STATIC void STATIC void
xfs_bmbt_init_high_key_from_rec( xfs_bmbt_init_high_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->bmbt.br_startoff = cpu_to_be64( key->bmbt.br_startoff = cpu_to_be64(
xfs_bmbt_disk_get_startoff(&rec->bmbt) + xfs_bmbt_disk_get_startoff(&rec->bmbt) +
@@ -388,7 +388,7 @@ xfs_bmbt_init_ptr_from_cur(
STATIC int64_t STATIC int64_t
xfs_bmbt_key_diff( xfs_bmbt_key_diff(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *key) const union xfs_btree_key *key)
{ {
return (int64_t)be64_to_cpu(key->bmbt.br_startoff) - return (int64_t)be64_to_cpu(key->bmbt.br_startoff) -
cur->bc_rec.b.br_startoff; cur->bc_rec.b.br_startoff;
@@ -397,8 +397,8 @@ xfs_bmbt_key_diff(
STATIC int64_t STATIC int64_t
xfs_bmbt_diff_two_keys( xfs_bmbt_diff_two_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
uint64_t a = be64_to_cpu(k1->bmbt.br_startoff); uint64_t a = be64_to_cpu(k1->bmbt.br_startoff);
uint64_t b = be64_to_cpu(k2->bmbt.br_startoff); uint64_t b = be64_to_cpu(k2->bmbt.br_startoff);
@@ -428,7 +428,7 @@ xfs_bmbt_verify(
if (!xfs_verify_magic(bp, block->bb_magic)) if (!xfs_verify_magic(bp, block->bb_magic))
return __this_address; return __this_address;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
/* /*
* XXX: need a better way of verifying the owner here. Right now * XXX: need a better way of verifying the owner here. Right now
* just make sure there has been one set. * just make sure there has been one set.
@@ -498,8 +498,8 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = {
STATIC int STATIC int
xfs_bmbt_keys_inorder( xfs_bmbt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return be64_to_cpu(k1->bmbt.br_startoff) < return be64_to_cpu(k1->bmbt.br_startoff) <
be64_to_cpu(k2->bmbt.br_startoff); be64_to_cpu(k2->bmbt.br_startoff);
@@ -508,8 +508,8 @@ xfs_bmbt_keys_inorder(
STATIC int STATIC int
xfs_bmbt_recs_inorder( xfs_bmbt_recs_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2) const union xfs_btree_rec *r2)
{ {
return xfs_bmbt_disk_get_startoff(&r1->bmbt) + return xfs_bmbt_disk_get_startoff(&r1->bmbt) +
xfs_bmbt_disk_get_blockcount(&r1->bmbt) <= xfs_bmbt_disk_get_blockcount(&r1->bmbt) <=
@@ -563,7 +563,7 @@ xfs_bmbt_init_cursor(
cur->bc_ops = &xfs_bmbt_ops; cur->bc_ops = &xfs_bmbt_ops;
cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE; cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE;
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_flags |= XFS_BTREE_CRC_BLOCKS;
cur->bc_ino.forksize = XFS_IFORK_SIZE(ip, whichfork); cur->bc_ino.forksize = XFS_IFORK_SIZE(ip, whichfork);

View File

@@ -16,7 +16,7 @@ struct xfs_trans;
* Btree block header size depends on a superblock flag. * Btree block header size depends on a superblock flag.
*/ */
#define XFS_BMBT_BLOCK_LEN(mp) \ #define XFS_BMBT_BLOCK_LEN(mp) \
(xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ (xfs_has_crc(((mp))) ? \
XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN) XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN)
#define XFS_BMBT_REC_ADDR(mp, block, index) \ #define XFS_BMBT_REC_ADDR(mp, block, index) \
@@ -88,9 +88,10 @@ extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int,
struct xfs_btree_block *, int); struct xfs_btree_block *, int);
void xfs_bmbt_disk_set_all(struct xfs_bmbt_rec *r, struct xfs_bmbt_irec *s); void xfs_bmbt_disk_set_all(struct xfs_bmbt_rec *r, struct xfs_bmbt_irec *s);
extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(const struct xfs_bmbt_rec *r);
extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(const struct xfs_bmbt_rec *r);
extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); void xfs_bmbt_disk_get_all(const struct xfs_bmbt_rec *r,
struct xfs_bmbt_irec *s);
extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int, extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int,
xfs_bmdr_block_t *, int); xfs_bmdr_block_t *, int);

View File

@@ -64,13 +64,13 @@ __xfs_btree_check_lblock(
{ {
struct xfs_mount *mp = cur->bc_mp; struct xfs_mount *mp = cur->bc_mp;
xfs_btnum_t btnum = cur->bc_btnum; xfs_btnum_t btnum = cur->bc_btnum;
int crc = xfs_sb_version_hascrc(&mp->m_sb); int crc = xfs_has_crc(mp);
if (crc) { if (crc) {
if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (block->bb_u.l.bb_blkno != if (block->bb_u.l.bb_blkno !=
cpu_to_be64(bp ? bp->b_bn : XFS_BUF_DADDR_NULL)) cpu_to_be64(bp ? xfs_buf_daddr(bp) : XFS_BUF_DADDR_NULL))
return __this_address; return __this_address;
if (block->bb_u.l.bb_pad != cpu_to_be32(0)) if (block->bb_u.l.bb_pad != cpu_to_be32(0))
return __this_address; return __this_address;
@@ -129,13 +129,13 @@ __xfs_btree_check_sblock(
{ {
struct xfs_mount *mp = cur->bc_mp; struct xfs_mount *mp = cur->bc_mp;
xfs_btnum_t btnum = cur->bc_btnum; xfs_btnum_t btnum = cur->bc_btnum;
int crc = xfs_sb_version_hascrc(&mp->m_sb); int crc = xfs_has_crc(mp);
if (crc) { if (crc) {
if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (block->bb_u.s.bb_blkno != if (block->bb_u.s.bb_blkno !=
cpu_to_be64(bp ? bp->b_bn : XFS_BUF_DADDR_NULL)) cpu_to_be64(bp ? xfs_buf_daddr(bp) : XFS_BUF_DADDR_NULL))
return __this_address; return __this_address;
} }
@@ -226,7 +226,7 @@ xfs_btree_check_sptr(
static int static int
xfs_btree_check_ptr( xfs_btree_check_ptr(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int index, int index,
int level) int level)
{ {
@@ -273,7 +273,7 @@ xfs_btree_lblock_calc_crc(
struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp);
struct xfs_buf_log_item *bip = bp->b_log_item; struct xfs_buf_log_item *bip = bp->b_log_item;
if (!xfs_sb_version_hascrc(&bp->b_mount->m_sb)) if (!xfs_has_crc(bp->b_mount))
return; return;
if (bip) if (bip)
block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn);
@@ -287,7 +287,7 @@ xfs_btree_lblock_verify_crc(
struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp);
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!xfs_log_check_lsn(mp, be64_to_cpu(block->bb_u.l.bb_lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(block->bb_u.l.bb_lsn)))
return false; return false;
return xfs_buf_verify_cksum(bp, XFS_BTREE_LBLOCK_CRC_OFF); return xfs_buf_verify_cksum(bp, XFS_BTREE_LBLOCK_CRC_OFF);
@@ -311,7 +311,7 @@ xfs_btree_sblock_calc_crc(
struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp);
struct xfs_buf_log_item *bip = bp->b_log_item; struct xfs_buf_log_item *bip = bp->b_log_item;
if (!xfs_sb_version_hascrc(&bp->b_mount->m_sb)) if (!xfs_has_crc(bp->b_mount))
return; return;
if (bip) if (bip)
block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn);
@@ -325,7 +325,7 @@ xfs_btree_sblock_verify_crc(
struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp);
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!xfs_log_check_lsn(mp, be64_to_cpu(block->bb_u.s.bb_lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(block->bb_u.s.bb_lsn)))
return false; return false;
return xfs_buf_verify_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF); return xfs_buf_verify_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF);
@@ -374,7 +374,7 @@ xfs_btree_del_cursor(
} }
ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || cur->bc_ino.allocated == 0 || ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || cur->bc_ino.allocated == 0 ||
XFS_FORCED_SHUTDOWN(cur->bc_mp)); xfs_is_shutdown(cur->bc_mp));
if (unlikely(cur->bc_flags & XFS_BTREE_STAGING)) if (unlikely(cur->bc_flags & XFS_BTREE_STAGING))
kmem_free(cur->bc_ops); kmem_free(cur->bc_ops);
if (!(cur->bc_flags & XFS_BTREE_LONG_PTRS) && cur->bc_ag.pag) if (!(cur->bc_flags & XFS_BTREE_LONG_PTRS) && cur->bc_ag.pag)
@@ -420,7 +420,7 @@ xfs_btree_dup_cursor(
bp = cur->bc_bufs[i]; bp = cur->bc_bufs[i];
if (bp) { if (bp) {
error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp,
XFS_BUF_ADDR(bp), mp->m_bsize, xfs_buf_daddr(bp), mp->m_bsize,
0, &bp, 0, &bp,
cur->bc_ops->buf_ops); cur->bc_ops->buf_ops);
if (error) { if (error) {
@@ -936,7 +936,7 @@ xfs_btree_readahead(
STATIC int STATIC int
xfs_btree_ptr_to_daddr( xfs_btree_ptr_to_daddr(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
xfs_daddr_t *daddr) xfs_daddr_t *daddr)
{ {
xfs_fsblock_t fsbno; xfs_fsblock_t fsbno;
@@ -1013,7 +1013,7 @@ xfs_btree_setbuf(
bool bool
xfs_btree_ptr_is_null( xfs_btree_ptr_is_null(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr) const union xfs_btree_ptr *ptr)
{ {
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
return ptr->l == cpu_to_be64(NULLFSBLOCK); return ptr->l == cpu_to_be64(NULLFSBLOCK);
@@ -1061,7 +1061,7 @@ void
xfs_btree_set_sibling( xfs_btree_set_sibling(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_btree_block *block, struct xfs_btree_block *block,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int lr) int lr)
{ {
ASSERT(lr == XFS_BB_LEFTSIB || lr == XFS_BB_RIGHTSIB); ASSERT(lr == XFS_BB_LEFTSIB || lr == XFS_BB_RIGHTSIB);
@@ -1090,7 +1090,7 @@ xfs_btree_init_block_int(
__u64 owner, __u64 owner,
unsigned int flags) unsigned int flags)
{ {
int crc = xfs_sb_version_hascrc(&mp->m_sb); int crc = xfs_has_crc(mp);
__u32 magic = xfs_btree_magic(crc, btnum); __u32 magic = xfs_btree_magic(crc, btnum);
buf->bb_magic = cpu_to_be32(magic); buf->bb_magic = cpu_to_be32(magic);
@@ -1131,7 +1131,7 @@ xfs_btree_init_block(
__u16 numrecs, __u16 numrecs,
__u64 owner) __u64 owner)
{ {
xfs_btree_init_block_int(mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, xfs_btree_init_block_int(mp, XFS_BUF_TO_BLOCK(bp), xfs_buf_daddr(bp),
btnum, level, numrecs, owner, 0); btnum, level, numrecs, owner, 0);
} }
@@ -1155,9 +1155,9 @@ xfs_btree_init_block_cur(
else else
owner = cur->bc_ag.pag->pag_agno; owner = cur->bc_ag.pag->pag_agno;
xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp),
cur->bc_btnum, level, numrecs, xfs_buf_daddr(bp), cur->bc_btnum, level,
owner, cur->bc_flags); numrecs, owner, cur->bc_flags);
} }
/* /*
@@ -1192,10 +1192,10 @@ xfs_btree_buf_to_ptr(
{ {
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp,
XFS_BUF_ADDR(bp))); xfs_buf_daddr(bp)));
else { else {
ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp,
XFS_BUF_ADDR(bp))); xfs_buf_daddr(bp)));
} }
} }
@@ -1230,7 +1230,7 @@ xfs_btree_set_refs(
int int
xfs_btree_get_buf_block( xfs_btree_get_buf_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
struct xfs_btree_block **block, struct xfs_btree_block **block,
struct xfs_buf **bpp) struct xfs_buf **bpp)
{ {
@@ -1258,7 +1258,7 @@ xfs_btree_get_buf_block(
STATIC int STATIC int
xfs_btree_read_buf_block( xfs_btree_read_buf_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int flags, int flags,
struct xfs_btree_block **block, struct xfs_btree_block **block,
struct xfs_buf **bpp) struct xfs_buf **bpp)
@@ -1291,7 +1291,7 @@ void
xfs_btree_copy_keys( xfs_btree_copy_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *dst_key, union xfs_btree_key *dst_key,
union xfs_btree_key *src_key, const union xfs_btree_key *src_key,
int numkeys) int numkeys)
{ {
ASSERT(numkeys >= 0); ASSERT(numkeys >= 0);
@@ -1715,7 +1715,7 @@ int
xfs_btree_lookup_get_block( xfs_btree_lookup_get_block(
struct xfs_btree_cur *cur, /* btree cursor */ struct xfs_btree_cur *cur, /* btree cursor */
int level, /* level in the btree */ int level, /* level in the btree */
union xfs_btree_ptr *pp, /* ptr to btree block */ const union xfs_btree_ptr *pp, /* ptr to btree block */
struct xfs_btree_block **blkp) /* return btree block */ struct xfs_btree_block **blkp) /* return btree block */
{ {
struct xfs_buf *bp; /* buffer pointer for btree block */ struct xfs_buf *bp; /* buffer pointer for btree block */
@@ -1739,7 +1739,7 @@ xfs_btree_lookup_get_block(
error = xfs_btree_ptr_to_daddr(cur, pp, &daddr); error = xfs_btree_ptr_to_daddr(cur, pp, &daddr);
if (error) if (error)
return error; return error;
if (bp && XFS_BUF_ADDR(bp) == daddr) { if (bp && xfs_buf_daddr(bp) == daddr) {
*blkp = XFS_BUF_TO_BLOCK(bp); *blkp = XFS_BUF_TO_BLOCK(bp);
return 0; return 0;
} }
@@ -1749,7 +1749,7 @@ xfs_btree_lookup_get_block(
return error; return error;
/* Check the inode owner since the verifiers don't. */ /* Check the inode owner since the verifiers don't. */
if (xfs_sb_version_hascrc(&cur->bc_mp->m_sb) && if (xfs_has_crc(cur->bc_mp) &&
!(cur->bc_ino.flags & XFS_BTCUR_BMBT_INVALID_OWNER) && !(cur->bc_ino.flags & XFS_BTCUR_BMBT_INVALID_OWNER) &&
(cur->bc_flags & XFS_BTREE_LONG_PTRS) && (cur->bc_flags & XFS_BTREE_LONG_PTRS) &&
be64_to_cpu((*blkp)->bb_u.l.bb_owner) != be64_to_cpu((*blkp)->bb_u.l.bb_owner) !=
@@ -2923,10 +2923,11 @@ xfs_btree_new_iroot(
*/ */
memcpy(cblock, block, xfs_btree_block_len(cur)); memcpy(cblock, block, xfs_btree_block_len(cur));
if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) {
__be64 bno = cpu_to_be64(xfs_buf_daddr(cbp));
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
cblock->bb_u.l.bb_blkno = cpu_to_be64(cbp->b_bn); cblock->bb_u.l.bb_blkno = bno;
else else
cblock->bb_u.s.bb_blkno = cpu_to_be64(cbp->b_bn); cblock->bb_u.s.bb_blkno = bno;
} }
be16_add_cpu(&block->bb_level, 1); be16_add_cpu(&block->bb_level, 1);
@@ -3225,7 +3226,7 @@ xfs_btree_insrec(
/* Get pointers to the btree buffer and block. */ /* Get pointers to the btree buffer and block. */
block = xfs_btree_get_block(cur, level, &bp); block = xfs_btree_get_block(cur, level, &bp);
old_bn = bp ? bp->b_bn : XFS_BUF_DADDR_NULL; old_bn = bp ? xfs_buf_daddr(bp) : XFS_BUF_DADDR_NULL;
numrecs = xfs_btree_get_numrecs(block); numrecs = xfs_btree_get_numrecs(block);
#ifdef DEBUG #ifdef DEBUG
@@ -3341,7 +3342,7 @@ xfs_btree_insrec(
* some records into the new tree block), so use the regular key * some records into the new tree block), so use the regular key
* update mechanism. * update mechanism.
*/ */
if (bp && bp->b_bn != old_bn) { if (bp && xfs_buf_daddr(bp) != old_bn) {
xfs_btree_get_keys(cur, block, lkey); xfs_btree_get_keys(cur, block, lkey);
} else if (xfs_btree_needs_key_update(cur, optr)) { } else if (xfs_btree_needs_key_update(cur, optr)) {
error = xfs_btree_update_keys(cur, level); error = xfs_btree_update_keys(cur, level);
@@ -4418,11 +4419,11 @@ xfs_btree_lblock_v5hdr_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp);
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return __this_address; return __this_address;
if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (block->bb_u.l.bb_blkno != cpu_to_be64(bp->b_bn)) if (block->bb_u.l.bb_blkno != cpu_to_be64(xfs_buf_daddr(bp)))
return __this_address; return __this_address;
if (owner != XFS_RMAP_OWN_UNKNOWN && if (owner != XFS_RMAP_OWN_UNKNOWN &&
be64_to_cpu(block->bb_u.l.bb_owner) != owner) be64_to_cpu(block->bb_u.l.bb_owner) != owner)
@@ -4468,11 +4469,11 @@ xfs_btree_sblock_v5hdr_verify(
struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp);
struct xfs_perag *pag = bp->b_pag; struct xfs_perag *pag = bp->b_pag;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return __this_address; return __this_address;
if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) if (block->bb_u.s.bb_blkno != cpu_to_be64(xfs_buf_daddr(bp)))
return __this_address; return __this_address;
if (pag && be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) if (pag && be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno)
return __this_address; return __this_address;
@@ -4499,7 +4500,7 @@ xfs_btree_sblock_verify(
return __this_address; return __this_address;
/* sibling pointer verification */ /* sibling pointer verification */
agno = xfs_daddr_to_agno(mp, XFS_BUF_ADDR(bp)); agno = xfs_daddr_to_agno(mp, xfs_buf_daddr(bp));
if (block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK) && if (block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK) &&
!xfs_verify_agbno(mp, agno, be32_to_cpu(block->bb_u.s.bb_leftsib))) !xfs_verify_agbno(mp, agno, be32_to_cpu(block->bb_u.s.bb_leftsib)))
return __this_address; return __this_address;
@@ -4536,8 +4537,8 @@ xfs_btree_compute_maxlevels(
STATIC int STATIC int
xfs_btree_simple_query_range( xfs_btree_simple_query_range(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *low_key, const union xfs_btree_key *low_key,
union xfs_btree_key *high_key, const union xfs_btree_key *high_key,
xfs_btree_query_range_fn fn, xfs_btree_query_range_fn fn,
void *priv) void *priv)
{ {
@@ -4627,8 +4628,8 @@ out:
STATIC int STATIC int
xfs_btree_overlapped_query_range( xfs_btree_overlapped_query_range(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *low_key, const union xfs_btree_key *low_key,
union xfs_btree_key *high_key, const union xfs_btree_key *high_key,
xfs_btree_query_range_fn fn, xfs_btree_query_range_fn fn,
void *priv) void *priv)
{ {
@@ -4769,8 +4770,8 @@ out:
int int
xfs_btree_query_range( xfs_btree_query_range(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_irec *low_rec, const union xfs_btree_irec *low_rec,
union xfs_btree_irec *high_rec, const union xfs_btree_irec *high_rec,
xfs_btree_query_range_fn fn, xfs_btree_query_range_fn fn,
void *priv) void *priv)
{ {
@@ -4877,7 +4878,7 @@ xfs_btree_diff_two_ptrs(
STATIC int STATIC int
xfs_btree_has_record_helper( xfs_btree_has_record_helper(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
void *priv) void *priv)
{ {
return -ECANCELED; return -ECANCELED;
@@ -4887,8 +4888,8 @@ xfs_btree_has_record_helper(
int int
xfs_btree_has_record( xfs_btree_has_record(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_irec *low, const union xfs_btree_irec *low,
union xfs_btree_irec *high, const union xfs_btree_irec *high,
bool *exists) bool *exists)
{ {
int error; int error;

View File

@@ -106,19 +106,19 @@ struct xfs_btree_ops {
/* update btree root pointer */ /* update btree root pointer */
void (*set_root)(struct xfs_btree_cur *cur, void (*set_root)(struct xfs_btree_cur *cur,
union xfs_btree_ptr *nptr, int level_change); const union xfs_btree_ptr *nptr, int level_change);
/* block allocation / freeing */ /* block allocation / freeing */
int (*alloc_block)(struct xfs_btree_cur *cur, int (*alloc_block)(struct xfs_btree_cur *cur,
union xfs_btree_ptr *start_bno, const union xfs_btree_ptr *start_bno,
union xfs_btree_ptr *new_bno, union xfs_btree_ptr *new_bno,
int *stat); int *stat);
int (*free_block)(struct xfs_btree_cur *cur, struct xfs_buf *bp); int (*free_block)(struct xfs_btree_cur *cur, struct xfs_buf *bp);
/* update last record information */ /* update last record information */
void (*update_lastrec)(struct xfs_btree_cur *cur, void (*update_lastrec)(struct xfs_btree_cur *cur,
struct xfs_btree_block *block, const struct xfs_btree_block *block,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
int ptr, int reason); int ptr, int reason);
/* records in block/level */ /* records in block/level */
@@ -130,37 +130,37 @@ struct xfs_btree_ops {
/* init values of btree structures */ /* init values of btree structures */
void (*init_key_from_rec)(union xfs_btree_key *key, void (*init_key_from_rec)(union xfs_btree_key *key,
union xfs_btree_rec *rec); const union xfs_btree_rec *rec);
void (*init_rec_from_cur)(struct xfs_btree_cur *cur, void (*init_rec_from_cur)(struct xfs_btree_cur *cur,
union xfs_btree_rec *rec); union xfs_btree_rec *rec);
void (*init_ptr_from_cur)(struct xfs_btree_cur *cur, void (*init_ptr_from_cur)(struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr); union xfs_btree_ptr *ptr);
void (*init_high_key_from_rec)(union xfs_btree_key *key, void (*init_high_key_from_rec)(union xfs_btree_key *key,
union xfs_btree_rec *rec); const union xfs_btree_rec *rec);
/* difference between key value and cursor value */ /* difference between key value and cursor value */
int64_t (*key_diff)(struct xfs_btree_cur *cur, int64_t (*key_diff)(struct xfs_btree_cur *cur,
union xfs_btree_key *key); const union xfs_btree_key *key);
/* /*
* Difference between key2 and key1 -- positive if key1 > key2, * Difference between key2 and key1 -- positive if key1 > key2,
* negative if key1 < key2, and zero if equal. * negative if key1 < key2, and zero if equal.
*/ */
int64_t (*diff_two_keys)(struct xfs_btree_cur *cur, int64_t (*diff_two_keys)(struct xfs_btree_cur *cur,
union xfs_btree_key *key1, const union xfs_btree_key *key1,
union xfs_btree_key *key2); const union xfs_btree_key *key2);
const struct xfs_buf_ops *buf_ops; const struct xfs_buf_ops *buf_ops;
/* check that k1 is lower than k2 */ /* check that k1 is lower than k2 */
int (*keys_inorder)(struct xfs_btree_cur *cur, int (*keys_inorder)(struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2); const union xfs_btree_key *k2);
/* check that r1 is lower than r2 */ /* check that r1 is lower than r2 */
int (*recs_inorder)(struct xfs_btree_cur *cur, int (*recs_inorder)(struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2); const union xfs_btree_rec *r2);
}; };
/* /*
@@ -423,7 +423,7 @@ void xfs_btree_log_recs(struct xfs_btree_cur *, struct xfs_buf *, int, int);
/* /*
* Helpers. * Helpers.
*/ */
static inline int xfs_btree_get_numrecs(struct xfs_btree_block *block) static inline int xfs_btree_get_numrecs(const struct xfs_btree_block *block)
{ {
return be16_to_cpu(block->bb_numrecs); return be16_to_cpu(block->bb_numrecs);
} }
@@ -434,7 +434,7 @@ static inline void xfs_btree_set_numrecs(struct xfs_btree_block *block,
block->bb_numrecs = cpu_to_be16(numrecs); block->bb_numrecs = cpu_to_be16(numrecs);
} }
static inline int xfs_btree_get_level(struct xfs_btree_block *block) static inline int xfs_btree_get_level(const struct xfs_btree_block *block)
{ {
return be16_to_cpu(block->bb_level); return be16_to_cpu(block->bb_level);
} }
@@ -471,10 +471,11 @@ unsigned long long xfs_btree_calc_size(uint *limits, unsigned long long len);
* code on its own. * code on its own.
*/ */
typedef int (*xfs_btree_query_range_fn)(struct xfs_btree_cur *cur, typedef int (*xfs_btree_query_range_fn)(struct xfs_btree_cur *cur,
union xfs_btree_rec *rec, void *priv); const union xfs_btree_rec *rec, void *priv);
int xfs_btree_query_range(struct xfs_btree_cur *cur, int xfs_btree_query_range(struct xfs_btree_cur *cur,
union xfs_btree_irec *low_rec, union xfs_btree_irec *high_rec, const union xfs_btree_irec *low_rec,
const union xfs_btree_irec *high_rec,
xfs_btree_query_range_fn fn, void *priv); xfs_btree_query_range_fn fn, void *priv);
int xfs_btree_query_all(struct xfs_btree_cur *cur, xfs_btree_query_range_fn fn, int xfs_btree_query_all(struct xfs_btree_cur *cur, xfs_btree_query_range_fn fn,
void *priv); void *priv);
@@ -502,10 +503,11 @@ union xfs_btree_key *xfs_btree_high_key_addr(struct xfs_btree_cur *cur, int n,
union xfs_btree_ptr *xfs_btree_ptr_addr(struct xfs_btree_cur *cur, int n, union xfs_btree_ptr *xfs_btree_ptr_addr(struct xfs_btree_cur *cur, int n,
struct xfs_btree_block *block); struct xfs_btree_block *block);
int xfs_btree_lookup_get_block(struct xfs_btree_cur *cur, int level, int xfs_btree_lookup_get_block(struct xfs_btree_cur *cur, int level,
union xfs_btree_ptr *pp, struct xfs_btree_block **blkp); const union xfs_btree_ptr *pp, struct xfs_btree_block **blkp);
struct xfs_btree_block *xfs_btree_get_block(struct xfs_btree_cur *cur, struct xfs_btree_block *xfs_btree_get_block(struct xfs_btree_cur *cur,
int level, struct xfs_buf **bpp); int level, struct xfs_buf **bpp);
bool xfs_btree_ptr_is_null(struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr); bool xfs_btree_ptr_is_null(struct xfs_btree_cur *cur,
const union xfs_btree_ptr *ptr);
int64_t xfs_btree_diff_two_ptrs(struct xfs_btree_cur *cur, int64_t xfs_btree_diff_two_ptrs(struct xfs_btree_cur *cur,
const union xfs_btree_ptr *a, const union xfs_btree_ptr *a,
const union xfs_btree_ptr *b); const union xfs_btree_ptr *b);
@@ -516,8 +518,9 @@ void xfs_btree_get_keys(struct xfs_btree_cur *cur,
struct xfs_btree_block *block, union xfs_btree_key *key); struct xfs_btree_block *block, union xfs_btree_key *key);
union xfs_btree_key *xfs_btree_high_key_from_key(struct xfs_btree_cur *cur, union xfs_btree_key *xfs_btree_high_key_from_key(struct xfs_btree_cur *cur,
union xfs_btree_key *key); union xfs_btree_key *key);
int xfs_btree_has_record(struct xfs_btree_cur *cur, union xfs_btree_irec *low, int xfs_btree_has_record(struct xfs_btree_cur *cur,
union xfs_btree_irec *high, bool *exists); const union xfs_btree_irec *low,
const union xfs_btree_irec *high, bool *exists);
bool xfs_btree_has_more_records(struct xfs_btree_cur *cur); bool xfs_btree_has_more_records(struct xfs_btree_cur *cur);
struct xfs_ifork *xfs_btree_ifork_ptr(struct xfs_btree_cur *cur); struct xfs_ifork *xfs_btree_ifork_ptr(struct xfs_btree_cur *cur);
@@ -540,10 +543,11 @@ xfs_btree_islastblock(
void xfs_btree_set_ptr_null(struct xfs_btree_cur *cur, void xfs_btree_set_ptr_null(struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr); union xfs_btree_ptr *ptr);
int xfs_btree_get_buf_block(struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr, int xfs_btree_get_buf_block(struct xfs_btree_cur *cur,
struct xfs_btree_block **block, struct xfs_buf **bpp); const union xfs_btree_ptr *ptr, struct xfs_btree_block **block,
struct xfs_buf **bpp);
void xfs_btree_set_sibling(struct xfs_btree_cur *cur, void xfs_btree_set_sibling(struct xfs_btree_cur *cur,
struct xfs_btree_block *block, union xfs_btree_ptr *ptr, struct xfs_btree_block *block, const union xfs_btree_ptr *ptr,
int lr); int lr);
void xfs_btree_init_block_cur(struct xfs_btree_cur *cur, void xfs_btree_init_block_cur(struct xfs_btree_cur *cur,
struct xfs_buf *bp, int level, int numrecs); struct xfs_buf *bp, int level, int numrecs);
@@ -551,7 +555,7 @@ void xfs_btree_copy_ptrs(struct xfs_btree_cur *cur,
union xfs_btree_ptr *dst_ptr, union xfs_btree_ptr *dst_ptr,
const union xfs_btree_ptr *src_ptr, int numptrs); const union xfs_btree_ptr *src_ptr, int numptrs);
void xfs_btree_copy_keys(struct xfs_btree_cur *cur, void xfs_btree_copy_keys(struct xfs_btree_cur *cur,
union xfs_btree_key *dst_key, union xfs_btree_key *src_key, union xfs_btree_key *dst_key,
int numkeys); const union xfs_btree_key *src_key, int numkeys);
#endif /* __XFS_BTREE_H__ */ #endif /* __XFS_BTREE_H__ */

View File

@@ -60,7 +60,7 @@ xfs_btree_fakeroot_dup_cursor(
STATIC int STATIC int
xfs_btree_fakeroot_alloc_block( xfs_btree_fakeroot_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start_bno, const union xfs_btree_ptr *start_bno,
union xfs_btree_ptr *new_bno, union xfs_btree_ptr *new_bno,
int *stat) int *stat)
{ {
@@ -113,7 +113,7 @@ xfs_btree_fakeroot_init_ptr_from_cur(
STATIC void STATIC void
xfs_btree_afakeroot_set_root( xfs_btree_afakeroot_set_root(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int inc) int inc)
{ {
struct xbtree_afakeroot *afake = cur->bc_ag.afake; struct xbtree_afakeroot *afake = cur->bc_ag.afake;

View File

@@ -129,7 +129,7 @@ xfs_da3_node_hdr_from_disk(
struct xfs_da3_icnode_hdr *to, struct xfs_da3_icnode_hdr *to,
struct xfs_da_intnode *from) struct xfs_da_intnode *from)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_da3_intnode *from3 = (struct xfs_da3_intnode *)from; struct xfs_da3_intnode *from3 = (struct xfs_da3_intnode *)from;
to->forw = be32_to_cpu(from3->hdr.info.hdr.forw); to->forw = be32_to_cpu(from3->hdr.info.hdr.forw);
@@ -156,7 +156,7 @@ xfs_da3_node_hdr_to_disk(
struct xfs_da_intnode *to, struct xfs_da_intnode *to,
struct xfs_da3_icnode_hdr *from) struct xfs_da3_icnode_hdr *from)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_da3_intnode *to3 = (struct xfs_da3_intnode *)to; struct xfs_da3_intnode *to3 = (struct xfs_da3_intnode *)to;
ASSERT(from->magic == XFS_DA3_NODE_MAGIC); ASSERT(from->magic == XFS_DA3_NODE_MAGIC);
@@ -191,10 +191,10 @@ xfs_da3_blkinfo_verify(
if (!xfs_verify_magic16(bp, hdr->magic)) if (!xfs_verify_magic16(bp, hdr->magic))
return __this_address; return __this_address;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (be64_to_cpu(hdr3->blkno) != bp->b_bn) if (be64_to_cpu(hdr3->blkno) != xfs_buf_daddr(bp))
return __this_address; return __this_address;
if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
return __this_address; return __this_address;
@@ -253,7 +253,7 @@ xfs_da3_node_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -442,12 +442,12 @@ xfs_da3_node_create(
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF);
node = bp->b_addr; node = bp->b_addr;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_da3_node_hdr *hdr3 = bp->b_addr; struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr)); memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr));
ichdr.magic = XFS_DA3_NODE_MAGIC; ichdr.magic = XFS_DA3_NODE_MAGIC;
hdr3->info.blkno = cpu_to_be64(bp->b_bn); hdr3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
hdr3->info.owner = cpu_to_be64(args->dp->i_ino); hdr3->info.owner = cpu_to_be64(args->dp->i_ino);
uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid);
} else { } else {
@@ -711,7 +711,7 @@ xfs_da3_root_split(
oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) {
struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node; struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node;
node3->hdr.info.blkno = cpu_to_be64(bp->b_bn); node3->hdr.info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
} }
xfs_trans_log_buf(tp, bp, 0, size - 1); xfs_trans_log_buf(tp, bp, 0, size - 1);
@@ -1219,7 +1219,7 @@ xfs_da3_root_join(
xfs_trans_buf_copy_type(root_blk->bp, bp); xfs_trans_buf_copy_type(root_blk->bp, bp);
if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) {
struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr;
da3->blkno = cpu_to_be64(root_blk->bp->b_bn); da3->blkno = cpu_to_be64(xfs_buf_daddr(root_blk->bp));
} }
xfs_trans_log_buf(args->trans, root_blk->bp, 0, xfs_trans_log_buf(args->trans, root_blk->bp, 0,
args->geo->blksize - 1); args->geo->blksize - 1);

View File

@@ -789,7 +789,7 @@ struct xfs_attr3_rmt_hdr {
#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) #define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc)
#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ #define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \
((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ ((bufsize) - (xfs_has_crc((mp)) ? \
sizeof(struct xfs_attr3_rmt_hdr) : 0)) sizeof(struct xfs_attr3_rmt_hdr) : 0))
/* Number of bytes in a directory block. */ /* Number of bytes in a directory block. */

View File

@@ -115,7 +115,7 @@ xfs_da_mount(
dageo->fsblog = mp->m_sb.sb_blocklog; dageo->fsblog = mp->m_sb.sb_blocklog;
dageo->blksize = xfs_dir2_dirblock_bytes(&mp->m_sb); dageo->blksize = xfs_dir2_dirblock_bytes(&mp->m_sb);
dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
dageo->node_hdr_size = sizeof(struct xfs_da3_node_hdr); dageo->node_hdr_size = sizeof(struct xfs_da3_node_hdr);
dageo->leaf_hdr_size = sizeof(struct xfs_dir3_leaf_hdr); dageo->leaf_hdr_size = sizeof(struct xfs_dir3_leaf_hdr);
dageo->free_hdr_size = sizeof(struct xfs_dir3_free_hdr); dageo->free_hdr_size = sizeof(struct xfs_dir3_free_hdr);
@@ -730,7 +730,7 @@ xfs_dir2_hashname(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_name *name) struct xfs_name *name)
{ {
if (unlikely(xfs_sb_version_hasasciici(&mp->m_sb))) if (unlikely(xfs_has_asciici(mp)))
return xfs_ascii_ci_hashname(name); return xfs_ascii_ci_hashname(name);
return xfs_da_hashname(name->name, name->len); return xfs_da_hashname(name->name, name->len);
} }
@@ -741,7 +741,7 @@ xfs_dir2_compname(
const unsigned char *name, const unsigned char *name,
int len) int len)
{ {
if (unlikely(xfs_sb_version_hasasciici(&args->dp->i_mount->m_sb))) if (unlikely(xfs_has_asciici(args->dp->i_mount)))
return xfs_ascii_ci_compname(args, name, len); return xfs_ascii_ci_compname(args, name, len);
return xfs_da_compname(args, name, len); return xfs_da_compname(args, name, len);
} }

View File

@@ -53,10 +53,10 @@ xfs_dir3_block_verify(
if (!xfs_verify_magic(bp, hdr3->magic)) if (!xfs_verify_magic(bp, hdr3->magic))
return __this_address; return __this_address;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (be64_to_cpu(hdr3->blkno) != bp->b_bn) if (be64_to_cpu(hdr3->blkno) != xfs_buf_daddr(bp))
return __this_address; return __this_address;
if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
return __this_address; return __this_address;
@@ -71,7 +71,7 @@ xfs_dir3_block_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -96,7 +96,7 @@ xfs_dir3_block_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -121,7 +121,7 @@ xfs_dir3_block_header_check(
{ {
struct xfs_mount *mp = dp->i_mount; struct xfs_mount *mp = dp->i_mount;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
if (be64_to_cpu(hdr3->owner) != dp->i_ino) if (be64_to_cpu(hdr3->owner) != dp->i_ino)
@@ -171,10 +171,10 @@ xfs_dir3_block_init(
bp->b_ops = &xfs_dir3_block_buf_ops; bp->b_ops = &xfs_dir3_block_buf_ops;
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF);
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
memset(hdr3, 0, sizeof(*hdr3)); memset(hdr3, 0, sizeof(*hdr3));
hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC);
hdr3->blkno = cpu_to_be64(bp->b_bn); hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp));
hdr3->owner = cpu_to_be64(dp->i_ino); hdr3->owner = cpu_to_be64(dp->i_ino);
uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
return; return;

View File

@@ -29,7 +29,7 @@ xfs_dir2_data_bestfree_p(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_dir2_data_hdr *hdr) struct xfs_dir2_data_hdr *hdr)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
return ((struct xfs_dir3_data_hdr *)hdr)->best_free; return ((struct xfs_dir3_data_hdr *)hdr)->best_free;
return hdr->bestfree; return hdr->bestfree;
} }
@@ -51,7 +51,7 @@ xfs_dir2_data_get_ftype(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_dir2_data_entry *dep) struct xfs_dir2_data_entry *dep)
{ {
if (xfs_sb_version_hasftype(&mp->m_sb)) { if (xfs_has_ftype(mp)) {
uint8_t ftype = dep->name[dep->namelen]; uint8_t ftype = dep->name[dep->namelen];
if (likely(ftype < XFS_DIR3_FT_MAX)) if (likely(ftype < XFS_DIR3_FT_MAX))
@@ -70,7 +70,7 @@ xfs_dir2_data_put_ftype(
ASSERT(ftype < XFS_DIR3_FT_MAX); ASSERT(ftype < XFS_DIR3_FT_MAX);
ASSERT(dep->namelen != 0); ASSERT(dep->namelen != 0);
if (xfs_sb_version_hasftype(&mp->m_sb)) if (xfs_has_ftype(mp))
dep->name[dep->namelen] = ftype; dep->name[dep->namelen] = ftype;
} }
@@ -297,10 +297,10 @@ xfs_dir3_data_verify(
if (!xfs_verify_magic(bp, hdr3->magic)) if (!xfs_verify_magic(bp, hdr3->magic))
return __this_address; return __this_address;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (be64_to_cpu(hdr3->blkno) != bp->b_bn) if (be64_to_cpu(hdr3->blkno) != xfs_buf_daddr(bp))
return __this_address; return __this_address;
if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
return __this_address; return __this_address;
@@ -343,7 +343,7 @@ xfs_dir3_data_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -368,7 +368,7 @@ xfs_dir3_data_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -401,7 +401,7 @@ xfs_dir3_data_header_check(
{ {
struct xfs_mount *mp = dp->i_mount; struct xfs_mount *mp = dp->i_mount;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_data_hdr *hdr3 = bp->b_addr; struct xfs_dir3_data_hdr *hdr3 = bp->b_addr;
if (be64_to_cpu(hdr3->hdr.owner) != dp->i_ino) if (be64_to_cpu(hdr3->hdr.owner) != dp->i_ino)
@@ -717,12 +717,12 @@ xfs_dir3_data_init(
* Initialize the header. * Initialize the header.
*/ */
hdr = bp->b_addr; hdr = bp->b_addr;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
memset(hdr3, 0, sizeof(*hdr3)); memset(hdr3, 0, sizeof(*hdr3));
hdr3->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); hdr3->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC);
hdr3->blkno = cpu_to_be64(bp->b_bn); hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp));
hdr3->owner = cpu_to_be64(dp->i_ino); hdr3->owner = cpu_to_be64(dp->i_ino);
uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);

View File

@@ -37,7 +37,7 @@ xfs_dir2_leaf_hdr_from_disk(
struct xfs_dir3_icleaf_hdr *to, struct xfs_dir3_icleaf_hdr *to,
struct xfs_dir2_leaf *from) struct xfs_dir2_leaf *from)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_leaf *from3 = (struct xfs_dir3_leaf *)from; struct xfs_dir3_leaf *from3 = (struct xfs_dir3_leaf *)from;
to->forw = be32_to_cpu(from3->hdr.info.hdr.forw); to->forw = be32_to_cpu(from3->hdr.info.hdr.forw);
@@ -68,7 +68,7 @@ xfs_dir2_leaf_hdr_to_disk(
struct xfs_dir2_leaf *to, struct xfs_dir2_leaf *to,
struct xfs_dir3_icleaf_hdr *from) struct xfs_dir3_icleaf_hdr *from)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_leaf *to3 = (struct xfs_dir3_leaf *)to; struct xfs_dir3_leaf *to3 = (struct xfs_dir3_leaf *)to;
ASSERT(from->magic == XFS_DIR3_LEAF1_MAGIC || ASSERT(from->magic == XFS_DIR3_LEAF1_MAGIC ||
@@ -108,7 +108,7 @@ xfs_dir3_leaf1_check(
if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) { if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) {
struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) if (be64_to_cpu(leaf3->info.blkno) != xfs_buf_daddr(bp))
return __this_address; return __this_address;
} else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC) } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC)
return __this_address; return __this_address;
@@ -209,7 +209,7 @@ xfs_dir3_leaf_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -234,7 +234,7 @@ xfs_dir3_leaf_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -308,7 +308,7 @@ xfs_dir3_leaf_init(
ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC); ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC);
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
memset(leaf3, 0, sizeof(*leaf3)); memset(leaf3, 0, sizeof(*leaf3));
@@ -316,7 +316,7 @@ xfs_dir3_leaf_init(
leaf3->info.hdr.magic = (type == XFS_DIR2_LEAF1_MAGIC) leaf3->info.hdr.magic = (type == XFS_DIR2_LEAF1_MAGIC)
? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)
: cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
leaf3->info.blkno = cpu_to_be64(bp->b_bn); leaf3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
leaf3->info.owner = cpu_to_be64(owner); leaf3->info.owner = cpu_to_be64(owner);
uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid);
} else { } else {

View File

@@ -68,7 +68,7 @@ xfs_dir3_leafn_check(
if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) { if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) {
struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) if (be64_to_cpu(leaf3->info.blkno) != xfs_buf_daddr(bp))
return __this_address; return __this_address;
} else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC) } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC)
return __this_address; return __this_address;
@@ -105,12 +105,12 @@ xfs_dir3_free_verify(
if (!xfs_verify_magic(bp, hdr->magic)) if (!xfs_verify_magic(bp, hdr->magic))
return __this_address; return __this_address;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (be64_to_cpu(hdr3->blkno) != bp->b_bn) if (be64_to_cpu(hdr3->blkno) != xfs_buf_daddr(bp))
return __this_address; return __this_address;
if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
return __this_address; return __this_address;
@@ -128,7 +128,7 @@ xfs_dir3_free_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_DIR3_FREE_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_DIR3_FREE_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -153,7 +153,7 @@ xfs_dir3_free_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -185,7 +185,7 @@ xfs_dir3_free_header_check(
firstdb = (xfs_dir2_da_to_db(mp->m_dir_geo, fbno) - firstdb = (xfs_dir2_da_to_db(mp->m_dir_geo, fbno) -
xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET)) * xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET)) *
maxbests; maxbests;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_free_hdr *hdr3 = bp->b_addr; struct xfs_dir3_free_hdr *hdr3 = bp->b_addr;
if (be32_to_cpu(hdr3->firstdb) != firstdb) if (be32_to_cpu(hdr3->firstdb) != firstdb)
@@ -247,7 +247,7 @@ xfs_dir2_free_hdr_from_disk(
struct xfs_dir3_icfree_hdr *to, struct xfs_dir3_icfree_hdr *to,
struct xfs_dir2_free *from) struct xfs_dir2_free *from)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_free *from3 = (struct xfs_dir3_free *)from; struct xfs_dir3_free *from3 = (struct xfs_dir3_free *)from;
to->magic = be32_to_cpu(from3->hdr.hdr.magic); to->magic = be32_to_cpu(from3->hdr.hdr.magic);
@@ -274,7 +274,7 @@ xfs_dir2_free_hdr_to_disk(
struct xfs_dir2_free *to, struct xfs_dir2_free *to,
struct xfs_dir3_icfree_hdr *from) struct xfs_dir3_icfree_hdr *from)
{ {
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_free *to3 = (struct xfs_dir3_free *)to; struct xfs_dir3_free *to3 = (struct xfs_dir3_free *)to;
ASSERT(from->magic == XFS_DIR3_FREE_MAGIC); ASSERT(from->magic == XFS_DIR3_FREE_MAGIC);
@@ -341,12 +341,12 @@ xfs_dir3_free_get_buf(
memset(bp->b_addr, 0, sizeof(struct xfs_dir3_free_hdr)); memset(bp->b_addr, 0, sizeof(struct xfs_dir3_free_hdr));
memset(&hdr, 0, sizeof(hdr)); memset(&hdr, 0, sizeof(hdr));
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dir3_free_hdr *hdr3 = bp->b_addr; struct xfs_dir3_free_hdr *hdr3 = bp->b_addr;
hdr.magic = XFS_DIR3_FREE_MAGIC; hdr.magic = XFS_DIR3_FREE_MAGIC;
hdr3->hdr.blkno = cpu_to_be64(bp->b_bn); hdr3->hdr.blkno = cpu_to_be64(xfs_buf_daddr(bp));
hdr3->hdr.owner = cpu_to_be64(dp->i_ino); hdr3->hdr.owner = cpu_to_be64(dp->i_ino);
uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_meta_uuid);
} else } else

View File

@@ -196,7 +196,7 @@ xfs_dir2_data_entsize(
len = offsetof(struct xfs_dir2_data_entry, name[0]) + namelen + len = offsetof(struct xfs_dir2_data_entry, name[0]) + namelen +
sizeof(xfs_dir2_data_off_t) /* tag */; sizeof(xfs_dir2_data_off_t) /* tag */;
if (xfs_sb_version_hasftype(&mp->m_sb)) if (xfs_has_ftype(mp))
len += sizeof(uint8_t); len += sizeof(uint8_t);
return round_up(len, XFS_DIR2_DATA_ALIGN); return round_up(len, XFS_DIR2_DATA_ALIGN);
} }

View File

@@ -48,7 +48,7 @@ xfs_dir2_sf_entsize(
count += sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ count += sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */
count += hdr->i8count ? XFS_INO64_SIZE : XFS_INO32_SIZE; /* ino # */ count += hdr->i8count ? XFS_INO64_SIZE : XFS_INO32_SIZE; /* ino # */
if (xfs_sb_version_hasftype(&mp->m_sb)) if (xfs_has_ftype(mp))
count += sizeof(uint8_t); count += sizeof(uint8_t);
return count; return count;
} }
@@ -76,7 +76,7 @@ xfs_dir2_sf_get_ino(
{ {
uint8_t *from = sfep->name + sfep->namelen; uint8_t *from = sfep->name + sfep->namelen;
if (xfs_sb_version_hasftype(&mp->m_sb)) if (xfs_has_ftype(mp))
from++; from++;
if (!hdr->i8count) if (!hdr->i8count)
@@ -95,7 +95,7 @@ xfs_dir2_sf_put_ino(
ASSERT(ino <= XFS_MAXINUMBER); ASSERT(ino <= XFS_MAXINUMBER);
if (xfs_sb_version_hasftype(&mp->m_sb)) if (xfs_has_ftype(mp))
to++; to++;
if (hdr->i8count) if (hdr->i8count)
@@ -135,7 +135,7 @@ xfs_dir2_sf_get_ftype(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_dir2_sf_entry *sfep) struct xfs_dir2_sf_entry *sfep)
{ {
if (xfs_sb_version_hasftype(&mp->m_sb)) { if (xfs_has_ftype(mp)) {
uint8_t ftype = sfep->name[sfep->namelen]; uint8_t ftype = sfep->name[sfep->namelen];
if (ftype < XFS_DIR3_FT_MAX) if (ftype < XFS_DIR3_FT_MAX)
@@ -153,7 +153,7 @@ xfs_dir2_sf_put_ftype(
{ {
ASSERT(ftype < XFS_DIR3_FT_MAX); ASSERT(ftype < XFS_DIR3_FT_MAX);
if (xfs_sb_version_hasftype(&mp->m_sb)) if (xfs_has_ftype(mp))
sfep->name[sfep->namelen] = ftype; sfep->name[sfep->namelen] = ftype;
} }
@@ -192,7 +192,7 @@ xfs_dir2_block_sfsize(
* if there is a filetype field, add the extra byte to the namelen * if there is a filetype field, add the extra byte to the namelen
* for each entry that we see. * for each entry that we see.
*/ */
has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; has_ftype = xfs_has_ftype(mp) ? 1 : 0;
count = i8count = namelen = 0; count = i8count = namelen = 0;
btp = xfs_dir2_block_tail_p(geo, hdr); btp = xfs_dir2_block_tail_p(geo, hdr);

View File

@@ -70,7 +70,7 @@ xfs_dquot_verify(
return __this_address; return __this_address;
if ((ddq->d_type & XFS_DQTYPE_BIGTIME) && if ((ddq->d_type & XFS_DQTYPE_BIGTIME) &&
!xfs_sb_version_hasbigtime(&mp->m_sb)) !xfs_has_bigtime(mp))
return __this_address; return __this_address;
if ((ddq->d_type & XFS_DQTYPE_BIGTIME) && !ddq->d_id) if ((ddq->d_type & XFS_DQTYPE_BIGTIME) && !ddq->d_id)
@@ -106,7 +106,7 @@ xfs_dqblk_verify(
struct xfs_dqblk *dqb, struct xfs_dqblk *dqb,
xfs_dqid_t id) /* used only during quotacheck */ xfs_dqid_t id) /* used only during quotacheck */
{ {
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!uuid_equal(&dqb->dd_uuid, &mp->m_sb.sb_meta_uuid)) !uuid_equal(&dqb->dd_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
@@ -134,7 +134,7 @@ xfs_dqblk_repair(
dqb->dd_diskdq.d_type = type; dqb->dd_diskdq.d_type = type;
dqb->dd_diskdq.d_id = cpu_to_be32(id); dqb->dd_diskdq.d_id = cpu_to_be32(id);
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
uuid_copy(&dqb->dd_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&dqb->dd_uuid, &mp->m_sb.sb_meta_uuid);
xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk), xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk),
XFS_DQUOT_CRC_OFF); XFS_DQUOT_CRC_OFF);
@@ -151,7 +151,7 @@ xfs_dquot_buf_verify_crc(
int ndquots; int ndquots;
int i; int i;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return true; return true;
/* /*

View File

@@ -265,7 +265,6 @@ typedef struct xfs_dsb {
/* must be padded to 64 bit alignment */ /* must be padded to 64 bit alignment */
} xfs_dsb_t; } xfs_dsb_t;
/* /*
* Misc. Flags - warning - these will be cleared by xfs_repair unless * Misc. Flags - warning - these will be cleared by xfs_repair unless
* a feature bit is set when the flag is used. * a feature bit is set when the flag is used.
@@ -280,37 +279,9 @@ typedef struct xfs_dsb {
#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
/* static inline bool xfs_sb_is_v5(struct xfs_sb *sbp)
* The first XFS version we support is a v4 superblock with V2 directories.
*/
static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp)
{ {
if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
return false;
if (!(sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT))
return false;
/* check for unknown features in the fs */
if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) ||
((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) &&
(sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS)))
return false;
return true;
}
static inline bool xfs_sb_good_version(struct xfs_sb *sbp)
{
if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5)
return true;
if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4)
return xfs_sb_good_v4_features(sbp);
return false;
}
static inline bool xfs_sb_version_hasrealtime(struct xfs_sb *sbp)
{
return sbp->sb_rblocks > 0;
} }
/* /*
@@ -322,9 +293,10 @@ static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp)
return sbp->sb_bad_features2 != sbp->sb_features2; return sbp->sb_bad_features2 != sbp->sb_features2;
} }
static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp) static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp)
{ {
return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); return xfs_sb_is_v5(sbp) ||
(sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
} }
static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) static inline void xfs_sb_version_addattr(struct xfs_sb *sbp)
@@ -332,87 +304,18 @@ static inline void xfs_sb_version_addattr(struct xfs_sb *sbp)
sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
} }
static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp)
{
return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT);
}
static inline void xfs_sb_version_addquota(struct xfs_sb *sbp) static inline void xfs_sb_version_addquota(struct xfs_sb *sbp)
{ {
sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
} }
static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
(sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT));
}
static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp)
{
return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT);
}
static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
(sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT);
}
static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp)
{
return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT);
}
static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp)
{
return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT);
}
static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
(sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
}
/*
* sb_features2 bit version macros.
*/
static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
(xfs_sb_version_hasmorebits(sbp) &&
(sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT));
}
static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
(xfs_sb_version_hasmorebits(sbp) &&
(sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT));
}
static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp)
{ {
sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
} }
static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) static inline void xfs_sb_version_addprojid32(struct xfs_sb *sbp)
{
sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT;
if (!sbp->sb_features2)
sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
}
static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
(xfs_sb_version_hasmorebits(sbp) &&
(sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT));
}
static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp)
{ {
sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
@@ -495,106 +398,21 @@ xfs_sb_has_incompat_log_feature(
return (sbp->sb_features_log_incompat & feature) != 0; return (sbp->sb_features_log_incompat & feature) != 0;
} }
/* static inline void
* V5 superblock specific feature checks xfs_sb_remove_incompat_log_features(
*/ struct xfs_sb *sbp)
static inline bool xfs_sb_version_hascrc(struct xfs_sb *sbp)
{ {
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; sbp->sb_features_log_incompat &= ~XFS_SB_FEAT_INCOMPAT_LOG_ALL;
} }
/* static inline void
* v5 file systems support V3 inodes only, earlier file systems support xfs_sb_add_incompat_log_features(
* v2 and v1 inodes. struct xfs_sb *sbp,
*/ unsigned int features)
static inline bool xfs_sb_version_has_v3inode(struct xfs_sb *sbp)
{ {
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; sbp->sb_features_log_incompat |= features;
} }
static inline bool xfs_dinode_good_version(struct xfs_sb *sbp,
uint8_t version)
{
if (xfs_sb_version_has_v3inode(sbp))
return version == 3;
return version == 1 || version == 2;
}
static inline bool xfs_sb_version_has_pquotino(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
}
static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE)) ||
(xfs_sb_version_hasmorebits(sbp) &&
(sbp->sb_features2 & XFS_SB_VERSION2_FTYPE));
}
static inline bool xfs_sb_version_hasfinobt(xfs_sb_t *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) &&
(sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT);
}
static inline bool xfs_sb_version_hassparseinodes(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_SPINODES);
}
/*
* XFS_SB_FEAT_INCOMPAT_META_UUID indicates that the metadata UUID
* is stored separately from the user-visible UUID; this allows the
* user-visible UUID to be changed on V5 filesystems which have a
* filesystem UUID stamped into every piece of metadata.
*/
static inline bool xfs_sb_version_hasmetauuid(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) &&
(sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID);
}
static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp)
{
return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) &&
(sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT);
}
static inline bool xfs_sb_version_hasreflink(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
(sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_REFLINK);
}
static inline bool xfs_sb_version_hasbigtime(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
(sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_BIGTIME);
}
/*
* Inode btree block counter. We record the number of inobt and finobt blocks
* in the AGI header so that we can skip the finobt walk at mount time when
* setting up per-AG reservations.
*/
static inline bool xfs_sb_version_hasinobtcounts(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
(sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_INOBTCNT);
}
static inline bool xfs_sb_version_needsrepair(struct xfs_sb *sbp)
{
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
(sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR);
}
/*
* end of superblock version macros
*/
static inline bool static inline bool
xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino)
@@ -1062,12 +880,12 @@ enum xfs_dinode_fmt {
/* /*
* Inode size for given fs. * Inode size for given fs.
*/ */
#define XFS_DINODE_SIZE(sbp) \ #define XFS_DINODE_SIZE(mp) \
(xfs_sb_version_has_v3inode(sbp) ? \ (xfs_has_v3inodes(mp) ? \
sizeof(struct xfs_dinode) : \ sizeof(struct xfs_dinode) : \
offsetof(struct xfs_dinode, di_crc)) offsetof(struct xfs_dinode, di_crc))
#define XFS_LITINO(mp) \ #define XFS_LITINO(mp) \
((mp)->m_sb.sb_inodesize - XFS_DINODE_SIZE(&(mp)->m_sb)) ((mp)->m_sb.sb_inodesize - XFS_DINODE_SIZE(mp))
/* /*
* Inode data & attribute fork sizes, per inode. * Inode data & attribute fork sizes, per inode.
@@ -1454,7 +1272,7 @@ struct xfs_dsymlink_hdr {
#define XFS_SYMLINK_MAPS 3 #define XFS_SYMLINK_MAPS 3
#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ #define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \
((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ ((bufsize) - (xfs_has_crc((mp)) ? \
sizeof(struct xfs_dsymlink_hdr) : 0)) sizeof(struct xfs_dsymlink_hdr) : 0))
@@ -1686,7 +1504,7 @@ struct xfs_rmap_key {
typedef __be32 xfs_rmap_ptr_t; typedef __be32 xfs_rmap_ptr_t;
#define XFS_RMAP_BLOCK(mp) \ #define XFS_RMAP_BLOCK(mp) \
(xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ (xfs_has_finobt(((mp))) ? \
XFS_FIBT_BLOCK(mp) + 1 : \ XFS_FIBT_BLOCK(mp) + 1 : \
XFS_IBT_BLOCK(mp) + 1) XFS_IBT_BLOCK(mp) + 1)
@@ -1918,7 +1736,7 @@ struct xfs_acl {
* limited only by the maximum size of the xattr that stores the information. * limited only by the maximum size of the xattr that stores the information.
*/ */
#define XFS_ACL_MAX_ENTRIES(mp) \ #define XFS_ACL_MAX_ENTRIES(mp) \
(xfs_sb_version_hascrc(&mp->m_sb) \ (xfs_has_crc(mp) \
? (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ ? (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \
sizeof(struct xfs_acl_entry) \ sizeof(struct xfs_acl_entry) \
: 25) : 25)

View File

@@ -58,7 +58,7 @@ xfs_inobt_update(
union xfs_btree_rec rec; union xfs_btree_rec rec;
rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino);
if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { if (xfs_has_sparseinodes(cur->bc_mp)) {
rec.inobt.ir_u.sp.ir_holemask = cpu_to_be16(irec->ir_holemask); rec.inobt.ir_u.sp.ir_holemask = cpu_to_be16(irec->ir_holemask);
rec.inobt.ir_u.sp.ir_count = irec->ir_count; rec.inobt.ir_u.sp.ir_count = irec->ir_count;
rec.inobt.ir_u.sp.ir_freecount = irec->ir_freecount; rec.inobt.ir_u.sp.ir_freecount = irec->ir_freecount;
@@ -74,11 +74,11 @@ xfs_inobt_update(
void void
xfs_inobt_btrec_to_irec( xfs_inobt_btrec_to_irec(
struct xfs_mount *mp, struct xfs_mount *mp,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
struct xfs_inobt_rec_incore *irec) struct xfs_inobt_rec_incore *irec)
{ {
irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino);
if (xfs_sb_version_hassparseinodes(&mp->m_sb)) { if (xfs_has_sparseinodes(mp)) {
irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask); irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask);
irec->ir_count = rec->inobt.ir_u.sp.ir_count; irec->ir_count = rec->inobt.ir_u.sp.ir_count;
irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount; irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount;
@@ -241,7 +241,7 @@ xfs_check_agi_freecount(
} }
} while (i == 1); } while (i == 1);
if (!XFS_FORCED_SHUTDOWN(cur->bc_mp)) if (!xfs_is_shutdown(cur->bc_mp))
ASSERT(freecount == cur->bc_ag.pag->pagi_freecount); ASSERT(freecount == cur->bc_ag.pag->pagi_freecount);
} }
return 0; return 0;
@@ -302,7 +302,7 @@ xfs_ialloc_inode_init(
* That means for v3 inode we log the entire buffer rather than just the * That means for v3 inode we log the entire buffer rather than just the
* inode cores. * inode cores.
*/ */
if (xfs_sb_version_has_v3inode(&mp->m_sb)) { if (xfs_has_v3inodes(mp)) {
version = 3; version = 3;
ino = XFS_AGINO_TO_INO(mp, agno, XFS_AGB_TO_AGINO(mp, agbno)); ino = XFS_AGINO_TO_INO(mp, agno, XFS_AGB_TO_AGINO(mp, agbno));
@@ -337,7 +337,6 @@ xfs_ialloc_inode_init(
xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length));
for (i = 0; i < M_IGEO(mp)->inodes_per_cluster; i++) { for (i = 0; i < M_IGEO(mp)->inodes_per_cluster; i++) {
int ioffset = i << mp->m_sb.sb_inodelog; int ioffset = i << mp->m_sb.sb_inodelog;
uint isize = XFS_DINODE_SIZE(&mp->m_sb);
free = xfs_make_iptr(mp, fbuf, i); free = xfs_make_iptr(mp, fbuf, i);
free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
@@ -354,7 +353,7 @@ xfs_ialloc_inode_init(
} else if (tp) { } else if (tp) {
/* just log the inode core */ /* just log the inode core */
xfs_trans_log_buf(tp, fbuf, ioffset, xfs_trans_log_buf(tp, fbuf, ioffset,
ioffset + isize - 1); ioffset + XFS_DINODE_SIZE(mp) - 1);
} }
} }
@@ -635,7 +634,7 @@ xfs_ialloc_ag_alloc(
#ifdef DEBUG #ifdef DEBUG
/* randomly do sparse inode allocations */ /* randomly do sparse inode allocations */
if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb) && if (xfs_has_sparseinodes(tp->t_mountp) &&
igeo->ialloc_min_blks < igeo->ialloc_blks) igeo->ialloc_min_blks < igeo->ialloc_blks)
do_sparse = prandom_u32() & 1; do_sparse = prandom_u32() & 1;
#endif #endif
@@ -712,7 +711,7 @@ xfs_ialloc_ag_alloc(
*/ */
isaligned = 0; isaligned = 0;
if (igeo->ialloc_align) { if (igeo->ialloc_align) {
ASSERT(!(args.mp->m_flags & XFS_MOUNT_NOALIGN)); ASSERT(!xfs_has_noalign(args.mp));
args.alignment = args.mp->m_dalign; args.alignment = args.mp->m_dalign;
isaligned = 1; isaligned = 1;
} else } else
@@ -754,7 +753,7 @@ xfs_ialloc_ag_alloc(
* Finally, try a sparse allocation if the filesystem supports it and * Finally, try a sparse allocation if the filesystem supports it and
* the sparse allocation length is smaller than a full chunk. * the sparse allocation length is smaller than a full chunk.
*/ */
if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && if (xfs_has_sparseinodes(args.mp) &&
igeo->ialloc_min_blks < igeo->ialloc_blks && igeo->ialloc_min_blks < igeo->ialloc_blks &&
args.fsbno == NULLFSBLOCK) { args.fsbno == NULLFSBLOCK) {
sparse_alloc: sparse_alloc:
@@ -856,7 +855,7 @@ sparse_alloc:
* from the previous call. Set merge false to replace any * from the previous call. Set merge false to replace any
* existing record with this one. * existing record with this one.
*/ */
if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { if (xfs_has_finobt(args.mp)) {
error = xfs_inobt_insert_sprec(args.mp, tp, agbp, pag, error = xfs_inobt_insert_sprec(args.mp, tp, agbp, pag,
XFS_BTNUM_FINO, &rec, false); XFS_BTNUM_FINO, &rec, false);
if (error) if (error)
@@ -869,7 +868,7 @@ sparse_alloc:
if (error) if (error)
return error; return error;
if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { if (xfs_has_finobt(args.mp)) {
error = xfs_inobt_insert(args.mp, tp, agbp, pag, newino, error = xfs_inobt_insert(args.mp, tp, agbp, pag, newino,
newlen, XFS_BTNUM_FINO); newlen, XFS_BTNUM_FINO);
if (error) if (error)
@@ -1448,7 +1447,7 @@ xfs_dialloc_ag(
int offset; int offset;
int i; int i;
if (!xfs_sb_version_hasfinobt(&mp->m_sb)) if (!xfs_has_finobt(mp))
return xfs_dialloc_ag_inobt(tp, agbp, pag, parent, inop); return xfs_dialloc_ag_inobt(tp, agbp, pag, parent, inop);
/* /*
@@ -1784,7 +1783,7 @@ xfs_dialloc(
break; break;
} }
if (XFS_FORCED_SHUTDOWN(mp)) { if (xfs_is_shutdown(mp)) {
error = -EFSCORRUPTED; error = -EFSCORRUPTED;
break; break;
} }
@@ -1953,8 +1952,7 @@ xfs_difree_inobt(
* remove the chunk if the block size is large enough for multiple inode * remove the chunk if the block size is large enough for multiple inode
* chunks (that might not be free). * chunks (that might not be free).
*/ */
if (!(mp->m_flags & XFS_MOUNT_IKEEP) && if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&
rec.ir_free == XFS_INOBT_ALL_FREE &&
mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) { mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
struct xfs_perag *pag = agbp->b_pag; struct xfs_perag *pag = agbp->b_pag;
@@ -2098,9 +2096,8 @@ xfs_difree_finobt(
* enough for multiple chunks. Leave the finobt record to remain in sync * enough for multiple chunks. Leave the finobt record to remain in sync
* with the inobt. * with the inobt.
*/ */
if (rec.ir_free == XFS_INOBT_ALL_FREE && if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&
mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK && mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {
!(mp->m_flags & XFS_MOUNT_IKEEP)) {
error = xfs_btree_delete(cur, &i); error = xfs_btree_delete(cur, &i);
if (error) if (error)
goto error; goto error;
@@ -2189,7 +2186,7 @@ xfs_difree(
/* /*
* Fix up the free inode btree. * Fix up the free inode btree.
*/ */
if (xfs_sb_version_hasfinobt(&mp->m_sb)) { if (xfs_has_finobt(mp)) {
error = xfs_difree_finobt(mp, tp, agbp, pag, agino, &rec); error = xfs_difree_finobt(mp, tp, agbp, pag, agino, &rec);
if (error) if (error)
goto error0; goto error0;
@@ -2478,7 +2475,7 @@ xfs_agi_verify(
struct xfs_agi *agi = bp->b_addr; struct xfs_agi *agi = bp->b_addr;
int i; int i;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (!xfs_log_check_lsn(mp, be64_to_cpu(agi->agi_lsn))) if (!xfs_log_check_lsn(mp, be64_to_cpu(agi->agi_lsn)))
@@ -2497,7 +2494,7 @@ xfs_agi_verify(
be32_to_cpu(agi->agi_level) > M_IGEO(mp)->inobt_maxlevels) be32_to_cpu(agi->agi_level) > M_IGEO(mp)->inobt_maxlevels)
return __this_address; return __this_address;
if (xfs_sb_version_hasfinobt(&mp->m_sb) && if (xfs_has_finobt(mp) &&
(be32_to_cpu(agi->agi_free_level) < 1 || (be32_to_cpu(agi->agi_free_level) < 1 ||
be32_to_cpu(agi->agi_free_level) > M_IGEO(mp)->inobt_maxlevels)) be32_to_cpu(agi->agi_free_level) > M_IGEO(mp)->inobt_maxlevels))
return __this_address; return __this_address;
@@ -2528,7 +2525,7 @@ xfs_agi_read_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
if (xfs_sb_version_hascrc(&mp->m_sb) && if (xfs_has_crc(mp) &&
!xfs_buf_verify_cksum(bp, XFS_AGI_CRC_OFF)) !xfs_buf_verify_cksum(bp, XFS_AGI_CRC_OFF))
xfs_verifier_error(bp, -EFSBADCRC, __this_address); xfs_verifier_error(bp, -EFSBADCRC, __this_address);
else { else {
@@ -2553,7 +2550,7 @@ xfs_agi_write_verify(
return; return;
} }
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (bip) if (bip)
@@ -2626,7 +2623,7 @@ xfs_ialloc_read_agi(
* we are in the middle of a forced shutdown. * we are in the middle of a forced shutdown.
*/ */
ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) ||
XFS_FORCED_SHUTDOWN(mp)); xfs_is_shutdown(mp));
return 0; return 0;
} }
@@ -2716,7 +2713,7 @@ struct xfs_ialloc_count_inodes {
STATIC int STATIC int
xfs_ialloc_count_inodes_rec( xfs_ialloc_count_inodes_rec(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
void *priv) void *priv)
{ {
struct xfs_inobt_rec_incore irec; struct xfs_inobt_rec_incore irec;
@@ -2773,7 +2770,7 @@ xfs_ialloc_setup_geometry(
uint inodes; uint inodes;
igeo->new_diflags2 = 0; igeo->new_diflags2 = 0;
if (xfs_sb_version_hasbigtime(&mp->m_sb)) if (xfs_has_bigtime(mp))
igeo->new_diflags2 |= XFS_DIFLAG2_BIGTIME; igeo->new_diflags2 |= XFS_DIFLAG2_BIGTIME;
/* Compute inode btree geometry. */ /* Compute inode btree geometry. */
@@ -2828,7 +2825,7 @@ xfs_ialloc_setup_geometry(
* cannot change the behavior. * cannot change the behavior.
*/ */
igeo->inode_cluster_size_raw = XFS_INODE_BIG_CLUSTER_SIZE; igeo->inode_cluster_size_raw = XFS_INODE_BIG_CLUSTER_SIZE;
if (xfs_sb_version_has_v3inode(&mp->m_sb)) { if (xfs_has_v3inodes(mp)) {
int new_size = igeo->inode_cluster_size_raw; int new_size = igeo->inode_cluster_size_raw;
new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE; new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;
@@ -2846,7 +2843,7 @@ xfs_ialloc_setup_geometry(
igeo->inodes_per_cluster = XFS_FSB_TO_INO(mp, igeo->blocks_per_cluster); igeo->inodes_per_cluster = XFS_FSB_TO_INO(mp, igeo->blocks_per_cluster);
/* Calculate inode cluster alignment. */ /* Calculate inode cluster alignment. */
if (xfs_sb_version_hasalign(&mp->m_sb) && if (xfs_has_align(mp) &&
mp->m_sb.sb_inoalignmt >= igeo->blocks_per_cluster) mp->m_sb.sb_inoalignmt >= igeo->blocks_per_cluster)
igeo->cluster_align = mp->m_sb.sb_inoalignmt; igeo->cluster_align = mp->m_sb.sb_inoalignmt;
else else
@@ -2894,15 +2891,15 @@ xfs_ialloc_calc_rootino(
first_bno += xfs_alloc_min_freelist(mp, NULL); first_bno += xfs_alloc_min_freelist(mp, NULL);
/* ...the free inode btree root... */ /* ...the free inode btree root... */
if (xfs_sb_version_hasfinobt(&mp->m_sb)) if (xfs_has_finobt(mp))
first_bno++; first_bno++;
/* ...the reverse mapping btree root... */ /* ...the reverse mapping btree root... */
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
first_bno++; first_bno++;
/* ...the reference count btree... */ /* ...the reference count btree... */
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
first_bno++; first_bno++;
/* /*
@@ -2920,9 +2917,9 @@ xfs_ialloc_calc_rootino(
* Now round first_bno up to whatever allocation alignment is given * Now round first_bno up to whatever allocation alignment is given
* by the filesystem or was passed in. * by the filesystem or was passed in.
*/ */
if (xfs_sb_version_hasdalign(&mp->m_sb) && igeo->ialloc_align > 0) if (xfs_has_dalign(mp) && igeo->ialloc_align > 0)
first_bno = roundup(first_bno, sunit); first_bno = roundup(first_bno, sunit);
else if (xfs_sb_version_hasalign(&mp->m_sb) && else if (xfs_has_align(mp) &&
mp->m_sb.sb_inoalignmt > 1) mp->m_sb.sb_inoalignmt > 1)
first_bno = roundup(first_bno, mp->m_sb.sb_inoalignmt); first_bno = roundup(first_bno, mp->m_sb.sb_inoalignmt);
@@ -2953,7 +2950,7 @@ xfs_ialloc_check_shrink(
int has; int has;
int error; int error;
if (!xfs_sb_version_hassparseinodes(&mp->m_sb)) if (!xfs_has_sparseinodes(mp))
return 0; return 0;
pag = xfs_perag_get(mp, agno); pag = xfs_perag_get(mp, agno);

View File

@@ -106,7 +106,8 @@ int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp,
xfs_agnumber_t agno, struct xfs_buf **bpp); xfs_agnumber_t agno, struct xfs_buf **bpp);
union xfs_btree_rec; union xfs_btree_rec;
void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, union xfs_btree_rec *rec, void xfs_inobt_btrec_to_irec(struct xfs_mount *mp,
const union xfs_btree_rec *rec,
struct xfs_inobt_rec_incore *irec); struct xfs_inobt_rec_incore *irec);
int xfs_ialloc_has_inodes_at_extent(struct xfs_btree_cur *cur, int xfs_ialloc_has_inodes_at_extent(struct xfs_btree_cur *cur,
xfs_agblock_t bno, xfs_extlen_t len, bool *exists); xfs_agblock_t bno, xfs_extlen_t len, bool *exists);

View File

@@ -41,7 +41,7 @@ xfs_inobt_dup_cursor(
STATIC void STATIC void
xfs_inobt_set_root( xfs_inobt_set_root(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *nptr, const union xfs_btree_ptr *nptr,
int inc) /* level change */ int inc) /* level change */
{ {
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
@@ -55,7 +55,7 @@ xfs_inobt_set_root(
STATIC void STATIC void
xfs_finobt_set_root( xfs_finobt_set_root(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *nptr, const union xfs_btree_ptr *nptr,
int inc) /* level change */ int inc) /* level change */
{ {
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
@@ -76,7 +76,7 @@ xfs_inobt_mod_blockcount(
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
struct xfs_agi *agi = agbp->b_addr; struct xfs_agi *agi = agbp->b_addr;
if (!xfs_sb_version_hasinobtcounts(&cur->bc_mp->m_sb)) if (!xfs_has_inobtcounts(cur->bc_mp))
return; return;
if (cur->bc_btnum == XFS_BTNUM_FINO) if (cur->bc_btnum == XFS_BTNUM_FINO)
@@ -89,7 +89,7 @@ xfs_inobt_mod_blockcount(
STATIC int STATIC int
__xfs_inobt_alloc_block( __xfs_inobt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat, int *stat,
enum xfs_ag_resv_type resv) enum xfs_ag_resv_type resv)
@@ -128,7 +128,7 @@ __xfs_inobt_alloc_block(
STATIC int STATIC int
xfs_inobt_alloc_block( xfs_inobt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat) int *stat)
{ {
@@ -138,7 +138,7 @@ xfs_inobt_alloc_block(
STATIC int STATIC int
xfs_finobt_alloc_block( xfs_finobt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat) int *stat)
{ {
@@ -156,7 +156,7 @@ __xfs_inobt_free_block(
{ {
xfs_inobt_mod_blockcount(cur, -1); xfs_inobt_mod_blockcount(cur, -1);
return xfs_free_extent(cur->bc_tp, return xfs_free_extent(cur->bc_tp,
XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp)), 1, XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)), 1,
&XFS_RMAP_OINFO_INOBT, resv); &XFS_RMAP_OINFO_INOBT, resv);
} }
@@ -189,7 +189,7 @@ xfs_inobt_get_maxrecs(
STATIC void STATIC void
xfs_inobt_init_key_from_rec( xfs_inobt_init_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->inobt.ir_startino = rec->inobt.ir_startino; key->inobt.ir_startino = rec->inobt.ir_startino;
} }
@@ -197,7 +197,7 @@ xfs_inobt_init_key_from_rec(
STATIC void STATIC void
xfs_inobt_init_high_key_from_rec( xfs_inobt_init_high_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
__u32 x; __u32 x;
@@ -212,7 +212,7 @@ xfs_inobt_init_rec_from_cur(
union xfs_btree_rec *rec) union xfs_btree_rec *rec)
{ {
rec->inobt.ir_startino = cpu_to_be32(cur->bc_rec.i.ir_startino); rec->inobt.ir_startino = cpu_to_be32(cur->bc_rec.i.ir_startino);
if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { if (xfs_has_sparseinodes(cur->bc_mp)) {
rec->inobt.ir_u.sp.ir_holemask = rec->inobt.ir_u.sp.ir_holemask =
cpu_to_be16(cur->bc_rec.i.ir_holemask); cpu_to_be16(cur->bc_rec.i.ir_holemask);
rec->inobt.ir_u.sp.ir_count = cur->bc_rec.i.ir_count; rec->inobt.ir_u.sp.ir_count = cur->bc_rec.i.ir_count;
@@ -254,7 +254,7 @@ xfs_finobt_init_ptr_from_cur(
STATIC int64_t STATIC int64_t
xfs_inobt_key_diff( xfs_inobt_key_diff(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *key) const union xfs_btree_key *key)
{ {
return (int64_t)be32_to_cpu(key->inobt.ir_startino) - return (int64_t)be32_to_cpu(key->inobt.ir_startino) -
cur->bc_rec.i.ir_startino; cur->bc_rec.i.ir_startino;
@@ -263,8 +263,8 @@ xfs_inobt_key_diff(
STATIC int64_t STATIC int64_t
xfs_inobt_diff_two_keys( xfs_inobt_diff_two_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return (int64_t)be32_to_cpu(k1->inobt.ir_startino) - return (int64_t)be32_to_cpu(k1->inobt.ir_startino) -
be32_to_cpu(k2->inobt.ir_startino); be32_to_cpu(k2->inobt.ir_startino);
@@ -292,7 +292,7 @@ xfs_inobt_verify(
* but beware of the landmine (i.e. need to check pag->pagi_init) if we * but beware of the landmine (i.e. need to check pag->pagi_init) if we
* ever do. * ever do.
*/ */
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
fa = xfs_btree_sblock_v5hdr_verify(bp); fa = xfs_btree_sblock_v5hdr_verify(bp);
if (fa) if (fa)
return fa; return fa;
@@ -361,8 +361,8 @@ const struct xfs_buf_ops xfs_finobt_buf_ops = {
STATIC int STATIC int
xfs_inobt_keys_inorder( xfs_inobt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return be32_to_cpu(k1->inobt.ir_startino) < return be32_to_cpu(k1->inobt.ir_startino) <
be32_to_cpu(k2->inobt.ir_startino); be32_to_cpu(k2->inobt.ir_startino);
@@ -371,8 +371,8 @@ xfs_inobt_keys_inorder(
STATIC int STATIC int
xfs_inobt_recs_inorder( xfs_inobt_recs_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2) const union xfs_btree_rec *r2)
{ {
return be32_to_cpu(r1->inobt.ir_startino) + XFS_INODES_PER_CHUNK <= return be32_to_cpu(r1->inobt.ir_startino) + XFS_INODES_PER_CHUNK <=
be32_to_cpu(r2->inobt.ir_startino); be32_to_cpu(r2->inobt.ir_startino);
@@ -446,7 +446,7 @@ xfs_inobt_init_common(
cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_blocklog = mp->m_sb.sb_blocklog;
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_flags |= XFS_BTREE_CRC_BLOCKS;
/* take a reference for the cursor */ /* take a reference for the cursor */
@@ -511,7 +511,7 @@ xfs_inobt_commit_staged_btree(
fields = XFS_AGI_ROOT | XFS_AGI_LEVEL; fields = XFS_AGI_ROOT | XFS_AGI_LEVEL;
agi->agi_root = cpu_to_be32(afake->af_root); agi->agi_root = cpu_to_be32(afake->af_root);
agi->agi_level = cpu_to_be32(afake->af_levels); agi->agi_level = cpu_to_be32(afake->af_levels);
if (xfs_sb_version_hasinobtcounts(&cur->bc_mp->m_sb)) { if (xfs_has_inobtcounts(cur->bc_mp)) {
agi->agi_iblocks = cpu_to_be32(afake->af_blocks); agi->agi_iblocks = cpu_to_be32(afake->af_blocks);
fields |= XFS_AGI_IBLOCKS; fields |= XFS_AGI_IBLOCKS;
} }
@@ -521,7 +521,7 @@ xfs_inobt_commit_staged_btree(
fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL; fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL;
agi->agi_free_root = cpu_to_be32(afake->af_root); agi->agi_free_root = cpu_to_be32(afake->af_root);
agi->agi_free_level = cpu_to_be32(afake->af_levels); agi->agi_free_level = cpu_to_be32(afake->af_levels);
if (xfs_sb_version_hasinobtcounts(&cur->bc_mp->m_sb)) { if (xfs_has_inobtcounts(cur->bc_mp)) {
agi->agi_fblocks = cpu_to_be32(afake->af_blocks); agi->agi_fblocks = cpu_to_be32(afake->af_blocks);
fields |= XFS_AGI_IBLOCKS; fields |= XFS_AGI_IBLOCKS;
} }
@@ -737,10 +737,10 @@ xfs_finobt_calc_reserves(
xfs_extlen_t tree_len = 0; xfs_extlen_t tree_len = 0;
int error; int error;
if (!xfs_sb_version_hasfinobt(&mp->m_sb)) if (!xfs_has_finobt(mp))
return 0; return 0;
if (xfs_sb_version_hasinobtcounts(&mp->m_sb)) if (xfs_has_inobtcounts(mp))
error = xfs_finobt_read_blocks(mp, tp, pag, &tree_len); error = xfs_finobt_read_blocks(mp, tp, pag, &tree_len);
else else
error = xfs_inobt_count_blocks(mp, tp, pag, XFS_BTNUM_FINO, error = xfs_inobt_count_blocks(mp, tp, pag, XFS_BTNUM_FINO,

View File

@@ -19,7 +19,7 @@ struct xfs_perag;
* Btree block header size depends on a superblock flag. * Btree block header size depends on a superblock flag.
*/ */
#define XFS_INOBT_BLOCK_LEN(mp) \ #define XFS_INOBT_BLOCK_LEN(mp) \
(xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ (xfs_has_crc(((mp))) ? \
XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN)
/* /*

View File

@@ -48,7 +48,7 @@ xfs_inode_buf_verify(
/* /*
* Validate the magic number and version of every inode in the buffer * Validate the magic number and version of every inode in the buffer
*/ */
agno = xfs_daddr_to_agno(mp, XFS_BUF_ADDR(bp)); agno = xfs_daddr_to_agno(mp, xfs_buf_daddr(bp));
ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock; ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock;
for (i = 0; i < ni; i++) { for (i = 0; i < ni; i++) {
int di_ok; int di_ok;
@@ -58,7 +58,7 @@ xfs_inode_buf_verify(
dip = xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); dip = xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog));
unlinked_ino = be32_to_cpu(dip->di_next_unlinked); unlinked_ino = be32_to_cpu(dip->di_next_unlinked);
di_ok = xfs_verify_magic16(bp, dip->di_magic) && di_ok = xfs_verify_magic16(bp, dip->di_magic) &&
xfs_dinode_good_version(&mp->m_sb, dip->di_version) && xfs_dinode_good_version(mp, dip->di_version) &&
xfs_verify_agino_or_null(mp, agno, unlinked_ino); xfs_verify_agino_or_null(mp, agno, unlinked_ino);
if (unlikely(XFS_TEST_ERROR(!di_ok, mp, if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
XFS_ERRTAG_ITOBP_INOTOBP))) { XFS_ERRTAG_ITOBP_INOTOBP))) {
@@ -71,7 +71,7 @@ xfs_inode_buf_verify(
#ifdef DEBUG #ifdef DEBUG
xfs_alert(mp, xfs_alert(mp,
"bad inode magic/vsn daddr %lld #%d (magic=%x)", "bad inode magic/vsn daddr %lld #%d (magic=%x)",
(unsigned long long)bp->b_bn, i, (unsigned long long)xfs_buf_daddr(bp), i,
be16_to_cpu(dip->di_magic)); be16_to_cpu(dip->di_magic));
#endif #endif
xfs_buf_verifier_error(bp, -EFSCORRUPTED, xfs_buf_verifier_error(bp, -EFSCORRUPTED,
@@ -192,7 +192,7 @@ xfs_inode_from_disk(
* inode. If the inode is unused, mode is zero and we shouldn't mess * inode. If the inode is unused, mode is zero and we shouldn't mess
* with the uninitialized part of it. * with the uninitialized part of it.
*/ */
if (!xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) if (!xfs_has_v3inodes(ip->i_mount))
ip->i_flushiter = be16_to_cpu(from->di_flushiter); ip->i_flushiter = be16_to_cpu(from->di_flushiter);
inode->i_generation = be32_to_cpu(from->di_gen); inode->i_generation = be32_to_cpu(from->di_gen);
inode->i_mode = be16_to_cpu(from->di_mode); inode->i_mode = be16_to_cpu(from->di_mode);
@@ -235,7 +235,7 @@ xfs_inode_from_disk(
if (from->di_dmevmask || from->di_dmstate) if (from->di_dmevmask || from->di_dmstate)
xfs_iflags_set(ip, XFS_IPRESERVE_DM_FIELDS); xfs_iflags_set(ip, XFS_IPRESERVE_DM_FIELDS);
if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) { if (xfs_has_v3inodes(ip->i_mount)) {
inode_set_iversion_queried(inode, inode_set_iversion_queried(inode,
be64_to_cpu(from->di_changecount)); be64_to_cpu(from->di_changecount));
ip->i_crtime = xfs_inode_from_disk_ts(from, from->di_crtime); ip->i_crtime = xfs_inode_from_disk_ts(from, from->di_crtime);
@@ -313,7 +313,7 @@ xfs_inode_to_disk(
to->di_aformat = xfs_ifork_format(ip->i_afp); to->di_aformat = xfs_ifork_format(ip->i_afp);
to->di_flags = cpu_to_be16(ip->i_diflags); to->di_flags = cpu_to_be16(ip->i_diflags);
if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) { if (xfs_has_v3inodes(ip->i_mount)) {
to->di_version = 3; to->di_version = 3;
to->di_changecount = cpu_to_be64(inode_peek_iversion(inode)); to->di_changecount = cpu_to_be64(inode_peek_iversion(inode));
to->di_crtime = xfs_inode_to_disk_ts(ip, ip->i_crtime); to->di_crtime = xfs_inode_to_disk_ts(ip, ip->i_crtime);
@@ -413,7 +413,7 @@ xfs_dinode_verify(
/* Verify v3 integrity information first */ /* Verify v3 integrity information first */
if (dip->di_version >= 3) { if (dip->di_version >= 3) {
if (!xfs_sb_version_has_v3inode(&mp->m_sb)) if (!xfs_has_v3inodes(mp))
return __this_address; return __this_address;
if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize,
XFS_DINODE_CRC_OFF)) XFS_DINODE_CRC_OFF))
@@ -515,7 +515,7 @@ xfs_dinode_verify(
/* don't allow reflink/cowextsize if we don't have reflink */ /* don't allow reflink/cowextsize if we don't have reflink */
if ((flags2 & (XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)) && if ((flags2 & (XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)) &&
!xfs_sb_version_hasreflink(&mp->m_sb)) !xfs_has_reflink(mp))
return __this_address; return __this_address;
/* only regular files get reflink */ /* only regular files get reflink */
@@ -534,7 +534,7 @@ xfs_dinode_verify(
/* bigtime iflag can only happen on bigtime filesystems */ /* bigtime iflag can only happen on bigtime filesystems */
if (xfs_dinode_has_bigtime(dip) && if (xfs_dinode_has_bigtime(dip) &&
!xfs_sb_version_hasbigtime(&mp->m_sb)) !xfs_has_bigtime(mp))
return __this_address; return __this_address;
return NULL; return NULL;
@@ -550,7 +550,7 @@ xfs_dinode_calc_crc(
if (dip->di_version < 3) if (dip->di_version < 3)
return; return;
ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); ASSERT(xfs_has_crc(mp));
crc = xfs_start_cksum_update((char *)dip, mp->m_sb.sb_inodesize, crc = xfs_start_cksum_update((char *)dip, mp->m_sb.sb_inodesize,
XFS_DINODE_CRC_OFF); XFS_DINODE_CRC_OFF);
dip->di_crc = xfs_end_cksum(crc); dip->di_crc = xfs_end_cksum(crc);
@@ -677,7 +677,7 @@ xfs_inode_validate_cowextsize(
hint_flag = (flags2 & XFS_DIFLAG2_COWEXTSIZE); hint_flag = (flags2 & XFS_DIFLAG2_COWEXTSIZE);
cowextsize_bytes = XFS_FSB_TO_B(mp, cowextsize); cowextsize_bytes = XFS_FSB_TO_B(mp, cowextsize);
if (hint_flag && !xfs_sb_version_hasreflink(&mp->m_sb)) if (hint_flag && !xfs_has_reflink(mp))
return __this_address; return __this_address;
if (hint_flag && !(S_ISDIR(mode) || S_ISREG(mode))) if (hint_flag && !(S_ISDIR(mode) || S_ISREG(mode)))

View File

@@ -21,7 +21,7 @@ struct xfs_imap {
int xfs_imap_to_bp(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_imap_to_bp(struct xfs_mount *mp, struct xfs_trans *tp,
struct xfs_imap *imap, struct xfs_buf **bpp); struct xfs_imap *imap, struct xfs_buf **bpp);
void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_calc_crc(struct xfs_mount *mp, struct xfs_dinode *dip);
void xfs_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to, void xfs_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to,
xfs_lsn_t lsn); xfs_lsn_t lsn);
int xfs_inode_from_disk(struct xfs_inode *ip, struct xfs_dinode *from); int xfs_inode_from_disk(struct xfs_inode *ip, struct xfs_dinode *from);
@@ -42,4 +42,13 @@ static inline uint64_t xfs_inode_encode_bigtime(struct timespec64 tv)
struct timespec64 xfs_inode_from_disk_ts(struct xfs_dinode *dip, struct timespec64 xfs_inode_from_disk_ts(struct xfs_dinode *dip,
const xfs_timestamp_t ts); const xfs_timestamp_t ts);
static inline bool
xfs_dinode_good_version(struct xfs_mount *mp, uint8_t version)
{
if (xfs_has_v3inodes(mp))
return version == 3;
return version == 1 || version == 2;
}
#endif /* __XFS_INODE_BUF_H__ */ #endif /* __XFS_INODE_BUF_H__ */

View File

@@ -41,10 +41,10 @@ typedef uint32_t xlog_tid_t;
#define XFS_MIN_LOG_FACTOR 3 #define XFS_MIN_LOG_FACTOR 3
#define XLOG_REC_SHIFT(log) \ #define XLOG_REC_SHIFT(log) \
BTOBB(1 << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ BTOBB(1 << (xfs_has_logv2(log->l_mp) ? \
XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
#define XLOG_TOTAL_REC_SHIFT(log) \ #define XLOG_TOTAL_REC_SHIFT(log) \
BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ BTOBB(XLOG_MAX_ICLOGS << (xfs_has_logv2(log->l_mp) ? \
XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
/* get lsn fields */ /* get lsn fields */
@@ -434,7 +434,7 @@ struct xfs_log_dinode {
}; };
#define xfs_log_dinode_size(mp) \ #define xfs_log_dinode_size(mp) \
(xfs_sb_version_has_v3inode(&(mp)->m_sb) ? \ (xfs_has_v3inodes((mp)) ? \
sizeof(struct xfs_log_dinode) : \ sizeof(struct xfs_log_dinode) : \
offsetof(struct xfs_log_dinode, di_next_unlinked)) offsetof(struct xfs_log_dinode, di_next_unlinked))

View File

@@ -122,6 +122,8 @@ void xlog_buf_readahead(struct xlog *log, xfs_daddr_t blkno, uint len,
const struct xfs_buf_ops *ops); const struct xfs_buf_ops *ops);
bool xlog_is_buffer_cancelled(struct xlog *log, xfs_daddr_t blkno, uint len); bool xlog_is_buffer_cancelled(struct xlog *log, xfs_daddr_t blkno, uint len);
int xlog_recover_iget(struct xfs_mount *mp, xfs_ino_t ino,
struct xfs_inode **ipp);
void xlog_recover_release_intent(struct xlog *log, unsigned short intent_type, void xlog_recover_release_intent(struct xlog *log, unsigned short intent_type,
uint64_t intent_id); uint64_t intent_id);

View File

@@ -92,7 +92,7 @@ xfs_log_calc_minimum_size(
if (tres.tr_logcount > 1) if (tres.tr_logcount > 1)
max_logres *= tres.tr_logcount; max_logres *= tres.tr_logcount;
if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) if (xfs_has_logv2(mp) && mp->m_sb.sb_logsunit > 1)
lsunit = BTOBB(mp->m_sb.sb_logsunit); lsunit = BTOBB(mp->m_sb.sb_logsunit);
/* /*

View File

@@ -60,36 +60,14 @@ typedef uint8_t xfs_dqtype_t;
#define XFS_DQUOT_LOGRES(mp) \ #define XFS_DQUOT_LOGRES(mp) \
((sizeof(struct xfs_dq_logformat) + sizeof(struct xfs_disk_dquot)) * 6) ((sizeof(struct xfs_dq_logformat) + sizeof(struct xfs_disk_dquot)) * 6)
#define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT) #define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT) #define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT)
#define XFS_IS_PQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT) #define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT)
#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT) #define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT)
#define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD) #define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD)
#define XFS_IS_GQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_GQUOTA_ENFD) #define XFS_IS_GQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_GQUOTA_ENFD)
#define XFS_IS_PQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_PQUOTA_ENFD) #define XFS_IS_PQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_PQUOTA_ENFD)
/*
* Incore only flags for quotaoff - these bits get cleared when quota(s)
* are in the process of getting turned off. These flags are in m_qflags but
* never in sb_qflags.
*/
#define XFS_UQUOTA_ACTIVE 0x1000 /* uquotas are being turned off */
#define XFS_GQUOTA_ACTIVE 0x2000 /* gquotas are being turned off */
#define XFS_PQUOTA_ACTIVE 0x4000 /* pquotas are being turned off */
#define XFS_ALL_QUOTA_ACTIVE \
(XFS_UQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE)
/*
* Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees
* quota will be not be switched off as long as that inode lock is held.
*/
#define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \
XFS_GQUOTA_ACTIVE | \
XFS_PQUOTA_ACTIVE))
#define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE)
#define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE)
#define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE)
/* /*
* Flags to tell various functions what to do. Not all of these are meaningful * Flags to tell various functions what to do. Not all of these are meaningful
* to a single function. None of these XFS_QMOPT_* flags are meant to have * to a single function. None of these XFS_QMOPT_* flags are meant to have

View File

@@ -91,7 +91,7 @@ xfs_refcount_lookup_eq(
/* Convert on-disk record to in-core format. */ /* Convert on-disk record to in-core format. */
void void
xfs_refcount_btrec_to_irec( xfs_refcount_btrec_to_irec(
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
struct xfs_refcount_irec *irec) struct xfs_refcount_irec *irec)
{ {
irec->rc_startblock = be32_to_cpu(rec->refc.rc_startblock); irec->rc_startblock = be32_to_cpu(rec->refc.rc_startblock);
@@ -1253,7 +1253,7 @@ xfs_refcount_increase_extent(
struct xfs_trans *tp, struct xfs_trans *tp,
struct xfs_bmbt_irec *PREV) struct xfs_bmbt_irec *PREV)
{ {
if (!xfs_sb_version_hasreflink(&tp->t_mountp->m_sb)) if (!xfs_has_reflink(tp->t_mountp))
return; return;
__xfs_refcount_add(tp, XFS_REFCOUNT_INCREASE, PREV->br_startblock, __xfs_refcount_add(tp, XFS_REFCOUNT_INCREASE, PREV->br_startblock,
@@ -1268,7 +1268,7 @@ xfs_refcount_decrease_extent(
struct xfs_trans *tp, struct xfs_trans *tp,
struct xfs_bmbt_irec *PREV) struct xfs_bmbt_irec *PREV)
{ {
if (!xfs_sb_version_hasreflink(&tp->t_mountp->m_sb)) if (!xfs_has_reflink(tp->t_mountp))
return; return;
__xfs_refcount_add(tp, XFS_REFCOUNT_DECREASE, PREV->br_startblock, __xfs_refcount_add(tp, XFS_REFCOUNT_DECREASE, PREV->br_startblock,
@@ -1617,7 +1617,7 @@ xfs_refcount_alloc_cow_extent(
{ {
struct xfs_mount *mp = tp->t_mountp; struct xfs_mount *mp = tp->t_mountp;
if (!xfs_sb_version_hasreflink(&mp->m_sb)) if (!xfs_has_reflink(mp))
return; return;
__xfs_refcount_add(tp, XFS_REFCOUNT_ALLOC_COW, fsb, len); __xfs_refcount_add(tp, XFS_REFCOUNT_ALLOC_COW, fsb, len);
@@ -1636,7 +1636,7 @@ xfs_refcount_free_cow_extent(
{ {
struct xfs_mount *mp = tp->t_mountp; struct xfs_mount *mp = tp->t_mountp;
if (!xfs_sb_version_hasreflink(&mp->m_sb)) if (!xfs_has_reflink(mp))
return; return;
/* Remove rmap entry */ /* Remove rmap entry */
@@ -1654,7 +1654,7 @@ struct xfs_refcount_recovery {
STATIC int STATIC int
xfs_refcount_recover_extent( xfs_refcount_recover_extent(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
void *priv) void *priv)
{ {
struct list_head *debris = priv; struct list_head *debris = priv;

View File

@@ -78,7 +78,7 @@ static inline xfs_fileoff_t xfs_refcount_max_unmap(int log_res)
extern int xfs_refcount_has_record(struct xfs_btree_cur *cur, extern int xfs_refcount_has_record(struct xfs_btree_cur *cur,
xfs_agblock_t bno, xfs_extlen_t len, bool *exists); xfs_agblock_t bno, xfs_extlen_t len, bool *exists);
union xfs_btree_rec; union xfs_btree_rec;
extern void xfs_refcount_btrec_to_irec(union xfs_btree_rec *rec, extern void xfs_refcount_btrec_to_irec(const union xfs_btree_rec *rec,
struct xfs_refcount_irec *irec); struct xfs_refcount_irec *irec);
extern int xfs_refcount_insert(struct xfs_btree_cur *cur, extern int xfs_refcount_insert(struct xfs_btree_cur *cur,
struct xfs_refcount_irec *irec, int *stat); struct xfs_refcount_irec *irec, int *stat);

View File

@@ -32,7 +32,7 @@ xfs_refcountbt_dup_cursor(
STATIC void STATIC void
xfs_refcountbt_set_root( xfs_refcountbt_set_root(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int inc) int inc)
{ {
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
@@ -52,7 +52,7 @@ xfs_refcountbt_set_root(
STATIC int STATIC int
xfs_refcountbt_alloc_block( xfs_refcountbt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat) int *stat)
{ {
@@ -102,7 +102,7 @@ xfs_refcountbt_free_block(
struct xfs_mount *mp = cur->bc_mp; struct xfs_mount *mp = cur->bc_mp;
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
struct xfs_agf *agf = agbp->b_addr; struct xfs_agf *agf = agbp->b_addr;
xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, xfs_buf_daddr(bp));
int error; int error;
trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_ag.pag->pag_agno, trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_ag.pag->pag_agno,
@@ -136,7 +136,7 @@ xfs_refcountbt_get_maxrecs(
STATIC void STATIC void
xfs_refcountbt_init_key_from_rec( xfs_refcountbt_init_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->refc.rc_startblock = rec->refc.rc_startblock; key->refc.rc_startblock = rec->refc.rc_startblock;
} }
@@ -144,7 +144,7 @@ xfs_refcountbt_init_key_from_rec(
STATIC void STATIC void
xfs_refcountbt_init_high_key_from_rec( xfs_refcountbt_init_high_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
__u32 x; __u32 x;
@@ -178,10 +178,10 @@ xfs_refcountbt_init_ptr_from_cur(
STATIC int64_t STATIC int64_t
xfs_refcountbt_key_diff( xfs_refcountbt_key_diff(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *key) const union xfs_btree_key *key)
{ {
struct xfs_refcount_irec *rec = &cur->bc_rec.rc; struct xfs_refcount_irec *rec = &cur->bc_rec.rc;
struct xfs_refcount_key *kp = &key->refc; const struct xfs_refcount_key *kp = &key->refc;
return (int64_t)be32_to_cpu(kp->rc_startblock) - rec->rc_startblock; return (int64_t)be32_to_cpu(kp->rc_startblock) - rec->rc_startblock;
} }
@@ -189,8 +189,8 @@ xfs_refcountbt_key_diff(
STATIC int64_t STATIC int64_t
xfs_refcountbt_diff_two_keys( xfs_refcountbt_diff_two_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return (int64_t)be32_to_cpu(k1->refc.rc_startblock) - return (int64_t)be32_to_cpu(k1->refc.rc_startblock) -
be32_to_cpu(k2->refc.rc_startblock); be32_to_cpu(k2->refc.rc_startblock);
@@ -209,7 +209,7 @@ xfs_refcountbt_verify(
if (!xfs_verify_magic(bp, block->bb_magic)) if (!xfs_verify_magic(bp, block->bb_magic))
return __this_address; return __this_address;
if (!xfs_sb_version_hasreflink(&mp->m_sb)) if (!xfs_has_reflink(mp))
return __this_address; return __this_address;
fa = xfs_btree_sblock_v5hdr_verify(bp); fa = xfs_btree_sblock_v5hdr_verify(bp);
if (fa) if (fa)
@@ -270,8 +270,8 @@ const struct xfs_buf_ops xfs_refcountbt_buf_ops = {
STATIC int STATIC int
xfs_refcountbt_keys_inorder( xfs_refcountbt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
return be32_to_cpu(k1->refc.rc_startblock) < return be32_to_cpu(k1->refc.rc_startblock) <
be32_to_cpu(k2->refc.rc_startblock); be32_to_cpu(k2->refc.rc_startblock);
@@ -280,8 +280,8 @@ xfs_refcountbt_keys_inorder(
STATIC int STATIC int
xfs_refcountbt_recs_inorder( xfs_refcountbt_recs_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2) const union xfs_btree_rec *r2)
{ {
return be32_to_cpu(r1->refc.rc_startblock) + return be32_to_cpu(r1->refc.rc_startblock) +
be32_to_cpu(r1->refc.rc_blockcount) <= be32_to_cpu(r1->refc.rc_blockcount) <=
@@ -462,7 +462,7 @@ xfs_refcountbt_calc_reserves(
xfs_extlen_t tree_len; xfs_extlen_t tree_len;
int error; int error;
if (!xfs_sb_version_hasreflink(&mp->m_sb)) if (!xfs_has_reflink(mp))
return 0; return 0;
error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp); error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp);

View File

@@ -179,7 +179,7 @@ done:
/* Convert an internal btree record to an rmap record. */ /* Convert an internal btree record to an rmap record. */
int int
xfs_rmap_btrec_to_irec( xfs_rmap_btrec_to_irec(
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
struct xfs_rmap_irec *irec) struct xfs_rmap_irec *irec)
{ {
irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock); irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock);
@@ -256,7 +256,7 @@ struct xfs_find_left_neighbor_info {
STATIC int STATIC int
xfs_rmap_find_left_neighbor_helper( xfs_rmap_find_left_neighbor_helper(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xfs_find_left_neighbor_info *info = priv; struct xfs_find_left_neighbor_info *info = priv;
@@ -332,7 +332,7 @@ xfs_rmap_find_left_neighbor(
STATIC int STATIC int
xfs_rmap_lookup_le_range_helper( xfs_rmap_lookup_le_range_helper(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xfs_find_left_neighbor_info *info = priv; struct xfs_find_left_neighbor_info *info = priv;
@@ -705,7 +705,7 @@ xfs_rmap_free(
struct xfs_btree_cur *cur; struct xfs_btree_cur *cur;
int error; int error;
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return 0; return 0;
cur = xfs_rmapbt_init_cursor(mp, tp, agbp, pag); cur = xfs_rmapbt_init_cursor(mp, tp, agbp, pag);
@@ -959,7 +959,7 @@ xfs_rmap_alloc(
struct xfs_btree_cur *cur; struct xfs_btree_cur *cur;
int error; int error;
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return 0; return 0;
cur = xfs_rmapbt_init_cursor(mp, tp, agbp, pag); cur = xfs_rmapbt_init_cursor(mp, tp, agbp, pag);
@@ -2279,7 +2279,7 @@ struct xfs_rmap_query_range_info {
STATIC int STATIC int
xfs_rmap_query_range_helper( xfs_rmap_query_range_helper(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *rec, const union xfs_btree_rec *rec,
void *priv) void *priv)
{ {
struct xfs_rmap_query_range_info *query = priv; struct xfs_rmap_query_range_info *query = priv;
@@ -2296,8 +2296,8 @@ xfs_rmap_query_range_helper(
int int
xfs_rmap_query_range( xfs_rmap_query_range(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *low_rec, const struct xfs_rmap_irec *low_rec,
struct xfs_rmap_irec *high_rec, const struct xfs_rmap_irec *high_rec,
xfs_rmap_query_range_fn fn, xfs_rmap_query_range_fn fn,
void *priv) void *priv)
{ {
@@ -2459,7 +2459,7 @@ xfs_rmap_update_is_needed(
struct xfs_mount *mp, struct xfs_mount *mp,
int whichfork) int whichfork)
{ {
return xfs_sb_version_hasrmapbt(&mp->m_sb) && whichfork != XFS_COW_FORK; return xfs_has_rmapbt(mp) && whichfork != XFS_COW_FORK;
} }
/* /*
@@ -2707,7 +2707,7 @@ struct xfs_rmap_key_state {
STATIC int STATIC int
xfs_rmap_has_other_keys_helper( xfs_rmap_has_other_keys_helper(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xfs_rmap_key_state *rks = priv; struct xfs_rmap_key_state *rks = priv;

View File

@@ -135,11 +135,12 @@ int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec,
typedef int (*xfs_rmap_query_range_fn)( typedef int (*xfs_rmap_query_range_fn)(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv); void *priv);
int xfs_rmap_query_range(struct xfs_btree_cur *cur, int xfs_rmap_query_range(struct xfs_btree_cur *cur,
struct xfs_rmap_irec *low_rec, struct xfs_rmap_irec *high_rec, const struct xfs_rmap_irec *low_rec,
const struct xfs_rmap_irec *high_rec,
xfs_rmap_query_range_fn fn, void *priv); xfs_rmap_query_range_fn fn, void *priv);
int xfs_rmap_query_all(struct xfs_btree_cur *cur, xfs_rmap_query_range_fn fn, int xfs_rmap_query_all(struct xfs_btree_cur *cur, xfs_rmap_query_range_fn fn,
void *priv); void *priv);
@@ -192,7 +193,7 @@ int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno,
int xfs_rmap_compare(const struct xfs_rmap_irec *a, int xfs_rmap_compare(const struct xfs_rmap_irec *a,
const struct xfs_rmap_irec *b); const struct xfs_rmap_irec *b);
union xfs_btree_rec; union xfs_btree_rec;
int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, int xfs_rmap_btrec_to_irec(const union xfs_btree_rec *rec,
struct xfs_rmap_irec *irec); struct xfs_rmap_irec *irec);
int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno, int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno,
xfs_extlen_t len, bool *exists); xfs_extlen_t len, bool *exists);

View File

@@ -58,7 +58,7 @@ xfs_rmapbt_dup_cursor(
STATIC void STATIC void
xfs_rmapbt_set_root( xfs_rmapbt_set_root(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *ptr, const union xfs_btree_ptr *ptr,
int inc) int inc)
{ {
struct xfs_buf *agbp = cur->bc_ag.agbp; struct xfs_buf *agbp = cur->bc_ag.agbp;
@@ -77,7 +77,7 @@ xfs_rmapbt_set_root(
STATIC int STATIC int
xfs_rmapbt_alloc_block( xfs_rmapbt_alloc_block(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_ptr *start, const union xfs_btree_ptr *start,
union xfs_btree_ptr *new, union xfs_btree_ptr *new,
int *stat) int *stat)
{ {
@@ -122,7 +122,7 @@ xfs_rmapbt_free_block(
xfs_agblock_t bno; xfs_agblock_t bno;
int error; int error;
bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); bno = xfs_daddr_to_agbno(cur->bc_mp, xfs_buf_daddr(bp));
trace_xfs_rmapbt_free_block(cur->bc_mp, pag->pag_agno, trace_xfs_rmapbt_free_block(cur->bc_mp, pag->pag_agno,
bno, 1); bno, 1);
be32_add_cpu(&agf->agf_rmap_blocks, -1); be32_add_cpu(&agf->agf_rmap_blocks, -1);
@@ -157,7 +157,7 @@ xfs_rmapbt_get_maxrecs(
STATIC void STATIC void
xfs_rmapbt_init_key_from_rec( xfs_rmapbt_init_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
key->rmap.rm_startblock = rec->rmap.rm_startblock; key->rmap.rm_startblock = rec->rmap.rm_startblock;
key->rmap.rm_owner = rec->rmap.rm_owner; key->rmap.rm_owner = rec->rmap.rm_owner;
@@ -174,7 +174,7 @@ xfs_rmapbt_init_key_from_rec(
STATIC void STATIC void
xfs_rmapbt_init_high_key_from_rec( xfs_rmapbt_init_high_key_from_rec(
union xfs_btree_key *key, union xfs_btree_key *key,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
uint64_t off; uint64_t off;
int adj; int adj;
@@ -220,10 +220,10 @@ xfs_rmapbt_init_ptr_from_cur(
STATIC int64_t STATIC int64_t
xfs_rmapbt_key_diff( xfs_rmapbt_key_diff(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *key) const union xfs_btree_key *key)
{ {
struct xfs_rmap_irec *rec = &cur->bc_rec.r; struct xfs_rmap_irec *rec = &cur->bc_rec.r;
struct xfs_rmap_key *kp = &key->rmap; const struct xfs_rmap_key *kp = &key->rmap;
__u64 x, y; __u64 x, y;
int64_t d; int64_t d;
@@ -250,11 +250,11 @@ xfs_rmapbt_key_diff(
STATIC int64_t STATIC int64_t
xfs_rmapbt_diff_two_keys( xfs_rmapbt_diff_two_keys(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
struct xfs_rmap_key *kp1 = &k1->rmap; const struct xfs_rmap_key *kp1 = &k1->rmap;
struct xfs_rmap_key *kp2 = &k2->rmap; const struct xfs_rmap_key *kp2 = &k2->rmap;
int64_t d; int64_t d;
__u64 x, y; __u64 x, y;
@@ -304,7 +304,7 @@ xfs_rmapbt_verify(
if (!xfs_verify_magic(bp, block->bb_magic)) if (!xfs_verify_magic(bp, block->bb_magic))
return __this_address; return __this_address;
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return __this_address; return __this_address;
fa = xfs_btree_sblock_v5hdr_verify(bp); fa = xfs_btree_sblock_v5hdr_verify(bp);
if (fa) if (fa)
@@ -365,8 +365,8 @@ const struct xfs_buf_ops xfs_rmapbt_buf_ops = {
STATIC int STATIC int
xfs_rmapbt_keys_inorder( xfs_rmapbt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_key *k1, const union xfs_btree_key *k1,
union xfs_btree_key *k2) const union xfs_btree_key *k2)
{ {
uint32_t x; uint32_t x;
uint32_t y; uint32_t y;
@@ -395,8 +395,8 @@ xfs_rmapbt_keys_inorder(
STATIC int STATIC int
xfs_rmapbt_recs_inorder( xfs_rmapbt_recs_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
union xfs_btree_rec *r1, const union xfs_btree_rec *r1,
union xfs_btree_rec *r2) const union xfs_btree_rec *r2)
{ {
uint32_t x; uint32_t x;
uint32_t y; uint32_t y;
@@ -558,7 +558,7 @@ xfs_rmapbt_compute_maxlevels(
* disallow reflinking when less than 10% of the per-AG metadata * disallow reflinking when less than 10% of the per-AG metadata
* block reservation since the fallback is a regular file copy. * block reservation since the fallback is a regular file copy.
*/ */
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
mp->m_rmap_maxlevels = XFS_BTREE_MAXLEVELS; mp->m_rmap_maxlevels = XFS_BTREE_MAXLEVELS;
else else
mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels( mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(
@@ -606,7 +606,7 @@ xfs_rmapbt_calc_reserves(
xfs_extlen_t tree_len; xfs_extlen_t tree_len;
int error; int error;
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return 0; return 0;
error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp); error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp);

View File

@@ -1009,8 +1009,8 @@ xfs_rtfree_extent(
int int
xfs_rtalloc_query_range( xfs_rtalloc_query_range(
struct xfs_trans *tp, struct xfs_trans *tp,
struct xfs_rtalloc_rec *low_rec, const struct xfs_rtalloc_rec *low_rec,
struct xfs_rtalloc_rec *high_rec, const struct xfs_rtalloc_rec *high_rec,
xfs_rtalloc_query_range_fn fn, xfs_rtalloc_query_range_fn fn,
void *priv) void *priv)
{ {
@@ -1018,6 +1018,7 @@ xfs_rtalloc_query_range(
struct xfs_mount *mp = tp->t_mountp; struct xfs_mount *mp = tp->t_mountp;
xfs_rtblock_t rtstart; xfs_rtblock_t rtstart;
xfs_rtblock_t rtend; xfs_rtblock_t rtend;
xfs_rtblock_t high_key;
int is_free; int is_free;
int error = 0; int error = 0;
@@ -1026,12 +1027,12 @@ xfs_rtalloc_query_range(
if (low_rec->ar_startext >= mp->m_sb.sb_rextents || if (low_rec->ar_startext >= mp->m_sb.sb_rextents ||
low_rec->ar_startext == high_rec->ar_startext) low_rec->ar_startext == high_rec->ar_startext)
return 0; return 0;
high_rec->ar_startext = min(high_rec->ar_startext,
mp->m_sb.sb_rextents - 1); high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1);
/* Iterate the bitmap, looking for discrepancies. */ /* Iterate the bitmap, looking for discrepancies. */
rtstart = low_rec->ar_startext; rtstart = low_rec->ar_startext;
while (rtstart <= high_rec->ar_startext) { while (rtstart <= high_key) {
/* Is the first block free? */ /* Is the first block free? */
error = xfs_rtcheck_range(mp, tp, rtstart, 1, 1, &rtend, error = xfs_rtcheck_range(mp, tp, rtstart, 1, 1, &rtend,
&is_free); &is_free);
@@ -1039,8 +1040,7 @@ xfs_rtalloc_query_range(
break; break;
/* How long does the extent go for? */ /* How long does the extent go for? */
error = xfs_rtfind_forw(mp, tp, rtstart, error = xfs_rtfind_forw(mp, tp, rtstart, high_key, &rtend);
high_rec->ar_startext, &rtend);
if (error) if (error)
break; break;

View File

@@ -30,13 +30,110 @@
* Physical superblock buffer manipulations. Shared with libxfs in userspace. * Physical superblock buffer manipulations. Shared with libxfs in userspace.
*/ */
/*
* We support all XFS versions newer than a v4 superblock with V2 directories.
*/
bool
xfs_sb_good_version(
struct xfs_sb *sbp)
{
/* all v5 filesystems are supported */
if (xfs_sb_is_v5(sbp))
return true;
/* versions prior to v4 are not supported */
if (XFS_SB_VERSION_NUM(sbp) < XFS_SB_VERSION_4)
return false;
/* V4 filesystems need v2 directories and unwritten extents */
if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT))
return false;
if (!(sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT))
return false;
/* And must not have any unknown v4 feature bits set */
if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) ||
((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) &&
(sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS)))
return false;
/* It's a supported v4 filesystem */
return true;
}
uint64_t
xfs_sb_version_to_features(
struct xfs_sb *sbp)
{
uint64_t features = 0;
/* optional V4 features */
if (sbp->sb_rblocks > 0)
features |= XFS_FEAT_REALTIME;
if (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)
features |= XFS_FEAT_ATTR;
if (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT)
features |= XFS_FEAT_QUOTA;
if (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)
features |= XFS_FEAT_ALIGN;
if (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)
features |= XFS_FEAT_LOGV2;
if (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT)
features |= XFS_FEAT_DALIGN;
if (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)
features |= XFS_FEAT_EXTFLG;
if (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT)
features |= XFS_FEAT_SECTOR;
if (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT)
features |= XFS_FEAT_ASCIICI;
if (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) {
if (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)
features |= XFS_FEAT_LAZYSBCOUNT;
if (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
features |= XFS_FEAT_ATTR2;
if (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)
features |= XFS_FEAT_PROJID32;
if (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)
features |= XFS_FEAT_FTYPE;
}
if (!xfs_sb_is_v5(sbp))
return features;
/* Always on V5 features */
features |= XFS_FEAT_ALIGN | XFS_FEAT_LOGV2 | XFS_FEAT_EXTFLG |
XFS_FEAT_LAZYSBCOUNT | XFS_FEAT_ATTR2 | XFS_FEAT_PROJID32 |
XFS_FEAT_V3INODES | XFS_FEAT_CRC | XFS_FEAT_PQUOTINO;
/* Optional V5 features */
if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT)
features |= XFS_FEAT_FINOBT;
if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT)
features |= XFS_FEAT_RMAPBT;
if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_REFLINK)
features |= XFS_FEAT_REFLINK;
if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_INOBTCNT)
features |= XFS_FEAT_INOBTCNT;
if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_FTYPE)
features |= XFS_FEAT_FTYPE;
if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_SPINODES)
features |= XFS_FEAT_SPINODES;
if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID)
features |= XFS_FEAT_META_UUID;
if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_BIGTIME)
features |= XFS_FEAT_BIGTIME;
if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR)
features |= XFS_FEAT_NEEDSREPAIR;
return features;
}
/* Check all the superblock fields we care about when reading one in. */ /* Check all the superblock fields we care about when reading one in. */
STATIC int STATIC int
xfs_validate_sb_read( xfs_validate_sb_read(
struct xfs_mount *mp, struct xfs_mount *mp,
struct xfs_sb *sbp) struct xfs_sb *sbp)
{ {
if (XFS_SB_VERSION_NUM(sbp) != XFS_SB_VERSION_5) if (!xfs_sb_is_v5(sbp))
return 0; return 0;
/* /*
@@ -56,7 +153,7 @@ xfs_validate_sb_read(
"Superblock has unknown read-only compatible features (0x%x) enabled.", "Superblock has unknown read-only compatible features (0x%x) enabled.",
(sbp->sb_features_ro_compat & (sbp->sb_features_ro_compat &
XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { if (!xfs_is_readonly(mp)) {
xfs_warn(mp, xfs_warn(mp,
"Attempted to mount read-only compatible filesystem read-write."); "Attempted to mount read-only compatible filesystem read-write.");
xfs_warn(mp, xfs_warn(mp,
@@ -95,7 +192,7 @@ xfs_validate_sb_write(
* secondary superblocks, so allow this usage to continue because * secondary superblocks, so allow this usage to continue because
* we never read counters from such superblocks. * we never read counters from such superblocks.
*/ */
if (XFS_BUF_ADDR(bp) == XFS_SB_DADDR && !sbp->sb_inprogress && if (xfs_buf_daddr(bp) == XFS_SB_DADDR && !sbp->sb_inprogress &&
(sbp->sb_fdblocks > sbp->sb_dblocks || (sbp->sb_fdblocks > sbp->sb_dblocks ||
!xfs_verify_icount(mp, sbp->sb_icount) || !xfs_verify_icount(mp, sbp->sb_icount) ||
sbp->sb_ifree > sbp->sb_icount)) { sbp->sb_ifree > sbp->sb_icount)) {
@@ -103,7 +200,7 @@ xfs_validate_sb_write(
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
if (XFS_SB_VERSION_NUM(sbp) != XFS_SB_VERSION_5) if (!xfs_sb_is_v5(sbp))
return 0; return 0;
/* /*
@@ -162,6 +259,7 @@ xfs_validate_sb_common(
struct xfs_dsb *dsb = bp->b_addr; struct xfs_dsb *dsb = bp->b_addr;
uint32_t agcount = 0; uint32_t agcount = 0;
uint32_t rem; uint32_t rem;
bool has_dalign;
if (!xfs_verify_magic(bp, dsb->sb_magicnum)) { if (!xfs_verify_magic(bp, dsb->sb_magicnum)) {
xfs_warn(mp, "bad magic number"); xfs_warn(mp, "bad magic number");
@@ -173,25 +271,30 @@ xfs_validate_sb_common(
return -EWRONGFS; return -EWRONGFS;
} }
if (xfs_sb_version_has_pquotino(sbp)) { /*
* Validate feature flags and state
*/
if (xfs_sb_is_v5(sbp)) {
if (sbp->sb_blocksize < XFS_MIN_CRC_BLOCKSIZE) {
xfs_notice(mp,
"Block size (%u bytes) too small for Version 5 superblock (minimum %d bytes)",
sbp->sb_blocksize, XFS_MIN_CRC_BLOCKSIZE);
return -EFSCORRUPTED;
}
/* V5 has a separate project quota inode */
if (sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) { if (sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) {
xfs_notice(mp, xfs_notice(mp,
"Version 5 of Super block has XFS_OQUOTA bits."); "Version 5 of Super block has XFS_OQUOTA bits.");
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
} else if (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD |
XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) {
xfs_notice(mp,
"Superblock earlier than Version 5 has XFS_{P|G}QUOTA_{ENFD|CHKD} bits.");
return -EFSCORRUPTED;
}
/* /*
* Full inode chunks must be aligned to inode chunk size when * Full inode chunks must be aligned to inode chunk size when
* sparse inodes are enabled to support the sparse chunk * sparse inodes are enabled to support the sparse chunk
* allocation algorithm and prevent overlapping inode records. * allocation algorithm and prevent overlapping inode records.
*/ */
if (xfs_sb_version_hassparseinodes(sbp)) { if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_SPINODES) {
uint32_t align; uint32_t align;
align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize
@@ -203,6 +306,12 @@ xfs_validate_sb_common(
return -EINVAL; return -EINVAL;
} }
} }
} else if (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD |
XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) {
xfs_notice(mp,
"Superblock earlier than Version 5 has XFS_{P|G}QUOTA_{ENFD|CHKD} bits.");
return -EFSCORRUPTED;
}
if (unlikely( if (unlikely(
sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) {
@@ -303,7 +412,8 @@ xfs_validate_sb_common(
* Either (sb_unit and !hasdalign) or (!sb_unit and hasdalign) * Either (sb_unit and !hasdalign) or (!sb_unit and hasdalign)
* would imply the image is corrupted. * would imply the image is corrupted.
*/ */
if (!!sbp->sb_unit ^ xfs_sb_version_hasdalign(sbp)) { has_dalign = sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT;
if (!!sbp->sb_unit ^ has_dalign) {
xfs_notice(mp, "SB stripe alignment sanity check failed"); xfs_notice(mp, "SB stripe alignment sanity check failed");
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
@@ -312,12 +422,6 @@ xfs_validate_sb_common(
XFS_FSB_TO_B(mp, sbp->sb_width), 0, false)) XFS_FSB_TO_B(mp, sbp->sb_width), 0, false))
return -EFSCORRUPTED; return -EFSCORRUPTED;
if (xfs_sb_version_hascrc(&mp->m_sb) &&
sbp->sb_blocksize < XFS_MIN_CRC_BLOCKSIZE) {
xfs_notice(mp, "v5 SB sanity check failed");
return -EFSCORRUPTED;
}
/* /*
* Currently only very few inode sizes are supported. * Currently only very few inode sizes are supported.
*/ */
@@ -361,7 +465,7 @@ xfs_sb_quota_from_disk(struct xfs_sb *sbp)
* We need to do these manipilations only if we are working * We need to do these manipilations only if we are working
* with an older version of on-disk superblock. * with an older version of on-disk superblock.
*/ */
if (xfs_sb_version_has_pquotino(sbp)) if (xfs_sb_is_v5(sbp))
return; return;
if (sbp->sb_qflags & XFS_OQUOTA_ENFD) if (sbp->sb_qflags & XFS_OQUOTA_ENFD)
@@ -454,7 +558,8 @@ __xfs_sb_from_disk(
* sb_meta_uuid is only on disk if it differs from sb_uuid and the * sb_meta_uuid is only on disk if it differs from sb_uuid and the
* feature flag is set; if not set we keep it only in memory. * feature flag is set; if not set we keep it only in memory.
*/ */
if (xfs_sb_version_hasmetauuid(to)) if (xfs_sb_is_v5(to) &&
(to->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID))
uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid); uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid);
else else
uuid_copy(&to->sb_meta_uuid, &from->sb_uuid); uuid_copy(&to->sb_meta_uuid, &from->sb_uuid);
@@ -479,7 +584,12 @@ xfs_sb_quota_to_disk(
uint16_t qflags = from->sb_qflags; uint16_t qflags = from->sb_qflags;
to->sb_uquotino = cpu_to_be64(from->sb_uquotino); to->sb_uquotino = cpu_to_be64(from->sb_uquotino);
if (xfs_sb_version_has_pquotino(from)) {
/*
* The in-memory superblock quota state matches the v5 on-disk format so
* just write them out and return
*/
if (xfs_sb_is_v5(from)) {
to->sb_qflags = cpu_to_be16(from->sb_qflags); to->sb_qflags = cpu_to_be16(from->sb_qflags);
to->sb_gquotino = cpu_to_be64(from->sb_gquotino); to->sb_gquotino = cpu_to_be64(from->sb_gquotino);
to->sb_pquotino = cpu_to_be64(from->sb_pquotino); to->sb_pquotino = cpu_to_be64(from->sb_pquotino);
@@ -487,9 +597,9 @@ xfs_sb_quota_to_disk(
} }
/* /*
* The in-core version of sb_qflags do not have XFS_OQUOTA_* * For older superblocks (v4), the in-core version of sb_qflags do not
* flags, whereas the on-disk version does. So, convert incore * have XFS_OQUOTA_* flags, whereas the on-disk version does. So,
* XFS_{PG}QUOTA_* flags to on-disk XFS_OQUOTA_* flags. * convert incore XFS_{PG}QUOTA_* flags to on-disk XFS_OQUOTA_* flags.
*/ */
qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD |
XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD);
@@ -589,7 +699,9 @@ xfs_sb_to_disk(
to->sb_features2 = cpu_to_be32(from->sb_features2); to->sb_features2 = cpu_to_be32(from->sb_features2);
to->sb_bad_features2 = cpu_to_be32(from->sb_bad_features2); to->sb_bad_features2 = cpu_to_be32(from->sb_bad_features2);
if (xfs_sb_version_hascrc(from)) { if (!xfs_sb_is_v5(from))
return;
to->sb_features_compat = cpu_to_be32(from->sb_features_compat); to->sb_features_compat = cpu_to_be32(from->sb_features_compat);
to->sb_features_ro_compat = to->sb_features_ro_compat =
cpu_to_be32(from->sb_features_ro_compat); cpu_to_be32(from->sb_features_ro_compat);
@@ -599,9 +711,8 @@ xfs_sb_to_disk(
cpu_to_be32(from->sb_features_log_incompat); cpu_to_be32(from->sb_features_log_incompat);
to->sb_spino_align = cpu_to_be32(from->sb_spino_align); to->sb_spino_align = cpu_to_be32(from->sb_spino_align);
to->sb_lsn = cpu_to_be64(from->sb_lsn); to->sb_lsn = cpu_to_be64(from->sb_lsn);
if (xfs_sb_version_hasmetauuid(from)) if (from->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID)
uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid); uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid);
}
} }
/* /*
@@ -636,8 +747,8 @@ xfs_sb_read_verify(
if (!xfs_buf_verify_cksum(bp, XFS_SB_CRC_OFF)) { if (!xfs_buf_verify_cksum(bp, XFS_SB_CRC_OFF)) {
/* Only fail bad secondaries on a known V5 filesystem */ /* Only fail bad secondaries on a known V5 filesystem */
if (bp->b_bn == XFS_SB_DADDR || if (xfs_buf_daddr(bp) == XFS_SB_DADDR ||
xfs_sb_version_hascrc(&mp->m_sb)) { xfs_has_crc(mp)) {
error = -EFSBADCRC; error = -EFSBADCRC;
goto out_error; goto out_error;
} }
@@ -704,7 +815,7 @@ xfs_sb_write_verify(
if (error) if (error)
goto out_error; goto out_error;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_sb_is_v5(&sb))
return; return;
if (bip) if (bip)
@@ -801,7 +912,7 @@ xfs_log_sb(
* unclean shutdown, this will be corrected by log recovery rebuilding * unclean shutdown, this will be corrected by log recovery rebuilding
* the counters from the AGF block counts. * the counters from the AGF block counts.
*/ */
if (xfs_sb_version_haslazysbcount(&mp->m_sb)) { if (xfs_has_lazysbcount(mp)) {
mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount);
mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree);
mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks); mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks);
@@ -950,10 +1061,12 @@ out:
void void
xfs_fs_geometry( xfs_fs_geometry(
struct xfs_sb *sbp, struct xfs_mount *mp,
struct xfs_fsop_geom *geo, struct xfs_fsop_geom *geo,
int struct_version) int struct_version)
{ {
struct xfs_sb *sbp = &mp->m_sb;
memset(geo, 0, sizeof(struct xfs_fsop_geom)); memset(geo, 0, sizeof(struct xfs_fsop_geom));
geo->blocksize = sbp->sb_blocksize; geo->blocksize = sbp->sb_blocksize;
@@ -984,51 +1097,51 @@ xfs_fs_geometry(
geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK | geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK |
XFS_FSOP_GEOM_FLAGS_DIRV2 | XFS_FSOP_GEOM_FLAGS_DIRV2 |
XFS_FSOP_GEOM_FLAGS_EXTFLG; XFS_FSOP_GEOM_FLAGS_EXTFLG;
if (xfs_sb_version_hasattr(sbp)) if (xfs_has_attr(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR; geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR;
if (xfs_sb_version_hasquota(sbp)) if (xfs_has_quota(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_QUOTA; geo->flags |= XFS_FSOP_GEOM_FLAGS_QUOTA;
if (xfs_sb_version_hasalign(sbp)) if (xfs_has_align(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_IALIGN; geo->flags |= XFS_FSOP_GEOM_FLAGS_IALIGN;
if (xfs_sb_version_hasdalign(sbp)) if (xfs_has_dalign(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_DALIGN; geo->flags |= XFS_FSOP_GEOM_FLAGS_DALIGN;
if (xfs_sb_version_hassector(sbp)) if (xfs_has_asciici(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_SECTOR;
if (xfs_sb_version_hasasciici(sbp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_DIRV2CI; geo->flags |= XFS_FSOP_GEOM_FLAGS_DIRV2CI;
if (xfs_sb_version_haslazysbcount(sbp)) if (xfs_has_lazysbcount(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_LAZYSB; geo->flags |= XFS_FSOP_GEOM_FLAGS_LAZYSB;
if (xfs_sb_version_hasattr2(sbp)) if (xfs_has_attr2(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR2; geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR2;
if (xfs_sb_version_hasprojid32bit(sbp)) if (xfs_has_projid32(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_PROJID32; geo->flags |= XFS_FSOP_GEOM_FLAGS_PROJID32;
if (xfs_sb_version_hascrc(sbp)) if (xfs_has_crc(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_V5SB; geo->flags |= XFS_FSOP_GEOM_FLAGS_V5SB;
if (xfs_sb_version_hasftype(sbp)) if (xfs_has_ftype(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_FTYPE; geo->flags |= XFS_FSOP_GEOM_FLAGS_FTYPE;
if (xfs_sb_version_hasfinobt(sbp)) if (xfs_has_finobt(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_FINOBT; geo->flags |= XFS_FSOP_GEOM_FLAGS_FINOBT;
if (xfs_sb_version_hassparseinodes(sbp)) if (xfs_has_sparseinodes(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_SPINODES; geo->flags |= XFS_FSOP_GEOM_FLAGS_SPINODES;
if (xfs_sb_version_hasrmapbt(sbp)) if (xfs_has_rmapbt(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_RMAPBT; geo->flags |= XFS_FSOP_GEOM_FLAGS_RMAPBT;
if (xfs_sb_version_hasreflink(sbp)) if (xfs_has_reflink(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_REFLINK; geo->flags |= XFS_FSOP_GEOM_FLAGS_REFLINK;
if (xfs_sb_version_hasbigtime(sbp)) if (xfs_has_bigtime(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_BIGTIME; geo->flags |= XFS_FSOP_GEOM_FLAGS_BIGTIME;
if (xfs_sb_version_hasinobtcounts(sbp)) if (xfs_has_inobtcounts(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_INOBTCNT; geo->flags |= XFS_FSOP_GEOM_FLAGS_INOBTCNT;
if (xfs_sb_version_hassector(sbp)) if (xfs_has_sector(mp)) {
geo->flags |= XFS_FSOP_GEOM_FLAGS_SECTOR;
geo->logsectsize = sbp->sb_logsectsize; geo->logsectsize = sbp->sb_logsectsize;
else } else {
geo->logsectsize = BBSIZE; geo->logsectsize = BBSIZE;
}
geo->rtsectsize = sbp->sb_blocksize; geo->rtsectsize = sbp->sb_blocksize;
geo->dirblocksize = xfs_dir2_dirblock_bytes(sbp); geo->dirblocksize = xfs_dir2_dirblock_bytes(sbp);
if (struct_version < 4) if (struct_version < 4)
return; return;
if (xfs_sb_version_haslogv2(sbp)) if (xfs_has_logv2(mp))
geo->flags |= XFS_FSOP_GEOM_FLAGS_LOGV2; geo->flags |= XFS_FSOP_GEOM_FLAGS_LOGV2;
geo->logsunit = sbp->sb_logsunit; geo->logsunit = sbp->sb_logsunit;

View File

@@ -20,11 +20,13 @@ extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp);
extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from); extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from);
extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from); extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from);
extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp);
extern bool xfs_sb_good_version(struct xfs_sb *sbp);
extern uint64_t xfs_sb_version_to_features(struct xfs_sb *sbp);
extern int xfs_update_secondary_sbs(struct xfs_mount *mp); extern int xfs_update_secondary_sbs(struct xfs_mount *mp);
#define XFS_FS_GEOM_MAX_STRUCT_VER (4) #define XFS_FS_GEOM_MAX_STRUCT_VER (4)
extern void xfs_fs_geometry(struct xfs_sb *sbp, struct xfs_fsop_geom *geo, extern void xfs_fs_geometry(struct xfs_mount *mp, struct xfs_fsop_geom *geo,
int struct_version); int struct_version);
extern int xfs_sb_read_secondary(struct xfs_mount *mp, extern int xfs_sb_read_secondary(struct xfs_mount *mp,
struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_trans *tp, xfs_agnumber_t agno,

View File

@@ -42,7 +42,7 @@ xfs_symlink_hdr_set(
{ {
struct xfs_dsymlink_hdr *dsl = bp->b_addr; struct xfs_dsymlink_hdr *dsl = bp->b_addr;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return 0; return 0;
memset(dsl, 0, sizeof(struct xfs_dsymlink_hdr)); memset(dsl, 0, sizeof(struct xfs_dsymlink_hdr));
@@ -51,7 +51,7 @@ xfs_symlink_hdr_set(
dsl->sl_bytes = cpu_to_be32(size); dsl->sl_bytes = cpu_to_be32(size);
uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_meta_uuid);
dsl->sl_owner = cpu_to_be64(ino); dsl->sl_owner = cpu_to_be64(ino);
dsl->sl_blkno = cpu_to_be64(bp->b_bn); dsl->sl_blkno = cpu_to_be64(xfs_buf_daddr(bp));
bp->b_ops = &xfs_symlink_buf_ops; bp->b_ops = &xfs_symlink_buf_ops;
return sizeof(struct xfs_dsymlink_hdr); return sizeof(struct xfs_dsymlink_hdr);
@@ -89,13 +89,13 @@ xfs_symlink_verify(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
struct xfs_dsymlink_hdr *dsl = bp->b_addr; struct xfs_dsymlink_hdr *dsl = bp->b_addr;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return __this_address; return __this_address;
if (!xfs_verify_magic(bp, dsl->sl_magic)) if (!xfs_verify_magic(bp, dsl->sl_magic))
return __this_address; return __this_address;
if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_meta_uuid))
return __this_address; return __this_address;
if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) if (xfs_buf_daddr(bp) != be64_to_cpu(dsl->sl_blkno))
return __this_address; return __this_address;
if (be32_to_cpu(dsl->sl_offset) + if (be32_to_cpu(dsl->sl_offset) +
be32_to_cpu(dsl->sl_bytes) >= XFS_SYMLINK_MAXLEN) be32_to_cpu(dsl->sl_bytes) >= XFS_SYMLINK_MAXLEN)
@@ -116,7 +116,7 @@ xfs_symlink_read_verify(
xfs_failaddr_t fa; xfs_failaddr_t fa;
/* no verification of non-crc buffers */ /* no verification of non-crc buffers */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
if (!xfs_buf_verify_cksum(bp, XFS_SYMLINK_CRC_OFF)) if (!xfs_buf_verify_cksum(bp, XFS_SYMLINK_CRC_OFF))
@@ -137,7 +137,7 @@ xfs_symlink_write_verify(
xfs_failaddr_t fa; xfs_failaddr_t fa;
/* no verification of non-crc buffers */ /* no verification of non-crc buffers */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
fa = xfs_symlink_verify(bp); fa = xfs_symlink_verify(bp);
@@ -173,7 +173,7 @@ xfs_symlink_local_to_remote(
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SYMLINK_BUF); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SYMLINK_BUF);
if (!xfs_sb_version_hascrc(&mp->m_sb)) { if (!xfs_has_crc(mp)) {
bp->b_ops = NULL; bp->b_ops = NULL;
memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes);
xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1);

View File

@@ -136,7 +136,7 @@ xfs_trans_log_inode(
* to upgrade this inode to bigtime format, do so now. * to upgrade this inode to bigtime format, do so now.
*/ */
if ((flags & (XFS_ILOG_CORE | XFS_ILOG_TIMESTAMP)) && if ((flags & (XFS_ILOG_CORE | XFS_ILOG_TIMESTAMP)) &&
xfs_sb_version_hasbigtime(&ip->i_mount->m_sb) && xfs_has_bigtime(ip->i_mount) &&
!xfs_inode_has_bigtime(ip)) { !xfs_inode_has_bigtime(ip)) {
ip->i_diflags2 |= XFS_DIFLAG2_BIGTIME; ip->i_diflags2 |= XFS_DIFLAG2_BIGTIME;
flags |= XFS_ILOG_CORE; flags |= XFS_ILOG_CORE;

View File

@@ -71,9 +71,9 @@ xfs_allocfree_log_count(
uint blocks; uint blocks;
blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1); blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1);
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1); blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1);
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
blocks += num_ops * (2 * mp->m_refc_maxlevels - 1); blocks += num_ops * (2 * mp->m_refc_maxlevels - 1);
return blocks; return blocks;
@@ -155,7 +155,7 @@ STATIC uint
xfs_calc_finobt_res( xfs_calc_finobt_res(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
if (!xfs_sb_version_hasfinobt(&mp->m_sb)) if (!xfs_has_finobt(mp))
return 0; return 0;
return xfs_calc_inobt_res(mp); return xfs_calc_inobt_res(mp);
@@ -187,7 +187,7 @@ xfs_calc_inode_chunk_res(
XFS_FSB_TO_B(mp, 1)); XFS_FSB_TO_B(mp, 1));
if (alloc) { if (alloc) {
/* icreate tx uses ordered buffers */ /* icreate tx uses ordered buffers */
if (xfs_sb_version_has_v3inode(&mp->m_sb)) if (xfs_has_v3inodes(mp))
return res; return res;
size = XFS_FSB_TO_B(mp, 1); size = XFS_FSB_TO_B(mp, 1);
} }
@@ -268,7 +268,7 @@ xfs_calc_write_reservation(
xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) +
xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), blksz); xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), blksz);
if (xfs_sb_version_hasrealtime(&mp->m_sb)) { if (xfs_has_realtime(mp)) {
t2 = xfs_calc_inode_res(mp, 1) + t2 = xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK),
blksz) + blksz) +
@@ -317,7 +317,7 @@ xfs_calc_itruncate_reservation(
t2 = xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + t2 = xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) +
xfs_calc_buf_res(xfs_allocfree_log_count(mp, 4), blksz); xfs_calc_buf_res(xfs_allocfree_log_count(mp, 4), blksz);
if (xfs_sb_version_hasrealtime(&mp->m_sb)) { if (xfs_has_realtime(mp)) {
t3 = xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + t3 = xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) +
xfs_calc_buf_res(xfs_rtalloc_log_count(mp, 2), blksz) + xfs_calc_buf_res(xfs_rtalloc_log_count(mp, 2), blksz) +
xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), blksz); xfs_calc_buf_res(xfs_allocfree_log_count(mp, 2), blksz);
@@ -798,29 +798,6 @@ xfs_calc_qm_dqalloc_reservation(
XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1);
} }
/*
* Turning off quotas.
* the quota off logitems: sizeof(struct xfs_qoff_logitem) * 2
* the superblock for the quota flags: sector size
*/
STATIC uint
xfs_calc_qm_quotaoff_reservation(
struct xfs_mount *mp)
{
return sizeof(struct xfs_qoff_logitem) * 2 +
xfs_calc_buf_res(1, mp->m_sb.sb_sectsize);
}
/*
* End of turning off quotas.
* the quota off logitems: sizeof(struct xfs_qoff_logitem) * 2
*/
STATIC uint
xfs_calc_qm_quotaoff_end_reservation(void)
{
return sizeof(struct xfs_qoff_logitem) * 2;
}
/* /*
* Syncing the incore super block changes to disk. * Syncing the incore super block changes to disk.
* the super block to reflect the changes: sector size * the super block to reflect the changes: sector size
@@ -842,14 +819,14 @@ xfs_trans_resv_calc(
* require a permanent reservation on space. * require a permanent reservation on space.
*/ */
resp->tr_write.tr_logres = xfs_calc_write_reservation(mp); resp->tr_write.tr_logres = xfs_calc_write_reservation(mp);
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK; resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK;
else else
resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT; resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT;
resp->tr_write.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_write.tr_logflags |= XFS_TRANS_PERM_LOG_RES;
resp->tr_itruncate.tr_logres = xfs_calc_itruncate_reservation(mp); resp->tr_itruncate.tr_logres = xfs_calc_itruncate_reservation(mp);
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
resp->tr_itruncate.tr_logcount = resp->tr_itruncate.tr_logcount =
XFS_ITRUNCATE_LOG_COUNT_REFLINK; XFS_ITRUNCATE_LOG_COUNT_REFLINK;
else else
@@ -910,7 +887,7 @@ xfs_trans_resv_calc(
resp->tr_growrtalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_growrtalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES;
resp->tr_qm_dqalloc.tr_logres = xfs_calc_qm_dqalloc_reservation(mp); resp->tr_qm_dqalloc.tr_logres = xfs_calc_qm_dqalloc_reservation(mp);
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK; resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK;
else else
resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT; resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT;
@@ -923,13 +900,6 @@ xfs_trans_resv_calc(
resp->tr_qm_setqlim.tr_logres = xfs_calc_qm_setqlim_reservation(); resp->tr_qm_setqlim.tr_logres = xfs_calc_qm_setqlim_reservation();
resp->tr_qm_setqlim.tr_logcount = XFS_DEFAULT_LOG_COUNT; resp->tr_qm_setqlim.tr_logcount = XFS_DEFAULT_LOG_COUNT;
resp->tr_qm_quotaoff.tr_logres = xfs_calc_qm_quotaoff_reservation(mp);
resp->tr_qm_quotaoff.tr_logcount = XFS_DEFAULT_LOG_COUNT;
resp->tr_qm_equotaoff.tr_logres =
xfs_calc_qm_quotaoff_end_reservation();
resp->tr_qm_equotaoff.tr_logcount = XFS_DEFAULT_LOG_COUNT;
resp->tr_sb.tr_logres = xfs_calc_sb_reservation(mp); resp->tr_sb.tr_logres = xfs_calc_sb_reservation(mp);
resp->tr_sb.tr_logcount = XFS_DEFAULT_LOG_COUNT; resp->tr_sb.tr_logcount = XFS_DEFAULT_LOG_COUNT;

View File

@@ -46,8 +46,6 @@ struct xfs_trans_resv {
struct xfs_trans_res tr_growrtfree; /* grow realtime freeing */ struct xfs_trans_res tr_growrtfree; /* grow realtime freeing */
struct xfs_trans_res tr_qm_setqlim; /* adjust quota limits */ struct xfs_trans_res tr_qm_setqlim; /* adjust quota limits */
struct xfs_trans_res tr_qm_dqalloc; /* allocate quota on disk */ struct xfs_trans_res tr_qm_dqalloc; /* allocate quota on disk */
struct xfs_trans_res tr_qm_quotaoff; /* turn quota off */
struct xfs_trans_res tr_qm_equotaoff;/* end of turn quota off */
struct xfs_trans_res tr_sb; /* modify superblock */ struct xfs_trans_res tr_sb; /* modify superblock */
struct xfs_trans_res tr_fsyncts; /* update timestamps on fsync */ struct xfs_trans_res tr_fsyncts; /* update timestamps on fsync */
}; };

View File

@@ -57,8 +57,7 @@
XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK)
#define XFS_IALLOC_SPACE_RES(mp) \ #define XFS_IALLOC_SPACE_RES(mp) \
(M_IGEO(mp)->ialloc_blks + \ (M_IGEO(mp)->ialloc_blks + \
((xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1) * \ ((xfs_has_finobt(mp) ? 2 : 1) * M_IGEO(mp)->inobt_maxlevels))
M_IGEO(mp)->inobt_maxlevels))
/* /*
* Space reservation values for various transactions. * Space reservation values for various transactions.
@@ -94,8 +93,7 @@
#define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ #define XFS_SYMLINK_SPACE_RES(mp,nl,b) \
(XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b))
#define XFS_IFREE_SPACE_RES(mp) \ #define XFS_IFREE_SPACE_RES(mp) \
(xfs_sb_version_hasfinobt(&mp->m_sb) ? \ (xfs_has_finobt(mp) ? M_IGEO(mp)->inobt_maxlevels : 0)
M_IGEO(mp)->inobt_maxlevels : 0)
#endif /* __XFS_TRANS_SPACE_H__ */ #endif /* __XFS_TRANS_SPACE_H__ */

View File

@@ -169,7 +169,7 @@ xfs_internal_inum(
xfs_ino_t ino) xfs_ino_t ino)
{ {
return ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino || return ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino ||
(xfs_sb_version_hasquota(&mp->m_sb) && (xfs_has_quota(mp) &&
xfs_is_quota_inode(&mp->m_sb, ino)); xfs_is_quota_inode(&mp->m_sb, ino));
} }

View File

@@ -87,6 +87,11 @@ typedef void * xfs_failaddr_t;
#define XFS_ATTR_FORK 1 #define XFS_ATTR_FORK 1
#define XFS_COW_FORK 2 #define XFS_COW_FORK 2
#define XFS_WHICHFORK_STRINGS \
{ XFS_DATA_FORK, "data" }, \
{ XFS_ATTR_FORK, "attr" }, \
{ XFS_COW_FORK, "cow" }
/* /*
* Min numbers of data/attr fork btree root pointers. * Min numbers of data/attr fork btree root pointers.
*/ */

View File

@@ -36,7 +36,7 @@ xchk_superblock_xref(
agbno = XFS_SB_BLOCK(mp); agbno = XFS_SB_BLOCK(mp);
error = xchk_ag_init(sc, agno, &sc->sa); error = xchk_ag_init_existing(sc, agno, &sc->sa);
if (!xchk_xref_process_error(sc, agno, agbno, &error)) if (!xchk_xref_process_error(sc, agno, agbno, &error))
return; return;
@@ -63,6 +63,7 @@ xchk_superblock(
struct xfs_mount *mp = sc->mp; struct xfs_mount *mp = sc->mp;
struct xfs_buf *bp; struct xfs_buf *bp;
struct xfs_dsb *sb; struct xfs_dsb *sb;
struct xfs_perag *pag;
xfs_agnumber_t agno; xfs_agnumber_t agno;
uint32_t v2_ok; uint32_t v2_ok;
__be32 features_mask; __be32 features_mask;
@@ -73,6 +74,15 @@ xchk_superblock(
if (agno == 0) if (agno == 0)
return 0; return 0;
/*
* Grab an active reference to the perag structure. If we can't get
* it, we're racing with something that's tearing down the AG, so
* signal that the AG no longer exists.
*/
pag = xfs_perag_get(mp, agno);
if (!pag)
return -ENOENT;
error = xfs_sb_read_secondary(mp, sc->tp, agno, &bp); error = xfs_sb_read_secondary(mp, sc->tp, agno, &bp);
/* /*
* The superblock verifier can return several different error codes * The superblock verifier can return several different error codes
@@ -92,7 +102,7 @@ xchk_superblock(
break; break;
} }
if (!xchk_process_error(sc, agno, XFS_SB_BLOCK(mp), &error)) if (!xchk_process_error(sc, agno, XFS_SB_BLOCK(mp), &error))
return error; goto out_pag;
sb = bp->b_addr; sb = bp->b_addr;
@@ -248,7 +258,7 @@ xchk_superblock(
xchk_block_set_corrupt(sc, bp); xchk_block_set_corrupt(sc, bp);
} else { } else {
v2_ok = XFS_SB_VERSION2_OKBITS; v2_ok = XFS_SB_VERSION2_OKBITS;
if (XFS_SB_VERSION_NUM(&mp->m_sb) >= XFS_SB_VERSION_5) if (xfs_sb_is_v5(&mp->m_sb))
v2_ok |= XFS_SB_VERSION2_CRCBIT; v2_ok |= XFS_SB_VERSION2_CRCBIT;
if (!!(sb->sb_features2 & cpu_to_be32(~v2_ok))) if (!!(sb->sb_features2 & cpu_to_be32(~v2_ok)))
@@ -273,7 +283,7 @@ xchk_superblock(
(cpu_to_be32(mp->m_sb.sb_features2) & features_mask)) (cpu_to_be32(mp->m_sb.sb_features2) & features_mask))
xchk_block_set_corrupt(sc, bp); xchk_block_set_corrupt(sc, bp);
if (!xfs_sb_version_hascrc(&mp->m_sb)) { if (!xfs_has_crc(mp)) {
/* all v5 fields must be zero */ /* all v5 fields must be zero */
if (memchr_inv(&sb->sb_features_compat, 0, if (memchr_inv(&sb->sb_features_compat, 0,
sizeof(struct xfs_dsb) - sizeof(struct xfs_dsb) -
@@ -324,7 +334,7 @@ xchk_superblock(
/* Don't care about sb_lsn */ /* Don't care about sb_lsn */
} }
if (xfs_sb_version_hasmetauuid(&mp->m_sb)) { if (xfs_has_metauuid(mp)) {
/* The metadata UUID must be the same for all supers */ /* The metadata UUID must be the same for all supers */
if (!uuid_equal(&sb->sb_meta_uuid, &mp->m_sb.sb_meta_uuid)) if (!uuid_equal(&sb->sb_meta_uuid, &mp->m_sb.sb_meta_uuid))
xchk_block_set_corrupt(sc, bp); xchk_block_set_corrupt(sc, bp);
@@ -336,7 +346,8 @@ xchk_superblock(
xchk_block_set_corrupt(sc, bp); xchk_block_set_corrupt(sc, bp);
xchk_superblock_xref(sc, bp); xchk_superblock_xref(sc, bp);
out_pag:
xfs_perag_put(pag);
return error; return error;
} }
@@ -346,7 +357,7 @@ xchk_superblock(
STATIC int STATIC int
xchk_agf_record_bno_lengths( xchk_agf_record_bno_lengths(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_alloc_rec_incore *rec, const struct xfs_alloc_rec_incore *rec,
void *priv) void *priv)
{ {
xfs_extlen_t *blocks = priv; xfs_extlen_t *blocks = priv;
@@ -419,7 +430,7 @@ xchk_agf_xref_btreeblks(
int error; int error;
/* agf_btreeblks didn't exist before lazysbcount */ /* agf_btreeblks didn't exist before lazysbcount */
if (!xfs_sb_version_haslazysbcount(&sc->mp->m_sb)) if (!xfs_has_lazysbcount(sc->mp))
return; return;
/* Check agf_rmap_blocks; set up for agf_btreeblks check */ /* Check agf_rmap_blocks; set up for agf_btreeblks check */
@@ -438,7 +449,7 @@ xchk_agf_xref_btreeblks(
* No rmap cursor; we can't xref if we have the rmapbt feature. * No rmap cursor; we can't xref if we have the rmapbt feature.
* We also can't do it if we're missing the free space btree cursors. * We also can't do it if we're missing the free space btree cursors.
*/ */
if ((xfs_sb_version_hasrmapbt(&mp->m_sb) && !sc->sa.rmap_cur) || if ((xfs_has_rmapbt(mp) && !sc->sa.rmap_cur) ||
!sc->sa.bno_cur || !sc->sa.cnt_cur) !sc->sa.bno_cur || !sc->sa.cnt_cur)
return; return;
@@ -527,6 +538,7 @@ xchk_agf(
xchk_buffer_recheck(sc, sc->sa.agf_bp); xchk_buffer_recheck(sc, sc->sa.agf_bp);
agf = sc->sa.agf_bp->b_addr; agf = sc->sa.agf_bp->b_addr;
pag = sc->sa.pag;
/* Check the AG length */ /* Check the AG length */
eoag = be32_to_cpu(agf->agf_length); eoag = be32_to_cpu(agf->agf_length);
@@ -550,7 +562,7 @@ xchk_agf(
if (level <= 0 || level > XFS_BTREE_MAXLEVELS) if (level <= 0 || level > XFS_BTREE_MAXLEVELS)
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { if (xfs_has_rmapbt(mp)) {
agbno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_RMAP]); agbno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_RMAP]);
if (!xfs_verify_agbno(mp, agno, agbno)) if (!xfs_verify_agbno(mp, agno, agbno))
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
@@ -560,7 +572,7 @@ xchk_agf(
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
} }
if (xfs_sb_version_hasreflink(&mp->m_sb)) { if (xfs_has_reflink(mp)) {
agbno = be32_to_cpu(agf->agf_refcount_root); agbno = be32_to_cpu(agf->agf_refcount_root);
if (!xfs_verify_agbno(mp, agno, agbno)) if (!xfs_verify_agbno(mp, agno, agbno))
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
@@ -582,15 +594,13 @@ xchk_agf(
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
/* Do the incore counters match? */ /* Do the incore counters match? */
pag = xfs_perag_get(mp, agno);
if (pag->pagf_freeblks != be32_to_cpu(agf->agf_freeblks)) if (pag->pagf_freeblks != be32_to_cpu(agf->agf_freeblks))
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
if (pag->pagf_flcount != be32_to_cpu(agf->agf_flcount)) if (pag->pagf_flcount != be32_to_cpu(agf->agf_flcount))
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
if (xfs_sb_version_haslazysbcount(&sc->mp->m_sb) && if (xfs_has_lazysbcount(sc->mp) &&
pag->pagf_btreeblks != be32_to_cpu(agf->agf_btreeblks)) pag->pagf_btreeblks != be32_to_cpu(agf->agf_btreeblks))
xchk_block_set_corrupt(sc, sc->sa.agf_bp); xchk_block_set_corrupt(sc, sc->sa.agf_bp);
xfs_perag_put(pag);
xchk_agf_xref(sc); xchk_agf_xref(sc);
out: out:
@@ -630,7 +640,7 @@ xchk_agfl_block(
{ {
struct xchk_agfl_info *sai = priv; struct xchk_agfl_info *sai = priv;
struct xfs_scrub *sc = sai->sc; struct xfs_scrub *sc = sai->sc;
xfs_agnumber_t agno = sc->sa.agno; xfs_agnumber_t agno = sc->sa.pag->pag_agno;
if (xfs_verify_agbno(mp, agno, agbno) && if (xfs_verify_agbno(mp, agno, agbno) &&
sai->nr_entries < sai->sz_entries) sai->nr_entries < sai->sz_entries)
@@ -787,7 +797,7 @@ xchk_agi_xref_fiblocks(
xfs_agblock_t blocks; xfs_agblock_t blocks;
int error = 0; int error = 0;
if (!xfs_sb_version_hasinobtcounts(&sc->mp->m_sb)) if (!xfs_has_inobtcounts(sc->mp))
return; return;
if (sc->sa.ino_cur) { if (sc->sa.ino_cur) {
@@ -857,6 +867,7 @@ xchk_agi(
xchk_buffer_recheck(sc, sc->sa.agi_bp); xchk_buffer_recheck(sc, sc->sa.agi_bp);
agi = sc->sa.agi_bp->b_addr; agi = sc->sa.agi_bp->b_addr;
pag = sc->sa.pag;
/* Check the AG length */ /* Check the AG length */
eoag = be32_to_cpu(agi->agi_length); eoag = be32_to_cpu(agi->agi_length);
@@ -872,7 +883,7 @@ xchk_agi(
if (level <= 0 || level > XFS_BTREE_MAXLEVELS) if (level <= 0 || level > XFS_BTREE_MAXLEVELS)
xchk_block_set_corrupt(sc, sc->sa.agi_bp); xchk_block_set_corrupt(sc, sc->sa.agi_bp);
if (xfs_sb_version_hasfinobt(&mp->m_sb)) { if (xfs_has_finobt(mp)) {
agbno = be32_to_cpu(agi->agi_free_root); agbno = be32_to_cpu(agi->agi_free_root);
if (!xfs_verify_agbno(mp, agno, agbno)) if (!xfs_verify_agbno(mp, agno, agbno))
xchk_block_set_corrupt(sc, sc->sa.agi_bp); xchk_block_set_corrupt(sc, sc->sa.agi_bp);
@@ -909,12 +920,10 @@ xchk_agi(
xchk_block_set_corrupt(sc, sc->sa.agi_bp); xchk_block_set_corrupt(sc, sc->sa.agi_bp);
/* Do the incore counters match? */ /* Do the incore counters match? */
pag = xfs_perag_get(mp, agno);
if (pag->pagi_count != be32_to_cpu(agi->agi_count)) if (pag->pagi_count != be32_to_cpu(agi->agi_count))
xchk_block_set_corrupt(sc, sc->sa.agi_bp); xchk_block_set_corrupt(sc, sc->sa.agi_bp);
if (pag->pagi_freecount != be32_to_cpu(agi->agi_freecount)) if (pag->pagi_freecount != be32_to_cpu(agi->agi_freecount))
xchk_block_set_corrupt(sc, sc->sa.agi_bp); xchk_block_set_corrupt(sc, sc->sa.agi_bp);
xfs_perag_put(pag);
xchk_agi_xref(sc); xchk_agi_xref(sc);
out: out:

View File

@@ -70,7 +70,7 @@ struct xrep_agf_allocbt {
STATIC int STATIC int
xrep_agf_walk_allocbt( xrep_agf_walk_allocbt(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_alloc_rec_incore *rec, const struct xfs_alloc_rec_incore *rec,
void *priv) void *priv)
{ {
struct xrep_agf_allocbt *raa = priv; struct xrep_agf_allocbt *raa = priv;
@@ -94,7 +94,7 @@ xrep_agf_check_agfl_block(
{ {
struct xfs_scrub *sc = priv; struct xfs_scrub *sc = priv;
if (!xfs_verify_agbno(mp, sc->sa.agno, agbno)) if (!xfs_verify_agbno(mp, sc->sa.pag->pag_agno, agbno))
return -EFSCORRUPTED; return -EFSCORRUPTED;
return 0; return 0;
} }
@@ -164,7 +164,7 @@ xrep_agf_find_btrees(
return -EFSCORRUPTED; return -EFSCORRUPTED;
/* We must find the refcountbt root if that feature is enabled. */ /* We must find the refcountbt root if that feature is enabled. */
if (xfs_sb_version_hasreflink(&sc->mp->m_sb) && if (xfs_has_reflink(sc->mp) &&
!xrep_check_btree_root(sc, &fab[XREP_AGF_REFCOUNTBT])) !xrep_check_btree_root(sc, &fab[XREP_AGF_REFCOUNTBT]))
return -EFSCORRUPTED; return -EFSCORRUPTED;
@@ -188,12 +188,13 @@ xrep_agf_init_header(
memset(agf, 0, BBTOB(agf_bp->b_length)); memset(agf, 0, BBTOB(agf_bp->b_length));
agf->agf_magicnum = cpu_to_be32(XFS_AGF_MAGIC); agf->agf_magicnum = cpu_to_be32(XFS_AGF_MAGIC);
agf->agf_versionnum = cpu_to_be32(XFS_AGF_VERSION); agf->agf_versionnum = cpu_to_be32(XFS_AGF_VERSION);
agf->agf_seqno = cpu_to_be32(sc->sa.agno); agf->agf_seqno = cpu_to_be32(sc->sa.pag->pag_agno);
agf->agf_length = cpu_to_be32(xfs_ag_block_count(mp, sc->sa.agno)); agf->agf_length = cpu_to_be32(xfs_ag_block_count(mp,
sc->sa.pag->pag_agno));
agf->agf_flfirst = old_agf->agf_flfirst; agf->agf_flfirst = old_agf->agf_flfirst;
agf->agf_fllast = old_agf->agf_fllast; agf->agf_fllast = old_agf->agf_fllast;
agf->agf_flcount = old_agf->agf_flcount; agf->agf_flcount = old_agf->agf_flcount;
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid);
/* Mark the incore AGF data stale until we're done fixing things. */ /* Mark the incore AGF data stale until we're done fixing things. */
@@ -223,7 +224,7 @@ xrep_agf_set_roots(
agf->agf_levels[XFS_BTNUM_RMAPi] = agf->agf_levels[XFS_BTNUM_RMAPi] =
cpu_to_be32(fab[XREP_AGF_RMAPBT].height); cpu_to_be32(fab[XREP_AGF_RMAPBT].height);
if (xfs_sb_version_hasreflink(&sc->mp->m_sb)) { if (xfs_has_reflink(sc->mp)) {
agf->agf_refcount_root = agf->agf_refcount_root =
cpu_to_be32(fab[XREP_AGF_REFCOUNTBT].root); cpu_to_be32(fab[XREP_AGF_REFCOUNTBT].root);
agf->agf_refcount_level = agf->agf_refcount_level =
@@ -280,7 +281,7 @@ xrep_agf_calc_from_btrees(
agf->agf_btreeblks = cpu_to_be32(btreeblks); agf->agf_btreeblks = cpu_to_be32(btreeblks);
/* Update the AGF counters from the refcountbt. */ /* Update the AGF counters from the refcountbt. */
if (xfs_sb_version_hasreflink(&mp->m_sb)) { if (xfs_has_reflink(mp)) {
cur = xfs_refcountbt_init_cursor(mp, sc->tp, agf_bp, cur = xfs_refcountbt_init_cursor(mp, sc->tp, agf_bp,
sc->sa.pag); sc->sa.pag);
error = xfs_btree_count_blocks(cur, &blocks); error = xfs_btree_count_blocks(cur, &blocks);
@@ -363,16 +364,16 @@ xrep_agf(
int error; int error;
/* We require the rmapbt to rebuild anything. */ /* We require the rmapbt to rebuild anything. */
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return -EOPNOTSUPP; return -EOPNOTSUPP;
xchk_perag_get(sc->mp, &sc->sa);
/* /*
* Make sure we have the AGF buffer, as scrub might have decided it * Make sure we have the AGF buffer, as scrub might have decided it
* was corrupt after xfs_alloc_read_agf failed with -EFSCORRUPTED. * was corrupt after xfs_alloc_read_agf failed with -EFSCORRUPTED.
*/ */
error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp, error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp,
XFS_AG_DADDR(mp, sc->sa.agno, XFS_AGF_DADDR(mp)), XFS_AG_DADDR(mp, sc->sa.pag->pag_agno,
XFS_AGF_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), 0, &agf_bp, NULL); XFS_FSS_TO_BB(mp, 1), 0, &agf_bp, NULL);
if (error) if (error)
return error; return error;
@@ -388,7 +389,7 @@ xrep_agf(
* btrees rooted in the AGF. If the AGFL contents are obviously bad * btrees rooted in the AGF. If the AGFL contents are obviously bad
* then we'll bail out. * then we'll bail out.
*/ */
error = xfs_alloc_read_agfl(mp, sc->tp, sc->sa.agno, &agfl_bp); error = xfs_alloc_read_agfl(mp, sc->tp, sc->sa.pag->pag_agno, &agfl_bp);
if (error) if (error)
return error; return error;
@@ -442,7 +443,7 @@ struct xrep_agfl {
STATIC int STATIC int
xrep_agfl_walk_rmap( xrep_agfl_walk_rmap(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xrep_agfl *ra = priv; struct xrep_agfl *ra = priv;
@@ -586,7 +587,7 @@ xrep_agfl_init_header(
agfl = XFS_BUF_TO_AGFL(agfl_bp); agfl = XFS_BUF_TO_AGFL(agfl_bp);
memset(agfl, 0xFF, BBTOB(agfl_bp->b_length)); memset(agfl, 0xFF, BBTOB(agfl_bp->b_length));
agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC);
agfl->agfl_seqno = cpu_to_be32(sc->sa.agno); agfl->agfl_seqno = cpu_to_be32(sc->sa.pag->pag_agno);
uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid);
/* /*
@@ -599,7 +600,8 @@ xrep_agfl_init_header(
for_each_xbitmap_extent(br, n, agfl_extents) { for_each_xbitmap_extent(br, n, agfl_extents) {
agbno = XFS_FSB_TO_AGBNO(mp, br->start); agbno = XFS_FSB_TO_AGBNO(mp, br->start);
trace_xrep_agfl_insert(mp, sc->sa.agno, agbno, br->len); trace_xrep_agfl_insert(mp, sc->sa.pag->pag_agno, agbno,
br->len);
while (br->len > 0 && fl_off < flcount) { while (br->len > 0 && fl_off < flcount) {
agfl_bno[fl_off] = cpu_to_be32(agbno); agfl_bno[fl_off] = cpu_to_be32(agbno);
@@ -638,10 +640,9 @@ xrep_agfl(
int error; int error;
/* We require the rmapbt to rebuild anything. */ /* We require the rmapbt to rebuild anything. */
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return -EOPNOTSUPP; return -EOPNOTSUPP;
xchk_perag_get(sc->mp, &sc->sa);
xbitmap_init(&agfl_extents); xbitmap_init(&agfl_extents);
/* /*
@@ -649,7 +650,8 @@ xrep_agfl(
* nothing wrong with the AGF, but all the AG header repair functions * nothing wrong with the AGF, but all the AG header repair functions
* have this chicken-and-egg problem. * have this chicken-and-egg problem.
*/ */
error = xfs_alloc_read_agf(mp, sc->tp, sc->sa.agno, 0, &agf_bp); error = xfs_alloc_read_agf(mp, sc->tp, sc->sa.pag->pag_agno, 0,
&agf_bp);
if (error) if (error)
return error; return error;
@@ -658,7 +660,8 @@ xrep_agfl(
* was corrupt after xfs_alloc_read_agfl failed with -EFSCORRUPTED. * was corrupt after xfs_alloc_read_agfl failed with -EFSCORRUPTED.
*/ */
error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp, error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp,
XFS_AG_DADDR(mp, sc->sa.agno, XFS_AGFL_DADDR(mp)), XFS_AG_DADDR(mp, sc->sa.pag->pag_agno,
XFS_AGFL_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), 0, &agfl_bp, NULL); XFS_FSS_TO_BB(mp, 1), 0, &agfl_bp, NULL);
if (error) if (error)
return error; return error;
@@ -723,7 +726,8 @@ xrep_agi_find_btrees(
int error; int error;
/* Read the AGF. */ /* Read the AGF. */
error = xfs_alloc_read_agf(mp, sc->tp, sc->sa.agno, 0, &agf_bp); error = xfs_alloc_read_agf(mp, sc->tp, sc->sa.pag->pag_agno, 0,
&agf_bp);
if (error) if (error)
return error; return error;
@@ -737,7 +741,7 @@ xrep_agi_find_btrees(
return -EFSCORRUPTED; return -EFSCORRUPTED;
/* We must find the finobt root if that feature is enabled. */ /* We must find the finobt root if that feature is enabled. */
if (xfs_sb_version_hasfinobt(&mp->m_sb) && if (xfs_has_finobt(mp) &&
!xrep_check_btree_root(sc, &fab[XREP_AGI_FINOBT])) !xrep_check_btree_root(sc, &fab[XREP_AGI_FINOBT]))
return -EFSCORRUPTED; return -EFSCORRUPTED;
@@ -761,11 +765,12 @@ xrep_agi_init_header(
memset(agi, 0, BBTOB(agi_bp->b_length)); memset(agi, 0, BBTOB(agi_bp->b_length));
agi->agi_magicnum = cpu_to_be32(XFS_AGI_MAGIC); agi->agi_magicnum = cpu_to_be32(XFS_AGI_MAGIC);
agi->agi_versionnum = cpu_to_be32(XFS_AGI_VERSION); agi->agi_versionnum = cpu_to_be32(XFS_AGI_VERSION);
agi->agi_seqno = cpu_to_be32(sc->sa.agno); agi->agi_seqno = cpu_to_be32(sc->sa.pag->pag_agno);
agi->agi_length = cpu_to_be32(xfs_ag_block_count(mp, sc->sa.agno)); agi->agi_length = cpu_to_be32(xfs_ag_block_count(mp,
sc->sa.pag->pag_agno));
agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_newino = cpu_to_be32(NULLAGINO);
agi->agi_dirino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO);
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid);
/* We don't know how to fix the unlinked list yet. */ /* We don't know how to fix the unlinked list yet. */
@@ -787,7 +792,7 @@ xrep_agi_set_roots(
agi->agi_root = cpu_to_be32(fab[XREP_AGI_INOBT].root); agi->agi_root = cpu_to_be32(fab[XREP_AGI_INOBT].root);
agi->agi_level = cpu_to_be32(fab[XREP_AGI_INOBT].height); agi->agi_level = cpu_to_be32(fab[XREP_AGI_INOBT].height);
if (xfs_sb_version_hasfinobt(&sc->mp->m_sb)) { if (xfs_has_finobt(sc->mp)) {
agi->agi_free_root = cpu_to_be32(fab[XREP_AGI_FINOBT].root); agi->agi_free_root = cpu_to_be32(fab[XREP_AGI_FINOBT].root);
agi->agi_free_level = cpu_to_be32(fab[XREP_AGI_FINOBT].height); agi->agi_free_level = cpu_to_be32(fab[XREP_AGI_FINOBT].height);
} }
@@ -811,7 +816,7 @@ xrep_agi_calc_from_btrees(
error = xfs_ialloc_count_inodes(cur, &count, &freecount); error = xfs_ialloc_count_inodes(cur, &count, &freecount);
if (error) if (error)
goto err; goto err;
if (xfs_sb_version_hasinobtcounts(&mp->m_sb)) { if (xfs_has_inobtcounts(mp)) {
xfs_agblock_t blocks; xfs_agblock_t blocks;
error = xfs_btree_count_blocks(cur, &blocks); error = xfs_btree_count_blocks(cur, &blocks);
@@ -824,8 +829,7 @@ xrep_agi_calc_from_btrees(
agi->agi_count = cpu_to_be32(count); agi->agi_count = cpu_to_be32(count);
agi->agi_freecount = cpu_to_be32(freecount); agi->agi_freecount = cpu_to_be32(freecount);
if (xfs_sb_version_hasfinobt(&mp->m_sb) && if (xfs_has_finobt(mp) && xfs_has_inobtcounts(mp)) {
xfs_sb_version_hasinobtcounts(&mp->m_sb)) {
xfs_agblock_t blocks; xfs_agblock_t blocks;
cur = xfs_inobt_init_cursor(mp, sc->tp, agi_bp, cur = xfs_inobt_init_cursor(mp, sc->tp, agi_bp,
@@ -893,16 +897,16 @@ xrep_agi(
int error; int error;
/* We require the rmapbt to rebuild anything. */ /* We require the rmapbt to rebuild anything. */
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) if (!xfs_has_rmapbt(mp))
return -EOPNOTSUPP; return -EOPNOTSUPP;
xchk_perag_get(sc->mp, &sc->sa);
/* /*
* Make sure we have the AGI buffer, as scrub might have decided it * Make sure we have the AGI buffer, as scrub might have decided it
* was corrupt after xfs_ialloc_read_agi failed with -EFSCORRUPTED. * was corrupt after xfs_ialloc_read_agi failed with -EFSCORRUPTED.
*/ */
error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp, error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp,
XFS_AG_DADDR(mp, sc->sa.agno, XFS_AGI_DADDR(mp)), XFS_AG_DADDR(mp, sc->sa.pag->pag_agno,
XFS_AGI_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), 0, &agi_bp, NULL); XFS_FSS_TO_BB(mp, 1), 0, &agi_bp, NULL);
if (error) if (error)
return error; return error;

View File

@@ -91,7 +91,7 @@ xchk_allocbt_xref(
STATIC int STATIC int
xchk_allocbt_rec( xchk_allocbt_rec(
struct xchk_btree *bs, struct xchk_btree *bs,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_mount *mp = bs->cur->bc_mp;
xfs_agnumber_t agno = bs->cur->bc_ag.pag->pag_agno; xfs_agnumber_t agno = bs->cur->bc_ag.pag->pag_agno;

View File

@@ -25,11 +25,11 @@
* reallocating the buffer if necessary. Buffer contents are not preserved * reallocating the buffer if necessary. Buffer contents are not preserved
* across a reallocation. * across a reallocation.
*/ */
int static int
xchk_setup_xattr_buf( xchk_setup_xattr_buf(
struct xfs_scrub *sc, struct xfs_scrub *sc,
size_t value_size, size_t value_size,
xfs_km_flags_t flags) gfp_t flags)
{ {
size_t sz; size_t sz;
struct xchk_xattr_buf *ab = sc->buf; struct xchk_xattr_buf *ab = sc->buf;
@@ -57,7 +57,7 @@ xchk_setup_xattr_buf(
* Don't zero the buffer upon allocation to avoid runtime overhead. * Don't zero the buffer upon allocation to avoid runtime overhead.
* All users must be careful never to read uninitialized contents. * All users must be careful never to read uninitialized contents.
*/ */
ab = kmem_alloc_large(sizeof(*ab) + sz, flags); ab = kvmalloc(sizeof(*ab) + sz, flags);
if (!ab) if (!ab)
return -ENOMEM; return -ENOMEM;
@@ -79,7 +79,7 @@ xchk_setup_xattr(
* without the inode lock held, which means we can sleep. * without the inode lock held, which means we can sleep.
*/ */
if (sc->flags & XCHK_TRY_HARDER) { if (sc->flags & XCHK_TRY_HARDER) {
error = xchk_setup_xattr_buf(sc, XATTR_SIZE_MAX, 0); error = xchk_setup_xattr_buf(sc, XATTR_SIZE_MAX, GFP_KERNEL);
if (error) if (error)
return error; return error;
} }
@@ -138,7 +138,8 @@ xchk_xattr_listent(
* doesn't work, we overload the seen_enough variable to convey * doesn't work, we overload the seen_enough variable to convey
* the error message back to the main scrub function. * the error message back to the main scrub function.
*/ */
error = xchk_setup_xattr_buf(sx->sc, valuelen, KM_MAYFAIL); error = xchk_setup_xattr_buf(sx->sc, valuelen,
GFP_KERNEL | __GFP_RETRY_MAYFAIL);
if (error == -ENOMEM) if (error == -ENOMEM)
error = -EDEADLOCK; error = -EDEADLOCK;
if (error) { if (error) {
@@ -323,7 +324,8 @@ xchk_xattr_block(
return 0; return 0;
/* Allocate memory for block usage checking. */ /* Allocate memory for block usage checking. */
error = xchk_setup_xattr_buf(ds->sc, 0, KM_MAYFAIL); error = xchk_setup_xattr_buf(ds->sc, 0,
GFP_KERNEL | __GFP_RETRY_MAYFAIL);
if (error == -ENOMEM) if (error == -ENOMEM)
return -EDEADLOCK; return -EDEADLOCK;
if (error) if (error)
@@ -334,7 +336,7 @@ xchk_xattr_block(
bitmap_zero(usedmap, mp->m_attr_geo->blksize); bitmap_zero(usedmap, mp->m_attr_geo->blksize);
/* Check all the padding. */ /* Check all the padding. */
if (xfs_sb_version_hascrc(&ds->sc->mp->m_sb)) { if (xfs_has_crc(ds->sc->mp)) {
struct xfs_attr3_leafblock *leaf = bp->b_addr; struct xfs_attr3_leafblock *leaf = bp->b_addr;
if (leaf->hdr.pad1 != 0 || leaf->hdr.pad2 != 0 || if (leaf->hdr.pad1 != 0 || leaf->hdr.pad2 != 0 ||

View File

@@ -65,7 +65,4 @@ xchk_xattr_dstmap(
BITS_TO_LONGS(sc->mp->m_attr_geo->blksize); BITS_TO_LONGS(sc->mp->m_attr_geo->blksize);
} }
int xchk_setup_xattr_buf(struct xfs_scrub *sc, size_t value_size,
xfs_km_flags_t flags);
#endif /* __XFS_SCRUB_ATTR_H__ */ #endif /* __XFS_SCRUB_ATTR_H__ */

View File

@@ -260,7 +260,7 @@ xbitmap_set_btcur_path(
xfs_btree_get_block(cur, i, &bp); xfs_btree_get_block(cur, i, &bp);
if (!bp) if (!bp)
continue; continue;
fsb = XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn); fsb = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp));
error = xbitmap_set(bitmap, fsb, 1); error = xbitmap_set(bitmap, fsb, 1);
if (error) if (error)
return error; return error;
@@ -284,7 +284,7 @@ xbitmap_collect_btblock(
if (!bp) if (!bp)
return 0; return 0;
fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn); fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp));
return xbitmap_set(bitmap, fsbno, 1); return xbitmap_set(bitmap, fsbno, 1);
} }

View File

@@ -260,10 +260,10 @@ xchk_bmap_iextent_xref(
agbno = XFS_FSB_TO_AGBNO(mp, irec->br_startblock); agbno = XFS_FSB_TO_AGBNO(mp, irec->br_startblock);
len = irec->br_blockcount; len = irec->br_blockcount;
error = xchk_ag_init(info->sc, agno, &info->sc->sa); error = xchk_ag_init_existing(info->sc, agno, &info->sc->sa);
if (!xchk_fblock_process_error(info->sc, info->whichfork, if (!xchk_fblock_process_error(info->sc, info->whichfork,
irec->br_startoff, &error)) irec->br_startoff, &error))
return; goto out_free;
xchk_xref_is_used_space(info->sc, agbno, len); xchk_xref_is_used_space(info->sc, agbno, len);
xchk_xref_is_not_inode_chunk(info->sc, agbno, len); xchk_xref_is_not_inode_chunk(info->sc, agbno, len);
@@ -283,6 +283,7 @@ xchk_bmap_iextent_xref(
break; break;
} }
out_free:
xchk_ag_free(info->sc, &info->sc->sa); xchk_ag_free(info->sc, &info->sc->sa);
} }
@@ -383,7 +384,7 @@ xchk_bmap_iextent(
STATIC int STATIC int
xchk_bmapbt_rec( xchk_bmapbt_rec(
struct xchk_btree *bs, struct xchk_btree *bs,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
struct xfs_bmbt_irec irec; struct xfs_bmbt_irec irec;
struct xfs_bmbt_irec iext_irec; struct xfs_bmbt_irec iext_irec;
@@ -400,7 +401,7 @@ xchk_bmapbt_rec(
* Check the owners of the btree blocks up to the level below * Check the owners of the btree blocks up to the level below
* the root since the verifiers don't do that. * the root since the verifiers don't do that.
*/ */
if (xfs_sb_version_hascrc(&bs->cur->bc_mp->m_sb) && if (xfs_has_crc(bs->cur->bc_mp) &&
bs->cur->bc_ptrs[0] == 1) { bs->cur->bc_ptrs[0] == 1) {
for (i = 0; i < bs->cur->bc_nlevels - 1; i++) { for (i = 0; i < bs->cur->bc_nlevels - 1; i++) {
block = xfs_btree_get_block(bs->cur, i, &bp); block = xfs_btree_get_block(bs->cur, i, &bp);
@@ -473,10 +474,11 @@ struct xchk_bmap_check_rmap_info {
STATIC int STATIC int
xchk_bmap_check_rmap( xchk_bmap_check_rmap(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xfs_bmbt_irec irec; struct xfs_bmbt_irec irec;
struct xfs_rmap_irec check_rec;
struct xchk_bmap_check_rmap_info *sbcri = priv; struct xchk_bmap_check_rmap_info *sbcri = priv;
struct xfs_ifork *ifp; struct xfs_ifork *ifp;
struct xfs_scrub *sc = sbcri->sc; struct xfs_scrub *sc = sbcri->sc;
@@ -510,28 +512,30 @@ xchk_bmap_check_rmap(
* length, so we have to loop through the bmbt to make sure that the * length, so we have to loop through the bmbt to make sure that the
* entire rmap is covered by bmbt records. * entire rmap is covered by bmbt records.
*/ */
check_rec = *rec;
while (have_map) { while (have_map) {
if (irec.br_startoff != rec->rm_offset) if (irec.br_startoff != check_rec.rm_offset)
xchk_fblock_set_corrupt(sc, sbcri->whichfork, xchk_fblock_set_corrupt(sc, sbcri->whichfork,
rec->rm_offset); check_rec.rm_offset);
if (irec.br_startblock != XFS_AGB_TO_FSB(sc->mp, if (irec.br_startblock != XFS_AGB_TO_FSB(sc->mp,
cur->bc_ag.pag->pag_agno, rec->rm_startblock)) cur->bc_ag.pag->pag_agno,
check_rec.rm_startblock))
xchk_fblock_set_corrupt(sc, sbcri->whichfork, xchk_fblock_set_corrupt(sc, sbcri->whichfork,
rec->rm_offset); check_rec.rm_offset);
if (irec.br_blockcount > rec->rm_blockcount) if (irec.br_blockcount > check_rec.rm_blockcount)
xchk_fblock_set_corrupt(sc, sbcri->whichfork, xchk_fblock_set_corrupt(sc, sbcri->whichfork,
rec->rm_offset); check_rec.rm_offset);
if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
break; break;
rec->rm_startblock += irec.br_blockcount; check_rec.rm_startblock += irec.br_blockcount;
rec->rm_offset += irec.br_blockcount; check_rec.rm_offset += irec.br_blockcount;
rec->rm_blockcount -= irec.br_blockcount; check_rec.rm_blockcount -= irec.br_blockcount;
if (rec->rm_blockcount == 0) if (check_rec.rm_blockcount == 0)
break; break;
have_map = xfs_iext_next_extent(ifp, &sbcri->icur, &irec); have_map = xfs_iext_next_extent(ifp, &sbcri->icur, &irec);
if (!have_map) if (!have_map)
xchk_fblock_set_corrupt(sc, sbcri->whichfork, xchk_fblock_set_corrupt(sc, sbcri->whichfork,
rec->rm_offset); check_rec.rm_offset);
} }
out: out:
@@ -581,7 +585,7 @@ xchk_bmap_check_rmaps(
bool zero_size; bool zero_size;
int error; int error;
if (!xfs_sb_version_hasrmapbt(&sc->mp->m_sb) || if (!xfs_has_rmapbt(sc->mp) ||
whichfork == XFS_COW_FORK || whichfork == XFS_COW_FORK ||
(sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)) (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
return 0; return 0;
@@ -659,8 +663,7 @@ xchk_bmap(
} }
break; break;
case XFS_ATTR_FORK: case XFS_ATTR_FORK:
if (!xfs_sb_version_hasattr(&mp->m_sb) && if (!xfs_has_attr(mp) && !xfs_has_attr2(mp))
!xfs_sb_version_hasattr2(&mp->m_sb))
xchk_ino_set_corrupt(sc, sc->ip->i_ino); xchk_ino_set_corrupt(sc, sc->ip->i_ino);
break; break;
default: default:

View File

@@ -374,10 +374,10 @@ xchk_btree_check_block_owner(
init_sa = bs->cur->bc_flags & XFS_BTREE_LONG_PTRS; init_sa = bs->cur->bc_flags & XFS_BTREE_LONG_PTRS;
if (init_sa) { if (init_sa) {
error = xchk_ag_init(bs->sc, agno, &bs->sc->sa); error = xchk_ag_init_existing(bs->sc, agno, &bs->sc->sa);
if (!xchk_btree_xref_process_error(bs->sc, bs->cur, if (!xchk_btree_xref_process_error(bs->sc, bs->cur,
level, &error)) level, &error))
return error; goto out_free;
} }
xchk_xref_is_used_space(bs->sc, agbno, 1); xchk_xref_is_used_space(bs->sc, agbno, 1);
@@ -393,6 +393,7 @@ xchk_btree_check_block_owner(
if (!bs->sc->sa.rmap_cur && btnum == XFS_BTNUM_RMAP) if (!bs->sc->sa.rmap_cur && btnum == XFS_BTNUM_RMAP)
bs->cur = NULL; bs->cur = NULL;
out_free:
if (init_sa) if (init_sa)
xchk_ag_free(bs->sc, &bs->sc->sa); xchk_ag_free(bs->sc, &bs->sc->sa);
@@ -435,12 +436,12 @@ xchk_btree_check_owner(
if (!co) if (!co)
return -ENOMEM; return -ENOMEM;
co->level = level; co->level = level;
co->daddr = XFS_BUF_ADDR(bp); co->daddr = xfs_buf_daddr(bp);
list_add_tail(&co->list, &bs->to_check); list_add_tail(&co->list, &bs->to_check);
return 0; return 0;
} }
return xchk_btree_check_block_owner(bs, level, XFS_BUF_ADDR(bp)); return xchk_btree_check_block_owner(bs, level, xfs_buf_daddr(bp));
} }
/* Decide if we want to check minrecs of a btree block in the inode root. */ /* Decide if we want to check minrecs of a btree block in the inode root. */

View File

@@ -27,7 +27,7 @@ void xchk_btree_xref_set_corrupt(struct xfs_scrub *sc,
struct xchk_btree; struct xchk_btree;
typedef int (*xchk_btree_rec_fn)( typedef int (*xchk_btree_rec_fn)(
struct xchk_btree *bs, struct xchk_btree *bs,
union xfs_btree_rec *rec); const union xfs_btree_rec *rec);
struct xchk_btree { struct xchk_btree {
/* caller-provided scrub state */ /* caller-provided scrub state */

View File

@@ -186,7 +186,7 @@ xchk_block_set_preen(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
sc->sm->sm_flags |= XFS_SCRUB_OFLAG_PREEN; sc->sm->sm_flags |= XFS_SCRUB_OFLAG_PREEN;
trace_xchk_block_preen(sc, bp->b_bn, __return_address); trace_xchk_block_preen(sc, xfs_buf_daddr(bp), __return_address);
} }
/* /*
@@ -219,7 +219,7 @@ xchk_block_set_corrupt(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
sc->sm->sm_flags |= XFS_SCRUB_OFLAG_CORRUPT; sc->sm->sm_flags |= XFS_SCRUB_OFLAG_CORRUPT;
trace_xchk_block_error(sc, bp->b_bn, __return_address); trace_xchk_block_error(sc, xfs_buf_daddr(bp), __return_address);
} }
/* Record a corruption while cross-referencing. */ /* Record a corruption while cross-referencing. */
@@ -229,7 +229,7 @@ xchk_block_xref_set_corrupt(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
sc->sm->sm_flags |= XFS_SCRUB_OFLAG_XCORRUPT; sc->sm->sm_flags |= XFS_SCRUB_OFLAG_XCORRUPT;
trace_xchk_block_error(sc, bp->b_bn, __return_address); trace_xchk_block_error(sc, xfs_buf_daddr(bp), __return_address);
} }
/* /*
@@ -324,7 +324,7 @@ struct xchk_rmap_ownedby_info {
STATIC int STATIC int
xchk_count_rmap_ownedby_irec( xchk_count_rmap_ownedby_irec(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xchk_rmap_ownedby_info *sroi = priv; struct xchk_rmap_ownedby_info *sroi = priv;
@@ -394,11 +394,11 @@ want_ag_read_header_failure(
} }
/* /*
* Grab all the headers for an AG. * Grab the perag structure and all the headers for an AG.
* *
* The headers should be released by xchk_ag_free, but as a fail * The headers should be released by xchk_ag_free, but as a fail safe we attach
* safe we attach all the buffers we grab to the scrub transaction so * all the buffers we grab to the scrub transaction so they'll all be freed
* they'll all be freed when we cancel it. * when we cancel it. Returns ENOENT if we can't grab the perag structure.
*/ */
int int
xchk_ag_read_headers( xchk_ag_read_headers(
@@ -409,22 +409,24 @@ xchk_ag_read_headers(
struct xfs_mount *mp = sc->mp; struct xfs_mount *mp = sc->mp;
int error; int error;
sa->agno = agno; ASSERT(!sa->pag);
sa->pag = xfs_perag_get(mp, agno);
if (!sa->pag)
return -ENOENT;
error = xfs_ialloc_read_agi(mp, sc->tp, agno, &sa->agi_bp); error = xfs_ialloc_read_agi(mp, sc->tp, agno, &sa->agi_bp);
if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGI)) if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGI))
goto out; return error;
error = xfs_alloc_read_agf(mp, sc->tp, agno, 0, &sa->agf_bp); error = xfs_alloc_read_agf(mp, sc->tp, agno, 0, &sa->agf_bp);
if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGF)) if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGF))
goto out; return error;
error = xfs_alloc_read_agfl(mp, sc->tp, agno, &sa->agfl_bp); error = xfs_alloc_read_agfl(mp, sc->tp, agno, &sa->agfl_bp);
if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGFL)) if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGFL))
goto out;
error = 0;
out:
return error; return error;
return 0;
} }
/* Release all the AG btree cursors. */ /* Release all the AG btree cursors. */
@@ -461,7 +463,6 @@ xchk_ag_btcur_init(
{ {
struct xfs_mount *mp = sc->mp; struct xfs_mount *mp = sc->mp;
xchk_perag_get(sc->mp, sa);
if (sa->agf_bp && if (sa->agf_bp &&
xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_BNO)) { xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_BNO)) {
/* Set up a bnobt cursor for cross-referencing. */ /* Set up a bnobt cursor for cross-referencing. */
@@ -484,21 +485,21 @@ xchk_ag_btcur_init(
} }
/* Set up a finobt cursor for cross-referencing. */ /* Set up a finobt cursor for cross-referencing. */
if (sa->agi_bp && xfs_sb_version_hasfinobt(&mp->m_sb) && if (sa->agi_bp && xfs_has_finobt(mp) &&
xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_FINO)) { xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_FINO)) {
sa->fino_cur = xfs_inobt_init_cursor(mp, sc->tp, sa->agi_bp, sa->fino_cur = xfs_inobt_init_cursor(mp, sc->tp, sa->agi_bp,
sa->pag, XFS_BTNUM_FINO); sa->pag, XFS_BTNUM_FINO);
} }
/* Set up a rmapbt cursor for cross-referencing. */ /* Set up a rmapbt cursor for cross-referencing. */
if (sa->agf_bp && xfs_sb_version_hasrmapbt(&mp->m_sb) && if (sa->agf_bp && xfs_has_rmapbt(mp) &&
xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_RMAP)) { xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_RMAP)) {
sa->rmap_cur = xfs_rmapbt_init_cursor(mp, sc->tp, sa->agf_bp, sa->rmap_cur = xfs_rmapbt_init_cursor(mp, sc->tp, sa->agf_bp,
sa->pag); sa->pag);
} }
/* Set up a refcountbt cursor for cross-referencing. */ /* Set up a refcountbt cursor for cross-referencing. */
if (sa->agf_bp && xfs_sb_version_hasreflink(&mp->m_sb) && if (sa->agf_bp && xfs_has_reflink(mp) &&
xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_REFC)) { xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_REFC)) {
sa->refc_cur = xfs_refcountbt_init_cursor(mp, sc->tp, sa->refc_cur = xfs_refcountbt_init_cursor(mp, sc->tp,
sa->agf_bp, sa->pag); sa->agf_bp, sa->pag);
@@ -528,15 +529,14 @@ xchk_ag_free(
xfs_perag_put(sa->pag); xfs_perag_put(sa->pag);
sa->pag = NULL; sa->pag = NULL;
} }
sa->agno = NULLAGNUMBER;
} }
/* /*
* For scrub, grab the AGI and the AGF headers, in that order. Locking * For scrub, grab the perag structure, the AGI, and the AGF headers, in that
* order requires us to get the AGI before the AGF. We use the * order. Locking order requires us to get the AGI before the AGF. We use the
* transaction to avoid deadlocking on crosslinked metadata buffers; * transaction to avoid deadlocking on crosslinked metadata buffers; either the
* either the caller passes one in (bmap scrub) or we have to create a * caller passes one in (bmap scrub) or we have to create a transaction
* transaction ourselves. * ourselves. Returns ENOENT if the perag struct cannot be grabbed.
*/ */
int int
xchk_ag_init( xchk_ag_init(
@@ -554,19 +554,6 @@ xchk_ag_init(
return 0; return 0;
} }
/*
* Grab the per-ag structure if we haven't already gotten it. Teardown of the
* xchk_ag will release it for us.
*/
void
xchk_perag_get(
struct xfs_mount *mp,
struct xchk_ag *sa)
{
if (!sa->pag)
sa->pag = xfs_perag_get(mp, sa->agno);
}
/* Per-scrubber setup functions */ /* Per-scrubber setup functions */
/* /*
@@ -797,7 +784,7 @@ xchk_buffer_recheck(
if (!fa) if (!fa)
return; return;
sc->sm->sm_flags |= XFS_SCRUB_OFLAG_CORRUPT; sc->sm->sm_flags |= XFS_SCRUB_OFLAG_CORRUPT;
trace_xchk_block_error(sc, bp->b_bn, fa); trace_xchk_block_error(sc, xfs_buf_daddr(bp), fa);
} }
/* /*
@@ -842,7 +829,7 @@ xchk_metadata_inode_forks(
return error; return error;
/* Look for incorrect shared blocks. */ /* Look for incorrect shared blocks. */
if (xfs_sb_version_hasreflink(&sc->mp->m_sb)) { if (xfs_has_reflink(sc->mp)) {
error = xfs_reflink_inode_has_shared_extents(sc->tp, sc->ip, error = xfs_reflink_inode_has_shared_extents(sc->tp, sc->ip,
&shared); &shared);
if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, 0, if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, 0,
@@ -884,6 +871,7 @@ xchk_stop_reaping(
{ {
sc->flags |= XCHK_REAPING_DISABLED; sc->flags |= XCHK_REAPING_DISABLED;
xfs_blockgc_stop(sc->mp); xfs_blockgc_stop(sc->mp);
xfs_inodegc_stop(sc->mp);
} }
/* Restart background reaping of resources. */ /* Restart background reaping of resources. */
@@ -891,6 +879,13 @@ void
xchk_start_reaping( xchk_start_reaping(
struct xfs_scrub *sc) struct xfs_scrub *sc)
{ {
/*
* Readonly filesystems do not perform inactivation or speculative
* preallocation, so there's no need to restart the workers.
*/
if (!xfs_is_readonly(sc->mp)) {
xfs_inodegc_start(sc->mp);
xfs_blockgc_start(sc->mp); xfs_blockgc_start(sc->mp);
}
sc->flags &= ~XCHK_REAPING_DISABLED; sc->flags &= ~XCHK_REAPING_DISABLED;
} }

View File

@@ -107,7 +107,23 @@ int xchk_setup_fscounters(struct xfs_scrub *sc);
void xchk_ag_free(struct xfs_scrub *sc, struct xchk_ag *sa); void xchk_ag_free(struct xfs_scrub *sc, struct xchk_ag *sa);
int xchk_ag_init(struct xfs_scrub *sc, xfs_agnumber_t agno, int xchk_ag_init(struct xfs_scrub *sc, xfs_agnumber_t agno,
struct xchk_ag *sa); struct xchk_ag *sa);
void xchk_perag_get(struct xfs_mount *mp, struct xchk_ag *sa);
/*
* Grab all AG resources, treating the inability to grab the perag structure as
* a fs corruption. This is intended for callers checking an ondisk reference
* to a given AG, which means that the AG must still exist.
*/
static inline int
xchk_ag_init_existing(
struct xfs_scrub *sc,
xfs_agnumber_t agno,
struct xchk_ag *sa)
{
int error = xchk_ag_init(sc, agno, sa);
return error == -ENOENT ? -EFSCORRUPTED : error;
}
int xchk_ag_read_headers(struct xfs_scrub *sc, xfs_agnumber_t agno, int xchk_ag_read_headers(struct xfs_scrub *sc, xfs_agnumber_t agno,
struct xchk_ag *sa); struct xchk_ag *sa);
void xchk_ag_btcur_free(struct xchk_ag *sa); void xchk_ag_btcur_free(struct xchk_ag *sa);

View File

@@ -367,11 +367,11 @@ xchk_da_btree_block(
pmaxrecs = &ds->maxrecs[level]; pmaxrecs = &ds->maxrecs[level];
/* We only started zeroing the header on v5 filesystems. */ /* We only started zeroing the header on v5 filesystems. */
if (xfs_sb_version_hascrc(&ds->sc->mp->m_sb) && hdr3->hdr.pad) if (xfs_has_crc(ds->sc->mp) && hdr3->hdr.pad)
xchk_da_set_corrupt(ds, level); xchk_da_set_corrupt(ds, level);
/* Check the owner. */ /* Check the owner. */
if (xfs_sb_version_hascrc(&ip->i_mount->m_sb)) { if (xfs_has_crc(ip->i_mount)) {
owner = be64_to_cpu(hdr3->owner); owner = be64_to_cpu(hdr3->owner);
if (owner != ip->i_ino) if (owner != ip->i_ino)
xchk_da_set_corrupt(ds, level); xchk_da_set_corrupt(ds, level);

View File

@@ -51,7 +51,7 @@ xchk_dir_check_ftype(
int ino_dtype; int ino_dtype;
int error = 0; int error = 0;
if (!xfs_sb_version_hasftype(&mp->m_sb)) { if (!xfs_has_ftype(mp)) {
if (dtype != DT_UNKNOWN && dtype != DT_DIR) if (dtype != DT_UNKNOWN && dtype != DT_DIR)
xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK, xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
offset); offset);
@@ -140,7 +140,7 @@ xchk_dir_actor(
if (!strncmp(".", name, namelen)) { if (!strncmp(".", name, namelen)) {
/* If this is "." then check that the inum matches the dir. */ /* If this is "." then check that the inum matches the dir. */
if (xfs_sb_version_hasftype(&mp->m_sb) && type != DT_DIR) if (xfs_has_ftype(mp) && type != DT_DIR)
xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK, xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
offset); offset);
checked_ftype = true; checked_ftype = true;
@@ -152,7 +152,7 @@ xchk_dir_actor(
* If this is ".." in the root inode, check that the inum * If this is ".." in the root inode, check that the inum
* matches this dir. * matches this dir.
*/ */
if (xfs_sb_version_hasftype(&mp->m_sb) && type != DT_DIR) if (xfs_has_ftype(mp) && type != DT_DIR)
xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK, xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
offset); offset);
checked_ftype = true; checked_ftype = true;
@@ -526,7 +526,7 @@ xchk_directory_leaf1_bestfree(
bestcount = be32_to_cpu(ltp->bestcount); bestcount = be32_to_cpu(ltp->bestcount);
bestp = xfs_dir2_leaf_bests_p(ltp); bestp = xfs_dir2_leaf_bests_p(ltp);
if (xfs_sb_version_hascrc(&sc->mp->m_sb)) { if (xfs_has_crc(sc->mp)) {
struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr; struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr;
if (hdr3->pad != cpu_to_be32(0)) if (hdr3->pad != cpu_to_be32(0))
@@ -623,7 +623,7 @@ xchk_directory_free_bestfree(
return error; return error;
xchk_buffer_recheck(sc, bp); xchk_buffer_recheck(sc, bp);
if (xfs_sb_version_hascrc(&sc->mp->m_sb)) { if (xfs_has_crc(sc->mp)) {
struct xfs_dir3_free_hdr *hdr3 = bp->b_addr; struct xfs_dir3_free_hdr *hdr3 = bp->b_addr;
if (hdr3->pad != cpu_to_be32(0)) if (hdr3->pad != cpu_to_be32(0))

View File

@@ -148,9 +148,9 @@ xchk_fscount_btreeblks(
xfs_extlen_t blocks; xfs_extlen_t blocks;
int error; int error;
error = xchk_ag_init(sc, agno, &sc->sa); error = xchk_ag_init_existing(sc, agno, &sc->sa);
if (error) if (error)
return error; goto out_free;
error = xfs_btree_count_blocks(sc->sa.bno_cur, &blocks); error = xfs_btree_count_blocks(sc->sa.bno_cur, &blocks);
if (error) if (error)
@@ -207,7 +207,7 @@ retry:
/* Add up the free/freelist/bnobt/cntbt blocks */ /* Add up the free/freelist/bnobt/cntbt blocks */
fsc->fdblocks += pag->pagf_freeblks; fsc->fdblocks += pag->pagf_freeblks;
fsc->fdblocks += pag->pagf_flcount; fsc->fdblocks += pag->pagf_flcount;
if (xfs_sb_version_haslazysbcount(&sc->mp->m_sb)) { if (xfs_has_lazysbcount(sc->mp)) {
fsc->fdblocks += pag->pagf_btreeblks; fsc->fdblocks += pag->pagf_btreeblks;
} else { } else {
error = xchk_fscount_btreeblks(sc, fsc, agno); error = xchk_fscount_btreeblks(sc, fsc, agno);

View File

@@ -418,7 +418,7 @@ xchk_iallocbt_rec_alignment(
STATIC int STATIC int
xchk_iallocbt_rec( xchk_iallocbt_rec(
struct xchk_btree *bs, struct xchk_btree *bs,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_mount *mp = bs->cur->bc_mp;
struct xchk_iallocbt *iabt = bs->private; struct xchk_iallocbt *iabt = bs->private;
@@ -517,7 +517,7 @@ xchk_iallocbt_xref_rmap_btreeblks(
int error; int error;
if (!sc->sa.ino_cur || !sc->sa.rmap_cur || if (!sc->sa.ino_cur || !sc->sa.rmap_cur ||
(xfs_sb_version_hasfinobt(&sc->mp->m_sb) && !sc->sa.fino_cur) || (xfs_has_finobt(sc->mp) && !sc->sa.fino_cur) ||
xchk_skip_xref(sc->sm)) xchk_skip_xref(sc->sm))
return; return;

View File

@@ -181,7 +181,7 @@ xchk_inode_flags2(
/* reflink flag requires reflink feature */ /* reflink flag requires reflink feature */
if ((flags2 & XFS_DIFLAG2_REFLINK) && if ((flags2 & XFS_DIFLAG2_REFLINK) &&
!xfs_sb_version_hasreflink(&mp->m_sb)) !xfs_has_reflink(mp))
goto bad; goto bad;
/* cowextsize flag is checked w.r.t. mode separately */ /* cowextsize flag is checked w.r.t. mode separately */
@@ -199,8 +199,7 @@ xchk_inode_flags2(
goto bad; goto bad;
/* no bigtime iflag without the bigtime feature */ /* no bigtime iflag without the bigtime feature */
if (xfs_dinode_has_bigtime(dip) && if (xfs_dinode_has_bigtime(dip) && !xfs_has_bigtime(mp))
!xfs_sb_version_hasbigtime(&mp->m_sb))
goto bad; goto bad;
return; return;
@@ -278,7 +277,7 @@ xchk_dinode(
xchk_ino_set_corrupt(sc, ino); xchk_ino_set_corrupt(sc, ino);
if (dip->di_projid_hi != 0 && if (dip->di_projid_hi != 0 &&
!xfs_sb_version_hasprojid32bit(&mp->m_sb)) !xfs_has_projid32(mp))
xchk_ino_set_corrupt(sc, ino); xchk_ino_set_corrupt(sc, ino);
break; break;
default: default:
@@ -532,9 +531,9 @@ xchk_inode_xref(
agno = XFS_INO_TO_AGNO(sc->mp, ino); agno = XFS_INO_TO_AGNO(sc->mp, ino);
agbno = XFS_INO_TO_AGBNO(sc->mp, ino); agbno = XFS_INO_TO_AGBNO(sc->mp, ino);
error = xchk_ag_init(sc, agno, &sc->sa); error = xchk_ag_init_existing(sc, agno, &sc->sa);
if (!xchk_xref_process_error(sc, agno, agbno, &error)) if (!xchk_xref_process_error(sc, agno, agbno, &error))
return; goto out_free;
xchk_xref_is_used_space(sc, agbno, 1); xchk_xref_is_used_space(sc, agbno, 1);
xchk_inode_xref_finobt(sc, ino); xchk_inode_xref_finobt(sc, ino);
@@ -542,6 +541,7 @@ xchk_inode_xref(
xchk_xref_is_not_shared(sc, agbno, 1); xchk_xref_is_not_shared(sc, agbno, 1);
xchk_inode_xref_bmap(sc, dip); xchk_inode_xref_bmap(sc, dip);
out_free:
xchk_ag_free(sc, &sc->sa); xchk_ag_free(sc, &sc->sa);
} }
@@ -560,7 +560,7 @@ xchk_inode_check_reflink_iflag(
bool has_shared; bool has_shared;
int error; int error;
if (!xfs_sb_version_hasreflink(&mp->m_sb)) if (!xfs_has_reflink(mp))
return; return;
error = xfs_reflink_inode_has_shared_extents(sc->tp, sc->ip, error = xfs_reflink_inode_has_shared_extents(sc->tp, sc->ip,

View File

@@ -42,7 +42,7 @@ xchk_setup_quota(
xfs_dqtype_t dqtype; xfs_dqtype_t dqtype;
int error; int error;
if (!XFS_IS_QUOTA_RUNNING(sc->mp) || !XFS_IS_QUOTA_ON(sc->mp)) if (!XFS_IS_QUOTA_ON(sc->mp))
return -ENOENT; return -ENOENT;
dqtype = xchk_quota_to_dqtype(sc); dqtype = xchk_quota_to_dqtype(sc);
@@ -127,7 +127,7 @@ xchk_quota_item(
* a reflink filesystem we're allowed to exceed physical space * a reflink filesystem we're allowed to exceed physical space
* if there are no quota limits. * if there are no quota limits.
*/ */
if (xfs_sb_version_hasreflink(&mp->m_sb)) { if (xfs_has_reflink(mp)) {
if (mp->m_sb.sb_dblocks < dq->q_blk.count) if (mp->m_sb.sb_dblocks < dq->q_blk.count)
xchk_fblock_set_warning(sc, XFS_DATA_FORK, xchk_fblock_set_warning(sc, XFS_DATA_FORK,
offset); offset);

View File

@@ -91,7 +91,7 @@ struct xchk_refcnt_check {
STATIC int STATIC int
xchk_refcountbt_rmap_check( xchk_refcountbt_rmap_check(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xchk_refcnt_check *refchk = priv; struct xchk_refcnt_check *refchk = priv;
@@ -330,7 +330,7 @@ xchk_refcountbt_xref(
STATIC int STATIC int
xchk_refcountbt_rec( xchk_refcountbt_rec(
struct xchk_btree *bs, struct xchk_btree *bs,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_mount *mp = bs->cur->bc_mp;
xfs_agblock_t *cow_blocks = bs->private; xfs_agblock_t *cow_blocks = bs->private;

View File

@@ -248,19 +248,19 @@ xrep_calc_ag_resblks(
* bnobt/cntbt or inobt/finobt as pairs. * bnobt/cntbt or inobt/finobt as pairs.
*/ */
bnobt_sz = 2 * xfs_allocbt_calc_size(mp, freelen); bnobt_sz = 2 * xfs_allocbt_calc_size(mp, freelen);
if (xfs_sb_version_hassparseinodes(&mp->m_sb)) if (xfs_has_sparseinodes(mp))
inobt_sz = xfs_iallocbt_calc_size(mp, icount / inobt_sz = xfs_iallocbt_calc_size(mp, icount /
XFS_INODES_PER_HOLEMASK_BIT); XFS_INODES_PER_HOLEMASK_BIT);
else else
inobt_sz = xfs_iallocbt_calc_size(mp, icount / inobt_sz = xfs_iallocbt_calc_size(mp, icount /
XFS_INODES_PER_CHUNK); XFS_INODES_PER_CHUNK);
if (xfs_sb_version_hasfinobt(&mp->m_sb)) if (xfs_has_finobt(mp))
inobt_sz *= 2; inobt_sz *= 2;
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
refcbt_sz = xfs_refcountbt_calc_size(mp, usedlen); refcbt_sz = xfs_refcountbt_calc_size(mp, usedlen);
else else
refcbt_sz = 0; refcbt_sz = 0;
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { if (xfs_has_rmapbt(mp)) {
/* /*
* Guess how many blocks we need to rebuild the rmapbt. * Guess how many blocks we need to rebuild the rmapbt.
* For non-reflink filesystems we can't have more records than * For non-reflink filesystems we can't have more records than
@@ -269,7 +269,7 @@ xrep_calc_ag_resblks(
* many rmaps there could be in the AG, so we start off with * many rmaps there could be in the AG, so we start off with
* what we hope is an generous over-estimation. * what we hope is an generous over-estimation.
*/ */
if (xfs_sb_version_hasreflink(&mp->m_sb)) if (xfs_has_reflink(mp))
rmapbt_sz = xfs_rmapbt_calc_size(mp, rmapbt_sz = xfs_rmapbt_calc_size(mp,
(unsigned long long)aglen * 2); (unsigned long long)aglen * 2);
else else
@@ -306,9 +306,9 @@ xrep_alloc_ag_block(
return -ENOSPC; return -ENOSPC;
xfs_extent_busy_reuse(sc->mp, sc->sa.pag, bno, xfs_extent_busy_reuse(sc->mp, sc->sa.pag, bno,
1, false); 1, false);
*fsbno = XFS_AGB_TO_FSB(sc->mp, sc->sa.agno, bno); *fsbno = XFS_AGB_TO_FSB(sc->mp, sc->sa.pag->pag_agno, bno);
if (resv == XFS_AG_RESV_RMAPBT) if (resv == XFS_AG_RESV_RMAPBT)
xfs_ag_resv_rmapbt_alloc(sc->mp, sc->sa.agno); xfs_ag_resv_rmapbt_alloc(sc->mp, sc->sa.pag->pag_agno);
return 0; return 0;
default: default:
break; break;
@@ -317,7 +317,7 @@ xrep_alloc_ag_block(
args.tp = sc->tp; args.tp = sc->tp;
args.mp = sc->mp; args.mp = sc->mp;
args.oinfo = *oinfo; args.oinfo = *oinfo;
args.fsbno = XFS_AGB_TO_FSB(args.mp, sc->sa.agno, 0); args.fsbno = XFS_AGB_TO_FSB(args.mp, sc->sa.pag->pag_agno, 0);
args.minlen = 1; args.minlen = 1;
args.maxlen = 1; args.maxlen = 1;
args.prod = 1; args.prod = 1;
@@ -352,14 +352,14 @@ xrep_init_btblock(
trace_xrep_init_btblock(mp, XFS_FSB_TO_AGNO(mp, fsb), trace_xrep_init_btblock(mp, XFS_FSB_TO_AGNO(mp, fsb),
XFS_FSB_TO_AGBNO(mp, fsb), btnum); XFS_FSB_TO_AGBNO(mp, fsb), btnum);
ASSERT(XFS_FSB_TO_AGNO(mp, fsb) == sc->sa.agno); ASSERT(XFS_FSB_TO_AGNO(mp, fsb) == sc->sa.pag->pag_agno);
error = xfs_trans_get_buf(tp, mp->m_ddev_targp, error = xfs_trans_get_buf(tp, mp->m_ddev_targp,
XFS_FSB_TO_DADDR(mp, fsb), XFS_FSB_TO_BB(mp, 1), 0, XFS_FSB_TO_DADDR(mp, fsb), XFS_FSB_TO_BB(mp, 1), 0,
&bp); &bp);
if (error) if (error)
return error; return error;
xfs_buf_zero(bp, 0, BBTOB(bp->b_length)); xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
xfs_btree_init_block(mp, bp, btnum, 0, 0, sc->sa.agno); xfs_btree_init_block(mp, bp, btnum, 0, 0, sc->sa.pag->pag_agno);
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_BTREE_BUF);
xfs_trans_log_buf(tp, bp, 0, BBTOB(bp->b_length) - 1); xfs_trans_log_buf(tp, bp, 0, BBTOB(bp->b_length) - 1);
bp->b_ops = ops; bp->b_ops = ops;
@@ -481,7 +481,7 @@ xrep_fix_freelist(
args.mp = sc->mp; args.mp = sc->mp;
args.tp = sc->tp; args.tp = sc->tp;
args.agno = sc->sa.agno; args.agno = sc->sa.pag->pag_agno;
args.alignment = 1; args.alignment = 1;
args.pag = sc->sa.pag; args.pag = sc->sa.pag;
@@ -611,11 +611,11 @@ xrep_reap_extents(
xfs_fsblock_t fsbno; xfs_fsblock_t fsbno;
int error = 0; int error = 0;
ASSERT(xfs_sb_version_hasrmapbt(&sc->mp->m_sb)); ASSERT(xfs_has_rmapbt(sc->mp));
for_each_xbitmap_block(fsbno, bmr, n, bitmap) { for_each_xbitmap_block(fsbno, bmr, n, bitmap) {
ASSERT(sc->ip != NULL || ASSERT(sc->ip != NULL ||
XFS_FSB_TO_AGNO(sc->mp, fsbno) == sc->sa.agno); XFS_FSB_TO_AGNO(sc->mp, fsbno) == sc->sa.pag->pag_agno);
trace_xrep_dispose_btree_extent(sc->mp, trace_xrep_dispose_btree_extent(sc->mp,
XFS_FSB_TO_AGNO(sc->mp, fsbno), XFS_FSB_TO_AGNO(sc->mp, fsbno),
XFS_FSB_TO_AGBNO(sc->mp, fsbno), 1); XFS_FSB_TO_AGBNO(sc->mp, fsbno), 1);
@@ -690,7 +690,7 @@ xrep_findroot_block(
int block_level; int block_level;
int error = 0; int error = 0;
daddr = XFS_AGB_TO_DADDR(mp, ri->sc->sa.agno, agbno); daddr = XFS_AGB_TO_DADDR(mp, ri->sc->sa.pag->pag_agno, agbno);
/* /*
* Blocks in the AGFL have stale contents that might just happen to * Blocks in the AGFL have stale contents that might just happen to
@@ -819,7 +819,7 @@ xrep_findroot_block(
else else
fab->root = NULLAGBLOCK; fab->root = NULLAGBLOCK;
trace_xrep_findroot_block(mp, ri->sc->sa.agno, agbno, trace_xrep_findroot_block(mp, ri->sc->sa.pag->pag_agno, agbno,
be32_to_cpu(btblock->bb_magic), fab->height - 1); be32_to_cpu(btblock->bb_magic), fab->height - 1);
out: out:
xfs_trans_brelse(ri->sc->tp, bp); xfs_trans_brelse(ri->sc->tp, bp);
@@ -833,7 +833,7 @@ out:
STATIC int STATIC int
xrep_findroot_rmap( xrep_findroot_rmap(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
struct xfs_rmap_irec *rec, const struct xfs_rmap_irec *rec,
void *priv) void *priv)
{ {
struct xrep_findroot *ri = priv; struct xrep_findroot *ri = priv;

View File

@@ -88,7 +88,7 @@ xchk_rmapbt_xref(
STATIC int STATIC int
xchk_rmapbt_rec( xchk_rmapbt_rec(
struct xchk_btree *bs, struct xchk_btree *bs,
union xfs_btree_rec *rec) const union xfs_btree_rec *rec)
{ {
struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_mount *mp = bs->cur->bc_mp;
struct xfs_rmap_irec irec; struct xfs_rmap_irec irec;

View File

@@ -41,7 +41,7 @@ xchk_setup_rt(
STATIC int STATIC int
xchk_rtbitmap_rec( xchk_rtbitmap_rec(
struct xfs_trans *tp, struct xfs_trans *tp,
struct xfs_rtalloc_rec *rec, const struct xfs_rtalloc_rec *rec,
void *priv) void *priv)
{ {
struct xfs_scrub *sc = priv; struct xfs_scrub *sc = priv;

View File

@@ -239,21 +239,21 @@ static const struct xchk_meta_ops meta_scrub_ops[] = {
.type = ST_PERAG, .type = ST_PERAG,
.setup = xchk_setup_ag_iallocbt, .setup = xchk_setup_ag_iallocbt,
.scrub = xchk_finobt, .scrub = xchk_finobt,
.has = xfs_sb_version_hasfinobt, .has = xfs_has_finobt,
.repair = xrep_notsupported, .repair = xrep_notsupported,
}, },
[XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */ [XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
.type = ST_PERAG, .type = ST_PERAG,
.setup = xchk_setup_ag_rmapbt, .setup = xchk_setup_ag_rmapbt,
.scrub = xchk_rmapbt, .scrub = xchk_rmapbt,
.has = xfs_sb_version_hasrmapbt, .has = xfs_has_rmapbt,
.repair = xrep_notsupported, .repair = xrep_notsupported,
}, },
[XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */ [XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
.type = ST_PERAG, .type = ST_PERAG,
.setup = xchk_setup_ag_refcountbt, .setup = xchk_setup_ag_refcountbt,
.scrub = xchk_refcountbt, .scrub = xchk_refcountbt,
.has = xfs_sb_version_hasreflink, .has = xfs_has_reflink,
.repair = xrep_notsupported, .repair = xrep_notsupported,
}, },
[XFS_SCRUB_TYPE_INODE] = { /* inode record */ [XFS_SCRUB_TYPE_INODE] = { /* inode record */
@@ -308,14 +308,14 @@ static const struct xchk_meta_ops meta_scrub_ops[] = {
.type = ST_FS, .type = ST_FS,
.setup = xchk_setup_rt, .setup = xchk_setup_rt,
.scrub = xchk_rtbitmap, .scrub = xchk_rtbitmap,
.has = xfs_sb_version_hasrealtime, .has = xfs_has_realtime,
.repair = xrep_notsupported, .repair = xrep_notsupported,
}, },
[XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */ [XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
.type = ST_FS, .type = ST_FS,
.setup = xchk_setup_rt, .setup = xchk_setup_rt,
.scrub = xchk_rtsummary, .scrub = xchk_rtsummary,
.has = xfs_sb_version_hasrealtime, .has = xfs_has_realtime,
.repair = xrep_notsupported, .repair = xrep_notsupported,
}, },
[XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */ [XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
@@ -383,7 +383,7 @@ xchk_validate_inputs(
if (ops->setup == NULL || ops->scrub == NULL) if (ops->setup == NULL || ops->scrub == NULL)
goto out; goto out;
/* Does this fs even support this type of metadata? */ /* Does this fs even support this type of metadata? */
if (ops->has && !ops->has(&mp->m_sb)) if (ops->has && !ops->has(mp))
goto out; goto out;
error = -EINVAL; error = -EINVAL;
@@ -415,11 +415,11 @@ xchk_validate_inputs(
*/ */
if (sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR) { if (sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR) {
error = -EOPNOTSUPP; error = -EOPNOTSUPP;
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
goto out; goto out;
error = -EROFS; error = -EROFS;
if (mp->m_flags & XFS_MOUNT_RDONLY) if (xfs_is_readonly(mp))
goto out; goto out;
} }
@@ -464,9 +464,6 @@ xfs_scrub_metadata(
struct xfs_scrub sc = { struct xfs_scrub sc = {
.file = file, .file = file,
.sm = sm, .sm = sm,
.sa = {
.agno = NULLAGNUMBER,
},
}; };
struct xfs_mount *mp = XFS_I(file_inode(file))->i_mount; struct xfs_mount *mp = XFS_I(file_inode(file))->i_mount;
int error = 0; int error = 0;
@@ -480,10 +477,10 @@ xfs_scrub_metadata(
/* Forbidden if we are shut down or mounted norecovery. */ /* Forbidden if we are shut down or mounted norecovery. */
error = -ESHUTDOWN; error = -ESHUTDOWN;
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
goto out; goto out;
error = -ENOTRECOVERABLE; error = -ENOTRECOVERABLE;
if (mp->m_flags & XFS_MOUNT_NORECOVERY) if (xfs_has_norecovery(mp))
goto out; goto out;
error = xchk_validate_inputs(mp, sm); error = xchk_validate_inputs(mp, sm);

View File

@@ -27,7 +27,7 @@ struct xchk_meta_ops {
int (*repair)(struct xfs_scrub *); int (*repair)(struct xfs_scrub *);
/* Decide if we even have this piece of metadata. */ /* Decide if we even have this piece of metadata. */
bool (*has)(struct xfs_sb *); bool (*has)(struct xfs_mount *);
/* type describing required/allowed inputs */ /* type describing required/allowed inputs */
enum xchk_type type; enum xchk_type type;
@@ -35,7 +35,6 @@ struct xchk_meta_ops {
/* Buffer pointers and btree cursors for an entire AG. */ /* Buffer pointers and btree cursors for an entire AG. */
struct xchk_ag { struct xchk_ag {
xfs_agnumber_t agno;
struct xfs_perag *pag; struct xfs_perag *pag;
/* AG btree roots */ /* AG btree roots */

View File

@@ -22,11 +22,11 @@ xchk_btree_cur_fsbno(
int level) int level)
{ {
if (level < cur->bc_nlevels && cur->bc_bufs[level]) if (level < cur->bc_nlevels && cur->bc_bufs[level])
return XFS_DADDR_TO_FSB(cur->bc_mp, cur->bc_bufs[level]->b_bn); return XFS_DADDR_TO_FSB(cur->bc_mp,
else if (level == cur->bc_nlevels - 1 && xfs_buf_daddr(cur->bc_bufs[level]));
cur->bc_flags & XFS_BTREE_LONG_PTRS) if (level == cur->bc_nlevels - 1 && cur->bc_flags & XFS_BTREE_LONG_PTRS)
return XFS_INO_TO_FSB(cur->bc_mp, cur->bc_ino.ip->i_ino); return XFS_INO_TO_FSB(cur->bc_mp, cur->bc_ino.ip->i_ino);
else if (!(cur->bc_flags & XFS_BTREE_LONG_PTRS)) if (!(cur->bc_flags & XFS_BTREE_LONG_PTRS))
return XFS_AGB_TO_FSB(cur->bc_mp, cur->bc_ag.pag->pag_agno, 0); return XFS_AGB_TO_FSB(cur->bc_mp, cur->bc_ag.pag->pag_agno, 0);
return NULLFSBLOCK; return NULLFSBLOCK;
} }

View File

@@ -2,6 +2,10 @@
/* /*
* Copyright (C) 2017 Oracle. All Rights Reserved. * Copyright (C) 2017 Oracle. All Rights Reserved.
* Author: Darrick J. Wong <darrick.wong@oracle.com> * Author: Darrick J. Wong <darrick.wong@oracle.com>
*
* NOTE: none of these tracepoints shall be considered a stable kernel ABI
* as they can change at any time. See xfs_trace.h for documentation of
* specific units found in tracepoint output.
*/ */
#undef TRACE_SYSTEM #undef TRACE_SYSTEM
#define TRACE_SYSTEM xfs_scrub #define TRACE_SYSTEM xfs_scrub
@@ -79,6 +83,16 @@ TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
{ XFS_SCRUB_TYPE_PQUOTA, "prjquota" }, \ { XFS_SCRUB_TYPE_PQUOTA, "prjquota" }, \
{ XFS_SCRUB_TYPE_FSCOUNTERS, "fscounters" } { XFS_SCRUB_TYPE_FSCOUNTERS, "fscounters" }
#define XFS_SCRUB_FLAG_STRINGS \
{ XFS_SCRUB_IFLAG_REPAIR, "repair" }, \
{ XFS_SCRUB_OFLAG_CORRUPT, "corrupt" }, \
{ XFS_SCRUB_OFLAG_PREEN, "preen" }, \
{ XFS_SCRUB_OFLAG_XFAIL, "xfail" }, \
{ XFS_SCRUB_OFLAG_XCORRUPT, "xcorrupt" }, \
{ XFS_SCRUB_OFLAG_INCOMPLETE, "incomplete" }, \
{ XFS_SCRUB_OFLAG_WARNING, "warning" }, \
{ XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED, "norepair" }
DECLARE_EVENT_CLASS(xchk_class, DECLARE_EVENT_CLASS(xchk_class,
TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
int error), int error),
@@ -103,14 +117,14 @@ DECLARE_EVENT_CLASS(xchk_class,
__entry->flags = sm->sm_flags; __entry->flags = sm->sm_flags;
__entry->error = error; __entry->error = error;
), ),
TP_printk("dev %d:%d ino 0x%llx type %s agno %u inum %llu gen %u flags 0x%x error %d", TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->ino,
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__entry->agno, __entry->agno,
__entry->inum, __entry->inum,
__entry->gen, __entry->gen,
__entry->flags, __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
__entry->error) __entry->error)
) )
#define DEFINE_SCRUB_EVENT(name) \ #define DEFINE_SCRUB_EVENT(name) \
@@ -145,7 +159,7 @@ TRACE_EVENT(xchk_op_error,
__entry->error = error; __entry->error = error;
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d type %s agno %u agbno %u error %d ret_ip %pS", TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__entry->agno, __entry->agno,
@@ -176,10 +190,10 @@ TRACE_EVENT(xchk_file_op_error,
__entry->error = error; __entry->error = error;
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d ino 0x%llx fork %d type %s offset %llu error %d ret_ip %pS", TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->ino,
__entry->whichfork, __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__entry->offset, __entry->offset,
__entry->error, __entry->error,
@@ -193,29 +207,21 @@ DECLARE_EVENT_CLASS(xchk_block_error_class,
__field(dev_t, dev) __field(dev_t, dev)
__field(unsigned int, type) __field(unsigned int, type)
__field(xfs_agnumber_t, agno) __field(xfs_agnumber_t, agno)
__field(xfs_agblock_t, bno) __field(xfs_agblock_t, agbno)
__field(void *, ret_ip) __field(void *, ret_ip)
), ),
TP_fast_assign( TP_fast_assign(
xfs_fsblock_t fsbno;
xfs_agnumber_t agno;
xfs_agblock_t bno;
fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
__entry->dev = sc->mp->m_super->s_dev; __entry->dev = sc->mp->m_super->s_dev;
__entry->type = sc->sm->sm_type; __entry->type = sc->sm->sm_type;
__entry->agno = agno; __entry->agno = xfs_daddr_to_agno(sc->mp, daddr);
__entry->bno = bno; __entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d type %s agno %u agbno %u ret_ip %pS", TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__entry->agno, __entry->agno,
__entry->bno, __entry->agbno,
__entry->ret_ip) __entry->ret_ip)
) )
@@ -281,10 +287,10 @@ DECLARE_EVENT_CLASS(xchk_fblock_error_class,
__entry->offset = offset; __entry->offset = offset;
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d ino 0x%llx fork %d type %s offset %llu ret_ip %pS", TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->ino,
__entry->whichfork, __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__entry->offset, __entry->offset,
__entry->ret_ip) __entry->ret_ip)
@@ -346,7 +352,7 @@ TRACE_EVENT(xchk_btree_op_error,
__entry->error = error; __entry->error = error;
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno %u agbno %u error %d ret_ip %pS", TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
@@ -389,10 +395,10 @@ TRACE_EVENT(xchk_ifork_btree_op_error,
__entry->error = error; __entry->error = error;
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d ino 0x%llx fork %d type %s btree %s level %d ptr %d agno %u agbno %u error %d ret_ip %pS", TP_printk("dev %d:%d ino 0x%llx fork %s type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->ino,
__entry->whichfork, __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
__entry->level, __entry->level,
@@ -428,7 +434,7 @@ TRACE_EVENT(xchk_btree_error,
__entry->ptr = cur->bc_ptrs[level]; __entry->ptr = cur->bc_ptrs[level];
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno %u agbno %u ret_ip %pS", TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
@@ -468,10 +474,10 @@ TRACE_EVENT(xchk_ifork_btree_error,
__entry->ptr = cur->bc_ptrs[level]; __entry->ptr = cur->bc_ptrs[level];
__entry->ret_ip = ret_ip; __entry->ret_ip = ret_ip;
), ),
TP_printk("dev %d:%d ino 0x%llx fork %d type %s btree %s level %d ptr %d agno %u agbno %u ret_ip %pS", TP_printk("dev %d:%d ino 0x%llx fork %s type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->ino,
__entry->whichfork, __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
__entry->level, __entry->level,
@@ -507,7 +513,7 @@ DECLARE_EVENT_CLASS(xchk_sbtree_class,
__entry->nlevels = cur->bc_nlevels; __entry->nlevels = cur->bc_nlevels;
__entry->ptr = cur->bc_ptrs[level]; __entry->ptr = cur->bc_ptrs[level];
), ),
TP_printk("dev %d:%d type %s btree %s agno %u agbno %u level %d nlevels %d ptr %d", TP_printk("dev %d:%d type %s btree %s agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
__print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
@@ -580,7 +586,7 @@ TRACE_EVENT(xchk_iallocbt_check_cluster,
__entry->holemask = holemask; __entry->holemask = holemask;
__entry->cluster_ino = cluster_ino; __entry->cluster_ino = cluster_ino;
), ),
TP_printk("dev %d:%d agno %d startino %u daddr 0x%llx len %d chunkino %u nr_inodes %u cluster_mask 0x%x holemask 0x%x cluster_ino %u", TP_printk("dev %d:%d agno 0x%x startino 0x%x daddr 0x%llx bbcount 0x%x chunkino 0x%x nr_inodes %u cluster_mask 0x%x holemask 0x%x cluster_ino 0x%x",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->startino, __entry->startino,
@@ -670,7 +676,7 @@ DECLARE_EVENT_CLASS(xrep_extent_class,
__entry->agbno = agbno; __entry->agbno = agbno;
__entry->len = len; __entry->len = len;
), ),
TP_printk("dev %d:%d agno %u agbno %u len %u", TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->agbno, __entry->agbno,
@@ -707,7 +713,7 @@ DECLARE_EVENT_CLASS(xrep_rmap_class,
__entry->offset = offset; __entry->offset = offset;
__entry->flags = flags; __entry->flags = flags;
), ),
TP_printk("dev %d:%d agno %u agbno %u len %u owner %lld offset %llu flags 0x%x", TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->agbno, __entry->agbno,
@@ -745,7 +751,7 @@ TRACE_EVENT(xrep_refcount_extent_fn,
__entry->blockcount = irec->rc_blockcount; __entry->blockcount = irec->rc_blockcount;
__entry->refcount = irec->rc_refcount; __entry->refcount = irec->rc_refcount;
), ),
TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u", TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x refcount %u",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->startblock, __entry->startblock,
@@ -769,7 +775,7 @@ TRACE_EVENT(xrep_init_btblock,
__entry->agbno = agbno; __entry->agbno = agbno;
__entry->btnum = btnum; __entry->btnum = btnum;
), ),
TP_printk("dev %d:%d agno %u agbno %u btree %s", TP_printk("dev %d:%d agno 0x%x agbno 0x%x btree %s",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->agbno, __entry->agbno,
@@ -793,7 +799,7 @@ TRACE_EVENT(xrep_findroot_block,
__entry->magic = magic; __entry->magic = magic;
__entry->level = level; __entry->level = level;
), ),
TP_printk("dev %d:%d agno %u agbno %u magic 0x%x level %u", TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->agbno, __entry->agbno,
@@ -821,7 +827,7 @@ TRACE_EVENT(xrep_calc_ag_resblks,
__entry->freelen = freelen; __entry->freelen = freelen;
__entry->usedlen = usedlen; __entry->usedlen = usedlen;
), ),
TP_printk("dev %d:%d agno %d icount %u aglen %u freelen %u usedlen %u", TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->icount, __entry->icount,
@@ -850,7 +856,7 @@ TRACE_EVENT(xrep_calc_ag_resblks_btsize,
__entry->rmapbt_sz = rmapbt_sz; __entry->rmapbt_sz = rmapbt_sz;
__entry->refcbt_sz = refcbt_sz; __entry->refcbt_sz = refcbt_sz;
), ),
TP_printk("dev %d:%d agno %d bno %u ino %u rmap %u refcount %u", TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->bnobt_sz, __entry->bnobt_sz,
@@ -894,7 +900,7 @@ TRACE_EVENT(xrep_ialloc_insert,
__entry->freecount = freecount; __entry->freecount = freecount;
__entry->freemask = freemask; __entry->freemask = freemask;
), ),
TP_printk("dev %d:%d agno %d startino %u holemask 0x%x count %u freecount %u freemask 0x%llx", TP_printk("dev %d:%d agno 0x%x startino 0x%x holemask 0x%x count %u freecount %u freemask 0x%llx",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->agno, __entry->agno,
__entry->startino, __entry->startino,

View File

@@ -232,7 +232,7 @@ xfs_acl_set_mode(
inode->i_ctime = current_time(inode); inode->i_ctime = current_time(inode);
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
if (mp->m_flags & XFS_MOUNT_WSYNC) if (xfs_has_wsync(mp))
xfs_trans_set_sync(tp); xfs_trans_set_sync(tp);
return xfs_trans_commit(tp); return xfs_trans_commit(tp);
} }

View File

@@ -97,7 +97,7 @@ xfs_end_ioend(
/* /*
* Just clean up the in-memory structures if the fs has been shut down. * Just clean up the in-memory structures if the fs has been shut down.
*/ */
if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { if (xfs_is_shutdown(ip->i_mount)) {
error = -EIO; error = -EIO;
goto done; goto done;
} }
@@ -260,7 +260,7 @@ xfs_map_blocks(
int retries = 0; int retries = 0;
int error = 0; int error = 0;
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
/* /*
@@ -440,7 +440,7 @@ xfs_discard_page(
xfs_fileoff_t pageoff_fsb = XFS_B_TO_FSBT(mp, pageoff); xfs_fileoff_t pageoff_fsb = XFS_B_TO_FSBT(mp, pageoff);
int error; int error;
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
goto out_invalidate; goto out_invalidate;
xfs_alert_ratelimited(mp, xfs_alert_ratelimited(mp,
@@ -449,7 +449,7 @@ xfs_discard_page(
error = xfs_bmap_punch_delalloc_range(ip, start_fsb, error = xfs_bmap_punch_delalloc_range(ip, start_fsb,
i_blocks_per_page(inode, page) - pageoff_fsb); i_blocks_per_page(inode, page) - pageoff_fsb);
if (error && !XFS_FORCED_SHUTDOWN(mp)) if (error && !xfs_is_shutdown(mp))
xfs_alert(mp, "page discard unable to remove delalloc mapping."); xfs_alert(mp, "page discard unable to remove delalloc mapping.");
out_invalidate: out_invalidate:
iomap_invalidatepage(page, pageoff, PAGE_SIZE - pageoff); iomap_invalidatepage(page, pageoff, PAGE_SIZE - pageoff);
@@ -461,22 +461,6 @@ static const struct iomap_writeback_ops xfs_writeback_ops = {
.discard_page = xfs_discard_page, .discard_page = xfs_discard_page,
}; };
STATIC int
xfs_vm_writepage(
struct page *page,
struct writeback_control *wbc)
{
struct xfs_writepage_ctx wpc = { };
if (WARN_ON_ONCE(current->journal_info)) {
redirty_page_for_writepage(wbc, page);
unlock_page(page);
return 0;
}
return iomap_writepage(page, wbc, &wpc.ctx, &xfs_writeback_ops);
}
STATIC int STATIC int
xfs_vm_writepages( xfs_vm_writepages(
struct address_space *mapping, struct address_space *mapping,
@@ -559,7 +543,6 @@ xfs_iomap_swapfile_activate(
const struct address_space_operations xfs_address_space_operations = { const struct address_space_operations xfs_address_space_operations = {
.readpage = xfs_vm_readpage, .readpage = xfs_vm_readpage,
.readahead = xfs_vm_readahead, .readahead = xfs_vm_readahead,
.writepage = xfs_vm_writepage,
.writepages = xfs_vm_writepages, .writepages = xfs_vm_writepages,
.set_page_dirty = __set_page_dirty_nobuffers, .set_page_dirty = __set_page_dirty_nobuffers,
.releasepage = iomap_releasepage, .releasepage = iomap_releasepage,

View File

@@ -151,7 +151,7 @@ xfs_attr3_node_inactive(
} }
xfs_da3_node_hdr_from_disk(dp->i_mount, &ichdr, bp->b_addr); xfs_da3_node_hdr_from_disk(dp->i_mount, &ichdr, bp->b_addr);
parent_blkno = bp->b_bn; parent_blkno = xfs_buf_daddr(bp);
if (!ichdr.count) { if (!ichdr.count) {
xfs_trans_brelse(*trans, bp); xfs_trans_brelse(*trans, bp);
return 0; return 0;
@@ -177,7 +177,7 @@ xfs_attr3_node_inactive(
return error; return error;
/* save for re-read later */ /* save for re-read later */
child_blkno = XFS_BUF_ADDR(child_bp); child_blkno = xfs_buf_daddr(child_bp);
/* /*
* Invalidate the subtree, however we have to. * Invalidate the subtree, however we have to.
@@ -271,7 +271,7 @@ xfs_attr3_root_inactive(
error = xfs_da3_node_read(*trans, dp, 0, &bp, XFS_ATTR_FORK); error = xfs_da3_node_read(*trans, dp, 0, &bp, XFS_ATTR_FORK);
if (error) if (error)
return error; return error;
blkno = bp->b_bn; blkno = xfs_buf_daddr(bp);
/* /*
* Invalidate the tree, even if the "tree" is only a single leaf block. * Invalidate the tree, even if the "tree" is only a single leaf block.

View File

@@ -529,7 +529,7 @@ xfs_attr_list(
XFS_STATS_INC(dp->i_mount, xs_attr_list); XFS_STATS_INC(dp->i_mount, xs_attr_list);
if (XFS_FORCED_SHUTDOWN(dp->i_mount)) if (xfs_is_shutdown(dp->i_mount))
return -EIO; return -EIO;
lock_mode = xfs_ilock_attr_map_shared(dp); lock_mode = xfs_ilock_attr_map_shared(dp);

View File

@@ -24,7 +24,6 @@
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_log_priv.h" #include "xfs_log_priv.h"
#include "xfs_log_recover.h" #include "xfs_log_recover.h"
#include "xfs_quota.h"
kmem_zone_t *xfs_bui_zone; kmem_zone_t *xfs_bui_zone;
kmem_zone_t *xfs_bud_zone; kmem_zone_t *xfs_bud_zone;
@@ -487,18 +486,10 @@ xfs_bui_item_recover(
XFS_ATTR_FORK : XFS_DATA_FORK; XFS_ATTR_FORK : XFS_DATA_FORK;
bui_type = bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK; bui_type = bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK;
/* Grab the inode. */ error = xlog_recover_iget(mp, bmap->me_owner, &ip);
error = xfs_iget(mp, NULL, bmap->me_owner, 0, 0, &ip);
if (error) if (error)
return error; return error;
error = xfs_qm_dqattach(ip);
if (error)
goto err_rele;
if (VFS_I(ip)->i_nlink == 0)
xfs_iflags_set(ip, XFS_IRECOVERY);
/* Allocate transaction and do the work. */ /* Allocate transaction and do the work. */
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate,
XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK), 0, 0, &tp); XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK), 0, 0, &tp);
@@ -522,6 +513,9 @@ xfs_bui_item_recover(
error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip, error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip,
whichfork, bmap->me_startoff, bmap->me_startblock, whichfork, bmap->me_startoff, bmap->me_startblock,
&count, state); &count, state);
if (error == -EFSCORRUPTED)
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bmap,
sizeof(*bmap));
if (error) if (error)
goto err_cancel; goto err_cancel;

View File

@@ -731,7 +731,7 @@ xfs_free_eofblocks(
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
if (error) { if (error) {
ASSERT(XFS_FORCED_SHUTDOWN(mp)); ASSERT(xfs_is_shutdown(mp));
return error; return error;
} }
@@ -789,7 +789,7 @@ xfs_alloc_file_space(
trace_xfs_alloc_file_space(ip); trace_xfs_alloc_file_space(ip);
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
return -EIO; return -EIO;
error = xfs_qm_dqattach(ip); error = xfs_qm_dqattach(ip);
@@ -1282,7 +1282,7 @@ xfs_swap_extents_check_format(
* If we have to use the (expensive) rmap swap method, we can * If we have to use the (expensive) rmap swap method, we can
* handle any number of extents and any format. * handle any number of extents and any format.
*/ */
if (xfs_sb_version_hasrmapbt(&ip->i_mount->m_sb)) if (xfs_has_rmapbt(ip->i_mount))
return 0; return 0;
/* /*
@@ -1516,7 +1516,7 @@ xfs_swap_extent_forks(
* event of a crash. Set the owner change log flags now and leave the * event of a crash. Set the owner change log flags now and leave the
* bmbt scan as the last step. * bmbt scan as the last step.
*/ */
if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) { if (xfs_has_v3inodes(ip->i_mount)) {
if (ip->i_df.if_format == XFS_DINODE_FMT_BTREE) if (ip->i_df.if_format == XFS_DINODE_FMT_BTREE)
(*target_log_flags) |= XFS_ILOG_DOWNER; (*target_log_flags) |= XFS_ILOG_DOWNER;
if (tip->i_df.if_format == XFS_DINODE_FMT_BTREE) if (tip->i_df.if_format == XFS_DINODE_FMT_BTREE)
@@ -1553,7 +1553,7 @@ xfs_swap_extent_forks(
(*src_log_flags) |= XFS_ILOG_DEXT; (*src_log_flags) |= XFS_ILOG_DEXT;
break; break;
case XFS_DINODE_FMT_BTREE: case XFS_DINODE_FMT_BTREE:
ASSERT(!xfs_sb_version_has_v3inode(&ip->i_mount->m_sb) || ASSERT(!xfs_has_v3inodes(ip->i_mount) ||
(*src_log_flags & XFS_ILOG_DOWNER)); (*src_log_flags & XFS_ILOG_DOWNER));
(*src_log_flags) |= XFS_ILOG_DBROOT; (*src_log_flags) |= XFS_ILOG_DBROOT;
break; break;
@@ -1565,7 +1565,7 @@ xfs_swap_extent_forks(
break; break;
case XFS_DINODE_FMT_BTREE: case XFS_DINODE_FMT_BTREE:
(*target_log_flags) |= XFS_ILOG_DBROOT; (*target_log_flags) |= XFS_ILOG_DBROOT;
ASSERT(!xfs_sb_version_has_v3inode(&ip->i_mount->m_sb) || ASSERT(!xfs_has_v3inodes(ip->i_mount) ||
(*target_log_flags & XFS_ILOG_DOWNER)); (*target_log_flags & XFS_ILOG_DOWNER));
break; break;
} }
@@ -1678,7 +1678,7 @@ xfs_swap_extents(
* a block reservation because it's really just a remap operation * a block reservation because it's really just a remap operation
* performed with log redo items! * performed with log redo items!
*/ */
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { if (xfs_has_rmapbt(mp)) {
int w = XFS_DATA_FORK; int w = XFS_DATA_FORK;
uint32_t ipnext = ip->i_df.if_nextents; uint32_t ipnext = ip->i_df.if_nextents;
uint32_t tipnext = tip->i_df.if_nextents; uint32_t tipnext = tip->i_df.if_nextents;
@@ -1759,7 +1759,7 @@ xfs_swap_extents(
src_log_flags = XFS_ILOG_CORE; src_log_flags = XFS_ILOG_CORE;
target_log_flags = XFS_ILOG_CORE; target_log_flags = XFS_ILOG_CORE;
if (xfs_sb_version_hasrmapbt(&mp->m_sb)) if (xfs_has_rmapbt(mp))
error = xfs_swap_extent_rmap(&tp, ip, tip); error = xfs_swap_extent_rmap(&tp, ip, tip);
else else
error = xfs_swap_extent_forks(tp, ip, tip, &src_log_flags, error = xfs_swap_extent_forks(tp, ip, tip, &src_log_flags,
@@ -1778,7 +1778,7 @@ xfs_swap_extents(
} }
/* Swap the cow forks. */ /* Swap the cow forks. */
if (xfs_sb_version_hasreflink(&mp->m_sb)) { if (xfs_has_reflink(mp)) {
ASSERT(!ip->i_cowfp || ASSERT(!ip->i_cowfp ||
ip->i_cowfp->if_format == XFS_DINODE_FMT_EXTENTS); ip->i_cowfp->if_format == XFS_DINODE_FMT_EXTENTS);
ASSERT(!tip->i_cowfp || ASSERT(!tip->i_cowfp ||
@@ -1820,7 +1820,7 @@ xfs_swap_extents(
* If this is a synchronous mount, make sure that the * If this is a synchronous mount, make sure that the
* transaction goes to disk before returning to the user. * transaction goes to disk before returning to the user.
*/ */
if (mp->m_flags & XFS_MOUNT_WSYNC) if (xfs_has_wsync(mp))
xfs_trans_set_sync(tp); xfs_trans_set_sync(tp);
error = xfs_trans_commit(tp); error = xfs_trans_commit(tp);

View File

@@ -251,7 +251,7 @@ _xfs_buf_alloc(
return error; return error;
} }
bp->b_bn = map[0].bm_bn; bp->b_rhash_key = map[0].bm_bn;
bp->b_length = 0; bp->b_length = 0;
for (i = 0; i < nmaps; i++) { for (i = 0; i < nmaps; i++) {
bp->b_maps[i].bm_bn = map[i].bm_bn; bp->b_maps[i].bm_bn = map[i].bm_bn;
@@ -315,7 +315,6 @@ xfs_buf_alloc_kmem(
struct xfs_buf *bp, struct xfs_buf *bp,
xfs_buf_flags_t flags) xfs_buf_flags_t flags)
{ {
int align_mask = xfs_buftarg_dma_alignment(bp->b_target);
xfs_km_flags_t kmflag_mask = KM_NOFS; xfs_km_flags_t kmflag_mask = KM_NOFS;
size_t size = BBTOB(bp->b_length); size_t size = BBTOB(bp->b_length);
@@ -323,7 +322,7 @@ xfs_buf_alloc_kmem(
if (!(flags & XBF_READ)) if (!(flags & XBF_READ))
kmflag_mask |= KM_ZERO; kmflag_mask |= KM_ZERO;
bp->b_addr = kmem_alloc_io(size, align_mask, kmflag_mask); bp->b_addr = kmem_alloc(size, kmflag_mask);
if (!bp->b_addr) if (!bp->b_addr)
return -ENOMEM; return -ENOMEM;
@@ -460,7 +459,7 @@ _xfs_buf_obj_cmp(
*/ */
BUILD_BUG_ON(offsetof(struct xfs_buf_map, bm_bn) != 0); BUILD_BUG_ON(offsetof(struct xfs_buf_map, bm_bn) != 0);
if (bp->b_bn != map->bm_bn) if (bp->b_rhash_key != map->bm_bn)
return 1; return 1;
if (unlikely(bp->b_length != map->bm_len)) { if (unlikely(bp->b_length != map->bm_len)) {
@@ -482,7 +481,7 @@ static const struct rhashtable_params xfs_buf_hash_params = {
.min_size = 32, /* empty AGs have minimal footprint */ .min_size = 32, /* empty AGs have minimal footprint */
.nelem_hint = 16, .nelem_hint = 16,
.key_len = sizeof(xfs_daddr_t), .key_len = sizeof(xfs_daddr_t),
.key_offset = offsetof(struct xfs_buf, b_bn), .key_offset = offsetof(struct xfs_buf, b_rhash_key),
.head_offset = offsetof(struct xfs_buf, b_rhash_head), .head_offset = offsetof(struct xfs_buf, b_rhash_head),
.automatic_shrinking = true, .automatic_shrinking = true,
.obj_cmpfn = _xfs_buf_obj_cmp, .obj_cmpfn = _xfs_buf_obj_cmp,
@@ -814,7 +813,7 @@ xfs_buf_read_map(
* buffer. * buffer.
*/ */
if (error) { if (error) {
if (!XFS_FORCED_SHUTDOWN(target->bt_mount)) if (!xfs_is_shutdown(target->bt_mount))
xfs_buf_ioerror_alert(bp, fa); xfs_buf_ioerror_alert(bp, fa);
bp->b_flags &= ~XBF_DONE; bp->b_flags &= ~XBF_DONE;
@@ -854,7 +853,9 @@ xfs_buf_readahead_map(
/* /*
* Read an uncached buffer from disk. Allocates and returns a locked * Read an uncached buffer from disk. Allocates and returns a locked
* buffer containing the disk contents or nothing. * buffer containing the disk contents or nothing. Uncached buffers always have
* a cache index of XFS_BUF_DADDR_NULL so we can easily determine if the buffer
* is cached or uncached during fault diagnosis.
*/ */
int int
xfs_buf_read_uncached( xfs_buf_read_uncached(
@@ -876,7 +877,7 @@ xfs_buf_read_uncached(
/* set up the buffer for a read IO */ /* set up the buffer for a read IO */
ASSERT(bp->b_map_count == 1); ASSERT(bp->b_map_count == 1);
bp->b_bn = XFS_BUF_DADDR_NULL; /* always null for uncached buffers */ bp->b_rhash_key = XFS_BUF_DADDR_NULL;
bp->b_maps[0].bm_bn = daddr; bp->b_maps[0].bm_bn = daddr;
bp->b_flags |= XBF_READ; bp->b_flags |= XBF_READ;
bp->b_ops = ops; bp->b_ops = ops;
@@ -1145,7 +1146,7 @@ xfs_buf_ioerror_permanent(
return true; return true;
/* At unmount we may treat errors differently */ /* At unmount we may treat errors differently */
if ((mp->m_flags & XFS_MOUNT_UNMOUNTING) && mp->m_fail_unmount) if (xfs_is_unmounting(mp) && mp->m_fail_unmount)
return true; return true;
return false; return false;
@@ -1179,7 +1180,7 @@ xfs_buf_ioend_handle_error(
* If we've already decided to shutdown the filesystem because of I/O * If we've already decided to shutdown the filesystem because of I/O
* errors, there's no point in giving this a retry. * errors, there's no point in giving this a retry.
*/ */
if (XFS_FORCED_SHUTDOWN(mp)) if (xfs_is_shutdown(mp))
goto out_stale; goto out_stale;
xfs_buf_ioerror_alert_ratelimited(bp); xfs_buf_ioerror_alert_ratelimited(bp);
@@ -1336,7 +1337,7 @@ xfs_buf_ioerror_alert(
{ {
xfs_buf_alert_ratelimited(bp, "XFS: metadata IO error", xfs_buf_alert_ratelimited(bp, "XFS: metadata IO error",
"metadata I/O error in \"%pS\" at daddr 0x%llx len %d error %d", "metadata I/O error in \"%pS\" at daddr 0x%llx len %d error %d",
func, (uint64_t)XFS_BUF_ADDR(bp), func, (uint64_t)xfs_buf_daddr(bp),
bp->b_length, -bp->b_error); bp->b_length, -bp->b_error);
} }
@@ -1514,17 +1515,18 @@ _xfs_buf_ioapply(
SHUTDOWN_CORRUPT_INCORE); SHUTDOWN_CORRUPT_INCORE);
return; return;
} }
} else if (bp->b_bn != XFS_BUF_DADDR_NULL) { } else if (bp->b_rhash_key != XFS_BUF_DADDR_NULL) {
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
/* /*
* non-crc filesystems don't attach verifiers during * non-crc filesystems don't attach verifiers during
* log recovery, so don't warn for such filesystems. * log recovery, so don't warn for such filesystems.
*/ */
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
xfs_warn(mp, xfs_warn(mp,
"%s: no buf ops on daddr 0x%llx len %d", "%s: no buf ops on daddr 0x%llx len %d",
__func__, bp->b_bn, bp->b_length); __func__, xfs_buf_daddr(bp),
bp->b_length);
xfs_hex_dump(bp->b_addr, xfs_hex_dump(bp->b_addr,
XFS_CORRUPTION_DUMP_LEN); XFS_CORRUPTION_DUMP_LEN);
dump_stack(); dump_stack();
@@ -1592,7 +1594,7 @@ __xfs_buf_submit(
ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); ASSERT(!(bp->b_flags & _XBF_DELWRI_Q));
/* on shutdown we stale and complete the buffer immediately */ /* on shutdown we stale and complete the buffer immediately */
if (XFS_FORCED_SHUTDOWN(bp->b_mount)) { if (xfs_is_shutdown(bp->b_mount)) {
xfs_buf_ioend_fail(bp); xfs_buf_ioend_fail(bp);
return -EIO; return -EIO;
} }
@@ -1794,7 +1796,7 @@ xfs_buftarg_drain(
xfs_buf_alert_ratelimited(bp, xfs_buf_alert_ratelimited(bp,
"XFS: Corruption Alert", "XFS: Corruption Alert",
"Corruption Alert: Buffer at daddr 0x%llx had permanent write failures!", "Corruption Alert: Buffer at daddr 0x%llx had permanent write failures!",
(long long)bp->b_bn); (long long)xfs_buf_daddr(bp));
} }
xfs_buf_rele(bp); xfs_buf_rele(bp);
} }
@@ -1809,7 +1811,7 @@ xfs_buftarg_drain(
* down the fs. * down the fs.
*/ */
if (write_fail) { if (write_fail) {
ASSERT(XFS_FORCED_SHUTDOWN(btp->bt_mount)); ASSERT(xfs_is_shutdown(btp->bt_mount));
xfs_alert(btp->bt_mount, xfs_alert(btp->bt_mount,
"Please run xfs_repair to determine the extent of the problem."); "Please run xfs_repair to determine the extent of the problem.");
} }
@@ -2302,7 +2304,7 @@ xfs_verify_magic(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
int idx; int idx;
idx = xfs_sb_version_hascrc(&mp->m_sb); idx = xfs_has_crc(mp);
if (WARN_ON(!bp->b_ops || !bp->b_ops->magic[idx])) if (WARN_ON(!bp->b_ops || !bp->b_ops->magic[idx]))
return false; return false;
return dmagic == bp->b_ops->magic[idx]; return dmagic == bp->b_ops->magic[idx];
@@ -2320,7 +2322,7 @@ xfs_verify_magic16(
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
int idx; int idx;
idx = xfs_sb_version_hascrc(&mp->m_sb); idx = xfs_has_crc(mp);
if (WARN_ON(!bp->b_ops || !bp->b_ops->magic16[idx])) if (WARN_ON(!bp->b_ops || !bp->b_ops->magic16[idx]))
return false; return false;
return dmagic == bp->b_ops->magic16[idx]; return dmagic == bp->b_ops->magic16[idx];

View File

@@ -133,7 +133,8 @@ struct xfs_buf {
* fast-path on locking. * fast-path on locking.
*/ */
struct rhash_head b_rhash_head; /* pag buffer hash node */ struct rhash_head b_rhash_head; /* pag buffer hash node */
xfs_daddr_t b_bn; /* block number of buffer */
xfs_daddr_t b_rhash_key; /* buffer cache index */
int b_length; /* size of buffer in BBs */ int b_length; /* size of buffer in BBs */
atomic_t b_hold; /* reference count */ atomic_t b_hold; /* reference count */
atomic_t b_lru_ref; /* lru reclaim ref count */ atomic_t b_lru_ref; /* lru reclaim ref count */
@@ -296,18 +297,10 @@ extern int xfs_buf_delwri_pushbuf(struct xfs_buf *, struct list_head *);
extern int xfs_buf_init(void); extern int xfs_buf_init(void);
extern void xfs_buf_terminate(void); extern void xfs_buf_terminate(void);
/* static inline xfs_daddr_t xfs_buf_daddr(struct xfs_buf *bp)
* These macros use the IO block map rather than b_bn. b_bn is now really {
* just for the buffer cache index for cached buffers. As IO does not use b_bn return bp->b_maps[0].bm_bn;
* anymore, uncached buffers do not use b_bn at all and hence must modify the IO }
* map directly. Uncached buffers are not allowed to be discontiguous, so this
* is safe to do.
*
* In future, uncached buffers will pass the block number directly to the io
* request function and hence these macros will go away at that point.
*/
#define XFS_BUF_ADDR(bp) ((bp)->b_maps[0].bm_bn)
#define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_maps[0].bm_bn = (xfs_daddr_t)(bno))
void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref); void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref);
@@ -355,12 +348,6 @@ extern int xfs_setsize_buftarg(struct xfs_buftarg *, unsigned int);
#define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev) #define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev)
#define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) #define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev)
static inline int
xfs_buftarg_dma_alignment(struct xfs_buftarg *bt)
{
return queue_dma_alignment(bt->bt_bdev->bd_disk->queue);
}
int xfs_buf_reverify(struct xfs_buf *bp, const struct xfs_buf_ops *ops); int xfs_buf_reverify(struct xfs_buf *bp, const struct xfs_buf_ops *ops);
bool xfs_verify_magic(struct xfs_buf *bp, __be32 dmagic); bool xfs_verify_magic(struct xfs_buf *bp, __be32 dmagic);
bool xfs_verify_magic16(struct xfs_buf *bp, __be16 dmagic); bool xfs_verify_magic16(struct xfs_buf *bp, __be16 dmagic);

View File

@@ -428,7 +428,7 @@ xfs_buf_item_format(
* occurs during recovery. * occurs during recovery.
*/ */
if (bip->bli_flags & XFS_BLI_INODE_BUF) { if (bip->bli_flags & XFS_BLI_INODE_BUF) {
if (xfs_sb_version_has_v3inode(&lip->li_mountp->m_sb) || if (xfs_has_v3inodes(lip->li_mountp) ||
!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && !((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) &&
xfs_log_item_in_current_chkpt(lip))) xfs_log_item_in_current_chkpt(lip)))
bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF; bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF;
@@ -581,7 +581,7 @@ xfs_buf_item_push(
if (bp->b_flags & XBF_WRITE_FAIL) { if (bp->b_flags & XBF_WRITE_FAIL) {
xfs_buf_alert_ratelimited(bp, "XFS: Failing async write", xfs_buf_alert_ratelimited(bp, "XFS: Failing async write",
"Failing async write on buffer block 0x%llx. Retrying async write.", "Failing async write on buffer block 0x%llx. Retrying async write.",
(long long)bp->b_bn); (long long)xfs_buf_daddr(bp));
} }
if (!xfs_buf_delwri_queue(bp, buffer_list)) if (!xfs_buf_delwri_queue(bp, buffer_list))
@@ -616,7 +616,7 @@ xfs_buf_item_put(
* that case, the bli is freed on buffer writeback completion. * that case, the bli is freed on buffer writeback completion.
*/ */
aborted = test_bit(XFS_LI_ABORTED, &lip->li_flags) || aborted = test_bit(XFS_LI_ABORTED, &lip->li_flags) ||
XFS_FORCED_SHUTDOWN(lip->li_mountp); xfs_is_shutdown(lip->li_mountp);
dirty = bip->bli_flags & XFS_BLI_DIRTY; dirty = bip->bli_flags & XFS_BLI_DIRTY;
if (dirty && !aborted) if (dirty && !aborted)
return false; return false;

View File

@@ -219,7 +219,7 @@ xlog_recover_validate_buf_type(
* inconsistent state resulting in verification failures. Hence for now * inconsistent state resulting in verification failures. Hence for now
* just avoid the verification stage for non-crc filesystems * just avoid the verification stage for non-crc filesystems
*/ */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
return; return;
magic32 = be32_to_cpu(*(__be32 *)bp->b_addr); magic32 = be32_to_cpu(*(__be32 *)bp->b_addr);
@@ -497,7 +497,7 @@ xlog_recover_do_reg_buffer(
if (fa) { if (fa) {
xfs_alert(mp, xfs_alert(mp,
"dquot corrupt at %pS trying to replay into block 0x%llx", "dquot corrupt at %pS trying to replay into block 0x%llx",
fa, bp->b_bn); fa, xfs_buf_daddr(bp));
goto next; goto next;
} }
} }
@@ -597,7 +597,7 @@ xlog_recover_do_inode_buffer(
* Post recovery validation only works properly on CRC enabled * Post recovery validation only works properly on CRC enabled
* filesystems. * filesystems.
*/ */
if (xfs_sb_version_hascrc(&mp->m_sb)) if (xfs_has_crc(mp))
bp->b_ops = &xfs_inode_buf_ops; bp->b_ops = &xfs_inode_buf_ops;
inodes_per_buf = BBTOB(bp->b_length) >> mp->m_sb.sb_inodelog; inodes_per_buf = BBTOB(bp->b_length) >> mp->m_sb.sb_inodelog;
@@ -710,7 +710,7 @@ xlog_recover_get_buf_lsn(
uint16_t blft; uint16_t blft;
/* v4 filesystems always recover immediately */ /* v4 filesystems always recover immediately */
if (!xfs_sb_version_hascrc(&mp->m_sb)) if (!xfs_has_crc(mp))
goto recover_immediately; goto recover_immediately;
/* /*
@@ -787,7 +787,7 @@ xlog_recover_get_buf_lsn(
* the relevant UUID in the superblock. * the relevant UUID in the superblock.
*/ */
lsn = be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn); lsn = be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn);
if (xfs_sb_version_hasmetauuid(&mp->m_sb)) if (xfs_has_metauuid(mp))
uuid = &((struct xfs_dsb *)blk)->sb_meta_uuid; uuid = &((struct xfs_dsb *)blk)->sb_meta_uuid;
else else
uuid = &((struct xfs_dsb *)blk)->sb_uuid; uuid = &((struct xfs_dsb *)blk)->sb_uuid;

View File

@@ -32,7 +32,7 @@ xfs_dir3_get_dtype(
struct xfs_mount *mp, struct xfs_mount *mp,
uint8_t filetype) uint8_t filetype)
{ {
if (!xfs_sb_version_hasftype(&mp->m_sb)) if (!xfs_has_ftype(mp))
return DT_UNKNOWN; return DT_UNKNOWN;
if (filetype >= XFS_DIR3_FT_MAX) if (filetype >= XFS_DIR3_FT_MAX)
@@ -512,7 +512,7 @@ xfs_readdir(
trace_xfs_readdir(dp); trace_xfs_readdir(dp);
if (XFS_FORCED_SHUTDOWN(dp->i_mount)) if (xfs_is_shutdown(dp->i_mount))
return -EIO; return -EIO;
ASSERT(S_ISDIR(VFS_I(dp)->i_mode)); ASSERT(S_ISDIR(VFS_I(dp)->i_mode));

View File

@@ -169,7 +169,7 @@ xfs_ioc_trim(
* We haven't recovered the log, so we cannot use our bnobt-guided * We haven't recovered the log, so we cannot use our bnobt-guided
* storage zapping commands. * storage zapping commands.
*/ */
if (mp->m_flags & XFS_MOUNT_NORECOVERY) if (xfs_has_norecovery(mp))
return -EROFS; return -EROFS;
if (copy_from_user(&range, urange, sizeof(range))) if (copy_from_user(&range, urange, sizeof(range)))

View File

@@ -223,9 +223,9 @@ xfs_qm_init_dquot_blk(
d->dd_diskdq.d_version = XFS_DQUOT_VERSION; d->dd_diskdq.d_version = XFS_DQUOT_VERSION;
d->dd_diskdq.d_id = cpu_to_be32(curid); d->dd_diskdq.d_id = cpu_to_be32(curid);
d->dd_diskdq.d_type = type; d->dd_diskdq.d_type = type;
if (curid > 0 && xfs_sb_version_hasbigtime(&mp->m_sb)) if (curid > 0 && xfs_has_bigtime(mp))
d->dd_diskdq.d_type |= XFS_DQTYPE_BIGTIME; d->dd_diskdq.d_type |= XFS_DQTYPE_BIGTIME;
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid); uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid);
xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk),
XFS_DQUOT_CRC_OFF); XFS_DQUOT_CRC_OFF);
@@ -526,7 +526,7 @@ xfs_dquot_check_type(
* expect an exact match for user dquots and for non-root group and * expect an exact match for user dquots and for non-root group and
* project dquots. * project dquots.
*/ */
if (xfs_sb_version_hascrc(&dqp->q_mount->m_sb) || if (xfs_has_crc(dqp->q_mount) ||
dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0) dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0)
return ddqp_type == dqp_type; return ddqp_type == dqp_type;
@@ -847,9 +847,6 @@ xfs_qm_dqget_checks(
struct xfs_mount *mp, struct xfs_mount *mp,
xfs_dqtype_t type) xfs_dqtype_t type)
{ {
if (WARN_ON_ONCE(!XFS_IS_QUOTA_RUNNING(mp)))
return -ESRCH;
switch (type) { switch (type) {
case XFS_DQTYPE_USER: case XFS_DQTYPE_USER:
if (!XFS_IS_UQUOTA_ON(mp)) if (!XFS_IS_UQUOTA_ON(mp))
@@ -1222,7 +1219,7 @@ xfs_qm_dqflush_check(
/* bigtime flag should never be set on root dquots */ /* bigtime flag should never be set on root dquots */
if (dqp->q_type & XFS_DQTYPE_BIGTIME) { if (dqp->q_type & XFS_DQTYPE_BIGTIME) {
if (!xfs_sb_version_hasbigtime(&dqp->q_mount->m_sb)) if (!xfs_has_bigtime(dqp->q_mount))
return __this_address; return __this_address;
if (dqp->q_id == 0) if (dqp->q_id == 0)
return __this_address; return __this_address;
@@ -1301,7 +1298,7 @@ xfs_qm_dqflush(
* buffer always has a valid CRC. This ensures there is no possibility * buffer always has a valid CRC. This ensures there is no possibility
* of a dquot without an up-to-date CRC getting to disk. * of a dquot without an up-to-date CRC getting to disk.
*/ */
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
dqblk->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); dqblk->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn);
xfs_update_cksum((char *)dqblk, sizeof(struct xfs_dqblk), xfs_update_cksum((char *)dqblk, sizeof(struct xfs_dqblk),
XFS_DQUOT_CRC_OFF); XFS_DQUOT_CRC_OFF);

View File

@@ -54,6 +54,16 @@ struct xfs_dquot_res {
xfs_qwarncnt_t warnings; xfs_qwarncnt_t warnings;
}; };
static inline bool
xfs_dquot_res_over_limits(
const struct xfs_dquot_res *qres)
{
if ((qres->softlimit && qres->softlimit < qres->reserved) ||
(qres->hardlimit && qres->hardlimit < qres->reserved))
return true;
return false;
}
/* /*
* The incore dquot structure * The incore dquot structure
*/ */

View File

@@ -218,137 +218,3 @@ xfs_qm_dquot_logitem_init(
&xfs_dquot_item_ops); &xfs_dquot_item_ops);
lp->qli_dquot = dqp; lp->qli_dquot = dqp;
} }
/*------------------ QUOTAOFF LOG ITEMS -------------------*/
static inline struct xfs_qoff_logitem *QOFF_ITEM(struct xfs_log_item *lip)
{
return container_of(lip, struct xfs_qoff_logitem, qql_item);
}
/*
* This returns the number of iovecs needed to log the given quotaoff item.
* We only need 1 iovec for an quotaoff item. It just logs the
* quotaoff_log_format structure.
*/
STATIC void
xfs_qm_qoff_logitem_size(
struct xfs_log_item *lip,
int *nvecs,
int *nbytes)
{
*nvecs += 1;
*nbytes += sizeof(struct xfs_qoff_logitem);
}
STATIC void
xfs_qm_qoff_logitem_format(
struct xfs_log_item *lip,
struct xfs_log_vec *lv)
{
struct xfs_qoff_logitem *qflip = QOFF_ITEM(lip);
struct xfs_log_iovec *vecp = NULL;
struct xfs_qoff_logformat *qlf;
qlf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_QUOTAOFF);
qlf->qf_type = XFS_LI_QUOTAOFF;
qlf->qf_size = 1;
qlf->qf_flags = qflip->qql_flags;
xlog_finish_iovec(lv, vecp, sizeof(struct xfs_qoff_logitem));
}
/*
* There isn't much you can do to push a quotaoff item. It is simply
* stuck waiting for the log to be flushed to disk.
*/
STATIC uint
xfs_qm_qoff_logitem_push(
struct xfs_log_item *lip,
struct list_head *buffer_list)
{
return XFS_ITEM_LOCKED;
}
STATIC xfs_lsn_t
xfs_qm_qoffend_logitem_committed(
struct xfs_log_item *lip,
xfs_lsn_t lsn)
{
struct xfs_qoff_logitem *qfe = QOFF_ITEM(lip);
struct xfs_qoff_logitem *qfs = qfe->qql_start_lip;
xfs_qm_qoff_logitem_relse(qfs);
kmem_free(lip->li_lv_shadow);
kmem_free(qfe);
return (xfs_lsn_t)-1;
}
STATIC void
xfs_qm_qoff_logitem_release(
struct xfs_log_item *lip)
{
struct xfs_qoff_logitem *qoff = QOFF_ITEM(lip);
if (test_bit(XFS_LI_ABORTED, &lip->li_flags)) {
if (qoff->qql_start_lip)
xfs_qm_qoff_logitem_relse(qoff->qql_start_lip);
xfs_qm_qoff_logitem_relse(qoff);
}
}
static const struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
.iop_size = xfs_qm_qoff_logitem_size,
.iop_format = xfs_qm_qoff_logitem_format,
.iop_committed = xfs_qm_qoffend_logitem_committed,
.iop_push = xfs_qm_qoff_logitem_push,
.iop_release = xfs_qm_qoff_logitem_release,
};
static const struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
.iop_size = xfs_qm_qoff_logitem_size,
.iop_format = xfs_qm_qoff_logitem_format,
.iop_push = xfs_qm_qoff_logitem_push,
.iop_release = xfs_qm_qoff_logitem_release,
};
/*
* Delete the quotaoff intent from the AIL and free it. On success,
* this should only be called for the start item. It can be used for
* either on shutdown or abort.
*/
void
xfs_qm_qoff_logitem_relse(
struct xfs_qoff_logitem *qoff)
{
struct xfs_log_item *lip = &qoff->qql_item;
ASSERT(test_bit(XFS_LI_IN_AIL, &lip->li_flags) ||
test_bit(XFS_LI_ABORTED, &lip->li_flags) ||
XFS_FORCED_SHUTDOWN(lip->li_mountp));
xfs_trans_ail_delete(lip, 0);
kmem_free(lip->li_lv_shadow);
kmem_free(qoff);
}
/*
* Allocate and initialize an quotaoff item of the correct quota type(s).
*/
struct xfs_qoff_logitem *
xfs_qm_qoff_logitem_init(
struct xfs_mount *mp,
struct xfs_qoff_logitem *start,
uint flags)
{
struct xfs_qoff_logitem *qf;
qf = kmem_zalloc(sizeof(struct xfs_qoff_logitem), 0);
xfs_log_item_init(mp, &qf->qql_item, XFS_LI_QUOTAOFF, start ?
&xfs_qm_qoffend_logitem_ops : &xfs_qm_qoff_logitem_ops);
qf->qql_item.li_mountp = mp;
qf->qql_start_lip = start;
qf->qql_flags = flags;
return qf;
}

View File

@@ -9,7 +9,6 @@
struct xfs_dquot; struct xfs_dquot;
struct xfs_trans; struct xfs_trans;
struct xfs_mount; struct xfs_mount;
struct xfs_qoff_logitem;
struct xfs_dq_logitem { struct xfs_dq_logitem {
struct xfs_log_item qli_item; /* common portion */ struct xfs_log_item qli_item; /* common portion */
@@ -17,22 +16,6 @@ struct xfs_dq_logitem {
xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ xfs_lsn_t qli_flush_lsn; /* lsn at last flush */
}; };
struct xfs_qoff_logitem {
struct xfs_log_item qql_item; /* common portion */
struct xfs_qoff_logitem *qql_start_lip; /* qoff-start logitem, if any */
unsigned int qql_flags;
};
void xfs_qm_dquot_logitem_init(struct xfs_dquot *dqp); void xfs_qm_dquot_logitem_init(struct xfs_dquot *dqp);
struct xfs_qoff_logitem *xfs_qm_qoff_logitem_init(struct xfs_mount *mp,
struct xfs_qoff_logitem *start,
uint flags);
void xfs_qm_qoff_logitem_relse(struct xfs_qoff_logitem *);
struct xfs_qoff_logitem *xfs_trans_get_qoff_item(struct xfs_trans *tp,
struct xfs_qoff_logitem *startqoff,
uint flags);
void xfs_trans_log_quotaoff_item(struct xfs_trans *tp,
struct xfs_qoff_logitem *qlp);
#endif /* __XFS_DQUOT_ITEM_H__ */ #endif /* __XFS_DQUOT_ITEM_H__ */

View File

@@ -136,7 +136,7 @@ xlog_recover_dquot_commit_pass2(
* If the dquot has an LSN in it, recover the dquot only if it's less * If the dquot has an LSN in it, recover the dquot only if it's less
* than the lsn of the transaction we are replaying. * than the lsn of the transaction we are replaying.
*/ */
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddq; struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddq;
xfs_lsn_t lsn = be64_to_cpu(dqb->dd_lsn); xfs_lsn_t lsn = be64_to_cpu(dqb->dd_lsn);
@@ -146,7 +146,7 @@ xlog_recover_dquot_commit_pass2(
} }
memcpy(ddq, recddq, item->ri_buf[1].i_len); memcpy(ddq, recddq, item->ri_buf[1].i_len);
if (xfs_sb_version_hascrc(&mp->m_sb)) { if (xfs_has_crc(mp)) {
xfs_update_cksum((char *)ddq, sizeof(struct xfs_dqblk), xfs_update_cksum((char *)ddq, sizeof(struct xfs_dqblk),
XFS_DQUOT_CRC_OFF); XFS_DQUOT_CRC_OFF);
} }

View File

@@ -371,7 +371,7 @@ xfs_buf_corruption_error(
xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR, xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR,
"Metadata corruption detected at %pS, %s block 0x%llx", "Metadata corruption detected at %pS, %s block 0x%llx",
fa, bp->b_ops->name, bp->b_bn); fa, bp->b_ops->name, xfs_buf_daddr(bp));
xfs_alert(mp, "Unmount and run xfs_repair"); xfs_alert(mp, "Unmount and run xfs_repair");
@@ -402,7 +402,7 @@ xfs_buf_verifier_error(
xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR, xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR,
"Metadata %s detected at %pS, %s block 0x%llx %s", "Metadata %s detected at %pS, %s block 0x%llx %s",
bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", bp->b_error == -EFSBADCRC ? "CRC error" : "corruption",
fa, bp->b_ops->name, bp->b_bn, name); fa, bp->b_ops->name, xfs_buf_daddr(bp), name);
xfs_alert(mp, "Unmount and run xfs_repair"); xfs_alert(mp, "Unmount and run xfs_repair");

View File

@@ -75,4 +75,16 @@ extern int xfs_errortag_clearall(struct xfs_mount *mp);
#define XFS_PTAG_FSBLOCK_ZERO 0x00000080 #define XFS_PTAG_FSBLOCK_ZERO 0x00000080
#define XFS_PTAG_VERIFIER_ERROR 0x00000100 #define XFS_PTAG_VERIFIER_ERROR 0x00000100
#define XFS_PTAG_STRINGS \
{ XFS_NO_PTAG, "none" }, \
{ XFS_PTAG_IFLUSH, "iflush" }, \
{ XFS_PTAG_LOGRES, "logres" }, \
{ XFS_PTAG_AILDELETE, "aildelete" }, \
{ XFS_PTAG_ERROR_REPORT , "error_report" }, \
{ XFS_PTAG_SHUTDOWN_CORRUPT, "corrupt" }, \
{ XFS_PTAG_SHUTDOWN_IOERROR, "ioerror" }, \
{ XFS_PTAG_SHUTDOWN_LOGERROR, "logerror" }, \
{ XFS_PTAG_FSBLOCK_ZERO, "fsb_zero" }, \
{ XFS_PTAG_VERIFIER_ERROR, "verifier" }
#endif /* __XFS_ERROR_H__ */ #endif /* __XFS_ERROR_H__ */

View File

@@ -44,6 +44,7 @@ xfs_fs_encode_fh(
int *max_len, int *max_len,
struct inode *parent) struct inode *parent)
{ {
struct xfs_mount *mp = XFS_M(inode->i_sb);
struct fid *fid = (struct fid *)fh; struct fid *fid = (struct fid *)fh;
struct xfs_fid64 *fid64 = (struct xfs_fid64 *)fh; struct xfs_fid64 *fid64 = (struct xfs_fid64 *)fh;
int fileid_type; int fileid_type;
@@ -63,8 +64,7 @@ xfs_fs_encode_fh(
* large enough filesystem may contain them, thus the slightly * large enough filesystem may contain them, thus the slightly
* confusing looking conditional below. * confusing looking conditional below.
*/ */
if (!(XFS_M(inode->i_sb)->m_flags & XFS_MOUNT_SMALL_INUMS) || if (!xfs_has_small_inums(mp) || xfs_is_inode32(mp))
(XFS_M(inode->i_sb)->m_flags & XFS_MOUNT_32BITINODES))
fileid_type |= XFS_FILEID_TYPE_64FLAG; fileid_type |= XFS_FILEID_TYPE_64FLAG;
/* /*

Some files were not shown because too many files have changed in this diff Show More