[Ocfs2-tools-devel] [PATCH] Fix directory entry handling in big endian archs

Goldwyn Rodrigues rgoldwyn at gmail.com
Thu Dec 8 17:40:05 PST 2011


dir_trailer_func() and ocfs2_dx_dir_search() reads the dir blocks directly
instead of using ocfs2_read_dir_block(). It does not swap the directory
entries before using. Fix.

Also, use the correct function for swapping some of directory structure
variables.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>
Signed-off-by: Mark Fasheh <mfasheh at suse.com>
---
diff --git a/libocfs2/dir_indexed.c b/libocfs2/dir_indexed.c
index 12a5620..cdea72d 100644
--- a/libocfs2/dir_indexed.c
+++ b/libocfs2/dir_indexed.c
@@ -186,6 +186,7 @@ static int dir_trailer_func(ocfs2_filesys *fs,
 		ret = OCFS2_EXTENT_ERROR;
 		goto out;
 	}
+	ocfs2_swap_dir_entries_to_cpu(blk, fs->fs_blocksize);

 	err = ocfs2_check_dir_trailer_space(fs, di, blkno, blk);
 	if (err) {
@@ -1454,6 +1455,7 @@ errcode_t ocfs2_dx_dir_search(ocfs2_filesys *fs,
 		ret = ocfs2_read_blocks(fs, dx_entry->dx_dirent_blk, 1, dir_buf);
 		if (ret)
 			goto out;
+		ocfs2_swap_dir_entries_to_cpu(dir_buf, fs->fs_blocksize);

 		found = ocfs2_search_dirblock(fs, dir_buf, name, namelen,
 						fs->fs_blocksize, &dir_ent);
diff --git a/libocfs2/dirblock.c b/libocfs2/dirblock.c
index bc60a26..52ac78f 100644
--- a/libocfs2/dirblock.c
+++ b/libocfs2/dirblock.c
@@ -137,7 +137,6 @@ static errcode_t
ocfs2_swap_dir_entries_direction(void *buf, uint64_t bytes,

 		if (((name_len & 0xFF) + 12) > rec_len)
 			retval = OCFS2_ET_DIR_CORRUPTED;
-
 		p += rec_len;
 	}
 	return retval;
@@ -158,7 +157,7 @@ void ocfs2_swap_dir_trailer(struct
ocfs2_dir_block_trailer *trailer)
 		return;

 	trailer->db_compat_inode = bswap_64(trailer->db_compat_inode);
-	trailer->db_compat_rec_len = bswap_64(trailer->db_compat_rec_len);
+	trailer->db_compat_rec_len = bswap_16(trailer->db_compat_rec_len);
 	trailer->db_blkno = bswap_64(trailer->db_blkno);
 	trailer->db_parent_dinode = bswap_64(trailer->db_parent_dinode);
 	trailer->db_free_rec_len = bswap_16(trailer->db_free_rec_len);
@@ -192,7 +191,7 @@ errcode_t ocfs2_read_dir_block(ocfs2_filesys *fs,
struct ocfs2_dinode *di,
 	}

 	retval = ocfs2_swap_dir_entries_to_cpu(buf, end);
-	if (!retval)
+	if (retval)
 		goto out;

 	if (trailer)
@@ -392,7 +391,7 @@ void ocfs2_swap_dx_leaf_to_cpu(struct
ocfs2_dx_leaf *dx_leaf)
 	if (cpu_is_little_endian)
 		return;
 	dx_leaf->dl_blkno = bswap_64(dx_leaf->dl_blkno);
-	dx_leaf->dl_fs_generation = bswap_64(dx_leaf->dl_fs_generation);
+	dx_leaf->dl_fs_generation = bswap_32(dx_leaf->dl_fs_generation);
 	ocfs2_swap_dx_entry_list_to_cpu(&dx_leaf->dl_list);
 }

@@ -401,7 +400,7 @@ void ocfs2_swap_dx_leaf_from_cpu(struct
ocfs2_dx_leaf *dx_leaf)
 	if (cpu_is_little_endian)
 		return;
 	dx_leaf->dl_blkno = bswap_64(dx_leaf->dl_blkno);
-	dx_leaf->dl_fs_generation = bswap_64(dx_leaf->dl_fs_generation);
+	dx_leaf->dl_fs_generation = bswap_32(dx_leaf->dl_fs_generation);
 	ocfs2_swap_dx_entry_list_from_cpu(&dx_leaf->dl_list);
 }



More information about the Ocfs2-tools-devel mailing list