static int __read_je_payload(struct super_block *sb, u64 ofs, struct logfs_journal_header *jh) { u16 len; int err; len = be16_to_cpu(jh->h_len); err = wbuf_read(sb, ofs + sizeof(*jh), len, jh + 1); if (err) return err; if (jh->h_crc != logfs_crc32(jh, len + sizeof(*jh), 4)) { if (jh->h_crc == logfs_crc32(jh, len, 4)) WARN_ON_ONCE(1); else return -EIO; } return 0; }
static u64 read_gec(struct super_block *sb, u32 segno) { struct logfs_segment_header sh; __be32 crc; int err; if (!segno) return 0; err = wbuf_read(sb, dev_ofs(sb, segno, 0), sizeof(sh), &sh); if (err) return 0; crc = logfs_crc32(&sh, sizeof(sh), 4); if (crc != sh.crc) { WARN_ON(sh.gec != cpu_to_be64(0xffffffffffffffffull)); return 0; } return be64_to_cpu(sh.gec); }
static int __read_je_payload(struct super_block *sb, u64 ofs, struct logfs_journal_header *jh) { u16 len; int err; len = be16_to_cpu(jh->h_len); err = wbuf_read(sb, ofs + sizeof(*jh), len, jh + 1); if (err) return err; if (jh->h_crc != logfs_crc32(jh, len + sizeof(*jh), 4)) { /* Old code was confused. It forgot about the header length * and stopped calculating the crc 16 bytes before the end * of data - ick! * FIXME: Remove this hack once the old code is fixed. */ if (jh->h_crc == logfs_crc32(jh, len, 4)) WARN_ON_ONCE(1); else return -EIO; } return 0; }
static int __read_je_header(struct super_block *sb, u64 ofs, struct logfs_journal_header *jh) { struct logfs_super *super = logfs_super(sb); size_t bufsize = max_t(size_t, sb->s_blocksize, super->s_writesize) + MAX_JOURNAL_HEADER; u16 type, len, datalen; int err; err = wbuf_read(sb, ofs, sizeof(*jh), jh); if (err) return err; type = be16_to_cpu(jh->h_type); len = be16_to_cpu(jh->h_len); datalen = be16_to_cpu(jh->h_datalen); if (len > sb->s_blocksize) return -EIO; if ((type < JE_FIRST) || (type > JE_LAST)) return -EIO; if (datalen > bufsize) return -EIO; return 0; }