2009-05-19 20:34:11

by Nic Case

[permalink] [raw]
Subject: [PATCH] e2fsprogs: add ext2fs_extent_open2


The patch below adds a function, ext2fs_extent_open2(), that behaves as ext2fs_extent_open(), but will use the user-supplied inode structure when opening an extent instead of reading the inode from disk. It also changes several of the calls to extent_open() to use this enhancement.
---

diff --git a/e2fsprogs-1.41.5-orig/e2fsck/pass1.c b/e2fsprogs-1.41.5/e2fsck/pass1.c
index 3b05cf2..2968a3e 100644
--- a/e2fsprogs-1.41.5-orig/e2fsck/pass1.c
+++ b/e2fsprogs-1.41.5/e2fsck/pass1.c
@@ -180,7 +180,7 @@ int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino,
if (inode->i_flags & EXT4_EXTENTS_FL) {
if (inode->i_size > fs->blocksize)
return 0;
- if (ext2fs_extent_open(fs, ino, &handle))
+ if (ext2fs_extent_open2(fs, ino, inode, &handle))
return 0;
i = 0;
if (ext2fs_extent_get_info(handle, &info) ||
@@ -1769,7 +1769,7 @@ static void check_blocks_extents(e2fsck_t ctx, struct problem_context *pctx,
ext2_ino_t ino = pctx->ino;
errcode_t retval;

- pctx->errcode = ext2fs_extent_open(fs, ino, &ehandle);
+ pctx->errcode = ext2fs_extent_open2(fs, ino, inode, &ehandle);
if (pctx->errcode &&
fix_problem(ctx, PR_1_READ_EXTENT, pctx)) {
e2fsck_clear_inode(ctx, ino, inode, 0, "check_blocks_extents");
diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/block.c b/e2fsprogs-1.41.5/lib/ext2fs/block.c
index 6ac9379..de5342d 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/block.c
+++ b/e2fsprogs-1.41.5/lib/ext2fs/block.c
@@ -367,7 +367,7 @@ errcode_t ext2fs_block_iterate2(ext2_filsys fs,
int uninit;
unsigned int j;

- ctx.errcode = ext2fs_extent_open(fs, ino, &handle);
+ ctx.errcode = ext2fs_extent_open2(fs, ino, &inode, &handle);
if (ctx.errcode)
goto abort_exit;

diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/bmap.c b/e2fsprogs-1.41.5/lib/ext2fs/bmap.c
index 4edf425..2a86439 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/bmap.c
+++ b/e2fsprogs-1.41.5/lib/ext2fs/bmap.c
@@ -160,7 +160,7 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
struct ext2fs_extent extent;
unsigned int offset;

- retval = ext2fs_extent_open(fs, ino, &handle);
+ retval = ext2fs_extent_open2(fs, ino, inode, &handle);
if (retval)
goto done;
if (bmap_flags & BMAP_SET) {
diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/ext2fs.h b/e2fsprogs-1.41.5/lib/ext2fs/ext2fs.h
index d5026bc..08bfa03 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/ext2fs.h
+++ b/e2fsprogs-1.41.5/lib/ext2fs/ext2fs.h
@@ -839,6 +839,9 @@ extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
ext2_extent_handle_t *handle);
+extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
+ struct ext2_inode *inode,
+ ext2_extent_handle_t *ret_handle);
extern void ext2fs_extent_free(ext2_extent_handle_t handle);
extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
int flags, struct ext2fs_extent *extent);
diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/extent.c b/e2fsprogs-1.41.5/lib/ext2fs/extent.c
index 143929e..37cd932 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/extent.c
+++ b/e2fsprogs-1.41.5/lib/ext2fs/extent.c
@@ -180,32 +180,44 @@ extern void ext2fs_extent_free(ext2_extent_handle_t handle)
extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
ext2_extent_handle_t *ret_handle)
{
+ return ext2fs_extent_open2(fs, ino, NULL, ret_handle);
+}
+
+extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
+ struct ext2_inode *inode,
+ ext2_extent_handle_t *ret_handle)
+{
struct ext2_extent_handle *handle;
errcode_t retval;
- int isize = EXT2_INODE_SIZE(fs->super);
int i;
struct ext3_extent_header *eh;

EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);

- if ((ino == 0) || (ino > fs->super->s_inodes_count))
- return EXT2_ET_BAD_INODE_NUM;
+ if (!inode)
+ if ((ino == 0) || (ino > fs->super->s_inodes_count))
+ return EXT2_ET_BAD_INODE_NUM;

retval = ext2fs_get_mem(sizeof(struct ext2_extent_handle), &handle);
if (retval)
return retval;
memset(handle, 0, sizeof(struct ext2_extent_handle));

- retval = ext2fs_get_mem(isize, &handle->inode);
+ retval = ext2fs_get_mem(sizeof(struct ext2_inode), &handle->inode);
if (retval)
goto errout;

handle->ino = ino;
handle->fs = fs;

- retval = ext2fs_read_inode_full(fs, ino, handle->inode, isize);
- if (retval)
- goto errout;
+ if (inode) {
+ memcpy(handle->inode, inode, sizeof(struct ext2_inode));
+ }
+ else {
+ retval = ext2fs_read_inode(fs, ino, handle->inode);
+ if (retval)
+ goto errout;
+ }

eh = (struct ext3_extent_header *) &handle->inode->i_block[0];








2009-05-20 01:57:21

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] e2fsprogs: add ext2fs_extent_open2

