From patchwork Sun Nov 29 02:02:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1407780 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=Xg2sn1Ea; 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 4CkBXG17MXz9s0b for ; Sun, 29 Nov 2020 13:05:18 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6C11B82797; Sun, 29 Nov 2020 03:03:49 +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="Xg2sn1Ea"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5683A82749; Sun, 29 Nov 2020 03:03:01 +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.15]) (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 19C7982753 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=1606615353; bh=OGL69GBI266oI5B0G1LbAbZRXYWdzjB+rT9VF9xIan0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Xg2sn1EapiIl6UMhMcWPl4+v/ovseQblciBoBIGe5Gbiow8NPCEXxDBi0fkr+IlKa opJN0P+h4oZKRvk3qqNEvmvKOj7hq3cWuS6z/qJWjO4zsj2LVfPlN/urp1N2qmt8CY OxdnpRSSlHdi7ls27WvX0FCvEbKg3CW+JOpQMD24= 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 1MtfJd-1jv5nS0jnz-00v4QE; Sun, 29 Nov 2020 03:02:33 +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 09/18] fs: fat: generate unique short names Date: Sun, 29 Nov 2020 03:02:07 +0100 Message-Id: <20201129020216.4865-10-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:A6tUyZDEOfraRZkq6qkFa4219TcfM9bOZiTiXXUqaHh9eju+YXJ v2qBugzecskMKugkAsf3EtVHxDdZ40LJ+Tp8hnTgBiN3bGdg6vsPTX0evZdTA0wHxZiqtx3 IPAwiZecYB+nQ3not2oT108+mnr4GAdFKPtnOqAl6ff1+EZ303vN5o+60RH22xuyQVxSY/Z bsKxuiCgw9LjXEOJtecPg== X-UI-Out-Filterresults: notjunk:1;V03:K0:McrmyWWl/Q8=:ED1r2zIV9lE+JBppUphDjy VNa3HykaPFf72pTXapMmha+toV5PF9f1JqNaEwcymkKmna820/nEpDm8wsoQMBGJbJo59SkWV lk7zKPdp48123PT86j8XzibcPfWjOpLgF0cdk8X1eKBnA56CF3ZihWaD+Fj5V+xbX+yX8odJ+ p1Ma6nKFqgCc/SKfxa+pnU8XK2lby3m9zJxnO9mxsprPAvjq2GylYWlhFUlQXezmPDoidaI3v Ktunfl+N8yCq3Gq7JScoqkOEsx+3vWXjAC3Z8pljHoEvks8fEMZMKDrfc0Nrwm0TA+1j3TmyS UY7M5LwxN9C9ss/lDCPml/hWeziH+Oidfcr9Epr7jcvbKwrB1Rs1JM6lDhcpRktxiafFZHFLG TUoxREGEl7GiL9ByTIlk/I2gkpGqnINxLyF39SwBpZiNOiteDpSvRwycSCJMNZ4ixm4M70vPq N/ZpENRukg4aYvUduRtn8UsPmpPxlX3Duh9jEsOu2DaGya4AHpm+QSYwTSQ+ZXT7rZbRGF2EP 4ZMQEJP58uYNv0WVmWdhbkrs/r7Um6i4WRMP544hO+jOJf3sgG371MRG7svL2jUXEo+6+eGkO z4pxAEOFt9/XlGIX/vnCbm2290l359ibC8iOwPxRIxPIm0ZrhHXyAgwJM0o+JboxXGXTF2QR1 FOzTsjQOGU5PAPFECyZJC7Y4Bnz+G7xJHnEH8T1vzqaNabQG/mEL/pZs5aovuqCjqvDCPTu3U 4QcZI5deiUJ3qof9zXTBuzjoYidN2gQG7LDL3j2sCOygAsPB2z1zSOMugD/rMSAhTFIRfVzmU eQPm7a62NVibnKhihOkIMwroi0ml+U1EgtB2OiJj+3E2H6YOvMQ3DuCJ3OJH9SEMdn4o6q0/R EUdA1ksf41/ZzJmrMZNg== 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 File names must be unique within their directory. So before assigning a short name we must check that it is unique. Signed-off-by: Heinrich Schuchardt --- fs/fat/fat_write.c | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) -- 2.29.2 diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index 716b6a6627..59cffef34e 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -20,6 +20,8 @@ #include #include "fat.c" +static dir_entry *find_directory_entry(fat_itr *itr, char *filename); + /* Characters that may only be used in long file names */ static const char LONG_ONLY_CHARS[] = "+,;=[]"; @@ -63,6 +65,27 @@ static int str2fat(char *dest, char *src, int length) return i; } +/** + * fat_move_to_cluster() - position to first directory entry in cluster + * + * @itr: directory iterator + * @cluster cluster + * Return: 0 for success, -EIO on error + */ +static int fat_move_to_cluster(fat_itr *itr, unsigned int cluster) +{ + unsigned int nbytes; + + /* position to the start of the directory */ + itr->next_clust = cluster; + itr->last_cluster = 0; + if (!fat_next_cluster(itr, &nbytes)) + return -EIO; + itr->dent = (dir_entry *)itr->block; + itr->remaining = nbytes / sizeof(dir_entry) - 1; + return 0; +} + /** * set_name() - set short name in directory entry * @@ -71,11 +94,12 @@ static int str2fat(char *dest, char *src, int length) * * If a long name is needed, a short name is constructed. * + * @itr: directory iterator * @filename: long file name * @shortname: buffer of 11 bytes to receive chosen short name and extension * Return: number of directory entries needed, negative on error */ -static int set_name(const char *filename, char *shortname) +static int set_name(fat_itr *itr, const char *filename, char *shortname) { char *period; char *pos; @@ -144,9 +168,16 @@ static int set_name(const char *filename, char *shortname) else sprintf(buf, "%.*s", suffix_start + suffix_len, dirent.name); - debug("short name: %s\n", buf); - /* TODO: Check that the short name does not exist yet. */ + debug("generated short name: %s\n", buf); + + /* Check that the short name does not exist yet. */ + ret = fat_move_to_cluster(itr, itr->start_clust); + if (ret) + return ret; + if (find_directory_entry(itr, buf)) + continue; + debug("chosen short name: %s\n", buf); /* Each long name directory entry takes 13 characters. */ ret = (strlen(filename) + 25) / 13; goto out; @@ -1261,7 +1292,7 @@ int file_fat_write_at(const char *filename, loff_t pos, void *buffer, } /* Check if long name is needed */ - ret = set_name(filename, shortname); + ret = set_name(itr, filename, shortname); if (ret < 0) goto exit; if (ret > 1) { @@ -1523,7 +1554,7 @@ int fat_mkdir(const char *new_dirname) } /* Check if long name is needed */ - ret = set_name(dirname, shortname); + ret = set_name(itr, dirname, shortname); if (ret < 0) goto exit; if (ret > 1) {