vlclient.c 16 KB

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