2 * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
4 * Copyright (C) 2002-2011 Aleph One Ltd.
5 * for Toby Churchill Ltd and Brightstar Engineering
7 * Created by Charles Manning <charles@aleph1.co.uk>
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.
14 #include "yaffs_attribs.h"
17 void yaffs_load_attribs(struct yaffs_obj
*obj
, struct yaffs_obj_hdr
*oh
)
19 obj
->yst_uid
= oh
->yst_uid
;
20 obj
->yst_gid
= oh
->yst_gid
;
21 obj
->yst_atime
= oh
->yst_atime
;
22 obj
->yst_mtime
= oh
->yst_mtime
;
23 obj
->yst_ctime
= oh
->yst_ctime
;
24 obj
->yst_rdev
= oh
->yst_rdev
;
28 void yaffs_load_attribs_oh(struct yaffs_obj_hdr
*oh
, struct yaffs_obj
*obj
)
30 #ifdef CONFIG_YAFFS_WINCE
31 oh
->win_atime
[0] = obj
->win_atime
[0];
32 oh
->win_ctime
[0] = obj
->win_ctime
[0];
33 oh
->win_mtime
[0] = obj
->win_mtime
[0];
34 oh
->win_atime
[1] = obj
->win_atime
[1];
35 oh
->win_ctime
[1] = obj
->win_ctime
[1];
36 oh
->win_mtime
[1] = obj
->win_mtime
[1];
38 oh
->yst_uid
= obj
->yst_uid
;
39 oh
->yst_gid
= obj
->yst_gid
;
40 oh
->yst_atime
= obj
->yst_atime
;
41 oh
->yst_mtime
= obj
->yst_mtime
;
42 oh
->yst_ctime
= obj
->yst_ctime
;
43 oh
->yst_rdev
= obj
->yst_rdev
;
48 void yaffs_attribs_init(struct yaffs_obj
*obj
, u32 gid
, u32 uid
, u32 rdev
)
51 #ifdef CONFIG_YAFFS_WINCE
52 yfsd_win_file_time_now(obj
->win_atime
);
53 obj
->win_ctime
[0] = obj
->win_mtime
[0] = obj
->win_atime
[0];
54 obj
->win_ctime
[1] = obj
->win_mtime
[1] = obj
->win_atime
[1];
57 yaffs_load_current_time(obj
, 1, 1);
64 void yaffs_load_current_time(struct yaffs_obj
*obj
, int do_a
, int do_c
)
66 #ifdef CONFIG_YAFFS_WINCE
67 yfsd_win_file_time_now(the_obj
->win_atime
);
68 the_obj
->win_ctime
[0] = the_obj
->win_mtime
[0] =
69 the_obj
->win_atime
[0];
70 the_obj
->win_ctime
[1] = the_obj
->win_mtime
[1] =
71 the_obj
->win_atime
[1];
75 obj
->yst_mtime
= Y_CURRENT_TIME
;
77 obj
->yst_atime
= obj
->yst_atime
;
79 obj
->yst_ctime
= obj
->yst_atime
;
83 loff_t
yaffs_get_file_size(struct yaffs_obj
*obj
)
86 obj
= yaffs_get_equivalent_obj(obj
);
88 switch (obj
->variant_type
) {
89 case YAFFS_OBJECT_TYPE_FILE
:
90 return obj
->variant
.file_variant
.file_size
;
91 case YAFFS_OBJECT_TYPE_SYMLINK
:
92 alias
= obj
->variant
.symlink_variant
.alias
;
95 return yaffs_strnlen(alias
, YAFFS_MAX_ALIAS_LENGTH
);
101 int yaffs_set_attribs(struct yaffs_obj
*obj
, struct iattr
*attr
)
103 unsigned int valid
= attr
->ia_valid
;
105 if (valid
& ATTR_MODE
)
106 obj
->yst_mode
= attr
->ia_mode
;
107 if (valid
& ATTR_UID
)
108 obj
->yst_uid
= attr
->ia_uid
;
109 if (valid
& ATTR_GID
)
110 obj
->yst_gid
= attr
->ia_gid
;
112 if (valid
& ATTR_ATIME
)
113 obj
->yst_atime
= Y_TIME_CONVERT(attr
->ia_atime
);
114 if (valid
& ATTR_CTIME
)
115 obj
->yst_ctime
= Y_TIME_CONVERT(attr
->ia_ctime
);
116 if (valid
& ATTR_MTIME
)
117 obj
->yst_mtime
= Y_TIME_CONVERT(attr
->ia_mtime
);
119 if (valid
& ATTR_SIZE
)
120 yaffs_resize_file(obj
, attr
->ia_size
);
122 yaffs_update_oh(obj
, NULL
, 1, 0, 0, NULL
);
128 int yaffs_get_attribs(struct yaffs_obj
*obj
, struct iattr
*attr
)
130 unsigned int valid
= 0;
132 attr
->ia_mode
= obj
->yst_mode
;
134 attr
->ia_uid
= obj
->yst_uid
;
136 attr
->ia_gid
= obj
->yst_gid
;
139 Y_TIME_CONVERT(attr
->ia_atime
) = obj
->yst_atime
;
141 Y_TIME_CONVERT(attr
->ia_ctime
) = obj
->yst_ctime
;
143 Y_TIME_CONVERT(attr
->ia_mtime
) = obj
->yst_mtime
;
146 attr
->ia_size
= yaffs_get_file_size(obj
);
149 attr
->ia_valid
= valid
;