Commit 850d2d91 authored by Andrew Price's avatar Andrew Price Committed by Bob Peterson

gfs2: Add a crc field to resource group headers

Add the rg_crc field to store a crc32 of the gfs2_rgrp structure. This
allows us to check resource group headers' integrity and removes the
requirement to check them against the rindex entries in fsck. If this
field is found to be zero, it should be ignored (or updated with an
accurate value).
Signed-off-by: default avatarAndrew Price <anprice@redhat.com>
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
parent 166725d9
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "log.h" #include "log.h"
#include "inode.h" #include "inode.h"
#include "trace_gfs2.h" #include "trace_gfs2.h"
#include "dir.h"
#define BFITNOENT ((u32)~0) #define BFITNOENT ((u32)~0)
#define NO_BLOCK ((u64)~0) #define NO_BLOCK ((u64)~0)
...@@ -1047,6 +1048,7 @@ static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf) ...@@ -1047,6 +1048,7 @@ static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf)
{ {
struct gfs2_rgrpd *next = gfs2_rgrpd_get_next(rgd); struct gfs2_rgrpd *next = gfs2_rgrpd_get_next(rgd);
struct gfs2_rgrp *str = buf; struct gfs2_rgrp *str = buf;
u32 crc;
str->rg_flags = cpu_to_be32(rgd->rd_flags & ~GFS2_RDF_MASK); str->rg_flags = cpu_to_be32(rgd->rd_flags & ~GFS2_RDF_MASK);
str->rg_free = cpu_to_be32(rgd->rd_free); str->rg_free = cpu_to_be32(rgd->rd_free);
...@@ -1059,6 +1061,9 @@ static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf) ...@@ -1059,6 +1061,9 @@ static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf)
str->rg_data0 = cpu_to_be64(rgd->rd_data0); str->rg_data0 = cpu_to_be64(rgd->rd_data0);
str->rg_data = cpu_to_be32(rgd->rd_data); str->rg_data = cpu_to_be32(rgd->rd_data);
str->rg_bitbytes = cpu_to_be32(rgd->rd_bitbytes); str->rg_bitbytes = cpu_to_be32(rgd->rd_bitbytes);
str->rg_crc = 0;
crc = gfs2_disk_hash(buf, sizeof(struct gfs2_rgrp));
str->rg_crc = cpu_to_be32(crc);
memset(&str->rg_reserved, 0, sizeof(str->rg_reserved)); memset(&str->rg_reserved, 0, sizeof(str->rg_reserved));
} }
......
...@@ -197,8 +197,9 @@ struct gfs2_rgrp { ...@@ -197,8 +197,9 @@ struct gfs2_rgrp {
__be64 rg_data0; /* First data location */ __be64 rg_data0; /* First data location */
__be32 rg_data; /* Number of data blocks in rgrp */ __be32 rg_data; /* Number of data blocks in rgrp */
__be32 rg_bitbytes; /* Number of bytes in data bitmaps */ __be32 rg_bitbytes; /* Number of bytes in data bitmaps */
__be32 rg_crc; /* crc32 of the structure with this field 0 */
__u8 rg_reserved[64]; /* Several fields from gfs1 now reserved */ __u8 rg_reserved[60]; /* Several fields from gfs1 now reserved */
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment