yaffsfs.c: Fix NULL dereference in yaffs_unmount2_reldev()
[yaffs2.git] / direct / yaffs_attribs.c
index 648e137374d143732c18574b07659440b003229d..e798a88b3c3f96281ae54df9e6d80a7f6283e88f 100644 (file)
@@ -1,8 +1,7 @@
 /*
  * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
  *
- * Copyright (C) 2002-2011 Aleph One Ltd.
- *   for Toby Churchill Ltd and Brightstar Engineering
+ * Copyright (C) 2002-2018 Aleph One Ltd.
  *
  * Created by Charles Manning <charles@aleph1.co.uk>
  *
 
 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];
+       obj->win_mtime[0] = oh->win_mtime[0];
+       obj->win_atime[1] = oh->win_atime[1];
+       obj->win_ctime[1] = oh->win_ctime[1];
+       obj->win_mtime[1] = oh->win_mtime[1];
+#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
 }
 
 
 void yaffs_load_attribs_oh(struct yaffs_obj_hdr *oh, struct yaffs_obj *obj)
 {
 #ifdef CONFIG_YAFFS_WINCE
-               oh->win_atime[0] = obj->win_atime[0];
-               oh->win_ctime[0] = obj->win_ctime[0];
-               oh->win_mtime[0] = obj->win_mtime[0];
-               oh->win_atime[1] = obj->win_atime[1];
-               oh->win_ctime[1] = obj->win_ctime[1];
-               oh->win_mtime[1] = obj->win_mtime[1];
+       oh->win_atime[0] = obj->win_atime[0];
+       oh->win_ctime[0] = obj->win_ctime[0];
+       oh->win_mtime[0] = obj->win_mtime[0];
+       oh->win_atime[1] = obj->win_atime[1];
+       oh->win_ctime[1] = obj->win_ctime[1];
+       oh->win_mtime[1] = obj->win_mtime[1];
 #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;
-               oh->yst_rdev = obj->yst_rdev;
-#endif
+       oh->yst_uid = obj->yst_uid;
+       oh->yst_gid = obj->yst_gid;
+
+        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
 }
 
 void yaffs_attribs_init(struct yaffs_obj *obj, u32 gid, u32 uid, u32 rdev)
 {
 
 #ifdef CONFIG_YAFFS_WINCE
-               yfsd_win_file_time_now(obj->win_atime);
-               obj->win_ctime[0] = obj->win_mtime[0] = obj->win_atime[0];
-               obj->win_ctime[1] = obj->win_mtime[1] = obj->win_atime[1];
+       yfsd_win_file_time_now(obj->win_atime);
+       obj->win_ctime[0] = obj->win_mtime[0] = obj->win_atime[0];
+       obj->win_ctime[1] = obj->win_mtime[1] = obj->win_atime[1];
 
 #else
        yaffs_load_current_time(obj, 1, 1);
@@ -64,90 +76,18 @@ void yaffs_attribs_init(struct yaffs_obj *obj, u32 gid, u32 uid, u32 rdev)
 void yaffs_load_current_time(struct yaffs_obj *obj, int do_a, int do_c)
 {
 #ifdef CONFIG_YAFFS_WINCE
-               yfsd_win_file_time_now(the_obj->win_atime);
-               the_obj->win_ctime[0] = the_obj->win_mtime[0] =
-                   the_obj->win_atime[0];
-               the_obj->win_ctime[1] = the_obj->win_mtime[1] =
-                   the_obj->win_atime[1];
+       yfsd_win_file_time_now(obj->win_atime);
+       obj->win_ctime[0] = obj->win_mtime[0] =
+           obj->win_atime[0];
+       obj->win_ctime[1] = obj->win_mtime[1] =
+           obj->win_atime[1];
 
 #else
 
        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
 }
-
-loff_t yaffs_get_file_size(struct yaffs_obj *obj)
-{
-       YCHAR *alias = NULL;
-       obj = yaffs_get_equivalent_obj(obj);
-
-       switch (obj->variant_type) {
-       case YAFFS_OBJECT_TYPE_FILE:
-               return obj->variant.file_variant.file_size;
-       case YAFFS_OBJECT_TYPE_SYMLINK:
-               alias = obj->variant.symlink_variant.alias;
-               if (!alias)
-                       return 0;
-               return yaffs_strnlen(alias, YAFFS_MAX_ALIAS_LENGTH);
-       default:
-               return 0;
-       }
-}
-
-int yaffs_set_attribs(struct yaffs_obj *obj, struct iattr *attr)
-{
-       unsigned int valid = attr->ia_valid;
-
-       if (valid & ATTR_MODE)
-               obj->yst_mode = attr->ia_mode;
-       if (valid & ATTR_UID)
-               obj->yst_uid = attr->ia_uid;
-       if (valid & ATTR_GID)
-               obj->yst_gid = attr->ia_gid;
-
-       if (valid & ATTR_ATIME)
-               obj->yst_atime = Y_TIME_CONVERT(attr->ia_atime);
-       if (valid & ATTR_CTIME)
-               obj->yst_ctime = Y_TIME_CONVERT(attr->ia_ctime);
-       if (valid & ATTR_MTIME)
-               obj->yst_mtime = Y_TIME_CONVERT(attr->ia_mtime);
-
-       if (valid & ATTR_SIZE)
-               yaffs_resize_file(obj, attr->ia_size);
-
-       yaffs_update_oh(obj, NULL, 1, 0, 0, NULL);
-
-       return YAFFS_OK;
-
-}
-
-int yaffs_get_attribs(struct yaffs_obj *obj, struct iattr *attr)
-{
-       unsigned int valid = 0;
-
-       attr->ia_mode = obj->yst_mode;
-       valid |= ATTR_MODE;
-       attr->ia_uid = obj->yst_uid;
-       valid |= ATTR_UID;
-       attr->ia_gid = obj->yst_gid;
-       valid |= ATTR_GID;
-
-       Y_TIME_CONVERT(attr->ia_atime) = obj->yst_atime;
-       valid |= ATTR_ATIME;
-       Y_TIME_CONVERT(attr->ia_ctime) = obj->yst_ctime;
-       valid |= ATTR_CTIME;
-       Y_TIME_CONVERT(attr->ia_mtime) = obj->yst_mtime;
-       valid |= ATTR_MTIME;
-
-       attr->ia_size = yaffs_get_file_size(obj);
-       valid |= ATTR_SIZE;
-
-       attr->ia_valid = valid;
-
-       return YAFFS_OK;
-}
-