diff options
Diffstat (limited to 'fs/logfs/journal.c')
| -rw-r--r-- | fs/logfs/journal.c | 29 | 
1 files changed, 18 insertions, 11 deletions
diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c index 33bd260b830..fb0a613f885 100644 --- a/fs/logfs/journal.c +++ b/fs/logfs/journal.c @@ -389,7 +389,10 @@ static void journal_get_erase_count(struct logfs_area *area)  static int journal_erase_segment(struct logfs_area *area)  {  	struct super_block *sb = area->a_sb; -	struct logfs_segment_header sh; +	union { +		struct logfs_segment_header sh; +		unsigned char c[ALIGN(sizeof(struct logfs_segment_header), 16)]; +	} u;  	u64 ofs;  	int err; @@ -397,20 +400,21 @@ static int journal_erase_segment(struct logfs_area *area)  	if (err)  		return err; -	sh.pad = 0; -	sh.type = SEG_JOURNAL; -	sh.level = 0; -	sh.segno = cpu_to_be32(area->a_segno); -	sh.ec = cpu_to_be32(area->a_erase_count); -	sh.gec = cpu_to_be64(logfs_super(sb)->s_gec); -	sh.crc = logfs_crc32(&sh, sizeof(sh), 4); +	memset(&u, 0, sizeof(u)); +	u.sh.pad = 0; +	u.sh.type = SEG_JOURNAL; +	u.sh.level = 0; +	u.sh.segno = cpu_to_be32(area->a_segno); +	u.sh.ec = cpu_to_be32(area->a_erase_count); +	u.sh.gec = cpu_to_be64(logfs_super(sb)->s_gec); +	u.sh.crc = logfs_crc32(&u.sh, sizeof(u.sh), 4);  	/* This causes a bug in segment.c.  Not yet. */  	//logfs_set_segment_erased(sb, area->a_segno, area->a_erase_count, 0);  	ofs = dev_ofs(sb, area->a_segno, 0); -	area->a_used_bytes = ALIGN(sizeof(sh), 16); -	logfs_buf_write(area, ofs, &sh, sizeof(sh)); +	area->a_used_bytes = sizeof(u); +	logfs_buf_write(area, ofs, &u, sizeof(u));  	return 0;  } @@ -494,6 +498,8 @@ static void account_shadows(struct super_block *sb)  	btree_grim_visitor64(&tree->new, (unsigned long)sb, account_shadow);  	btree_grim_visitor64(&tree->old, (unsigned long)sb, account_shadow); +	btree_grim_visitor32(&tree->segment_map, 0, NULL); +	tree->no_shadowed_segments = 0;  	if (li->li_block) {  		/* @@ -607,9 +613,9 @@ static size_t __logfs_write_je(struct super_block *sb, void *buf, u16 type,  	if (len == 0)  		return logfs_write_header(super, header, 0, type); +	BUG_ON(len > sb->s_blocksize);  	compr_len = logfs_compress(buf, data, len, sb->s_blocksize);  	if (compr_len < 0 || type == JE_ANCHOR) { -		BUG_ON(len > sb->s_blocksize);  		memcpy(data, buf, len);  		compr_len = len;  		compr = COMPR_NONE; @@ -661,6 +667,7 @@ static int logfs_write_je_buf(struct super_block *sb, void *buf, u16 type,  	if (ofs < 0)  		return ofs;  	logfs_buf_write(area, ofs, super->s_compressed_je, len); +	BUG_ON(super->s_no_je >= MAX_JOURNAL_ENTRIES);  	super->s_je_array[super->s_no_je++] = cpu_to_be64(ofs);  	return 0;  }  |