aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2017-11-02 11:27:51 -0400
committerDavid Howells <dhowells@redhat.com>2017-11-13 10:38:19 -0500
commit025db80c9e421efef11f2b83b7f78a11476f06db (patch)
tree1c6e049f2ae3a380f4242d0eda61d759412cdc41
parentbecfcc7e576eed03b93f412769573c93de550527 (diff)
afs: Trace the initiation and completion of client calls
Add tracepoints to trace the initiation and completion of client calls within the kafs filesystem. The afs_make_vl_call tracepoint watches calls to the volume location database server. The afs_make_fs_call tracepoint watches calls to the file server. The afs_call_done tracepoint watches for call completion. Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r--fs/afs/fsclient.c75
-rw-r--r--fs/afs/internal.h1
-rw-r--r--fs/afs/rxrpc.c25
-rw-r--r--fs/afs/vlclient.c10
-rw-r--r--include/trace/events/afs.h142
5 files changed, 233 insertions, 20 deletions
diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c
index 72ff3679fa2a..10e5ead629c2 100644
--- a/fs/afs/fsclient.c
+++ b/fs/afs/fsclient.c
@@ -16,6 +16,8 @@
16#include "internal.h" 16#include "internal.h"
17#include "afs_fs.h" 17#include "afs_fs.h"
18 18
19static const struct afs_fid afs_zero_fid;
20
19/* 21/*
20 * We need somewhere to discard into in case the server helpfully returns more 22 * We need somewhere to discard into in case the server helpfully returns more
21 * than we asked for in FS.FetchData{,64}. 23 * than we asked for in FS.FetchData{,64}.
@@ -299,6 +301,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call)
299 */ 301 */
300static const struct afs_call_type afs_RXFSFetchStatus = { 302static const struct afs_call_type afs_RXFSFetchStatus = {
301 .name = "FS.FetchStatus", 303 .name = "FS.FetchStatus",
304 .op = afs_FS_FetchStatus,
302 .deliver = afs_deliver_fs_fetch_status, 305 .deliver = afs_deliver_fs_fetch_status,
303 .destructor = afs_flat_call_destructor, 306 .destructor = afs_flat_call_destructor,
304}; 307};
@@ -335,6 +338,7 @@ int afs_fs_fetch_file_status(struct afs_fs_cursor *fc, struct afs_volsync *volsy
335 338
336 call->cb_break = fc->cb_break; 339 call->cb_break = fc->cb_break;
337 afs_use_fs_server(call, fc->cbi); 340 afs_use_fs_server(call, fc->cbi);
341 trace_afs_make_fs_call(call, &vnode->fid);
338 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 342 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
339} 343}
340 344
@@ -497,12 +501,14 @@ static void afs_fetch_data_destructor(struct afs_call *call)
497 */ 501 */
498static const struct afs_call_type afs_RXFSFetchData = { 502static const struct afs_call_type afs_RXFSFetchData = {
499 .name = "FS.FetchData", 503 .name = "FS.FetchData",
504 .op = afs_FS_FetchData,
500 .deliver = afs_deliver_fs_fetch_data, 505 .deliver = afs_deliver_fs_fetch_data,
501 .destructor = afs_fetch_data_destructor, 506 .destructor = afs_fetch_data_destructor,
502}; 507};
503 508
504static const struct afs_call_type afs_RXFSFetchData64 = { 509static const struct afs_call_type afs_RXFSFetchData64 = {
505 .name = "FS.FetchData64", 510 .name = "FS.FetchData64",
511 .op = afs_FS_FetchData64,
506 .deliver = afs_deliver_fs_fetch_data, 512 .deliver = afs_deliver_fs_fetch_data,
507 .destructor = afs_fetch_data_destructor, 513 .destructor = afs_fetch_data_destructor,
508}; 514};
@@ -527,7 +533,6 @@ static int afs_fs_fetch_data64(struct afs_fs_cursor *fc, struct afs_read *req)
527 call->reply[0] = vnode; 533 call->reply[0] = vnode;
528 call->reply[1] = NULL; /* volsync */ 534 call->reply[1] = NULL; /* volsync */
529 call->reply[2] = req; 535 call->reply[2] = req;
530 call->operation_ID = FSFETCHDATA64;
531 536
532 /* marshall the parameters */ 537 /* marshall the parameters */
533 bp = call->request; 538 bp = call->request;
@@ -543,6 +548,7 @@ static int afs_fs_fetch_data64(struct afs_fs_cursor *fc, struct afs_read *req)
543 atomic_inc(&req->usage); 548 atomic_inc(&req->usage);
544 call->cb_break = fc->cb_break; 549 call->cb_break = fc->cb_break;
545 afs_use_fs_server(call, fc->cbi); 550 afs_use_fs_server(call, fc->cbi);
551 trace_afs_make_fs_call(call, &vnode->fid);
546 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 552 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
547} 553}
548 554
@@ -571,7 +577,6 @@ int afs_fs_fetch_data(struct afs_fs_cursor *fc, struct afs_read *req)
571 call->reply[0] = vnode; 577 call->reply[0] = vnode;
572 call->reply[1] = NULL; /* volsync */ 578 call->reply[1] = NULL; /* volsync */
573 call->reply[2] = req; 579 call->reply[2] = req;
574 call->operation_ID = FSFETCHDATA;
575 580
576 /* marshall the parameters */ 581 /* marshall the parameters */
577 bp = call->request; 582 bp = call->request;
@@ -585,6 +590,7 @@ int afs_fs_fetch_data(struct afs_fs_cursor *fc, struct afs_read *req)
585 atomic_inc(&req->usage); 590 atomic_inc(&req->usage);
586 call->cb_break = fc->cb_break; 591 call->cb_break = fc->cb_break;
587 afs_use_fs_server(call, fc->cbi); 592 afs_use_fs_server(call, fc->cbi);
593 trace_afs_make_fs_call(call, &vnode->fid);
588 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 594 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
589} 595}
590 596
@@ -618,8 +624,16 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call)
618/* 624/*
619 * FS.CreateFile and FS.MakeDir operation type 625 * FS.CreateFile and FS.MakeDir operation type
620 */ 626 */
621static const struct afs_call_type afs_RXFSCreateXXXX = { 627static const struct afs_call_type afs_RXFSCreateFile = {
622 .name = "FS.CreateXXXX", 628 .name = "FS.CreateFile",
629 .op = afs_FS_CreateFile,
630 .deliver = afs_deliver_fs_create_vnode,
631 .destructor = afs_flat_call_destructor,
632};
633
634static const struct afs_call_type afs_RXFSMakeDir = {
635 .name = "FS.MakeDir",
636 .op = afs_FS_MakeDir,
623 .deliver = afs_deliver_fs_create_vnode, 637 .deliver = afs_deliver_fs_create_vnode,
624 .destructor = afs_flat_call_destructor, 638 .destructor = afs_flat_call_destructor,
625}; 639};
@@ -646,8 +660,9 @@ int afs_fs_create(struct afs_fs_cursor *fc,
646 padsz = (4 - (namesz & 3)) & 3; 660 padsz = (4 - (namesz & 3)) & 3;
647 reqsz = (5 * 4) + namesz + padsz + (6 * 4); 661 reqsz = (5 * 4) + namesz + padsz + (6 * 4);
648 662
649 call = afs_alloc_flat_call(net, &afs_RXFSCreateXXXX, reqsz, 663 call = afs_alloc_flat_call(
650 (3 + 21 + 21 + 3 + 6) * 4); 664 net, S_ISDIR(mode) ? &afs_RXFSMakeDir : &afs_RXFSCreateFile,
665 reqsz, (3 + 21 + 21 + 3 + 6) * 4);
651 if (!call) 666 if (!call)
652 return -ENOMEM; 667 return -ENOMEM;
653 668
@@ -678,6 +693,7 @@ int afs_fs_create(struct afs_fs_cursor *fc,
678 *bp++ = 0; /* segment size */ 693 *bp++ = 0; /* segment size */
679 694
680 afs_use_fs_server(call, fc->cbi); 695 afs_use_fs_server(call, fc->cbi);
696 trace_afs_make_fs_call(call, &vnode->fid);
681 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 697 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
682} 698}
683 699
@@ -708,8 +724,16 @@ static int afs_deliver_fs_remove(struct afs_call *call)
708/* 724/*
709 * FS.RemoveDir/FS.RemoveFile operation type 725 * FS.RemoveDir/FS.RemoveFile operation type
710 */ 726 */
711static const struct afs_call_type afs_RXFSRemoveXXXX = { 727static const struct afs_call_type afs_RXFSRemoveFile = {
712 .name = "FS.RemoveXXXX", 728 .name = "FS.RemoveFile",
729 .op = afs_FS_RemoveFile,
730 .deliver = afs_deliver_fs_remove,
731 .destructor = afs_flat_call_destructor,
732};
733
734static const struct afs_call_type afs_RXFSRemoveDir = {
735 .name = "FS.RemoveDir",
736 .op = afs_FS_RemoveDir,
713 .deliver = afs_deliver_fs_remove, 737 .deliver = afs_deliver_fs_remove,
714 .destructor = afs_flat_call_destructor, 738 .destructor = afs_flat_call_destructor,
715}; 739};
@@ -731,7 +755,9 @@ int afs_fs_remove(struct afs_fs_cursor *fc, const char *name, bool isdir)
731 padsz = (4 - (namesz & 3)) & 3; 755 padsz = (4 - (namesz & 3)) & 3;
732 reqsz = (5 * 4) + namesz + padsz; 756 reqsz = (5 * 4) + namesz + padsz;
733 757
734 call = afs_alloc_flat_call(net, &afs_RXFSRemoveXXXX, reqsz, (21 + 6) * 4); 758 call = afs_alloc_flat_call(
759 net, isdir ? &afs_RXFSRemoveDir : &afs_RXFSRemoveFile,
760 reqsz, (21 + 6) * 4);
735 if (!call) 761 if (!call)
736 return -ENOMEM; 762 return -ENOMEM;
737 763
@@ -753,6 +779,7 @@ int afs_fs_remove(struct afs_fs_cursor *fc, const char *name, bool isdir)
753 } 779 }
754 780
755 afs_use_fs_server(call, fc->cbi); 781 afs_use_fs_server(call, fc->cbi);
782 trace_afs_make_fs_call(call, &vnode->fid);
756 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 783 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
757} 784}
758 785
@@ -786,6 +813,7 @@ static int afs_deliver_fs_link(struct afs_call *call)
786 */ 813 */
787static const struct afs_call_type afs_RXFSLink = { 814static const struct afs_call_type afs_RXFSLink = {
788 .name = "FS.Link", 815 .name = "FS.Link",
816 .op = afs_FS_Link,
789 .deliver = afs_deliver_fs_link, 817 .deliver = afs_deliver_fs_link,
790 .destructor = afs_flat_call_destructor, 818 .destructor = afs_flat_call_destructor,
791}; 819};
@@ -834,6 +862,7 @@ int afs_fs_link(struct afs_fs_cursor *fc, struct afs_vnode *vnode,
834 *bp++ = htonl(vnode->fid.unique); 862 *bp++ = htonl(vnode->fid.unique);
835 863
836 afs_use_fs_server(call, fc->cbi); 864 afs_use_fs_server(call, fc->cbi);
865 trace_afs_make_fs_call(call, &vnode->fid);
837 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 866 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
838} 867}
839 868
@@ -868,6 +897,7 @@ static int afs_deliver_fs_symlink(struct afs_call *call)
868 */ 897 */
869static const struct afs_call_type afs_RXFSSymlink = { 898static const struct afs_call_type afs_RXFSSymlink = {
870 .name = "FS.Symlink", 899 .name = "FS.Symlink",
900 .op = afs_FS_Symlink,
871 .deliver = afs_deliver_fs_symlink, 901 .deliver = afs_deliver_fs_symlink,
872 .destructor = afs_flat_call_destructor, 902 .destructor = afs_flat_call_destructor,
873}; 903};
@@ -935,6 +965,7 @@ int afs_fs_symlink(struct afs_fs_cursor *fc,
935 *bp++ = 0; /* segment size */ 965 *bp++ = 0; /* segment size */
936 966
937 afs_use_fs_server(call, fc->cbi); 967 afs_use_fs_server(call, fc->cbi);
968 trace_afs_make_fs_call(call, &vnode->fid);
938 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 969 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
939} 970}
940 971
@@ -970,6 +1001,7 @@ static int afs_deliver_fs_rename(struct afs_call *call)
970 */ 1001 */
971static const struct afs_call_type afs_RXFSRename = { 1002static const struct afs_call_type afs_RXFSRename = {
972 .name = "FS.Rename", 1003 .name = "FS.Rename",
1004 .op = afs_FS_Rename,
973 .deliver = afs_deliver_fs_rename, 1005 .deliver = afs_deliver_fs_rename,
974 .destructor = afs_flat_call_destructor, 1006 .destructor = afs_flat_call_destructor,
975}; 1007};
@@ -1035,6 +1067,7 @@ int afs_fs_rename(struct afs_fs_cursor *fc,
1035 } 1067 }
1036 1068
1037 afs_use_fs_server(call, fc->cbi); 1069 afs_use_fs_server(call, fc->cbi);
1070 trace_afs_make_fs_call(call, &orig_dvnode->fid);
1038 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1071 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1039} 1072}
1040 1073
@@ -1070,12 +1103,14 @@ static int afs_deliver_fs_store_data(struct afs_call *call)
1070 */ 1103 */
1071static const struct afs_call_type afs_RXFSStoreData = { 1104static const struct afs_call_type afs_RXFSStoreData = {
1072 .name = "FS.StoreData", 1105 .name = "FS.StoreData",
1106 .op = afs_FS_StoreData,
1073 .deliver = afs_deliver_fs_store_data, 1107 .deliver = afs_deliver_fs_store_data,
1074 .destructor = afs_flat_call_destructor, 1108 .destructor = afs_flat_call_destructor,
1075}; 1109};
1076 1110
1077static const struct afs_call_type afs_RXFSStoreData64 = { 1111static const struct afs_call_type afs_RXFSStoreData64 = {
1078 .name = "FS.StoreData64", 1112 .name = "FS.StoreData64",
1113 .op = afs_FS_StoreData64,
1079 .deliver = afs_deliver_fs_store_data, 1114 .deliver = afs_deliver_fs_store_data,
1080 .destructor = afs_flat_call_destructor, 1115 .destructor = afs_flat_call_destructor,
1081}; 1116};
@@ -1135,6 +1170,7 @@ static int afs_fs_store_data64(struct afs_fs_cursor *fc,
1135 *bp++ = htonl(i_size >> 32); 1170 *bp++ = htonl(i_size >> 32);
1136 *bp++ = htonl((u32) i_size); 1171 *bp++ = htonl((u32) i_size);
1137 1172
1173 trace_afs_make_fs_call(call, &vnode->fid);
1138 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1174 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1139} 1175}
1140 1176
@@ -1208,6 +1244,7 @@ int afs_fs_store_data(struct afs_fs_cursor *fc, struct afs_writeback *wb,
1208 *bp++ = htonl(i_size); 1244 *bp++ = htonl(i_size);
1209 1245
1210 afs_use_fs_server(call, fc->cbi); 1246 afs_use_fs_server(call, fc->cbi);
1247 trace_afs_make_fs_call(call, &vnode->fid);
1211 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1248 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1212} 1249}
1213 1250
@@ -1245,18 +1282,21 @@ static int afs_deliver_fs_store_status(struct afs_call *call)
1245 */ 1282 */
1246static const struct afs_call_type afs_RXFSStoreStatus = { 1283static const struct afs_call_type afs_RXFSStoreStatus = {
1247 .name = "FS.StoreStatus", 1284 .name = "FS.StoreStatus",
1285 .op = afs_FS_StoreStatus,
1248 .deliver = afs_deliver_fs_store_status, 1286 .deliver = afs_deliver_fs_store_status,
1249 .destructor = afs_flat_call_destructor, 1287 .destructor = afs_flat_call_destructor,
1250}; 1288};
1251 1289
1252static const struct afs_call_type afs_RXFSStoreData_as_Status = { 1290static const struct afs_call_type afs_RXFSStoreData_as_Status = {
1253 .name = "FS.StoreData", 1291 .name = "FS.StoreData",
1292 .op = afs_FS_StoreData,
1254 .deliver = afs_deliver_fs_store_status, 1293 .deliver = afs_deliver_fs_store_status,
1255 .destructor = afs_flat_call_destructor, 1294 .destructor = afs_flat_call_destructor,
1256}; 1295};
1257 1296
1258static const struct afs_call_type afs_RXFSStoreData64_as_Status = { 1297static const struct afs_call_type afs_RXFSStoreData64_as_Status = {
1259 .name = "FS.StoreData64", 1298 .name = "FS.StoreData64",
1299 .op = afs_FS_StoreData64,
1260 .deliver = afs_deliver_fs_store_status, 1300 .deliver = afs_deliver_fs_store_status,
1261 .destructor = afs_flat_call_destructor, 1301 .destructor = afs_flat_call_destructor,
1262}; 1302};
@@ -1286,7 +1326,6 @@ static int afs_fs_setattr_size64(struct afs_fs_cursor *fc, struct iattr *attr)
1286 call->key = fc->key; 1326 call->key = fc->key;
1287 call->reply[0] = vnode; 1327 call->reply[0] = vnode;
1288 call->store_version = vnode->status.data_version + 1; 1328 call->store_version = vnode->status.data_version + 1;
1289 call->operation_ID = FSSTOREDATA;
1290 1329
1291 /* marshall the parameters */ 1330 /* marshall the parameters */
1292 bp = call->request; 1331 bp = call->request;
@@ -1305,6 +1344,7 @@ static int afs_fs_setattr_size64(struct afs_fs_cursor *fc, struct iattr *attr)
1305 *bp++ = htonl((u32) attr->ia_size); 1344 *bp++ = htonl((u32) attr->ia_size);
1306 1345
1307 afs_use_fs_server(call, fc->cbi); 1346 afs_use_fs_server(call, fc->cbi);
1347 trace_afs_make_fs_call(call, &vnode->fid);
1308 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1348 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1309} 1349}
1310 1350
@@ -1335,7 +1375,6 @@ static int afs_fs_setattr_size(struct afs_fs_cursor *fc, struct iattr *attr)
1335 call->key = fc->key; 1375 call->key = fc->key;
1336 call->reply[0] = vnode; 1376 call->reply[0] = vnode;
1337 call->store_version = vnode->status.data_version + 1; 1377 call->store_version = vnode->status.data_version + 1;
1338 call->operation_ID = FSSTOREDATA;
1339 1378
1340 /* marshall the parameters */ 1379 /* marshall the parameters */
1341 bp = call->request; 1380 bp = call->request;
@@ -1351,6 +1390,7 @@ static int afs_fs_setattr_size(struct afs_fs_cursor *fc, struct iattr *attr)
1351 *bp++ = htonl(attr->ia_size); /* new file length */ 1390 *bp++ = htonl(attr->ia_size); /* new file length */
1352 1391
1353 afs_use_fs_server(call, fc->cbi); 1392 afs_use_fs_server(call, fc->cbi);
1393 trace_afs_make_fs_call(call, &vnode->fid);
1354 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1394 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1355} 1395}
1356 1396
@@ -1379,7 +1419,6 @@ int afs_fs_setattr(struct afs_fs_cursor *fc, struct iattr *attr)
1379 1419
1380 call->key = fc->key; 1420 call->key = fc->key;
1381 call->reply[0] = vnode; 1421 call->reply[0] = vnode;
1382 call->operation_ID = FSSTORESTATUS;
1383 1422
1384 /* marshall the parameters */ 1423 /* marshall the parameters */
1385 bp = call->request; 1424 bp = call->request;
@@ -1391,6 +1430,7 @@ int afs_fs_setattr(struct afs_fs_cursor *fc, struct iattr *attr)
1391 xdr_encode_AFS_StoreStatus(&bp, attr); 1430 xdr_encode_AFS_StoreStatus(&bp, attr);
1392 1431
1393 afs_use_fs_server(call, fc->cbi); 1432 afs_use_fs_server(call, fc->cbi);
1433 trace_afs_make_fs_call(call, &vnode->fid);
1394 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1434 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1395} 1435}
1396 1436
@@ -1581,6 +1621,7 @@ static void afs_get_volume_status_call_destructor(struct afs_call *call)
1581 */ 1621 */
1582static const struct afs_call_type afs_RXFSGetVolumeStatus = { 1622static const struct afs_call_type afs_RXFSGetVolumeStatus = {
1583 .name = "FS.GetVolumeStatus", 1623 .name = "FS.GetVolumeStatus",
1624 .op = afs_FS_GetVolumeStatus,
1584 .deliver = afs_deliver_fs_get_volume_status, 1625 .deliver = afs_deliver_fs_get_volume_status,
1585 .destructor = afs_get_volume_status_call_destructor, 1626 .destructor = afs_get_volume_status_call_destructor,
1586}; 1627};
@@ -1620,6 +1661,7 @@ int afs_fs_get_volume_status(struct afs_fs_cursor *fc,
1620 bp[1] = htonl(vnode->fid.vid); 1661 bp[1] = htonl(vnode->fid.vid);
1621 1662
1622 afs_use_fs_server(call, fc->cbi); 1663 afs_use_fs_server(call, fc->cbi);
1664 trace_afs_make_fs_call(call, &vnode->fid);
1623 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1665 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1624} 1666}
1625 1667
@@ -1650,6 +1692,7 @@ static int afs_deliver_fs_xxxx_lock(struct afs_call *call)
1650 */ 1692 */
1651static const struct afs_call_type afs_RXFSSetLock = { 1693static const struct afs_call_type afs_RXFSSetLock = {
1652 .name = "FS.SetLock", 1694 .name = "FS.SetLock",
1695 .op = afs_FS_SetLock,
1653 .deliver = afs_deliver_fs_xxxx_lock, 1696 .deliver = afs_deliver_fs_xxxx_lock,
1654 .destructor = afs_flat_call_destructor, 1697 .destructor = afs_flat_call_destructor,
1655}; 1698};
@@ -1659,6 +1702,7 @@ static const struct afs_call_type afs_RXFSSetLock = {
1659 */ 1702 */
1660static const struct afs_call_type afs_RXFSExtendLock = { 1703static const struct afs_call_type afs_RXFSExtendLock = {
1661 .name = "FS.ExtendLock", 1704 .name = "FS.ExtendLock",
1705 .op = afs_FS_ExtendLock,
1662 .deliver = afs_deliver_fs_xxxx_lock, 1706 .deliver = afs_deliver_fs_xxxx_lock,
1663 .destructor = afs_flat_call_destructor, 1707 .destructor = afs_flat_call_destructor,
1664}; 1708};
@@ -1668,6 +1712,7 @@ static const struct afs_call_type afs_RXFSExtendLock = {
1668 */ 1712 */
1669static const struct afs_call_type afs_RXFSReleaseLock = { 1713static const struct afs_call_type afs_RXFSReleaseLock = {
1670 .name = "FS.ReleaseLock", 1714 .name = "FS.ReleaseLock",
1715 .op = afs_FS_ReleaseLock,
1671 .deliver = afs_deliver_fs_xxxx_lock, 1716 .deliver = afs_deliver_fs_xxxx_lock,
1672 .destructor = afs_flat_call_destructor, 1717 .destructor = afs_flat_call_destructor,
1673}; 1718};
@@ -1700,6 +1745,7 @@ int afs_fs_set_lock(struct afs_fs_cursor *fc, afs_lock_type_t type)
1700 *bp++ = htonl(type); 1745 *bp++ = htonl(type);
1701 1746
1702 afs_use_fs_server(call, fc->cbi); 1747 afs_use_fs_server(call, fc->cbi);
1748 trace_afs_make_fs_call(call, &vnode->fid);
1703 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1749 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1704} 1750}
1705 1751
@@ -1730,6 +1776,7 @@ int afs_fs_extend_lock(struct afs_fs_cursor *fc)
1730 *bp++ = htonl(vnode->fid.unique); 1776 *bp++ = htonl(vnode->fid.unique);
1731 1777
1732 afs_use_fs_server(call, fc->cbi); 1778 afs_use_fs_server(call, fc->cbi);
1779 trace_afs_make_fs_call(call, &vnode->fid);
1733 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1780 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1734} 1781}
1735 1782
@@ -1760,6 +1807,7 @@ int afs_fs_release_lock(struct afs_fs_cursor *fc)
1760 *bp++ = htonl(vnode->fid.unique); 1807 *bp++ = htonl(vnode->fid.unique);
1761 1808
1762 afs_use_fs_server(call, fc->cbi); 1809 afs_use_fs_server(call, fc->cbi);
1810 trace_afs_make_fs_call(call, &vnode->fid);
1763 return afs_make_call(&fc->ac, call, GFP_NOFS, false); 1811 return afs_make_call(&fc->ac, call, GFP_NOFS, false);
1764} 1812}
1765 1813
@@ -1776,6 +1824,7 @@ static int afs_deliver_fs_give_up_all_callbacks(struct afs_call *call)
1776 */ 1824 */
1777static const struct afs_call_type afs_RXFSGiveUpAllCallBacks = { 1825static const struct afs_call_type afs_RXFSGiveUpAllCallBacks = {
1778 .name = "FS.GiveUpAllCallBacks", 1826 .name = "FS.GiveUpAllCallBacks",
1827 .op = afs_FS_GiveUpAllCallBacks,
1779 .deliver = afs_deliver_fs_give_up_all_callbacks, 1828 .deliver = afs_deliver_fs_give_up_all_callbacks,
1780 .destructor = afs_flat_call_destructor, 1829 .destructor = afs_flat_call_destructor,
1781}; 1830};
@@ -1866,6 +1915,7 @@ again:
1866 */ 1915 */
1867static const struct afs_call_type afs_RXFSGetCapabilities = { 1916static const struct afs_call_type afs_RXFSGetCapabilities = {
1868 .name = "FS.GetCapabilities", 1917 .name = "FS.GetCapabilities",
1918 .op = afs_FS_GetCapabilities,
1869 .deliver = afs_deliver_fs_get_capabilities, 1919 .deliver = afs_deliver_fs_get_capabilities,
1870 .destructor = afs_flat_call_destructor, 1920 .destructor = afs_flat_call_destructor,
1871}; 1921};
@@ -1895,5 +1945,6 @@ int afs_fs_get_capabilities(struct afs_net *net,
1895 *bp++ = htonl(FSGETCAPABILITIES); 1945 *bp++ = htonl(FSGETCAPABILITIES);
1896 1946
1897 /* Can't take a ref on server */ 1947 /* Can't take a ref on server */
1948 trace_afs_make_fs_call(call, NULL);
1898 return afs_make_call(ac, call, GFP_NOFS, false); 1949 return afs_make_call(ac, call, GFP_NOFS, false);
1899} 1950}
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index 767317bf33db..aad12546e0ea 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -124,6 +124,7 @@ struct afs_call {
124 124
125struct afs_call_type { 125struct afs_call_type {
126 const char *name; 126 const char *name;
127 unsigned int op; /* Really enum afs_fs_operation */
127 128
128 /* deliver request or reply data to an call 129 /* deliver request or reply data to an call
129 * - returning an error will cause the call to be aborted 130 * - returning an error will cause the call to be aborted
diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
index 1d075696bf55..59cc58022c4d 100644
--- a/fs/afs/rxrpc.c
+++ b/fs/afs/rxrpc.c
@@ -219,6 +219,7 @@ struct afs_call *afs_alloc_flat_call(struct afs_net *net,
219 goto nomem_free; 219 goto nomem_free;
220 } 220 }
221 221
222 call->operation_ID = type->op;
222 init_waitqueue_head(&call->waitq); 223 init_waitqueue_head(&call->waitq);
223 return call; 224 return call;
224 225
@@ -422,6 +423,8 @@ error_do_abort:
422 ac->abort_code = call->abort_code; 423 ac->abort_code = call->abort_code;
423 ac->responded = true; 424 ac->responded = true;
424 } 425 }
426 call->error = ret;
427 trace_afs_call_done(call);
425error_kill_call: 428error_kill_call:
426 afs_put_call(call); 429 afs_put_call(call);
427 ac->error = ret; 430 ac->error = ret;
@@ -455,10 +458,10 @@ static void afs_deliver_to_call(struct afs_call *call)
455 458
456 if (ret == -EINPROGRESS || ret == -EAGAIN) 459 if (ret == -EINPROGRESS || ret == -EAGAIN)
457 return; 460 return;
458 if (ret == 1 || ret < 0) { 461 if (ret < 0)
459 call->state = AFS_CALL_COMPLETE; 462 call->error = ret;
460 goto done; 463 if (ret < 0 || ret == 1)
461 } 464 goto call_complete;
462 return; 465 return;
463 } 466 }
464 467
@@ -466,7 +469,7 @@ static void afs_deliver_to_call(struct afs_call *call)
466 switch (ret) { 469 switch (ret) {
467 case 0: 470 case 0:
468 if (call->state == AFS_CALL_AWAIT_REPLY) 471 if (call->state == AFS_CALL_AWAIT_REPLY)
469 call->state = AFS_CALL_COMPLETE; 472 goto call_complete;
470 goto done; 473 goto done;
471 case -EINPROGRESS: 474 case -EINPROGRESS:
472 case -EAGAIN: 475 case -EAGAIN:
@@ -505,7 +508,11 @@ out:
505 508
506save_error: 509save_error:
507 call->error = ret; 510 call->error = ret;
508 call->state = AFS_CALL_COMPLETE; 511call_complete:
512 if (call->state != AFS_CALL_COMPLETE) {
513 call->state = AFS_CALL_COMPLETE;
514 trace_afs_call_done(call);
515 }
509 goto done; 516 goto done;
510} 517}
511 518
@@ -567,8 +574,10 @@ static long afs_wait_for_call_to_complete(struct afs_call *call,
567 if (call->state < AFS_CALL_COMPLETE) { 574 if (call->state < AFS_CALL_COMPLETE) {
568 _debug("call interrupted"); 575 _debug("call interrupted");
569 if (rxrpc_kernel_abort_call(call->net->socket, call->rxcall, 576 if (rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
570 RX_USER_ABORT, -EINTR, "KWI")) 577 RX_USER_ABORT, -EINTR, "KWI")) {
571 call->error = -ERESTARTSYS; 578 call->error = -ERESTARTSYS;
579 trace_afs_call_done(call);
580 }
572 } 581 }
573 582
574 ac->abort_code = call->abort_code; 583 ac->abort_code = call->abort_code;
@@ -882,6 +891,7 @@ int afs_extract_data(struct afs_call *call, void *buf, size_t count,
882 switch (call->state) { 891 switch (call->state) {
883 case AFS_CALL_AWAIT_REPLY: 892 case AFS_CALL_AWAIT_REPLY:
884 call->state = AFS_CALL_COMPLETE; 893 call->state = AFS_CALL_COMPLETE;
894 trace_afs_call_done(call);
885 break; 895 break;
886 case AFS_CALL_AWAIT_REQUEST: 896 case AFS_CALL_AWAIT_REQUEST:
887 call->state = AFS_CALL_REPLYING; 897 call->state = AFS_CALL_REPLYING;
@@ -894,5 +904,6 @@ int afs_extract_data(struct afs_call *call, void *buf, size_t count,
894 904
895 call->error = ret; 905 call->error = ret;
896 call->state = AFS_CALL_COMPLETE; 906 call->state = AFS_CALL_COMPLETE;
907 trace_afs_call_done(call);
897 return ret; 908 return ret;
898} 909}
diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c
index 1d38cbdf6cad..e372f89fd36a 100644
--- a/fs/afs/vlclient.c
+++ b/fs/afs/vlclient.c
@@ -114,6 +114,7 @@ static void afs_destroy_vl_get_entry_by_name_u(struct afs_call *call)
114 */ 114 */
115static const struct afs_call_type afs_RXVLGetEntryByNameU = { 115static const struct afs_call_type afs_RXVLGetEntryByNameU = {
116 .name = "VL.GetEntryByNameU", 116 .name = "VL.GetEntryByNameU",
117 .op = afs_VL_GetEntryByNameU,
117 .deliver = afs_deliver_vl_get_entry_by_name_u, 118 .deliver = afs_deliver_vl_get_entry_by_name_u,
118 .destructor = afs_destroy_vl_get_entry_by_name_u, 119 .destructor = afs_destroy_vl_get_entry_by_name_u,
119}; 120};
@@ -161,6 +162,7 @@ struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_net *net,
161 if (padsz > 0) 162 if (padsz > 0)
162 memset((void *)bp + volnamesz, 0, padsz); 163 memset((void *)bp + volnamesz, 0, padsz);
163 164
165 trace_afs_make_vl_call(call);
164 return (struct afs_vldb_entry *)afs_make_call(ac, call, GFP_KERNEL, false); 166 return (struct afs_vldb_entry *)afs_make_call(ac, call, GFP_KERNEL, false);
165} 167}
166 168
@@ -251,6 +253,7 @@ static void afs_vl_get_addrs_u_destructor(struct afs_call *call)
251 */ 253 */
252static const struct afs_call_type afs_RXVLGetAddrsU = { 254static const struct afs_call_type afs_RXVLGetAddrsU = {
253 .name = "VL.GetAddrsU", 255 .name = "VL.GetAddrsU",
256 .op = afs_VL_GetAddrsU,
254 .deliver = afs_deliver_vl_get_addrs_u, 257 .deliver = afs_deliver_vl_get_addrs_u,
255 .destructor = afs_vl_get_addrs_u_destructor, 258 .destructor = afs_vl_get_addrs_u_destructor,
256}; 259};
@@ -298,6 +301,7 @@ struct afs_addr_list *afs_vl_get_addrs_u(struct afs_net *net,
298 for (i = 0; i < 6; i++) 301 for (i = 0; i < 6; i++)
299 r->uuid.node[i] = ntohl(u->node[i]); 302 r->uuid.node[i] = ntohl(u->node[i]);
300 303
304 trace_afs_make_vl_call(call);
301 return (struct afs_addr_list *)afs_make_call(ac, call, GFP_KERNEL, false); 305 return (struct afs_addr_list *)afs_make_call(ac, call, GFP_KERNEL, false);
302} 306}
303 307
@@ -362,6 +366,7 @@ again:
362 */ 366 */
363static const struct afs_call_type afs_RXVLGetCapabilities = { 367static const struct afs_call_type afs_RXVLGetCapabilities = {
364 .name = "VL.GetCapabilities", 368 .name = "VL.GetCapabilities",
369 .op = afs_VL_GetCapabilities,
365 .deliver = afs_deliver_vl_get_capabilities, 370 .deliver = afs_deliver_vl_get_capabilities,
366 .destructor = afs_flat_call_destructor, 371 .destructor = afs_flat_call_destructor,
367}; 372};
@@ -396,6 +401,7 @@ int afs_vl_get_capabilities(struct afs_net *net,
396 *bp++ = htonl(VLGETCAPABILITIES); 401 *bp++ = htonl(VLGETCAPABILITIES);
397 402
398 /* Can't take a ref on server */ 403 /* Can't take a ref on server */
404 trace_afs_make_vl_call(call);
399 return afs_make_call(ac, call, GFP_KERNEL, false); 405 return afs_make_call(ac, call, GFP_KERNEL, false);
400} 406}
401 407
@@ -598,7 +604,8 @@ again:
598 * YFSVL.GetEndpoints operation type. 604 * YFSVL.GetEndpoints operation type.
599 */ 605 */
600static const struct afs_call_type afs_YFSVLGetEndpoints = { 606static const struct afs_call_type afs_YFSVLGetEndpoints = {
601 .name = "VL.GetEndpoints", 607 .name = "YFSVL.GetEndpoints",
608 .op = afs_YFSVL_GetEndpoints,
602 .deliver = afs_deliver_yfsvl_get_endpoints, 609 .deliver = afs_deliver_yfsvl_get_endpoints,
603 .destructor = afs_vl_get_addrs_u_destructor, 610 .destructor = afs_vl_get_addrs_u_destructor,
604}; 611};
@@ -633,5 +640,6 @@ struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_net *net,
633 *bp++ = htonl(YFS_SERVER_UUID); 640 *bp++ = htonl(YFS_SERVER_UUID);
634 memcpy(bp, uuid, sizeof(*uuid)); /* Type opr_uuid */ 641 memcpy(bp, uuid, sizeof(*uuid)); /* Type opr_uuid */
635 642
643 trace_afs_make_vl_call(call);
636 return (struct afs_addr_list *)afs_make_call(ac, call, GFP_KERNEL, false); 644 return (struct afs_addr_list *)afs_make_call(ac, call, GFP_KERNEL, false);
637} 645}
diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h
index 8b95c16b7045..dd9d2600ee98 100644
--- a/include/trace/events/afs.h
+++ b/include/trace/events/afs.h
@@ -30,6 +30,38 @@ enum afs_call_trace {
30 afs_call_trace_work, 30 afs_call_trace_work,
31}; 31};
32 32
33enum afs_fs_operation {
34 afs_FS_FetchData = 130, /* AFS Fetch file data */
35 afs_FS_FetchStatus = 132, /* AFS Fetch file status */
36 afs_FS_StoreData = 133, /* AFS Store file data */
37 afs_FS_StoreStatus = 135, /* AFS Store file status */
38 afs_FS_RemoveFile = 136, /* AFS Remove a file */
39 afs_FS_CreateFile = 137, /* AFS Create a file */
40 afs_FS_Rename = 138, /* AFS Rename or move a file or directory */
41 afs_FS_Symlink = 139, /* AFS Create a symbolic link */
42 afs_FS_Link = 140, /* AFS Create a hard link */
43 afs_FS_MakeDir = 141, /* AFS Create a directory */
44 afs_FS_RemoveDir = 142, /* AFS Remove a directory */
45 afs_FS_GetVolumeInfo = 148, /* AFS Get information about a volume */
46 afs_FS_GetVolumeStatus = 149, /* AFS Get volume status information */
47 afs_FS_GetRootVolume = 151, /* AFS Get root volume name */
48 afs_FS_SetLock = 156, /* AFS Request a file lock */
49 afs_FS_ExtendLock = 157, /* AFS Extend a file lock */
50 afs_FS_ReleaseLock = 158, /* AFS Release a file lock */
51 afs_FS_Lookup = 161, /* AFS lookup file in directory */
52 afs_FS_FetchData64 = 65537, /* AFS Fetch file data */
53 afs_FS_StoreData64 = 65538, /* AFS Store file data */
54 afs_FS_GiveUpAllCallBacks = 65539, /* AFS Give up all our callbacks on a server */
55 afs_FS_GetCapabilities = 65540, /* AFS Get FS server capabilities */
56};
57
58enum afs_vl_operation {
59 afs_VL_GetEntryByNameU = 527, /* AFS Get Vol Entry By Name operation ID */
60 afs_VL_GetAddrsU = 533, /* AFS Get FS server addresses */
61 afs_YFSVL_GetEndpoints = 64002, /* YFS Get FS & Vol server addresses */
62 afs_VL_GetCapabilities = 65537, /* AFS Get VL server capabilities */
63};
64
33#endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ 65#endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */
34 66
35/* 67/*
@@ -42,6 +74,37 @@ enum afs_call_trace {
42 EM(afs_call_trace_wake, "WAKE ") \ 74 EM(afs_call_trace_wake, "WAKE ") \
43 E_(afs_call_trace_work, "WORK ") 75 E_(afs_call_trace_work, "WORK ")
44 76
77#define afs_fs_operations \
78 EM(afs_FS_FetchData, "FS.FetchData") \
79 EM(afs_FS_FetchStatus, "FS.FetchStatus") \
80 EM(afs_FS_StoreData, "FS.StoreData") \
81 EM(afs_FS_StoreStatus, "FS.StoreStatus") \
82 EM(afs_FS_RemoveFile, "FS.RemoveFile") \
83 EM(afs_FS_CreateFile, "FS.CreateFile") \
84 EM(afs_FS_Rename, "FS.Rename") \
85 EM(afs_FS_Symlink, "FS.Symlink") \
86 EM(afs_FS_Link, "FS.Link") \
87 EM(afs_FS_MakeDir, "FS.MakeDir") \
88 EM(afs_FS_RemoveDir, "FS.RemoveDir") \
89 EM(afs_FS_GetVolumeInfo, "FS.GetVolumeInfo") \
90 EM(afs_FS_GetVolumeStatus, "FS.GetVolumeStatus") \
91 EM(afs_FS_GetRootVolume, "FS.GetRootVolume") \
92 EM(afs_FS_SetLock, "FS.SetLock") \
93 EM(afs_FS_ExtendLock, "FS.ExtendLock") \
94 EM(afs_FS_ReleaseLock, "FS.ReleaseLock") \
95 EM(afs_FS_Lookup, "FS.Lookup") \
96 EM(afs_FS_FetchData64, "FS.FetchData64") \
97 EM(afs_FS_StoreData64, "FS.StoreData64") \
98 EM(afs_FS_GiveUpAllCallBacks, "FS.GiveUpAllCallBacks") \
99 E_(afs_FS_GetCapabilities, "FS.GetCapabilities")
100
101#define afs_vl_operations \
102 EM(afs_VL_GetEntryByNameU, "VL.GetEntryByNameU") \
103 EM(afs_VL_GetAddrsU, "VL.GetAddrsU") \
104 EM(afs_YFSVL_GetEndpoints, "YFSVL.GetEndpoints") \
105 E_(afs_VL_GetCapabilities, "VL.GetCapabilities")
106
107
45/* 108/*
46 * Export enum symbols via userspace. 109 * Export enum symbols via userspace.
47 */ 110 */
@@ -51,6 +114,8 @@ enum afs_call_trace {
51#define E_(a, b) TRACE_DEFINE_ENUM(a); 114#define E_(a, b) TRACE_DEFINE_ENUM(a);
52 115
53afs_call_traces; 116afs_call_traces;
117afs_fs_operations;
118afs_vl_operations;
54 119
55/* 120/*
56 * Now redefine the EM() and E_() macros to map the enums to the strings that 121 * Now redefine the EM() and E_() macros to map the enums to the strings that
@@ -178,6 +243,83 @@ TRACE_EVENT(afs_call,
178 __entry->where) 243 __entry->where)
179 ); 244 );
180 245
246TRACE_EVENT(afs_make_fs_call,
247 TP_PROTO(struct afs_call *call, const struct afs_fid *fid),
248
249 TP_ARGS(call, fid),
250
251 TP_STRUCT__entry(
252 __field(struct afs_call *, call )
253 __field(enum afs_fs_operation, op )
254 __field_struct(struct afs_fid, fid )
255 ),
256
257 TP_fast_assign(
258 __entry->call = call;
259 __entry->op = call->operation_ID;
260 if (fid) {
261 __entry->fid = *fid;
262 } else {
263 __entry->fid.vid = 0;
264 __entry->fid.vnode = 0;
265 __entry->fid.unique = 0;
266 }
267 ),
268
269 TP_printk("c=%p %06x:%06x:%06x %s",
270 __entry->call,
271 __entry->fid.vid,
272 __entry->fid.vnode,
273 __entry->fid.unique,
274 __print_symbolic(__entry->op, afs_fs_operations))
275 );
276
277TRACE_EVENT(afs_make_vl_call,
278 TP_PROTO(struct afs_call *call),
279
280 TP_ARGS(call),
281
282 TP_STRUCT__entry(
283 __field(struct afs_call *, call )
284 __field(enum afs_vl_operation, op )
285 ),
286
287 TP_fast_assign(
288 __entry->call = call;
289 __entry->op = call->operation_ID;
290 ),
291
292 TP_printk("c=%p %s",
293 __entry->call,
294 __print_symbolic(__entry->op, afs_vl_operations))
295 );
296
297TRACE_EVENT(afs_call_done,
298 TP_PROTO(struct afs_call *call),
299
300 TP_ARGS(call),
301
302 TP_STRUCT__entry(
303 __field(struct afs_call *, call )
304 __field(struct rxrpc_call *, rx_call )
305 __field(int, ret )
306 __field(u32, abort_code )
307 ),
308
309 TP_fast_assign(
310 __entry->call = call;
311 __entry->rx_call = call->rxcall;
312 __entry->ret = call->error;
313 __entry->abort_code = call->abort_code;
314 ),
315
316 TP_printk(" c=%p ret=%d ab=%d [%p]",
317 __entry->call,
318 __entry->ret,
319 __entry->abort_code,
320 __entry->rx_call)
321 );
322
181#endif /* _TRACE_AFS_H */ 323#endif /* _TRACE_AFS_H */
182 324
183/* This part must be outside protection */ 325/* This part must be outside protection */