2 * Lustre Light Update Records
4 * This code is issued under the GNU General Public License.
5 * See the file COPYING in this distribution
7 * Copryright (C) 2002 Cluster File Systems, Inc.
11 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/kernel.h>
15 #include <linux/string.h>
16 #include <linux/stat.h>
17 #include <linux/errno.h>
18 #include <linux/locks.h>
19 #include <linux/unistd.h>
21 #include <asm/system.h>
22 #include <asm/uaccess.h>
25 #include <linux/stat.h>
26 #include <asm/uaccess.h>
27 #include <linux/slab.h>
28 #include <asm/segment.h>
30 #define DEBUG_SUBSYSTEM S_MDS
32 #include <linux/obd_support.h>
33 #include <linux/lustre_lib.h>
34 #include <linux/lustre_mds.h>
36 /* packing of MDS records */
37 void mds_create_pack(struct mds_rec_create *rec, struct inode *inode,
38 const char *name, int namelen, __u32 mode, __u64 id,
39 __u32 uid, __u32 gid, __u64 time, const char *tgt,
42 char *tmp = (char *)rec + sizeof(*rec);
43 /* XXX do something about time, uid, gid */
45 HTON__u32(sizeof(*rec) + size_round0(namelen) +
47 rec->cr_opcode = HTON__u32(REINT_CREATE);
49 ll_inode2fid(&rec->cr_fid, inode);
50 rec->cr_mode = HTON__u32(mode);
51 rec->cr_id = HTON__u64(id);
52 rec->cr_uid = HTON__u32(uid);
53 rec->cr_gid = HTON__u32(gid);
54 rec->cr_time = HTON__u64(time);
55 rec->cr_namelen = HTON__u32(namelen + 1); /* for terminating \0 */
56 LOGL0(name, namelen, tmp);
58 rec->cr_tgtlen = HTON__u32(tgtlen + 1);
59 LOGL0(tgt, tgtlen, tmp);
63 void mds_setattr_pack(struct mds_rec_setattr *rec, struct inode *inode,
66 rec->sa_reclen = HTON__u32(sizeof(*rec));
67 rec->sa_opcode = HTON__u32(REINT_SETATTR);
69 ll_inode2fid(&rec->sa_fid, inode);
70 rec->sa_valid = HTON__u32(iattr->ia_valid);
71 rec->sa_mode = HTON__u32(iattr->ia_mode);
72 rec->sa_uid = HTON__u32(iattr->ia_uid);
73 rec->sa_gid = HTON__u32(iattr->ia_gid);
74 rec->sa_size = HTON__u64(iattr->ia_size);
75 rec->sa_atime = HTON__u64(iattr->ia_atime);
76 rec->sa_mtime = HTON__u64(iattr->ia_mtime);
77 rec->sa_ctime = HTON__u64(iattr->ia_ctime);
78 rec->sa_attr_flags = HTON__u32(iattr->ia_attr_flags);
81 void mds_unlink_pack(struct mds_rec_unlink *rec, struct inode *inode,
82 struct inode *child, const char *name, int namelen)
84 char *tmp = (char *)rec + sizeof(*rec);
86 rec->ul_reclen = HTON__u32(sizeof(*rec)) + size_round0(namelen);
87 rec->ul_opcode = HTON__u32(REINT_UNLINK);
89 ll_inode2fid(&rec->ul_fid1, inode);
90 ll_inode2fid(&rec->ul_fid2, child);
91 rec->ul_namelen = HTON__u32(namelen + 1); /* for terminating \0 */
92 LOGL0(name, namelen, tmp);
95 void mds_link_pack(struct mds_rec_link *rec,
96 struct inode *inode, struct inode *dir,
97 const char *name, int namelen)
99 char *tmp = (char *)rec + sizeof(*rec);
100 rec->lk_reclen = HTON__u32(sizeof(*rec)) + size_round0(namelen);
101 rec->lk_opcode = HTON__u32(REINT_LINK);
103 ll_inode2fid(&rec->lk_fid1, inode);
104 ll_inode2fid(&rec->lk_fid2, dir);
105 rec->lk_namelen = HTON__u32(namelen + 1); /* for terminating \0 */
106 LOGL0(name, namelen, tmp);
109 void mds_rename_pack(struct mds_rec_rename *rec, struct inode *srcdir, struct inode *tgtdir, const char *name, int namelen, const char *tgt, int tgtlen)
111 char *tmp = (char *)rec + sizeof(*rec);
112 /* XXX do something about time, uid, gid */
114 HTON__u32(sizeof(*rec) + size_round0(namelen) +
115 size_round0(tgtlen));
116 rec->rn_opcode = HTON__u32(REINT_RENAME);
118 ll_inode2fid(&rec->rn_fid1, srcdir);
119 ll_inode2fid(&rec->rn_fid2, tgtdir);
120 rec->rn_namelen = HTON__u32(namelen + 1); /* for terminating \0 */
121 LOGL0(name, namelen, tmp);
123 rec->rn_tgtlen = HTON__u32(tgtlen + 1);
124 LOGL0(tgt, tgtlen, tmp);
130 static int mds_update_hdr_unpack(char *buf, int len,
131 struct mds_update_record *r)
133 struct mds_update_record_hdr *hdr = (struct mds_update_record_hdr *)buf;
135 r->ur_reclen = NTOH__u32(hdr->ur_reclen);
136 if (len < sizeof(*hdr) || len != r->ur_reclen) {
137 CERROR("invalid buffer length\n");
140 r->ur_opcode = NTOH__u32(hdr->ur_opcode);
144 static int mds_setattr_unpack(char *buf, int len, struct mds_update_record *r)
147 struct iattr *attr = &r->ur_iattr;
148 struct mds_rec_setattr *rec = (struct mds_rec_setattr *)buf;
150 if (len < sizeof(*rec)) {
151 CERROR("invalid buffer length\n");
155 r->ur_fid1 = &rec->sa_fid;
156 attr->ia_valid = NTOH__u32(rec->sa_valid);
157 attr->ia_mode = NTOH__u32(rec->sa_mode);
158 attr->ia_uid = NTOH__u32(rec->sa_uid);
159 attr->ia_gid = NTOH__u32(rec->sa_gid);
160 attr->ia_size = NTOH__u64(rec->sa_size);
161 attr->ia_atime = NTOH__u64(rec->sa_atime);
162 attr->ia_mtime = NTOH__u64(rec->sa_mtime);
163 attr->ia_ctime = NTOH__u64(rec->sa_ctime);
164 attr->ia_attr_flags = NTOH__u32(rec->sa_attr_flags);
168 static int mds_create_unpack(char *buf, int len, struct mds_update_record *r)
170 struct mds_rec_create *rec = (struct mds_rec_create *)buf;
173 if (len < sizeof(*rec)) {
174 CERROR("invalid buffer length\n");
178 ptr = (char *)rec + sizeof(*rec);
179 end = ptr + len - sizeof(*rec);
181 r->ur_fid1 = &rec->cr_fid;
182 r->ur_mode = NTOH__u32(rec->cr_mode);
183 r->ur_id = NTOH__u64(rec->cr_id);
184 r->ur_uid = NTOH__u32(rec->cr_uid);
185 r->ur_gid = NTOH__u32(rec->cr_gid);
186 r->ur_time = NTOH__u64(rec->cr_time);
187 r->ur_namelen = NTOH__u32(rec->cr_namelen);
188 r->ur_tgtlen = NTOH__u32(rec->cr_tgtlen);
190 UNLOGL0(r->ur_name, char, r->ur_namelen, ptr, end);
191 UNLOGL0(r->ur_tgt, char, r->ur_tgtlen, ptr, end);
195 static int mds_link_unpack(char *buf, int len, struct mds_update_record *r)
197 struct mds_rec_link *rec = (struct mds_rec_link *)buf;
200 if (len < sizeof(*rec)) {
201 CERROR("invalid buffer length\n");
205 ptr = (char *)rec + sizeof(*rec);
206 end = ptr + len - sizeof(*rec);
208 r->ur_fid1 = &rec->lk_fid1;
209 r->ur_fid2 = &rec->lk_fid2;
210 r->ur_namelen = NTOH__u32(rec->lk_namelen);
211 UNLOGL0(r->ur_name, char, r->ur_namelen, ptr, end);
215 static int mds_unlink_unpack(char *buf, int len, struct mds_update_record *r)
217 struct mds_rec_unlink *rec = (struct mds_rec_unlink *)buf;
221 if (len < sizeof(*rec)) {
222 CERROR("invalid buffer length\n");
226 ptr = (char *)rec + sizeof(*rec);
227 end = ptr + len - sizeof(*rec);
229 r->ur_fid1 = &rec->ul_fid1;
230 r->ur_fid2 = &rec->ul_fid2;
231 r->ur_namelen = NTOH__u32(rec->ul_namelen);
232 UNLOGL0(r->ur_name, char, r->ur_namelen, ptr, end);
237 static int mds_rename_unpack(char *buf, int len, struct mds_update_record *r)
239 struct mds_rec_rename *rec = (struct mds_rec_rename *)buf;
242 if (len < sizeof(*rec)) {
243 CERROR("invalid buffer length\n");
247 ptr = (char *)rec + sizeof(*rec);
248 end = ptr + len - sizeof(*rec);
250 r->ur_fid1 = &rec->rn_fid1;
251 r->ur_fid2 = &rec->rn_fid2;
252 r->ur_namelen = NTOH__u32(rec->rn_namelen);
253 r->ur_tgtlen = NTOH__u32(rec->rn_tgtlen);
255 UNLOGL0(r->ur_name, char, r->ur_namelen, ptr, end);
256 UNLOGL0(r->ur_tgt, char, r->ur_tgtlen, ptr, end);
260 typedef int (*update_unpacker)(char *, int , struct mds_update_record *);
262 static update_unpacker mds_unpackers[REINT_MAX + 1] = {
263 [REINT_SETATTR] mds_setattr_unpack,
264 [REINT_CREATE] mds_create_unpack,
265 [REINT_LINK] mds_link_unpack,
266 [REINT_UNLINK] mds_unlink_unpack,
267 [REINT_RENAME] mds_rename_unpack,
270 int mds_update_unpack(char *buf, int len, struct mds_update_record *r)
275 rc = mds_update_hdr_unpack(buf, len, r);
282 if ( r->ur_opcode<0 || r->ur_opcode > REINT_MAX) {
287 rc = mds_unpackers[r->ur_opcode](buf, len, r);