[rtems commit] dosfs: Support ctime and mtime

Sebastian Huber sebh at rtems.org
Thu Oct 23 08:33:54 UTC 2014


Module:    rtems
Branch:    master
Commit:    a7eaaae85b9b536b4d77c86e39c138d7c4f8f8fc
Changeset: http://git.rtems.org/rtems/commit/?id=a7eaaae85b9b536b4d77c86e39c138d7c4f8f8fc

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Oct 20 09:33:34 2014 +0200

dosfs: Support ctime and mtime

Implement ctime and mtime updates according to POSIX.  The ctime is
mapped to the FAT create time and date.  The mtime is mapped to the FAT
last modified time and date.  For the atime use the mtime for
simplicity.

---

 cpukit/libfs/src/dosfs/fat_file.c            |   34 +++++++++
 cpukit/libfs/src/dosfs/fat_file.h            |   37 ++++++++++
 cpukit/libfs/src/dosfs/msdos.h               |   22 +-----
 cpukit/libfs/src/dosfs/msdos_create.c        |   12 ++--
 cpukit/libfs/src/dosfs/msdos_dir.c           |    2 +
 cpukit/libfs/src/dosfs/msdos_file.c          |   76 +++-----------------
 cpukit/libfs/src/dosfs/msdos_handlers_file.c |    2 +-
 cpukit/libfs/src/dosfs/msdos_init.c          |   18 +++++-
 cpukit/libfs/src/dosfs/msdos_misc.c          |  100 ++++++++++++++++----------
 9 files changed, 170 insertions(+), 133 deletions(-)

diff --git a/cpukit/libfs/src/dosfs/fat_file.c b/cpukit/libfs/src/dosfs/fat_file.c
index 2899f1b..1f20926 100644
--- a/cpukit/libfs/src/dosfs/fat_file.c
+++ b/cpukit/libfs/src/dosfs/fat_file.c
@@ -165,6 +165,38 @@ fat_file_reopen(fat_file_fd_t *fat_fd)
     return RC_OK;
 }
 
+int
+fat_file_update(fat_fs_info_t *fs_info, fat_file_fd_t *fat_fd)
+{
+    int ret_rc = RC_OK;
+
+    /*
+     * if fat-file descriptor is not marked as "removed", synchronize
+     * size, first cluster number, write time and date fields of the file
+     */
+    if (!FAT_FILE_IS_REMOVED(fat_fd))
+    {
+        int rc;
+
+        if (fat_fd->fat_file_type == FAT_FILE)
+        {
+            rc = fat_file_write_first_cluster_num(fs_info, fat_fd);
+            if (rc != RC_OK)
+                ret_rc = rc;
+
+            rc = fat_file_write_file_size(fs_info, fat_fd);
+            if (rc != RC_OK)
+                ret_rc = rc;
+        }
+
+        rc = fat_file_write_time_and_date(fs_info, fat_fd);
+        if (rc != RC_OK)
+            ret_rc = rc;
+    }
+
+    return ret_rc;
+}
+
 /* fat_file_close --
  *     Close fat-file. If count of links to fat-file
  *     descriptor is greater than 1 (i.e. somebody esle holds pointer
@@ -204,6 +236,8 @@ fat_file_close(
     {
         uint32_t key = fat_construct_key(fs_info, &fat_fd->dir_pos.sname);
 
+        fat_file_update(fs_info, fat_fd);
+
         if (fat_fd->flags & FAT_FILE_REMOVED)
         {
             rc = fat_file_truncate(fs_info, fat_fd, 0);
diff --git a/cpukit/libfs/src/dosfs/fat_file.h b/cpukit/libfs/src/dosfs/fat_file.h
index 79af62a..b162d8a 100644
--- a/cpukit/libfs/src/dosfs/fat_file.h
+++ b/cpukit/libfs/src/dosfs/fat_file.h
@@ -88,6 +88,7 @@ typedef struct fat_file_fd_s
     fat_dir_pos_t    dir_pos;
     uint8_t          flags;
     fat_file_map_t   map;
+    time_t           ctime;
     time_t           mtime;
 
 } fat_file_fd_t;
@@ -139,6 +140,22 @@ fat_construct_key(
               ((pos->ofs >> 5) & (FAT_DIRENTRIES_PER_SEC512 - 1)) );
 }
 
+static inline void fat_file_set_ctime(fat_file_fd_t *fat_fd, time_t t)
+{
+    fat_fd->ctime = t;
+}
+
+static inline void fat_file_set_mtime(fat_file_fd_t *fat_fd, time_t t)
+{
+    fat_fd->mtime = t;
+}
+
+static inline void fat_file_set_ctime_mtime(fat_file_fd_t *fat_fd, time_t t)
+{
+    fat_fd->ctime = t;
+    fat_fd->mtime = t;
+}
+
 /* Prototypes for "fat-file" operations */
 int
 fat_file_open(fat_fs_info_t                         *fs_info,
@@ -192,6 +209,26 @@ void
 fat_file_mark_removed(fat_fs_info_t                        *fs_info,
                       fat_file_fd_t                        *fat_fd);
 
+int
+fat_file_size(fat_fs_info_t                        *fs_info,
+              fat_file_fd_t                        *fat_fd);
+
+int
+fat_file_write_first_cluster_num(fat_fs_info_t *fs_info,
+                                 fat_file_fd_t *fat_fd);
+
+int
+fat_file_write_file_size(fat_fs_info_t *fs_info,
+                         fat_file_fd_t *fat_fd);
+
+int
+fat_file_write_time_and_date(fat_fs_info_t *fs_info,
+                             fat_file_fd_t *fat_fd);
+
+int
+fat_file_update(fat_fs_info_t *fs_info,
+                fat_file_fd_t *fat_fd);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpukit/libfs/src/dosfs/msdos.h b/cpukit/libfs/src/dosfs/msdos.h
index bb191fe..baa34d7 100644
--- a/cpukit/libfs/src/dosfs/msdos.h
+++ b/cpukit/libfs/src/dosfs/msdos.h
@@ -134,6 +134,8 @@ typedef rtems_filesystem_node_types_t msdos_node_type_t;
 #define MSDOS_FILE_WDATE_OFFSET           24
 #define MSDOS_FILE_WTIME_OFFSET           22
 #define MSDOS_FILE_ADATE_OFFSET           18
+#define MSDOS_FILE_CDATE_OFFSET           16
+#define MSDOS_FILE_CTIME_OFFSET           14
 
 /*
  * Possible values of DIR_Attr field of 32 bytes long FAT Directory Entry
@@ -333,8 +335,6 @@ int msdos_initialize_support(
   rtems_dosfs_convert_control             *converter
 );
 
-int msdos_file_close(rtems_libio_t *iop /* IN  */);
-
 ssize_t msdos_file_read(
   rtems_libio_t *iop,              /* IN  */
   void          *buffer,           /* IN  */
@@ -360,8 +360,6 @@ msdos_file_ftruncate(
 
 int msdos_file_sync(rtems_libio_t *iop);
 
-int msdos_file_datasync(rtems_libio_t *iop);
-
 ssize_t msdos_dir_read(
   rtems_libio_t *iop,              /* IN  */
   void          *buffer,           /* IN  */
@@ -461,28 +459,12 @@ void msdos_date_unix2dos(
 
 unsigned int msdos_date_dos2unix(unsigned int dd, unsigned int dt);
 
-int msdos_set_first_cluster_num(
-  rtems_filesystem_mount_table_entry_t *mt_entry,
-  fat_file_fd_t                        *fat_fd
-);
-
-int msdos_set_file_size(
-  rtems_filesystem_mount_table_entry_t *mt_entry,
-  fat_file_fd_t                        *fat_fd
-);
-
 int msdos_set_first_char4file_name(
   rtems_filesystem_mount_table_entry_t *mt_entry,
   fat_dir_pos_t                        *dir_pos,
   unsigned char                         first_char
 );
 
-int msdos_set_dir_wrt_time_and_date(
-    rtems_filesystem_mount_table_entry_t *mt_entry,
-    fat_file_fd_t                        *fat_fd
-);
-
-
 int msdos_dir_is_empty(
   rtems_filesystem_mount_table_entry_t *mt_entry,
   fat_file_fd_t                        *fat_fd,
diff --git a/cpukit/libfs/src/dosfs/msdos_create.c b/cpukit/libfs/src/dosfs/msdos_create.c
index 735e053..9eab2fb 100644
--- a/cpukit/libfs/src/dosfs/msdos_create.c
+++ b/cpukit/libfs/src/dosfs/msdos_create.c
@@ -70,7 +70,7 @@ msdos_creat_node(const rtems_filesystem_location_info_t  *parent_loc,
     msdos_fs_info_t  *fs_info = parent_loc->mt_entry->fs_info;
     fat_file_fd_t    *parent_fat_fd = parent_loc->node_access;
     fat_file_fd_t    *fat_fd = NULL;
-    time_t            time_ret = 0;
+    time_t            now;
     uint16_t          time_val = 0;
     uint16_t          date = 0;
     fat_dir_pos_t     dir_pos;
@@ -102,11 +102,10 @@ msdos_creat_node(const rtems_filesystem_location_info_t  *parent_loc,
     *MSDOS_DIR_NT_RES(short_node) = MSDOS_RES_NT_VALUE;
 
     /* set up last write date and time */
-    time_ret = time(NULL);
-    if ( time_ret == -1 )
-        return -1;
+    now = time(NULL);
+    fat_file_set_ctime_mtime(parent_fat_fd, now);
 
-    msdos_date_unix2dos(time_ret, &date, &time_val);
+    msdos_date_unix2dos(now, &date, &time_val);
     *MSDOS_DIR_CRT_TIME(short_node) = CT_LE_W(time_val);
     *MSDOS_DIR_CRT_DATE(short_node) = CT_LE_W(date);
     *MSDOS_DIR_WRITE_TIME(short_node) = CT_LE_W(time_val);
@@ -192,6 +191,7 @@ msdos_creat_node(const rtems_filesystem_location_info_t  *parent_loc,
         fat_fd->fat_file_size = 0;
         fat_fd->fat_file_type = FAT_DIRECTORY;
         fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
+        fat_file_set_ctime_mtime(fat_fd, now);
 
         /*
          * dot and dotdot entries are identical to new node except the
@@ -260,7 +260,7 @@ msdos_creat_node(const rtems_filesystem_location_info_t  *parent_loc,
         }
 
         /* write first cluster num of a new directory to disk */
-        rc = msdos_set_first_cluster_num(parent_loc->mt_entry, fat_fd);
+        rc = fat_file_write_first_cluster_num(&fs_info->fat, fat_fd);
         if (rc != RC_OK)
             goto error;
 
diff --git a/cpukit/libfs/src/dosfs/msdos_dir.c b/cpukit/libfs/src/dosfs/msdos_dir.c
index f311d89..b10ed9e 100644
--- a/cpukit/libfs/src/dosfs/msdos_dir.c
+++ b/cpukit/libfs/src/dosfs/msdos_dir.c
@@ -403,6 +403,8 @@ msdos_dir_stat(
     buf->st_size = fat_fd->fat_file_size;
     buf->st_blocks = fat_fd->fat_file_size >> FAT_SECTOR512_BITS;
     buf->st_blksize = fs_info->fat.vol.bps;
+    buf->st_atime = fat_fd->mtime;
+    buf->st_ctime = fat_fd->ctime;
     buf->st_mtime = fat_fd->mtime;
 
     rtems_semaphore_release(fs_info->vol_sema);
diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c
index 33fe525..b678d84 100644
--- a/cpukit/libfs/src/dosfs/msdos_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_file.c
@@ -30,70 +30,6 @@
 
 #include "msdos.h"
 
-static int
-msdos_file_update(rtems_libio_t *iop)
-{
-    int              rc = RC_OK;
-    fat_file_fd_t   *fat_fd = iop->pathinfo.node_access;
-
-    /*
-     * if fat-file descriptor is not marked as "removed", synchronize
-     * size, first cluster number, write time and date fields of the file
-     */
-    if (!FAT_FILE_IS_REMOVED(fat_fd))
-    {
-        rc = msdos_set_first_cluster_num(iop->pathinfo.mt_entry, fat_fd);
-        if (rc != RC_OK)
-        {
-            return rc;
-        }
-
-        rc = msdos_set_file_size(iop->pathinfo.mt_entry, fat_fd);
-        if (rc != RC_OK)
-        {
-            return rc;
-        }
-
-        rc = msdos_set_dir_wrt_time_and_date(iop->pathinfo.mt_entry, fat_fd);
-        if (rc != RC_OK)
-        {
-            return rc;
-        }
-    }
-
-    return rc;
-}
-
-/* msdos_file_close --
- *     Close fat-file which correspondes to the file. If fat-file descriptor
- *     which correspondes to the file is not marked "removed", synchronize
- *     size, first cluster number, write time and date fields of the file.
- *
- * PARAMETERS:
- *     iop - file control block
- *
- * RETURNS:
- *     RC_OK, if file closed successfully, or -1 if error occured (errno set
- *     appropriately)
- */
-int
-msdos_file_close(rtems_libio_t *iop)
-{
-    int                rc = RC_OK;
-    rtems_status_code  sc = RTEMS_SUCCESSFUL;
-    msdos_fs_info_t   *fs_info = iop->pathinfo.mt_entry->fs_info;
-
-    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
-                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
-    if (sc != RTEMS_SUCCESSFUL)
-        rtems_set_errno_and_return_minus_one(EIO);
-
-    rc = msdos_file_update(iop);
-
-    rtems_semaphore_release(fs_info->vol_sema);
-    return rc;
-}
-
 /* msdos_file_read --
  *     This routine read from file pointed to by file control block into
  *     the specified data buffer provided by user
@@ -174,6 +110,9 @@ msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
     if (iop->offset > fat_fd->fat_file_size)
         fat_fd->fat_file_size = iop->offset;
 
+    if (ret > 0)
+        fat_file_set_ctime_mtime(fat_fd, time(NULL));
+
     rtems_semaphore_release(fs_info->vol_sema);
     return ret;
 }
@@ -211,6 +150,8 @@ msdos_file_stat(
     buf->st_blocks = ((fat_fd->fat_file_size + cl_mask) & ~cl_mask)
       >> FAT_SECTOR512_BITS;
     buf->st_blksize = fs_info->fat.vol.bpc;
+    buf->st_atime = fat_fd->mtime;
+    buf->st_ctime = fat_fd->ctime;
     buf->st_mtime = fat_fd->mtime;
 
     rtems_semaphore_release(fs_info->vol_sema);
@@ -259,8 +200,10 @@ msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
         }
     }
 
-    if (rc == RC_OK) {
+    if (rc == RC_OK)
+    {
         fat_fd->fat_file_size = length;
+        fat_file_set_ctime_mtime(fat_fd, time(NULL));
     }
 
     rtems_semaphore_release(fs_info->vol_sema);
@@ -284,13 +227,14 @@ msdos_file_sync(rtems_libio_t *iop)
     int                rc = RC_OK;
     rtems_status_code  sc = RTEMS_SUCCESSFUL;
     msdos_fs_info_t   *fs_info = iop->pathinfo.mt_entry->fs_info;
+    fat_file_fd_t     *fat_fd = iop->pathinfo.node_access;
 
     sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
                                 MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
     if (sc != RTEMS_SUCCESSFUL)
         rtems_set_errno_and_return_minus_one(EIO);
 
-    rc = msdos_file_update(iop);
+    rc = fat_file_update(&fs_info->fat, fat_fd);
     if (rc != RC_OK)
     {
         rtems_semaphore_release(fs_info->vol_sema);
diff --git a/cpukit/libfs/src/dosfs/msdos_handlers_file.c b/cpukit/libfs/src/dosfs/msdos_handlers_file.c
index dbc949f..0bea6e1 100644
--- a/cpukit/libfs/src/dosfs/msdos_handlers_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_handlers_file.c
@@ -23,7 +23,7 @@
 
 const rtems_filesystem_file_handlers_r msdos_file_handlers = {
   .open_h = rtems_filesystem_default_open,
-  .close_h = msdos_file_close,
+  .close_h = rtems_filesystem_default_close,
   .read_h = msdos_file_read,
   .write_h = msdos_file_write,
   .ioctl_h = rtems_filesystem_default_ioctl,
diff --git a/cpukit/libfs/src/dosfs/msdos_init.c b/cpukit/libfs/src/dosfs/msdos_init.c
index 2846dbd..08c8136 100644
--- a/cpukit/libfs/src/dosfs/msdos_init.c
+++ b/cpukit/libfs/src/dosfs/msdos_init.c
@@ -35,6 +35,22 @@ static int msdos_clone_node_info(rtems_filesystem_location_info_t *loc)
     return fat_file_reopen(fat_fd);
 }
 
+static int msdos_utime(
+  const rtems_filesystem_location_info_t *loc,
+  time_t                                  actime,
+  time_t                                  modtime
+)
+{
+    fat_file_fd_t *fat_fd = loc->node_access;
+
+    if (actime != modtime)
+        rtems_set_errno_and_return_minus_one( ENOTSUP );
+
+    fat_file_set_mtime(fat_fd, modtime);
+
+    return RC_OK;
+}
+
 const rtems_filesystem_operations_table  msdos_ops = {
   .lock_h         =  msdos_lock,
   .unlock_h       =  msdos_unlock,
@@ -52,7 +68,7 @@ const rtems_filesystem_operations_table  msdos_ops = {
   .fsmount_me_h   =  rtems_dosfs_initialize,
   .unmount_h      =  rtems_filesystem_default_unmount,
   .fsunmount_me_h =  msdos_shut_down,
-  .utime_h        =  rtems_filesystem_default_utime,
+  .utime_h        =  msdos_utime,
   .symlink_h      =  rtems_filesystem_default_symlink,
   .readlink_h     =  rtems_filesystem_default_readlink,
   .rename_h       =  msdos_rename,
diff --git a/cpukit/libfs/src/dosfs/msdos_misc.c b/cpukit/libfs/src/dosfs/msdos_misc.c
index 03ec38f..faa62a5 100644
--- a/cpukit/libfs/src/dosfs/msdos_misc.c
+++ b/cpukit/libfs/src/dosfs/msdos_misc.c
@@ -380,6 +380,11 @@ msdos_find_name(
 
         fat_fd->mtime = msdos_date_dos2unix(CF_LE_W(date), CF_LE_W(time_val));
 
+        time_val = *MSDOS_DIR_CRT_TIME(node_entry);
+        date = *MSDOS_DIR_CRT_DATE(node_entry);
+
+        fat_fd->ctime = msdos_date_dos2unix(CF_LE_W(date), CF_LE_W(time_val));
+
         if ((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_DIRECTORY)
         {
             fat_fd->fat_file_type = FAT_DIRECTORY;
@@ -670,12 +675,12 @@ msdos_get_dotdot_dir_info_cluster_num_and_offset(
 }
 
 
-/* msdos_set_dir_wrt_time_and_date --
+/* fat_file_write_time_and_date --
  *     Write last write date and time for a file to the disk (to corresponded
  *     32bytes node)
  *
  * PARAMETERS:
- *     mt_entry - mount table entry
+ *     fs_info  - fat fs info
  *     fat_fd   - fat-file descriptor
  *
  * RETURNS:
@@ -683,50 +688,69 @@ msdos_get_dotdot_dir_info_cluster_num_and_offset(
  *
  */
 int
-msdos_set_dir_wrt_time_and_date(
-    rtems_filesystem_mount_table_entry_t *mt_entry,
+fat_file_write_time_and_date(
+    fat_fs_info_t                        *fs_info,
     fat_file_fd_t                        *fat_fd
     )
 {
-    ssize_t          ret1 = 0, ret2 = 0, ret3 = 0;
-    msdos_fs_info_t *fs_info = mt_entry->fs_info;
+    int              rc = RC_OK;
+    ssize_t          ret;
     uint16_t         time_val;
     uint16_t         date;
     uint32_t         sec = 0;
     uint32_t         byte = 0;
 
-    msdos_date_unix2dos(fat_fd->mtime, &date, &time_val);
-
     /*
      * calculate input for fat_sector_write: convert (cluster num, offset) to
      * (sector num, new offset)
      */
-    sec = fat_cluster_num_to_sector_num(&fs_info->fat, fat_fd->dir_pos.sname.cln);
-    sec += (fat_fd->dir_pos.sname.ofs >> fs_info->fat.vol.sec_log2);
+    sec = fat_cluster_num_to_sector_num(fs_info, fat_fd->dir_pos.sname.cln);
+    sec += (fat_fd->dir_pos.sname.ofs >> fs_info->vol.sec_log2);
     /* byte points to start of 32bytes structure */
-    byte = fat_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1);
+    byte = fat_fd->dir_pos.sname.ofs & (fs_info->vol.bps - 1);
+
+    msdos_date_unix2dos(fat_fd->mtime, &date, &time_val);
 
     time_val = CT_LE_W(time_val);
-    ret1 = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_WTIME_OFFSET,
-                            2, (char *)(&time_val));
+    ret = fat_sector_write(fs_info, sec, byte + MSDOS_FILE_WTIME_OFFSET,
+                           2, (char *)(&time_val));
+    if ( ret < 0 )
+        rc = -1;
+
     date = CT_LE_W(date);
-    ret2 = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_WDATE_OFFSET,
-                            2, (char *)(&date));
-    ret3 = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_ADATE_OFFSET,
-                            2, (char *)(&date));
+    ret = fat_sector_write(fs_info, sec, byte + MSDOS_FILE_WDATE_OFFSET,
+                           2, (char *)(&date));
+    if ( ret < 0 )
+        rc = -1;
 
-    if ( (ret1 < 0) || (ret2 < 0) || (ret3 < 0) )
-        return -1;
+    ret = fat_sector_write(fs_info, sec, byte + MSDOS_FILE_ADATE_OFFSET,
+                           2, (char *)(&date));
+    if ( ret < 0 )
+        rc = -1;
 
-    return RC_OK;
+    msdos_date_unix2dos(fat_fd->ctime, &date, &time_val);
+
+    time_val = CT_LE_W(time_val);
+    ret = fat_sector_write(fs_info, sec, byte + MSDOS_FILE_CTIME_OFFSET,
+                           2, (char *)(&time_val));
+    if ( ret < 0 )
+        rc = -1;
+
+    date = CT_LE_W(date);
+    ret = fat_sector_write(fs_info, sec, byte + MSDOS_FILE_CDATE_OFFSET,
+                           2, (char *)(&date));
+    if ( ret < 0 )
+        rc = -1;
+
+    return rc;
 }
 
-/* msdos_set_first_cluster_num --
+/* fat_set_first_cluster_num --
  *     Write number of first cluster of the file to the disk (to corresponded
  *     32bytes slot)
  *
  * PARAMETERS:
- *     mt_entry - mount table entry
+ *     fs_info  - fat fs info
  *     fat_fd   - fat-file descriptor
  *
  * RETURNS:
@@ -734,13 +758,12 @@ msdos_set_dir_wrt_time_and_date(
  *
  */
 int
-msdos_set_first_cluster_num(
-    rtems_filesystem_mount_table_entry_t *mt_entry,
+fat_file_write_first_cluster_num(
+    fat_fs_info_t                        *fs_info,
     fat_file_fd_t                        *fat_fd
     )
 {
     ssize_t          ret1 = 0, ret2 = 0;
-    msdos_fs_info_t *fs_info = mt_entry->fs_info;
     uint32_t         new_cln = fat_fd->cln;
     uint16_t         le_cl_low = 0;
     uint16_t         le_cl_hi = 0;
@@ -751,17 +774,17 @@ msdos_set_first_cluster_num(
      * calculate input for fat_sector_write: convert (cluster num, offset) to
      * (sector num, new offset)
      */
-    sec = fat_cluster_num_to_sector_num(&fs_info->fat, fat_fd->dir_pos.sname.cln);
-    sec += (fat_fd->dir_pos.sname.ofs >> fs_info->fat.vol.sec_log2);
+    sec = fat_cluster_num_to_sector_num(fs_info, fat_fd->dir_pos.sname.cln);
+    sec += (fat_fd->dir_pos.sname.ofs >> fs_info->vol.sec_log2);
     /* byte from points to start of 32bytes structure */
-    byte = fat_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1);
+    byte = fat_fd->dir_pos.sname.ofs & (fs_info->vol.bps - 1);
 
     le_cl_low = CT_LE_W((uint16_t  )(new_cln & 0x0000FFFF));
-    ret1 = fat_sector_write(&fs_info->fat, sec,
+    ret1 = fat_sector_write(fs_info, sec,
                             byte + MSDOS_FIRST_CLUSTER_LOW_OFFSET, 2,
                             (char *)(&le_cl_low));
     le_cl_hi = CT_LE_W((uint16_t  )((new_cln & 0xFFFF0000) >> 16));
-    ret2 = fat_sector_write(&fs_info->fat, sec,
+    ret2 = fat_sector_write(fs_info, sec,
                             byte + MSDOS_FIRST_CLUSTER_HI_OFFSET, 2,
                             (char *)(&le_cl_hi));
     if ( (ret1 < 0) || (ret2 < 0) )
@@ -771,11 +794,11 @@ msdos_set_first_cluster_num(
 }
 
 
-/* msdos_set_file size --
+/* fat_set_file size --
  *     Write file size of the file to the disk (to corresponded 32bytes slot)
  *
  * PARAMETERS:
- *     mt_entry - mount table entry
+ *     fs_info  - fat fs info
  *     fat_fd   - fat-file descriptor
  *
  * RETURNS:
@@ -783,23 +806,22 @@ msdos_set_first_cluster_num(
  *
  */
 int
-msdos_set_file_size(
-    rtems_filesystem_mount_table_entry_t *mt_entry,
+fat_file_write_file_size(
+    fat_fs_info_t                        *fs_info,
     fat_file_fd_t                        *fat_fd
     )
 {
     ssize_t          ret = 0;
-    msdos_fs_info_t *fs_info = mt_entry->fs_info;
     uint32_t         le_new_length = 0;
     uint32_t         sec = 0;
     uint32_t         byte = 0;
 
-    sec = fat_cluster_num_to_sector_num(&fs_info->fat, fat_fd->dir_pos.sname.cln);
-    sec += (fat_fd->dir_pos.sname.ofs >> fs_info->fat.vol.sec_log2);
-    byte = (fat_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1));
+    sec = fat_cluster_num_to_sector_num(fs_info, fat_fd->dir_pos.sname.cln);
+    sec += (fat_fd->dir_pos.sname.ofs >> fs_info->vol.sec_log2);
+    byte = (fat_fd->dir_pos.sname.ofs & (fs_info->vol.bps - 1));
 
     le_new_length = CT_LE_L((fat_fd->fat_file_size));
-    ret = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_SIZE_OFFSET, 4,
+    ret = fat_sector_write(fs_info, sec, byte + MSDOS_FILE_SIZE_OFFSET, 4,
                            (char *)(&le_new_length));
     if ( ret < 0 )
         return -1;



More information about the vc mailing list