Discussion:
[PATCH 2/2] Revert "fstests/mdosfs_fstime: Remove test"
Sebastian Huber
2014-10-20 14:24:24 UTC
Permalink
This reverts commit bdcf4102f71d1bc2a50f23d2d425d85c24ec0900.
---
testsuites/fstests/Makefile.am | 1 +
testsuites/fstests/configure.ac | 1 +
testsuites/fstests/mdosfs_fstime/Makefile.am | 33 ++++++++++++++++++++++++++++
3 files changed, 35 insertions(+)
create mode 100644 testsuites/fstests/mdosfs_fstime/Makefile.am

diff --git a/testsuites/fstests/Makefile.am b/testsuites/fstests/Makefile.am
index 9540256..404966c 100644
--- a/testsuites/fstests/Makefile.am
+++ b/testsuites/fstests/Makefile.am
@@ -24,6 +24,7 @@ _SUBDIRS += mdosfs_fserror
_SUBDIRS += mdosfs_fspatheval
_SUBDIRS += mdosfs_fsrdwr
_SUBDIRS += mdosfs_fsstatvfs
+_SUBDIRS += mdosfs_fstime
_SUBDIRS += mimfs_fserror
_SUBDIRS += mimfs_fslink
_SUBDIRS += mimfs_fspatheval
diff --git a/testsuites/fstests/configure.ac b/testsuites/fstests/configure.ac
index e1337cb..4ad8b78 100644
--- a/testsuites/fstests/configure.ac
+++ b/testsuites/fstests/configure.ac
@@ -100,6 +100,7 @@ mdosfs_fserror/Makefile
mdosfs_fspatheval/Makefile
mdosfs_fsrdwr/Makefile
mdosfs_fsstatvfs/Makefile
+mdosfs_fstime/Makefile
mimfs_fserror/Makefile
mimfs_fslink/Makefile
mimfs_fspatheval/Makefile
diff --git a/testsuites/fstests/mdosfs_fstime/Makefile.am b/testsuites/fstests/mdosfs_fstime/Makefile.am
new file mode 100644
index 0000000..14f58c5
--- /dev/null
+++ b/testsuites/fstests/mdosfs_fstime/Makefile.am
@@ -0,0 +1,33 @@
+
+rtems_tests_PROGRAMS = mdosfs_fstime
+mdosfs_fstime_SOURCES = ../fstime/test.c
+mdosfs_fstime_SOURCES += ../support/ramdisk_support.c
+mdosfs_fstime_SOURCES += ../support/fstest_support.c
+mdosfs_fstime_SOURCES += ../support/fstest_support.h
+mdosfs_fstime_SOURCES += ../support/ramdisk_support.h
+mdosfs_fstime_SOURCES += ../support/fstest.h
+mdosfs_fstime_SOURCES += ../../psxtests/include/pmacros.h
+mdosfs_fstime_SOURCES += ../mdosfs_support/fs_support.c
+mdosfs_fstime_SOURCES += ../mdosfs_support/fs_config.h
+
+#dist_rtems_tests_DATA = mdosfs_fstime.scn
+#dist_rtems_tests_DATA += mdosfs_fstime.doc
+
+include $(RTEMS_ROOT)/make/custom/@***@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+
+AM_CPPFLAGS += -I$(top_srcdir)/support
+AM_CPPFLAGS += -I$(top_srcdir)/mdosfs_support
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+AM_CPPFLAGS += -I$(top_srcdir)/../psxtests/include
+
+LINK_OBJS = $(mdosfs_fstime_OBJECTS)
+LINK_LIBS = $(mdosfs_fstime_LDLIBS)
+
+mdosfs_fstime$(EXEEXT): $(mdosfs_fstime_OBJECTS) $(mdosfs_fstime_DEPENDENCIES)
+ @rm -f mdosfs_fstime$(EXEEXT)
+ $(make-exe)
+
+include $(top_srcdir)/../automake/local.am
--
1.8.4.5
Gedare Bloom
2014-10-20 17:10:15 UTC
Permalink
What does it mean "as far as possible"?

On Mon, Oct 20, 2014 at 10:24 AM, Sebastian Huber
Implement ctime and mtime updates according to POSIX as far as possible.
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.
---
cpukit/libfs/src/dosfs/fat_file.c | 34 +++++++++
cpukit/libfs/src/dosfs/fat_file.h | 33 +++++++++
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, 166 insertions(+), 133 deletions(-)
diff --git a/cpukit/libfs/src/dosfs/fat_file.c b/cpukit/libfs/src/dosfs/fat_file.c
index 2899f1b..a1f77fa 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_set_first_cluster_num(fs_info, fat_fd);
+ if (rc != RC_OK)
+ ret_rc = rc;
+
+ rc = fat_file_set_file_size(fs_info, fat_fd);
+ if (rc != RC_OK)
+ ret_rc = rc;
+ }
+
+ rc = fat_file_set_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..fa177f6 100644
--- a/cpukit/libfs/src/dosfs/fat_file.h
+++ b/cpukit/libfs/src/dosfs/fat_file.h
@@ -22,6 +22,7 @@
#include <rtems.h>
#include <rtems/libio_.h>
+#include <sys/time.h>
#include <time.h>
#include "fat.h"
@@ -88,6 +89,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 +141,17 @@ fat_construct_key(
((pos->ofs >> 5) & (FAT_DIRENTRIES_PER_SEC512 - 1)) );
}
+static inline void fat_file_update_ctime(fat_file_fd_t *fat_fd, time_t t)
+{
+ fat_fd->ctime = t;
+}
+
+static inline void fat_file_update_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 +205,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_set_first_cluster_num(fat_fs_info_t *fs_info,
+ fat_file_fd_t *fat_fd);
+
+int
+fat_file_set_file_size(fat_fs_info_t *fs_info,
+ fat_file_fd_t *fat_fd);
+
+int
+fat_file_set_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..d58fe56 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_update_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_update_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_set_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..f575290 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.
- *
- * iop - file control block
- *
- * 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_update_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_update_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..a5e52f1 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_fd->mtime = 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..8223653 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_set_time_and_date --
* Write last write date and time for a file to the disk (to corresponded
* 32bytes node)
*
- * mt_entry - mount table entry
+ * fs_info - fat fs info
* fat_fd - fat-file descriptor
*
@@ -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_set_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)
*
- * mt_entry - mount table entry
+ * fs_info - fat fs info
* fat_fd - fat-file descriptor
*
@@ -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_set_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)
*
- * mt_entry - mount table entry
+ * fs_info - fat fs info
* fat_fd - fat-file descriptor
*
@@ -783,23 +806,22 @@ msdos_set_first_cluster_num(
*
*/
int
-msdos_set_file_size(
- rtems_filesystem_mount_table_entry_t *mt_entry,
+fat_file_set_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;
--
1.8.4.5
_______________________________________________
devel mailing list
http://lists.rtems.org/mailman/listinfo/devel
Sebastian Huber
2014-10-23 08:50:10 UTC
Permalink
Post by Gedare Bloom
What does it mean "as far as possible"?
I removed the as far as possible.
--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : ***@embedded-brains.de
PGP : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
Peter Dufault
2014-10-23 17:40:32 UTC
Permalink
Post by Sebastian Huber
Post by Gedare Bloom
What does it mean "as far as possible"?
I removed the as far as possible.
--
I think Sebastian means:

"Implement POSIX ctime and mtime updates (as far as possible given FAT restrictions):"

I don't think he's remove "the as far as possible", I think RTEMS is finished once the "as far as possible" is removed.

Peter
-----------------
Peter Dufault
HD Associates, Inc. Software and System Engineering

Loading...