| /* |
| * Copyright (c) 2000-2001 Silicon Graphics, Inc. |
| * All Rights Reserved. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it would be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| #ifndef INOMAP_H |
| #define INOMAP_H |
| |
| /* inomap.[hc] - inode map abstraction |
| * |
| * an inode map describes the inode numbers (inos) in a file system dump. |
| * the map identifies which inos are in-use by the fs, which of those are |
| * directories, and which are dumped. |
| * |
| * the map is represented as a list of map segments. a map segment is |
| * a 64-bit starting ino and two 64-bit bitmaps. the bitmaps describe |
| * the 64 inos beginning with the starting ino. two bits are available |
| * for each ino. |
| */ |
| |
| /* map state values |
| */ |
| #define MAP_INO_UNUSED 0 /* ino not in use by fs */ |
| #define MAP_DIR_NOCHNG 1 /* dir, ino in use by fs, but not dumped */ |
| #define MAP_NDR_NOCHNG 2 /* non-dir, ino in use by fs, but not dumped */ |
| #define MAP_DIR_CHANGE 3 /* dir, changed since last dump */ |
| #define MAP_NDR_CHANGE 4 /* non-dir, changed since last dump */ |
| #define MAP_DIR_SUPPRT 5 /* dir, unchanged but needed for hierarchy */ |
| #define MAP_NDR_NOREST 6 /* was MAP_NDR_CHANGE, but not to be restored */ |
| #define MAP_RESERVED2 7 /* this state currently not used */ |
| |
| /* the inomap is implemented as a linked list of chunks. each chunk contains |
| * an array of map segments. a map segment contains a start ino and a |
| * bitmap of 64 3-bit state values (see MAP_... in inomap.h). the SEG_macros |
| * index and manipulate the 3-bit state values. |
| */ |
| struct seg { |
| xfs_ino_t base; |
| uint64_t lobits; |
| uint64_t mebits; |
| uint64_t hibits; |
| }; |
| |
| typedef struct seg seg_t; |
| |
| #define INOPERSEG ( sizeofmember( seg_t, lobits ) * NBBY ) |
| |
| #define HNKSZ ( 4 * PGSZ ) |
| #define SEGPERHNK ( ( HNKSZ / sizeof( seg_t )) - 1 ) |
| |
| struct hnk { |
| seg_t seg[ SEGPERHNK ]; |
| xfs_ino_t maxino; |
| struct hnk *nextp; |
| char pad[sizeof( seg_t ) - sizeof( xfs_ino_t ) - sizeof( struct hnk * )]; |
| }; |
| |
| typedef struct hnk hnk_t; |
| |
| extern bool_t inomap_sync_pers( char *hkdir ); |
| extern rv_t inomap_restore_pers( drive_t *drivep, |
| content_inode_hdr_t *scrhdrp, |
| char *hkdir ); |
| extern void inomap_del_pers( char *hkdir ); |
| extern void inomap_sanitize( void ); |
| extern bool_t inomap_rst_needed( xfs_ino_t begino, xfs_ino_t endino ); |
| extern void inomap_rst_add( xfs_ino_t ino ); |
| extern void inomap_rst_del( xfs_ino_t ino ); |
| extern rv_t inomap_discard( drive_t *drivep, content_inode_hdr_t *scrhdrp ); |
| extern void inomap_cbiter( int mapstatemask, |
| bool_t ( * cbfunc )( void *ctxp, xfs_ino_t ino ), |
| void *ctxp ); |
| |
| #endif /* INOMAP_H */ |