| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* volume.h: AFS volume management | 
 | 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 |  | 
 | 12 | #ifndef _LINUX_AFS_VOLUME_H | 
 | 13 | #define _LINUX_AFS_VOLUME_H | 
 | 14 |  | 
 | 15 | #include "types.h" | 
 | 16 | #include "fsclient.h" | 
 | 17 | #include "kafstimod.h" | 
 | 18 | #include "kafsasyncd.h" | 
 | 19 | #include "cache.h" | 
 | 20 |  | 
 | 21 | #define __packed __attribute__((packed)) | 
 | 22 |  | 
 | 23 | typedef enum { | 
 | 24 | 	AFS_VLUPD_SLEEP,		/* sleeping waiting for update timer to fire */ | 
 | 25 | 	AFS_VLUPD_PENDING,		/* on pending queue */ | 
 | 26 | 	AFS_VLUPD_INPROGRESS,		/* op in progress */ | 
 | 27 | 	AFS_VLUPD_BUSYSLEEP,		/* sleeping because server returned EBUSY */ | 
 | 28 | 	 | 
 | 29 | } __attribute__((packed)) afs_vlocation_upd_t; | 
 | 30 |  | 
 | 31 | /*****************************************************************************/ | 
 | 32 | /* | 
 | 33 |  * entry in the cached volume location catalogue | 
 | 34 |  */ | 
 | 35 | struct afs_cache_vlocation | 
 | 36 | { | 
 | 37 | 	uint8_t			name[64];	/* volume name (lowercase, padded with NULs) */ | 
 | 38 | 	uint8_t			nservers;	/* number of entries used in servers[] */ | 
 | 39 | 	uint8_t			vidmask;	/* voltype mask for vid[] */ | 
 | 40 | 	uint8_t			srvtmask[8];	/* voltype masks for servers[] */ | 
 | 41 | #define AFS_VOL_VTM_RW	0x01 /* R/W version of the volume is available (on this server) */ | 
 | 42 | #define AFS_VOL_VTM_RO	0x02 /* R/O version of the volume is available (on this server) */ | 
 | 43 | #define AFS_VOL_VTM_BAK	0x04 /* backup version of the volume is available (on this server) */ | 
 | 44 |  | 
 | 45 | 	afs_volid_t		vid[3];		/* volume IDs for R/W, R/O and Bak volumes */ | 
 | 46 | 	struct in_addr		servers[8];	/* fileserver addresses */ | 
 | 47 | 	time_t			rtime;		/* last retrieval time */ | 
 | 48 | }; | 
 | 49 |  | 
 | 50 | #ifdef AFS_CACHING_SUPPORT | 
 | 51 | extern struct cachefs_index_def afs_vlocation_cache_index_def; | 
 | 52 | #endif | 
 | 53 |  | 
 | 54 | /*****************************************************************************/ | 
 | 55 | /* | 
 | 56 |  * volume -> vnode hash table entry | 
 | 57 |  */ | 
 | 58 | struct afs_cache_vhash | 
 | 59 | { | 
 | 60 | 	afs_voltype_t		vtype;		/* which volume variation */ | 
 | 61 | 	uint8_t			hash_bucket;	/* which hash bucket this represents */ | 
 | 62 | } __attribute__((packed)); | 
 | 63 |  | 
 | 64 | #ifdef AFS_CACHING_SUPPORT | 
 | 65 | extern struct cachefs_index_def afs_volume_cache_index_def; | 
 | 66 | #endif | 
 | 67 |  | 
 | 68 | /*****************************************************************************/ | 
 | 69 | /* | 
 | 70 |  * AFS volume location record | 
 | 71 |  */ | 
 | 72 | struct afs_vlocation | 
 | 73 | { | 
 | 74 | 	atomic_t		usage; | 
 | 75 | 	struct list_head	link;		/* link in cell volume location list */ | 
 | 76 | 	struct afs_timer	timeout;	/* decaching timer */ | 
 | 77 | 	struct afs_cell		*cell;		/* cell to which volume belongs */ | 
 | 78 | #ifdef AFS_CACHING_SUPPORT | 
 | 79 | 	struct cachefs_cookie	*cache;		/* caching cookie */ | 
 | 80 | #endif | 
 | 81 | 	struct afs_cache_vlocation vldb;	/* volume information DB record */ | 
 | 82 | 	struct afs_volume	*vols[3];	/* volume access record pointer (index by type) */ | 
 | 83 | 	rwlock_t		lock;		/* access lock */ | 
 | 84 | 	unsigned long		read_jif;	/* time at which last read from vlserver */ | 
 | 85 | 	struct afs_timer	upd_timer;	/* update timer */ | 
 | 86 | 	struct afs_async_op	upd_op;		/* update operation */ | 
 | 87 | 	afs_vlocation_upd_t	upd_state;	/* update state */ | 
 | 88 | 	unsigned short		upd_first_svix;	/* first server index during update */ | 
 | 89 | 	unsigned short		upd_curr_svix;	/* current server index during update */ | 
 | 90 | 	unsigned short		upd_rej_cnt;	/* ENOMEDIUM count during update */ | 
 | 91 | 	unsigned short		upd_busy_cnt;	/* EBUSY count during update */ | 
 | 92 | 	unsigned short		valid;		/* T if valid */ | 
 | 93 | }; | 
 | 94 |  | 
 | 95 | extern int afs_vlocation_lookup(struct afs_cell *cell, | 
 | 96 | 				const char *name, | 
 | 97 | 				unsigned namesz, | 
 | 98 | 				struct afs_vlocation **_vlocation); | 
 | 99 |  | 
 | 100 | #define afs_get_vlocation(V) do { atomic_inc(&(V)->usage); } while(0) | 
 | 101 |  | 
 | 102 | extern void afs_put_vlocation(struct afs_vlocation *vlocation); | 
 | 103 | extern void afs_vlocation_do_timeout(struct afs_vlocation *vlocation); | 
 | 104 |  | 
 | 105 | /*****************************************************************************/ | 
 | 106 | /* | 
 | 107 |  * AFS volume access record | 
 | 108 |  */ | 
 | 109 | struct afs_volume | 
 | 110 | { | 
 | 111 | 	atomic_t		usage; | 
 | 112 | 	struct afs_cell		*cell;		/* cell to which belongs (unrefd ptr) */ | 
 | 113 | 	struct afs_vlocation	*vlocation;	/* volume location */ | 
 | 114 | #ifdef AFS_CACHING_SUPPORT | 
 | 115 | 	struct cachefs_cookie	*cache;		/* caching cookie */ | 
 | 116 | #endif | 
 | 117 | 	afs_volid_t		vid;		/* volume ID */ | 
 | 118 | 	afs_voltype_t __packed	type;		/* type of volume */ | 
 | 119 | 	char			type_force;	/* force volume type (suppress R/O -> R/W) */ | 
 | 120 | 	unsigned short		nservers;	/* number of server slots filled */ | 
 | 121 | 	unsigned short		rjservers;	/* number of servers discarded due to -ENOMEDIUM */ | 
 | 122 | 	struct afs_server	*servers[8];	/* servers on which volume resides (ordered) */ | 
 | 123 | 	struct rw_semaphore	server_sem;	/* lock for accessing current server */ | 
 | 124 | }; | 
 | 125 |  | 
 | 126 | extern int afs_volume_lookup(const char *name, | 
 | 127 | 			     struct afs_cell *cell, | 
 | 128 | 			     int rwpath, | 
 | 129 | 			     struct afs_volume **_volume); | 
 | 130 |  | 
 | 131 | #define afs_get_volume(V) do { atomic_inc(&(V)->usage); } while(0) | 
 | 132 |  | 
 | 133 | extern void afs_put_volume(struct afs_volume *volume); | 
 | 134 |  | 
 | 135 | extern int afs_volume_pick_fileserver(struct afs_volume *volume, | 
 | 136 | 				      struct afs_server **_server); | 
 | 137 |  | 
 | 138 | extern int afs_volume_release_fileserver(struct afs_volume *volume, | 
 | 139 | 					 struct afs_server *server, | 
 | 140 | 					 int result); | 
 | 141 |  | 
 | 142 | #endif /* _LINUX_AFS_VOLUME_H */ |