diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-05-07 16:30:37 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-05-11 13:58:43 +0200 |
commit | 30d412469c930fe4150ad2b9a321eea2747ec6f4 (patch) | |
tree | d91c4bfaa8e968a6da87ba9b5860502758d4a26f /cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c | |
parent | pc386 - Clock driver compiles again plus clean up (diff) | |
download | rtems-30d412469c930fe4150ad2b9a321eea2747ec6f4.tar.bz2 |
Filesystem: PR1398: Fix lseek() mechanic
According to POSIX the lseek() function shall not, by itself, extend the
size of a file.
Remove the size field of rtems_libio_t. A file has only one size but
may have multiple open file descriptors. Thus a file size field in the
file descriptor may lead to inconsistencies.
New default handlers rtems_filesystem_default_lseek_file() and
rtems_filesystem_default_lseek_directory().
Diffstat (limited to 'cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c')
-rw-r--r-- | cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c index 0a15652dfc..b2ff45df8b 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c @@ -72,7 +72,6 @@ rtems_rfs_rtems_file_open (rtems_libio_t* iop, if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_OPEN)) printf("rtems-rfs: file-open: handle:%p\n", file); - iop->size = rtems_rfs_file_size (file); rtems_rfs_rtems_set_iop_file_handle (iop, file); rtems_rfs_rtems_unlock (fs); @@ -245,8 +244,6 @@ rtems_rfs_rtems_file_write (rtems_libio_t* iop, } } - iop->size = rtems_rfs_file_size (file); - rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file)); return write; @@ -282,26 +279,32 @@ rtems_rfs_rtems_file_lseek (rtems_libio_t* iop, int whence) { rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop); - rtems_rfs_pos pos; - int rc; + off_t old_offset; + off_t new_offset; if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK)) printf("rtems-rfs: file-lseek: handle:%p offset:%" PRIdoff_t "\n", file, offset); rtems_rfs_rtems_lock (rtems_rfs_file_fs (file)); - pos = iop->offset; - - rc = rtems_rfs_file_seek (file, pos, &pos); - if (rc) + old_offset = iop->offset; + new_offset = rtems_filesystem_default_lseek_file (iop, offset, whence); + if (new_offset != -1) { - rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file)); - return rtems_rfs_rtems_error ("file_lseek: lseek", rc); + rtems_rfs_pos pos = iop->offset; + int rc = rtems_rfs_file_seek (file, pos, &pos); + + if (rc) + { + rtems_rfs_rtems_error ("file_lseek: lseek", rc); + iop->offset = old_offset; + new_offset = -1; + } } rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file)); - return iop->offset; + return new_offset; } /** @@ -327,8 +330,6 @@ rtems_rfs_rtems_file_ftruncate (rtems_libio_t* iop, if (rc) rc = rtems_rfs_rtems_error ("file_ftruncate: set size", rc); - iop->size = rtems_rfs_file_size (file); - rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file)); return rc; |