From patchwork Sun Nov 29 02:02:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1407777 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=Epx1R4UM; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CkBWf1bZzz9sSf for ; Sun, 29 Nov 2020 13:04:46 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CD32A8279F; Sun, 29 Nov 2020 03:03:24 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="Epx1R4UM"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id C2E1582750; Sun, 29 Nov 2020 03:02:58 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 470498275B for ; Sun, 29 Nov 2020 03:02:45 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1606615356; bh=CyZNfGWNfn4pkh/TTmqRGhGKN5aEw5nCX2GlGcxB/Kw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Epx1R4UMObvsn/28OSTwimPvWeay05BDnT/kkHjAdQ4KGAMUxdYUdgOmEWY0Od9Tp /CFoH9DsFuMitQLWNd/lHGa855fM888M1jUnQrFOluCOi4CRMiX8nI2vZQ4EtP9BCx t+SW/F7YwCwVdpPmhfKYCF3yRE2pl5qYcWuEWnFw= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from mcbin.fritz.box ([62.143.246.89]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MnakR-1kJnNW3X0v-00jc6a; Sun, 29 Nov 2020 03:02:36 +0100 From: Heinrich Schuchardt To: Tom Rini Cc: Simon Glass , Christian Gmeiner , Jason Wessel , AKASHI Takahiro , Marek Szyprowski , Bin Meng , Reuben Dowle , Marcin Juszkiewicz , Thomas Hebb , Samer El-Haj-Mahmoud , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 14/18] fs: fat: reuse deleted directory entries Date: Sun, 29 Nov 2020 03:02:12 +0100 Message-Id: <20201129020216.4865-15-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201129020216.4865-1-xypron.glpk@gmx.de> References: <20201129020216.4865-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:bdMURUkxFdh9SUEHN+0nzuQ25qKGUUNN2Ar+qdju3nmrVkdCDEp IHA2Mz+P3FVYxWz4Uee00noZ4d3R+w3sVgdwYCnUa9tQcgqGr+9FE14IHHPAwK+0O5OBGJc bL62YvOCiPKfjaXasDQ2xlS0Kc91kG57SKkSr7b9d19j6Ys77ISAj55yW+OHH01TrTKAWW2 2qP+J1gEVaymUlnVmgQTA== X-UI-Out-Filterresults: notjunk:1;V03:K0:2x8TSqAMBCo=:inSodNZAhY8pCHw03fE7eu A9S/4sS4tg+N2hXnRu27yrZprF52BsswuMrqH1Nh7OVx9Pg8944HkUveQfdlQ5A6/7QVKikj0 F67jhdZjck7KesFJzdO1SqUCCF5TD7zL5xKWWAhEuEB8hG0SW0C4dqN4ZiLcFLzIfvKslaap1 uUvF5/o22rZW18PY+DM+n0/DF1jw4p6poHmnsp83VL3/dokLTcbiOHfIRM4eBcwGnwHpygDVq IZ9pvUfsyU9pj+fbJghWDVy6/IfUPtw7K9ji00WlnvkLIc6ahu2G5VIcxK1TqhCX6zfKTetUJ hLELSbCAqqtbSm4caupCUc+G4c7XLbk2PiScKwoHdzE2a07tcS0UADLCfe23skhdBsSChPPTs Rwmp1d6IyxyXfm2LMDozJGQEb/gjdkWWc2+LS05yTfRhOs0L1fSAOvtI359slUSU3XqIuM7gH bTWPxctLrGVkO4LsrRI7fHrhB+R9Dz9urff0VN1QtotVK814xK0tUm1bixdmOEA35pG4xTvh4 j6QBOUOdwtj3qYBcoQfK91Xt6/+7AyemQqzi9lakyPaXwPBZT8nf9pdO2MkISEdqoXhzL3dzb 0ZFPbk7LjxOvcLfSLS3fciHNAcpygev15m9p/B3VUEoc50rgP+PxvuRZFNns1vuDSyqDX/mXs NYJn1htgPpFaWFFtZwhoFHWOplBTKRXeIPgQ4M9OMb+7XLFbI58S3bTSH8vzcNmGtS8nklk+1 CyI/z7LtpUY0L0VT+G7yKRpDVYWDcARb5nYDFqk4hC9JMyq82VM9Nn11lVoK+oHvpBTKJUxNz Q7JmGkhjbS5UyFBY7/PPkx7LhFdxZWSvnvQXFSt6lX1KDSgWysJHs7rkt4FBZwDh8d2Ix8j/J jxpRdsfwVKs8PG+OfcJw== X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean When creating new directory entries try to reuse entries marked as deleted. In fill_dir_slot() do not allocate new clusters as this has already been done in fat_find_empty_dentries(). Signed-off-by: Heinrich Schuchardt --- fs/fat/fat_write.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) -- 2.29.2 diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index d560b94b60..a029ef8ed6 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -258,7 +258,7 @@ static int flush_dirty_fat_buffer(fsdata *mydata) * @count: number of directory entries to find * Return: 0 on success or negative error number */ -static int __maybe_unused fat_find_empty_dentries(fat_itr *itr, int count) +static int fat_find_empty_dentries(fat_itr *itr, int count) { unsigned int cluster; dir_entry *dent; @@ -421,11 +421,9 @@ fill_dir_slot(fat_itr *itr, const char *l_name, const char *shortname) if (itr->remaining == 0) flush_dir(itr); - /* allocate a cluster for more entries */ - if (!next_dent(itr) && !itr->dent) - if ((itr->is_root && itr->fsdata->fatsize != 32) || - new_dir_table(itr)) - return -EIO; + next_dent(itr); + if (!itr->dent) + return -EIO; } return 0; @@ -1339,6 +1337,7 @@ int file_fat_write_at(const char *filename, loff_t pos, void *buffer, } else { /* Create a new file */ char shortname[SHORT_NAME_SIZE]; + int ndent; if (itr->is_root) { /* root dir cannot have "." or ".." */ @@ -1362,10 +1361,15 @@ int file_fat_write_at(const char *filename, loff_t pos, void *buffer, } /* Check if long name is needed */ - ret = set_name(itr, filename, shortname); - if (ret < 0) + ndent = set_name(itr, filename, shortname); + if (ndent < 0) { + ret = ndent; + goto exit; + } + ret = fat_find_empty_dentries(itr, ndent); + if (ret) goto exit; - if (ret > 1) { + if (ndent > 1) { /* Set long name entries */ ret = fill_dir_slot(itr, filename, shortname); if (ret) @@ -1607,6 +1611,7 @@ int fat_mkdir(const char *new_dirname) goto exit; } else { char shortname[SHORT_NAME_SIZE]; + int ndent; if (itr->is_root) { /* root dir cannot have "." or ".." */ @@ -1624,10 +1629,15 @@ int fat_mkdir(const char *new_dirname) } /* Check if long name is needed */ - ret = set_name(itr, dirname, shortname); - if (ret < 0) + ndent = set_name(itr, dirname, shortname); + if (ndent < 0) { + ret = ndent; + goto exit; + } + ret = fat_find_empty_dentries(itr, ndent); + if (ret) goto exit; - if (ret > 1) { + if (ndent > 1) { /* Set long name entries */ ret = fill_dir_slot(itr, dirname, shortname); if (ret)