From: "Benoît Thébaudeau" <benoit@wsystem.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 5/5] fs/fat/fat_write: Fix management of empty files
Date: Mon, 28 Sep 2015 15:45:32 +0200 [thread overview]
Message-ID: <1443447932-14139-5-git-send-email-benoit@wsystem.com> (raw)
In-Reply-To: <1443447932-14139-1-git-send-email-benoit@wsystem.com>
Overwriting an empty file not created by U-Boot did not work, and it
could even corrupt the FAT. Moreover, creating empty files or emptying
existing files allocated a cluster, which is not standard.
Fix this by always keeping empty files clusterless as specified by
Microsoft (the start cluster must be set to 0 in the directory entry in
that case), and by supporting overwriting such files.
Signed-off-by: Beno?t Th?baudeau <benoit@wsystem.com>
---
fs/fat/fat_write.c | 85 ++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 64 insertions(+), 21 deletions(-)
diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
index 2d032ee..af828d0 100644
--- a/fs/fat/fat_write.c
+++ b/fs/fat/fat_write.c
@@ -710,6 +710,14 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
debug("%llu bytes\n", filesize);
+ if (!curclust) {
+ if (filesize) {
+ debug("error: nonempty clusterless file!\n");
+ return -1;
+ }
+ return 0;
+ }
+
actsize = bytesperclust;
endclust = curclust;
do {
@@ -765,15 +773,24 @@ getit:
}
/*
- * Fill dir_entry
+ * Set start cluster in directory entry
*/
-static void fill_dentry(fsdata *mydata, dir_entry *dentptr,
- const char *filename, __u32 start_cluster, __u32 size, __u8 attr)
+static void set_start_cluster(const fsdata *mydata, dir_entry *dentptr,
+ __u32 start_cluster)
{
if (mydata->fatsize == 32)
dentptr->starthi =
cpu_to_le16((start_cluster & 0xffff0000) >> 16);
dentptr->start = cpu_to_le16(start_cluster & 0xffff);
+}
+
+/*
+ * Fill dir_entry
+ */
+static void fill_dentry(fsdata *mydata, dir_entry *dentptr,
+ const char *filename, __u32 start_cluster, __u32 size, __u8 attr)
+{
+ set_start_cluster(mydata, dentptr, start_cluster);
dentptr->size = cpu_to_le32(size);
dentptr->attr = attr;
@@ -1030,32 +1047,58 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
retdent->size = cpu_to_le32(size);
start_cluster = START(retdent);
- ret = check_overflow(mydata, start_cluster, size);
- if (ret) {
- printf("Error: %llu overflow\n", size);
- goto exit;
- }
+ if (start_cluster) {
+ if (size) {
+ ret = check_overflow(mydata, start_cluster,
+ size);
+ if (ret) {
+ printf("Error: %llu overflow\n", size);
+ goto exit;
+ }
+ }
- ret = clear_fatent(mydata, start_cluster);
- if (ret) {
- printf("Error: clearing FAT entries\n");
- goto exit;
+ ret = clear_fatent(mydata, start_cluster);
+ if (ret) {
+ printf("Error: clearing FAT entries\n");
+ goto exit;
+ }
+
+ if (!size)
+ set_start_cluster(mydata, retdent, 0);
+ } else if (size) {
+ ret = start_cluster = find_empty_cluster(mydata);
+ if (ret < 0) {
+ printf("Error: finding empty cluster\n");
+ goto exit;
+ }
+
+ ret = check_overflow(mydata, start_cluster, size);
+ if (ret) {
+ printf("Error: %llu overflow\n", size);
+ goto exit;
+ }
+
+ set_start_cluster(mydata, retdent, start_cluster);
}
} else {
/* Set short name to set alias checksum field in dir_slot */
set_name(empty_dentptr, filename);
fill_dir_slot(mydata, &empty_dentptr, filename);
- ret = start_cluster = find_empty_cluster(mydata);
- if (ret < 0) {
- printf("Error: finding empty cluster\n");
- goto exit;
- }
+ if (size) {
+ ret = start_cluster = find_empty_cluster(mydata);
+ if (ret < 0) {
+ printf("Error: finding empty cluster\n");
+ goto exit;
+ }
- ret = check_overflow(mydata, start_cluster, size);
- if (ret) {
- printf("Error: %llu overflow\n", size);
- goto exit;
+ ret = check_overflow(mydata, start_cluster, size);
+ if (ret) {
+ printf("Error: %llu overflow\n", size);
+ goto exit;
+ }
+ } else {
+ start_cluster = 0;
}
/* Set attribute as archieve for regular file */
--
2.1.4
next prev parent reply other threads:[~2015-09-28 13:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-12 12:46 [U-Boot] fatwrite problem Ruud Commandeur
2013-04-12 14:11 ` Mats Kärrman
2013-04-12 15:06 ` Ruud Commandeur
2013-04-12 15:12 ` Tom Rini
2013-04-12 15:23 ` Ruud Commandeur
2013-04-12 15:43 ` Tom Rini
2013-04-12 19:39 ` Benoît Thébaudeau
2013-04-12 20:42 ` Tom Rini
2013-04-12 21:17 ` Benoît Thébaudeau
2013-04-16 9:32 ` Ruud Commandeur
2013-05-14 15:13 ` Ruud Commandeur
2013-05-14 15:31 ` Tom Rini
2015-09-28 13:45 ` [U-Boot] [PATCH 1/5] fs/fat/fat_write: Fix buffer alignments Benoît Thébaudeau
2015-09-28 13:45 ` [U-Boot] [PATCH 2/5] fs/fat/fat_write: Merge calls to set_cluster() Benoît Thébaudeau
2015-10-12 15:15 ` [U-Boot] [U-Boot, " Tom Rini
2015-09-28 13:45 ` [U-Boot] [PATCH 3/5] fs/fat/fat_write: Fix curclust/newclust mix-up Benoît Thébaudeau
2015-10-12 15:15 ` [U-Boot] [U-Boot, " Tom Rini
2015-09-28 13:45 ` [U-Boot] [PATCH 4/5] fs/fat/fat_write: Factor out duplicate code Benoît Thébaudeau
2015-10-12 15:15 ` [U-Boot] [U-Boot, " Tom Rini
2015-09-28 13:45 ` Benoît Thébaudeau [this message]
2015-10-12 15:15 ` [U-Boot] [U-Boot, 5/5] fs/fat/fat_write: Fix management of empty files Tom Rini
2015-09-28 15:22 ` [U-Boot] [PATCH 1/5] fs/fat/fat_write: Fix buffer alignments Tom Rini
2015-10-07 19:48 ` Benoît Thébaudeau
2015-10-12 15:15 ` [U-Boot] [U-Boot,1/5] " Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1443447932-14139-5-git-send-email-benoit@wsystem.com \
--to=benoit@wsystem.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.