Rev 4537 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4537 | Rev 4668 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | #ifndef LIBBLOCK_LIBBLOCK_H_ |
37 | #ifndef LIBBLOCK_LIBBLOCK_H_ |
38 | #define LIBBLOCK_LIBBLOCK_H_ |
38 | #define LIBBLOCK_LIBBLOCK_H_ |
39 | 39 | ||
40 | #include <stdint.h> |
40 | #include <stdint.h> |
41 | #include "../../srv/vfs/vfs.h" |
41 | #include "../../srv/vfs/vfs.h" |
42 | #include <futex.h> |
- | |
43 | #include <rwlock.h> |
42 | #include <fibril_sync.h> |
44 | #include <adt/hash_table.h> |
43 | #include <adt/hash_table.h> |
45 | #include <adt/list.h> |
44 | #include <adt/list.h> |
46 | 45 | ||
47 | /* |
46 | /* |
48 | * Flags that can be used with block_get(). |
47 | * Flags that can be used with block_get(). |
Line 61... | Line 60... | ||
61 | #define BLOCK_FLAGS_NOREAD 1 |
60 | #define BLOCK_FLAGS_NOREAD 1 |
62 | 61 | ||
63 | typedef unsigned bn_t; /**< Block number type. */ |
62 | typedef unsigned bn_t; /**< Block number type. */ |
64 | 63 | ||
65 | typedef struct block { |
64 | typedef struct block { |
66 | /** Futex protecting the reference count. */ |
65 | /** Mutex protecting the reference count. */ |
67 | futex_t lock; |
66 | fibril_mutex_t lock; |
68 | /** Number of references to the block_t structure. */ |
67 | /** Number of references to the block_t structure. */ |
69 | unsigned refcnt; |
68 | unsigned refcnt; |
70 | /** If true, the block needs to be written back to the block device. */ |
69 | /** If true, the block needs to be written back to the block device. */ |
71 | bool dirty; |
70 | bool dirty; |
72 | /** Readers / Writer lock protecting the contents of the block. */ |
71 | /** Readers / Writer lock protecting the contents of the block. */ |
73 | rwlock_t contents_lock; |
72 | fibril_rwlock_t contents_lock; |
74 | /** Handle of the device where the block resides. */ |
73 | /** Handle of the device where the block resides. */ |
75 | dev_handle_t dev_handle; |
74 | dev_handle_t dev_handle; |
76 | /** Block offset on the block device. Counted in 'size'-byte blocks. */ |
75 | /** Block offset on the block device. Counted in 'size'-byte blocks. */ |
77 | bn_t boff; |
76 | bn_t boff; |
78 | /** Size of the block. */ |
77 | /** Size of the block. */ |
Line 83... | Line 82... | ||
83 | link_t hash_link; |
82 | link_t hash_link; |
84 | /** Buffer with the block data. */ |
83 | /** Buffer with the block data. */ |
85 | void *data; |
84 | void *data; |
86 | } block_t; |
85 | } block_t; |
87 | 86 | ||
- | 87 | /** Caching mode */ |
|
- | 88 | enum cache_mode { |
|
- | 89 | /** Write-Through */ |
|
- | 90 | CACHE_MODE_WT, |
|
- | 91 | /** Write-Back */ |
|
- | 92 | CACHE_MODE_WB |
|
- | 93 | }; |
|
- | 94 | ||
88 | extern int block_init(dev_handle_t, size_t); |
95 | extern int block_init(dev_handle_t, size_t); |
89 | extern void block_fini(dev_handle_t); |
96 | extern void block_fini(dev_handle_t); |
90 | 97 | ||
91 | extern int block_bb_read(dev_handle_t, off_t, size_t); |
98 | extern int block_bb_read(dev_handle_t, off_t, size_t); |
92 | extern void *block_bb_get(dev_handle_t); |
99 | extern void *block_bb_get(dev_handle_t); |
93 | 100 | ||
94 | extern int block_cache_init(dev_handle_t, size_t, unsigned); |
101 | extern int block_cache_init(dev_handle_t, size_t, unsigned, enum cache_mode); |
95 | 102 | ||
96 | extern block_t *block_get(dev_handle_t, bn_t, int flags); |
103 | extern block_t *block_get(dev_handle_t, bn_t, int); |
97 | extern void block_put(block_t *); |
104 | extern void block_put(block_t *); |
98 | 105 | ||
99 | extern int block_read(dev_handle_t, off_t *, size_t *, off_t *, void *, size_t, |
106 | extern int block_seqread(dev_handle_t, off_t *, size_t *, off_t *, void *, |
100 | size_t); |
107 | size_t, size_t); |
101 | 108 | ||
102 | #endif |
109 | #endif |
103 | 110 | ||
104 | /** @} |
111 | /** @} |
105 | */ |
112 | */ |