This is the mail archive of the ecos-patches@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
             }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]