This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
FAT32 fixes
- From: Savin Zlobec <savinz at users dot sourceforge dot net>
- To: ecos-patches at sourceware dot org
- Cc: a8850607 at stmail dot fju dot edu dot tw
- Date: Tue, 06 Feb 2007 08:48:24 +0100
- Subject: FAT32 fixes
The attached patch fixes FAT32 cluster handling
in fatfs_delete_file and fatfs_rename_file. File
deletion and directory movement should now work
fine throughout FAT32 fs.
--
savin
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/fs/fat/current/ChangeLog,v
retrieving revision 1.14
diff -u -5 -r1.14 ChangeLog
--- ChangeLog 27 Jan 2007 14:01:44 -0000 1.14
+++ ChangeLog 6 Feb 2007 07:39:49 -0000
@@ -1,5 +1,11 @@
+2007-02-05 Ya-Chau Yang <a8850607@stmail.fju.edu.tw>
+ Savin Zlobec <savinz@users.sourceforge.net>
+
+ * src/fatfs_supp.c: Fixed FAT32 cluster handling in
+ fatfs_delete_file and fatfs_rename_file.
+
2007-01-27 Andrew Lunn <andrew.lunn@ascom.ch>
* tests/fatfs1.c: Fixed the format string to diag_printf()
to remove compiler warnings.
Index: src/fatfs_supp.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/fs/fat/current/src/fatfs_supp.c,v
retrieving revision 1.6
diff -u -5 -r1.6 fatfs_supp.c
--- src/fatfs_supp.c 3 Aug 2005 20:40:48 -0000 1.6
+++ src/fatfs_supp.c 6 Feb 2007 07:39:52 -0000
@@ -1263,11 +1263,11 @@
diag_printf("FAT: FDE crt time: %u\n", dentry->crt_time);
diag_printf("FAT: FDE crt date: %u\n", dentry->crt_date);
diag_printf("FAT: FDE acc date: %u\n", dentry->acc_date);
diag_printf("FAT: FDE wrt time: %u\n", dentry->wrt_time);
diag_printf("FAT: FDE wrt date: %u\n", dentry->wrt_date);
- diag_printf("FAT: FDE cluster: %u\n", dentry->cluster);
+ diag_printf("FAT: FDE cluster: %u\n", (dentry->cluster_HI << 16) | dentry->cluster);
diag_printf("FAT: FDE size: %u\n", dentry->size);
}
#endif // TDE
// -------------------------------------------------------------------------
@@ -2164,11 +2164,11 @@
if (i > 2)
return EPERM;
}
// Free file clusters
- free_cluster_chain(disk, raw_dentry.cluster);
+ free_cluster_chain(disk, raw_dentry.cluster | (raw_dentry.cluster_HI << 16));
raw_dentry_set_deleted(disk, &raw_dentry);
err = write_raw_dentry(disk, &file->disk_pos, &raw_dentry);
return err;
}
@@ -2402,10 +2402,11 @@
// Deleate dentry at old location
raw_dentry_set_deleted(disk, &raw_dentry);
raw_dentry.size = 0;
raw_dentry.cluster = 0;
+ raw_dentry.cluster_HI = 0;
err = write_raw_dentry(disk, &target->disk_pos, &raw_dentry);
if (err != ENOERR)
return err;
// Set file new position and parent cluster
@@ -2434,11 +2435,12 @@
else if (err != ENOERR)
return err;
if (0 == strncmp("..", raw_cdentry.name, 2))
{
- raw_cdentry.cluster = dir2->cluster;
+ raw_cdentry.cluster = dir2->cluster & 0xFFFF;
+ raw_cdentry.cluster_HI = dir2->cluster >> 16;
err = write_raw_dentry(disk, &pos, &raw_cdentry);
if (err != ENOERR)
return err;
break;
}