[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