From ebc54da9e29be1de79d77c72c0d8eb91833c641b Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Thu, 29 Jul 2021 16:38:02 +1200 Subject: [PATCH] Further integration of 64-bit time changes Signed-off-by: Charles Manning --- direct/yaffs_attribs.c | 21 +++++++---- direct/ydirectenv.h | 2 +- direct/yportenv.h | 1 + rtems/rtems_yaffs.c | 8 ++-- rtems/rtems_yaffs_os_glue.c | 2 +- yaffs_attribs.c | 17 +++++---- yaffs_endian.h | 14 ++++--- yaffs_guts.c | 74 +++++++++++++++++++++++++++++++++++++ yaffs_guts.h | 18 +++++++++ yportenv_multi.h | 2 + yportenv_single.h | 2 + 11 files changed, 134 insertions(+), 27 deletions(-) diff --git a/direct/yaffs_attribs.c b/direct/yaffs_attribs.c index 5486bdd..e798a88 100644 --- a/direct/yaffs_attribs.c +++ b/direct/yaffs_attribs.c @@ -15,6 +15,7 @@ void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh) { + #ifdef CONFIG_YAFFS_WINCE obj->win_atime[0] = oh->win_atime[0]; obj->win_ctime[0] = oh->win_ctime[0]; @@ -25,9 +26,11 @@ void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh) #else obj->yst_uid = oh->yst_uid; obj->yst_gid = oh->yst_gid; - obj->yst_atime = oh->yst_atime; - obj->yst_mtime = oh->yst_mtime; - obj->yst_ctime = oh->yst_ctime; + + obj->yst_ctime = yaffs_oh_ctime_fetch(oh); + obj->yst_mtime = yaffs_oh_mtime_fetch(oh); + obj->yst_atime = yaffs_oh_atime_fetch(oh); + obj->yst_rdev = oh->yst_rdev; #endif } @@ -45,9 +48,11 @@ void yaffs_load_attribs_oh(struct yaffs_obj_hdr *oh, struct yaffs_obj *obj) #else oh->yst_uid = obj->yst_uid; oh->yst_gid = obj->yst_gid; - oh->yst_atime = obj->yst_atime; - oh->yst_mtime = obj->yst_mtime; - oh->yst_ctime = obj->yst_ctime; + + yaffs_oh_ctime_load(obj, oh); + yaffs_oh_mtime_load(obj, oh); + yaffs_oh_atime_load(obj, oh); + oh->yst_rdev = obj->yst_rdev; #endif } @@ -81,8 +86,8 @@ void yaffs_load_current_time(struct yaffs_obj *obj, int do_a, int do_c) obj->yst_mtime = Y_CURRENT_TIME; if (do_a) - obj->yst_atime = obj->yst_atime; + obj->yst_atime = obj->yst_mtime; if (do_c) - obj->yst_ctime = obj->yst_atime; + obj->yst_ctime = obj->yst_mtime; #endif } diff --git a/direct/ydirectenv.h b/direct/ydirectenv.h index 08fc04d..ae2e23c 100644 --- a/direct/ydirectenv.h +++ b/direct/ydirectenv.h @@ -29,7 +29,7 @@ void yaffs_bug_fn(const char *file_name, int line_no); #define BUG() do { yaffs_bug_fn(__FILE__, __LINE__); } while (0) -#ifdef YAFFS_USE_32_BIT_TIME_T +#ifdef CONFIG_YAFFS_USE_32_BIT_TIME_T #define YTIME_T u32 #else #define YTIME_T u64 diff --git a/direct/yportenv.h b/direct/yportenv.h index ee27f73..5a79f93 100644 --- a/direct/yportenv.h +++ b/direct/yportenv.h @@ -30,6 +30,7 @@ #define CONFIG_YAFFS_PROVIDE_DEFS 1 #define CONFIG_YAFFSFS_PROVIDE_VALUES 1 #define CONFIG_YAFFS_DEFINES_TYPES 1 +#define CONFIG_YAFFS_USE_32_BIT_TIME_T 1 #define NO_Y_INLINE 1 #define loff_t off_t diff --git a/rtems/rtems_yaffs.c b/rtems/rtems_yaffs.c index 4611320..bb6edf1 100644 --- a/rtems/rtems_yaffs.c +++ b/rtems/rtems_yaffs.c @@ -281,9 +281,9 @@ static int ryfs_utime( obj = yaffs_get_equivalent_obj(obj); if (obj != NULL) { obj->dirty = 1; - obj->yst_atime = (u32) actime; - obj->yst_mtime = (u32) modtime; - obj->yst_ctime = (u32) time(NULL); + obj->yst_atime = actime; + obj->yst_mtime = modtime; + obj->yst_ctime = time(NULL); } else { errno = EIO; rv = -1; @@ -680,7 +680,7 @@ static int ryfs_symlink(const rtems_filesystem_location_info_t *parent_loc, mode = S_IFLNK | ((S_IRWXU | S_IRWXG | S_IRWXO) & ~rtems_filesystem_umask); - created_link = yaffs_create_symlink(parent_dir, name, mode, + created_link = yaffs_create_symlink(parent_dir, name, mode, geteuid(), getegid(), target); if (created_link != NULL) { diff --git a/rtems/rtems_yaffs_os_glue.c b/rtems/rtems_yaffs_os_glue.c index 467d8b1..8999dff 100644 --- a/rtems/rtems_yaffs_os_glue.c +++ b/rtems/rtems_yaffs_os_glue.c @@ -39,7 +39,7 @@ void yaffsfs_free(void *ptr) free(ptr); } -u32 yaffsfs_CurrentTime(void) +YTIME_T yaffsfs_CurrentTime(void) { return time(NULL); } diff --git a/yaffs_attribs.c b/yaffs_attribs.c index a9ced27..c441185 100644 --- a/yaffs_attribs.c +++ b/yaffs_attribs.c @@ -29,9 +29,11 @@ void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh) { obj->yst_uid = oh->yst_uid; obj->yst_gid = oh->yst_gid; - obj->yst_atime = oh->yst_atime; - obj->yst_mtime = oh->yst_mtime; - obj->yst_ctime = oh->yst_ctime; + + obj->yst_ctime = yaffs_oh_ctime_fetch(oh); + obj->yst_mtime = yaffs_oh_mtime_fetch(oh); + obj->yst_atime = yaffs_oh_atime_fetch(oh); + obj->yst_rdev = oh->yst_rdev; } @@ -39,9 +41,11 @@ void yaffs_load_attribs_oh(struct yaffs_obj_hdr *oh, struct yaffs_obj *obj) { oh->yst_uid = obj->yst_uid; oh->yst_gid = obj->yst_gid; - oh->yst_atime = obj->yst_atime; - oh->yst_mtime = obj->yst_mtime; - oh->yst_ctime = obj->yst_ctime; + + yaffs_oh_ctime_load(obj, oh); + yaffs_oh_mtime_load(obj, oh); + yaffs_oh_atime_load(obj, oh); + oh->yst_rdev = obj->yst_rdev; } @@ -105,7 +109,6 @@ int yaffs_set_attribs(struct yaffs_obj *obj, struct iattr *attr) yaffs_update_oh(obj, NULL, 1, 0, 0, NULL); return YAFFS_OK; - } int yaffs_get_attribs(struct yaffs_obj *obj, struct iattr *attr) diff --git a/yaffs_endian.h b/yaffs_endian.h index 0f1ef04..09bcb29 100644 --- a/yaffs_endian.h +++ b/yaffs_endian.h @@ -37,12 +37,14 @@ static inline u64 swap_u64(u64 val) ((val << 56) & 0xff00000000000000); } -//YTIME_T can be a 32 or 64 bit number. -#if YAFFS_USE_32_BIT_TIME_T - #define swap_ytime_t( val ) swap_u32(val) -#else - #define swap_ytime_t( val ) swap_u64(val) -#endif +static inline YTIME_T swap_ytime_t(YTIME_T val) +{ + + if (sizeof(YTIME_T) == sizeof(u64)) + return swap_u64(val); + else + return swap_u32(val); +} //swap a signed 32 bit integer. #define swap_s32(val) \ diff --git a/yaffs_guts.c b/yaffs_guts.c index c05aee0..c09c88f 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -4887,6 +4887,80 @@ int yaffs_get_n_free_chunks(struct yaffs_dev *dev) return n_free; } +/* + * Marshalling functions to get the appropriate time values saved + * and restored to/from obj headers. + * + * Note that the WinCE time fields are used to store the 32-bit values. + */ + +static void yaffs_oh_time_load(u32 *yst_time, u32 *win_time, YTIME_T timeval) +{ + u32 upper; + u32 lower; + + lower = timeval & 0xffffffff; + if (sizeof(YTIME_T) > sizeof(u32)) + upper = (timeval >> 32) & 0xffffffff; + else + upper = 0; + + *yst_time = lower; + win_time[0] = lower; + win_time[1] = upper; +} + +static YTIME_T yaffs_oh_time_fetch(const u32 *yst_time, const u32 *win_time) +{ + u32 upper; + u32 lower; + + if (win_time[1] == 0xffffffff) { + upper = 0; + lower = *yst_time; + } else { + upper = win_time[1]; + lower = win_time[0]; + } + if (sizeof(YTIME_T) > sizeof(u32)) { + u64 ret; + ret = (((u64)upper) << 32) | lower; + return (YTIME_T) ret; + + } else + return (YTIME_T) lower; +} + +YTIME_T yaffs_oh_ctime_fetch(struct yaffs_obj_hdr *oh) +{ + return yaffs_oh_time_fetch(&oh->yst_ctime, oh->win_ctime); +} + +YTIME_T yaffs_oh_mtime_fetch(struct yaffs_obj_hdr *oh) +{ + return yaffs_oh_time_fetch(&oh->yst_mtime, oh->win_mtime); +} + +YTIME_T yaffs_oh_atime_fetch(struct yaffs_obj_hdr *oh) +{ + return yaffs_oh_time_fetch(&oh->yst_atime, oh->win_atime); +} + +void yaffs_oh_ctime_load(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh) +{ + yaffs_oh_time_load(&oh->yst_ctime, oh->win_ctime, obj->yst_ctime); +} + +void yaffs_oh_mtime_load(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh) +{ + yaffs_oh_time_load(&oh->yst_mtime, oh->win_mtime, obj->yst_mtime); +} + +void yaffs_oh_atime_load(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh) +{ + yaffs_oh_time_load(&oh->yst_atime, oh->win_atime, obj->yst_atime); +} + /* * Marshalling functions to get loff_t file sizes into and out of diff --git a/yaffs_guts.h b/yaffs_guts.h index 22381f9..74ded0b 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -354,6 +354,12 @@ struct yaffs_obj_hdr { u32 yst_rdev; /* stuff for block and char devices (major/min) */ + /* + * WinCE times are no longer just used to store WinCE times. + * They are also used to store 64-bit times. + * We actually store and read the times in both places and use + * the best we can. + */ u32 win_ctime[2]; u32 win_atime[2]; u32 win_mtime[2]; @@ -1063,6 +1069,18 @@ void yaffs_count_blocks_by_state(struct yaffs_dev *dev, int bs[10]); int yaffs_find_chunk_in_file(struct yaffs_obj *in, int inode_chunk, struct yaffs_ext_tags *tags); +/* + *Time marshalling functions + */ + +YTIME_T yaffs_oh_ctime_fetch(struct yaffs_obj_hdr *oh); +YTIME_T yaffs_oh_mtime_fetch(struct yaffs_obj_hdr *oh); +YTIME_T yaffs_oh_atime_fetch(struct yaffs_obj_hdr *oh); + +void yaffs_oh_ctime_load(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh); +void yaffs_oh_mtime_load(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh); +void yaffs_oh_atime_load(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh); + /* * Define LOFF_T_32_BIT if a 32-bit LOFF_T is being used. * Not serious if you get this wrong - you might just get some warnings. diff --git a/yportenv_multi.h b/yportenv_multi.h index 68c239c..fa5601b 100644 --- a/yportenv_multi.h +++ b/yportenv_multi.h @@ -53,6 +53,8 @@ #define YUCHAR unsigned char #define _Y(x) x +#define YTIME_T u64 + #define YAFFS_LOSTNFOUND_NAME "lost+found" #define YAFFS_LOSTNFOUND_PREFIX "obj" diff --git a/yportenv_single.h b/yportenv_single.h index 436feae..b915433 100644 --- a/yportenv_single.h +++ b/yportenv_single.h @@ -34,6 +34,8 @@ #define YCHAR char #define YUCHAR unsigned char #define _Y(x) x +#define YTIME_T u64 + #define YAFFS_LOSTNFOUND_NAME "lost+found" #define YAFFS_LOSTNFOUND_PREFIX "obj" -- 2.30.2