#include #include #include #include #include #include #include #include #include #include #include "main.h" #include "disk.h" __u32 *blokmap=NULL; #define BLOCK_BUSY(b) blokmap[(b)>>5]|= (1<<((b)&0x1f)) static int set_blocks_busy_i( int fd, __u32 block, int level ) { char buf[blocksize]; __u32 *p; int i; BLOCK_BUSY(block); lseek(fd,blocksize*block,SEEK_SET); read(fd,buf,blocksize); p=(__u32*)(&(buf[0])); for(i=0;i=nr_blocks ) return(0); if( level>1 ) set_blocks_busy_i(fd,p[i],level-1); else BLOCK_BUSY(p[i]); } return(1); } int set_blocks_busy( int fd, struct mem_inode_s *inode ) { int i; for(i=0;iinode.i_block[i]==0 ) return(1); if( inode->inode.i_block[i]>=nr_blocks ) return(0); BLOCK_BUSY(inode->inode.i_block[i]); } if( inode->inode.i_block[EXT2_IND_BLOCK]==0 ) return(1); set_blocks_busy_i(fd,inode->inode.i_block[EXT2_IND_BLOCK],1); if( inode->inode.i_block[EXT2_DIND_BLOCK]==0 ) return(1); set_blocks_busy_i(fd,inode->inode.i_block[EXT2_DIND_BLOCK],2); if( inode->inode.i_block[EXT2_TIND_BLOCK]==0 ) return(1); set_blocks_busy_i(fd,inode->inode.i_block[EXT2_TIND_BLOCK],3); return(1); } int fill_blokmap( int fd ) { int i,j; struct mem_inode_s *p; struct mem_dir_s *d; if( (blokmap=malloc(4*(2+nr_blocks/32)))==NULL ) { fprintf(stderr,"Out of memory!\n"); exit(-1); } memset(blokmap,0,4*(nr_blocks/32)); for(i=0;i<16;i++) BLOCK_BUSY(i); for(i=0;inext) set_blocks_busy(fd,p); for(d=mem_dirs_first;d!=NULL;d=d->next) BLOCK_BUSY(d->to_block); for(d=mem_dirs;d!=NULL;d=d->next) BLOCK_BUSY(d->to_block); return(1); } __u32 get_free_block( void ) { __u32 j,m,i; for(j=0;jnext) nr_dirs++; progressbar_init("Moving directories 1"); for(p=mem_dirs_first;p!=NULL;p=p->next) { progressbar_display( ((float)i_dir/((float)nr_dirs/100.)) , f_dir); if( p->to_block==0 ) { p->to_block=get_free_block(); p->need_to_write=1; f_dir++; } i_dir++; } progressbar_display( ((float)i_dir/((float)nr_dirs/100.)) , f_dir); progressbar_stop(); progressbar_init("Moving directories 2"); for(p=mem_dirs;p!=NULL;p=p->next) { progressbar_display( ((float)i_dir/((float)nr_dirs/100.)) , f_dir); if( p->to_block==0 ) { p->to_block=get_free_block(); p->need_to_write=1; f_dir++; } i_dir++; } progressbar_display( ((float)i_dir/((float)nr_dirs/100.)) , f_dir); progressbar_stop(); return(1); }