dump: support for ext4 file-systems on Linux.
PATCH v2 1/1 dump: support for ext4 file-systems on Linux.
In reply to a message not in the archiveHi,
version 2 attached. The original patch contained a bug in which ext4 extents index nodes were dumped as well as part of a regular file dump. Still only for Linux.
---
Gertjan van Wingerde.
Quoted 11 lines · Gertjan van Wingerde
Hi,
Find attached a patch I created to support the dumping and restoring of ext4 file-systems under Linux. For now it only works on Linux, as it uses the ext2fs library functions to get hold of the real data blocks. I don't understand dump enough to also handle the non-Linux case, although it would seems that relying on the ext2fs library for other systems would be appropriate.
N.B. Note that I am not subscribed to the mailing list, so cc me on replies.
---
Gertjan.
dump/traverse.c +10 -16
@@ -777,8 +777,6 @@struct block_context *p;e2_blkcnt_t i; -if (blockcnt <NDADDR ) -return 0 ; p = (struct block_context *)private;for (i = p->next_block; i < blockcnt; i++) { p->buf[p->cnt++] =0 ;
@@ -986,19 +984,6 @@msg ("Warning: undefined file type 0%o\n" , dp->di_mode &IFMT );return ; } - if (i_size > (u_quad_t)NDADDR * sblock->fs_bsize) -#ifdef __linux__ - cnt =NDADDR *EXT2_FRAGS_PER_BLOCK (fs->super); -#else - cnt =NDADDR * sblock->fs_frag; -#endif - else - cnt =howmany (i_size, sblock->fs_fsize); -blksout (&dp->di_db[0 ], cnt, ino); -if ((quad_t) (size = i_size -NDADDR * sblock->fs_bsize) <=0 ) { -dump_xattr (ino, dp); -return ; - }#ifdef __linux__ bc.max =NINDIR (sblock) *EXT2_FRAGS_PER_BLOCK (fs->super); bc.buf = (int *)malloc (bc.max *sizeof (int ));
@@ -1006,7 +991,7 @@ bc.ino = ino; bc.next_block =NDADDR ; -ext2fs_block_iterate2 (fs, (ext2_ino_t )ino,0 ,NULL , dumponeblock, (void *)&bc); +ext2fs_block_iterate2 (fs, (ext2_ino_t )ino,BLOCK_FLAG_DATA_ONLY ,NULL , dumponeblock, (void *)&bc);/* deal with holes at the end of the inode */ if (i_size > ((u_quad_t )bc.next_block) * sblock->fs_fsize) { remaining = i_size - ((u_quad_t )bc.next_block) * sblock->fs_fsize;
@@ -1024,6 +1009,15 @@free (bc.buf);dump_xattr (ino, dp);#else +if (i_size > (u_quad_t )NDADDR * sblock->fs_bsize) + cnt =NDADDR * sblock->fs_frag; +else + cnt =howmany (i_size, sblock->fs_fsize); +blksout (&dp->di_db[0 ], cnt, ino); +if ((quad_t) (size = i_size -NDADDR * sblock->fs_bsize) <=0 ) { +dump_xattr (ino, dp); +return ; + }for (ind_level =0 ; ind_level <NIADDR ; ind_level++) {dmpindir (ino, dp->di_ib[ind_level], ind_level, &size);if (size <=0 )