vlclient.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. /* AFS Volume Location Service client
  2. *
  3. * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/gfp.h>
  12. #include <linux/init.h>
  13. #include <linux/sched.h>
  14. #include "afs_fs.h"
  15. #include "internal.h"
  16. /*
  17. * Deliver reply data to a VL.GetEntryByNameU call.
  18. */
  19. static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)
  20. {
  21. struct afs_uvldbentry__xdr *uvldb;
  22. struct afs_vldb_entry *entry;
  23. bool new_only = false;
  24. u32 tmp, nr_servers, vlflags;
  25. int i, ret;
  26. _enter("");
  27. ret = afs_transfer_reply(call);
  28. if (ret < 0)
  29. return ret;
  30. /* unmarshall the reply once we've received all of it */
  31. uvldb = call->buffer;
  32. entry = call->reply[0];
  33. nr_servers = ntohl(uvldb->nServers);
  34. if (nr_servers > AFS_NMAXNSERVERS)
  35. nr_servers = AFS_NMAXNSERVERS;
  36. for (i = 0; i < ARRAY_SIZE(uvldb->name) - 1; i++)
  37. entry->name[i] = (u8)ntohl(uvldb->name[i]);
  38. entry->name[i] = 0;
  39. entry->name_len = strlen(entry->name);
  40. /* If there is a new replication site that we can use, ignore all the
  41. * sites that aren't marked as new.
  42. */
  43. for (i = 0; i < nr_servers; i++) {
  44. tmp = ntohl(uvldb->serverFlags[i]);
  45. if (!(tmp & AFS_VLSF_DONTUSE) &&
  46. (tmp & AFS_VLSF_NEWREPSITE))
  47. new_only = true;
  48. }
  49. vlflags = ntohl(uvldb->flags);
  50. for (i = 0; i < nr_servers; i++) {
  51. struct afs_uuid__xdr *xdr;
  52. struct afs_uuid *uuid;
  53. int j;
  54. tmp = ntohl(uvldb->serverFlags[i]);
  55. if (tmp & AFS_VLSF_DONTUSE ||
  56. (new_only && !(tmp & AFS_VLSF_NEWREPSITE)))
  57. continue;
  58. if (tmp & AFS_VLSF_RWVOL) {
  59. entry->fs_mask[i] |= AFS_VOL_VTM_RW;
  60. if (vlflags & AFS_VLF_BACKEXISTS)
  61. entry->fs_mask[i] |= AFS_VOL_VTM_BAK;
  62. }
  63. if (tmp & AFS_VLSF_ROVOL)
  64. entry->fs_mask[i] |= AFS_VOL_VTM_RO;
  65. if (!entry->fs_mask[i])
  66. continue;
  67. xdr = &uvldb->serverNumber[i];
  68. uuid = (struct afs_uuid *)&entry->fs_server[i];
  69. uuid->time_low = xdr->time_low;
  70. uuid->time_mid = htons(ntohl(xdr->time_mid));
  71. uuid->time_hi_and_version = htons(ntohl(xdr->time_hi_and_version));
  72. uuid->clock_seq_hi_and_reserved = (u8)ntohl(xdr->clock_seq_hi_and_reserved);
  73. uuid->clock_seq_low = (u8)ntohl(xdr->clock_seq_low);
  74. for (j = 0; j < 6; j++)
  75. uuid->node[j] = (u8)ntohl(xdr->node[j]);
  76. entry->nr_servers++;
  77. }
  78. for (i = 0; i < AFS_MAXTYPES; i++)
  79. entry->vid[i] = ntohl(uvldb->volumeId[i]);
  80. if (vlflags & AFS_VLF_RWEXISTS)
  81. __set_bit(AFS_VLDB_HAS_RW, &entry->flags);
  82. if (vlflags & AFS_VLF_ROEXISTS)
  83. __set_bit(AFS_VLDB_HAS_RO, &entry->flags);
  84. if (vlflags & AFS_VLF_BACKEXISTS)
  85. __set_bit(AFS_VLDB_HAS_BAK, &entry->flags);
  86. if (!(vlflags & (AFS_VLF_RWEXISTS | AFS_VLF_ROEXISTS | AFS_VLF_BACKEXISTS))) {
  87. entry->error = -ENOMEDIUM;
  88. __set_bit(AFS_VLDB_QUERY_ERROR, &entry->flags);
  89. }
  90. __set_bit(AFS_VLDB_QUERY_VALID, &entry->flags);
  91. _leave(" = 0 [done]");
  92. return 0;
  93. }
  94. static void afs_destroy_vl_get_entry_by_name_u(struct afs_call *call)
  95. {
  96. kfree(call->reply[0]);
  97. afs_flat_call_destructor(call);
  98. }
  99. /*
  100. * VL.GetEntryByNameU operation type.
  101. */
  102. static const struct afs_call_type afs_RXVLGetEntryByNameU = {
  103. .name = "VL.GetEntryByNameU",
  104. .op = afs_VL_GetEntryByNameU,
  105. .deliver = afs_deliver_vl_get_entry_by_name_u,
  106. .destructor = afs_destroy_vl_get_entry_by_name_u,
  107. };
  108. /*
  109. * Dispatch a get volume entry by name or ID operation (uuid variant). If the
  110. * volname is a decimal number then it's a volume ID not a volume name.
  111. */
  112. struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_net *net,
  113. struct afs_addr_cursor *ac,
  114. struct key *key,
  115. const char *volname,
  116. int volnamesz)
  117. {
  118. struct afs_vldb_entry *entry;
  119. struct afs_call *call;
  120. size_t reqsz, padsz;
  121. __be32 *bp;
  122. _enter("");
  123. padsz = (4 - (volnamesz & 3)) & 3;
  124. reqsz = 8 + volnamesz + padsz;
  125. entry = kzalloc(sizeof(struct afs_vldb_entry), GFP_KERNEL);
  126. if (!entry)
  127. return ERR_PTR(-ENOMEM);
  128. call = afs_alloc_flat_call(net, &afs_RXVLGetEntryByNameU, reqsz,
  129. sizeof(struct afs_uvldbentry__xdr));
  130. if (!call) {
  131. kfree(entry);
  132. return ERR_PTR(-ENOMEM);
  133. }
  134. call->key = key;
  135. call->reply[0] = entry;
  136. call->ret_reply0 = true;
  137. /* Marshall the parameters */
  138. bp = call->request;
  139. *bp++ = htonl(VLGETENTRYBYNAMEU);
  140. *bp++ = htonl(volnamesz);
  141. memcpy(bp, volname, volnamesz);
  142. if (padsz > 0)
  143. memset((void *)bp + volnamesz, 0, padsz);
  144. trace_afs_make_vl_call(call);
  145. return (struct afs_vldb_entry *)afs_make_call(ac, call, GFP_KERNEL, false);
  146. }
  147. /*
  148. * Deliver reply data to a VL.GetAddrsU call.
  149. *
  150. * GetAddrsU(IN ListAddrByAttributes *inaddr,
  151. * OUT afsUUID *uuidp1,
  152. * OUT uint32_t *uniquifier,
  153. * OUT uint32_t *nentries,
  154. * OUT bulkaddrs *blkaddrs);
  155. */
  156. static int afs_deliver_vl_get_addrs_u(struct afs_call *call)
  157. {
  158. struct afs_addr_list *alist;
  159. __be32 *bp;
  160. u32 uniquifier, nentries, count;
  161. int i, ret;
  162. _enter("{%u,%zu/%u}", call->unmarshall, call->offset, call->count);
  163. again:
  164. switch (call->unmarshall) {
  165. case 0:
  166. call->offset = 0;
  167. call->unmarshall++;
  168. /* Extract the returned uuid, uniquifier, nentries and blkaddrs size */
  169. case 1:
  170. ret = afs_extract_data(call, call->buffer,
  171. sizeof(struct afs_uuid__xdr) + 3 * sizeof(__be32),
  172. true);
  173. if (ret < 0)
  174. return ret;
  175. bp = call->buffer + sizeof(struct afs_uuid__xdr);
  176. uniquifier = ntohl(*bp++);
  177. nentries = ntohl(*bp++);
  178. count = ntohl(*bp);
  179. nentries = min(nentries, count);
  180. alist = afs_alloc_addrlist(nentries, FS_SERVICE, AFS_FS_PORT);
  181. if (!alist)
  182. return -ENOMEM;
  183. alist->version = uniquifier;
  184. call->reply[0] = alist;
  185. call->count = count;
  186. call->count2 = nentries;
  187. call->offset = 0;
  188. call->unmarshall++;
  189. /* Extract entries */
  190. case 2:
  191. count = min(call->count, 4U);
  192. ret = afs_extract_data(call, call->buffer,
  193. count * sizeof(__be32),
  194. call->count > 4);
  195. if (ret < 0)
  196. return ret;
  197. alist = call->reply[0];
  198. bp = call->buffer;
  199. for (i = 0; i < count; i++)
  200. if (alist->nr_addrs < call->count2)
  201. afs_merge_fs_addr4(alist, *bp++, AFS_FS_PORT);
  202. call->count -= count;
  203. if (call->count > 0)
  204. goto again;
  205. call->offset = 0;
  206. call->unmarshall++;
  207. break;
  208. }
  209. _leave(" = 0 [done]");
  210. return 0;
  211. }
  212. static void afs_vl_get_addrs_u_destructor(struct afs_call *call)
  213. {
  214. afs_put_server(call->net, (struct afs_server *)call->reply[0]);
  215. kfree(call->reply[1]);
  216. return afs_flat_call_destructor(call);
  217. }
  218. /*
  219. * VL.GetAddrsU operation type.
  220. */
  221. static const struct afs_call_type afs_RXVLGetAddrsU = {
  222. .name = "VL.GetAddrsU",
  223. .op = afs_VL_GetAddrsU,
  224. .deliver = afs_deliver_vl_get_addrs_u,
  225. .destructor = afs_vl_get_addrs_u_destructor,
  226. };
  227. /*
  228. * Dispatch an operation to get the addresses for a server, where the server is
  229. * nominated by UUID.
  230. */
  231. struct afs_addr_list *afs_vl_get_addrs_u(struct afs_net *net,
  232. struct afs_addr_cursor *ac,
  233. struct key *key,
  234. const uuid_t *uuid)
  235. {
  236. struct afs_ListAddrByAttributes__xdr *r;
  237. const struct afs_uuid *u = (const struct afs_uuid *)uuid;
  238. struct afs_call *call;
  239. __be32 *bp;
  240. int i;
  241. _enter("");
  242. call = afs_alloc_flat_call(net, &afs_RXVLGetAddrsU,
  243. sizeof(__be32) + sizeof(struct afs_ListAddrByAttributes__xdr),
  244. sizeof(struct afs_uuid__xdr) + 3 * sizeof(__be32));
  245. if (!call)
  246. return ERR_PTR(-ENOMEM);
  247. call->key = key;
  248. call->reply[0] = NULL;
  249. call->ret_reply0 = true;
  250. /* Marshall the parameters */
  251. bp = call->request;
  252. *bp++ = htonl(VLGETADDRSU);
  253. r = (struct afs_ListAddrByAttributes__xdr *)bp;
  254. r->Mask = htonl(AFS_VLADDR_UUID);
  255. r->ipaddr = 0;
  256. r->index = 0;
  257. r->spare = 0;
  258. r->uuid.time_low = u->time_low;
  259. r->uuid.time_mid = htonl(ntohs(u->time_mid));
  260. r->uuid.time_hi_and_version = htonl(ntohs(u->time_hi_and_version));
  261. r->uuid.clock_seq_hi_and_reserved = htonl(u->clock_seq_hi_and_reserved);
  262. r->uuid.clock_seq_low = htonl(u->clock_seq_low);
  263. for (i = 0; i < 6; i++)
  264. r->uuid.node[i] = htonl(u->node[i]);
  265. trace_afs_make_vl_call(call);
  266. return (struct afs_addr_list *)afs_make_call(ac, call, GFP_KERNEL, false);
  267. }
  268. /*
  269. * Deliver reply data to an VL.GetCapabilities operation.
  270. */
  271. static int afs_deliver_vl_get_capabilities(struct afs_call *call)
  272. {
  273. u32 count;
  274. int ret;
  275. _enter("{%u,%zu/%u}", call->unmarshall, call->offset, call->count);
  276. again:
  277. switch (call->unmarshall) {
  278. case 0:
  279. call->offset = 0;
  280. call->unmarshall++;
  281. /* Extract the capabilities word count */
  282. case 1:
  283. ret = afs_extract_data(call, &call->tmp,
  284. 1 * sizeof(__be32),
  285. true);
  286. if (ret < 0)
  287. return ret;
  288. count = ntohl(call->tmp);
  289. call->count = count;
  290. call->count2 = count;
  291. call->offset = 0;
  292. call->unmarshall++;
  293. /* Extract capabilities words */
  294. case 2:
  295. count = min(call->count, 16U);
  296. ret = afs_extract_data(call, call->buffer,
  297. count * sizeof(__be32),
  298. call->count > 16);
  299. if (ret < 0)
  300. return ret;
  301. /* TODO: Examine capabilities */
  302. call->count -= count;
  303. if (call->count > 0)
  304. goto again;
  305. call->offset = 0;
  306. call->unmarshall++;
  307. break;
  308. }
  309. call->reply[0] = (void *)(unsigned long)call->service_id;
  310. _leave(" = 0 [done]");
  311. return 0;
  312. }
  313. /*
  314. * VL.GetCapabilities operation type
  315. */
  316. static const struct afs_call_type afs_RXVLGetCapabilities = {
  317. .name = "VL.GetCapabilities",
  318. .op = afs_VL_GetCapabilities,
  319. .deliver = afs_deliver_vl_get_capabilities,
  320. .destructor = afs_flat_call_destructor,
  321. };
  322. /*
  323. * Probe a fileserver for the capabilities that it supports. This can
  324. * return up to 196 words.
  325. *
  326. * We use this to probe for service upgrade to determine what the server at the
  327. * other end supports.
  328. */
  329. int afs_vl_get_capabilities(struct afs_net *net,
  330. struct afs_addr_cursor *ac,
  331. struct key *key)
  332. {
  333. struct afs_call *call;
  334. __be32 *bp;
  335. _enter("");
  336. call = afs_alloc_flat_call(net, &afs_RXVLGetCapabilities, 1 * 4, 16 * 4);
  337. if (!call)
  338. return -ENOMEM;
  339. call->key = key;
  340. call->upgrade = true; /* Let's see if this is a YFS server */
  341. call->reply[0] = (void *)VLGETCAPABILITIES;
  342. call->ret_reply0 = true;
  343. /* marshall the parameters */
  344. bp = call->request;
  345. *bp++ = htonl(VLGETCAPABILITIES);
  346. /* Can't take a ref on server */
  347. trace_afs_make_vl_call(call);
  348. return afs_make_call(ac, call, GFP_KERNEL, false);
  349. }
  350. /*
  351. * Deliver reply data to a YFSVL.GetEndpoints call.
  352. *
  353. * GetEndpoints(IN yfsServerAttributes *attr,
  354. * OUT opr_uuid *uuid,
  355. * OUT afs_int32 *uniquifier,
  356. * OUT endpoints *fsEndpoints,
  357. * OUT endpoints *volEndpoints)
  358. */
  359. static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
  360. {
  361. struct afs_addr_list *alist;
  362. __be32 *bp;
  363. u32 uniquifier, size;
  364. int ret;
  365. _enter("{%u,%zu/%u,%u}", call->unmarshall, call->offset, call->count, call->count2);
  366. again:
  367. switch (call->unmarshall) {
  368. case 0:
  369. call->offset = 0;
  370. call->unmarshall = 1;
  371. /* Extract the returned uuid, uniquifier, fsEndpoints count and
  372. * either the first fsEndpoint type or the volEndpoints
  373. * count if there are no fsEndpoints. */
  374. case 1:
  375. ret = afs_extract_data(call, call->buffer,
  376. sizeof(uuid_t) +
  377. 3 * sizeof(__be32),
  378. true);
  379. if (ret < 0)
  380. return ret;
  381. bp = call->buffer + sizeof(uuid_t);
  382. uniquifier = ntohl(*bp++);
  383. call->count = ntohl(*bp++);
  384. call->count2 = ntohl(*bp); /* Type or next count */
  385. if (call->count > YFS_MAXENDPOINTS)
  386. return afs_protocol_error(call, -EBADMSG);
  387. alist = afs_alloc_addrlist(call->count, FS_SERVICE, AFS_FS_PORT);
  388. if (!alist)
  389. return -ENOMEM;
  390. alist->version = uniquifier;
  391. call->reply[0] = alist;
  392. call->offset = 0;
  393. if (call->count == 0)
  394. goto extract_volendpoints;
  395. call->unmarshall = 2;
  396. /* Extract fsEndpoints[] entries */
  397. case 2:
  398. switch (call->count2) {
  399. case YFS_ENDPOINT_IPV4:
  400. size = sizeof(__be32) * (1 + 1 + 1);
  401. break;
  402. case YFS_ENDPOINT_IPV6:
  403. size = sizeof(__be32) * (1 + 4 + 1);
  404. break;
  405. default:
  406. return afs_protocol_error(call, -EBADMSG);
  407. }
  408. size += sizeof(__be32);
  409. ret = afs_extract_data(call, call->buffer, size, true);
  410. if (ret < 0)
  411. return ret;
  412. alist = call->reply[0];
  413. bp = call->buffer;
  414. switch (call->count2) {
  415. case YFS_ENDPOINT_IPV4:
  416. if (ntohl(bp[0]) != sizeof(__be32) * 2)
  417. return afs_protocol_error(call, -EBADMSG);
  418. afs_merge_fs_addr4(alist, bp[1], ntohl(bp[2]));
  419. bp += 3;
  420. break;
  421. case YFS_ENDPOINT_IPV6:
  422. if (ntohl(bp[0]) != sizeof(__be32) * 5)
  423. return afs_protocol_error(call, -EBADMSG);
  424. afs_merge_fs_addr6(alist, bp + 1, ntohl(bp[5]));
  425. bp += 6;
  426. break;
  427. default:
  428. return afs_protocol_error(call, -EBADMSG);
  429. }
  430. /* Got either the type of the next entry or the count of
  431. * volEndpoints if no more fsEndpoints.
  432. */
  433. call->count2 = ntohl(*bp++);
  434. call->offset = 0;
  435. call->count--;
  436. if (call->count > 0)
  437. goto again;
  438. extract_volendpoints:
  439. /* Extract the list of volEndpoints. */
  440. call->count = call->count2;
  441. if (!call->count)
  442. goto end;
  443. if (call->count > YFS_MAXENDPOINTS)
  444. return afs_protocol_error(call, -EBADMSG);
  445. call->unmarshall = 3;
  446. /* Extract the type of volEndpoints[0]. Normally we would
  447. * extract the type of the next endpoint when we extract the
  448. * data of the current one, but this is the first...
  449. */
  450. case 3:
  451. ret = afs_extract_data(call, call->buffer, sizeof(__be32), true);
  452. if (ret < 0)
  453. return ret;
  454. bp = call->buffer;
  455. call->count2 = ntohl(*bp++);
  456. call->offset = 0;
  457. call->unmarshall = 4;
  458. /* Extract volEndpoints[] entries */
  459. case 4:
  460. switch (call->count2) {
  461. case YFS_ENDPOINT_IPV4:
  462. size = sizeof(__be32) * (1 + 1 + 1);
  463. break;
  464. case YFS_ENDPOINT_IPV6:
  465. size = sizeof(__be32) * (1 + 4 + 1);
  466. break;
  467. default:
  468. return afs_protocol_error(call, -EBADMSG);
  469. }
  470. if (call->count > 1)
  471. size += sizeof(__be32);
  472. ret = afs_extract_data(call, call->buffer, size, true);
  473. if (ret < 0)
  474. return ret;
  475. bp = call->buffer;
  476. switch (call->count2) {
  477. case YFS_ENDPOINT_IPV4:
  478. if (ntohl(bp[0]) != sizeof(__be32) * 2)
  479. return afs_protocol_error(call, -EBADMSG);
  480. bp += 3;
  481. break;
  482. case YFS_ENDPOINT_IPV6:
  483. if (ntohl(bp[0]) != sizeof(__be32) * 5)
  484. return afs_protocol_error(call, -EBADMSG);
  485. bp += 6;
  486. break;
  487. default:
  488. return afs_protocol_error(call, -EBADMSG);
  489. }
  490. /* Got either the type of the next entry or the count of
  491. * volEndpoints if no more fsEndpoints.
  492. */
  493. call->offset = 0;
  494. call->count--;
  495. if (call->count > 0) {
  496. call->count2 = ntohl(*bp++);
  497. goto again;
  498. }
  499. end:
  500. call->unmarshall = 5;
  501. /* Done */
  502. case 5:
  503. ret = afs_extract_data(call, call->buffer, 0, false);
  504. if (ret < 0)
  505. return ret;
  506. call->unmarshall = 6;
  507. case 6:
  508. break;
  509. }
  510. alist = call->reply[0];
  511. /* Start with IPv6 if available. */
  512. if (alist->nr_ipv4 < alist->nr_addrs)
  513. alist->index = alist->nr_ipv4;
  514. _leave(" = 0 [done]");
  515. return 0;
  516. }
  517. /*
  518. * YFSVL.GetEndpoints operation type.
  519. */
  520. static const struct afs_call_type afs_YFSVLGetEndpoints = {
  521. .name = "YFSVL.GetEndpoints",
  522. .op = afs_YFSVL_GetEndpoints,
  523. .deliver = afs_deliver_yfsvl_get_endpoints,
  524. .destructor = afs_vl_get_addrs_u_destructor,
  525. };
  526. /*
  527. * Dispatch an operation to get the addresses for a server, where the server is
  528. * nominated by UUID.
  529. */
  530. struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_net *net,
  531. struct afs_addr_cursor *ac,
  532. struct key *key,
  533. const uuid_t *uuid)
  534. {
  535. struct afs_call *call;
  536. __be32 *bp;
  537. _enter("");
  538. call = afs_alloc_flat_call(net, &afs_YFSVLGetEndpoints,
  539. sizeof(__be32) * 2 + sizeof(*uuid),
  540. sizeof(struct in6_addr) + sizeof(__be32) * 3);
  541. if (!call)
  542. return ERR_PTR(-ENOMEM);
  543. call->key = key;
  544. call->reply[0] = NULL;
  545. call->ret_reply0 = true;
  546. /* Marshall the parameters */
  547. bp = call->request;
  548. *bp++ = htonl(YVLGETENDPOINTS);
  549. *bp++ = htonl(YFS_SERVER_UUID);
  550. memcpy(bp, uuid, sizeof(*uuid)); /* Type opr_uuid */
  551. trace_afs_make_vl_call(call);
  552. return (struct afs_addr_list *)afs_make_call(ac, call, GFP_KERNEL, false);
  553. }