Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp3949252imw; Thu, 7 Jul 2022 10:05:33 -0700 (PDT) X-Google-Smtp-Source: AGRyM1v08h72c0NezFbPNPQDn8LARrs7lu+FKq9Pu48KoMiBSVcMaVjDUPMjPaLFtJz3J3brrL04 X-Received: by 2002:a05:6a00:138e:b0:529:26ea:1fb with SMTP id t14-20020a056a00138e00b0052926ea01fbmr1252968pfg.5.1657213533194; Thu, 07 Jul 2022 10:05:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657213533; cv=none; d=google.com; s=arc-20160816; b=zyv2OFEeMEvDawcMtANlXnqSBanLG7zsnWqUdi1u3VQ/90StrImm+UGmdKNNVPji8H ArHaSmzENAmB1FscApcaKohnBeYHhMAmJVuVytlhINzoz++gxsHbWADtrmt9te6vTHpL zCP7k27x17oxMibQbG+C2VD9oz6e5is+h6qPYg2jlVZgWhh9+p9WxL4upBPjgJprQ+9o HiRZqOuOOc9m1lV2jas7zx4NSHXPqbFLRCt1WR1WV/IizkJeTGJL7gtsdabdxUal4ugM 0xiru5nKmogDcAzH2nqXPlHQ2tbfbvSLmnKYTK8RMHtM27+0IyLHvv2D9PKPboDAx0dq 3Xzg== 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 :message-id:date:subject:cc:to:dkim-signature:from; bh=s6QfGxIhanK/aSuHFBmFYHnUNZjoa7GG0K+0iDzUl44=; b=zpb8aBTUXAedR/oG2eSQWhEjuAFfAv/NqjrtL/5b3d8ymRY+L5NPVrnoYUi0hteINd 3N0QnaWfmytWcBbM+1ug47iOZVy6u/dIc9fUKDQTML4v3kyURprKNke9MakbVRThlUcc x6p+VJZpgK6jFtaP/ga39xnS+tteLRZz+0eWlPEleGXkK8OHMYbKlj15lrwi82wDQk9l Hzxd5HNg/LjVzvovnuiJay/J86XXbOs9Ic9ZgcK+lly5HBfiFa/R+WuXtDnUo2pnoOPn ebgEI6780e7NTZRwqgRhPPCxrYSiLcCyZPR/mFZ3VDqS492XfGsuD9p6LLTBa6jePHEH sq0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bacher09.org header.s=reg header.b=V0Gayry+; 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 r22-20020a632b16000000b0041282c3315fsi9681378pgr.783.2022.07.07.10.05.11; Thu, 07 Jul 2022 10:05:33 -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=V0Gayry+; 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 S236531AbiGGRES (ORCPT + 99 others); Thu, 7 Jul 2022 13:04:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236532AbiGGREH (ORCPT ); Thu, 7 Jul 2022 13:04:07 -0400 X-Greylist: delayed 585 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Thu, 07 Jul 2022 10:04:03 PDT Received: from root.slava.cc (root.slava.cc [168.119.137.110]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE5D15C965 for ; Thu, 7 Jul 2022 10:04:03 -0700 (PDT) From: Slava Bacherikov DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bacher09.org; s=reg; t=1657212855; 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; bh=s6QfGxIhanK/aSuHFBmFYHnUNZjoa7GG0K+0iDzUl44=; b=V0Gayry+Qet9uZ1Q6PoRpPKLcECRKXn3AvKrKg2DwQAYQN8DpiejjV1O7WsU3FKoo/xE6r Ko0VUEgN3ohLBAcpXsjM8ZRw9HGeh4gE3EJ41Wn2ICA9ZNJXyTLhMAW1nTKU9NjqSKx9JR UkVtRbOuwblQJTjCChB6enjn0xmhf6Y= To: tytso@mit.edu Cc: linux-ext4@vger.kernel.org, krisman@collabora.com, Slava Bacherikov Subject: [PATCH] tune2fs: allow disabling casefold feature Date: Thu, 7 Jul 2022 19:54:00 +0300 Message-Id: <20220707165400.52951-1-slava@bacher09.org> 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.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) 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)) {