Re: [PATCH 1/5] Avoid potential block overflow when writing journal metadata tags
Badari Pulavarty <[email protected]>
| Newsgroups | gmane.comp.file-systems.ext2.devel |
|---|---|
| Message-ID | <[email protected]> |
On Tue, 2006-06-27 at 17:01 +0100, Stephen Tweedie wrote: > When writing block numbers into a journal descriptor block, don't write > the top 32 bits of a tag unless we're using a 64-bit journal. That > avoids any possibility of overflowing off the end of the descriptor > block in the case where the last 32-bit tag only just fits into the > descriptor block. > > Also cleans up the tag handling slightly by introducing new macros for > the size of 32- and 64-bit descriptor tags. > > Signed-off-by: Stephen Tweedie <[email protected]> > --- > fs/jbd/commit.c | 11 ++++++----- > include/linux/jbd.h | 3 +++ > 2 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c > index 680353f..3c2ad09 100644 > --- a/fs/jbd/commit.c > +++ b/fs/jbd/commit.c > @@ -160,10 +160,12 @@ static int journal_write_commit_record(j > return (ret == -EIO); > } > > -static inline void write_split_be64(__be32 *high, __be32 *low, u64 val) > +static inline void write_tag_block(int tag_bytes, journal_block_tag_t *tag, > + sector_t block) > { > - *low = cpu_to_be32(val & (u32)~0); > - *high = cpu_to_be32(val >> 32); > + tag->t_blocknr = cpu_to_be32(block & (u32)~0); > + if (tag_bytes > JBD_TAG_SIZE32) > + tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); > } > > /* > @@ -560,8 +562,7 @@ write_out_data: > tag_flag |= JFS_FLAG_SAME_UUID; > > tag = (journal_block_tag_t *) tagp; > - write_split_be64(&tag->t_blocknr_high, &tag->t_blocknr, > - jh2bh(jh)->b_blocknr); > + write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); > tag->t_flags = cpu_to_be32(tag_flag); > tagp += tag_bytes; > space_left -= tag_bytes; > diff --git a/include/linux/jbd.h b/include/linux/jbd.h > index 46cbc26..9579bbb 100644 > --- a/include/linux/jbd.h > +++ b/include/linux/jbd.h > @@ -159,6 +159,9 @@ typedef struct journal_block_tag_s > __be32 t_blocknr_high; /* most-significant high 32bits. */ > } journal_block_tag_t; > > +#define JBD_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high)) > +#define JBD_TAG_SIZE64 (sizeof(journal_block_tag_t)) > + > /* > * The revoke descriptor: used on disk to describe a series of blocks to > * be revoked from the log Yes. You are correct. Patch looks good. Thanks, Badari Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642