Skip to contentSkip to conversation

fs/fat: Remove two statements without effect

PATCH New Stefan Brüns 6 participants 14 messages Sep 11, 2016 – Sep 23, 2016 1 message not in the archive VFAT/FAT/msdos filesystem

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/4 fs/fat: Remove two statements without effect

fatlength is a local variable which is no more used after the assignment. s_name is not used in the function, save the strncpy.

---
 fs/fat/fat_write.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
fs/fat/fat_write.c +1 -4
index eb3a916..961ccd8 100644
@@ -183,7 +183,6 @@ static __u32 get_fatent_value(fsdata *mydata, __u32 entry)
 		if (getsize > fatlength)
 			getsize = fatlength;
 
-		fatlength *= mydata->sect_size;	/* We want it in bytes now */
 		startblock += mydata->fat_sect;	/* Offset from start of disk */
 
 		/* Write back the fatbuf to the disk */
@@ -326,10 +325,8 @@ fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name)
 	dir_slot *slotptr = (dir_slot *)get_contents_vfatname_block;
 	__u8 counter = 0, checksum;
 	int idx = 0, ret;
-	char s_name[16];
 
-	/* Get short file name and checksum value */
-	strncpy(s_name, (*dentptr)->name, 16);
+	/* Get short file name checksum value */
 	checksum = mkcksum((*dentptr)->name, (*dentptr)->ext);
 
 	do {
Signature · 1 line
2.10.0
#2 lore raw

PATCH 1/4 fs/fat: Remove two statements without effect

Hi Stefan,

Quoted 22 lines

fatlength is a local variable which is no more used after the assignment. s_name is not used in the function, save the strncpy.

---
 fs/fat/fat_write.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
fs/fat/fat_write.c +0 -1
index eb3a916..961ccd8 100644
@@ -183,7 +183,6 @@ static __u32 get_fatent_value(fsdata *mydata,
 __u32 entry) if (getsize > fatlength)
 			getsize = fatlength;
 
-		fatlength *= mydata->sect_size;	/* We want it

in bytes now */ startblock += mydata->fat_sect; /* Offset from
start of disk */

fs/fat/fat_write.c +0 -0
 		/* Write back the fatbuf to the disk */
@@ -326,10 +325,8 @@ fill_dir_slot(fsdata *mydata, dir_entry
 **dentptr, const char *l_name) dir_slot *slotptr = (dir_slot

fs/fat/fat_write.c fill_dir_slot(fsdata *mydata, dir_entry · line 332

Quoted 10 lines
fs/fat/fat_write.c +1 -3
 *)get_contents_vfatname_block; __u8 counter = 0, checksum;
 	int idx = 0, ret;
-	char s_name[16];
 
-	/* Get short file name and checksum value */
-	strncpy(s_name, (*dentptr)->name, 16);
+	/* Get short file name checksum value */
 	checksum = mkcksum((*dentptr)->name, (*dentptr)->ext);
 
 	do {
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#5 lore raw

PATCH 1/4 fs/fat: Remove two statements without effect

In reply to Stefan Brüns
Quoted 7 lines · Stefan Br?ns

fatlength is a local variable which is no more used after the assignment. s_name is not used in the function, save the strncpy.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160923/cb3fcce7/attachment.sig>
#6 lore raw

PATCH 2/4 fs/fat: Do not write unmodified fat entries to disk

In reply to a message not in the archive

The code caches 6 sectors of the FAT. On FAT traversal, the old contents needs to be flushed to disk, but only if any FAT entries had been modified. Explicitly flag the buffer on modification.

Currently, creating a new file traverses the whole FAT up to the first free cluster and rewrites the on-disk blocks.

---
 fs/fat/fat.c       |  1 +
 fs/fat/fat_write.c | 31 +++++++++++++++++++------------
 include/fat.h      |  1 +
 3 files changed, 21 insertions(+), 12 deletions(-)
fs/fat/fat.c +1 -0
index 826bd85..df9f2b5 100644
@@ -876,6 +876,7 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
 	}
 
 	mydata->fatbufnum = -1;
+	mydata->fat_dirty = 0;
 	mydata->fatbuf = memalign(ARCH_DMA_MINALIGN, FATBUFSIZE);
 	if (mydata->fatbuf == NULL) {
 		debug("Error: allocating memory\n");
fs/fat/fat_write.c +19 -12
index 961ccd8..babe9c8 100644
@@ -104,13 +104,19 @@ static __u8 num_of_fats;
 /*
  * Write fat buffer into block device
  */
-static int flush_fat_buffer(fsdata *mydata)
+static int flush_dirty_fat_buffer(fsdata *mydata)
 {
 	int getsize = FATBUFBLOCKS;
 	__u32 fatlength = mydata->fatlength;
 	__u8 *bufptr = mydata->fatbuf;
 	__u32 startblock = mydata->fatbufnum * FATBUFBLOCKS;
 
+	debug("debug: evicting %d, dirty: %d\n", mydata->fatbufnum,
+	      (int)mydata->fat_dirty);
+
+	if ((!mydata->fat_dirty) || (mydata->fatbufnum == -1))
+		return 0;
+
 	startblock += mydata->fat_sect;
 
 	if (getsize > fatlength)
@@ -130,6 +136,7 @@ static int flush_fat_buffer(fsdata *mydata)
 			return -1;
 		}
 	}
+	mydata->fat_dirty = 0;
 
 	return 0;
 }
@@ -186,10 +193,8 @@ static __u32 get_fatent_value(fsdata *mydata, __u32 entry)
 		startblock += mydata->fat_sect;	/* Offset from start of disk */
 
 		/* Write back the fatbuf to the disk */
-		if (mydata->fatbufnum != -1) {
-			if (flush_fat_buffer(mydata) < 0)
-				return -1;
-		}
+		if (flush_dirty_fat_buffer(mydata) < 0)
+			return -1;
 
 		if (disk_read(startblock, getsize, bufptr) < 0) {
 			debug("Error reading FAT blocks\n");
@@ -494,10 +499,8 @@ static int set_fatent_value(fsdata *mydata, __u32 entry, __u32 entry_value)
 		if (getsize > fatlength)
 			getsize = fatlength;
 
-		if (mydata->fatbufnum != -1) {
-			if (flush_fat_buffer(mydata) < 0)
-				return -1;
-		}
+		if (flush_dirty_fat_buffer(mydata) < 0)
+			return -1;
 
 		if (disk_read(startblock, getsize, bufptr) < 0) {
 			debug("Error reading FAT blocks\n");
@@ -506,6 +509,9 @@ static int set_fatent_value(fsdata *mydata, __u32 entry, __u32 entry_value)
 		mydata->fatbufnum = bufnum;
 	}
 
+	/* Mark as dirty */
+	mydata->fat_dirty = 1;
+
 	/* Set the actual entry */
 	switch (mydata->fatsize) {
 	case 32:
@@ -645,7 +651,7 @@ static void flush_dir_table(fsdata *mydata, dir_entry **dentptr)
 
 	dir_curclust = dir_newclust;
 
-	if (flush_fat_buffer(mydata) < 0)
+	if (flush_dirty_fat_buffer(mydata) < 0)
 		return;
 
 	memset(get_dentfromdir_block, 0x00,
@@ -675,7 +681,7 @@ static int clear_fatent(fsdata *mydata, __u32 entry)
 	}
 
 	/* Flush fat buffer */
-	if (flush_fat_buffer(mydata) < 0)
+	if (flush_dirty_fat_buffer(mydata) < 0)
 		return -1;
 
 	return 0;
@@ -1011,6 +1017,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
 	}
 
 	mydata->fatbufnum = -1;
+	mydata->fat_dirty = 0;
 	mydata->fatbuf = memalign(ARCH_DMA_MINALIGN, FATBUFSIZE);
 	if (mydata->fatbuf == NULL) {
 		debug("Error: allocating memory\n");
@@ -1111,7 +1118,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
 	debug("attempt to write 0x%llx bytes\n", *actwrite);
 
 	/* Flush fat buffer */
-	ret = flush_fat_buffer(mydata);
+	ret = flush_dirty_fat_buffer(mydata);
 	if (ret) {
 		printf("Error: flush fat buffer\n");
 		goto exit;
include/fat.h +1 -0
index 9d053e6..8ec91cd 100644
@@ -169,6 +169,7 @@ typedef struct {
 	int	fatsize;	/* Size of FAT in bits */
 	__u32	fatlength;	/* Length of FAT in sectors */
 	__u16	fat_sect;	/* Starting sector of the FAT */
+	__u8	fat_dirty;      /* Set if fatbuf has been modified */
 	__u32	rootdir_sect;	/* Start sector of root directory */
 	__u16	sect_size;	/* Size of sectors in bytes */
 	__u16	clust_size;	/* Size of clusters in sectors */
Signature · 1 line
2.10.0
#7 lore raw

PATCH 2/4 fs/fat: Do not write unmodified fat entries to disk

Hi Stefan,

Quoted 140 lines

The code caches 6 sectors of the FAT. On FAT traversal, the old contents needs to be flushed to disk, but only if any FAT entries had been modified. Explicitly flag the buffer on modification.

Currently, creating a new file traverses the whole FAT up to the first free cluster and rewrites the on-disk blocks.

---
 fs/fat/fat.c       |  1 +
 fs/fat/fat_write.c | 31 +++++++++++++++++++------------
 include/fat.h      |  1 +
 3 files changed, 21 insertions(+), 12 deletions(-)
fs/fat/fat.c +1 -0
index 826bd85..df9f2b5 100644
@@ -876,6 +876,7 @@ int do_fat_read_at(const char *filename, loff_t
 pos, void *buffer, }
 
 	mydata->fatbufnum = -1;
+	mydata->fat_dirty = 0;
 	mydata->fatbuf = memalign(ARCH_DMA_MINALIGN, FATBUFSIZE);
 	if (mydata->fatbuf == NULL) {
 		debug("Error: allocating memory\n");
fs/fat/fat_write.c +8 -1
index 961ccd8..babe9c8 100644
@@ -104,13 +104,19 @@ static __u8 num_of_fats;
 /*
  * Write fat buffer into block device
  */
-static int flush_fat_buffer(fsdata *mydata)
+static int flush_dirty_fat_buffer(fsdata *mydata)
 {
 	int getsize = FATBUFBLOCKS;
 	__u32 fatlength = mydata->fatlength;
 	__u8 *bufptr = mydata->fatbuf;
 	__u32 startblock = mydata->fatbufnum * FATBUFBLOCKS;
 
+	debug("debug: evicting %d, dirty: %d\n", mydata->fatbufnum,
+	      (int)mydata->fat_dirty);
+
+	if ((!mydata->fat_dirty) || (mydata->fatbufnum == -1))
+		return 0;
+
 	startblock += mydata->fat_sect;
 
 	if (getsize > fatlength)
@@ -130,6 +136,7 @@ static int flush_fat_buffer(fsdata *mydata)
 			return -1;
 		}
 	}
+	mydata->fat_dirty = 0;
 
 	return 0;
 }
@@ -186,10 +193,8 @@ static __u32 get_fatent_value(fsdata *mydata,

__u32 entry) startblock += mydata->fat_sect; /* Offset from
start of disk */

fs/fat/fat_write.c +11 -11
 		/* Write back the fatbuf to the disk */
-		if (mydata->fatbufnum != -1) {
-			if (flush_fat_buffer(mydata) < 0)
-				return -1;
-		}
+		if (flush_dirty_fat_buffer(mydata) < 0)
+			return -1;
 
 		if (disk_read(startblock, getsize, bufptr) < 0) {
 			debug("Error reading FAT blocks\n");
@@ -494,10 +499,8 @@ static int set_fatent_value(fsdata *mydata,
 __u32 entry, __u32 entry_value) if (getsize > fatlength)
 			getsize = fatlength;
 
-		if (mydata->fatbufnum != -1) {
-			if (flush_fat_buffer(mydata) < 0)
-				return -1;
-		}
+		if (flush_dirty_fat_buffer(mydata) < 0)
+			return -1;
 
 		if (disk_read(startblock, getsize, bufptr) < 0) {
 			debug("Error reading FAT blocks\n");
@@ -506,6 +509,9 @@ static int set_fatent_value(fsdata *mydata, __u32
 entry, __u32 entry_value) mydata->fatbufnum = bufnum;
 	}
 
+	/* Mark as dirty */
+	mydata->fat_dirty = 1;
+
 	/* Set the actual entry */
 	switch (mydata->fatsize) {
 	case 32:
@@ -645,7 +651,7 @@ static void flush_dir_table(fsdata *mydata,
 dir_entry **dentptr) 
 	dir_curclust = dir_newclust;
 
-	if (flush_fat_buffer(mydata) < 0)
+	if (flush_dirty_fat_buffer(mydata) < 0)
 		return;
 
 	memset(get_dentfromdir_block, 0x00,
@@ -675,7 +681,7 @@ static int clear_fatent(fsdata *mydata, __u32
 entry) }
 
 	/* Flush fat buffer */
-	if (flush_fat_buffer(mydata) < 0)
+	if (flush_dirty_fat_buffer(mydata) < 0)
 		return -1;
 
 	return 0;
@@ -1011,6 +1017,7 @@ static int do_fat_write(const char *filename,
 void *buffer, loff_t size, }
 
 	mydata->fatbufnum = -1;
+	mydata->fat_dirty = 0;
 	mydata->fatbuf = memalign(ARCH_DMA_MINALIGN, FATBUFSIZE);
 	if (mydata->fatbuf == NULL) {
 		debug("Error: allocating memory\n");
@@ -1111,7 +1118,7 @@ static int do_fat_write(const char *filename,
 void *buffer, loff_t size, debug("attempt to write 0x%llx bytes\n",
 *actwrite); 
 	/* Flush fat buffer */
-	ret = flush_fat_buffer(mydata);
+	ret = flush_dirty_fat_buffer(mydata);
 	if (ret) {
 		printf("Error: flush fat buffer\n");
 		goto exit;
include/fat.h +1 -0
index 9d053e6..8ec91cd 100644
@@ -169,6 +169,7 @@ typedef struct {
 	int	fatsize;	/* Size of FAT in bits */
 	__u32	fatlength;	/* Length of FAT in sectors */
 	__u16	fat_sect;	/* Starting sector of the FAT
 */
+	__u8	fat_dirty;      /* Set if fatbuf has been
Quoted 4 lines

modified */ __u32 rootdir_sect; /* Start sector of root
directory */ __u16 sect_size; /* Size of sectors in
bytes */ __u16 clust_size; /* Size of clusters in
sectors */

Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#8 lore raw

PATCH 2/4 fs/fat: Do not write unmodified fat entries to disk

In reply to Stefan Brüns
Quoted 9 lines · Stefan Br?ns

The code caches 6 sectors of the FAT. On FAT traversal, the old contents needs to be flushed to disk, but only if any FAT entries had been modified. Explicitly flag the buffer on modification.

Currently, creating a new file traverses the whole FAT up to the first free cluster and rewrites the on-disk blocks.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160923/6a83fa08/attachment.sig>
#9 lore raw

PATCH 3/4 fs/fat: Correct description of determine_fatent function

In reply to a message not in the archive

Current description does not match the function behaviour.

---
 fs/fat/fat_write.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
fs/fat/fat_write.c +3 -1
index babe9c8..0583af3 100644
@@ -528,7 +528,8 @@ static int set_fatent_value(fsdata *mydata, __u32 entry, __u32 entry_value)
 }
 
 /*
- * Determine the entry value at index 'entry' in a FAT (16/32) table
+ * Determine the next free cluster after 'entry' in a FAT (16/32) table
+ * and link it to 'entry'. EOC marker is not set on returned entry.
  */
 static __u32 determine_fatent(fsdata *mydata, __u32 entry)
 {
@@ -537,6 +538,7 @@ static __u32 determine_fatent(fsdata *mydata, __u32 entry)
 	while (1) {
 		next_fat = get_fatent_value(mydata, next_entry);
 		if (next_fat == 0) {
+			/* found free entry, link to entry */
 			set_fatent_value(mydata, entry, next_entry);
 			break;
 		}
Signature · 1 line
2.10.0
#10 lore raw

PATCH 3/4 fs/fat: Correct description of determine_fatent function

Hi Stefan,

Quoted 23 lines

Current description does not match the function behaviour.

---
 fs/fat/fat_write.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
fs/fat/fat_write.c +1 -1
index babe9c8..0583af3 100644
@@ -528,7 +528,8 @@ static int set_fatent_value(fsdata *mydata, __u32
 entry, __u32 entry_value) }
 
 /*
- * Determine the entry value at index 'entry' in a FAT (16/32) table
+ * Determine the next free cluster after 'entry' in a FAT (16/32)

table
+ * and link it to 'entry'. EOC marker is not set on returned entry. */
static __u32 determine_fatent(fsdata *mydata, __u32 entry) {

fs/fat/fat_write.c static __u32 determine_fatent(fsdata *mydata, · line 544

Quoted 7 lines
fs/fat/fat_write.c +1 -0
@@ -537,6 +538,7 @@ static __u32 determine_fatent(fsdata *mydata,
 __u32 entry) while (1) {
 		next_fat = get_fatent_value(mydata, next_entry);
 		if (next_fat == 0) {
+			/* found free entry, link to entry */
 			set_fatent_value(mydata, entry, next_entry);
 			break;
 		}
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#11 lore raw

PATCH 3/4 fs/fat: Correct description of determine_fatent function

In reply to Stefan Brüns
Quoted 4 lines · Stefan Br?ns

Current description does not match the function behaviour.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160923/157dde13/attachment.sig>
#12 lore raw

PATCH 4/4 cmd/fat: Do not crash on write when <bytes> is not specified

In reply to a message not in the archive

argc is checked, but is off by one. In case <bytes> is not specified, create an empty file, which is identical to the ext4write behaviour.

---
 cmd/fat.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
cmd/fat.c +2 -2
index 4e20746..ad1dc2a 100644
@@ -126,7 +126,7 @@ static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
 		return 1;
 	}
 	addr = simple_strtoul(argv[3], NULL, 16);
-	count = simple_strtoul(argv[5], NULL, 16);
+	count = (argc <= 5) ? 0 : simple_strtoul(argv[5], NULL, 16);
 
 	buf = map_sysmem(addr, count);
 	ret = file_fat_write(argv[4], buf, 0, count, &size);
@@ -145,7 +145,7 @@ static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
 U_BOOT_CMD(
 	fatwrite,	6,	0,	do_fat_fswrite,
 	"write file into a dos filesystem",
-	"<interface> <dev[:part]> <addr> <filename> <bytes>\n"
+	"<interface> <dev[:part]> <addr> <filename> [<bytes>]\n"
 	"    - write file 'filename' from the address 'addr' in RAM\n"
 	"      to 'dev' on 'interface'"
 );
Signature · 1 line
2.10.0
#13 lore raw

PATCH 4/4 cmd/fat: Do not crash on write when <bytes> is not specified

Quoted 7 lines · Stefan Br?ns

argc is checked, but is off by one. In case <bytes> is not specified, create an empty file, which is identical to the ext4write behaviour.

---
 cmd/fat.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
#14 lore raw

PATCH 4/4 cmd/fat: Do not crash on write when <bytes> is not specified

In reply to Stefan Brüns
Quoted 5 lines · Stefan Br?ns

argc is checked, but is off by one. In case <bytes> is not specified, create an empty file, which is identical to the ext4write behaviour.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160923/1ac4ca59/attachment.sig>