2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #define AFS_CHUNKOPS 1
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 */
22 #define AFS_OTHERCSIZE (afs_OtherCSize)
23 #define AFS_LOGCHUNK (afs_LogChunk)
24 #define AFS_FIRSTCSIZE (afs_FirstCSize)
26 #define AFS_DEFAULTCSIZE 0x10000
27 #define AFS_DEFAULTLSIZE 16
29 #define AFS_CHUNKOFFSET(offset) ((offset < afs_FirstCSize) ? offset : \
30 ((offset - afs_FirstCSize) & (afs_OtherCSize - 1)))
32 #define AFS_CHUNK(offset) ((offset < afs_FirstCSize) ? 0 : \
33 (((offset - afs_FirstCSize) >> afs_LogChunk) + 1))
35 #define AFS_CHUNKBASE(offset) ((offset < afs_FirstCSize) ? 0 : \
36 (((offset - afs_FirstCSize) & ~(afs_OtherCSize - 1)) + afs_FirstCSize))
38 #define AFS_CHUNKSIZE(offset) ((offset < afs_FirstCSize) ? afs_FirstCSize : \
41 #define AFS_CHUNKTOBASE(chunk) ((chunk == 0) ? 0 : \
42 ((afs_size_t) afs_FirstCSize + ((afs_size_t) (chunk - 1) << afs_LogChunk)))
44 #define AFS_CHUNKTOSIZE(chunk) ((chunk == 0) ? afs_FirstCSize : afs_OtherCSize)
46 /* sizes are a power of two */
47 #define AFS_SETCHUNKSIZE(chunk) { afs_LogChunk = chunk; \
48 afs_FirstCSize = afs_OtherCSize = (1 << chunk); }
51 * Functions exported by a cache type
55 void *(*open) (afs_dcache_id_t *ainode);
56 int (*truncate) (struct osi_file * fp, afs_int32 len);
57 int (*fread) (struct osi_file * fp, int offset, void *buf, afs_int32 len);
58 int (*fwrite) (struct osi_file * fp, afs_int32 offset, void *buf,
60 int (*close) (struct osi_file * fp);
61 int (*vread) (register struct vcache * avc, struct uio * auio,
62 struct AFS_UCRED * acred, daddr_t albn, struct buf ** abpp,
64 int (*vwrite) (register struct vcache * avc, struct uio * auio, int aio,
65 struct AFS_UCRED * acred, int noLock);
66 int (*FetchProc) (register struct rx_call * acall,
67 struct osi_file * afile, afs_size_t abase,
68 struct dcache * adc, struct vcache * avc,
69 afs_size_t * abytesToXferP, afs_size_t * abytesXferredP,
70 afs_int32 lengthFound);
71 int (*StoreProc) (register struct rx_call * acall,
72 struct osi_file * afile, register afs_int32 alen,
73 struct vcache * avc, int *shouldWake,
74 afs_size_t * abytesToXferP,
75 afs_size_t * abytesXferredP);
76 struct dcache *(*GetDSlot) (register afs_int32 aslot,
77 register struct dcache * tmpdc);
78 struct volume *(*GetVolSlot) (void);
79 int (*HandleLink) (register struct vcache * avc, struct vrequest * areq);
82 /* Ideally we should have used consistent naming - like COP_OPEN, COP_TRUNCATE, etc. */
83 #define afs_CFileOpen(inode) (void *)(*(afs_cacheType->open))(inode)
84 #define afs_CFileTruncate(handle, size) (*(afs_cacheType->truncate))((handle), size)
85 #define afs_CFileRead(file, offset, data, size) (*(afs_cacheType->fread))(file, offset, data, size)
86 #define afs_CFileWrite(file, offset, data, size) (*(afs_cacheType->fwrite))(file, offset, data, size)
87 #define afs_CFileClose(handle) (*(afs_cacheType->close))(handle)
88 #define afs_GetDSlot(slot, adc) (*(afs_cacheType->GetDSlot))(slot, adc)
89 #define afs_GetVolSlot() (*(afs_cacheType->GetVolSlot))()
90 #define afs_HandleLink(avc, areq) (*(afs_cacheType->HandleLink))(avc, areq)
92 #define afs_CacheFetchProc(call, file, base, adc, avc, toxfer, xfered, length) \
93 (*(afs_cacheType->FetchProc))(call, file, (afs_size_t)base, adc, avc, (afs_size_t *)toxfer, (afs_size_t *)xfered, length)
94 #define afs_CacheStoreProc(call, file, bytes, avc, wake, toxfer, xfered) \
95 (*(afs_cacheType->StoreProc))(call, file, bytes, avc, wake, toxfer, xfered)
97 /* These memcpys should get optimised to simple assignments when afs_dcache_id_t
99 static inline void afs_copy_inode(afs_dcache_id_t *dst, afs_dcache_id_t *src) {
100 memcpy(dst, src, sizeof(afs_dcache_id_t));
103 static inline void afs_reset_inode(afs_dcache_id_t *i) {
104 memset(i, 0, sizeof(afs_dcache_id_t));
107 /* We need to have something we can output as the 'inode' for fstrace calls.
109 static inline int afs_inode2trace(afs_dcache_id_t *i) {
114 #endif /* AFS_CHUNKOPS */