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 <[EMAIL PROTECTED]>
+ Savin Zlobec <[EMAIL PROTECTED]>
+
+ * src/fatfs_supp.c: Fixed FAT32 cluster handling in
+ fatfs_delete_file and fatfs_rename_file.
+
2007-01-27 Andrew Lunn <[EMAIL PROTECTED]>
* 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;
}