From patchwork Fri Mar 21 16:48:53 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Theodore Ts'o X-Patchwork-Id: 332683 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 107672C00B0 for ; Sat, 22 Mar 2014 03:49:10 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754428AbaCUQtI (ORCPT ); Fri, 21 Mar 2014 12:49:08 -0400 Received: from imap.thunk.org ([74.207.234.97]:44493 "EHLO imap.thunk.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753512AbaCUQtG (ORCPT ); Fri, 21 Mar 2014 12:49:06 -0400 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WR2cr-0006SQ-JK; Fri, 21 Mar 2014 16:48:57 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 69F00580AA0; Fri, 21 Mar 2014 12:48:56 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1395420536; bh=/fJEZ6GUG32GOZyj+EJZZYgVkzXpvu++VCJmDhZPrDE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ttIJ2+DL0hlue0Kr1O3Ks9XzGBcQuicOBlRXli2zzXhPFjmuGJctzHWYBS0NPOB86 +OKO5RFISmxA6vsmnP61JJv0QWRxxmA4RBtGjYxe3QYeQtv8kV9QBBfcE7c0t3KLL7 YcP8AenDvHcgPNMUMS1znBNGVPBE8GvvJc7kshi8= From: Theodore Ts'o To: Ext4 Developers List Cc: 1o5g4r8o@gmail.com, 738758@bugs.debian.org, ben@decadent.org.uk, Theodore Ts'o Subject: [PATCH] ext4: optimize Hurd tests when reading/writing inodes Date: Fri, 21 Mar 2014 12:48:53 -0400 Message-Id: <1395420533-20103-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 In-Reply-To: <20140321143927.GA31179@thunk.org> References: <20140321143927.GA31179@thunk.org> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Set a in-memory superblock flag to indicate whether the file system is designed to support the Hurd. Also, add a sanity check to make sure the 64-bit feature is not set for Hurd file systems, since i_file_acl_high conflicts with a Hurd-specific field. This is not a big deal, since Hurd doesn't support file systems larger than 1GB[1] anyway. [1] http://walfield.org/pub/people/neal/papers/hurd-faq/FAQ.en.html#q2-6 Signed-off-by: "Theodore Ts'o" --- fs/ext4/ext4.h | 2 ++ fs/ext4/inode.c | 9 +++------ fs/ext4/super.c | 10 ++++++++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f4f889e..e01135d 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1001,6 +1001,8 @@ struct ext4_inode_info { #define EXT4_MOUNT2_STD_GROUP_SIZE 0x00000002 /* We have standard group size of blocksize * 8 blocks */ +#define EXT4_MOUNT2_HURD_COMPAT 0x00000004 /* Support HURD-castrated + file systems */ #define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \ ~EXT4_MOUNT_##opt diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ed2c13a..a3a5eb3 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4168,8 +4168,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode); EXT4_EINODE_GET_XTIME(i_crtime, ei, raw_inode); - if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != - cpu_to_le32(EXT4_OS_HURD)) { + if (!test_opt2(inode->i_sb, HURD_COMPAT)) { inode->i_version = le32_to_cpu(raw_inode->i_disk_version); if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi)) @@ -4345,8 +4344,7 @@ static int ext4_do_update_inode(handle_t *handle, goto out_brelse; raw_inode->i_dtime = cpu_to_le32(ei->i_dtime); raw_inode->i_flags = cpu_to_le32(ei->i_flags & 0xFFFFFFFF); - if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != - cpu_to_le32(EXT4_OS_HURD)) + if (!test_opt2(inode->i_sb, HURD_COMPAT)) raw_inode->i_file_acl_high = cpu_to_le16(ei->i_file_acl >> 32); raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl); @@ -4391,8 +4389,7 @@ static int ext4_do_update_inode(handle_t *handle, raw_inode->i_block[block] = ei->i_data[block]; } - if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != - cpu_to_le32(EXT4_OS_HURD)) { + if (!test_opt2(inode->i_sb, HURD_COMPAT)) { raw_inode->i_disk_version = cpu_to_le32(inode->i_version); if (ei->i_extra_isize) { if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi)) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 3c9eadf..6adee9a 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -3580,6 +3580,16 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) "feature flags set on rev 0 fs, " "running e2fsck is recommended"); + if (es->s_creator_os == cpu_to_le32(EXT4_OS_HURD)) { + set_opt2(sb, HURD_COMPAT); + if (EXT4_HAS_INCOMPAT_FEATURE(sb, + EXT4_FEATURE_INCOMPAT_64BIT)) { + ext4_msg(sb, KERN_ERR, + "The Hurd can't support 64-bit file systems"); + goto failed_mount; + } + } + if (IS_EXT2_SB(sb)) { if (ext2_feature_set_ok(sb)) ext4_msg(sb, KERN_INFO, "mounting ext2 file system "