CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: [EMAIL PROTECTED] 2007-11-28 16:49:06
Modified files: gfs2/edit : hexedit.h savemeta.c Log message: Resolves: bz 402971: GFS2: gfs2_edit savemeta doesn't save rindex file. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.6&r2=1.4.2.7 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/savemeta.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.3&r2=1.1.2.4 --- cluster/gfs2/edit/hexedit.h 2007/11/16 19:42:34 1.4.2.6 +++ cluster/gfs2/edit/hexedit.h 2007/11/28 16:49:06 1.4.2.7 @@ -136,6 +136,7 @@ }; EXTERN int block_is_jindex(void); +EXTERN int block_is_rindex(void); EXTERN int block_is_inum_file(void); EXTERN int block_is_statfs_file(void); EXTERN int block_is_quota_file(void); --- cluster/gfs2/edit/savemeta.c 2007/11/16 19:42:34 1.1.2.3 +++ cluster/gfs2/edit/savemeta.c 2007/11/28 16:49:06 1.1.2.4 @@ -383,7 +383,7 @@ struct gfs2_meta_header mh; *block_type = 0; - *struct_len = 0; + *struct_len = bufsize; gfs2_meta_header_in(&mh, buf); if (mh.mh_magic != GFS2_MAGIC) @@ -492,6 +492,7 @@ block_is_inum_file() || block_is_statfs_file() || block_is_quota_file() || + block_is_rindex() || block_is_a_journal(); } @@ -501,6 +502,12 @@ uint16_t trailing0; char *p; + if (blk > last_fs_block) { + fprintf(stderr, "\nWarning: bad block pointer ignored in " + "block (block %llu (%llx))", + (unsigned long long)block, (unsigned long long)block); + return 0; + } memset(savedata, 0, sizeof(struct saved_metablock)); do_lseek(fd, blk * bufsize); do_read(fd, savedata->buf, bufsize); /* read in the block */ @@ -536,12 +543,11 @@ void save_indirect_blocks(int out_fd, osi_list_t *cur_list, struct gfs2_buffer_head *mybh, int height, int hgt) { - uint64_t old_block = 0, starting_block; + uint64_t old_block = 0, indir_block; uint64_t *ptr; int head_size; struct gfs2_buffer_head *nbh; - starting_block = block; /* remember where we started */ head_size = (hgt > 1 ? sizeof(struct gfs2_meta_header) : sizeof(struct gfs2_dinode)); @@ -550,19 +556,18 @@ (char *)ptr < (mybh->b_data + mybh->b_size); ptr++) { if (!*ptr) continue; - block = be64_to_cpu(*ptr); - if (block == old_block) + indir_block = be64_to_cpu(*ptr); + if (indir_block == old_block) continue; - old_block = block; - save_block(sbd.device_fd, out_fd, block); + old_block = indir_block; + save_block(sbd.device_fd, out_fd, indir_block); if (height != hgt) { /* If not at max height */ - nbh = bread(&sbd, block); + nbh = bread(&sbd, indir_block); osi_list_add_prev(&nbh->b_altlist, cur_list); brelse(nbh, not_updated); } } /* for all data on the indirect block */ - block = starting_block; /* go back to where we started */ } /* @@ -632,28 +637,37 @@ } if (inode->i_di.di_eattr) { /* if this inode has extended attributes */ struct gfs2_ea_header ea; + struct gfs2_meta_header mh; int e; metabh = bread(&sbd, inode->i_di.di_eattr); save_block(sbd.device_fd, out_fd, inode->i_di.di_eattr); - for (e = sizeof(struct gfs2_meta_header); - e < bufsize; e += ea.ea_rec_len) { - uint64_t blk, *b; - int charoff; - - gfs2_ea_header_in(&ea, metabh->b_data + e); - for (i = 0; i < ea.ea_num_ptrs; i++) { - charoff = e + ea.ea_name_len + - sizeof(struct gfs2_ea_header) + - sizeof(uint64_t) - 1; - charoff /= sizeof(uint64_t); - b = (uint64_t *)(metabh->b_data); - b += charoff + i; - blk = be64_to_cpu(*b); - save_block(sbd.device_fd, out_fd, blk); + gfs2_meta_header_in(&mh, metabh->b_data); + if (mh.mh_magic == GFS2_MAGIC) { + for (e = sizeof(struct gfs2_meta_header); + e < bufsize; e += ea.ea_rec_len) { + uint64_t blk, *b; + int charoff; + + gfs2_ea_header_in(&ea, metabh->b_data + e); + for (i = 0; i < ea.ea_num_ptrs; i++) { + charoff = e + ea.ea_name_len + + sizeof(struct gfs2_ea_header) + + sizeof(uint64_t) - 1; + charoff /= sizeof(uint64_t); + b = (uint64_t *)(metabh->b_data); + b += charoff + i; + blk = be64_to_cpu(*b); + save_block(sbd.device_fd, out_fd, blk); + } + if (!ea.ea_rec_len) + break; } - if (!ea.ea_rec_len) - break; + } else { + fprintf(stderr, "\nWarning: corrupt extended attribute" + " at block %llu (0x%llx) detected.\n", + (unsigned long long)block, + (unsigned long long)block); } brelse(metabh, not_updated); }