[Cluster-devel] [GFS2 PATCH 3/4] gfs2: add a helper function to get_log_header that can be used elsewhere
Andreas Gruenbacher
agruenba at redhat.com
Tue Oct 16 09:07:02 UTC 2018
On Tue, 16 Oct 2018 at 06:23, Abhi Das <adas at redhat.com> wrote:
> Move and re-order the error checks and hash/crc computations into another
> function __get_log_header() so it can be used in scenarios where buffer_heads
> are not being used for the log header.
>
> Signed-off-by: Abhi Das <adas at redhat.com>
Reviewed-by: Andreas Gruenbacher <agruenba at redhat.com>
Thanks,
Andreas
> ---
> fs/gfs2/recovery.c | 53 ++++++++++++++++++++++++++++++++---------------------
> fs/gfs2/recovery.h | 2 ++
> 2 files changed, 34 insertions(+), 21 deletions(-)
>
> diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
> index b0717a0..2dac430 100644
> --- a/fs/gfs2/recovery.c
> +++ b/fs/gfs2/recovery.c
> @@ -120,6 +120,35 @@ void gfs2_revoke_clean(struct gfs2_jdesc *jd)
> }
> }
>
> +int __get_log_header(struct gfs2_sbd *sdp, const struct gfs2_log_header *lh,
> + unsigned int blkno, struct gfs2_log_header_host *head)
> +{
> + u32 hash, crc;
> +
> + if (lh->lh_header.mh_magic != cpu_to_be32(GFS2_MAGIC) ||
> + lh->lh_header.mh_type != cpu_to_be32(GFS2_METATYPE_LH) ||
> + (blkno && be32_to_cpu(lh->lh_blkno) != blkno))
> + return 1;
> +
> + hash = crc32(~0, lh, LH_V1_SIZE - 4);
> + hash = ~crc32_le_shift(hash, 4); /* assume lh_hash is zero */
> +
> + if (be32_to_cpu(lh->lh_hash) != hash)
> + return 1;
> +
> + crc = crc32c(~0, (void *)lh + LH_V1_SIZE + 4,
> + sdp->sd_sb.sb_bsize - LH_V1_SIZE - 4);
> +
> + if ((lh->lh_crc != 0 && be32_to_cpu(lh->lh_crc) != crc))
> + return 1;
> +
> + head->lh_sequence = be64_to_cpu(lh->lh_sequence);
> + head->lh_flags = be32_to_cpu(lh->lh_flags);
> + head->lh_tail = be32_to_cpu(lh->lh_tail);
> + head->lh_blkno = be32_to_cpu(lh->lh_blkno);
> +
> + return 0;
> +}
> /**
> * get_log_header - read the log header for a given segment
> * @jd: the journal
> @@ -137,36 +166,18 @@ void gfs2_revoke_clean(struct gfs2_jdesc *jd)
> static int get_log_header(struct gfs2_jdesc *jd, unsigned int blk,
> struct gfs2_log_header_host *head)
> {
> - struct gfs2_log_header *lh;
> + struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
> struct buffer_head *bh;
> - u32 hash, crc;
> int error;
>
> error = gfs2_replay_read_block(jd, blk, &bh);
> if (error)
> return error;
> - lh = (void *)bh->b_data;
> -
> - hash = crc32(~0, lh, LH_V1_SIZE - 4);
> - hash = ~crc32_le_shift(hash, 4); /* assume lh_hash is zero */
> -
> - crc = crc32c(~0, (void *)lh + LH_V1_SIZE + 4,
> - bh->b_size - LH_V1_SIZE - 4);
> -
> - error = lh->lh_header.mh_magic != cpu_to_be32(GFS2_MAGIC) ||
> - lh->lh_header.mh_type != cpu_to_be32(GFS2_METATYPE_LH) ||
> - be32_to_cpu(lh->lh_blkno) != blk ||
> - be32_to_cpu(lh->lh_hash) != hash ||
> - (lh->lh_crc != 0 && be32_to_cpu(lh->lh_crc) != crc);
>
> + error = __get_log_header(sdp, (const struct gfs2_log_header *)bh->b_data,
> + blk, head);
> brelse(bh);
>
> - if (!error) {
> - head->lh_sequence = be64_to_cpu(lh->lh_sequence);
> - head->lh_flags = be32_to_cpu(lh->lh_flags);
> - head->lh_tail = be32_to_cpu(lh->lh_tail);
> - head->lh_blkno = be32_to_cpu(lh->lh_blkno);
> - }
> return error;
> }
>
> diff --git a/fs/gfs2/recovery.h b/fs/gfs2/recovery.h
> index 11fdfab..943a67c 100644
> --- a/fs/gfs2/recovery.h
> +++ b/fs/gfs2/recovery.h
> @@ -31,6 +31,8 @@ extern int gfs2_find_jhead(struct gfs2_jdesc *jd,
> struct gfs2_log_header_host *head);
> extern int gfs2_recover_journal(struct gfs2_jdesc *gfs2_jd, bool wait);
> extern void gfs2_recover_func(struct work_struct *work);
> +extern int __get_log_header(struct gfs2_sbd *sdp, const struct gfs2_log_header *lh,
> + unsigned int blkno, struct gfs2_log_header_host *head);
>
> #endif /* __RECOVERY_DOT_H__ */
>
> --
> 2.4.11
>
More information about the Cluster-devel
mailing list