OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [linux/] [buffer_head.h] - Blame information for rev 81

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * include/linux/buffer_head.h
3
 *
4
 * Everything to do with buffer_heads.
5
 */
6
 
7
#ifndef _LINUX_BUFFER_HEAD_H
8
#define _LINUX_BUFFER_HEAD_H
9
 
10
#include <linux/types.h>
11
#include <linux/fs.h>
12
#include <linux/linkage.h>
13
#include <linux/pagemap.h>
14
#include <linux/wait.h>
15
#include <asm/atomic.h>
16
 
17
#ifdef CONFIG_BLOCK
18
 
19
enum bh_state_bits {
20
        BH_Uptodate,    /* Contains valid data */
21
        BH_Dirty,       /* Is dirty */
22
        BH_Lock,        /* Is locked */
23
        BH_Req,         /* Has been submitted for I/O */
24
        BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise
25
                          * IO completion of other buffers in the page
26
                          */
27
 
28
        BH_Mapped,      /* Has a disk mapping */
29
        BH_New,         /* Disk mapping was newly created by get_block */
30
        BH_Async_Read,  /* Is under end_buffer_async_read I/O */
31
        BH_Async_Write, /* Is under end_buffer_async_write I/O */
32
        BH_Delay,       /* Buffer is not yet allocated on disk */
33
        BH_Boundary,    /* Block is followed by a discontiguity */
34
        BH_Write_EIO,   /* I/O error on write */
35
        BH_Ordered,     /* ordered write */
36
        BH_Eopnotsupp,  /* operation not supported (barrier) */
37
        BH_Unwritten,   /* Buffer is allocated on disk but not written */
38
 
39
        BH_PrivateStart,/* not a state bit, but the first bit available
40
                         * for private allocation by other entities
41
                         */
42
};
43
 
44
#define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512)
45
 
46
struct page;
47
struct buffer_head;
48
struct address_space;
49
typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate);
50
 
51
/*
52
 * Historically, a buffer_head was used to map a single block
53
 * within a page, and of course as the unit of I/O through the
54
 * filesystem and block layers.  Nowadays the basic I/O unit
55
 * is the bio, and buffer_heads are used for extracting block
56
 * mappings (via a get_block_t call), for tracking state within
57
 * a page (via a page_mapping) and for wrapping bio submission
58
 * for backward compatibility reasons (e.g. submit_bh).
59
 */
60
struct buffer_head {
61
        unsigned long b_state;          /* buffer state bitmap (see above) */
62
        struct buffer_head *b_this_page;/* circular list of page's buffers */
63
        struct page *b_page;            /* the page this bh is mapped to */
64
 
65
        sector_t b_blocknr;             /* start block number */
66
        size_t b_size;                  /* size of mapping */
67
        char *b_data;                   /* pointer to data within the page */
68
 
69
        struct block_device *b_bdev;
70
        bh_end_io_t *b_end_io;          /* I/O completion */
71
        void *b_private;                /* reserved for b_end_io */
72
        struct list_head b_assoc_buffers; /* associated with another mapping */
73
        struct address_space *b_assoc_map;      /* mapping this buffer is
74
                                                   associated with */
75
        atomic_t b_count;               /* users using this buffer_head */
76
};
77
 
78
/*
79
 * macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
80
 * and buffer_foo() functions.
81
 */
