xref: /openbmc/linux/fs/afs/afs_vl.h (revision d32fd6bb9f2bc8178cdd65ebec1ad670a8bfa241)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
208e0e7c8SDavid Howells /* AFS Volume Location Service client interface
308e0e7c8SDavid Howells  *
408e0e7c8SDavid Howells  * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
508e0e7c8SDavid Howells  * Written by David Howells (dhowells@redhat.com)
608e0e7c8SDavid Howells  */
708e0e7c8SDavid Howells 
808e0e7c8SDavid Howells #ifndef AFS_VL_H
908e0e7c8SDavid Howells #define AFS_VL_H
1008e0e7c8SDavid Howells 
1108e0e7c8SDavid Howells #include "afs.h"
1208e0e7c8SDavid Howells 
1308e0e7c8SDavid Howells #define AFS_VL_PORT		7003	/* volume location service port */
1408e0e7c8SDavid Howells #define VL_SERVICE		52	/* RxRPC service ID for the Volume Location service */
15bf99a53cSDavid Howells #define YFS_VL_SERVICE		2503	/* Service ID for AuriStor upgraded VL service */
16*7673030eSDavid Howells #define YFS_VL_MAXCELLNAME	256  	/* Maximum length of a cell name in YFS protocol */
1708e0e7c8SDavid Howells 
1808e0e7c8SDavid Howells enum AFSVL_Operations {
1991a90380SDavid Howells 	VLGETENTRYBYID		= 503,	/* AFS Get VLDB entry by ID */
2091a90380SDavid Howells 	VLGETENTRYBYNAME	= 504,	/* AFS Get VLDB entry by name */
2191a90380SDavid Howells 	VLPROBE			= 514,	/* AFS probe VL service */
2291a90380SDavid Howells 	VLGETENTRYBYIDU		= 526,	/* AFS Get VLDB entry by ID (UUID-variant) */
2391a90380SDavid Howells 	VLGETENTRYBYNAMEU	= 527,	/* AFS Get VLDB entry by name (UUID-variant) */
2491a90380SDavid Howells 	VLGETADDRSU		= 533,	/* AFS Get addrs for fileserver */
25bf99a53cSDavid Howells 	YVLGETENDPOINTS		= 64002, /* YFS Get endpoints for file/volume server */
26c3e9f888SDavid Howells 	YVLGETCELLNAME		= 64014, /* YFS Get actual cell name */
27bf99a53cSDavid Howells 	VLGETCAPABILITIES	= 65537, /* AFS Get server capabilities */
2808e0e7c8SDavid Howells };
2908e0e7c8SDavid Howells 
3008e0e7c8SDavid Howells enum AFSVL_Errors {
3108e0e7c8SDavid Howells 	AFSVL_IDEXIST 		= 363520,	/* Volume Id entry exists in vl database */
3208e0e7c8SDavid Howells 	AFSVL_IO 		= 363521,	/* I/O related error */
3308e0e7c8SDavid Howells 	AFSVL_NAMEEXIST 	= 363522,	/* Volume name entry exists in vl database */
3408e0e7c8SDavid Howells 	AFSVL_CREATEFAIL 	= 363523,	/* Internal creation failure */
3508e0e7c8SDavid Howells 	AFSVL_NOENT 		= 363524,	/* No such entry */
3608e0e7c8SDavid Howells 	AFSVL_EMPTY 		= 363525,	/* Vl database is empty */
3708e0e7c8SDavid Howells 	AFSVL_ENTDELETED 	= 363526,	/* Entry is deleted (soft delete) */
3808e0e7c8SDavid Howells 	AFSVL_BADNAME 		= 363527,	/* Volume name is illegal */
3908e0e7c8SDavid Howells 	AFSVL_BADINDEX 		= 363528,	/* Index is out of range */
4008e0e7c8SDavid Howells 	AFSVL_BADVOLTYPE 	= 363529,	/* Bad volume type */
4108e0e7c8SDavid Howells 	AFSVL_BADSERVER 	= 363530,	/* Illegal server number (out of range) */
4208e0e7c8SDavid Howells 	AFSVL_BADPARTITION 	= 363531,	/* Bad partition number */
4308e0e7c8SDavid Howells 	AFSVL_REPSFULL 		= 363532,	/* Run out of space for Replication sites */
4408e0e7c8SDavid Howells 	AFSVL_NOREPSERVER 	= 363533,	/* No such Replication server site exists */
4508e0e7c8SDavid Howells 	AFSVL_DUPREPSERVER 	= 363534,	/* Replication site already exists */
4608e0e7c8SDavid Howells 	AFSVL_RWNOTFOUND 	= 363535,	/* Parent R/W entry not found */
4708e0e7c8SDavid Howells 	AFSVL_BADREFCOUNT 	= 363536,	/* Illegal Reference Count number */
4808e0e7c8SDavid Howells 	AFSVL_SIZEEXCEEDED 	= 363537,	/* Vl size for attributes exceeded */
4908e0e7c8SDavid Howells 	AFSVL_BADENTRY 		= 363538,	/* Bad incoming vl entry */
5008e0e7c8SDavid Howells 	AFSVL_BADVOLIDBUMP 	= 363539,	/* Illegal max volid increment */
5108e0e7c8SDavid Howells 	AFSVL_IDALREADYHASHED 	= 363540,	/* RO/BACK id already hashed */
5208e0e7c8SDavid Howells 	AFSVL_ENTRYLOCKED 	= 363541,	/* Vl entry is already locked */
5308e0e7c8SDavid Howells 	AFSVL_BADVOLOPER 	= 363542,	/* Bad volume operation code */
5408e0e7c8SDavid Howells 	AFSVL_BADRELLOCKTYPE 	= 363543,	/* Bad release lock type */
5508e0e7c8SDavid Howells 	AFSVL_RERELEASE 	= 363544,	/* Status report: last release was aborted */
56e4b9f005SDavid Howells 	AFSVL_BADSERVERFLAG 	= 363545,	/* Invalid replication site server flag */
5708e0e7c8SDavid Howells 	AFSVL_PERM 		= 363546,	/* No permission access */
5808e0e7c8SDavid Howells 	AFSVL_NOMEM 		= 363547,	/* malloc/realloc failed to alloc enough memory */
5908e0e7c8SDavid Howells };
6008e0e7c8SDavid Howells 
61bf99a53cSDavid Howells enum {
62bf99a53cSDavid Howells 	YFS_SERVER_INDEX	= 0,
63bf99a53cSDavid Howells 	YFS_SERVER_UUID		= 1,
64bf99a53cSDavid Howells 	YFS_SERVER_ENDPOINT	= 2,
65bf99a53cSDavid Howells };
66bf99a53cSDavid Howells 
67bf99a53cSDavid Howells enum {
68bf99a53cSDavid Howells 	YFS_ENDPOINT_IPV4	= 0,
69bf99a53cSDavid Howells 	YFS_ENDPOINT_IPV6	= 1,
70bf99a53cSDavid Howells };
71bf99a53cSDavid Howells 
72bf99a53cSDavid Howells #define YFS_MAXENDPOINTS	16
73bf99a53cSDavid Howells 
7408e0e7c8SDavid Howells /*
7508e0e7c8SDavid Howells  * maps to "struct vldbentry" in vvl-spec.pdf
7608e0e7c8SDavid Howells  */
7708e0e7c8SDavid Howells struct afs_vldbentry {
7808e0e7c8SDavid Howells 	char		name[65];		/* name of volume (with NUL char) */
7908e0e7c8SDavid Howells 	afs_voltype_t	type;			/* volume type */
8008e0e7c8SDavid Howells 	unsigned	num_servers;		/* num servers that hold instances of this vol */
8108e0e7c8SDavid Howells 	unsigned	clone_id;		/* cloning ID */
8208e0e7c8SDavid Howells 
8308e0e7c8SDavid Howells 	unsigned	flags;
8408e0e7c8SDavid Howells #define AFS_VLF_RWEXISTS	0x1000		/* R/W volume exists */
8508e0e7c8SDavid Howells #define AFS_VLF_ROEXISTS	0x2000		/* R/O volume exists */
8608e0e7c8SDavid Howells #define AFS_VLF_BACKEXISTS	0x4000		/* backup volume exists */
8708e0e7c8SDavid Howells 
8808e0e7c8SDavid Howells 	afs_volid_t	volume_ids[3];		/* volume IDs */
8908e0e7c8SDavid Howells 
9008e0e7c8SDavid Howells 	struct {
9108e0e7c8SDavid Howells 		struct in_addr	addr;		/* server address */
9208e0e7c8SDavid Howells 		unsigned	partition;	/* partition ID on this server */
9308e0e7c8SDavid Howells 		unsigned	flags;		/* server specific flags */
9491a90380SDavid Howells #define AFS_VLSF_NEWREPSITE	0x0001	/* Ignore all 'non-new' servers */
9508e0e7c8SDavid Howells #define AFS_VLSF_ROVOL		0x0002	/* this server holds a R/O instance of the volume */
9608e0e7c8SDavid Howells #define AFS_VLSF_RWVOL		0x0004	/* this server holds a R/W instance of the volume */
9708e0e7c8SDavid Howells #define AFS_VLSF_BACKVOL	0x0008	/* this server holds a backup instance of the volume */
9891a90380SDavid Howells #define AFS_VLSF_UUID		0x0010	/* This server is referred to by its UUID */
9991a90380SDavid Howells #define AFS_VLSF_DONTUSE	0x0020	/* This server ref should be ignored */
10008e0e7c8SDavid Howells 	} servers[8];
10108e0e7c8SDavid Howells };
10208e0e7c8SDavid Howells 
10391a90380SDavid Howells #define AFS_VLDB_MAXNAMELEN 65
10491a90380SDavid Howells 
105d2ddc776SDavid Howells 
106d2ddc776SDavid Howells struct afs_ListAddrByAttributes__xdr {
107d2ddc776SDavid Howells 	__be32			Mask;
108d2ddc776SDavid Howells #define AFS_VLADDR_IPADDR	0x1	/* Match by ->ipaddr */
109d2ddc776SDavid Howells #define AFS_VLADDR_INDEX	0x2	/* Match by ->index */
110d2ddc776SDavid Howells #define AFS_VLADDR_UUID		0x4	/* Match by ->uuid */
111d2ddc776SDavid Howells 	__be32			ipaddr;
112d2ddc776SDavid Howells 	__be32			index;
113d2ddc776SDavid Howells 	__be32			spare;
114d2ddc776SDavid Howells 	struct afs_uuid__xdr	uuid;
115d2ddc776SDavid Howells };
116d2ddc776SDavid Howells 
117d2ddc776SDavid Howells struct afs_uvldbentry__xdr {
118d2ddc776SDavid Howells 	__be32			name[AFS_VLDB_MAXNAMELEN];
119d2ddc776SDavid Howells 	__be32			nServers;
120d2ddc776SDavid Howells 	struct afs_uuid__xdr	serverNumber[AFS_NMAXNSERVERS];
121d2ddc776SDavid Howells 	__be32			serverUnique[AFS_NMAXNSERVERS];
122d2ddc776SDavid Howells 	__be32			serverPartition[AFS_NMAXNSERVERS];
123d2ddc776SDavid Howells 	__be32			serverFlags[AFS_NMAXNSERVERS];
124d2ddc776SDavid Howells 	__be32			volumeId[AFS_MAXTYPES];
125d2ddc776SDavid Howells 	__be32			cloneId;
126d2ddc776SDavid Howells 	__be32			flags;
127d2ddc776SDavid Howells 	__be32			spares1;
128d2ddc776SDavid Howells 	__be32			spares2;
129d2ddc776SDavid Howells 	__be32			spares3;
130d2ddc776SDavid Howells 	__be32			spares4;
131d2ddc776SDavid Howells 	__be32			spares5;
132d2ddc776SDavid Howells 	__be32			spares6;
133d2ddc776SDavid Howells 	__be32			spares7;
134d2ddc776SDavid Howells 	__be32			spares8;
135d2ddc776SDavid Howells 	__be32			spares9;
136d2ddc776SDavid Howells };
137d2ddc776SDavid Howells 
138d2ddc776SDavid Howells struct afs_address_list {
139d2ddc776SDavid Howells 	refcount_t		usage;
140d2ddc776SDavid Howells 	unsigned int		version;
141d2ddc776SDavid Howells 	unsigned int		nr_addrs;
142d2ddc776SDavid Howells 	struct sockaddr_rxrpc	addrs[];
143d2ddc776SDavid Howells };
144d2ddc776SDavid Howells 
145d2ddc776SDavid Howells extern void afs_put_address_list(struct afs_address_list *alist);
146d2ddc776SDavid Howells 
14708e0e7c8SDavid Howells #endif /* AFS_VL_H */
148