From patchwork Tue Dec 24 08:44:58 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 3401291 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id CFBB99F375 for ; Tue, 24 Dec 2013 08:44:30 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id ECB5920579 for ; Tue, 24 Dec 2013 08:44:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D72E72055F for ; Tue, 24 Dec 2013 08:44:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751326Ab3LXIoK (ORCPT ); Tue, 24 Dec 2013 03:44:10 -0500 Received: from cn.fujitsu.com ([222.73.24.84]:64814 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1751223Ab3LXIoJ (ORCPT ); Tue, 24 Dec 2013 03:44:09 -0500 X-IronPort-AV: E=Sophos;i="4.95,541,1384272000"; d="scan'208";a="9317334" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 24 Dec 2013 16:40:33 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id rBO8i69b014864 for ; Tue, 24 Dec 2013 16:44:06 +0800 Received: from adam-work.lan ([10.167.226.24]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013122416432769-689315 ; Tue, 24 Dec 2013 16:43:27 +0800 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v2] btrfs: Move some super block check to btrfs_check_super_valid Date: Tue, 24 Dec 2013 16:44:58 +0800 Message-Id: <1387874698-29652-1-git-send-email-quwenruo@cn.fujitsu.com> X-Mailer: git-send-email 1.8.5.2 X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/12/24 16:43:27, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/12/24 16:43:28, Serialize complete at 2013/12/24 16:43:28 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Move some early check to btrfs_check_super_valid: - sectorsize check - leafsize == nodesize check - leafsize > BTRFS_MAX_METADATA_BLOCKSIZE check - incompat_flags check and remove the duplicant magic check of btrfs_super_block, since btrfs_read_dev_super already checked the magic number. Signed-off-by: Qu Wenruo --- Changelog: v2: - Rebased to btrfs-next repo - Use pr_err instead of printk - Use one line string to make grep easier(also emit the checkpatch warning) --- fs/btrfs/disk-io.c | 72 +++++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 9417b73..defe2a4 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2384,33 +2384,6 @@ int open_ctree(struct super_block *sb, goto fail_alloc; } - features = btrfs_super_incompat_flags(disk_super) & - ~BTRFS_FEATURE_INCOMPAT_SUPP; - if (features) { - printk(KERN_ERR "BTRFS: couldn't mount because of " - "unsupported optional features (%Lx).\n", - features); - err = -EINVAL; - goto fail_alloc; - } - - if (btrfs_super_leafsize(disk_super) != - btrfs_super_nodesize(disk_super)) { - printk(KERN_ERR "BTRFS: couldn't mount because metadata " - "blocksizes don't match. node %d leaf %d\n", - btrfs_super_nodesize(disk_super), - btrfs_super_leafsize(disk_super)); - err = -EINVAL; - goto fail_alloc; - } - if (btrfs_super_leafsize(disk_super) > BTRFS_MAX_METADATA_BLOCKSIZE) { - printk(KERN_ERR "BTRFS: couldn't mount because metadata " - "blocksize (%d) was too large\n", - btrfs_super_leafsize(disk_super)); - err = -EINVAL; - goto fail_alloc; - } - features = btrfs_super_incompat_flags(disk_super); features |= BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF; if (tree_root->fs_info->compress_type == BTRFS_COMPRESS_LZO) @@ -2578,17 +2551,6 @@ int open_ctree(struct super_block *sb, sb->s_blocksize = sectorsize; sb->s_blocksize_bits = blksize_bits(sectorsize); - if (btrfs_super_magic(disk_super) != BTRFS_MAGIC) { - printk(KERN_INFO "BTRFS: valid FS not found on %s\n", sb->s_id); - goto fail_sb_buffer; - } - - if (sectorsize != PAGE_SIZE) { - printk(KERN_WARNING "BTRFS: Incompatible sector size(%lu) " - "found on %s\n", (unsigned long)sectorsize, sb->s_id); - goto fail_sb_buffer; - } - mutex_lock(&fs_info->chunk_mutex); ret = btrfs_read_sys_array(tree_root); mutex_unlock(&fs_info->chunk_mutex); @@ -3712,11 +3674,37 @@ int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid) } static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info, - int read_only) + int read_only) { - /* - * Placeholder for checks - */ + struct btrfs_super_block *disk_super = fs_info->super_copy; + u32 sectorsize = btrfs_super_sectorsize(disk_super); + u64 features; + + if (sectorsize != PAGE_SIZE) { + pr_err("BTRFS: Incompatible sector size(%lu) found on %s\n", + (unsigned long)sectorsize, fs_info->sb->s_id); + return -EINVAL; + } + if (btrfs_super_leafsize(disk_super) != + btrfs_super_nodesize(disk_super)) { + pr_err("BTRFS: couldn't mount because metadata blocksizes don't match. node %d leaf %d\n", + btrfs_super_nodesize(disk_super), + btrfs_super_leafsize(disk_super)); + return -EINVAL; + } + if (btrfs_super_leafsize(disk_super) > BTRFS_MAX_METADATA_BLOCKSIZE) { + pr_err("BTRFS: couldn't mount because metadata blocksize (%d) was too large\n", + btrfs_super_leafsize(disk_super)); + return -EINVAL; + } + + features = btrfs_super_incompat_flags(disk_super) & + ~BTRFS_FEATURE_INCOMPAT_SUPP; + if (features) { + pr_err("BTRFS: couldn't mount because of unsupported optional features (%Lx).\n", + features); + return -EINVAL; + } return 0; }