root / hw / 9pfs / virtio-9p-debug.c @ 873c3213
History | View | Annotate | Download (18.8 kB)
1 |
/*
|
---|---|
2 |
* Virtio 9p PDU debug
|
3 |
*
|
4 |
* Copyright IBM, Corp. 2010
|
5 |
*
|
6 |
* Authors:
|
7 |
* Anthony Liguori <aliguori@us.ibm.com>
|
8 |
*
|
9 |
* This work is licensed under the terms of the GNU GPL, version 2. See
|
10 |
* the COPYING file in the top-level directory.
|
11 |
*
|
12 |
*/
|
13 |
|
14 |
#include "hw/virtio.h" |
15 |
#include "hw/pc.h" |
16 |
#include "virtio-9p.h" |
17 |
#include "virtio-9p-debug.h" |
18 |
|
19 |
#define BUG_ON(cond) assert(!(cond))
|
20 |
|
21 |
static FILE *llogfile;
|
22 |
|
23 |
static struct iovec *get_sg(V9fsPDU *pdu, int rx) |
24 |
{ |
25 |
if (rx) {
|
26 |
return pdu->elem.in_sg;
|
27 |
} |
28 |
return pdu->elem.out_sg;
|
29 |
} |
30 |
|
31 |
static int get_sg_count(V9fsPDU *pdu, int rx) |
32 |
{ |
33 |
if (rx) {
|
34 |
return pdu->elem.in_num;
|
35 |
} |
36 |
return pdu->elem.out_num;
|
37 |
|
38 |
} |
39 |
|
40 |
static void pprint_int8(V9fsPDU *pdu, int rx, size_t *offsetp, |
41 |
const char *name) |
42 |
{ |
43 |
size_t copied; |
44 |
int count = get_sg_count(pdu, rx);
|
45 |
size_t offset = *offsetp; |
46 |
struct iovec *sg = get_sg(pdu, rx);
|
47 |
int8_t value; |
48 |
|
49 |
copied = do_pdu_unpack(&value, sg, count, offset, sizeof(value));
|
50 |
|
51 |
BUG_ON(copied != sizeof(value));
|
52 |
offset += sizeof(value);
|
53 |
fprintf(llogfile, "%s=0x%x", name, value);
|
54 |
*offsetp = offset; |
55 |
} |
56 |
|
57 |
static void pprint_int16(V9fsPDU *pdu, int rx, size_t *offsetp, |
58 |
const char *name) |
59 |
{ |
60 |
size_t copied; |
61 |
int count = get_sg_count(pdu, rx);
|
62 |
struct iovec *sg = get_sg(pdu, rx);
|
63 |
size_t offset = *offsetp; |
64 |
int16_t value; |
65 |
|
66 |
|
67 |
copied = do_pdu_unpack(&value, sg, count, offset, sizeof(value));
|
68 |
|
69 |
BUG_ON(copied != sizeof(value));
|
70 |
offset += sizeof(value);
|
71 |
fprintf(llogfile, "%s=0x%x", name, value);
|
72 |
*offsetp = offset; |
73 |
} |
74 |
|
75 |
static void pprint_int32(V9fsPDU *pdu, int rx, size_t *offsetp, |
76 |
const char *name) |
77 |
{ |
78 |
size_t copied; |
79 |
int count = get_sg_count(pdu, rx);
|
80 |
struct iovec *sg = get_sg(pdu, rx);
|
81 |
size_t offset = *offsetp; |
82 |
int32_t value; |
83 |
|
84 |
|
85 |
copied = do_pdu_unpack(&value, sg, count, offset, sizeof(value));
|
86 |
|
87 |
BUG_ON(copied != sizeof(value));
|
88 |
offset += sizeof(value);
|
89 |
fprintf(llogfile, "%s=0x%x", name, value);
|
90 |
*offsetp = offset; |
91 |
} |
92 |
|
93 |
static void pprint_int64(V9fsPDU *pdu, int rx, size_t *offsetp, |
94 |
const char *name) |
95 |
{ |
96 |
size_t copied; |
97 |
int count = get_sg_count(pdu, rx);
|
98 |
struct iovec *sg = get_sg(pdu, rx);
|
99 |
size_t offset = *offsetp; |
100 |
int64_t value; |
101 |
|
102 |
|
103 |
copied = do_pdu_unpack(&value, sg, count, offset, sizeof(value));
|
104 |
|
105 |
BUG_ON(copied != sizeof(value));
|
106 |
offset += sizeof(value);
|
107 |
fprintf(llogfile, "%s=0x%" PRIx64, name, value);
|
108 |
*offsetp = offset; |
109 |
} |
110 |
|
111 |
static void pprint_str(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
112 |
{ |
113 |
int sg_count = get_sg_count(pdu, rx);
|
114 |
struct iovec *sg = get_sg(pdu, rx);
|
115 |
size_t offset = *offsetp; |
116 |
uint16_t tmp_size, size; |
117 |
size_t result; |
118 |
size_t copied = 0;
|
119 |
int i = 0; |
120 |
|
121 |
/* get the size */
|
122 |
copied = do_pdu_unpack(&tmp_size, sg, sg_count, offset, sizeof(tmp_size));
|
123 |
BUG_ON(copied != sizeof(tmp_size));
|
124 |
size = le16_to_cpupu(&tmp_size); |
125 |
offset += copied; |
126 |
|
127 |
fprintf(llogfile, "%s=", name);
|
128 |
for (i = 0; size && i < sg_count; i++) { |
129 |
size_t len; |
130 |
if (offset >= sg[i].iov_len) {
|
131 |
/* skip this sg */
|
132 |
offset -= sg[i].iov_len; |
133 |
continue;
|
134 |
} else {
|
135 |
len = MIN(sg[i].iov_len - offset, size); |
136 |
result = fwrite(sg[i].iov_base + offset, 1, len, llogfile);
|
137 |
BUG_ON(result != len); |
138 |
size -= len; |
139 |
copied += len; |
140 |
if (size) {
|
141 |
offset = 0;
|
142 |
continue;
|
143 |
} |
144 |
} |
145 |
} |
146 |
*offsetp += copied; |
147 |
} |
148 |
|
149 |
static void pprint_qid(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
150 |
{ |
151 |
fprintf(llogfile, "%s={", name);
|
152 |
pprint_int8(pdu, rx, offsetp, "type");
|
153 |
pprint_int32(pdu, rx, offsetp, ", version");
|
154 |
pprint_int64(pdu, rx, offsetp, ", path");
|
155 |
fprintf(llogfile, "}");
|
156 |
} |
157 |
|
158 |
static void pprint_stat(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
159 |
{ |
160 |
fprintf(llogfile, "%s={", name);
|
161 |
pprint_int16(pdu, rx, offsetp, "size");
|
162 |
pprint_int16(pdu, rx, offsetp, ", type");
|
163 |
pprint_int32(pdu, rx, offsetp, ", dev");
|
164 |
pprint_qid(pdu, rx, offsetp, ", qid");
|
165 |
pprint_int32(pdu, rx, offsetp, ", mode");
|
166 |
pprint_int32(pdu, rx, offsetp, ", atime");
|
167 |
pprint_int32(pdu, rx, offsetp, ", mtime");
|
168 |
pprint_int64(pdu, rx, offsetp, ", length");
|
169 |
pprint_str(pdu, rx, offsetp, ", name");
|
170 |
pprint_str(pdu, rx, offsetp, ", uid");
|
171 |
pprint_str(pdu, rx, offsetp, ", gid");
|
172 |
pprint_str(pdu, rx, offsetp, ", muid");
|
173 |
pprint_str(pdu, rx, offsetp, ", extension");
|
174 |
pprint_int32(pdu, rx, offsetp, ", uid");
|
175 |
pprint_int32(pdu, rx, offsetp, ", gid");
|
176 |
pprint_int32(pdu, rx, offsetp, ", muid");
|
177 |
fprintf(llogfile, "}");
|
178 |
} |
179 |
|
180 |
static void pprint_stat_dotl(V9fsPDU *pdu, int rx, size_t *offsetp, |
181 |
const char *name) |
182 |
{ |
183 |
fprintf(llogfile, "%s={", name);
|
184 |
pprint_qid(pdu, rx, offsetp, "qid");
|
185 |
pprint_int32(pdu, rx, offsetp, ", st_mode");
|
186 |
pprint_int64(pdu, rx, offsetp, ", st_nlink");
|
187 |
pprint_int32(pdu, rx, offsetp, ", st_uid");
|
188 |
pprint_int32(pdu, rx, offsetp, ", st_gid");
|
189 |
pprint_int64(pdu, rx, offsetp, ", st_rdev");
|
190 |
pprint_int64(pdu, rx, offsetp, ", st_size");
|
191 |
pprint_int64(pdu, rx, offsetp, ", st_blksize");
|
192 |
pprint_int64(pdu, rx, offsetp, ", st_blocks");
|
193 |
pprint_int64(pdu, rx, offsetp, ", atime");
|
194 |
pprint_int64(pdu, rx, offsetp, ", atime_nsec");
|
195 |
pprint_int64(pdu, rx, offsetp, ", mtime");
|
196 |
pprint_int64(pdu, rx, offsetp, ", mtime_nsec");
|
197 |
pprint_int64(pdu, rx, offsetp, ", ctime");
|
198 |
pprint_int64(pdu, rx, offsetp, ", ctime_nsec");
|
199 |
fprintf(llogfile, "}");
|
200 |
} |
201 |
|
202 |
|
203 |
|
204 |
static void pprint_strs(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
205 |
{ |
206 |
int sg_count = get_sg_count(pdu, rx);
|
207 |
struct iovec *sg = get_sg(pdu, rx);
|
208 |
size_t offset = *offsetp; |
209 |
uint16_t tmp_count, count, i; |
210 |
size_t copied = 0;
|
211 |
|
212 |
fprintf(llogfile, "%s={", name);
|
213 |
|
214 |
/* Get the count */
|
215 |
copied = do_pdu_unpack(&tmp_count, sg, sg_count, offset, sizeof(tmp_count));
|
216 |
BUG_ON(copied != sizeof(tmp_count));
|
217 |
count = le16_to_cpupu(&tmp_count); |
218 |
offset += copied; |
219 |
|
220 |
for (i = 0; i < count; i++) { |
221 |
char str[512]; |
222 |
if (i) {
|
223 |
fprintf(llogfile, ", ");
|
224 |
} |
225 |
snprintf(str, sizeof(str), "[%d]", i); |
226 |
pprint_str(pdu, rx, &offset, str); |
227 |
} |
228 |
|
229 |
fprintf(llogfile, "}");
|
230 |
|
231 |
*offsetp = offset; |
232 |
} |
233 |
|
234 |
static void pprint_qids(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
235 |
{ |
236 |
int sg_count = get_sg_count(pdu, rx);
|
237 |
struct iovec *sg = get_sg(pdu, rx);
|
238 |
size_t offset = *offsetp; |
239 |
uint16_t tmp_count, count, i; |
240 |
size_t copied = 0;
|
241 |
|
242 |
fprintf(llogfile, "%s={", name);
|
243 |
|
244 |
copied = do_pdu_unpack(&tmp_count, sg, sg_count, offset, sizeof(tmp_count));
|
245 |
BUG_ON(copied != sizeof(tmp_count));
|
246 |
count = le16_to_cpupu(&tmp_count); |
247 |
offset += copied; |
248 |
|
249 |
for (i = 0; i < count; i++) { |
250 |
char str[512]; |
251 |
if (i) {
|
252 |
fprintf(llogfile, ", ");
|
253 |
} |
254 |
snprintf(str, sizeof(str), "[%d]", i); |
255 |
pprint_qid(pdu, rx, &offset, str); |
256 |
} |
257 |
|
258 |
fprintf(llogfile, "}");
|
259 |
|
260 |
*offsetp = offset; |
261 |
} |
262 |
|
263 |
static void pprint_sg(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
264 |
{ |
265 |
struct iovec *sg = get_sg(pdu, rx);
|
266 |
unsigned int count; |
267 |
int i;
|
268 |
|
269 |
if (rx) {
|
270 |
count = pdu->elem.in_num; |
271 |
} else {
|
272 |
count = pdu->elem.out_num; |
273 |
} |
274 |
|
275 |
fprintf(llogfile, "%s={", name);
|
276 |
for (i = 0; i < count; i++) { |
277 |
if (i) {
|
278 |
fprintf(llogfile, ", ");
|
279 |
} |
280 |
fprintf(llogfile, "(%p, 0x%zx)", sg[i].iov_base, sg[i].iov_len);
|
281 |
} |
282 |
fprintf(llogfile, "}");
|
283 |
} |
284 |
|
285 |
/* FIXME: read from a directory fid returns serialized stat_t's */
|
286 |
#ifdef DEBUG_DATA
|
287 |
static void pprint_data(V9fsPDU *pdu, int rx, size_t *offsetp, const char *name) |
288 |
{ |
289 |
struct iovec *sg = get_sg(pdu, rx);
|
290 |
size_t offset = *offsetp; |
291 |
unsigned int count; |
292 |
int32_t size; |
293 |
int total, i, j;
|
294 |
ssize_t len; |
295 |
|
296 |
if (rx) {
|
297 |
count = pdu->elem.in_num; |
298 |
} else
|
299 |
count = pdu->elem.out_num; |
300 |
} |
301 |
|
302 |
BUG_ON((offset + sizeof(size)) > sg[0].iov_len); |
303 |
|
304 |
memcpy(&size, sg[0].iov_base + offset, sizeof(size)); |
305 |
offset += sizeof(size);
|
306 |
|
307 |
fprintf(llogfile, "size: %x\n", size);
|
308 |
|
309 |
sg[0].iov_base += 11; /* skip header */ |
310 |
sg[0].iov_len -= 11; |
311 |
|
312 |
total = 0;
|
313 |
for (i = 0; i < count; i++) { |
314 |
total += sg[i].iov_len; |
315 |
if (total >= size) {
|
316 |
/* trim sg list so writev does the right thing */
|
317 |
sg[i].iov_len -= (total - size); |
318 |
i++; |
319 |
break;
|
320 |
} |
321 |
} |
322 |
|
323 |
fprintf(llogfile, "%s={\"", name);
|
324 |
fflush(llogfile); |
325 |
for (j = 0; j < i; j++) { |
326 |
if (j) {
|
327 |
fprintf(llogfile, "\", \"");
|
328 |
fflush(llogfile); |
329 |
} |
330 |
|
331 |
do {
|
332 |
len = writev(fileno(llogfile), &sg[j], 1);
|
333 |
} while (len == -1 && errno == EINTR); |
334 |
fprintf(llogfile, "len == %ld: %m\n", len);
|
335 |
BUG_ON(len != sg[j].iov_len); |
336 |
} |
337 |
fprintf(llogfile, "\"}");
|
338 |
|
339 |
sg[0].iov_base -= 11; |
340 |
sg[0].iov_len += 11; |
341 |
|
342 |
} |
343 |
#endif
|
344 |
|
345 |
void pprint_pdu(V9fsPDU *pdu)
|
346 |
{ |
347 |
size_t offset = 7;
|
348 |
|
349 |
if (llogfile == NULL) { |
350 |
llogfile = fopen("/tmp/pdu.log", "w"); |
351 |
} |
352 |
|
353 |
BUG_ON(!llogfile); |
354 |
|
355 |
switch (pdu->id) {
|
356 |
case P9_TREADDIR:
|
357 |
fprintf(llogfile, "TREADDIR: (");
|
358 |
pprint_int32(pdu, 0, &offset, "fid"); |
359 |
pprint_int64(pdu, 0, &offset, ", initial offset"); |
360 |
pprint_int32(pdu, 0, &offset, ", max count"); |
361 |
break;
|
362 |
case P9_RREADDIR:
|
363 |
fprintf(llogfile, "RREADDIR: (");
|
364 |
pprint_int32(pdu, 1, &offset, "count"); |
365 |
#ifdef DEBUG_DATA
|
366 |
pprint_data(pdu, 1, &offset, ", data"); |
367 |
#endif
|
368 |
break;
|
369 |
case P9_TMKDIR:
|
370 |
fprintf(llogfile, "TMKDIR: (");
|
371 |
pprint_int32(pdu, 0, &offset, "fid"); |
372 |
pprint_str(pdu, 0, &offset, "name"); |
373 |
pprint_int32(pdu, 0, &offset, "mode"); |
374 |
pprint_int32(pdu, 0, &offset, "gid"); |
375 |
break;
|
376 |
case P9_RMKDIR:
|
377 |
fprintf(llogfile, "RMKDIR: (");
|
378 |
pprint_qid(pdu, 0, &offset, "qid"); |
379 |
break;
|
380 |
case P9_TVERSION:
|
381 |
fprintf(llogfile, "TVERSION: (");
|
382 |
pprint_int32(pdu, 0, &offset, "msize"); |
383 |
pprint_str(pdu, 0, &offset, ", version"); |
384 |
break;
|
385 |
case P9_RVERSION:
|
386 |
fprintf(llogfile, "RVERSION: (");
|
387 |
pprint_int32(pdu, 1, &offset, "msize"); |
388 |
pprint_str(pdu, 1, &offset, ", version"); |
389 |
break;
|
390 |
case P9_TGETATTR:
|
391 |
fprintf(llogfile, "TGETATTR: (");
|
392 |
pprint_int32(pdu, 0, &offset, "fid"); |
393 |
break;
|
394 |
case P9_RGETATTR:
|
395 |
fprintf(llogfile, "RGETATTR: (");
|
396 |
pprint_stat_dotl(pdu, 1, &offset, "getattr"); |
397 |
break;
|
398 |
case P9_TAUTH:
|
399 |
fprintf(llogfile, "TAUTH: (");
|
400 |
pprint_int32(pdu, 0, &offset, "afid"); |
401 |
pprint_str(pdu, 0, &offset, ", uname"); |
402 |
pprint_str(pdu, 0, &offset, ", aname"); |
403 |
pprint_int32(pdu, 0, &offset, ", n_uname"); |
404 |
break;
|
405 |
case P9_RAUTH:
|
406 |
fprintf(llogfile, "RAUTH: (");
|
407 |
pprint_qid(pdu, 1, &offset, "qid"); |
408 |
break;
|
409 |
case P9_TATTACH:
|
410 |
fprintf(llogfile, "TATTACH: (");
|
411 |
pprint_int32(pdu, 0, &offset, "fid"); |
412 |
pprint_int32(pdu, 0, &offset, ", afid"); |
413 |
pprint_str(pdu, 0, &offset, ", uname"); |
414 |
pprint_str(pdu, 0, &offset, ", aname"); |
415 |
pprint_int32(pdu, 0, &offset, ", n_uname"); |
416 |
break;
|
417 |
case P9_RATTACH:
|
418 |
fprintf(llogfile, "RATTACH: (");
|
419 |
pprint_qid(pdu, 1, &offset, "qid"); |
420 |
break;
|
421 |
case P9_TERROR:
|
422 |
fprintf(llogfile, "TERROR: (");
|
423 |
break;
|
424 |
case P9_RERROR:
|
425 |
fprintf(llogfile, "RERROR: (");
|
426 |
pprint_str(pdu, 1, &offset, "ename"); |
427 |
pprint_int32(pdu, 1, &offset, ", ecode"); |
428 |
break;
|
429 |
case P9_TFLUSH:
|
430 |
fprintf(llogfile, "TFLUSH: (");
|
431 |
pprint_int16(pdu, 0, &offset, "oldtag"); |
432 |
break;
|
433 |
case P9_RFLUSH:
|
434 |
fprintf(llogfile, "RFLUSH: (");
|
435 |
break;
|
436 |
case P9_TWALK:
|
437 |
fprintf(llogfile, "TWALK: (");
|
438 |
pprint_int32(pdu, 0, &offset, "fid"); |
439 |
pprint_int32(pdu, 0, &offset, ", newfid"); |
440 |
pprint_strs(pdu, 0, &offset, ", wnames"); |
441 |
break;
|
442 |
case P9_RWALK:
|
443 |
fprintf(llogfile, "RWALK: (");
|
444 |
pprint_qids(pdu, 1, &offset, "wqids"); |
445 |
break;
|
446 |
case P9_TOPEN:
|
447 |
fprintf(llogfile, "TOPEN: (");
|
448 |
pprint_int32(pdu, 0, &offset, "fid"); |
449 |
pprint_int8(pdu, 0, &offset, ", mode"); |
450 |
break;
|
451 |
case P9_ROPEN:
|
452 |
fprintf(llogfile, "ROPEN: (");
|
453 |
pprint_qid(pdu, 1, &offset, "qid"); |
454 |
pprint_int32(pdu, 1, &offset, ", iounit"); |
455 |
break;
|
456 |
case P9_TCREATE:
|
457 |
fprintf(llogfile, "TCREATE: (");
|
458 |
pprint_int32(pdu, 0, &offset, "fid"); |
459 |
pprint_str(pdu, 0, &offset, ", name"); |
460 |
pprint_int32(pdu, 0, &offset, ", perm"); |
461 |
pprint_int8(pdu, 0, &offset, ", mode"); |
462 |
pprint_str(pdu, 0, &offset, ", extension"); |
463 |
break;
|
464 |
case P9_RCREATE:
|
465 |
fprintf(llogfile, "RCREATE: (");
|
466 |
pprint_qid(pdu, 1, &offset, "qid"); |
467 |
pprint_int32(pdu, 1, &offset, ", iounit"); |
468 |
break;
|
469 |
case P9_TSYMLINK:
|
470 |
fprintf(llogfile, "TSYMLINK: (");
|
471 |
pprint_int32(pdu, 0, &offset, "fid"); |
472 |
pprint_str(pdu, 0, &offset, ", name"); |
473 |
pprint_str(pdu, 0, &offset, ", symname"); |
474 |
pprint_int32(pdu, 0, &offset, ", gid"); |
475 |
break;
|
476 |
case P9_RSYMLINK:
|
477 |
fprintf(llogfile, "RSYMLINK: (");
|
478 |
pprint_qid(pdu, 1, &offset, "qid"); |
479 |
break;
|
480 |
case P9_TLCREATE:
|
481 |
fprintf(llogfile, "TLCREATE: (");
|
482 |
pprint_int32(pdu, 0, &offset, "dfid"); |
483 |
pprint_str(pdu, 0, &offset, ", name"); |
484 |
pprint_int32(pdu, 0, &offset, ", flags"); |
485 |
pprint_int32(pdu, 0, &offset, ", mode"); |
486 |
pprint_int32(pdu, 0, &offset, ", gid"); |
487 |
break;
|
488 |
case P9_RLCREATE:
|
489 |
fprintf(llogfile, "RLCREATE: (");
|
490 |
pprint_qid(pdu, 1, &offset, "qid"); |
491 |
pprint_int32(pdu, 1, &offset, ", iounit"); |
492 |
break;
|
493 |
case P9_TMKNOD:
|
494 |
fprintf(llogfile, "TMKNOD: (");
|
495 |
pprint_int32(pdu, 0, &offset, "fid"); |
496 |
pprint_str(pdu, 0, &offset, "name"); |
497 |
pprint_int32(pdu, 0, &offset, "mode"); |
498 |
pprint_int32(pdu, 0, &offset, "major"); |
499 |
pprint_int32(pdu, 0, &offset, "minor"); |
500 |
pprint_int32(pdu, 0, &offset, "gid"); |
501 |
break;
|
502 |
case P9_RMKNOD:
|
503 |
fprintf(llogfile, "RMKNOD: )");
|
504 |
pprint_qid(pdu, 0, &offset, "qid"); |
505 |
break;
|
506 |
case P9_TREADLINK:
|
507 |
fprintf(llogfile, "TREADLINK: (");
|
508 |
pprint_int32(pdu, 0, &offset, "fid"); |
509 |
break;
|
510 |
case P9_RREADLINK:
|
511 |
fprintf(llogfile, "RREADLINK: (");
|
512 |
pprint_str(pdu, 0, &offset, "target"); |
513 |
break;
|
514 |
case P9_TREAD:
|
515 |
fprintf(llogfile, "TREAD: (");
|
516 |
pprint_int32(pdu, 0, &offset, "fid"); |
517 |
pprint_int64(pdu, 0, &offset, ", offset"); |
518 |
pprint_int32(pdu, 0, &offset, ", count"); |
519 |
pprint_sg(pdu, 0, &offset, ", sg"); |
520 |
break;
|
521 |
case P9_RREAD:
|
522 |
fprintf(llogfile, "RREAD: (");
|
523 |
pprint_int32(pdu, 1, &offset, "count"); |
524 |
pprint_sg(pdu, 1, &offset, ", sg"); |
525 |
offset = 7;
|
526 |
#ifdef DEBUG_DATA
|
527 |
pprint_data(pdu, 1, &offset, ", data"); |
528 |
#endif
|
529 |
break;
|
530 |
case P9_TWRITE:
|
531 |
fprintf(llogfile, "TWRITE: (");
|
532 |
pprint_int32(pdu, 0, &offset, "fid"); |
533 |
pprint_int64(pdu, 0, &offset, ", offset"); |
534 |
pprint_int32(pdu, 0, &offset, ", count"); |
535 |
break;
|
536 |
case P9_RWRITE:
|
537 |
fprintf(llogfile, "RWRITE: (");
|
538 |
pprint_int32(pdu, 1, &offset, "count"); |
539 |
break;
|
540 |
case P9_TCLUNK:
|
541 |
fprintf(llogfile, "TCLUNK: (");
|
542 |
pprint_int32(pdu, 0, &offset, "fid"); |
543 |
break;
|
544 |
case P9_RCLUNK:
|
545 |
fprintf(llogfile, "RCLUNK: (");
|
546 |
break;
|
547 |
case P9_TFSYNC:
|
548 |
fprintf(llogfile, "TFSYNC: (");
|
549 |
pprint_int32(pdu, 0, &offset, "fid"); |
550 |
break;
|
551 |
case P9_RFSYNC:
|
552 |
fprintf(llogfile, "RFSYNC: (");
|
553 |
break;
|
554 |
case P9_TLINK:
|
555 |
fprintf(llogfile, "TLINK: (");
|
556 |
pprint_int32(pdu, 0, &offset, "dfid"); |
557 |
pprint_int32(pdu, 0, &offset, ", fid"); |
558 |
pprint_str(pdu, 0, &offset, ", newpath"); |
559 |
break;
|
560 |
case P9_RLINK:
|
561 |
fprintf(llogfile, "RLINK: (");
|
562 |
break;
|
563 |
case P9_TREMOVE:
|
564 |
fprintf(llogfile, "TREMOVE: (");
|
565 |
pprint_int32(pdu, 0, &offset, "fid"); |
566 |
break;
|
567 |
case P9_RREMOVE:
|
568 |
fprintf(llogfile, "RREMOVE: (");
|
569 |
break;
|
570 |
case P9_TSTAT:
|
571 |
fprintf(llogfile, "TSTAT: (");
|
572 |
pprint_int32(pdu, 0, &offset, "fid"); |
573 |
break;
|
574 |
case P9_RSTAT:
|
575 |
fprintf(llogfile, "RSTAT: (");
|
576 |
offset += 2; /* ignored */ |
577 |
pprint_stat(pdu, 1, &offset, "stat"); |
578 |
break;
|
579 |
case P9_TWSTAT:
|
580 |
fprintf(llogfile, "TWSTAT: (");
|
581 |
pprint_int32(pdu, 0, &offset, "fid"); |
582 |
offset += 2; /* ignored */ |
583 |
pprint_stat(pdu, 0, &offset, ", stat"); |
584 |
break;
|
585 |
case P9_RWSTAT:
|
586 |
fprintf(llogfile, "RWSTAT: (");
|
587 |
break;
|
588 |
case P9_TXATTRWALK:
|
589 |
fprintf(llogfile, "TXATTRWALK: (");
|
590 |
pprint_int32(pdu, 0, &offset, "fid"); |
591 |
pprint_int32(pdu, 0, &offset, ", newfid"); |
592 |
pprint_str(pdu, 0, &offset, ", xattr name"); |
593 |
break;
|
594 |
case P9_RXATTRWALK:
|
595 |
fprintf(llogfile, "RXATTRWALK: (");
|
596 |
pprint_int64(pdu, 1, &offset, "xattrsize"); |
597 |
case P9_TXATTRCREATE:
|
598 |
fprintf(llogfile, "TXATTRCREATE: (");
|
599 |
pprint_int32(pdu, 0, &offset, "fid"); |
600 |
pprint_str(pdu, 0, &offset, ", name"); |
601 |
pprint_int64(pdu, 0, &offset, ", xattrsize"); |
602 |
pprint_int32(pdu, 0, &offset, ", flags"); |
603 |
break;
|
604 |
case P9_RXATTRCREATE:
|
605 |
fprintf(llogfile, "RXATTRCREATE: (");
|
606 |
break;
|
607 |
case P9_TLOCK:
|
608 |
fprintf(llogfile, "TLOCK: (");
|
609 |
pprint_int32(pdu, 0, &offset, "fid"); |
610 |
pprint_int8(pdu, 0, &offset, ", type"); |
611 |
pprint_int32(pdu, 0, &offset, ", flags"); |
612 |
pprint_int64(pdu, 0, &offset, ", start"); |
613 |
pprint_int64(pdu, 0, &offset, ", length"); |
614 |
pprint_int32(pdu, 0, &offset, ", proc_id"); |
615 |
pprint_str(pdu, 0, &offset, ", client_id"); |
616 |
break;
|
617 |
case P9_RLOCK:
|
618 |
fprintf(llogfile, "RLOCK: (");
|
619 |
pprint_int8(pdu, 0, &offset, "status"); |
620 |
break;
|
621 |
case P9_TGETLOCK:
|
622 |
fprintf(llogfile, "TGETLOCK: (");
|
623 |
pprint_int32(pdu, 0, &offset, "fid"); |
624 |
pprint_int8(pdu, 0, &offset, ", type"); |
625 |
pprint_int64(pdu, 0, &offset, ", start"); |
626 |
pprint_int64(pdu, 0, &offset, ", length"); |
627 |
pprint_int32(pdu, 0, &offset, ", proc_id"); |
628 |
pprint_str(pdu, 0, &offset, ", client_id"); |
629 |
break;
|
630 |
case P9_RGETLOCK:
|
631 |
fprintf(llogfile, "RGETLOCK: (");
|
632 |
pprint_int8(pdu, 0, &offset, "type"); |
633 |
pprint_int64(pdu, 0, &offset, ", start"); |
634 |
pprint_int64(pdu, 0, &offset, ", length"); |
635 |
pprint_int32(pdu, 0, &offset, ", proc_id"); |
636 |
pprint_str(pdu, 0, &offset, ", client_id"); |
637 |
break;
|
638 |
default:
|
639 |
fprintf(llogfile, "unknown(%d): (", pdu->id);
|
640 |
break;
|
641 |
} |
642 |
|
643 |
fprintf(llogfile, ")\n");
|
644 |
/* Flush the log message out */
|
645 |
fflush(llogfile); |
646 |
} |