From patchwork Sun Jun 24 14:13:56 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tao Ma X-Patchwork-Id: 166883 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4F5B4B6EF3 for ; Mon, 25 Jun 2012 00:14:15 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753496Ab2FXOON (ORCPT ); Sun, 24 Jun 2012 10:14:13 -0400 Received: from oproxy8-pub.bluehost.com ([69.89.22.20]:34248 "HELO oproxy8-pub.bluehost.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753476Ab2FXOOM (ORCPT ); Sun, 24 Jun 2012 10:14:12 -0400 Received: (qmail 9431 invoked by uid 0); 24 Jun 2012 14:14:12 -0000 Received: from unknown (HELO box585.bluehost.com) (66.147.242.185) by oproxy8.bluehost.com with SMTP; 24 Jun 2012 14:14:12 -0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tao.ma; s=default; h=Message-Id:Date:Subject:Cc:To:From; bh=HqARxvnFy41kvYMRoz6+x80iPEOkcwagJgnaOMTbmsE=; b=fkx/PZiaGD+DKUjyMDVYcs//z3Oo70i0OVjLyHkC+SYHe8t1ySujvOHZRokWKYWA3oVpTwQvqZJEoZjzO0rRZoBUYZSTNpJ/7NqfFn2OV9FaqHeQ33F7sAk2a20m4cgc; Received: from [114.254.67.137] (port=34104 helo=tma-laptop1.taobao.ali.com) by box585.bluehost.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.76) (envelope-from ) id 1SinZo-0002W9-7U; Sun, 24 Jun 2012 08:14:12 -0600 From: Tao Ma To: linux-ext4@vger.kernel.org Cc: "Darrick J. Wong" , "Theodore Ts'o" Subject: [PATCH] ext4: Use s_csum_seed instead of i_csum_seed for xattr block csum. Date: Sun, 24 Jun 2012 22:13:56 +0800 Message-Id: <1340547236-2838-1-git-send-email-tm@tao.ma> X-Mailer: git-send-email 1.7.5.4 X-Identified-User: {1390:box585.bluehost.com:colyli:tao.ma} {sentby:smtp auth 114.254.67.137 authed with tm@tao.ma} Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Tao Ma 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. Cc: Darrick J. Wong Cc: "Theodore Ts'o" Signed-off-by: Tao Ma --- fs/ext4/xattr.c | 11 ++++------- 1 files 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); }