1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39#define DEBUG_SUBSYSTEM S_CLASS
40
41#include "../include/obd_class.h"
42#include "../include/lustre/lustre_idl.h"
43#include "../include/lustre_obdo.h"
44
45void obdo_set_parent_fid(struct obdo *dst, const struct lu_fid *parent)
46{
47 dst->o_parent_oid = fid_oid(parent);
48 dst->o_parent_seq = fid_seq(parent);
49 dst->o_parent_ver = fid_ver(parent);
50 dst->o_valid |= OBD_MD_FLGENER | OBD_MD_FLFID;
51}
52EXPORT_SYMBOL(obdo_set_parent_fid);
53
54
55
56
57void obdo_from_inode(struct obdo *dst, struct inode *src, u32 valid)
58{
59 u32 newvalid = 0;
60
61 if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
62 CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n",
63 valid, LTIME_S(src->i_mtime),
64 LTIME_S(src->i_ctime));
65
66 if (valid & OBD_MD_FLATIME) {
67 dst->o_atime = LTIME_S(src->i_atime);
68 newvalid |= OBD_MD_FLATIME;
69 }
70 if (valid & OBD_MD_FLMTIME) {
71 dst->o_mtime = LTIME_S(src->i_mtime);
72 newvalid |= OBD_MD_FLMTIME;
73 }
74 if (valid & OBD_MD_FLCTIME) {
75 dst->o_ctime = LTIME_S(src->i_ctime);
76 newvalid |= OBD_MD_FLCTIME;
77 }
78 if (valid & OBD_MD_FLSIZE) {
79 dst->o_size = i_size_read(src);
80 newvalid |= OBD_MD_FLSIZE;
81 }
82 if (valid & OBD_MD_FLBLOCKS) {
83 dst->o_blocks = src->i_blocks;
84 newvalid |= OBD_MD_FLBLOCKS;
85 }
86 if (valid & OBD_MD_FLBLKSZ) {
87 dst->o_blksize = 1 << src->i_blkbits;
88 newvalid |= OBD_MD_FLBLKSZ;
89 }
90 if (valid & OBD_MD_FLTYPE) {
91 dst->o_mode = (dst->o_mode & S_IALLUGO) |
92 (src->i_mode & S_IFMT);
93 newvalid |= OBD_MD_FLTYPE;
94 }
95 if (valid & OBD_MD_FLMODE) {
96 dst->o_mode = (dst->o_mode & S_IFMT) |
97 (src->i_mode & S_IALLUGO);
98 newvalid |= OBD_MD_FLMODE;
99 }
100 if (valid & OBD_MD_FLUID) {
101 dst->o_uid = from_kuid(&init_user_ns, src->i_uid);
102 newvalid |= OBD_MD_FLUID;
103 }
104 if (valid & OBD_MD_FLGID) {
105 dst->o_gid = from_kgid(&init_user_ns, src->i_gid);
106 newvalid |= OBD_MD_FLGID;
107 }
108 if (valid & OBD_MD_FLFLAGS) {
109 dst->o_flags = src->i_flags;
110 newvalid |= OBD_MD_FLFLAGS;
111 }
112 dst->o_valid |= newvalid;
113}
114EXPORT_SYMBOL(obdo_from_inode);
115
116void obdo_to_ioobj(const struct obdo *oa, struct obd_ioobj *ioobj)
117{
118 ioobj->ioo_oid = oa->o_oi;
119 if (unlikely(!(oa->o_valid & OBD_MD_FLGROUP)))
120 ostid_set_seq_mdt0(&ioobj->ioo_oid);
121
122
123
124
125 ioobj->ioo_max_brw = 0;
126}
127EXPORT_SYMBOL(obdo_to_ioobj);
128
129
130
131
132void lustre_set_wire_obdo(const struct obd_connect_data *ocd,
133 struct obdo *wobdo, const struct obdo *lobdo)
134{
135 *wobdo = *lobdo;
136 wobdo->o_flags &= ~OBD_FL_LOCAL_MASK;
137 if (!ocd)
138 return;
139
140 if (unlikely(!(ocd->ocd_connect_flags & OBD_CONNECT_FID)) &&
141 fid_seq_is_echo(ostid_seq(&lobdo->o_oi))) {
142
143
144
145
146 wobdo->o_oi.oi.oi_id = fid_oid(&lobdo->o_oi.oi_fid);
147 wobdo->o_oi.oi.oi_seq = fid_seq(&lobdo->o_oi.oi_fid);
148 }
149}
150EXPORT_SYMBOL(lustre_set_wire_obdo);
151
152
153
154
155void lustre_get_wire_obdo(const struct obd_connect_data *ocd,
156 struct obdo *lobdo, const struct obdo *wobdo)
157{
158 u32 local_flags = 0;
159
160 if (lobdo->o_valid & OBD_MD_FLFLAGS)
161 local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK;
162
163 *lobdo = *wobdo;
164 if (local_flags) {
165 lobdo->o_valid |= OBD_MD_FLFLAGS;
166 lobdo->o_flags &= ~OBD_FL_LOCAL_MASK;
167 lobdo->o_flags |= local_flags;
168 }
169 if (!ocd)
170 return;
171
172 if (unlikely(!(ocd->ocd_connect_flags & OBD_CONNECT_FID)) &&
173 fid_seq_is_echo(wobdo->o_oi.oi.oi_seq)) {
174
175 lobdo->o_oi.oi_fid.f_seq = wobdo->o_oi.oi.oi_seq;
176 lobdo->o_oi.oi_fid.f_oid = wobdo->o_oi.oi.oi_id;
177 lobdo->o_oi.oi_fid.f_ver = 0;
178 }
179}
180EXPORT_SYMBOL(lustre_get_wire_obdo);
181