[Cluster-devel] [GFS2 PATCH] GFS2: Introduce new gfs2_log_header_v2

Steven Whitehouse swhiteho at redhat.com
Mon Dec 4 12:16:10 UTC 2017


Hi,



On 01/12/17 19:34, Bob Peterson wrote:
> Hi,
>
> This patch adds a new structure called gfs2_log_header_v2 which is
> used to store expanded fields into previously unused areas of the
> log headers. Some of these are used for debug purposes so we can
> backtrack when problems occur. Others are reserved for future
> expansion.
>
> This is based on a prototype patch from Steve Whitehouse.
>
> Signed-off-by: Bob Peterson <rpeterso at redhat.com>
> ---
>   fs/gfs2/log.c                    | 22 ++++++++++++++++++++--
>   include/uapi/linux/gfs2_ondisk.h | 19 +++++++++++++++++++
>   2 files changed, 39 insertions(+), 2 deletions(-)
>
> diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
> index f72c44231406..311e22ec6716 100644
> --- a/fs/gfs2/log.c
> +++ b/fs/gfs2/log.c
> @@ -656,15 +656,20 @@ void gfs2_write_revokes(struct gfs2_sbd *sdp)
>   
>   static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
>   {
> +	struct gfs2_log_header_v2 *lh2;
>   	struct gfs2_log_header *lh;
>   	unsigned int tail;
>   	u32 hash;
>   	int op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
>   	struct page *page = mempool_alloc(gfs2_page_pool, GFP_NOIO);
>   	enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
> -	lh = page_address(page);
> -	clear_page(lh);
> +	struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
> +	struct timespec64 tv;
>   
> +	lh2 = page_address(page);
> +	clear_page(lh2);
> +
> +	lh = &lh2->lhv1;
>   	gfs2_assert_withdraw(sdp, (state != SFS_FROZEN));
>   
>   	tail = current_tail(sdp);
> @@ -681,6 +686,19 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
>   	hash = gfs2_disk_hash(page_address(page), sizeof(struct gfs2_log_header));
>   	lh->lh_hash = cpu_to_be32(hash);
>   
> +	tv = current_kernel_time64();
> +	lh2->lh_nsec = cpu_to_be32(tv.tv_nsec);
> +	lh2->lh_sec = cpu_to_be64(tv.tv_sec);
> +	lh2->lh_jinode = cpu_to_be64(GFS2_I(sdp->sd_jdesc->jd_inode)->i_no_addr);
> +	lh2->lh_statfs_addr = cpu_to_be64(GFS2_I(sdp->sd_sc_inode)->i_no_addr);
> +	lh2->lh_quota_addr = cpu_to_be64(GFS2_I(sdp->sd_qc_inode)->i_no_addr);
> +
> +	spin_lock(&sdp->sd_statfs_spin);
> +	lh2->lh_local_total = cpu_to_be64(l_sc->sc_total);
> +	lh2->lh_local_free = cpu_to_be64(l_sc->sc_free);
> +	lh2->lh_local_dinodes = cpu_to_be64(l_sc->sc_dinodes);
> +	spin_unlock(&sdp->sd_statfs_spin);
> +
>   	if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
>   		gfs2_ordered_wait(sdp);
>   		log_flush_wait(sdp);
> diff --git a/include/uapi/linux/gfs2_ondisk.h b/include/uapi/linux/gfs2_ondisk.h
> index 5156bad77b47..ebc7339ffb63 100644
> --- a/include/uapi/linux/gfs2_ondisk.h
> +++ b/include/uapi/linux/gfs2_ondisk.h
> @@ -406,6 +406,25 @@ struct gfs2_log_header {
>   	__be32 lh_hash;
>   };
>   
> +struct gfs2_log_header_v2 {
> +	struct gfs2_log_header lhv1;
> +
> +	__be32 lh_crc;		/* crc32 of whole block with this field 0 */
Where has setting the CRC gone?  That appears to be missing from this patch.

> +	__be32 lh_nsec;		/* Nano second time stamp */
> +	__be64 lh_sec;		/* Second based time stamp */
> +	__be64 lh_addr;		/* Block number of this log header (absolute) */
> +	__be64 lh_jinode;	/* Journal inode number */
> +	__be64 lh_statfs_addr;	/* Local statfs inode number */
> +	__be64 lh_quota_addr;	/* Local quota change inode number */
> +
> +	/* Statfs local changes (i.e. diff from global statfs) */
> +	__be64 lh_local_total;
> +	__be64 lh_local_free;
> +	__be64 lh_local_dinodes;
> +	__be32 lh_log_flusher;
> +	__be32 lh_pad;
Why is there padding here? There is nothing following it.
> +};
> +
>   /*
>    * Log type descriptor
>    */
>




More information about the Cluster-devel mailing list