[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