static int journal_erase_segment(struct logfs_area *area) { struct super_block *sb = area->a_sb; union { struct logfs_segment_header sh; unsigned char c[ALIGN(sizeof(struct logfs_segment_header), 16)]; } u; u64 ofs; int err; err = logfs_erase_segment(sb, area->a_segno, 1); if (err) return err; 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); ofs = dev_ofs(sb, area->a_segno, 0); area->a_used_bytes = sizeof(u); logfs_buf_write(area, ofs, &u, sizeof(u)); return 0; }
static int journal_erase_segment(struct logfs_area *area) { struct super_block *sb = area->a_sb; struct logfs_segment_header sh; u64 ofs; int err; err = logfs_erase_segment(sb, area->a_segno, 1); 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); /* 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)); return 0; }
static int logfs_write_je_buf(struct super_block *sb, void *buf, u16 type, size_t buf_len) { struct logfs_super *super = logfs_super(sb); struct logfs_area *area = super->s_journal_area; struct logfs_journal_header *jh = super->s_compressed_je; size_t len; int must_pad = 0; s64 ofs; len = __logfs_write_je(sb, buf, type, buf_len); if (jh->h_type == cpu_to_be16(JE_COMMIT)) must_pad = 1; ofs = logfs_get_free_bytes(area, &len, must_pad); if (ofs < 0) return ofs; logfs_buf_write(area, ofs, super->s_compressed_je, len); super->s_je_array[super->s_no_je++] = cpu_to_be64(ofs); return 0; }