This is the mail archive of the ecos-discuss@sources.redhat.com 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]

Re: fatfs lseek EOF bug


Gratian Crisan wrote:

Hi,

please see my answers below:

On Tuesday 10 May 2005 09:48, Savin Zlobec wrote:


Gratian Crisan wrote:


Hi all,

I think I've found a bug in the ecos FAT implementation for lseek
function. (fatfs_fo_lseek).
When calling the function like this 'lseek(fd, 0,  SEEK_CUR)' to get the
current file position and the postion is right at the end of the file the
fat lseek function returns end of file error EEOF. I've looked at the
other filesystems from ecos and did a test in linux and the correct
behavior seems to be to return the current position of the end of file if
the read/write pointer is at the end of file (equal with the file size).
This bug occurs for example when creating a new file, writing some data in
it and calling lseek(fd, 0, SEEK_CUR) to get the current file position.

Suggestions?

[snip]

See the file attached. The test is for an MMC driver but should be pretty straight forward to adapt (only the mount command should be changed).
The test creates a file and writes blocks of data into it while printing the current file offset. In a new file after writing the first block, for which the value returned is 0, the value returned by lseek function is -1. The strange thing is that if you overwrite an existing file the lseek function correctly returns the current file offset (equal to EOF).


Found the BUG -- Please try the attached patch and let me know if it works.

savin

Index: src/fatfs_supp.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/fs/fat/current/src/fatfs_supp.c,v
retrieving revision 1.3
diff -u -r1.3 fatfs_supp.c
--- src/fatfs_supp.c	22 Oct 2004 14:10:23 -0000	1.3
+++ src/fatfs_supp.c	10 May 2005 10:43:14 -0000
@@ -1172,8 +1172,10 @@
     // Err could be EEOF wich means that the given 
     // offset if out of given file (cluster chain)
 
-    if (ENOERR == err)
-        *pos = new_pos; 
+    if (EEOF == err)
+        new_pos.cluster_pos = disk->cluster_size; 
+    
+    *pos = new_pos; 
     
     return err;
 } 
@@ -2056,11 +2058,18 @@
              fatfs_data_pos_t  *pos,
              cyg_uint32         offset)
 {
+    int err;
+    
     CYG_CHECK_DATA_PTRC(disk);
     CYG_CHECK_DATA_PTRC(file);
     CYG_CHECK_DATA_PTRC(pos);
     
-    return get_position_from_off(disk, file->cluster, offset, pos, CO_NONE);
+    err = get_position_from_off(disk, file->cluster, offset, pos, CO_NONE);
+
+    if (EEOF == err && offset == file->size)
+        return ENOERR;
+    else
+        return err;
 }
 
 // -------------------------------------------------------------------------

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

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