#ifndef UTIL_LINUX_MINIX_PROGRAMS_H #define UTIL_LINUX_MINIX_PROGRAMS_H #include "minix.h" /* * Global variables. */ extern int fs_version; extern char *super_block_buffer; #define Super (*(struct minix_super_block *) super_block_buffer) #define Super3 (*(struct minix3_super_block *) super_block_buffer) #define INODE_SIZE (sizeof(struct minix_inode)) #define INODE2_SIZE (sizeof(struct minix2_inode)) #define BITS_PER_BLOCK (MINIX_BLOCK_SIZE << 3) #define UPPER(size,n) ((size+((n)-1))/(n)) /* * Inline functions. */ static inline unsigned long get_ninodes(void) { switch (fs_version) { case 3: return Super3.s_ninodes; default: return Super.s_ninodes; } } static inline unsigned long get_nzones(void) { switch (fs_version) { case 3: return Super3.s_zones; case 2: return Super.s_zones; default: return Super.s_nzones; } } static inline unsigned long get_nimaps(void) { switch (fs_version) { case 3: return Super3.s_imap_blocks; default: return Super.s_imap_blocks; } } static inline unsigned long get_nzmaps(void) { switch (fs_version) { case 3: return Super3.s_zmap_blocks; default: return Super.s_zmap_blocks; } } static inline off_t get_first_zone(void) { switch (fs_version) { case 3: return Super3.s_firstdatazone; default: return Super.s_firstdatazone; } } static inline size_t get_zone_size(void) { switch (fs_version) { case 3: return Super3.s_log_zone_size; default: return Super.s_log_zone_size; } } static inline size_t get_max_size(void) { switch (fs_version) { case 3: return Super3.s_max_size; default: return Super.s_max_size; } } static inline unsigned long inode_blocks(void) { switch (fs_version) { case 3: case 2: return UPPER(get_ninodes(), MINIX2_INODES_PER_BLOCK); default: return UPPER(get_ninodes(), MINIX_INODES_PER_BLOCK); } } static inline off_t first_zone_data(void) { return 2 + get_nimaps() + get_nzmaps() + inode_blocks(); } static inline size_t get_inode_buffer_size(void) { return inode_blocks() * MINIX_BLOCK_SIZE; } #endif /* UTIL_LINUX_MINIX_PROGRAMS_H */