82
#define BUFFER_FNS(bit, name)                                           \
83
static inline void set_buffer_##name(struct buffer_head *bh)            \
84
{                                                                       \
85
        set_bit(BH_##bit, &(bh)->b_state);                              \
86
}                                                                       \
87
static inline void clear_buffer_##name(struct buffer_head *bh)          \
88
{                                                                       \
89
        clear_bit(BH_##bit, &(bh)->b_state);                            \
90
}                                                                       \
91
static inline int buffer_##name(const struct buffer_head *bh)           \
92
{                                                                       \
93
        return test_bit(BH_##bit, &(bh)->b_state);                      \
94
}
95
 
96
/*
97
 * test_set_buffer_foo() and test_clear_buffer_foo()
98
 */
99
#define TAS_BUFFER_FNS(bit, name)                                       \
100
static inline int test_set_buffer_##name(struct buffer_head *bh)        \
101
{                                                                       \
102
        return test_and_set_bit(BH_##bit, &(bh)->b_state);              \
103
}                                                                       \
104
static inline int test_clear_buffer_##name(struct buffer_head *bh)      \
105
{                                                                       \
106
        return test_and_clear_bit(BH_##bit, &(bh)->b_state);            \
107
}                                                                       \
108
 
109
/*
110
 * Emit the buffer bitops functions.   Note that there are also functions
111
 * of the form "mark_buffer_foo()".  These are higher-level functions which
112
 * do something in addition to setting a b_state bit.
113
 */
114
BUFFER_FNS(Uptodate, uptodate)
115
BUFFER_FNS(Dirty, dirty)
116
TAS_BUFFER_FNS(Dirty, dirty)
117
BUFFER_FNS(Lock, locked)
118
TAS_BUFFER_FNS(Lock, locked)
119
BUFFER_FNS(Req, req)
120
TAS_BUFFER_FNS(Req, req)
121
BUFFER_FNS(Mapped, mapped)
122
BUFFER_FNS(New, new)
123
BUFFER_FNS(Async_Read, async_read)
124
BUFFER_FNS(Async_Write, async_write)
125
BUFFER_FNS(Delay, delay)
126
BUFFER_FNS(Boundary, boundary)
127
BUFFER_FNS(Write_EIO, write_io_error)
128
BUFFER_FNS(Ordered, ordered)
129
BUFFER_FNS(Eopnotsupp, eopnotsupp)
130
BUFFER_FNS(Unwritten, unwritten)
131
 
132
#define bh_offset(bh)           ((unsigned long)(bh)->b_data & ~PAGE_MASK)
133
#define touch_buffer(bh)        mark_page_accessed(bh->b_page)
134
 
135
/* If we *know* page->private refers to buffer_heads */
136
#define page_buffers(page)                                      \
137
        ({                                                      \
138
                BUG_ON(!PagePrivate(page));                     \
139
                ((struct buffer_head *)page_private(page));     \
140
        })
141
#define page_has_buffers(page)  PagePrivate(page)
142
 
143
/*
144
 * Declarations
145
 */
146
 
147
void FASTCALL(mark_buffer_dirty(struct buffer_head *bh));
148
void init_buffer(struct buffer_head *, bh_end_io_t *, void *);
149
void set_bh_page(struct buffer_head *bh,
150
                struct page *page, unsigned long offset);
151
int try_to_free_buffers(struct page *);
152
struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
153
                int retry);
154
void create_empty_buffers(struct page *, unsigned long,
155
                        unsigned long b_state);
156
void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
157
void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
158
 
159
/* Things to do with buffers at mapping->private_list */
160
void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode);
161
int inode_has_buffers(struct inode *);
162
void invalidate_inode_buffers(struct inode *);
163
int remove_inode_buffers(struct inode *inode);
164
int sync_mapping_buffers(struct address_space *mapping);
165
void unmap_underlying_metadata(struct block_device *bdev, sector_t block);
166
 
167
void mark_buffer_async_write(struct buffer_head *bh);
168
void invalidate_bdev(struct block_device *);
169
int sync_blockdev(struct block_device *bdev);
170
void __wait_on_buffer(struct buffer_head *);
171
wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
172
int fsync_bdev(struct block_device *);
173
struct super_block *freeze_bdev(struct block_device *);
174
void thaw_bdev(struct block_device *, struct super_block *);
175
int fsync_super(struct super_block *);
176
int fsync_no_super(struct block_device *);
177
struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block,
178
                        unsigned size);
179
struct buffer_head *__getblk(struct block_device *bdev, sector_t block,
180
                        unsigned size);
181
void __brelse(struct buffer_head *);
182
void __bforget(struct buffer_head *);
183
void __breadahead(struct block_device *, sector_t block, unsigned int size);
184
struct buffer_head *__bread(struct block_device *, sector_t block, unsigned size);
185
void invalidate_bh_lrus(void);
186
struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
187
void free_buffer_head(struct buffer_head * bh);
188
void FASTCALL(unlock_buffer(struct buffer_head *bh));
189
void FASTCALL(__lock_buffer(struct buffer_head *bh));
190
void ll_rw_block(int, int, struct buffer_head * bh[]);
191
int sync_dirty_buffer(struct buffer_head *bh);
192
int submit_bh(int, struct buffer_head *);
193
void write_boundary_block(struct block_device *bdev,
194
                        sector_t bblock, unsigned blocksize);
195
 
196
extern int buffer_heads_over_limit;
197
 
198
/*
199
 * Generic address_space_operations implementations for buffer_head-backed
200
 * address_spaces.
201
 */
202
void block_invalidatepage(struct page *page, unsigned long offset);
203
int block_write_full_page(struct page *page, get_block_t *get_block,
204
                                struct writeback_control *wbc);
205
int block_read_full_page(struct page*, get_block_t*);
206
int block_write_begin(struct file *, struct address_space *,
207
                                loff_t, unsigned, unsigned,
208
                                struct page **, void **, get_block_t*);
209
int block_write_end(struct file *, struct address_space *,
210
                                loff_t, unsigned, unsigned,
211
                                struct page *, void *);
212
int generic_write_end(struct file *, struct address_space *,
213
                                loff_t, unsigned, unsigned,
214
                                struct page *, void *);
215
void page_zero_new_buffers(struct page *page, unsigned from, unsigned to);
216
int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*);
217
int cont_write_begin(struct file *, struct address_space *, loff_t,
218
                        unsigned, unsigned, struct page **, void **,
219
                        get_block_t *, loff_t *);
220
int generic_cont_expand_simple(struct inode *inode, loff_t size);
221
int block_commit_write(struct page *page, unsigned from, unsigned to);
222
int block_page_mkwrite(struct vm_area_struct *vma, struct page *page,
223
                                get_block_t get_block);
224
void block_sync_page(struct page *);
225
sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
226
int generic_commit_write(struct file *, struct page *, unsigned, unsigned);
227
int block_truncate_page(struct address_space *, loff_t, get_block_t *);
228
int file_fsync(struct file *, struct dentry *, int);
229
int nobh_write_begin(struct file *, struct address_space *,
230
                                loff_t, unsigned, unsigned,
231
                                struct page **, void **, get_block_t*);
232
int nobh_write_end(struct file *, struct address_space *,
233
                                loff_t, unsigned, unsigned,
234
                                struct page *, void *);
235
int nobh_truncate_page(struct address_space *, loff_t, get_block_t *);
236
int nobh_writepage(struct page *page, get_block_t *get_block,
237
                        struct writeback_control *wbc);
238
 
239
void buffer_init(void);
240
 
241
/*
242
 * inline definitions
243
 */
244
 
245
static inline void attach_page_buffers(struct page *page,
246
                struct buffer_head *head)
247
{
248
        page_cache_get(page);
249
        SetPagePrivate(page);
250
        set_page_private(page, (unsigned long)head);
251
}
252
 
253
static inline void get_bh(struct buffer_head *bh)
254
{
255
        atomic_inc(&bh->b_count);
256
}
257
 
258
static inline void put_bh(struct buffer_head *bh)
259
{
260
        smp_mb__before_atomic_dec();
261
        atomic_dec(&bh->b_count);
262
}
263
 
264
static inline void brelse(struct buffer_head *bh)
265
{
266
        if (bh)
267
                __brelse(bh);
268
}
269
 
270
static inline void bforget(struct buffer_head *bh)
271
{
272
        if (bh)
273
                __bforget(bh);
274
}
275
 
276
static inline struct buffer_head *
277
sb_bread(struct super_block *sb, sector_t block)
278
{
279
        return __bread(sb->s_bdev, block, sb->s_blocksize);
280
}
281
 
282
static inline void
283
sb_breadahead(struct super_block *sb, sector_t block)
284
{
285
        __breadahead(sb->s_bdev, block, sb->s_blocksize);
286
}
287
 
288
static inline struct buffer_head *
289
sb_getblk(struct super_block *sb, sector_t block)
290
{
291
        return __getblk(sb->s_bdev, block, sb->s_blocksize);
292
}
293
 
294
static inline struct buffer_head *
295
sb_find_get_block(struct super_block *sb, sector_t block)
296
{
297
        return __find_get_block(sb->s_bdev, block, sb->s_blocksize);
298
}
299
 
300
static inline void
301
map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block)
302
{
303
        set_buffer_mapped(bh);
304
        bh->b_bdev = sb->s_bdev;
305
        bh->b_blocknr = block;
306
        bh->b_size = sb->s_blocksize;
307
}
308
 
