/* * defrag.h - include file for the Linux file system degragmenter. * defrag.h,v 1.7 1993/01/07 14:48:49 linux Exp * * Copyright (C) 1992, 1993 Stephen Tweedie (sct@dcs.ed.ac.uk) * * Copyright (C) 1992 Remy Card (card@masi.ibp.fr) * * Copyright (C) 1991 Linus Torvalds (torvalds@kruuna.helsinki.fi) * * This file may be redistributed under the terms of the GNU General * Public License. * */ #ifdef NODEBUG #define debug 0 #define assert(a) #else extern int debug; #include #endif #ifdef EXTFS #include "ext.h" #endif #ifdef MINIXFS #include "minix.h" #endif /* Use inline assembler to generate efficient bit operators */ #ifndef __GNUC__ #error "needs gcc for the bitop-__asm__'s" #endif #define SYNC_PERIOD 500 extern char * program_name, * version, * CVSID; extern char * device_name; extern int IN; extern int verbose, show, show_version, badblocks, readonly; extern int blocks_until_sync; extern int changed; /* flags if the filesystem has been changed */ /* We omit a lot of the declarations when compiling misc.c, since misc.o is shared between extfs and minixfs versions, so we can't give correct types for a lot of fs-dependent stuff. */ #ifndef MISC_C extern Block next_block_to_fill, first_zone; extern unsigned int zones, block_size; extern char * inode_buffer; #define Inode (((struct d_inode *) inode_buffer) - 1) extern char super_block_buffer[]; /* n2d_map and d2n_map contain the zone movement maps. Whenever a zone is moved, these maps are updated to allow the current occupant of a zone to be mapped to its original location, and the original location of any zone data to be mapped to its current location. When a zone was originally empty, the d2n_map will contain zero at that location to reflect the fact that there was no original occupant of that zone is not to be found. The n2d_map will also be zero for blocks which do not currently hold any useful data and which may be overwritten freely. o2n_map contains the final translation from old to new disc blocks, and is used to update inode block tables and indirection blocks. inode_map and bad_map maintain flags recording which inodes are in use, and which blocks are bad respectively. */ extern char * inode_map; extern Block *inode_average_map; extern int *inode_order_map; extern Block *n2d_map, *d2n_map, *o2n_map; /* Manipulate the inode map */ #define inode_in_use(x) (bit (inode_map, (x))) #define mark_inode(x) (setbit (inode_map, (x)), changed = 1) #define unmark_inode(x) (clrbit (inode_map, (x)), changed = 1) /* Manipulate the block translation maps */ #define n2d(x) (n2d_map[(x)-first_zone]) #define d2n(x) (d2n_map[(x)-first_zone]) #define o2n(x) (o2n_map[(x)-first_zone]) #define unmark_zone(x) (d2n(x) = 0, n2d(x) = 0, changed = 1) #define zone_in_use(x) (n2d(x) != 0) #ifdef EXTFS /* Manipulate the bad block map */ extern char * bad_map; #define zone_is_bad(x) (bit (bad_map, (x) - first_zone + 1)) #define mark_bad(x) (setbit (bad_map, (x) - first_zone + 1), badblocks++) #endif /* Define modes for the walk_zone functions */ enum walk_zone_mode {WZ_SCAN, WZ_REMAP_IND, WZ_REMAP_DATA #ifdef EXTFS , WZ_BAD_BLOCKS #endif }; /* Miscellaneous function declarations */ /* The inline bitop functions... */ #ifdef atarist #include #else #define bitop(name,op) \ static inline int name(char * addr,unsigned int nr) \ { \ int __res; \ __asm__ __volatile__("bt" op "l %1,%2; adcl $0,%0" \ :"=g" (__res) \ :"r" (nr),"m" (*(addr)),"0" (0)); \ return __res; \ } bitop(bit,"") bitop(setbit,"s") bitop(clrbit,"r") #endif extern int isatty(int); /* Block/buffer management prototypes */ enum BufferType { OUTPUT, RESCUE }; typedef enum BufferType BufferType; typedef struct Buffer Buffer; struct Buffer { BufferType btype : 1; unsigned int in_use : 1; unsigned int full : 1; Buffer *next; Block dest_zone; unsigned char data[0]; }; extern int pool_size; extern Buffer *pool; extern int count_buffer_writes, count_buffer_reads; extern int count_write_groups, count_read_groups; extern int count_buffer_migrates, count_buffer_forces; extern int count_buffer_read_aheads; void read_buffer_data (Buffer *b); void write_buffer_data_at (Buffer *b, Block dest); void write_buffer_data (Buffer *b); void init_buffer_tables (void); void remap_disk_blocks (void); void check_zone_nr (Block nr); /* Read/write block currently at given address */ void read_current_block (Block nnr, char * addr); void write_current_block (Block nnr, char * addr); /* Read/write block originally at given address */ void read_old_block (Block onr, char *addr); void write_old_block (Block onr, char *addr); /* Prototypes for fs-specific portions */ void read_tables (void); void write_tables (void); void salvage_free_zones (void); void init_zone_maps (void); void init_inode_bitmap (void); #endif /* MISC_C */ /* Now for the prototypes for misc.c */ /* Volatile to let gcc know that this doesn't return. */ volatile void fatal_error (); volatile void usage (); #define die(str) fatal_error("%s: " str "\n") #define nomore() fatal_error("%s: cannot continue.\n")