Hi Greg, I noticed that you're starting to process patches for the 3.5 stable release. This is just a quick ping-on-gram to remind you that I'd really appreciate it if you please cherry pick these two commit id's:
ef58f69c3c34f6377f1e21d3533c806dbd980ad0 41eb70dde42b2360074a559a6f1fc49860a50179 even though I forgot to mark them with a cc:[email protected]. Many thanks!! - Ted On Tue, Jul 31, 2012 at 01:27:04PM -0400, Theodore Ts'o wrote: > From: Tao Ma <[email protected]> > > commit 41eb70dde42b2360074a559a6f1fc49860a50179 upstream. > > In xattr block operation, we use h_refcount to indicate whether the > xattr block is shared among many inodes. And xattr block csum uses > s_csum_seed if it is shared and i_csum_seed if it belongs to > one inode. But this has a problem. So consider the block is shared > first bewteen inode A and B, and B has some xattr update and CoW > the xattr block. When it updates the *old* xattr block(because > of the h_refcount change) and calls ext4_xattr_release_block, we > has no idea that inode A is the real owner of the *old* xattr > block and we can't use the i_csum_seed of inode A either in xattr > block csum calculation. And I don't think we have an easy way to > find inode A. > > So this patch just removes the tricky i_csum_seed and we now uses > s_csum_seed every time for the xattr block csum. The corresponding > patch for the e2fsprogs will be sent in another patch. > > This is spotted by xfstests 117. > > Signed-off-by: Tao Ma <[email protected]> > Signed-off-by: "Theodore Ts'o" <[email protected]> > Acked-by: Darrick J. Wong <[email protected]> > --- > [ Sorry, I forgot to tag these with [email protected] -- Ted ] > > fs/ext4/xattr.c | 11 ++++------- > 1 file changed, 4 insertions(+), 7 deletions(-) > > diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c > index e56c9ed..2cdb98d 100644 > --- a/fs/ext4/xattr.c > +++ b/fs/ext4/xattr.c > @@ -127,19 +127,16 @@ static __le32 ext4_xattr_block_csum(struct inode *inode, > struct ext4_xattr_header *hdr) > { > struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); > - struct ext4_inode_info *ei = EXT4_I(inode); > __u32 csum, old; > > old = hdr->h_checksum; > hdr->h_checksum = 0; > - if (le32_to_cpu(hdr->h_refcount) != 1) { > - block_nr = cpu_to_le64(block_nr); > - csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)&block_nr, > - sizeof(block_nr)); > - } else > - csum = ei->i_csum_seed; > + block_nr = cpu_to_le64(block_nr); > + csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)&block_nr, > + sizeof(block_nr)); > csum = ext4_chksum(sbi, csum, (__u8 *)hdr, > EXT4_BLOCK_SIZE(inode->i_sb)); > + > hdr->h_checksum = old; > return cpu_to_le32(csum); > } > -- > 1.7.12.rc0.22.gcdd159b > -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
