pull-prototypes-to-head-20020821
[openafs.git] / src / afs / afs_chunkops.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef AFS_CHUNKOPS
11 #define AFS_CHUNKOPS 1
12
13 /* macros to compute useful numbers from offsets.  AFS_CHUNK gives the chunk
14     number for a given offset; AFS_CHUNKOFFSET gives the offset into the chunk
15     and AFS_CHUNKBASE gives the byte offset of the base of the chunk.
16       AFS_CHUNKSIZE gives the size of the chunk containing an offset.
17       AFS_CHUNKTOBASE converts a chunk # to a base position.
18       Chunks are 0 based and go up by exactly 1, covering the file.
19       The other fields are internal and shouldn't be used */
20 /* basic parameters */
21 #ifdef AFS_NOCHUNKING
22
23 #define AFS_OTHERCSIZE  0x10000
24 #define AFS_LOGCHUNK    16
25 #define AFS_FIRSTCSIZE  0x40000000
26
27 #else /* AFS_NOCHUNKING */
28
29 #define AFS_OTHERCSIZE  (afs_OtherCSize)
30 #define AFS_LOGCHUNK    (afs_LogChunk)
31 #define AFS_FIRSTCSIZE  (afs_FirstCSize)
32
33 #define AFS_DEFAULTCSIZE 0x10000
34 #define AFS_DEFAULTLSIZE 16
35
36 #endif /* AFS_NOCHUNKING */
37
38 #define AFS_MINCHUNK 13  /* 8k is minimum */
39 #define AFS_MAXCHUNK 18  /* 256K is maximum */
40
41 #define AFS_CHUNKOFFSET(offset) ((offset < afs_FirstCSize) ? offset : \
42                          ((offset - afs_FirstCSize) & (afs_OtherCSize - 1)))
43
44 #define AFS_CHUNK(offset) ((offset < afs_FirstCSize) ? 0 : \
45                          (((offset - afs_FirstCSize) >> afs_LogChunk) + 1))
46
47 #define AFS_CHUNKBASE(offset) ((offset < afs_FirstCSize) ? 0 : \
48         (((offset - afs_FirstCSize) & ~(afs_OtherCSize - 1)) + afs_FirstCSize))
49
50 #define AFS_CHUNKSIZE(offset) ((offset < afs_FirstCSize) ? afs_FirstCSize : \
51                                afs_OtherCSize)
52
53 #define AFS_CHUNKTOBASE(chunk) ((chunk == 0) ? 0 :               \
54         ((afs_size_t) afs_FirstCSize + ((afs_size_t) (chunk - 1) << afs_LogChunk)))
55
56 #define AFS_CHUNKTOSIZE(chunk) ((chunk == 0) ? afs_FirstCSize : afs_OtherCSize)
57
58 /* sizes are a power of two */
59 #define AFS_SETCHUNKSIZE(chunk) { afs_LogChunk = chunk; \
60                       afs_FirstCSize = afs_OtherCSize = (1 << chunk);  }
61
62 /*
63  * Functions exported by a cache type 
64  */
65
66 struct afs_cacheOps {
67     void *(*open)(afs_int32 ainode);
68     int (*truncate)(struct osi_file *fp, int len);
69     int (*fread)(struct osi_file *fp, int offset, char *buf, int len);
70     int (*fwrite)(struct osi_file *fp, int offset, char *buf, int len);
71     int (*close)(struct osi_file *fp);
72     int (*vread)(register struct vcache *avc, struct uio *auio, 
73         struct AFS_UCRED *acred, daddr_t albn, struct buf **abpp, int noLock);
74     int (*vwrite)(register struct vcache *avc, struct uio *auio,
75         int aio, struct AFS_UCRED *acred, int noLock);
76     int (*FetchProc)(register struct rx_call *acall, 
77         struct osi_file *afile, afs_size_t abase, struct dcache *adc, 
78         struct vcache *avc, afs_size_t *abytesToXferP, 
79         afs_size_t *abytesXferredP, afs_int32 lengthFound);
80     int (*StoreProc)(register struct rx_call *acall, 
81         struct osi_file *afile, register afs_int32 alen, struct vcache *avc, 
82         int *shouldWake, afs_size_t *abytesToXferP, afs_size_t *abytesXferredP);
83     struct dcache *(*GetDSlot)(register afs_int32 aslot, register struct dcache *tmpdc);
84     struct volume *(*GetVolSlot)(void);
85     int (*HandleLink)(register struct vcache *avc, struct vrequest *areq);
86 };
87
88 /* Ideally we should have used consistent naming - like COP_OPEN, COP_TRUNCATE, etc. */
89 #define afs_CFileOpen(inode)          (void *)(*(afs_cacheType->open))(inode)
90 #define afs_CFileTruncate(handle, size) (*(afs_cacheType->truncate))((handle), size)
91 #define afs_CFileRead(file, offset, data, size) (*(afs_cacheType->fread))(file, offset, data, size)
92 #define afs_CFileWrite(file, offset, data, size) (*(afs_cacheType->fwrite))(file, offset, data, size)
93 #define afs_CFileClose(handle)          (*(afs_cacheType->close))(handle)
94 #define afs_GetDSlot(slot, adc)         (*(afs_cacheType->GetDSlot))(slot, adc)
95 #define afs_GetVolSlot()                (*(afs_cacheType->GetVolSlot))()
96 #define afs_HandleLink(avc, areq)       (*(afs_cacheType->HandleLink))(avc, areq)
97
98 #define afs_CacheFetchProc(call, file, base, adc, avc, toxfer, xfered, length) \
99           (*(afs_cacheType->FetchProc))(call, file, (afs_size_t)base, adc, avc, (afs_size_t *)toxfer, (afs_size_t *)xfered, length)
100 #define afs_CacheStoreProc(call, file, bytes, avc, wake, toxfer, xfered) \
101           (*(afs_cacheType->StoreProc))(call, file, bytes, avc, wake, toxfer, xfered)
102
103 #endif /* AFS_CHUNKOPS */
104
105
106