[Ocfs2-tools-devel] [PATCH 06/20] libocfs2: Change swap_group_desc to read/write discontig groups.

Tao Ma tao.ma at oracle.com
Mon May 17 01:46:53 PDT 2010


In read/write discontig groups, we will use
offsetof(struct ocfs2_group_desc, bg_bitmap) + gd->bg_size ==
          offsetof(struct ocfs2_group_desc, bg_list)
to check whether the group is discontiguous or not.
And what' more, we change ocfs2_swap_group_desc to 2 separate
functions *_from_cpu and *_to_cpu since we now have to swap
the extent list if needed.

Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 debugfs.ocfs2/dump.c  |    3 ++-
 include/ocfs2/ocfs2.h |    5 ++++-
 libocfs2/chain.c      |   33 +++++++++++++++++++++++++++------
 mkfs.ocfs2/mkfs.c     |   24 +++++++++++++++++++++---
 4 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/debugfs.ocfs2/dump.c b/debugfs.ocfs2/dump.c
index 6ad202c..6539ec5 100644
--- a/debugfs.ocfs2/dump.c
+++ b/debugfs.ocfs2/dump.c
@@ -860,7 +860,8 @@ void dump_jbd_metadata (FILE *out, enum dump_block_type type, char *buf,
 		break;
 	case DUMP_BLOCK_GROUP_DESCRIPTOR:
 		fprintf(out, "Group\n");
-		ocfs2_swap_group_desc((struct ocfs2_group_desc *)buf);
+		ocfs2_swap_group_desc_to_cpu(gbls.fs,
+				      (struct ocfs2_group_desc *)buf);
 		dump_group_descriptor (out, (struct ocfs2_group_desc *)buf, 0);
 		fprintf (out, "\n");
 		break;
diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
index 3d6bc76..fc09703 100644
--- a/include/ocfs2/ocfs2.h
+++ b/include/ocfs2/ocfs2.h
@@ -614,7 +614,10 @@ errcode_t ocfs2_check_heartbeats(struct list_head *dev_list, int ignore_local);
 errcode_t ocfs2_get_ocfs1_label(char *device, uint8_t *label, uint16_t label_len,
 				uint8_t *uuid, uint16_t uuid_len);
 
-void ocfs2_swap_group_desc(struct ocfs2_group_desc *gd);
+void ocfs2_swap_group_desc_from_cpu(ocfs2_filesys *fs,
+				    struct ocfs2_group_desc *gd);
+void ocfs2_swap_group_desc_to_cpu(ocfs2_filesys *fs,
+				  struct ocfs2_group_desc *gd);
 errcode_t ocfs2_read_group_desc(ocfs2_filesys *fs, uint64_t blkno,
 				char *gd_buf);
 
diff --git a/libocfs2/chain.c b/libocfs2/chain.c
index e9d3873..fa9c16d 100644
--- a/libocfs2/chain.c
+++ b/libocfs2/chain.c
@@ -31,11 +31,8 @@
 
 #include "ocfs2/byteorder.h"
 
-void ocfs2_swap_group_desc(struct ocfs2_group_desc *gd)
+static void ocfs2_swap_group_desc_header(struct ocfs2_group_desc *gd)
 {
-	if (cpu_is_little_endian)
-		return;
-
 	gd->bg_size = bswap_16(gd->bg_size);
 	gd->bg_bits = bswap_16(gd->bg_bits);
 	gd->bg_free_bits_count = bswap_16(gd->bg_free_bits_count);
@@ -46,6 +43,30 @@ void ocfs2_swap_group_desc(struct ocfs2_group_desc *gd)
 	gd->bg_blkno = bswap_64(gd->bg_blkno);
 }
 
+void ocfs2_swap_group_desc_from_cpu(ocfs2_filesys *fs,
+				    struct ocfs2_group_desc *gd)
+{
+	if (cpu_is_little_endian)
+		return;
+
+	if (ocfs2_gd_is_discontig(gd))
+		ocfs2_swap_extent_list_from_cpu(fs, gd, &gd->bg_list);
+
+	ocfs2_swap_group_desc_header(gd);
+}
+
+void ocfs2_swap_group_desc_to_cpu(ocfs2_filesys *fs,
+				  struct ocfs2_group_desc *gd)
+{
+	if (cpu_is_little_endian)
+		return;
+
+	ocfs2_swap_group_desc_header(gd);
+
+	if (ocfs2_gd_is_discontig(gd))
+		ocfs2_swap_extent_list_to_cpu(fs, gd, &gd->bg_list);
+}
+
 errcode_t ocfs2_read_group_desc(ocfs2_filesys *fs, uint64_t blkno,
 				char *gd_buf)
 {
@@ -79,7 +100,7 @@ errcode_t ocfs2_read_group_desc(ocfs2_filesys *fs, uint64_t blkno,
 	memcpy(gd_buf, blk, fs->fs_blocksize);
 
 	gd = (struct ocfs2_group_desc *)gd_buf;
-	ocfs2_swap_group_desc(gd);
+	ocfs2_swap_group_desc_to_cpu(fs, gd);
 
 	ret = 0;
 out:
@@ -109,7 +130,7 @@ errcode_t ocfs2_write_group_desc(ocfs2_filesys *fs, uint64_t blkno,
 	memcpy(blk, gd_buf, fs->fs_blocksize);
 
 	gd = (struct ocfs2_group_desc *)blk;
-	ocfs2_swap_group_desc(gd);
+	ocfs2_swap_group_desc_from_cpu(fs, gd);
 
 	ocfs2_compute_meta_ecc(fs, blk, &gd->bg_check);
 	ret = io_write_block(fs->fs_io, blkno, 1, blk);
diff --git a/mkfs.ocfs2/mkfs.c b/mkfs.ocfs2/mkfs.c
index 4cf75f3..3922638 100644
--- a/mkfs.ocfs2/mkfs.c
+++ b/mkfs.ocfs2/mkfs.c
@@ -2193,6 +2193,24 @@ static void mkfs_swap_inode_from_cpu(State *s, struct ocfs2_dinode *di)
 	ocfs2_swap_inode_from_cpu(&fake_fs, di);
 }
 
+static void mkfs_swap_group_desc_from_cpu(State *s, struct ocfs2_group_desc *gd)
+{
+	ocfs2_filesys fake_fs;
+	char super_buf[OCFS2_MAX_BLOCKSIZE];
+
+	fill_fake_fs(s, &fake_fs, super_buf);
+	ocfs2_swap_group_desc_from_cpu(&fake_fs, gd);
+}
+
+static void mkfs_swap_group_desc_to_cpu(State *s, struct ocfs2_group_desc *gd)
+{
+	ocfs2_filesys fake_fs;
+	char super_buf[OCFS2_MAX_BLOCKSIZE];
+
+	fill_fake_fs(s, &fake_fs, super_buf);
+	ocfs2_swap_group_desc_to_cpu(&fake_fs, gd);
+}
+
 static void
 format_superblock(State *s, SystemFileDiskRecord *rec,
 		  SystemFileDiskRecord *root_rec, SystemFileDiskRecord *sys_rec)
@@ -2497,7 +2515,7 @@ write_bitmap_data(State *s, AllocBitmap *bitmap)
 		gd->bg_parent_dinode = parent_blkno;
 		memcpy(buf, gd, s->blocksize);
 		gd_buf = (struct ocfs2_group_desc *)buf;
-		ocfs2_swap_group_desc(gd_buf);
+		mkfs_swap_group_desc_from_cpu(s, gd_buf);
 		mkfs_compute_meta_ecc(s, buf, &gd_buf->bg_check);
 		do_pwrite(s, buf, s->cluster_size,
 			  gd->bg_blkno << s->blocksize_bits);
@@ -2509,10 +2527,10 @@ static void
 write_group_data(State *s, AllocGroup *group)
 {
 	uint64_t blkno = group->gd->bg_blkno;
-	ocfs2_swap_group_desc(group->gd);
+	mkfs_swap_group_desc_from_cpu(s, group->gd);
 	mkfs_compute_meta_ecc(s, group->gd, &group->gd->bg_check);
 	do_pwrite(s, group->gd, s->blocksize, blkno << s->blocksize_bits);
-	ocfs2_swap_group_desc(group->gd);
+	mkfs_swap_group_desc_to_cpu(s, group->gd);
 }
 
 static void mkfs_swap_dir(State *s, DirData *dir,
-- 
1.5.5




More information about the Ocfs2-tools-devel mailing list