Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp4069169imw; Thu, 7 Jul 2022 12:11:11 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uqQenQf3GRWFtUW8DfuEuiozL71++lJC7XF0SgWxL1iA9/b3TmZ9l7dZVZJwBBgHlULj1r X-Received: by 2002:a05:6402:3893:b0:43a:2640:b7a0 with SMTP id fd19-20020a056402389300b0043a2640b7a0mr35623436edb.170.1657221071363; Thu, 07 Jul 2022 12:11:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657221071; cv=none; d=google.com; s=arc-20160816; b=oFSsSPEO7yrrYnbWBNht4b2tTe+gsQJnFhe2g9CVOtlMQ9cOLsKueZtqIVduRNCbpK ADsW84u0mLY+X9S/CdDCeMdwQioNeW+Pn7oxz0rt2iWa51JebGCStrw2tOAG7dEOknf3 aqGbxTGWwozqxdV0YU8PYzrWSO0RdDLmulRThxshoFQNN0/zts5Znh5n4KPB14QhF80m 6vDzbMJHAwC7qr6kK8nrNUlQ5DujLuehjO0VvkGKD+p3FKcZqabraFzFWfRyCpBDNM7b ZfQjHxglR1UAxNjTfLFTbiLnNIXXGnzHNwCwG9wrHbIKUT8oTOqyuwaF4IEqB3FSyRqM g06A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:dkim-signature :from; bh=4oDb/f9kiDHOWZAUUqDH+OroJpdda9mXSiwM19LCwuY=; b=qPCA/PDn+ZImTsAqZvn8jeMFNU19pncCqyXuKGAusUad+zzZd6hpDdHwV7F1cQ3b6j VtPQD47jg0OsLJkLSC8yLqNyNA6UMnxr1HoZfEaWPF50+xFXhrarcmxjZDLqcfWnZx0r DWXZWeSIdt3Qvksd22qIRqu67ODeKmABtGGC+dk31eEhqp1BF+eGq9mGoS8Vm4/hfGfp gElDeUef8i52NaIxI9sqfg9J7Eo+ko2+yl8+9ecszh2PZGDRdlTVh879sTW6NjDk6sLj ddX06x2ZfLhjZDIMJR5K6wyEprEmYYfDjdLfRWB1Y/JiTDZ9BAH/F8Sxv9bPc75PRWC9 wPTQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bacher09.org header.s=reg header.b=m69s2iRg; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z7-20020a05640240c700b0043639a0b48bsi51483649edb.276.2022.07.07.12.10.42; Thu, 07 Jul 2022 12:11:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@bacher09.org header.s=reg header.b=m69s2iRg; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235643AbiGGTFc (ORCPT + 99 others); Thu, 7 Jul 2022 15:05:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236194AbiGGTFb (ORCPT ); Thu, 7 Jul 2022 15:05:31 -0400 Received: from root.slava.cc (root.slava.cc [168.119.137.110]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C1B2C5A449 for ; Thu, 7 Jul 2022 12:05:30 -0700 (PDT) From: Slava Bacherikov DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bacher09.org; s=reg; t=1657220725; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4oDb/f9kiDHOWZAUUqDH+OroJpdda9mXSiwM19LCwuY=; b=m69s2iRgypxrJU9C3IJJEa8JSNJqDnIZ8Tf6e+pC4bBbDtaIDyhFlUbv1qSlbc8iiZk2/V hzkwcqjaBHUySrcUiYnH3142G7N2YkpxR9XbdXs6B8gvW9vdmBaZYMjFtY+nb58gt3PDJ1 stvSYkoD815GZG0AT6sRB5AJ5Nja+68= To: ebiggers@kernel.org Cc: tytso@mit.edu, linux-ext4@vger.kernel.org, krisman@collabora.com, Slava Bacherikov Subject: [PATCH v2] tune2fs: allow disabling casefold feature Date: Thu, 7 Jul 2022 22:04:56 +0300 Message-Id: <20220707190456.64972-1-slava@bacher09.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Casefold can be safely disabled if there are no directories with +F attribute ( EXT4_CASEFOLD_FL ). This checks all inodes for that flag and in case there isn't any, it disables casefold FS feature. When FS has directories with +F attributes, user could convert these directories, probably by mounting FS and executing some script or by doing it manually. Afterwards, it would be possible to disable casefold FS flag via tune2fs. Signed-off-by: Slava Bacherikov --- misc/tune2fs.8.in | 6 ++++-- misc/tune2fs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/misc/tune2fs.8.in b/misc/tune2fs.8.in index 628dcdc0..8ef28860 100644 --- a/misc/tune2fs.8.in +++ b/misc/tune2fs.8.in @@ -593,8 +593,10 @@ Enable the file system to be larger than 2^32 blocks. .TP .B casefold Enable support for file system level casefolding. -.B Tune2fs -currently only supports setting this file system feature. +The option could be disabled only if filesystem has no +directories with +.B F +attribute. .TP .B dir_index Use hashed b-trees to speed up lookups for large directories. diff --git a/misc/tune2fs.c b/misc/tune2fs.c index 6c162ba5..1c5c2969 100644 --- a/misc/tune2fs.c +++ b/misc/tune2fs.c @@ -204,7 +204,8 @@ static __u32 clear_ok_features[3] = { EXT4_FEATURE_INCOMPAT_FLEX_BG | EXT4_FEATURE_INCOMPAT_MMP | EXT4_FEATURE_INCOMPAT_64BIT | - EXT4_FEATURE_INCOMPAT_CSUM_SEED, + EXT4_FEATURE_INCOMPAT_CSUM_SEED | + EXT4_FEATURE_INCOMPAT_CASEFOLD, /* R/O compat */ EXT2_FEATURE_RO_COMPAT_LARGE_FILE | EXT4_FEATURE_RO_COMPAT_HUGE_FILE| @@ -1020,6 +1021,41 @@ out: return retval; } +static int has_casefold_inode(ext2_filsys fs) +{ + int length = EXT2_INODE_SIZE(fs->super); + struct ext2_inode *inode = NULL; + ext2_inode_scan scan; + errcode_t retval; + ext2_ino_t ino; + int found_casefold = 0; + + retval = ext2fs_get_mem(length, &inode); + if (retval) + fatal_err(retval, "while allocating memory"); + + retval = ext2fs_open_inode_scan(fs, 0, &scan); + if (retval) + fatal_err(retval, "while opening inode scan"); + + do { + retval = ext2fs_get_next_inode_full(scan, &ino, inode, length); + if (retval) + fatal_err(retval, "while getting next inode"); + if (!ino) + break; + + if(inode->i_flags & EXT4_CASEFOLD_FL) { + found_casefold = 1; + break; + } + } while(1); + + ext2fs_free_mem(&inode); + ext2fs_close_inode_scan(scan); + return found_casefold; +} + static errcode_t disable_uninit_bg(ext2_filsys fs, __u32 csum_feature_flag) { struct ext2_group_desc *gd; @@ -1554,6 +1590,20 @@ mmp_error: enabling_casefold = 1; } + if (FEATURE_OFF(E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_CASEFOLD)) { + if (mount_flags & EXT2_MF_MOUNTED) { + fputs(_("The casefold feature may only be disabled when " + "the filesystem is unmounted.\n"), stderr); + return 1; + } + if (has_casefold_inode(fs)) { + fputs(_("The casefold feature couldn't be disabled when " + "there are inodes with +F flag.\n"), stderr); + return 1; + } + enabling_casefold = 0; + } + if (FEATURE_ON(E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_CSUM_SEED)) { if (!ext2fs_has_feature_metadata_csum(sb)) {