This patch fixes regressions in588bff95c9
. Due to that patch, function clean_journal was setting the value of sd_log_flush_head, but that's only valid if it is replaying the node's own journal. If it's replaying another node's journal, that's completely wrong and will lead to multiple problems. This patch tries to clean up the mess by passing the value of the logical journal block number into gfs2_write_log_header so the function can treat non-owned journals generically. For the local journal, the journal extent map is used for best performance. For other nodes from other journals, new function gfs2_lblk_to_dblk is called to figure it out using gfs2_iomap_get. This patch also tries to establish more consistency when passing journal block parameters by changing several unsigned int types to a consistent u32. Fixes:588bff95c9
("GFS2: Reduce code redundancy writing log headers") Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
40 lines
1.3 KiB
C
40 lines
1.3 KiB
C
/*
|
|
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
|
* Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU General Public License version 2.
|
|
*/
|
|
|
|
#ifndef __RECOVERY_DOT_H__
|
|
#define __RECOVERY_DOT_H__
|
|
|
|
#include "incore.h"
|
|
|
|
extern struct workqueue_struct *gfs_recovery_wq;
|
|
|
|
static inline void gfs2_replay_incr_blk(struct gfs2_jdesc *jd, u32 *blk)
|
|
{
|
|
if (++*blk == jd->jd_blocks)
|
|
*blk = 0;
|
|
}
|
|
|
|
extern int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk,
|
|
struct buffer_head **bh);
|
|
|
|
extern int gfs2_revoke_add(struct gfs2_jdesc *jd, u64 blkno, unsigned int where);
|
|
extern int gfs2_revoke_check(struct gfs2_jdesc *jd, u64 blkno, unsigned int where);
|
|
extern void gfs2_revoke_clean(struct gfs2_jdesc *jd);
|
|
|
|
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__ */
|
|
|