309
/*
310
 * Calling wait_on_buffer() for a zero-ref buffer is illegal, so we call into
311
 * __wait_on_buffer() just to trip a debug check.  Because debug code in inline
312
 * functions is bloaty.
313
 */
314
static inline void wait_on_buffer(struct buffer_head *bh)
315
{
316
        might_sleep();
317
        if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
318
                __wait_on_buffer(bh);
319
}
320
 
321
static inline void lock_buffer(struct buffer_head *bh)
322
{
323
        might_sleep();
324
        if (test_set_buffer_locked(bh))
325
                __lock_buffer(bh);
326
}
327
 
328
extern int __set_page_dirty_buffers(struct page *page);
329
 
330
#else /* CONFIG_BLOCK */
331
 
332
static inline void buffer_init(void) {}
333
static inline int try_to_free_buffers(struct page *page) { return 1; }
334
static inline int sync_blockdev(struct block_device *bdev) { return 0; }
335
static inline int inode_has_buffers(struct inode *inode) { return 0; }
336
static inline void invalidate_inode_buffers(struct inode *inode) {}
337
static inline int remove_inode_buffers(struct inode *inode) { return 1; }
338
static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; }
339
static inline void invalidate_bdev(struct block_device *bdev) {}
340
 
341
 
342
#endif /* CONFIG_BLOCK */
343
#endif /* _LINUX_BUFFER_HEAD_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.