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