yaffs-direct: Basic tests. Add lpthread flag for background gc support
[yaffs2.git] / yaffs_attribs.c
1 /*
2  * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
3  *
4  * Copyright (C) 2002-2011 Aleph One Ltd.
5  *   for Toby Churchill Ltd and Brightstar Engineering
6  *
7  * Created by Charles Manning <charles@aleph1.co.uk>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13
14 #include "yaffs_guts.h"
15 #include "yaffs_attribs.h"
16
17 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
18 #define IATTR_UID ia_uid
19 #define IATTR_GID ia_gid
20 #else
21 #define IATTR_UID ia_uid.val
22 #define IATTR_GID ia_gid.val
23 #endif
24
25 void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh)
26 {
27         obj->yst_uid = oh->yst_uid;
28         obj->yst_gid = oh->yst_gid;
29         obj->yst_atime = oh->yst_atime;
30         obj->yst_mtime = oh->yst_mtime;
31         obj->yst_ctime = oh->yst_ctime;
32         obj->yst_rdev = oh->yst_rdev;
33 }
34
35 void yaffs_load_attribs_oh(struct yaffs_obj_hdr *oh, struct yaffs_obj *obj)
36 {
37         oh->yst_uid = obj->yst_uid;
38         oh->yst_gid = obj->yst_gid;
39         oh->yst_atime = obj->yst_atime;
40         oh->yst_mtime = obj->yst_mtime;
41         oh->yst_ctime = obj->yst_ctime;
42         oh->yst_rdev = obj->yst_rdev;
43
44 }
45
46 void yaffs_load_current_time(struct yaffs_obj *obj, int do_a, int do_c)
47 {
48         obj->yst_mtime = Y_CURRENT_TIME;
49         if (do_a)
50                 obj->yst_atime = obj->yst_mtime;
51         if (do_c)
52                 obj->yst_ctime = obj->yst_mtime;
53 }
54
55 void yaffs_attribs_init(struct yaffs_obj *obj, u32 gid, u32 uid, u32 rdev)
56 {
57         yaffs_load_current_time(obj, 1, 1);
58         obj->yst_rdev = rdev;
59         obj->yst_uid = uid;
60         obj->yst_gid = gid;
61 }
62
63 static loff_t yaffs_get_file_size(struct yaffs_obj *obj)
64 {
65         YCHAR *alias = NULL;
66         obj = yaffs_get_equivalent_obj(obj);
67
68         switch (obj->variant_type) {
69         case YAFFS_OBJECT_TYPE_FILE:
70                 return obj->variant.file_variant.file_size;
71         case YAFFS_OBJECT_TYPE_SYMLINK:
72                 alias = obj->variant.symlink_variant.alias;
73                 if (!alias)
74                         return 0;
75                 return strnlen(alias, YAFFS_MAX_ALIAS_LENGTH);
76         default:
77                 return 0;
78         }
79 }
80
81 int yaffs_set_attribs(struct yaffs_obj *obj, struct iattr *attr)
82 {
83         unsigned int valid = attr->ia_valid;
84
85         if (valid & ATTR_MODE)
86                 obj->yst_mode = attr->ia_mode;
87         if (valid & ATTR_UID)
88                 obj->yst_uid = attr->IATTR_UID;
89         if (valid & ATTR_GID)
90                 obj->yst_gid = attr->IATTR_GID;
91
92         if (valid & ATTR_ATIME)
93                 obj->yst_atime = Y_TIME_CONVERT(attr->ia_atime);
94         if (valid & ATTR_CTIME)
95                 obj->yst_ctime = Y_TIME_CONVERT(attr->ia_ctime);
96         if (valid & ATTR_MTIME)
97                 obj->yst_mtime = Y_TIME_CONVERT(attr->ia_mtime);
98
99         if (valid & ATTR_SIZE)
100                 yaffs_resize_file(obj, attr->ia_size);
101
102         yaffs_update_oh(obj, NULL, 1, 0, 0, NULL);
103
104         return YAFFS_OK;
105
106 }
107
108 int yaffs_get_attribs(struct yaffs_obj *obj, struct iattr *attr)
109 {
110         unsigned int valid = 0;
111
112         attr->ia_mode = obj->yst_mode;
113         valid |= ATTR_MODE;
114         attr->IATTR_UID = obj->yst_uid;
115         valid |= ATTR_UID;
116         attr->IATTR_GID = obj->yst_gid;
117         valid |= ATTR_GID;
118
119         Y_TIME_CONVERT(attr->ia_atime) = obj->yst_atime;
120         valid |= ATTR_ATIME;
121         Y_TIME_CONVERT(attr->ia_ctime) = obj->yst_ctime;
122         valid |= ATTR_CTIME;
123         Y_TIME_CONVERT(attr->ia_mtime) = obj->yst_mtime;
124         valid |= ATTR_MTIME;
125
126         attr->ia_size = yaffs_get_file_size(obj);
127         valid |= ATTR_SIZE;
128
129         attr->ia_valid = valid;
130
131         return YAFFS_OK;
132 }