| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. |
| * All Rights Reserved. |
| */ |
| |
| #ifndef _XFS_REPAIR_BMAP_H |
| #define _XFS_REPAIR_BMAP_H |
| |
| /* |
| * Extent descriptor. |
| */ |
| typedef struct bmap_ext { |
| xfs_fileoff_t startoff; |
| xfs_fsblock_t startblock; |
| xfs_filblks_t blockcount; |
| } bmap_ext_t; |
| |
| /* |
| * Block map. |
| */ |
| typedef struct blkmap { |
| int naexts; |
| int nexts; |
| bmap_ext_t exts[1]; |
| } blkmap_t; |
| |
| #define BLKMAP_SIZE(n) \ |
| (offsetof(blkmap_t, exts) + (sizeof(bmap_ext_t) * (n))) |
| |
| /* |
| * For 32 bit platforms, we are limited to extent arrays of 2^31 bytes, which |
| * limits the number of extents in an inode we can check. If we don't limit the |
| * valid range, we can overflow the BLKMAP_SIZE() calculation and allocate less |
| * memory than we think we needed, and hence walk off the end of the array and |
| * corrupt memory. |
| */ |
| #if BITS_PER_LONG == 32 |
| #define BLKMAP_NEXTS_MAX ((INT_MAX / sizeof(bmap_ext_t)) - 1) |
| #else |
| #define BLKMAP_NEXTS_MAX INT_MAX |
| #endif |
| |
| extern pthread_key_t dblkmap_key; |
| extern pthread_key_t ablkmap_key; |
| |
| blkmap_t *blkmap_alloc(xfs_extnum_t nex, int whichfork); |
| void blkmap_free(blkmap_t *blkmap); |
| void blkmap_free_final(void); |
| |
| int blkmap_set_ext(blkmap_t **blkmapp, xfs_fileoff_t o, |
| xfs_fsblock_t b, xfs_filblks_t c); |
| |
| xfs_fsblock_t blkmap_get(blkmap_t *blkmap, xfs_fileoff_t o); |
| int blkmap_getn(blkmap_t *blkmap, xfs_fileoff_t o, |
| xfs_filblks_t nb, bmap_ext_t **bmpp, |
| bmap_ext_t *bmpp_single); |
| xfs_fileoff_t blkmap_last_off(blkmap_t *blkmap); |
| xfs_fileoff_t blkmap_next_off(blkmap_t *blkmap, xfs_fileoff_t o, int *t); |
| |
| #endif /* _XFS_REPAIR_BMAP_H */ |