On Tue, May 19, 2009 at 01:34:12PM -0700, number9652 wrote:
>
> The patch below adds a function, ext2fs_extent_open2(), that behaves
> as ext2fs_extent_open(), but will use the user-supplied inode
> structure when opening an extent instead of reading the inode from
> disk. It also changes several of the calls to extent_open() to use
> this enhancement.

Thanks, this patch looks good. Can I get a "Signed-off-by:" from you?

See the SUBMITTING-PATCHES file in the top-level document for the
legal significance of what it means; and yes, I'd prefer if you could
give me your real name in the Signed-off-by. (I also find it much
more personal to use people's name rather than cold pseudonyms like
"number9652". :-)

Many thanks,

- Ted

2009-05-20 20:45:32

by Nic Case

[permalink] [raw]
Subject: Re: [PATCH] e2fsprogs: add ext2fs_extent_open2


--- On Tue, 5/19/09, Theodore Tso wrote:
> Thanks, this patch looks good. Can I get a
> "Signed-off-by:" from you?

I felt like I was forgetting something, just couldn't figure out what. I included a copy of the patch to make sure it is clear.

Signed-off-by: Nic Case <[email protected]>
---

diff --git a/e2fsprogs-1.41.5-orig/e2fsck/pass1.c b/e2fsprogs-1.41.5/e2fsck/pass1.c
index 3b05cf2..2968a3e 100644
--- a/e2fsprogs-1.41.5-orig/e2fsck/pass1.c
+++ b/e2fsprogs-1.41.5/e2fsck/pass1.c
@@ -180,7 +180,7 @@ int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino,
if (inode->i_flags & EXT4_EXTENTS_FL) {
if (inode->i_size > fs->blocksize)
return 0;
- if (ext2fs_extent_open(fs, ino, &handle))
+ if (ext2fs_extent_open2(fs, ino, inode, &handle))
return 0;
i = 0;
if (ext2fs_extent_get_info(handle, &info) ||
@@ -1769,7 +1769,7 @@ static void check_blocks_extents(e2fsck_t ctx, struct problem_context *pctx,
ext2_ino_t ino = pctx->ino;
errcode_t retval;

- pctx->errcode = ext2fs_extent_open(fs, ino, &ehandle);
+ pctx->errcode = ext2fs_extent_open2(fs, ino, inode, &ehandle);
if (pctx->errcode &&
fix_problem(ctx, PR_1_READ_EXTENT, pctx)) {
e2fsck_clear_inode(ctx, ino, inode, 0, "check_blocks_extents");
diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/block.c b/e2fsprogs-1.41.5/lib/ext2fs/block.c
index 6ac9379..de5342d 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/block.c
+++ b/e2fsprogs-1.41.5/lib/ext2fs/block.c
@@ -367,7 +367,7 @@ errcode_t ext2fs_block_iterate2(ext2_filsys fs,
int uninit;
unsigned int j;

- ctx.errcode = ext2fs_extent_open(fs, ino, &handle);
+ ctx.errcode = ext2fs_extent_open2(fs, ino, &inode, &handle);
if (ctx.errcode)
goto abort_exit;

diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/bmap.c b/e2fsprogs-1.41.5/lib/ext2fs/bmap.c
index 4edf425..2a86439 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/bmap.c
+++ b/e2fsprogs-1.41.5/lib/ext2fs/bmap.c
@@ -160,7 +160,7 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
struct ext2fs_extent extent;
unsigned int offset;

- retval = ext2fs_extent_open(fs, ino, &handle);
+ retval = ext2fs_extent_open2(fs, ino, inode, &handle);
if (retval)
goto done;
if (bmap_flags & BMAP_SET) {
diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/ext2fs.h b/e2fsprogs-1.41.5/lib/ext2fs/ext2fs.h
index d5026bc..08bfa03 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/ext2fs.h
+++ b/e2fsprogs-1.41.5/lib/ext2fs/ext2fs.h
@@ -839,6 +839,9 @@ extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
ext2_extent_handle_t *handle);
+extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
+ struct ext2_inode *inode,
+ ext2_extent_handle_t *ret_handle);
extern void ext2fs_extent_free(ext2_extent_handle_t handle);
extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
int flags, struct ext2fs_extent *extent);
diff --git a/e2fsprogs-1.41.5-orig/lib/ext2fs/extent.c b/e2fsprogs-1.41.5/lib/ext2fs/extent.c
index 143929e..37cd932 100644
--- a/e2fsprogs-1.41.5-orig/lib/ext2fs/extent.c
+++ b/e2fsprogs-1.41.5/lib/ext2fs/extent.c
@@ -180,32 +180,44 @@ extern void ext2fs_extent_free(ext2_extent_handle_t handle)
extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
ext2_extent_handle_t *ret_handle)
{
+ return ext2fs_extent_open2(fs, ino, NULL, ret_handle);
+}
+
+extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
+ struct ext2_inode *inode,
+ ext2_extent_handle_t *ret_handle)
+{
struct ext2_extent_handle *handle;
errcode_t retval;
- int isize = EXT2_INODE_SIZE(fs->super);
int i;
struct ext3_extent_header *eh;

EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);

- if ((ino == 0) || (ino > fs->super->s_inodes_count))
- return EXT2_ET_BAD_INODE_NUM;
+ if (!inode)
+ if ((ino == 0) || (ino > fs->super->s_inodes_count))
+ return EXT2_ET_BAD_INODE_NUM;

retval = ext2fs_get_mem(sizeof(struct ext2_extent_handle), &handle);
if (retval)
return retval;
memset(handle, 0, sizeof(struct ext2_extent_handle));

- retval = ext2fs_get_mem(isize, &handle->inode);
+ retval = ext2fs_get_mem(sizeof(struct ext2_inode), &handle->inode);
if (retval)
goto errout;

handle->ino = ino;
handle->fs = fs;

- retval = ext2fs_read_inode_full(fs, ino, handle->inode, isize);
- if (retval)
- goto errout;
+ if (inode) {
+ memcpy(handle->inode, inode, sizeof(struct ext2_inode));
+ }
+ else {
+ retval = ext2fs_read_inode(fs, ino, handle->inode);
+ if (retval)
+ goto errout;
+ }

eh = (struct ext3_extent_header *) &handle->inode->i_block[0];






2009-05-28 14:39:42

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] e2fsprogs: add ext2fs_extent_open2

On Wed, May 20, 2009 at 01:45:33PM -0700, number9652 wrote:
>
> --- On Tue, 5/19/09, Theodore Tso wrote:
> > Thanks, this patch looks good. Can I get a
> > "Signed-off-by:" from you?
>
> I felt like I was forgetting something, just couldn't figure out what. I included a copy of the patch to make sure it is clear.
>
> Signed-off-by: Nic Case <[email protected]>

Thanks, applied.

BTW, I did some quick tests, and the optimization makes a small (but
measurable) difference for both the total time elapsed and userspace
CPU times.

- Ted