[Ocfs2-tools-devel] [PATCH 02/12] libocfs2: Pass the dinode to ocfs2_read/write_dir_block().
Joel Becker
joel.becker at oracle.com
Mon Dec 29 19:23:38 PST 2008
Future code will need to look at the dinode when reading and writing
dirblocks, so let's pass it in.
Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
fsck.ocfs2/pass2.c | 4 ++--
include/ocfs2/ocfs2.h | 8 ++++----
libocfs2/dir_iterate.c | 16 ++++++++++++++--
libocfs2/dir_iterate.h | 1 +
libocfs2/dir_scan.c | 3 ++-
libocfs2/dirblock.c | 8 ++++----
libocfs2/expanddir.c | 4 ++--
libocfs2/fileio.c | 3 ++-
8 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/fsck.ocfs2/pass2.c b/fsck.ocfs2/pass2.c
index c53c264..8239c10 100644
--- a/fsck.ocfs2/pass2.c
+++ b/fsck.ocfs2/pass2.c
@@ -656,7 +656,7 @@ static unsigned pass2_dir_block_iterate(o2fsck_dirblock_entry *dbe,
di->i_size))
goto out;
- ret = ocfs2_read_dir_block(dd->fs, dbe->e_blkno,
+ ret = ocfs2_read_dir_block(dd->fs, di, dbe->e_blkno,
dd->dirblock_buf);
if (ret && ret != OCFS2_ET_DIR_CORRUPTED) {
com_err(whoami, ret, "while reading dir block %"PRIu64,
@@ -759,7 +759,7 @@ next:
ret = ocfs2_write_inode(dd->fs, dbe->e_ino,
dd->dirblock_buf);
} else
- ret = ocfs2_write_dir_block(dd->fs, dbe->e_blkno,
+ ret = ocfs2_write_dir_block(dd->fs, di, dbe->e_blkno,
dd->dirblock_buf);
if (ret) {
com_err(whoami, ret, "while writing dir block %"PRIu64,
diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
index 030bc18..32c4c2a 100644
--- a/include/ocfs2/ocfs2.h
+++ b/include/ocfs2/ocfs2.h
@@ -305,10 +305,10 @@ errcode_t ocfs2_write_extent_block(ocfs2_filesys *fs, uint64_t blkno,
char *eb_buf);
errcode_t ocfs2_swap_dir_entries_from_cpu(void *buf, uint64_t bytes);
errcode_t ocfs2_swap_dir_entries_to_cpu(void *buf, uint64_t bytes);
-errcode_t ocfs2_read_dir_block(ocfs2_filesys *fs, uint64_t block,
- void *buf);
-errcode_t ocfs2_write_dir_block(ocfs2_filesys *fs, uint64_t block,
- void *buf);
+errcode_t ocfs2_read_dir_block(ocfs2_filesys *fs, struct ocfs2_dinode *di,
+ uint64_t block, void *buf);
+errcode_t ocfs2_write_dir_block(ocfs2_filesys *fs, struct ocfs2_dinode *di,
+ uint64_t block, void *buf);
errcode_t ocfs2_dir_iterate2(ocfs2_filesys *fs,
uint64_t dir,
diff --git a/libocfs2/dir_iterate.c b/libocfs2/dir_iterate.c
index 31ed6e2..83b0b08 100644
--- a/libocfs2/dir_iterate.c
+++ b/libocfs2/dir_iterate.c
@@ -95,10 +95,20 @@ errcode_t ocfs2_dir_iterate2(ocfs2_filesys *fs,
ctx.priv_data = priv_data;
ctx.errcode = 0;
+ retval = ocfs2_malloc_block(fs->fs_io, &ctx.di);
+ if (retval)
+ goto out;
+
retval = ocfs2_read_inode(fs, dir, ctx.buf);
if (retval)
goto out;
+ /*
+ * Save off the inode - some paths use the buffer for dirent
+ * data.
+ */
+ memcpy(ctx.di, ctx.buf, fs->fs_blocksize);
+
di = (struct ocfs2_dinode *)ctx.buf;
if (ocfs2_support_inline_data(OCFS2_RAW_SB(fs->fs_super)) &&
@@ -112,6 +122,8 @@ errcode_t ocfs2_dir_iterate2(ocfs2_filesys *fs,
out:
if (!block_buf)
ocfs2_free(&ctx.buf);
+ if (ctx.di)
+ ocfs2_free(&ctx.di);
if (retval)
return retval;
return ctx.errcode;
@@ -271,7 +283,7 @@ int ocfs2_process_dir_block(ocfs2_filesys *fs,
entry = blockcnt ? OCFS2_DIRENT_OTHER_FILE :
OCFS2_DIRENT_DOT_FILE;
- ctx->errcode = ocfs2_read_dir_block(fs, blocknr, ctx->buf);
+ ctx->errcode = ocfs2_read_dir_block(fs, ctx->di, blocknr, ctx->buf);
if (ctx->errcode)
return OCFS2_BLOCK_ABORT;
@@ -281,7 +293,7 @@ int ocfs2_process_dir_block(ocfs2_filesys *fs,
return ret;
if (changed) {
- ctx->errcode = ocfs2_write_dir_block(fs, blocknr,
+ ctx->errcode = ocfs2_write_dir_block(fs, ctx->di, blocknr,
ctx->buf);
if (ctx->errcode)
return OCFS2_BLOCK_ABORT;
diff --git a/libocfs2/dir_iterate.h b/libocfs2/dir_iterate.h
index 9ec11a3..f281af2 100644
--- a/libocfs2/dir_iterate.h
+++ b/libocfs2/dir_iterate.h
@@ -30,6 +30,7 @@
struct dir_context {
uint64_t dir;
int flags;
+ struct ocfs2_dinode *di;
char *buf;
int (*func)(uint64_t dir,
int entry,
diff --git a/libocfs2/dir_scan.c b/libocfs2/dir_scan.c
index ea70671..ad14120 100644
--- a/libocfs2/dir_scan.c
+++ b/libocfs2/dir_scan.c
@@ -61,7 +61,8 @@ static errcode_t get_more_dir_blocks(ocfs2_dir_scan *scan)
if (ret)
return ret;
- ret = ocfs2_read_dir_block(scan->fs, blkno, scan->buf);
+ ret = ocfs2_read_dir_block(scan->fs, scan->inode->ci_inode, blkno,
+ scan->buf);
if (ret)
return ret;
diff --git a/libocfs2/dirblock.c b/libocfs2/dirblock.c
index 4684406..f116fb2 100644
--- a/libocfs2/dirblock.c
+++ b/libocfs2/dirblock.c
@@ -84,8 +84,8 @@ errcode_t ocfs2_swap_dir_entries_to_cpu(void *buf, uint64_t bytes)
return ocfs2_swap_dir_entries_direction(buf, bytes, 1);
}
-errcode_t ocfs2_read_dir_block(ocfs2_filesys *fs, uint64_t block,
- void *buf)
+errcode_t ocfs2_read_dir_block(ocfs2_filesys *fs, struct ocfs2_dinode *di,
+ uint64_t block, void *buf)
{
errcode_t retval;
@@ -96,8 +96,8 @@ errcode_t ocfs2_read_dir_block(ocfs2_filesys *fs, uint64_t block,
return ocfs2_swap_dir_entries_to_cpu(buf, fs->fs_blocksize);
}
-errcode_t ocfs2_write_dir_block(ocfs2_filesys *fs, uint64_t block,
- void *inbuf)
+errcode_t ocfs2_write_dir_block(ocfs2_filesys *fs, struct ocfs2_dinode *di,
+ uint64_t block, void *inbuf)
{
errcode_t retval;
char *buf = NULL;
diff --git a/libocfs2/expanddir.c b/libocfs2/expanddir.c
index d886881..fc7e055 100644
--- a/libocfs2/expanddir.c
+++ b/libocfs2/expanddir.c
@@ -107,7 +107,7 @@ errcode_t ocfs2_expand_dir(ocfs2_filesys *fs,
de->rec_len = fs->fs_blocksize;
/* write new dir block */
- ret = ocfs2_write_dir_block(fs, new_blk, buf);
+ ret = ocfs2_write_dir_block(fs, cinode->ci_inode, new_blk, buf);
if (ret)
goto bail;
@@ -212,7 +212,7 @@ errcode_t ocfs2_init_dir(ocfs2_filesys *fs,
ocfs2_fill_initial_dirents(dir, parent_dir, data, size);
if (!(cinode->ci_inode->i_dyn_features & OCFS2_INLINE_DATA_FL)) {
- ret = ocfs2_write_dir_block(fs, blkno, buf);
+ ret = ocfs2_write_dir_block(fs, cinode->ci_inode, blkno, buf);
if (ret)
goto bail;
}
diff --git a/libocfs2/fileio.c b/libocfs2/fileio.c
index cc554f8..276a568 100644
--- a/libocfs2/fileio.c
+++ b/libocfs2/fileio.c
@@ -526,7 +526,8 @@ errcode_t ocfs2_convert_inline_data_to_extents(ocfs2_cached_inode *ci)
fs->fs_blocksize);
di->i_size = fs->fs_blocksize;
- ret = ocfs2_write_dir_block(fs, p_start, inline_data);
+ ret = ocfs2_write_dir_block(fs, di, p_start,
+ inline_data);
} else
ret = io_write_block(fs->fs_io, p_start,
1, inline_data);
--
1.5.6.5
More information about the Ocfs2-tools-devel
mailing list