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