ext2resize-devel Mailing List for GNU ext2resize
Status: Inactive
Brought to you by:
adilger
You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
(8) |
Apr
(1) |
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
(6) |
Oct
|
Nov
(5) |
Dec
(2) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
|
Feb
|
Mar
(6) |
Apr
(2) |
May
|
Jun
|
Jul
(3) |
Aug
(2) |
Sep
|
Oct
(5) |
Nov
(5) |
Dec
|
2002 |
Jan
(14) |
Feb
(8) |
Mar
(5) |
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
(3) |
Sep
(12) |
Oct
(12) |
Nov
(10) |
Dec
(10) |
2003 |
Jan
|
Feb
(7) |
Mar
(1) |
Apr
(6) |
May
(3) |
Jun
|
Jul
(3) |
Aug
(3) |
Sep
(2) |
Oct
(4) |
Nov
(1) |
Dec
(2) |
2004 |
Jan
(3) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
(2) |
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
2005 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
(14) |
Sep
(4) |
Oct
|
Nov
|
Dec
(5) |
2006 |
Jan
|
Feb
(4) |
Mar
(19) |
Apr
(1) |
May
(9) |
Jun
(34) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
From: Travis H. <so...@gm...> - 2006-08-04 08:03:24
|
Hi, anyone ever seen something like this? su 1 bash# lvdisplay /dev/big/fs --- Logical volume --- LV Name /dev/big/fs ... LV Size 181.20 GB Current LE 11597 ... su 1 bash# ext2resize /dev/big/fs 90000000k ext2resize v1.1.18 - 2001/03/18 for EXT2FS 0.5b error: Invalid argument: seeking to 7273619292160 su 1 bash# strace ext2resize /dev/big/fs 90000000k 2>&1 | tail read(3, "\253\200*\201\205\203\224{\322\337\263\362\17\202\233u"..., 4096) = 4096 read(3, "\350W\330i\360\347\'\351SrC\221d~B1\r`\260nDoI\216uW\362"..., 4096) = 4096 _llseek(3, 7273619292160, 0xbf9395b0, SEEK_SET) = -1 EINVAL (Invalid argument) write(2, "error: Invalid argument: seeking"..., 50error: Invalid argument: seeking to 7273619292160) = 50 write(1, "ext2resize v1.1.18 - 2001/03/18 "..., 48ext2resize v1.1.18 - 2001/03/18 for EXT2FS 0.5b) = 48 ... Golly, that's 6TB there... I have no idea how it got that. I told it 90GB. -- "If you're not part of the solution, you're part of the precipitate." Unix "guru" for rent or hire -><- http://www.lightconsulting.com/~travis/ GPG fingerprint: 9D3F 395A DAC5 5CCC 9066 151D 0A6B 4098 0C55 1484 |
From: Takashi S. <sh...@tn...> - 2006-06-23 13:01:15
|
Hi, > >> I found a bug in my patch which you applied to CVS. > > If I understand you correctly, you suggest this change. How can I > test if the change work or not? How can I reproduce the error it is > fixing? This change works only when ext2prepare adds reserved group descriptor blocks. This is reproduced by the following procedure. #mke2fs /dev/XXX -j -b 16384 3294967295 #ext2prepare /dev/XXX 4294967295 In case 4KB blocksize, this problem doesn't occur because fs->sb.s_blocks_per_group is set to 32768, which is a multiple of 1024(fs->u32perblock), and both the following two cases give the same result. > - if(((block - gdb_offset)%fs->u32perblock) != i) > + if(((block - gdb_offset)%fs->sb.s_blocks_per_group) != i) While in case 16KB blocksize, fs->sb.s_blocks_per_group seems to be set to 65528, which is not a multiple of 4096(fs->u32perblock), so this problem occurs. > Index: src/ext2.c > =================================================================== > RCS file: /cvsroot/ext2resize/ext2resize/src/ext2.c,v > retrieving revision 1.35 > diff -u -3 -p -r1.35 ext2.c > --- src/ext2.c 11 Jun 2006 08:30:07 -0000 1.35 > +++ src/ext2.c 21 Jun 2006 13:42:23 -0000 > @@ -382,7 +382,7 @@ int ext2_block_iterate(struct ext2_fs *f > ext2_brelse(bh, 0); > return 1; > } > - if(((block - gdb_offset)%fs->u32perblock) != i) > + if(((block - gdb_offset)%fs->sb.s_blocks_per_group) != i) > continue; > > bh2 = ext2_bread(fs, udata[i]); > > Friendly, > -- > Petter Reinholdtsen Cheers, sho |
From: Petter R. <pe...@hu...> - 2006-06-21 13:45:25
|
> I found a bug in my patch which you applied to CVS. If I understand you correctly, you suggest this change. How can I test if the change work or not? How can I reproduce the error it is fixing? Index: src/ext2.c =================================================================== RCS file: /cvsroot/ext2resize/ext2resize/src/ext2.c,v retrieving revision 1.35 diff -u -3 -p -r1.35 ext2.c --- src/ext2.c 11 Jun 2006 08:30:07 -0000 1.35 +++ src/ext2.c 21 Jun 2006 13:42:23 -0000 @@ -382,7 +382,7 @@ int ext2_block_iterate(struct ext2_fs *f ext2_brelse(bh, 0); return 1; } - if(((block - gdb_offset)%fs->u32perblock) != i) + if(((block - gdb_offset)%fs->sb.s_blocks_per_group) != i) continue; bh2 = ext2_bread(fs, udata[i]); Friendly, -- Petter Reinholdtsen |
From: <sh...@tn...> - 2006-06-20 08:46:29
|
Hi, >> Hi, >> >> I had gone out for three days so the reply to you was delayed. >> >>> Can you explain why the rest of the patch is needed? This is the >>> patch updated to the current CVS version. >> >> OK, I described comments below. I found a bug in my patch which you applied to CVS. ext2_block_iterate(): ------------------------------------------------------------------------ /* Double indirect blocks for next 2^16/2^18/2^20 1k/2k/4k blocks */ for (i = 0; i < fs->u32perblock; i++) { : : if (!udata[i]) continue; if(udata[i] == block){ ext2_brelse(bh, 0); return 1; } *** if(((block - gdb_offset)%fs->u32perblock) != i) continue; ------------------------------------------------------------------------ The "block" should be stored to the double indirect block whose block number should be got from the offset(block - gdb_offset)%fs->s_blocks_per_group) in the single indirect block. However, actually the target double indirect block number is got from the offset(block - gdb_offset)%fs->u32perblock) as the above code marked with "***". So ext2_block_iterate() cannot find the target double indirect block number and returns -1(error). We should fix the above code as below. ------------------------------------------------------------------------- - if(((block - gdb_offset)%fs->u32perblock) != i) + if(((block - gdb_offset)%fs->sb.s_blocks_per_group) != i) ------------------------------------------------------------------------- Cheers, sho |
From: Takashi S. <sh...@tn...> - 2006-06-16 09:53:46
|
Hi, I had gone out for three days so the reply to you was delayed. > Can you explain why the rest of the patch is needed? This is the > patch updated to the current CVS version. OK, I described comments below. > Index: src/ext2.h > =================================================================== > RCS file: /cvsroot/ext2resize/ext2resize/src/ext2.h,v > retrieving revision 1.28 > diff -u -3 -p -u -r1.28 ext2.h > --- src/ext2.h 10 Jun 2006 07:45:55 -0000 1.28 > +++ src/ext2.h 10 Jun 2006 14:27:56 -0000 > @@ -264,7 +264,7 @@ static __inline__ int ext2_is_data_block > group = blk / fs->sb.s_blocks_per_group; > blk %= fs->sb.s_blocks_per_group; > > - if (ext2_bg_has_super(fs, group) && blk <= fs->gdblocks) > + if (ext2_bg_has_super(fs, group) && blk <= fs->gdblocks + fs->resgdblocks) > return 0; If blk belongs to group descriptor blocks(GDB) or reserved GDB, ext2_is_data_block should return 0. Without this fix, it would return 1 though blk belongs to reserved GDB. > if (block == fs->gd[group].bg_block_bitmap || > Index: src/ext2_block_relocator.c > =================================================================== > RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_block_relocator.c,v > retrieving revision 1.22 > diff -u -3 -p -u -r1.22 ext2_block_relocator.c > --- src/ext2_block_relocator.c 10 Jun 2006 07:45:55 -0000 1.22 > +++ src/ext2_block_relocator.c 10 Jun 2006 14:27:56 -0000 > @@ -497,6 +497,10 @@ static int ext2_block_relocator_grab_blo > int raid_bb, raid_ib; > int itend = state->new_alloc_offset; > > + if (!ext2_bg_has_super(fs, group)) > + itend = fs->gd[group].bg_inode_table > + +fs->inodeblocks - start; > + state->new_alloc_offset is set to the offset of the first data block in the block group which has a super block. So, if the target group doesn't have a super block, it should be re-calculated. > bpg = fs->sb.s_blocks_per_group; > if (start + bpg > fs->newblocks) > bpg = fs->newblocks - start; > Index: src/ext2_meta.c > =================================================================== > RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_meta.c,v > retrieving revision 1.14 > diff -u -3 -p -u -r1.14 ext2_meta.c > --- src/ext2_meta.c 17 Feb 2006 12:04:09 -0000 1.14 > +++ src/ext2_meta.c 10 Jun 2006 14:27:56 -0000 > @@ -192,7 +192,8 @@ int ext2_metadata_push(struct ext2_fs *f > group + 1, fs->numgroups); > } > > - fs->itoffset = new_itoffset; > + fs->itoffset = fs->newgdblocks + 3; > + fs->itoffset should be set to the offset of an inode table in a group which has a super block. Without this fix, fs->itoffset is possible to be set to the offset in a group which doesn't have a super block and following procedure runs incorrectly. > if (fs->flags & FL_VERBOSE) > printf("\n"); > Index: src/ext2_resize.c > =================================================================== > RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_resize.c,v > retrieving revision 1.19 > diff -u -3 -p -u -r1.19 ext2_resize.c > --- src/ext2_resize.c 10 Jun 2006 06:45:22 -0000 1.19 > +++ src/ext2_resize.c 10 Jun 2006 14:27:56 -0000 > @@ -157,7 +157,7 @@ static int ext2_add_group(struct ext2_fs > return 1; > } > > -static int ext2_del_group(struct ext2_fs *fs) > +static int ext2_del_group(struct ext2_fs *fs, int old_gdblocks) > { > blk_t admin; > int group = fs->numgroups - 1; > @@ -170,7 +170,7 @@ static int ext2_del_group(struct ext2_fs > > has_sb = ext2_bg_has_super(fs, group); > > - admin = fs->inodeblocks + (has_sb ? fs->gdblocks + 3 : 2); > + admin = fs->inodeblocks + (has_sb ? old_gdblocks + 3 : 2); > > bpg = fs->sb.s_blocks_count - fs->sb.s_first_data_block - > group * fs->sb.s_blocks_per_group; > @@ -407,6 +407,7 @@ static int ext2_grow_fs(struct ext2_fs * > > static int ext2_shrink_fs(struct ext2_fs *fs) > { > + int old_gdblocks; > if (fs->flags & FL_DEBUG) > printf("%s\n", __FUNCTION__); > > @@ -432,8 +433,7 @@ static int ext2_shrink_fs(struct ext2_fs > if (!ext2_inode_relocate(fs)) > return 0; > > - if (!ext2_block_relocate(fs)) > - return 0; > + old_gdblocks = fs->gdblocks; Until the size of a filesystem becomes the expected size, groups will be removed at the following loop. 1. ext2_del_group() decreases the number of GDB(fs->gdblocks) after deleting all groups on one GBD. 2. When ext2_del_group() is called at the next iteration, it calculates the number of meta-data blocks in a group by using fs->gdblocks, so the result of the calculation is less than the actual meta-data blocks and following procedure runs incorrectly. So we fixed this to save the original number of GDB(fs->gdblocks) before deleting groups and passed the saved number to ext2_del_group() as an argument. > while (fs->sb.s_blocks_count > fs->newblocks) { > blk_t sizelast = (fs->sb.s_blocks_count - > @@ -445,7 +445,7 @@ static int ext2_shrink_fs(struct ext2_fs > fs->sb.s_blocks_count)) > return 0; > } else { > - if (!ext2_del_group(fs)) > + if (!ext2_del_group(fs, old_gdblocks)) > return 0; > } > } Cheers, sho |
From: Andreas D. <ad...@cl...> - 2006-06-12 06:47:44
|
On Jun 12, 2006 08:24 +0200, Petter Reinholdtsen wrote: > > Document more of the content in the ext2 super block struct. Code > > found in the big-endian patch from Fedora. > > [Coywolf Qi Hunt] > > I don't like it. Doing this is useless and only wasting your own > > time. > > Well, I only commited it after I asked on ext2resize-devel and got one > reply from Andreas which I understood to say that I should commit it. > Should I revert it? It is following e2fsprogs, so I think that is the right thing to do. Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Petter R. <pe...@hu...> - 2006-06-12 06:45:08
|
[Coywolf Qi Hunt] > I think a tarball is for users. They don't need to see things like > tst (for test) which is for developers. Well, in my experience almost all the users are using a prebuilt binary package prepared by the distributions. The source tarball is used by developers and others interested in the source for the package, and I believe those interested in the source should get to see all the source when they download the source tarball. If the unused source is completely useless, it should be removed. If not, it can be useful also for those reading the source using the source tarball, and thus should be included there. Friendly, -- Petter Reinholdtsen |
From: Coywolf Qi H. <co...@gm...> - 2006-06-12 06:33:21
|
2006/6/12, Petter Reinholdtsen <pe...@hu...>: > I'm moving the discussion to ext2resize-devel@, as it seem a better > place to discuss the development. > > [Petter Reinholdtsen] > > Log Message: > > Include all the source files (also the unused ones) in the source tarball. > > [Coywolf Qi Hunt] > > Why do that? We don't need ext2_mkfs.c and tst.c. > > Because I believe the source tarball should reflect the content of the > upstream CVS, and thus be a reliably and distributed backup on the CVS > content. If we do not need them, why are they not removed from CVS? > As long as they are present in CVS, I believe they should be in the > source tarball as well, to make sure the tarball is complete and can > be used to recreate the CVS content. I think a tarball is for users. They don't need to see things like tst (for test) which is for developers. -- Coywolf Qi Hunt |
From: Petter R. <pe...@hu...> - 2006-06-12 06:24:28
|
I'm moving the discussion to ext2resize-devel@, as it seem a better place to discuss the development. [Petter Reinholdtsen] > Modified Files: > ext2_fs.h > Log Message: > Document more of the content in the ext2 super block struct. Code > found in the big-endian patch from Fedora. [Coywolf Qi Hunt] > I don't like it. Doing this is useless and only wasting your own > time. Well, I only commited it after I asked on ext2resize-devel and got one reply from Andreas which I understood to say that I should commit it. Should I revert it? > If you have to do it, you'd follow the vanilla kernel, not fedora or > any other particular distros. The patch was part of the proposed patch to fix endian problems. I currently do not try to track any distro, but to apply the available and tested patches. Is there a proposed patch to follow the vanilla kernel around? Friendly, -- Petter Reinholdtsen |
From: Petter R. <pe...@hu...> - 2006-06-12 06:11:12
|
I'm moving the discussion to ext2resize-devel@, as it seem a better place to discuss the development. [Petter Reinholdtsen] > Log Message: > Include all the source files (also the unused ones) in the source tarball. [Coywolf Qi Hunt] > Why do that? We don't need ext2_mkfs.c and tst.c. Because I believe the source tarball should reflect the content of the upstream CVS, and thus be a reliably and distributed backup on the CVS content. If we do not need them, why are they not removed from CVS? As long as they are present in CVS, I believe they should be in the source tarball as well, to make sure the tarball is complete and can be used to recreate the CVS content. Friendly, -- Petter Reinholdtsen |
From: Andreas D. <ad...@cl...> - 2006-06-12 05:45:45
|
On Jun 10, 2006 23:15 +0200, Petter Reinholdtsen wrote: > [Andreas Dilger] > > Actually, there are two more changes that need including. One is to > > handle the blocks referenced by i_file_acl, and the second is to > > handle large inodes. > > Do they need to be included in this release? The ones I propose have > been tested alrady in the debian package. If I got it right, the two > you propose have not been tested yet. I suggest we release 1.1.20 > this weekend with the current CVS and the two patches for big endian > fixes and the new resize_inode format, and test the others a bit more > before releasing a new version with them included. If we decide not to include these patches, we should then remove support for the EXT2_FEATURE_COMPAT_EXT_ATTR flag, because the code does not actually support properly preparing or resizing filesystems with EAs (though online resize is OK). Secondly, prepare and resize should be denied for s_inode_size that isn't EXT2_GOOD_OLD_INODE_SIZE. Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Petter R. <pe...@hu...> - 2006-06-11 19:15:37
|
[Petter Reinholdtsen] > Who is doing the release? Should I do it, or is there someone else > willing to take care of releasing version 1.1.20? I just realised. I lack the project privileges to do releases on sourceforge. So if I am to do it, I would have to do it from one of my web pages. I suggest someone with the privileges do it instead. > I did 'make dist' with the current cvs content, to get a test > package. Please have a look at > <URL:http://folk.uio.no/pre/ext2resize-1.1.20-test1-20060611.tar.gz>, > and let me know if there are problems with it. I guess no-one found time to look at it? :) I'm trying to test the new patches, but still do not really understand how to check that they are correct. Will continue looking at it. :) Friendly, -- Petter Reinholdtsen |
From: Petter R. <pe...@hu...> - 2006-06-11 09:07:28
|
[Andreas Dilger] > This patch fixes handling of the EXT2_FEATURE_COMPAT_EA feature. > The block referenced by i_file_acl needs to be checked for remapping > during filesystem preparation/resize. Patch is proof of concept > only, it has not been tested. It fail to build with this error when I apply it to the current CVS: ext2_block_relocator.c: In function `doblock': ext2_block_relocator.c:142: warning: unused parameter `fs' ext2_block_relocator.c:267:74: macro "offsetof" passed 3 arguments, but takes just 2 ext2_block_relocator.c: In function `doinode': ext2_block_relocator.c:266: error: `offsetof' undeclared (first use in this function) ext2_block_relocator.c:266: error: (Each undeclared identifier is reported only once ext2_block_relocator.c:266: error: for each function it appears in.) ext2_block_relocator.c:266: error: too few arguments to function `doblock' ext2_block_relocator.c: In function `inode_block_scan': ext2_block_relocator.c:327: warning: comparison between signed and unsigned ext2_block_relocator.c: In function `ext2_block_relocator_grab_blocks': ext2_block_relocator.c:524: warning: comparison between signed and unsigned ext2_block_relocator.c: In function `ext2_block_relocate_grow': ext2_block_relocator.c:688: warning: comparison between signed and unsigned ext2_block_relocator.c:691: warning: comparison between signed and unsigned ext2_block_relocator.c: In function `ext2_block_relocate_shrink': ext2_block_relocator.c:869: warning: comparison between signed and unsigned ext2_block_relocator.c:879: warning: comparison between signed and unsigned ext2_block_relocator.c:879: warning: comparison between signed and unsigned ext2_block_relocator.c:880: warning: comparison between signed and unsigned ext2_block_relocator.c:886: warning: comparison between signed and unsigned ext2_block_relocator.c:896: warning: comparison between signed and unsigned I guess this patch need more work too. :) Friendly, -- Petter Reinholdtsen |
From: Petter R. <pe...@hu...> - 2006-06-11 09:03:57
|
[Andreas Dilger] > I agree with this change, and all of the corresponding code should > just be removed outright. It was useful for resizing ext2 > filesystems, but that patch is dead, and if it is ever revived it > can use the same ioctl mechanism as ext3 without difficulty. I commited the change. I do not feel qualified to remove the now unused code, so I hope someone else will come up with a patch for that. Friendly, -- Petter Reinholdtsen |
From: Petter R. <pe...@hu...> - 2006-06-11 09:00:57
|
[Andreas Dilger] > This patch adds handling for large inodes to resizing. It uses a buffer > large enough for the maximum inode size for the few places we read inodes, > and reads and writes the full inode size instead of just the main body. This patch fail to compile. This is the error: ext2_inode_relocator.c: I funktionen 'ext2_inode_relocator_mark': ext2_inode_relocator.c:495: error: request for member `i_links_count' in something not a structure or union I guess it need more work before it should be commited? Friendly, -- Petter Reinholdtsen |
From: Petter R. <pe...@hu...> - 2006-06-11 08:50:34
|
[Petter Reinholdtsen] > Who is doing the release? Should I do it, or is there someone else > willing to take care of releasing version 1.1.20? I did 'make dist' with the current cvs content, to get a test package. Please have a look at <URL:http://folk.uio.no/pre/ext2resize-1.1.20-test1-20060611.tar.gz>, and let me know if there are problems with it. Friendly, -- Petter Reinholdtsen |
From: Petter R. <pe...@hu...> - 2006-06-10 21:15:22
|
[Andreas Dilger] > Actually, there are two more changes that need including. One is to > handle the blocks referenced by i_file_acl, and the second is to > handle large inodes. Do they need to be included in this release? The ones I propose have been tested alrady in the debian package. If I got it right, the two you propose have not been tested yet. I suggest we release 1.1.20 this weekend with the current CVS and the two patches for big endian fixes and the new resize_inode format, and test the others a bit more before releasing a new version with them included. I'm not sure if I will be able to test acl and large inode patches properly this weekend, so unless someone else can verify that they work as they should, I believe we should postpone them. Who is doing the release? Should I do it, or is there someone else willing to take care of releasing version 1.1.20? |
From: Petter R. <pe...@hu...> - 2006-06-10 20:53:01
|
[Petter Reinholdtsen] >> Can you please set up cvs update email so that interested parties >> can see the checkins being made. > > Ah, I thought that was in place already. Where should it be sent? Ah, it does exist already. Check <URL:http://sourceforge.net/mailarchive/forum.php?forum_id=47231>. |
From: Petter R. <pe...@hu...> - 2006-06-10 20:16:15
|
[Andreas Dilger] > You may as well keep this part. OK. I'll commit it right away. >> +#define LINUX_S_IFMT 00170000 >> +#define LINUX_S_IFLNK 00120000 >> +#define LINUX_S_ISLNK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK) > > This should go into a header. Well, which header? > The rest seems reasonable, though I also have no way to test it. Yeah. I've tested it on i386, but not on any big-endian machines. :/ > Can you please set up cvs update email so that interested parties > can see the checkins being made. Ah, I thought that was in place already. Where should it be sent? |
From: Andreas D. <ad...@cl...> - 2006-06-10 18:36:36
|
This patch adds handling for large inodes to resizing. It uses a buffer large enough for the maximum inode size for the few places we read inodes, and reads and writes the full inode size instead of just the main body. Patch is untested. Suggested method for testing: - create small new filesystem with large inodes (-I 256) - mount with newer kernel (at least 2.6.10) - create new files in root dir, add EA with setfattr - unmount - verify with debugfs -R "stat <inum>" that EA is in inode - resize or prepare filesystem to add new group block - verify with debugfs -R "stat <inum>" that EA was moved with inode (or mount and use getfattr) ============================================================================ diff -u -p -r1.34 ext2.c --- src/ext2.c 10 Jun 2006 07:45:55 -0000 1.34 +++ src/ext2.c 10 Jun 2006 18:07:21 -0000 @@ -220,9 +220,7 @@ off_t ext2_get_inode_offset(struct ext2_ inode--; group = inode / fs->sb.s_inodes_per_group; - offset = (inode % fs->sb.s_inodes_per_group) * - (fs->sb.s_rev_level == EXT2_GOOD_OLD_REV ? - EXT2_GOOD_OLD_INODE_SIZE : fs->sb.s_inode_size); + offset = (inode % fs->sb.s_inodes_per_group) * fs->inode_size; *block = fs->gd[group].bg_inode_table + (offset >> fs->logsize); @@ -256,7 +254,7 @@ void ext2_read_inode(struct ext2_fs *fs, off = ext2_get_inode_offset(fs, ino, &blk); bh = ext2_bread(fs, blk); - memcpy(inode, bh->data + off, sizeof(struct ext2_inode)); + memcpy(inode, bh->data + off, fs->inode_size); ext2_brelse(bh, 0); } @@ -454,21 +454,21 @@ void ext2_write_inode(struct ext2_fs *fs if (fs->flags & FL_ONLINE) { fs->devhandle->ops->direct_write(fs->devhandle->cookie, (const void *)inode, (loff_t)blk * fs->blocksize + off, - sizeof(struct ext2_inode)); + fs->inode_size); } else { bh = ext2_bread(fs, blk); bh->dirty = 1; - memcpy(bh->data + off, inode, sizeof(struct ext2_inode)); + memcpy(bh->data + off, inode, fs->inode_size); ext2_brelse(bh, 0); } } void ext2_zero_inode(struct ext2_fs *fs, ino_t ino) { - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; - memset(&inode, 0, sizeof(struct ext2_inode)); - ext2_write_inode(fs, ino, &inode); + memset(inode_buf, 0, fs->inode_size); + ext2_write_inode(fs, ino, (void *)inode_buf); } unsigned int ext2_list_backups(struct ext2_fs *fs, unsigned int *three, @@ -860,7 +860,8 @@ struct ext2_fs *ext2_open(struct ext2_de int flags) { struct ext2_fs *fs; - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; int maxgroups; blk_t devsize; blk_t residue; @@ -942,6 +943,19 @@ struct ext2_fs *ext2_open(struct ext2_de fs->blocksize = 1 << fs->logsize; fs->u32perblock = fs->blocksize >> 2; + if (fs->sb.s_rev_level > EXT2_GOOD_OLD_REV) { + fs->inode_size = fs->sb.s_inode_size; + if (fs->inode_size < EXT2_GOOD_OLD_INODE_SIZE || + fs->inode_size & (fs->inode_size - 1) || + fs->inode_size > fs->blocksize) { + fprintf(stderr, "superblock inode size %u is invalid\n", + fs->inode_size); + goto error_free_fs; + } + } else { + fs->inode_size = EXT2_GOOD_OLD_INODE_SIZE; + } + devsize = handle->ops->get_size(fs->devhandle->cookie); if (newblocks == 0) newblocks = devsize; @@ -956,8 +970,8 @@ struct ext2_fs *ext2_open(struct ext2_de fs->sb.s_blocks_per_group); fs->gdblocks = howmany(fs->numgroups * sizeof(struct ext2_group_desc), fs->blocksize); - fs->inodeblocks = howmany(fs->sb.s_inodes_per_group * - sizeof(struct ext2_inode), fs->blocksize); + fs->inodeblocks = howmany(fs->sb.s_inodes_per_group * fs->inode_size, + fs->blocksize); fs->r_frac = howmany(100 * (loff_t)fs->sb.s_r_blocks_count, fs->sb.s_blocks_count); @@ -1011,8 +1025,8 @@ struct ext2_fs *ext2_open(struct ext2_de if (!ext2_determine_itoffset(fs)) goto error_free_gd; - ext2_read_inode(fs, EXT2_BAD_INO, &inode); - if (inode.i_blocks > 0) { + ext2_read_inode(fs, EXT2_BAD_INO, inode); + if (inode->i_blocks > 0) { fprintf(stderr, "%s: ext2_open: Can't handle fs with bad blocks!!\n" "Contact <ext...@li...> to " @@ -1021,8 +1035,8 @@ struct ext2_fs *ext2_open(struct ext2_de } /* Bring in Mr. Bond */ - ext2_read_inode(fs, EXT2_RESIZE_INO, &inode); - fs->resgdblocks = ext2_get_reserved(fs, &inode); + ext2_read_inode(fs, EXT2_RESIZE_INO, inode); + fs->resgdblocks = ext2_get_reserved(fs, inode); #if 0 ext2_journal_init(fs); diff -u -p -r1.28 ext2.h --- src/ext2.h 10 Jun 2006 07:45:55 -0000 1.28 +++ src/ext2.h 10 Jun 2006 18:07:21 -0000 @@ -115,6 +115,7 @@ struct ext2_fs int flags; /* See FL_* defines */ int blocksize; + int inode_size; /* inode size in bytes */ int u32perblock; /* #blocks per indirect block */ int logsize; /* base 2 log of blocksize */ blk_t newblocks; /* blocks in resized fs */ diff -u -p -r1.22 ext2_block_relocator.c --- src/ext2_block_relocator.c 10 Jun 2006 07:45:55 -0000 1.22 +++ src/ext2_block_relocator.c 10 Jun 2006 18:07:21 -0000 @@ -249,8 +249,8 @@ static int dotindblock(struct ext2_fs *f static int doinode(struct ext2_fs *fs, struct ext2_block_relocator_state *state, ino_t ino) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; ext2_read_inode(fs, ino, inode); @@ -628,8 +634,8 @@ static int ext2_block_relocator_mark(str static int ext2_block_relocate_grow(struct ext2_fs *fs, struct ext2_block_relocator_state *state) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; int newitoffset; blk_t start; int group; @@ -793,8 +799,8 @@ static int ext2_block_relocate_grow(stru static int ext2_block_relocate_shrink(struct ext2_fs *fs, struct ext2_block_relocator_state *state) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; int group; blk_t start; diff -u -p -r1.8 ext2_fs.h --- src/ext2_fs.h 3 Jul 2002 17:52:24 -0000 1.8 +++ src/ext2_fs.h 10 Jun 2006 18:07:21 -0000 @@ -75,7 +75,7 @@ * Macro-instructions used to manage several block sizes */ #define EXT2_MIN_BLOCK_LOG_SIZE 10 /* 1024 */ -#define EXT2_MAX_BLOCK_LOG_SIZE 13 /* 8192 */ +#define EXT2_MAX_BLOCK_LOG_SIZE 16 /* 8192 */ #define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE) #define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE) #ifdef __KERNEL__ diff -u -p -r1.18 ext2_inode_relocator.c --- src/ext2_inode_relocator.c 10 Jun 2006 07:45:55 -0000 1.18 +++ src/ext2_inode_relocator.c 10 Jun 2006 18:07:21 -0000 @@ -208,11 +208,10 @@ static int dotindblock(struct ext2_fs *f static int doinode(struct ext2_fs *fs, struct ext2_inode_relocator_state *state, ino_t ino) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; int i; - ext2_read_inode(fs, ino, inode); if (S_ISDIR(inode->i_mode)) { @@ -306,7 +309,8 @@ static void ext2_inode_relocator_copy(st int i; for (i = 0; i < state->used_entries; i++) { - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; struct ext2_inode_entry *entry; entry = &state->inode[i]; @@ -315,10 +319,10 @@ static void ext2_inode_relocator_copy(st ext2_get_inode_state(fs, entry->dest)) fprintf(stderr, "inode bitmap error\n"); - ext2_read_inode(fs, entry->ino, &inode); - ext2_write_inode(fs, entry->dest, &inode); + ext2_read_inode(fs, entry->ino, inode); + ext2_write_inode(fs, entry->dest, inode); - entry->isdir = S_ISDIR(inode.i_mode) ? 1 : 0; + entry->isdir = S_ISDIR(inode->i_mode) ? 1 : 0; } if (fs->flags & FL_SAFE) @@ -472,21 +476,22 @@ static int ext2_inode_relocator_mark(str struct ext2_inode_relocator_state *state, ino_t ino) { - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; struct ext2_inode_entry *ent; void *adv; void *rec; int i; - ext2_read_inode(fs, ino, &inode); + ext2_read_inode(fs, ino, inode); adv = state->inode + state->used_entries + 1; - rec = state->last - inode.i_links_count; + rec = state->last - inode->i_links_count; if (adv >= rec) ext2_inode_relocator_flush(fs, state); - state->last -= inode.i_links_count; + state->last -= inode->i_links_count; ent = &state->inode[state->used_entries]; ent->ino = ino; diff -u -p -r1.11 ext2_journal.c --- src/ext2_journal.c 10 Oct 2000 18:34:33 -0000 1.11 +++ src/ext2_journal.c 10 Jun 2006 18:07:21 -0000 @@ -50,7 +50,8 @@ struct ext2_journal static int create_journal_inode(struct ext2_fs *fs, struct ext2_journal *j) { - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; ino_t inodenum; if (!fs->sb.s_free_inodes_count) { @@ -60,21 +61,21 @@ static int create_journal_inode(struct e inodenum = ext2_find_free_inode(fs); - memset(&inode, 0, sizeof(inode)); - inode.i_mode = 0100400; - inode.i_size = 4 << fs->logsize; - inode.i_atime = JOURNAL_SIG0; - inode.i_ctime = JOURNAL_SIG1; - inode.i_mtime = JOURNAL_SIG2; - inode.i_dtime = JOURNAL_SIG3; - inode.i_links_count = 1; - inode.i_blocks = 8 << fs->logsize; - inode.i_block[0] = j->block[0]; - inode.i_block[1] = j->block[1]; - inode.i_block[2] = j->block[2]; - inode.i_block[3] = j->block[3]; + memset(inode, 0, fs->inode_size); + inode->i_mode = 0100400; + inode->i_size = 4 << fs->logsize; + inode->i_atime = JOURNAL_SIG0; + inode->i_ctime = JOURNAL_SIG1; + inode->i_mtime = JOURNAL_SIG2; + inode->i_dtime = JOURNAL_SIG3; + inode->i_links_count = 1; + inode->i_blocks = 8 << fs->logsize; + inode->i_block[0] = j->block[0]; + inode->i_block[1] = j->block[1]; + inode->i_block[2] = j->block[2]; + inode->i_block[3] = j->block[3]; - ext2_write_inode(fs, inodenum, &inode); + ext2_write_inode(fs, inodenum, inode); ext2_set_inode_state(fs, inodenum, 1, 1); return 1; @@ -85,13 +86,14 @@ static ino_t find_journal_inode(struct e ino_t i; for (i = 1; i < fs->sb.s_inodes_count; i++) { - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; - ext2_read_inode(fs, i, &inode); - if (inode.i_atime == JOURNAL_SIG0 && - inode.i_ctime == JOURNAL_SIG1 && - inode.i_mtime == JOURNAL_SIG2) { - if (inode.i_dtime != JOURNAL_SIG3) + ext2_read_inode(fs, i, inode); + if (inode->i_atime == JOURNAL_SIG0 && + inode->i_ctime == JOURNAL_SIG1 && + inode->i_mtime == JOURNAL_SIG2) { + if (inode->i_dtime != JOURNAL_SIG3) fprintf(stderr, "you ran e2fsck after ext2resize crashed? Hm.\n"); diff -u -p -r1.10 ext2_mkfs.c --- src/ext2_mkfs.c 4 Sep 2001 18:13:49 -0000 1.10 +++ src/ext2_mkfs.c 10 Jun 2006 18:07:21 -0000 @@ -115,9 +115,12 @@ void ext2_mkfs_write_meta(struct ext2_de blocksize = 1 << (sb->s_log_block_size + 13); - numgroups = howmany(sb->s_blocks_count - sb->s_first_data_block, sb->s_blocks_per_group); - itsize = howmany(sizeof(struct ext2_inode) * sb->s_inodes_per_group, (1024 << sb->s_log_block_size)); - gdtsize = howmany(sizeof(struct ext2_group_desc) * numgroups, (1024 << sb->s_log_block_size)); + numgroups = howmany(sb->s_blocks_count - sb->s_first_data_block, + sb->s_blocks_per_group); + itsize = howmany(sb->s_inode_size * sb->s_inodes_per_group, + (1024 << sb->s_log_block_size)); + gdtsize = howmany(sizeof(struct ext2_group_desc) * numgroups, + (1024 << sb->s_log_block_size)); bb = malloc(1024 << sb->s_log_block_size); ib = malloc(1024 << sb->s_log_block_size); @@ -199,7 +202,8 @@ int ext2_mkfs_create_lost_and_found_inod blk_t blocks[12]; __u32 data[fs->blocksize / 4]; int i; - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; for (i = 0; i < EXT2_NDIR_BLOCKS; i++) { if (!(blocks[i] = ext2_find_free_block(fs))) @@ -230,16 +234,16 @@ int ext2_mkfs_create_lost_and_found_inod ext2_brelse(bh, 1); } - memset(&inode, 0, sizeof(struct ext2_inode)); - inode.i_mode = S_IFDIR | 0755; - inode.i_size = EXT2_NDIR_BLOCKS * fs->blocksize; - inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL); - inode.i_links_count = 2; - inode.i_blocks = (EXT2_NDIR_BLOCKS * fs->blocksize) >> 9; + memset(inode, 0, fs->inode_size); + inode->i_mode = S_IFDIR | 0755; + inode->i_size = EXT2_NDIR_BLOCKS * fs->blocksize; + inode->i_atime = inode->i_ctime = inode->i_mtime = time(NULL); + inode->i_links_count = 2; + inode->i_blocks = (EXT2_NDIR_BLOCKS * fs->blocksize) >> 9; for (i = 0; i < EXT2_NDIR_BLOCKS; i++) - inode.i_block[i] = blocks[i]; + inode->i_block[i] = blocks[i]; - ext2_write_inode(fs, EXT2_GOOD_OLD_FIRST_INO, &inode); + ext2_write_inode(fs, EXT2_GOOD_OLD_FIRST_INO, inode); ext2_set_inode_state(fs, EXT2_GOOD_OLD_FIRST_INO, 1, 1); fs->gd[0].bg_used_dirs_count++; fs->metadirty |= EXT2_META_GD; @@ -252,7 +256,8 @@ int ext2_mkfs_create_root_inode(struct e struct ext2_buffer_head *bh; blk_t block; __u32 data[fs->blocksize / 4]; - struct ext2_inode inode; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; if (!(block = ext2_find_free_block(fs))) return 0; @@ -275,15 +280,15 @@ int ext2_mkfs_create_root_inode(struct e bh->dirty = 1; ext2_brelse(bh, 1); - memset(&inode, 0, sizeof(struct ext2_inode)); - inode.i_mode = S_IFDIR | 0755; - inode.i_size = fs->blocksize; - inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL); - inode.i_links_count = 3; - inode.i_blocks = fs->blocksize >> 9; - inode.i_block[0] = block; + memset(inode, 0, fs->inode_size); + inode->i_mode = S_IFDIR | 0755; + inode->i_size = fs->blocksize; + inode->i_atime = inode->i_ctime = inode->i_mtime = time(NULL); + inode->i_links_count = 3; + inode->i_blocks = fs->blocksize >> 9; + inode->i_block[0] = block; - ext2_write_inode(fs, 2, &inode); + ext2_write_inode(fs, 2, inode); fs->gd[0].bg_used_dirs_count++; fs->metadirty |= EXT2_META_GD; @@ -370,11 +375,11 @@ struct ext2_fs *ext2_mkfs(struct ext2_de sb.s_lastcheck = 0; sb.s_checkinterval = 0; sb.s_creator_os = 0; - sb.s_rev_level = 0; + sb.s_rev_level = EXT2_DYNAMIC_REV; sb.s_def_resuid = 0; sb.s_def_resgid = 0; sb.s_first_ino = 12; - sb.s_inode_size = 128; + sb.s_inode_size = EXT2_GOOD_OLD_INODE_SIZE; sb.s_block_group_nr = 0; sb.s_feature_compat = 0; sb.s_feature_incompat = 0; Index: src/ext2_resize.c =================================================================== RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_resize.c,v retrieving revision 1.19 diff -u -p -r1.19 ext2_resize.c --- src/ext2_resize.c 10 Jun 2006 06:45:22 -0000 1.19 +++ src/ext2_resize.c 10 Jun 2006 18:07:21 -0000 @@ -28,8 +28,8 @@ static const char _ext2_resize_c[] = "$I static int ext2_add_group(struct ext2_fs *fs, blk_t bpg) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; blk_t admin; int group = fs->numgroups; blk_t start; @@ -225,8 +225,8 @@ static int ext2_del_group(struct ext2_fs sizeof(struct ext2_group_desc), fs->blocksize); if (new_gdblocks != fs->gdblocks) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; blk_t start; ext2_read_inode(fs, EXT2_RESIZE_INO, inode); diff -u -p -r1.21 ext2prepare.c --- src/ext2prepare.c 10 Jun 2006 07:15:24 -0000 1.21 +++ src/ext2prepare.c 10 Jun 2006 18:07:21 -0000 @@ -129,8 +129,8 @@ static int check_inode_ind(struct ext2_f static int create_resize_inode(struct ext2_fs *fs) { - struct ext2_inode tmp; - struct ext2_inode *inode = &tmp; + char inode_buf[EXT2_MAX_BLOCK_SIZE]; + struct ext2_inode *inode = (void *)inode_buf; int diff; int i; blk_t block; @@ -143,7 +143,7 @@ static int create_resize_inode(struct ex if (fs->flags & FL_VERBOSE) printf("creating resize inode (%03d)\n", EXT2_RESIZE_INO); - memset(inode, 0, sizeof(struct ext2_inode)); + memset(inode, 0, fs->inode_size); inode->i_mode = S_IFREG | S_IRUSR | S_IWUSR; inode->i_ctime = time(NULL); inode->i_links_count = 1; Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Andreas D. <ad...@cl...> - 2006-06-10 18:28:54
|
This patch fixes handling of the EXT2_FEATURE_COMPAT_EA feature. The block referenced by i_file_acl needs to be checked for remapping during filesystem preparation/resize. Patch is proof of concept only, it has not been tested. Suggested method for testing: - create a new (small) filesystem w/o preparation - add an extended attribute on the root inode (should use first available block in first group) with setfattr and/or setfacl - run ext2prepare and/or ext2resize on this filesystem to grow it to need another group descriptor block (which should conflict with the EA block) - without patch it should get a failure because the block isn't relocated - with patch it should relocate the EA block and update the inode (use "debugfs -R 'stat <2>' {dev}" to verify before/after ============================================================================= diff -u -p -r1.34 ext2_block_relocator.c --- src/ext2_block_relocator.c 10 Jun 2006 07:45:55 -0000 1.34 +++ src/ext2_block_relocator.c 10 Jun 2006 18:07:21 -0000 @@ -261,6 +261,12 @@ static int doinode(struct ext2_fs *fs, s blk_t inodeblock; inodeoffset = ext2_get_inode_offset(fs, ino, &inodeblock); + if (inode->i_file_acl) + if (!doblock(fs, state, inode->i_file_acl, inodeblock, + inodeoffset + offsetof(struct ext2_inode, + i_file_acl, 0))) + return 0; + for (i = 0; i < EXT2_NDIR_BLOCKS; i++) if ((blk = inode->i_block[i])) if (!doblock(fs, state, blk, inodeblock, diff -u -p -r1.18 ext2_inode_relocator.c --- src/ext2_inode_relocator.c 10 Jun 2006 07:45:55 -0000 1.18 +++ src/ext2_inode_relocator.c 10 Jun 2006 18:07:21 -0000 @@ -208,6 +208,10 @@ static int dotindblock(struct ext2_fs *f if (S_ISDIR(inode->i_mode)) { blk_t blk; + if (inode->i_file_acl) + if (!doblock(fs, state, inode->i_file_acl)) + return 0; + for (i = 0; i < EXT2_NDIR_BLOCKS; i++) if ((blk = inode->i_block[i])) if (!doblock(fs, state, blk)) Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Andreas D. <ad...@cl...> - 2006-06-10 18:17:44
|
On Jun 10, 2006 09:00 +0200, Petter Reinholdtsen wrote: > I believe it is time to release a new version of ext2prepare. I've > compared CVS with the patches in the Debian package, and the only two > remaining ones is the big endian fix and the disabling of offline > resizing support in ext2online. I believe 1.1.20 should be released > when a decision regarding these two patches have been reached. Actually, there are two more changes that need including. One is to handle the blocks referenced by i_file_acl, and the second is to handle large inodes. I'll post patches separately. Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Andreas D. <ad...@cl...> - 2006-06-10 18:03:21
|
On Jun 10, 2006 08:55 +0200, Petter Reinholdtsen wrote: > I've checked all the patches in the debian package, and only two > remains now. The previous one for big endian support, and this one to > disable offline resizing fallback in ext2online. > > Should this be commited? It disable a large chunk of code. If it is > commited, it might be better to remove the unused code completely? I agree with this change, and all of the corresponding code should just be removed outright. It was useful for resizing ext2 filesystems, but that patch is dead, and if it is ever revived it can use the same ioctl mechanism as ext3 without difficulty. > #! /bin/sh /usr/share/dpatch/dpatch-run > ## 70_nofallback > ## > ## DP: Based on patch found in the suse and redhat version, where the > ## DP: ext2online fallback to offline resizing is disabled. > > --- ext2resize-1.1.19.orig/src/ext2online.c > +++ ext2resize-1.1.19/src/ext2online.c > @@ -507,7 +507,13 @@ > */ > if (ext2_ioctl(fs, EXT2_IOC_GROUP_EXTEND, &size)) > fs->flags |= FL_IOCTL; > - else if (errno != ENOTTY) > + else /* if (errno != ENOTTY) */ > + /* > + * Disable fallback to offline resizing. This change was > + * found in the Fedora/RedHat package, and was explained > + * with "resize2fs is incompatible with online resize, and > + * can result in corrupt filesystems." Use resize2fs instead. > + */ > return 0; Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Andreas D. <ad...@cl...> - 2006-06-10 17:11:48
|
On Jun 10, 2006 08:11 +0200, Petter Reinholdtsen wrote: > The change to ext2_fs.h seem to be mostly irrelevant, just document > more of the blocks content. The rest look relevant to this change. > Should I commit the changes to the ext2_super_block struct, or just > drop that part? You may as well keep this part. > +#define LINUX_S_IFMT 00170000 > +#define LINUX_S_IFLNK 00120000 > +#define LINUX_S_ISLNK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK) This should go into a header. The rest seems reasonable, though I also have no way to test it. Can you please set up cvs update email so that interested parties can see the checkins being made. Cheers, Andreas -- Andreas Dilger Principal Software Engineer Cluster File Systems, Inc. |
From: Petter R. <pe...@hu...> - 2006-06-10 14:30:44
|
[Takashi Sato] > Sure, I have checked ext2resize in CVS. > The patch to fix calculation of offsets wasn't applied. Right. I see part of it was applied. This part is commited already: diff -Nurp ext2resize-1.1.19/src/ext2_meta.c ../a/ext2resize-1.1.19/src/ext2_meta.c --- ext2resize-1.1.19/src/ext2_meta.c 2004-09-30 22:01:41.000000000 +0800 +++ ../a/ext2resize-1.1.19/src/ext2_meta.c 2006-03-24 12:05:00.000000000 +0800 @@ -109,6 +109,12 @@ int ext2_metadata_push(struct ext2_fs *f int has_sb; int diff; + has_sb = ext2_bg_has_super(fs, group); + if(!has_sb) + new_itoffset = 2; + else + new_itoffset = fs->newgdblocks +3; + diff = start + new_itoffset - fs->gd[group].bg_inode_table; old_itend =fs->gd[group].bg_inode_table +fs->inodeblocks -start ; new_itend = new_itoffset + fs->inodeblocks; @@ -116,8 +122,6 @@ int ext2_metadata_push(struct ext2_fs *f if (start + bpg > fs->sb.s_blocks_count) bpg = fs->sb.s_blocks_count - start; - has_sb = ext2_bg_has_super(fs, group); - bb = fs->gd[group].bg_block_bitmap - start; ib = fs->gd[group].bg_inode_bitmap - start; if (fs->stride) { > You can get it from following URL. > > http://marc.theaimsgroup.com/?l=linux-kernel&m=114856199101617&w=1 > > This patch is small so you can apply manually if you cannot apply > automatically by patch command. I had to, yes. :( > If you have some questions, feel free to ask me. Can you explain why the rest of the patch is needed? This is the patch updated to the current CVS version. Index: src/ext2.h =================================================================== RCS file: /cvsroot/ext2resize/ext2resize/src/ext2.h,v retrieving revision 1.28 diff -u -3 -p -u -r1.28 ext2.h --- src/ext2.h 10 Jun 2006 07:45:55 -0000 1.28 +++ src/ext2.h 10 Jun 2006 14:27:56 -0000 @@ -264,7 +264,7 @@ static __inline__ int ext2_is_data_block group = blk / fs->sb.s_blocks_per_group; blk %= fs->sb.s_blocks_per_group; - if (ext2_bg_has_super(fs, group) && blk <= fs->gdblocks) + if (ext2_bg_has_super(fs, group) && blk <= fs->gdblocks + fs->resgdblocks) return 0; if (block == fs->gd[group].bg_block_bitmap || Index: src/ext2_block_relocator.c =================================================================== RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_block_relocator.c,v retrieving revision 1.22 diff -u -3 -p -u -r1.22 ext2_block_relocator.c --- src/ext2_block_relocator.c 10 Jun 2006 07:45:55 -0000 1.22 +++ src/ext2_block_relocator.c 10 Jun 2006 14:27:56 -0000 @@ -497,6 +497,10 @@ static int ext2_block_relocator_grab_blo int raid_bb, raid_ib; int itend = state->new_alloc_offset; + if (!ext2_bg_has_super(fs, group)) + itend = fs->gd[group].bg_inode_table + +fs->inodeblocks - start; + bpg = fs->sb.s_blocks_per_group; if (start + bpg > fs->newblocks) bpg = fs->newblocks - start; Index: src/ext2_meta.c =================================================================== RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_meta.c,v retrieving revision 1.14 diff -u -3 -p -u -r1.14 ext2_meta.c --- src/ext2_meta.c 17 Feb 2006 12:04:09 -0000 1.14 +++ src/ext2_meta.c 10 Jun 2006 14:27:56 -0000 @@ -192,7 +192,8 @@ int ext2_metadata_push(struct ext2_fs *f group + 1, fs->numgroups); } - fs->itoffset = new_itoffset; + fs->itoffset = fs->newgdblocks + 3; + if (fs->flags & FL_VERBOSE) printf("\n"); Index: src/ext2_resize.c =================================================================== RCS file: /cvsroot/ext2resize/ext2resize/src/ext2_resize.c,v retrieving revision 1.19 diff -u -3 -p -u -r1.19 ext2_resize.c --- src/ext2_resize.c 10 Jun 2006 06:45:22 -0000 1.19 +++ src/ext2_resize.c 10 Jun 2006 14:27:56 -0000 @@ -157,7 +157,7 @@ static int ext2_add_group(struct ext2_fs return 1; } -static int ext2_del_group(struct ext2_fs *fs) +static int ext2_del_group(struct ext2_fs *fs, int old_gdblocks) { blk_t admin; int group = fs->numgroups - 1; @@ -170,7 +170,7 @@ static int ext2_del_group(struct ext2_fs has_sb = ext2_bg_has_super(fs, group); - admin = fs->inodeblocks + (has_sb ? fs->gdblocks + 3 : 2); + admin = fs->inodeblocks + (has_sb ? old_gdblocks + 3 : 2); bpg = fs->sb.s_blocks_count - fs->sb.s_first_data_block - group * fs->sb.s_blocks_per_group; @@ -407,6 +407,7 @@ static int ext2_grow_fs(struct ext2_fs * static int ext2_shrink_fs(struct ext2_fs *fs) { + int old_gdblocks; if (fs->flags & FL_DEBUG) printf("%s\n", __FUNCTION__); @@ -432,8 +433,7 @@ static int ext2_shrink_fs(struct ext2_fs if (!ext2_inode_relocate(fs)) return 0; - if (!ext2_block_relocate(fs)) - return 0; + old_gdblocks = fs->gdblocks; while (fs->sb.s_blocks_count > fs->newblocks) { blk_t sizelast = (fs->sb.s_blocks_count - @@ -445,7 +445,7 @@ static int ext2_shrink_fs(struct ext2_fs fs->sb.s_blocks_count)) return 0; } else { - if (!ext2_del_group(fs)) + if (!ext2_del_group(fs, old_gdblocks)) return 0; } } |