From: Andrew Morton <akpm@zip.com.au>
To: lkml <linux-kernel@vger.kernel.org>
Subject: [patch] buffer-layer cleanup
Date: Wed, 24 Apr 2002 01:58:55 -0700 [thread overview]
Message-ID: <3CC673CF.15794899@zip.com.au> (raw)
Moves all buffer_head-related stuff out of linux/fs.h and into
linux/buffer_head.h. buffer_head.h is currently included at the very
end of fs.h. So it is possible to include buffer_head directly from
all .c files and remove this nested include.
Also rationalises all the set_buffer_foo() and mark_buffer_bar()
functions. We have:
set_buffer_foo(bh)
clear_buffer_foo(bh)
buffer_foo(bh)
and, in some cases, where needed:
test_set_buffer_foo(bh)
test_clear_buffer_foo(bh)
And that's it.
BUFFER_FNS() and TAS_BUFFER_FNS() macros generate all the above real
inline functions. Normally not a big fan of cpp abuse, but in this
case it fits. These function-generating macros are available to
filesystems to expand their own b_state functions. JBD uses this in
one case.
Updates all callers to use the above API.
=====================================
--- 2.5.9/include/linux/fs.h~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/include/linux/fs.h Wed Apr 24 01:39:42 2002
@@ -206,97 +206,12 @@ extern int leases_enable, dir_notify_ena
extern void update_atime (struct inode *);
#define UPDATE_ATIME(inode) update_atime (inode)
-extern void buffer_init(void);
extern void inode_init(unsigned long);
extern void mnt_init(unsigned long);
extern void files_init(unsigned long);
-/* bh state bits */
-enum bh_state_bits {
- BH_Uptodate, /* 1 if the buffer contains valid data */
- BH_Dirty, /* 1 if the buffer is dirty */
- BH_Lock, /* 1 if the buffer is locked */
- BH_Req, /* 0 if the buffer has been invalidated */
-
- BH_Mapped, /* 1 if the buffer has a disk mapping */
- BH_New, /* 1 if the buffer is new and not yet written out */
- BH_Async, /* 1 if the buffer is under end_buffer_io_async I/O */
- BH_JBD, /* 1 if it has an attached journal_head */
-
- BH_PrivateStart,/* not a state bit, but the first bit available
- * for private allocation by other entities
- */
-};
-
-/*
- * Try to keep the most commonly used fields in single cache lines (16
- * bytes) to improve performance. This ordering should be
- * particularly beneficial on 32-bit processors.
- *
- * We use the first 16 bytes for the data which is used in searches
- * over the block hash lists (ie. getblk() and friends).
- *
- * The second 16 bytes we use for lru buffer scans, as used by
- * sync_buffers() and refill_freelist(). -- sct
- */
-struct buffer_head {
- /* First cache line: */
- sector_t b_blocknr; /* block number */
- unsigned short b_size; /* block size */
- kdev_t b_dev; /* device (B_FREE = free) */
- struct block_device *b_bdev;
-
- atomic_t b_count; /* users using this block */
- unsigned long b_state; /* buffer state bitmap (see above) */
- struct buffer_head *b_this_page;/* circular list of buffers in one page */
- struct page *b_page; /* the page this bh is mapped to */
-
- char * b_data; /* pointer to data block */
- void (*b_end_io)(struct buffer_head *bh, int uptodate); /* I/O completion */
- void *b_private; /* reserved for b_end_io */
-
- wait_queue_head_t b_wait;
-
- struct list_head b_inode_buffers; /* doubly linked list of inode dirty buffers */
-};
-
-typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate);
-void init_buffer(struct buffer_head *, bh_end_io_t *, void *);
-
-#define __buffer_state(bh, state) (((bh)->b_state & (1UL << BH_##state)) != 0)
-
-#define buffer_uptodate(bh) __buffer_state(bh,Uptodate)
-#define buffer_dirty(bh) __buffer_state(bh,Dirty)
-#define buffer_locked(bh) __buffer_state(bh,Lock)
-#define buffer_req(bh) __buffer_state(bh,Req)
-#define buffer_mapped(bh) __buffer_state(bh,Mapped)
-#define buffer_new(bh) __buffer_state(bh,New)
-#define buffer_async(bh) __buffer_state(bh,Async)
-
-#define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK)
-
-extern void set_bh_page(struct buffer_head *bh, struct page *page, unsigned long offset);
-
-#define touch_buffer(bh) mark_page_accessed(bh->b_page)
-
-/* If we *know* page->private refers to buffer_heads */
-#define page_buffers(page) \
- ({ \
- if (!PagePrivate(page)) \
- BUG(); \
- ((struct buffer_head *)(page)->private); \
- })
-#define page_has_buffers(page) PagePrivate(page)
-#define set_page_buffers(page, buffers) \
- do { \
- SetPagePrivate(page); \
- page->private = (unsigned long)buffers; \
- } while (0)
-#define clear_page_buffers(page) \
- do { \
- ClearPagePrivate(page); \
- page->private = 0; \
- } while (0)
+struct buffer_head;
+typedef int (get_block_t)(struct inode*,sector_t,struct buffer_head*,int);
#include <linux/pipe_fs_i.h>
/* #include <linux/umsdos_fs_i.h> */
@@ -1211,82 +1126,6 @@ extern struct file_operations rdwr_pipe_
extern int fs_may_remount_ro(struct super_block *);
-extern int try_to_free_buffers(struct page *);
-extern void create_empty_buffers(struct page *, unsigned long,
- unsigned long b_state);
-extern void end_buffer_io_sync(struct buffer_head *bh, int uptodate);
-
-/* reiserfs_writepage needs this */
-extern void set_buffer_async_io(struct buffer_head *bh) ;
-
-static inline void get_bh(struct buffer_head * bh)
-{
- atomic_inc(&(bh)->b_count);
-}
-
-static inline void put_bh(struct buffer_head *bh)
-{
- smp_mb__before_atomic_dec();
- atomic_dec(&bh->b_count);
-}
-
-/*
- * This is called by bh->b_end_io() handlers when I/O has completed.
- */
-static inline void mark_buffer_uptodate(struct buffer_head * bh, int on)
-{
- if (on)
- set_bit(BH_Uptodate, &bh->b_state);
- else
- clear_bit(BH_Uptodate, &bh->b_state);
-}
-
-#define atomic_set_buffer_clean(bh) test_and_clear_bit(BH_Dirty, &(bh)->b_state)
-
-static inline void mark_buffer_clean(struct buffer_head * bh)
-{
- clear_bit(BH_Dirty, &(bh)->b_state);
-}
-
-extern void FASTCALL(mark_buffer_dirty(struct buffer_head *bh));
-extern void buffer_insert_list(spinlock_t *lock,
- struct buffer_head *, struct list_head *);
-
-static inline void
-buffer_insert_inode_queue(struct buffer_head *bh, struct inode *inode)
-{
- buffer_insert_list(&inode->i_bufferlist_lock,
- bh, &inode->i_dirty_buffers);
-}
-
-#define atomic_set_buffer_dirty(bh) test_and_set_bit(BH_Dirty, &(bh)->b_state)
-
-static inline void mark_buffer_async(struct buffer_head * bh, int on)
-{
- if (on)
- set_bit(BH_Async, &bh->b_state);
- else
- clear_bit(BH_Async, &bh->b_state);
-}
-
-/*
- * If an error happens during the make_request, this function
- * has to be recalled. It marks the buffer as clean and not
- * uptodate, and it notifys the upper layer about the end
- * of the I/O.
- */
-static inline void buffer_IO_error(struct buffer_head * bh)
-{
- mark_buffer_clean(bh);
-
- /*
- * b_end_io has to clear the BH_Uptodate bitflag in the read error
- * case, however buffer contents are not necessarily bad if a
- * write fails
- */
- bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
-}
-
/*
* return READ, READA, or WRITE
*/
@@ -1297,37 +1136,13 @@ static inline void buffer_IO_error(struc
*/
#define bio_data_dir(bio) ((bio)->bi_rw & 1)
-extern void buffer_insert_inode_queue(struct buffer_head *, struct inode *);
-static inline void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode)
-{
- mark_buffer_dirty(bh);
- buffer_insert_inode_queue(bh, inode);
-}
-
extern int check_disk_change(kdev_t);
extern int invalidate_inodes(struct super_block *);
extern int invalidate_device(kdev_t, int);
extern void invalidate_inode_pages(struct inode *);
extern void invalidate_inode_pages2(struct address_space *);
-extern void invalidate_inode_buffers(struct inode *);
-#define invalidate_buffers(dev) __invalidate_buffers((dev), 0)
-#define destroy_buffers(dev) __invalidate_buffers((dev), 1)
-extern void invalidate_bdev(struct block_device *, int);
-extern void __invalidate_buffers(kdev_t dev, int);
extern void write_inode_now(struct inode *, int);
-extern int sync_buffers(struct block_device *, int);
-extern int fsync_dev(kdev_t);
-extern int fsync_bdev(struct block_device *);
-extern int fsync_super(struct super_block *);
-extern int fsync_no_super(struct block_device *);
extern void sync_inodes_sb(struct super_block *);
-extern int fsync_buffers_list(spinlock_t *lock, struct list_head *);
-static inline int fsync_inode_buffers(struct inode *inode)
-{
- return fsync_buffers_list(&inode->i_bufferlist_lock,
- &inode->i_dirty_buffers);
-}
-extern int inode_has_buffers(struct inode *);
extern int filemap_fdatasync(struct address_space *);
extern int filemap_fdatawait(struct address_space *);
extern void sync_supers(void);
@@ -1438,113 +1253,15 @@ extern void insert_inode_hash(struct ino
extern void remove_inode_hash(struct inode *);
extern struct file * get_empty_filp(void);
extern void file_move(struct file *f, struct list_head *list);
-extern struct buffer_head * __get_hash_table(struct block_device *, sector_t, int);
-static inline struct buffer_head * get_hash_table(kdev_t dev, sector_t block, int size)
-{
- struct block_device *bdev;
- struct buffer_head *bh;
- bdev = bdget(kdev_t_to_nr(dev));
- if (!bdev) {
- printk("No block device for %s\n", bdevname(dev));
- BUG();
- }
- bh = __get_hash_table(bdev, block, size);
- atomic_dec(&bdev->bd_count);
- return bh;
-}
-extern struct buffer_head * __getblk(struct block_device *, sector_t, int);
-static inline struct buffer_head * getblk(kdev_t dev, sector_t block, int size)
-{
- struct block_device *bdev;
- struct buffer_head *bh;
- bdev = bdget(kdev_t_to_nr(dev));
- if (!bdev) {
- printk("No block device for %s\n", bdevname(dev));
- BUG();
- }
- bh = __getblk(bdev, block, size);
- atomic_dec(&bdev->bd_count);
- return bh;
-}
+
extern void ll_rw_block(int, int, struct buffer_head * bh[]);
extern int submit_bh(int, struct buffer_head *);
struct bio;
extern int submit_bio(int, struct bio *);
extern int is_read_only(kdev_t);
-extern void __brelse(struct buffer_head *);
-static inline void brelse(struct buffer_head *buf)
-{
- if (buf)
- __brelse(buf);
-}
-extern void __bforget(struct buffer_head *);
-static inline void bforget(struct buffer_head *buf)
-{
- if (buf)
- __bforget(buf);
-}
extern int set_blocksize(kdev_t, int);
extern int sb_set_blocksize(struct super_block *, int);
extern int sb_min_blocksize(struct super_block *, int);
-extern struct buffer_head * __bread(struct block_device *, int, int);
-static inline struct buffer_head * bread(kdev_t dev, int block, int size)
-{
- struct block_device *bdev;
- struct buffer_head *bh;
- bdev = bdget(kdev_t_to_nr(dev));
- if (!bdev) {
- printk("No block device for %s\n", bdevname(dev));
- BUG();
- }
- bh = __bread(bdev, block, size);
- atomic_dec(&bdev->bd_count);
- return bh;
-}
-static inline struct buffer_head * sb_bread(struct super_block *sb, int block)
-{
- return __bread(sb->s_bdev, block, sb->s_blocksize);
-}
-static inline struct buffer_head * sb_getblk(struct super_block *sb, int block)
-{
- return __getblk(sb->s_bdev, block, sb->s_blocksize);
-}
-static inline struct buffer_head * sb_get_hash_table(struct super_block *sb, int block)
-{
- return __get_hash_table(sb->s_bdev, block, sb->s_blocksize);
-}
-static inline void map_bh(struct buffer_head *bh, struct super_block *sb, int block)
-{
- bh->b_state |= 1 << BH_Mapped;
- bh->b_bdev = sb->s_bdev;
- bh->b_dev = sb->s_dev;
- bh->b_blocknr = block;
-}
-
-extern void wakeup_bdflush(void);
-extern struct buffer_head *alloc_buffer_head(int async);
-extern void free_buffer_head(struct buffer_head * bh);
-
-extern int brw_page(int, struct page *, struct block_device *, sector_t [], int);
-
-typedef int (get_block_t)(struct inode*,sector_t,struct buffer_head*,int);
-
-/* Generic buffer handling for block filesystems.. */
-extern int try_to_release_page(struct page * page, int gfp_mask);
-extern int block_flushpage(struct page *page, unsigned long offset);
-extern int block_symlink(struct inode *, const char *, int);
-extern int block_write_full_page(struct page*, get_block_t*);
-extern int block_read_full_page(struct page*, get_block_t*);
-extern int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*);
-extern int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*,
- unsigned long *);
-extern int generic_cont_expand(struct inode *inode, loff_t size) ;
-extern int block_commit_write(struct page *page, unsigned from, unsigned to);
-extern int block_sync_page(struct page *);
-
-sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
-int generic_commit_write(struct file *, struct page *, unsigned, unsigned);
-int block_truncate_page(struct address_space *, loff_t, get_block_t *);
-extern int generic_direct_IO(int, struct inode *, struct kiobuf *, unsigned long, int, get_block_t *);
extern int generic_file_mmap(struct file *, struct vm_area_struct *);
extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
@@ -1594,12 +1311,6 @@ extern ssize_t block_read(struct file *,
extern ssize_t char_write(struct file *, const char *, size_t, loff_t *);
extern ssize_t block_write(struct file *, const char *, size_t, loff_t *);
-extern int file_fsync(struct file *, struct dentry *, int);
-extern int generic_osync_inode(struct inode *, int);
-#define OSYNC_METADATA (1<<0)
-#define OSYNC_DATA (1<<1)
-#define OSYNC_INODE (1<<2)
-
extern int inode_change_ok(struct inode *, struct iattr *);
extern int inode_setattr(struct inode *, struct iattr *);
@@ -1612,8 +1323,7 @@ static inline ino_t parent_ino(struct de
return res;
}
-void __buffer_error(char *file, int line);
-#define buffer_error() __buffer_error(__FILE__, __LINE__)
+#include <linux/buffer_head.h>
#endif /* __KERNEL__ */
--- 2.5.9/drivers/block/ll_rw_blk.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/drivers/block/ll_rw_blk.c Wed Apr 24 01:29:31 2002
@@ -1429,7 +1429,7 @@ int submit_bh(int rw, struct buffer_head
{
struct bio *bio;
- BUG_ON(!test_bit(BH_Lock, &bh->b_state));
+ BUG_ON(!buffer_locked(bh));
BUG_ON(!buffer_mapped(bh));
BUG_ON(!bh->b_end_io);
@@ -1438,7 +1438,7 @@ int submit_bh(int rw, struct buffer_head
if (rw == WRITE && !buffer_uptodate(bh))
printk("%s: write of non-uptodate buffer\n", __FUNCTION__);
- set_bit(BH_Req, &bh->b_state);
+ set_buffer_req(bh);
/*
* from here on down, it's all bio -- do the initial mapping,
@@ -1531,7 +1531,7 @@ void ll_rw_block(int rw, int nr, struct
struct buffer_head *bh = bhs[i];
/* Only one thread can actually submit the I/O. */
- if (test_and_set_bit(BH_Lock, &bh->b_state))
+ if (test_set_buffer_locked(bh))
continue;
/* We have the buffer lock */
@@ -1540,7 +1540,7 @@ void ll_rw_block(int rw, int nr, struct
switch(rw) {
case WRITE:
- if (!atomic_set_buffer_clean(bh))
+ if (!test_clear_buffer_dirty(bh))
/* Hmmph! Nothing to write */
goto end_io;
break;
@@ -1554,7 +1554,7 @@ void ll_rw_block(int rw, int nr, struct
default:
BUG();
end_io:
- bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
+ bh->b_end_io(bh, buffer_uptodate(bh));
continue;
}
@@ -1565,7 +1565,7 @@ void ll_rw_block(int rw, int nr, struct
sorry:
/* Make sure we don't get infinite dirty retries.. */
for (i = 0; i < nr; i++)
- mark_buffer_clean(bhs[i]);
+ clear_buffer_dirty(bhs[i]);
}
#ifdef CONFIG_STRAM_SWAP
--- 2.5.9/drivers/md/raid5.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/drivers/md/raid5.c Wed Apr 24 01:20:43 2002
@@ -211,7 +211,7 @@ static inline void init_stripe(struct st
buffer_locked(sh->bh_cache[i]));
BUG();
}
- clear_bit(BH_Uptodate, &sh->bh_cache[i]->b_state);
+ clear_buffer_uptodate(sh->bh_cache[i]);
raid5_build_block(sh, i);
}
insert_hash(conf, sh);
@@ -411,7 +411,7 @@ static void raid5_end_read_request (stru
buffer = NULL;
spin_unlock_irqrestore(&conf->device_lock, flags);
if (sh->bh_page[i]==NULL)
- set_bit(BH_Uptodate, &bh->b_state);
+ set_buffer_uptodate(bh);
if (buffer) {
if (buffer->b_page != bh->b_page)
memcpy(buffer->b_data, bh->b_data, bh->b_size);
@@ -419,16 +419,16 @@ static void raid5_end_read_request (stru
}
} else {
md_error(conf->mddev, bh->b_dev);
- clear_bit(BH_Uptodate, &bh->b_state);
+ clear_buffer_uptodate(bh);
}
/* must restore b_page before unlocking buffer... */
if (sh->bh_page[i]) {
bh->b_page = sh->bh_page[i];
bh->b_data = page_address(bh->b_page);
sh->bh_page[i] = NULL;
- clear_bit(BH_Uptodate, &bh->b_state);
+ clear_buffer_uptodate(bh);
}
- clear_bit(BH_Lock, &bh->b_state);
+ clear_buffer_locked(bh);
set_bit(STRIPE_HANDLE, &sh->state);
release_stripe(sh);
}
@@ -453,7 +453,7 @@ static void raid5_end_write_request (str
md_spin_lock_irqsave(&conf->device_lock, flags);
if (!uptodate)
md_error(conf->mddev, bh->b_dev);
- clear_bit(BH_Lock, &bh->b_state);
+ clear_buffer_locked(bh);
set_bit(STRIPE_HANDLE, &sh->state);
__release_stripe(conf, sh);
md_spin_unlock_irqrestore(&conf->device_lock, flags);
@@ -682,7 +682,7 @@ static void compute_block(struct stripe_
}
if (count != 1)
xor_block(count, bh_ptr);
- set_bit(BH_Uptodate, &sh->bh_cache[dd_idx]->b_state);
+ set_buffer_uptodate(sh->bh_cache[dd_idx]);
}
static void compute_parity(struct stripe_head *sh, int method)
@@ -741,8 +741,8 @@ static void compute_parity(struct stripe
memcpy(bh->b_data,
bdata,sh->size);
bh_kunmap(chosen[i]);
- set_bit(BH_Lock, &bh->b_state);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_locked(bh);
+ set_buffer_uptodate(bh);
}
switch(method) {
@@ -765,10 +765,10 @@ static void compute_parity(struct stripe
xor_block(count, bh_ptr);
if (method != CHECK_PARITY) {
- mark_buffer_uptodate(sh->bh_cache[pd_idx], 1);
- set_bit(BH_Lock, &sh->bh_cache[pd_idx]->b_state);
+ set_buffer_uptodate(sh->bh_cache[pd_idx]);
+ set_buffer_locked(sh->bh_cache[pd_idx]);
} else
- mark_buffer_uptodate(sh->bh_cache[pd_idx], 0);
+ clear_buffer_uptodate(sh->bh_cache[pd_idx]);
}
static void add_stripe_bh (struct stripe_head *sh, struct buffer_head *bh, int dd_idx, int rw)
@@ -955,7 +955,7 @@ static void handle_stripe(struct stripe_
compute_block(sh, i);
uptodate++;
} else if (conf->disks[i].operational) {
- set_bit(BH_Lock, &bh->b_state);
+ set_buffer_locked(bh);
action[i] = READ+1;
/* if I am just reading this block and we don't have
a failed drive, or any pending writes then sidestep the cache */
@@ -1011,7 +1011,7 @@ static void handle_stripe(struct stripe_
if (test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
{
PRINTK("Read_old block %d for r-m-w\n", i);
- set_bit(BH_Lock, &bh->b_state);
+ set_buffer_locked(bh);
action[i] = READ+1;
locked++;
} else {
@@ -1030,7 +1030,7 @@ static void handle_stripe(struct stripe_
if (test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
{
PRINTK("Read_old block %d for Reconstruct\n", i);
- set_bit(BH_Lock, &bh->b_state);
+ set_buffer_locked(bh);
action[i] = READ+1;
locked++;
} else {
@@ -1094,7 +1094,7 @@ static void handle_stripe(struct stripe_
if (uptodate != disks)
BUG();
bh = sh->bh_cache[failed_num];
- set_bit(BH_Lock, &bh->b_state);
+ set_buffer_locked(bh);
action[failed_num] = WRITE+1;
locked++;
set_bit(STRIPE_INSYNC, &sh->state);
@@ -1146,7 +1146,7 @@ static void handle_stripe(struct stripe_
generic_make_request(action[i]-1, bh);
} else {
PRINTK("skip op %d on disc %d for sector %ld\n", action[i]-1, i, sh->sector);
- clear_bit(BH_Lock, &bh->b_state);
+ clear_buffer_locked(bh);
set_bit(STRIPE_HANDLE, &sh->state);
}
}
@@ -1223,7 +1223,7 @@ static int raid5_make_request (mddev_t *
handle_stripe(sh);
release_stripe(sh);
} else
- bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
+ bh->b_end_io(bh, buffer_uptodate(bh));
return 0;
}
--- 2.5.9/fs/buffer.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/buffer.c Wed Apr 24 01:35:35 2002
@@ -89,7 +89,7 @@ void unlock_buffer(struct buffer_head *b
if (atomic_read(&bh->b_count) == 0 && !PageLocked(bh->b_page))
buffer_error();
- clear_bit(BH_Lock, &bh->b_state);
+ clear_buffer_locked(bh);
smp_mb__after_clear_bit();
if (waitqueue_active(&bh->b_wait))
wake_up(&bh->b_wait);
@@ -155,7 +155,10 @@ void end_buffer_io_sync(struct buffer_he
{
if (!uptodate)
printk("%s: I/O error\n", __FUNCTION__);
- mark_buffer_uptodate(bh, uptodate);
+ if (uptodate)
+ set_buffer_uptodate(bh);
+ else
+ clear_buffer_uptodate(bh);
unlock_buffer(bh);
put_bh(bh);
}
@@ -516,7 +519,10 @@ static void end_buffer_io_async(struct b
if (!uptodate)
printk("%s: I/O error\n", __FUNCTION__);
- mark_buffer_uptodate(bh, uptodate);
+ if (uptodate)
+ set_buffer_uptodate(bh);
+ else
+ clear_buffer_uptodate(bh);
page = bh->b_page;
if (!uptodate)
SetPageError(page);
@@ -527,7 +533,7 @@ static void end_buffer_io_async(struct b
* decide that the page is now completely done.
*/
spin_lock_irqsave(&page_uptodate_lock, flags);
- mark_buffer_async(bh, 0);
+ clear_buffer_async(bh);
unlock_buffer(bh);
tmp = bh;
do {
@@ -575,7 +581,7 @@ still_busy:
inline void set_buffer_async_io(struct buffer_head *bh)
{
bh->b_end_io = end_buffer_io_async;
- mark_buffer_async(bh, 1);
+ set_buffer_async(bh);
}
/*
@@ -967,7 +973,7 @@ __getblk(struct block_device *bdev, sect
*/
void mark_buffer_dirty(struct buffer_head *bh)
{
- if (!atomic_set_buffer_dirty(bh))
+ if (!test_set_buffer_dirty(bh))
__set_page_dirty_nobuffers(bh->b_page);
}
@@ -994,7 +1000,7 @@ void __brelse(struct buffer_head * buf)
*/
void __bforget(struct buffer_head * buf)
{
- mark_buffer_clean(buf);
+ clear_buffer_dirty(buf);
__brelse(buf);
}
@@ -1052,12 +1058,12 @@ EXPORT_SYMBOL(set_bh_page);
static void discard_buffer(struct buffer_head * bh)
{
if (buffer_mapped(bh)) {
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
lock_buffer(bh);
bh->b_bdev = NULL;
- clear_bit(BH_Mapped, &bh->b_state);
- clear_bit(BH_Req, &bh->b_state);
- clear_bit(BH_New, &bh->b_state);
+ clear_buffer_mapped(bh);
+ clear_buffer_req(bh);
+ clear_buffer_new(bh);
unlock_buffer(bh);
}
}
@@ -1167,7 +1173,7 @@ void create_empty_buffers(struct page *p
if (PageDirty(page)) {
bh = head;
do {
- set_bit(BH_Dirty, &bh->b_state);
+ set_buffer_dirty(bh);
bh = bh->b_this_page;
} while (bh != head);
}
@@ -1197,9 +1203,9 @@ static void unmap_underlying_metadata(st
if (buffer_dirty(old_bh))
buffer_error();
#endif
- mark_buffer_clean(old_bh);
+ clear_buffer_dirty(old_bh);
wait_on_buffer(old_bh);
- clear_bit(BH_Req, &old_bh->b_state);
+ clear_buffer_req(old_bh);
__brelse(old_bh);
}
}
@@ -1266,7 +1272,7 @@ static int __block_write_full_page(struc
* zeroed it out. That seems unnecessary and may go
* away.
*/
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
} else if (!buffer_mapped(bh) && buffer_dirty(bh)) {
if (buffer_new(bh))
buffer_error();
@@ -1275,7 +1281,7 @@ static int __block_write_full_page(struc
goto recover;
if (buffer_new(bh)) {
/* blockdev mappings never come here */
- clear_bit(BH_New, &bh->b_state);
+ clear_buffer_new(bh);
unmap_underlying_metadata(bh);
}
}
@@ -1307,7 +1313,7 @@ static int __block_write_full_page(struc
do {
struct buffer_head *next = bh->b_this_page;
if (buffer_async(bh)) {
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
submit_bh(WRITE, bh);
nr_underway++;
}
@@ -1354,15 +1360,15 @@ recover:
* The buffer may have been set dirty during
* attachment to a dirty page.
*/
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
}
bh = bh->b_this_page;
} while (bh != head);
do {
struct buffer_head *next = bh->b_this_page;
if (buffer_mapped(bh)) {
- mark_buffer_uptodate(bh, 1);
- mark_buffer_clean(bh);
+ set_buffer_uptodate(bh);
+ clear_buffer_dirty(bh);
submit_bh(WRITE, bh);
nr_underway++;
}
@@ -1399,21 +1405,21 @@ static int __block_prepare_write(struct
block_end = block_start + blocksize;
if (block_end <= from || block_start >= to) {
if (PageUptodate(page))
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
continue;
}
- clear_bit(BH_New, &bh->b_state);
+ clear_buffer_new(bh);
if (!buffer_mapped(bh)) {
err = get_block(inode, block, bh, 1);
if (err)
goto out;
if (buffer_new(bh)) {
- clear_bit(BH_New, &bh->b_state);
+ clear_buffer_new(bh);
unmap_underlying_metadata(bh);
if (PageUptodate(page)) {
if (!buffer_mapped(bh))
buffer_error();
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
continue;
}
if (block_end > to)
@@ -1427,7 +1433,7 @@ static int __block_prepare_write(struct
}
}
if (PageUptodate(page)) {
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
continue;
}
if (!buffer_uptodate(bh) &&
@@ -1460,13 +1466,13 @@ out:
if (block_start >= to)
break;
if (buffer_new(bh)) {
- clear_bit(BH_New, &bh->b_state);
+ clear_buffer_new(bh);
if (buffer_uptodate(bh))
printk(KERN_ERR
"%s: zeroing uptodate buffer!\n",
__FUNCTION__);
memset(kaddr+block_start, 0, bh->b_size);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
mark_buffer_dirty(bh);
}
next_bh:
@@ -1494,7 +1500,7 @@ static int __block_commit_write(struct i
if (!buffer_uptodate(bh))
partial = 1;
} else {
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
mark_buffer_dirty(bh);
}
}
@@ -1514,7 +1520,7 @@ static int __block_commit_write(struct i
* Generic "read page" function for block devices that have the normal
* get_block functionality. This is most of the block device filesystems.
* Reads the page asynchronously --- the unlock_buffer() and
- * mark_buffer_uptodate() functions propagate buffer state into the
+ * set/clear_buffer_uptodate() functions propagate buffer state into the
* page struct once IO has completed.
*/
int block_read_full_page(struct page *page, get_block_t *get_block)
@@ -1554,7 +1560,7 @@ int block_read_full_page(struct page *pa
memset(kmap(page) + i*blocksize, 0, blocksize);
flush_dcache_page(page);
kunmap(page);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
continue;
}
/*
@@ -1823,7 +1829,7 @@ int block_truncate_page(struct address_s
/* Ok, it's mapped. Make sure it's up-to-date */
if (PageUptodate(page))
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
if (!buffer_uptodate(bh)) {
err = -EIO;
@@ -2018,9 +2024,9 @@ int brw_page(int rw, struct page *page,
bh->b_blocknr = *(b++);
bh->b_bdev = bdev;
bh->b_dev = to_kdev_t(bdev->bd_dev);
- set_bit(BH_Mapped, &bh->b_state);
+ set_buffer_mapped(bh);
if (rw == WRITE) /* To support submit_bh debug tests */
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
set_buffer_async_io(bh);
bh = bh->b_this_page;
} while (bh != head);
--- 2.5.9/fs/ext3/inode.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/ext3/inode.c Wed Apr 24 01:39:40 2002
@@ -575,7 +575,7 @@ static int ext3_alloc_branch(handle_t *h
branch[n].p = (u32*) bh->b_data + offsets[n];
*branch[n].p = branch[n].key;
BUFFER_TRACE(bh, "marking uptodate");
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
@@ -746,7 +746,7 @@ reread:
/* Simplest case - block found, no allocation needed */
if (!partial) {
- bh_result->b_state &= ~(1UL << BH_New);
+ clear_buffer_new(bh_result);
got_it:
map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key));
/* Clean up and exit */
@@ -812,7 +812,7 @@ out:
if (new_size > ei->i_disksize)
ei->i_disksize = new_size;
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
goto got_it;
changed:
@@ -874,7 +874,7 @@ struct buffer_head *ext3_getblk(handle_t
if (!fatal) {
memset(bh->b_data, 0,
inode->i_sb->s_blocksize);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
}
unlock_buffer(bh);
BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
@@ -1070,7 +1070,7 @@ static int journal_dirty_async_data(hand
/* For commit_write() in data=journal mode */
static int commit_write_fn(handle_t *handle, struct buffer_head *bh)
{
- set_bit(BH_Uptodate, &bh->b_state);
+ set_buffer_uptodate(bh);
return ext3_journal_dirty_metadata(handle, bh);
}
@@ -1423,7 +1423,7 @@ static int ext3_block_truncate_page(hand
/* Ok, it's mapped. Make sure it's up-to-date */
if (PageUptodate(page))
- set_bit(BH_Uptodate, &bh->b_state);
+ set_buffer_uptodate(bh);
if (!buffer_uptodate(bh)) {
err = -EIO;
--- 2.5.9/fs/jbd/transaction.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/jbd/transaction.c Wed Apr 24 01:36:56 2002
@@ -1202,7 +1202,7 @@ void journal_forget (handle_t *handle, s
/* If we are forgetting a buffer which is already part
* of this transaction, then we can just drop it from
* the transaction immediately. */
- clear_bit(BH_Dirty, &bh->b_state);
+ clear_buffer_dirty(bh);
clear_bit(BH_JBDDirty, &bh->b_state);
JBUFFER_TRACE(jh, "belongs to current transaction: unfile");
@@ -1547,9 +1547,8 @@ void __journal_unfile_buffer(struct jour
__blist_del_buffer(list, jh);
jh->b_jlist = BJ_None;
- if (test_and_clear_bit(BH_JBDDirty, &jh2bh(jh)->b_state)) {
- set_bit(BH_Dirty, &jh2bh(jh)->b_state);
- }
+ if (test_and_clear_bit(BH_JBDDirty, &jh2bh(jh)->b_state))
+ set_buffer_dirty(jh2bh(jh));
}
void journal_unfile_buffer(struct journal_head *jh)
@@ -1856,12 +1855,11 @@ static int journal_unmap_buffer(journal_
zap_buffer:
if (buffer_dirty(bh))
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
J_ASSERT_BH(bh, !buffer_jdirty(bh));
-// clear_bit(BH_Uptodate, &bh->b_state);
- clear_bit(BH_Mapped, &bh->b_state);
- clear_bit(BH_Req, &bh->b_state);
- clear_bit(BH_New, &bh->b_state);
+ clear_buffer_mapped(bh);
+ clear_buffer_req(bh);
+ clear_buffer_new(bh);
bh->b_bdev = NULL;
return may_free;
}
@@ -1976,7 +1974,7 @@ void __journal_file_buffer(struct journa
if (jlist == BJ_Metadata || jlist == BJ_Reserved ||
jlist == BJ_Shadow || jlist == BJ_Forget) {
- if (atomic_set_buffer_clean(jh2bh(jh))) {
+ if (test_clear_buffer_dirty(jh2bh(jh))) {
set_bit(BH_JBDDirty, &jh2bh(jh)->b_state);
}
}
--- 2.5.9/fs/reiserfs/inode.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/reiserfs/inode.c Wed Apr 24 01:38:14 2002
@@ -329,7 +329,7 @@ research:
** and jump to the end
*/
if (PageUptodate(bh_result->b_page)) {
- mark_buffer_uptodate(bh_result, 1);
+ set_buffer_uptodate(bh_result);
goto finished ;
}
@@ -398,7 +398,7 @@ finished:
pathrelse (&path);
/* I _really_ doubt that you want it. Chris? */
map_bh(bh_result, inode->i_sb, 0);
- mark_buffer_uptodate (bh_result, 1);
+ set_buffer_uptodate (bh_result);
return 0;
}
@@ -653,7 +653,7 @@ int reiserfs_get_block (struct inode * i
reiserfs_restore_prepared_buffer(inode->i_sb, bh) ;
goto research;
}
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
put_block_num(item, pos_in_item, allocated_block_nr) ;
unfm_ptr = allocated_block_nr;
journal_mark_dirty (&th, inode->i_sb, bh);
@@ -705,7 +705,7 @@ int reiserfs_get_block (struct inode * i
allocated block for that */
unp = cpu_to_le32 (allocated_block_nr);
set_block_dev_mapped (bh_result, allocated_block_nr, inode);
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
done = 1;
}
tmp_key = key; // ;)
@@ -761,7 +761,7 @@ int reiserfs_get_block (struct inode * i
reiserfs_free_block (&th, allocated_block_nr);
goto failure;
}
- /* it is important the mark_buffer_uptodate is done after
+ /* it is important the set_buffer_uptodate is done after
** the direct2indirect. The buffer might contain valid
** data newer than the data on disk (read by readpage, changed,
** and then sent here by writepage). direct2indirect needs
@@ -769,7 +769,7 @@ int reiserfs_get_block (struct inode * i
** if the data in unbh needs to be replaced with data from
** the disk
*/
- mark_buffer_uptodate (unbh, 1);
+ set_buffer_uptodate (unbh);
/* we've converted the tail, so we must
** flush unbh before the transaction commits
@@ -809,7 +809,7 @@ int reiserfs_get_block (struct inode * i
block for that */
un.unfm_nodenum = cpu_to_le32 (allocated_block_nr);
set_block_dev_mapped (bh_result, allocated_block_nr, inode);
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
done = 1;
} else {
/* paste hole to the indirect item */
@@ -1851,7 +1851,7 @@ research:
goto out ;
}
set_block_dev_mapped(bh_result, get_block_num(item,pos_in_item),inode);
- mark_buffer_uptodate(bh_result, 1);
+ set_buffer_uptodate(bh_result);
} else if (is_direct_le_ih(ih)) {
char *p ;
p = page_address(bh_result->b_page) ;
@@ -1871,7 +1871,7 @@ research:
journal_mark_dirty(&th, inode->i_sb, bh) ;
bytes_copied += copy_size ;
set_block_dev_mapped(bh_result, 0, inode);
- mark_buffer_uptodate(bh_result, 1);
+ set_buffer_uptodate(bh_result);
/* are there still bytes left? */
if (bytes_copied < bh_result->b_size &&
@@ -1921,8 +1921,8 @@ static inline void submit_bh_for_writepa
** later on in the call chain will be cleaning it. So, we
** clean the buffer here, it still gets written either way.
*/
- clear_bit(BH_Dirty, &bh->b_state) ;
- set_bit(BH_Uptodate, &bh->b_state) ;
+ clear_buffer_dirty(bh) ;
+ set_buffer_uptodate(bh) ;
submit_bh(WRITE, bh) ;
}
}
--- 2.5.9/fs/reiserfs/do_balan.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/reiserfs/do_balan.c Wed Apr 24 01:27:26 2002
@@ -48,7 +48,7 @@ inline void do_balance_mark_leaf_dirty (
struct buffer_head * bh, int flag)
{
if (reiserfs_dont_log(tb->tb_sb)) {
- if (!test_and_set_bit(BH_Dirty, &bh->b_state)) {
+ if (!test_set_buffer_dirty(bh)) {
// __mark_buffer_dirty(bh) ;
tb->need_balance_dirty = 1;
}
@@ -1225,7 +1225,7 @@ struct buffer_head * get_FEB (struct tre
bi.bi_parent = 0;
bi.bi_position = 0;
make_empty_node (&bi);
- set_bit(BH_Uptodate, &first_b->b_state);
+ set_buffer_uptodate(first_b);
tb->FEB[i] = 0;
tb->used[i] = first_b;
@@ -1272,7 +1272,7 @@ void reiserfs_invalidate_buffer (struct
set_blkh_level( blkh, FREE_LEVEL );
set_blkh_nr_item( blkh, 0 );
- mark_buffer_clean (bh);
+ clear_buffer_dirty(bh);
/* reiserfs_free_block is no longer schedule safe
reiserfs_free_block (tb->transaction_handle, tb->tb_sb, bh->b_blocknr);
*/
--- 2.5.9/fs/buffer.c.orig~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/buffer.c.orig Wed Apr 24 01:06:15 2002
@@ -1055,7 +1055,7 @@ void __brelse(struct buffer_head * buf)
*/
void __bforget(struct buffer_head * buf)
{
- mark_buffer_clean(buf);
+ clear_buffer_dirty(buf);
__brelse(buf);
}
@@ -1161,7 +1161,7 @@ EXPORT_SYMBOL(set_bh_page);
static void discard_buffer(struct buffer_head * bh)
{
if (buffer_mapped(bh)) {
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
lock_buffer(bh);
bh->b_bdev = NULL;
clear_bit(BH_Mapped, &bh->b_state);
@@ -1306,7 +1306,7 @@ static void unmap_underlying_metadata(st
if (buffer_dirty(old_bh))
buffer_error();
#endif
- mark_buffer_clean(old_bh);
+ clear_buffer_dirty(old_bh);
wait_on_buffer(old_bh);
clear_bit(BH_Req, &old_bh->b_state);
__brelse(old_bh);
@@ -1416,7 +1416,7 @@ static int __block_write_full_page(struc
do {
struct buffer_head *next = bh->b_this_page;
if (buffer_async(bh)) {
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
submit_bh(WRITE, bh);
nr_underway++;
}
@@ -1463,7 +1463,7 @@ recover:
* The buffer may have been set dirty during
* attachment to a dirty page.
*/
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
}
bh = bh->b_this_page;
} while (bh != head);
@@ -1471,7 +1471,7 @@ recover:
struct buffer_head *next = bh->b_this_page;
if (buffer_mapped(bh)) {
mark_buffer_uptodate(bh, 1);
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
submit_bh(WRITE, bh);
nr_underway++;
}
--- 2.5.9/fs/ext2/inode.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/ext2/inode.c Wed Apr 24 01:35:46 2002
@@ -403,7 +403,7 @@ static int ext2_alloc_branch(struct inod
branch[n].bh = bh;
branch[n].p = (u32*) bh->b_data + offsets[n];
*branch[n].p = branch[n].key;
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
mark_buffer_dirty_inode(bh, inode);
/* We used to sync bh here if IS_SYNC(inode).
@@ -552,7 +552,7 @@ out:
if (ext2_splice_branch(inode, iblock, chain, partial, left) < 0)
goto changed;
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
goto got_it;
changed:
--- 2.5.9/fs/fat/buffer.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/fat/buffer.c Wed Apr 24 01:06:15 2002
@@ -75,7 +75,10 @@ void default_fat_set_uptodate (
struct buffer_head *bh,
int val)
{
- mark_buffer_uptodate(bh, val);
+ if (val)
+ set_buffer_uptodate(bh);
+ else
+ clear_buffer_uptodate(bh);
}
int default_fat_is_uptodate (struct super_block *sb, struct buffer_head *bh)
--- 2.5.9/fs/hfs/file.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/hfs/file.c Wed Apr 24 01:36:34 2002
@@ -114,7 +114,7 @@ int hfs_get_block(struct inode *inode, s
phys = hfs_extent_map(HFS_I(inode)->fork, iblock, create);
if (phys) {
if (create)
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
map_bh(bh_result, inode->i_sb, phys);
return 0;
}
@@ -479,7 +479,7 @@ hfs_s32 hfs_do_write(struct inode *inode
pos += c;
written += c;
buf += c;
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
mark_buffer_dirty(bh);
brelse(bh);
}
--- 2.5.9/fs/hfs/sysdep.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/hfs/sysdep.c Wed Apr 24 01:06:15 2002
@@ -45,7 +45,7 @@ hfs_buffer hfs_buffer_get(hfs_sysmdb sys
} else {
tmp = sb_getblk(sys_mdb, block);
if (tmp) {
- mark_buffer_uptodate(tmp, 1);
+ set_buffer_uptodate(tmp);
}
}
if (!tmp) {
--- 2.5.9/fs/hpfs/buffer.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/hpfs/buffer.c Wed Apr 24 01:06:15 2002
@@ -180,7 +180,7 @@ void *hpfs_get_sector(struct super_block
if ((*bhp = bh = sb_getblk(s, secno)) != NULL) {
if (!buffer_uptodate(bh)) wait_on_buffer(bh);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
return bh->b_data;
} else {
printk("HPFS: hpfs_get_sector: getblk failed\n");
--- 2.5.9/fs/jbd/commit.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/jbd/commit.c Wed Apr 24 01:26:18 2002
@@ -29,7 +29,10 @@ extern spinlock_t journal_datalist_lock;
static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
{
BUFFER_TRACE(bh, "");
- mark_buffer_uptodate(bh, uptodate);
+ if (uptodate)
+ set_buffer_uptodate(bh);
+ else
+ clear_buffer_uptodate(bh);
unlock_buffer(bh);
}
@@ -447,9 +450,9 @@ start_journal_io:
unlock_journal(journal);
for (i=0; i<bufs; i++) {
struct buffer_head *bh = wbuf[i];
- set_bit(BH_Lock, &bh->b_state);
- clear_bit(BH_Dirty, &bh->b_state);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_locked(bh);
+ clear_buffer_dirty(bh);
+ set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
submit_bh(WRITE, bh);
}
@@ -588,7 +591,7 @@ start_journal_io:
JBUFFER_TRACE(descriptor, "write commit block");
{
struct buffer_head *bh = jh2bh(descriptor);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
ll_rw_block(WRITE, 1, &bh);
wait_on_buffer(bh);
__brelse(bh); /* One for getblk() */
--- 2.5.9/fs/jbd/journal.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/jbd/journal.c Wed Apr 24 01:32:57 2002
@@ -475,7 +475,8 @@ int journal_write_metadata_buffer(transa
new_bh->b_bdev = transaction->t_journal->j_dev;
new_bh->b_dev = to_kdev_t(transaction->t_journal->j_dev->bd_dev);
new_bh->b_blocknr = blocknr;
- new_bh->b_state |= (1 << BH_Mapped) | (1 << BH_Dirty);
+ set_buffer_mapped(new_bh);
+ set_buffer_dirty(new_bh);
*jh_out = new_jh;
@@ -887,7 +888,7 @@ int journal_create (journal_t *journal)
BUFFER_TRACE(bh, "marking dirty");
mark_buffer_dirty(bh);
BUFFER_TRACE(bh, "marking uptodate");
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
__brelse(bh);
}
--- 2.5.9/fs/jbd/recovery.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/jbd/recovery.c Wed Apr 24 01:06:15 2002
@@ -484,7 +484,7 @@ static int do_one_pass(journal_t *journa
BUFFER_TRACE(nbh, "marking dirty");
mark_buffer_dirty(nbh);
BUFFER_TRACE(nbh, "marking uptodate");
- mark_buffer_uptodate(nbh, 1);
+ set_buffer_uptodate(nbh);
++info->nr_replays;
/* ll_rw_block(WRITE, 1, &nbh); */
unlock_buffer(nbh);
--- 2.5.9/fs/jbd/revoke.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/jbd/revoke.c Wed Apr 24 01:06:15 2002
@@ -541,7 +541,7 @@ static void flush_descriptor(journal_t *
{
struct buffer_head *bh = jh2bh(descriptor);
BUFFER_TRACE(bh, "write");
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
ll_rw_block (WRITE, 1, &bh);
}
}
--- 2.5.9/fs/jfs/namei.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/jfs/namei.c Wed Apr 24 01:06:15 2002
@@ -969,7 +969,7 @@ int jfs_symlink(struct inode *dip, struc
memcpy(mp->data, name, copy_size);
flush_metapage(mp);
#if 0
- mark_buffer_uptodate(bp, 1);
+ set_buffer_uptodate(bp);
mark_buffer_dirty(bp, 1);
if (IS_SYNC(dip)) {
ll_rw_block(WRITE, 1, &bp);
--- 2.5.9/fs/minix/itree_common.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/minix/itree_common.c Wed Apr 24 01:37:47 2002
@@ -89,7 +89,7 @@ static int alloc_branch(struct inode *in
branch[n].bh = bh;
branch[n].p = (block_t*) bh->b_data + offsets[n];
*branch[n].p = branch[n].key;
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
mark_buffer_dirty_inode(bh, inode);
parent = nr;
@@ -194,7 +194,7 @@ out:
if (splice_branch(inode, chain, partial, left) < 0)
goto changed;
- bh->b_state |= (1UL << BH_New);
+ set_buffer_new(bh);
goto got_it;
changed:
--- 2.5.9/fs/reiserfs/journal.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/reiserfs/journal.c Wed Apr 24 01:28:40 2002
@@ -124,7 +124,7 @@ static void init_journal_hash(struct sup
*/
static int reiserfs_clean_and_file_buffer(struct buffer_head *bh) {
if (bh)
- mark_buffer_clean(bh);
+ clear_buffer_dirty(bh);
return 0 ;
}
@@ -847,7 +847,7 @@ static int _update_journal_header_block(
jh->j_last_flush_trans_id = cpu_to_le32(trans_id) ;
jh->j_first_unflushed_offset = cpu_to_le32(offset) ;
jh->j_mount_id = cpu_to_le32(SB_JOURNAL(p_s_sb)->j_mount_id) ;
- set_bit(BH_Dirty, &(SB_JOURNAL(p_s_sb)->j_header_bh->b_state)) ;
+ set_buffer_dirty(SB_JOURNAL(p_s_sb)->j_header_bh) ;
ll_rw_block(WRITE, 1, &(SB_JOURNAL(p_s_sb)->j_header_bh)) ;
wait_on_buffer((SB_JOURNAL(p_s_sb)->j_header_bh)) ;
if (!buffer_uptodate(SB_JOURNAL(p_s_sb)->j_header_bh)) {
@@ -893,7 +893,10 @@ static void reiserfs_end_buffer_io_sync(
reiserfs_warning("clm-2084: pinned buffer %lu:%s sent to disk\n",
bh->b_blocknr, kdevname(bh->b_dev)) ;
}
- mark_buffer_uptodate(bh, uptodate) ;
+ if (uptodate)
+ set_buffer_uptodate(bh) ;
+ else
+ clear_buffer_uptodate(bh) ;
unlock_buffer(bh) ;
put_bh(bh) ;
}
@@ -902,7 +905,7 @@ static void submit_logged_buffer(struct
get_bh(bh) ;
bh->b_end_io = reiserfs_end_buffer_io_sync ;
mark_buffer_notjournal_new(bh) ;
- clear_bit(BH_Dirty, &bh->b_state) ;
+ clear_buffer_dirty(bh) ;
submit_bh(WRITE, bh) ;
}
@@ -1565,12 +1568,12 @@ static int journal_read_transaction(stru
return -1 ;
}
memcpy(real_blocks[i]->b_data, log_blocks[i]->b_data, real_blocks[i]->b_size) ;
- mark_buffer_uptodate(real_blocks[i], 1) ;
+ set_buffer_uptodate(real_blocks[i]) ;
brelse(log_blocks[i]) ;
}
/* flush out the real blocks */
for (i = 0 ; i < le32_to_cpu(desc->j_len) ; i++) {
- set_bit(BH_Dirty, &(real_blocks[i]->b_state)) ;
+ set_buffer_dirty(real_blocks[i]) ;
ll_rw_block(WRITE, 1, real_blocks + i) ;
}
for (i = 0 ; i < le32_to_cpu(desc->j_len) ; i++) {
@@ -2389,7 +2392,7 @@ int journal_mark_dirty(struct reiserfs_t
}
if (buffer_dirty(bh)) {
- clear_bit(BH_Dirty, &bh->b_state) ;
+ clear_buffer_dirty(bh) ;
}
if (buffer_journaled(bh)) { /* must double check after getting lock */
@@ -2979,7 +2982,7 @@ static int do_journal_end(struct reiserf
rs = SB_DISK_SUPER_BLOCK(p_s_sb) ;
/* setup description block */
d_bh = journ_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + SB_JOURNAL(p_s_sb)->j_start) ;
- mark_buffer_uptodate(d_bh, 1) ;
+ set_buffer_uptodate(d_bh) ;
desc = (struct reiserfs_journal_desc *)(d_bh)->b_data ;
memset(desc, 0, sizeof(struct reiserfs_journal_desc)) ;
memcpy(desc->j_magic, JOURNAL_DESC_MAGIC, 8) ;
@@ -2991,7 +2994,7 @@ static int do_journal_end(struct reiserf
commit = (struct reiserfs_journal_commit *)c_bh->b_data ;
memset(commit, 0, sizeof(struct reiserfs_journal_commit)) ;
commit->j_trans_id = cpu_to_le32(SB_JOURNAL(p_s_sb)->j_trans_id) ;
- mark_buffer_uptodate(c_bh, 1) ;
+ set_buffer_uptodate(c_bh) ;
/* init this journal list */
atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_older_commits_done), 0) ;
@@ -3079,7 +3082,7 @@ printk("journal-2020: do_journal_end: BA
struct buffer_head *tmp_bh ;
tmp_bh = journ_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
((cur_write_start + jindex) % SB_ONDISK_JOURNAL_SIZE(p_s_sb))) ;
- mark_buffer_uptodate(tmp_bh, 1) ;
+ set_buffer_uptodate(tmp_bh) ;
memcpy(tmp_bh->b_data, cn->bh->b_data, cn->bh->b_size) ;
jindex++ ;
} else {
--- 2.5.9/fs/reiserfs/resize.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/reiserfs/resize.c Wed Apr 24 01:06:15 2002
@@ -116,7 +116,7 @@ int reiserfs_resize (struct super_block
reiserfs_test_and_set_le_bit(0, bitmap[i]->b_data);
mark_buffer_dirty(bitmap[i]) ;
- mark_buffer_uptodate(bitmap[i], 1);
+ set_buffer_uptodate(bitmap[i]);
ll_rw_block(WRITE, 1, bitmap + i);
wait_on_buffer(bitmap[i]);
}
--- 2.5.9/fs/sysv/balloc.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/sysv/balloc.c Wed Apr 24 01:06:15 2002
@@ -83,7 +83,7 @@ void sysv_free_block(struct super_block
*(u16*)bh->b_data = cpu_to_fs16(sb, count);
memcpy(get_chunk(sb,bh), blocks, count * sizeof(sysv_zone_t));
mark_buffer_dirty(bh);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
brelse(bh);
count = 0;
}
--- 2.5.9/fs/sysv/itree.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/sysv/itree.c Wed Apr 24 01:38:33 2002
@@ -145,7 +145,7 @@ static int alloc_branch(struct inode *in
branch[n].bh = bh;
branch[n].p = (u32*) bh->b_data + offsets[n];
*branch[n].p = branch[n].key;
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
dirty_indirect(bh, inode);
}
@@ -246,7 +246,7 @@ out:
if (splice_branch(inode, chain, partial, left) < 0)
goto changed;
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
goto got_it;
changed:
--- 2.5.9/fs/udf/inode.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/udf/inode.c Wed Apr 24 01:38:44 2002
@@ -254,7 +254,7 @@ struct buffer_head * udf_expand_dir_adin
return NULL;
lock_buffer(dbh);
memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize);
- mark_buffer_uptodate(dbh, 1);
+ set_buffer_uptodate(dbh);
unlock_buffer(dbh);
mark_buffer_dirty_inode(dbh, inode);
@@ -348,7 +348,7 @@ static int udf_get_block(struct inode *i
BUG();
if (new)
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
map_bh(bh_result, inode->i_sb, phys);
abort:
unlock_kernel();
@@ -375,7 +375,7 @@ struct buffer_head * udf_getblk(struct i
{
lock_buffer(bh);
memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
mark_buffer_dirty_inode(bh, inode);
}
@@ -1656,7 +1656,7 @@ int8_t udf_add_aext(struct inode *inode,
}
lock_buffer(nbh);
memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
- mark_buffer_uptodate(nbh, 1);
+ set_buffer_uptodate(nbh);
unlock_buffer(nbh);
mark_buffer_dirty_inode(nbh, inode);
--- 2.5.9/fs/udf/namei.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/udf/namei.c Wed Apr 24 01:06:15 2002
@@ -984,7 +984,7 @@ static int udf_symlink(struct inode * di
bh = udf_tread(inode->i_sb, block);
lock_buffer(bh);
memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
mark_buffer_dirty_inode(bh, inode);
}
--- 2.5.9/fs/ufs/balloc.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/ufs/balloc.c Wed Apr 24 01:06:15 2002
@@ -225,7 +225,7 @@ failed:
for (i = oldcount; i < newcount; i++) { \
bh = sb_getblk(sb, result + i); \
memset (bh->b_data, 0, sb->s_blocksize); \
- mark_buffer_uptodate(bh, 1); \
+ set_buffer_uptodate(bh); \
mark_buffer_dirty (bh); \
if (IS_SYNC(inode)) { \
ll_rw_block (WRITE, 1, &bh); \
@@ -360,7 +360,7 @@ unsigned ufs_new_fragments (struct inode
bh = sb_bread(sb, tmp + i);
if(bh)
{
- mark_buffer_clean (bh);
+ clear_buffer_dirty(bh);
bh->b_blocknr = result + i;
mark_buffer_dirty (bh);
if (IS_SYNC(inode)) {
--- 2.5.9/fs/ufs/inode.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/ufs/inode.c Wed Apr 24 01:38:54 2002
@@ -389,7 +389,7 @@ out:
if (err)
goto abort;
if (new)
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
map_bh(bh_result, sb, phys);
abort:
unlock_kernel();
@@ -419,7 +419,7 @@ struct buffer_head *ufs_getfrag(struct i
bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
if (buffer_new(&dummy)) {
memset(bh->b_data, 0, inode->i_sb->s_blocksize);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
mark_buffer_dirty(bh);
}
return bh;
--- 2.5.9/fs/ufs/util.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/ufs/util.c Wed Apr 24 01:06:15 2002
@@ -109,8 +109,13 @@ void ubh_mark_buffer_uptodate (struct uf
unsigned i;
if (!ubh)
return;
- for ( i = 0; i < ubh->count; i++ )
- mark_buffer_uptodate (ubh->bh[i], flag);
+ if (flag) {
+ for ( i = 0; i < ubh->count; i++ )
+ set_buffer_uptodate (ubh->bh[i]);
+ } else {
+ for ( i = 0; i < ubh->count; i++ )
+ clear_buffer_uptodate (ubh->bh[i]);
+ }
}
void ubh_ll_rw_block (int rw, unsigned nr, struct ufs_buffer_head * ubh[])
--- 2.5.9/include/linux/amigaffs.h~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/include/linux/amigaffs.h Wed Apr 24 01:41:25 2002
@@ -50,7 +50,7 @@ affs_getzeroblk(struct super_block *sb,
bh = sb_getblk(sb, block);
lock_buffer(bh);
memset(bh->b_data, 0 , sb->s_blocksize);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
unlock_buffer(bh);
return bh;
}
@@ -64,7 +64,7 @@ affs_getemptyblk(struct super_block *sb,
if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size) {
bh = sb_getblk(sb, block);
wait_on_buffer(bh);
- mark_buffer_uptodate(bh, 1);
+ set_buffer_uptodate(bh);
return bh;
}
return NULL;
--- 2.5.9/fs/reiserfs/tail_conversion.c~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/fs/reiserfs/tail_conversion.c Wed Apr 24 01:38:23 2002
@@ -141,11 +141,11 @@ void reiserfs_unmap_buffer(struct buffer
if (buffer_journaled(bh) || buffer_journal_dirty(bh)) {
BUG() ;
}
- mark_buffer_clean(bh) ;
+ clear_buffer_dirty(bh) ;
lock_buffer(bh) ;
- clear_bit(BH_Mapped, &bh->b_state) ;
- clear_bit(BH_Req, &bh->b_state) ;
- clear_bit(BH_New, &bh->b_state) ;
+ clear_buffer_mapped(bh) ;
+ clear_buffer_req(bh) ;
+ clear_buffer_new(bh);
bh->b_bdev = NULL;
unlock_buffer(bh) ;
}
--- /dev/null Thu Aug 30 13:30:55 2001
+++ 2.5.9-akpm/include/linux/buffer_head.h Wed Apr 24 01:33:34 2002
@@ -0,0 +1,356 @@
+/*
+ * include/linux/buffer_head.h
+ *
+ * Everything to do with buffer_head.b_state.
+ */
+
+#ifndef BUFFER_FLAGS_H
+#define BUFFER_FLAGS_H
+
+/* bh state bits */
+enum bh_state_bits {
+ BH_Uptodate, /* 1 if the buffer contains valid data */
+ BH_Dirty, /* 1 if the buffer is dirty */
+ BH_Lock, /* 1 if the buffer is locked */
+ BH_Req, /* 0 if the buffer has been invalidated */
+
+ BH_Mapped, /* 1 if the buffer has a disk mapping */
+ BH_New, /* 1 if the buffer is new and not yet written out */
+ BH_Async, /* 1 if the buffer is under end_buffer_io_async I/O */
+ BH_JBD, /* 1 if it has an attached journal_head */
+
+ BH_PrivateStart,/* not a state bit, but the first bit available
+ * for private allocation by other entities
+ */
+};
+
+struct page;
+struct kiobuf;
+struct buffer_head;
+typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate);
+
+/*
+ * Try to keep the most commonly used fields in single cache lines (16
+ * bytes) to improve performance. This ordering should be
+ * particularly beneficial on 32-bit processors.
+ *
+ * We use the first 16 bytes for the data which is used in searches
+ * over the block hash lists (ie. getblk() and friends).
+ *
+ * The second 16 bytes we use for lru buffer scans, as used by
+ * sync_buffers() and refill_freelist(). -- sct
+ */
+struct buffer_head {
+ /* First cache line: */
+ sector_t b_blocknr; /* block number */
+ unsigned short b_size; /* block size */
+ kdev_t b_dev; /* device (B_FREE = free) */
+ struct block_device *b_bdev;
+
+ atomic_t b_count; /* users using this block */
+ unsigned long b_state; /* buffer state bitmap (see above) */
+ struct buffer_head *b_this_page;/* circular list of page's buffers */
+ struct page *b_page; /* the page this bh is mapped to */
+
+ char * b_data; /* pointer to data block */
+ bh_end_io_t *b_end_io; /* I/O completion */
+ void *b_private; /* reserved for b_end_io */
+
+ wait_queue_head_t b_wait;
+
+ struct list_head b_inode_buffers; /* list of inode dirty buffers */
+};
+
+
+/*
+ * macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
+ * and buffer_foo() functions.
+ */
+#define BUFFER_FNS(bit, name) \
+static inline void set_buffer_##name(struct buffer_head *bh) \
+{ \
+ set_bit(BH_##bit, &(bh)->b_state); \
+} \
+static inline void clear_buffer_##name(struct buffer_head *bh) \
+{ \
+ clear_bit(BH_##bit, &(bh)->b_state); \
+} \
+static inline int buffer_##name(struct buffer_head *bh) \
+{ \
+ return test_bit(BH_##bit, &(bh)->b_state); \
+}
+
+/*
+ * test_set_buffer_foo() and test_clear_buffer_foo()
+ */
+#define TAS_BUFFER_FNS(bit, name) \
+static inline int test_set_buffer_##name(struct buffer_head *bh) \
+{ \
+ return test_and_set_bit(BH_##bit, &(bh)->b_state); \
+} \
+static inline int test_clear_buffer_##name(struct buffer_head *bh) \
+{ \
+ return test_and_clear_bit(BH_##bit, &(bh)->b_state); \
+} \
+
+BUFFER_FNS(Uptodate, uptodate)
+BUFFER_FNS(Dirty, dirty)
+TAS_BUFFER_FNS(Dirty, dirty)
+BUFFER_FNS(Lock, locked)
+TAS_BUFFER_FNS(Lock, locked)
+BUFFER_FNS(Req, req)
+BUFFER_FNS(Mapped, mapped)
+BUFFER_FNS(New, new)
+BUFFER_FNS(Async, async)
+
+/*
+ * Utility macros
+ */
+
+/*
+ * FIXME: this is used only by bh_kmap, which is used only by RAID5.
+ * Clean this up with blockdev-in-highmem infrastructure.
+ */
+#define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK)
+
+#define touch_buffer(bh) mark_page_accessed(bh->b_page)
+
+/* If we *know* page->private refers to buffer_heads */
+#define page_buffers(page) \
+ ({ \
+ if (!PagePrivate(page)) \
+ BUG(); \
+ ((struct buffer_head *)(page)->private); \
+ })
+#define page_has_buffers(page) PagePrivate(page)
+#define set_page_buffers(page, buffers) \
+ do { \
+ SetPagePrivate(page); \
+ page->private = (unsigned long)buffers; \
+ } while (0)
+#define clear_page_buffers(page) \
+ do { \
+ ClearPagePrivate(page); \
+ page->private = 0; \
+ } while (0)
+
+#define invalidate_buffers(dev) __invalidate_buffers((dev), 0)
+#define destroy_buffers(dev) __invalidate_buffers((dev), 1)
+
+
+/*
+ * Declarations
+ */
+
+void FASTCALL(mark_buffer_dirty(struct buffer_head *bh));
+void buffer_init(void);
+void init_buffer(struct buffer_head *, bh_end_io_t *, void *);
+void set_bh_page(struct buffer_head *bh,
+ struct page *page, unsigned long offset);
+int try_to_free_buffers(struct page *);
+void create_empty_buffers(struct page *, unsigned long,
+ unsigned long b_state);
+void end_buffer_io_sync(struct buffer_head *bh, int uptodate);
+void buffer_insert_list(spinlock_t *lock,
+ struct buffer_head *, struct list_head *);
+
+
+/* reiserfs_writepage needs this */
+void set_buffer_async_io(struct buffer_head *bh) ;
+void invalidate_inode_buffers(struct inode *);
+void invalidate_bdev(struct block_device *, int);
+void __invalidate_buffers(kdev_t dev, int);
+int sync_buffers(struct block_device *, int);
+void __wait_on_buffer(struct buffer_head *);
+int fsync_dev(kdev_t);
+int fsync_bdev(struct block_device *);
+int fsync_super(struct super_block *);
+int fsync_no_super(struct block_device *);
+int fsync_buffers_list(spinlock_t *lock, struct list_head *);
+int inode_has_buffers(struct inode *);
+struct buffer_head *__get_hash_table(struct block_device *, sector_t, int);
+struct buffer_head * __getblk(struct block_device *, sector_t, int);
+void __brelse(struct buffer_head *);
+void __bforget(struct buffer_head *);
+struct buffer_head * __bread(struct block_device *, int, int);
+void wakeup_bdflush(void);
+struct buffer_head *alloc_buffer_head(int async);
+void free_buffer_head(struct buffer_head * bh);
+int brw_page(int, struct page *, struct block_device *, sector_t [], int);
+void FASTCALL(unlock_buffer(struct buffer_head *bh));
+
+/*
+ * Generic address_space_operations implementations for buffer_head-backed
+ * address_spaces.
+ */
+int try_to_release_page(struct page * page, int gfp_mask);
+int block_flushpage(struct page *page, unsigned long offset);
+int block_symlink(struct inode *, const char *, int);
+int block_write_full_page(struct page*, get_block_t*);
+int block_read_full_page(struct page*, get_block_t*);
+int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*);
+int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*,
+ unsigned long *);
+int generic_cont_expand(struct inode *inode, loff_t size) ;
+int block_commit_write(struct page *page, unsigned from, unsigned to);
+int block_sync_page(struct page *);
+sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
+int generic_commit_write(struct file *, struct page *, unsigned, unsigned);
+int block_truncate_page(struct address_space *, loff_t, get_block_t *);
+int generic_direct_IO(int, struct inode *, struct kiobuf *,
+ unsigned long, int, get_block_t *);
+int file_fsync(struct file *, struct dentry *, int);
+
+#define OSYNC_METADATA (1<<0)
+#define OSYNC_DATA (1<<1)
+#define OSYNC_INODE (1<<2)
+int generic_osync_inode(struct inode *, int);
+
+
+/*
+ * inline definitions
+ */
+
+static inline void get_bh(struct buffer_head * bh)
+{
+ atomic_inc(&(bh)->b_count);
+}
+
+static inline void put_bh(struct buffer_head *bh)
+{
+ smp_mb__before_atomic_dec();
+ atomic_dec(&bh->b_count);
+}
+
+static inline void
+mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode)
+{
+ mark_buffer_dirty(bh);
+ buffer_insert_list(&inode->i_bufferlist_lock,
+ bh, &inode->i_dirty_buffers);
+}
+
+/*
+ * If an error happens during the make_request, this function
+ * has to be recalled. It marks the buffer as clean and not
+ * uptodate, and it notifys the upper layer about the end
+ * of the I/O.
+ */
+static inline void buffer_IO_error(struct buffer_head * bh)
+{
+ clear_buffer_dirty(bh);
+
+ /*
+ * b_end_io has to clear the BH_Uptodate bitflag in the read error
+ * case, however buffer contents are not necessarily bad if a
+ * write fails
+ */
+ bh->b_end_io(bh, buffer_uptodate(bh));
+}
+
+static inline int fsync_inode_buffers(struct inode *inode)
+{
+ return fsync_buffers_list(&inode->i_bufferlist_lock,
+ &inode->i_dirty_buffers);
+}
+
+static inline struct buffer_head *
+get_hash_table(kdev_t dev, sector_t block, int size)
+{
+ struct block_device *bdev;
+ struct buffer_head *bh;
+ bdev = bdget(kdev_t_to_nr(dev));
+ if (!bdev) {
+ printk("No block device for %s\n", bdevname(dev));
+ BUG();
+ }
+ bh = __get_hash_table(bdev, block, size);
+ atomic_dec(&bdev->bd_count);
+ return bh;
+}
+
+static inline struct buffer_head * getblk(kdev_t dev, sector_t block, int size)
+{
+ struct block_device *bdev;
+ struct buffer_head *bh;
+ bdev = bdget(kdev_t_to_nr(dev));
+ if (!bdev) {
+ printk("No block device for %s\n", bdevname(dev));
+ BUG();
+ }
+ bh = __getblk(bdev, block, size);
+ atomic_dec(&bdev->bd_count);
+ return bh;
+}
+
+static inline void brelse(struct buffer_head *buf)
+{
+ if (buf)
+ __brelse(buf);
+}
+
+static inline void bforget(struct buffer_head *buf)
+{
+ if (buf)
+ __bforget(buf);
+}
+
+static inline struct buffer_head *bread(kdev_t dev, int block, int size)
+{
+ struct block_device *bdev;
+ struct buffer_head *bh;
+ bdev = bdget(kdev_t_to_nr(dev));
+ if (!bdev) {
+ printk("No block device for %s\n", bdevname(dev));
+ BUG();
+ }
+ bh = __bread(bdev, block, size);
+ atomic_dec(&bdev->bd_count);
+ return bh;
+}
+
+static inline struct buffer_head * sb_bread(struct super_block *sb, int block)
+{
+ return __bread(sb->s_bdev, block, sb->s_blocksize);
+}
+
+static inline struct buffer_head * sb_getblk(struct super_block *sb, int block)
+{
+ return __getblk(sb->s_bdev, block, sb->s_blocksize);
+}
+
+static inline struct buffer_head *
+sb_get_hash_table(struct super_block *sb, int block)
+{
+ return __get_hash_table(sb->s_bdev, block, sb->s_blocksize);
+}
+
+static inline void
+map_bh(struct buffer_head *bh, struct super_block *sb, int block)
+{
+ set_buffer_mapped(bh);
+ bh->b_bdev = sb->s_bdev;
+ bh->b_dev = sb->s_dev;
+ bh->b_blocknr = block;
+}
+
+static inline void wait_on_buffer(struct buffer_head * bh)
+{
+ if (buffer_locked(bh))
+ __wait_on_buffer(bh);
+}
+
+static inline void lock_buffer(struct buffer_head * bh)
+{
+ while (test_set_buffer_locked(bh))
+ __wait_on_buffer(bh);
+}
+
+/*
+ * Debug
+ */
+
+void __buffer_error(char *file, int line);
+#define buffer_error() __buffer_error(__FILE__, __LINE__)
+
+#endif /* BUFFER_FLAGS_H */
--- 2.5.9/include/linux/jbd.h~cleanup-070-bh_flags Wed Apr 24 01:06:15 2002
+++ 2.5.9-akpm/include/linux/jbd.h Wed Apr 24 01:42:04 2002
@@ -233,11 +233,8 @@ enum jbd_state_bits {
BH_JBDDirty, /* 1 if buffer is dirty but journaled */
};
-/* Return true if the buffer is one which JBD is managing */
-static inline int buffer_jbd(struct buffer_head *bh)
-{
- return __buffer_state(bh, JBD);
-}
+BUFFER_FNS(JBD, jbd)
+BUFFER_FNS(JBDDirty, jbddirty)
static inline struct buffer_head *jh2bh(struct journal_head *jh)
{
@@ -838,7 +835,7 @@ static inline int buffer_jlist_eq(struct
/* Return true if this bufer is dirty wrt the journal */
static inline int buffer_jdirty(struct buffer_head *bh)
{
- return buffer_jbd(bh) && __buffer_state(bh, JBDDirty);
+ return buffer_jbd(bh) && buffer_jbddirty(bh);
}
/* Return true if it's a data buffer which journalling is managing */
--- 2.5.9/include/linux/locks.h~cleanup-070-bh_flags Wed Apr 24 01:14:17 2002
+++ 2.5.9-akpm/include/linux/locks.h Wed Apr 24 01:39:42 2002
@@ -9,26 +9,6 @@
#endif
/*
- * Buffer cache locking - note that interrupts may only unlock, not
- * lock buffers.
- */
-extern void __wait_on_buffer(struct buffer_head *);
-
-static inline void wait_on_buffer(struct buffer_head * bh)
-{
- if (test_bit(BH_Lock, &bh->b_state))
- __wait_on_buffer(bh);
-}
-
-static inline void lock_buffer(struct buffer_head * bh)
-{
- while (test_and_set_bit(BH_Lock, &bh->b_state))
- __wait_on_buffer(bh);
-}
-
-extern void FASTCALL(unlock_buffer(struct buffer_head *bh));
-
-/*
* super-block locking. Again, interrupts may only unlock
* a super-block (although even this isn't done right now.
* nfs may need it).
--- 2.5.9/mm/page-writeback.c~cleanup-070-bh_flags Wed Apr 24 01:25:37 2002
+++ 2.5.9-akpm/mm/page-writeback.c Wed Apr 24 01:28:57 2002
@@ -466,7 +466,7 @@ int __set_page_dirty_buffers(struct page
do {
if (buffer_uptodate(bh))
- set_bit(BH_Dirty, &bh->b_state);
+ set_buffer_dirty(bh);
bh = bh->b_this_page;
} while (bh != head);
}
--- 2.5.9/fs/affs/file.c~cleanup-070-bh_flags Wed Apr 24 01:30:46 2002
+++ 2.5.9-akpm/fs/affs/file.c Wed Apr 24 01:34:47 2002
@@ -361,7 +361,7 @@ affs_get_block(struct inode *inode, sect
u32 blocknr = affs_alloc_block(inode, ext_bh->b_blocknr);
if (!blocknr)
goto err_alloc;
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
AFFS_I(inode)->mmu_private += AFFS_SB(sb)->s_data_blksize;
AFFS_I(inode)->i_blkcnt++;
@@ -400,7 +400,7 @@ err_ext:
return PTR_ERR(ext_bh);
err_alloc:
brelse(ext_bh);
- bh_result->b_state &= ~(1UL << BH_Mapped);
+ clear_buffer_mapped(bh_result);
bh_result->b_bdev = NULL;
// unlock cache
affs_unlock_ext(inode);
@@ -701,7 +701,7 @@ static int affs_commit_write_ofs(struct
if (IS_ERR(bh))
goto out;
memcpy(AFFS_DATA(bh), data + from, bsize);
- if (bh->b_state & (1UL << BH_New)) {
+ if (buffer_new(bh)) {
AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA);
AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino);
AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx);
@@ -730,7 +730,7 @@ static int affs_commit_write_ofs(struct
goto out;
tmp = min(bsize, to - from);
memcpy(AFFS_DATA(bh), data + from, tmp);
- if (bh->b_state & (1UL << BH_New)) {
+ if (buffer_new(bh)) {
AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA);
AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino);
AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx);
--- 2.5.9/fs/block_dev.c~cleanup-070-bh_flags Wed Apr 24 01:30:46 2002
+++ 2.5.9-akpm/fs/block_dev.c Wed Apr 24 01:31:30 2002
@@ -120,7 +120,7 @@ static int blkdev_get_block(struct inode
bh->b_dev = inode->i_rdev;
bh->b_bdev = inode->i_bdev;
bh->b_blocknr = iblock;
- bh->b_state |= 1UL << BH_Mapped;
+ set_buffer_mapped(bh);
return 0;
}
--- 2.5.9/fs/fat/file.c~cleanup-070-bh_flags Wed Apr 24 01:33:52 2002
+++ 2.5.9-akpm/fs/fat/file.c Wed Apr 24 01:36:22 2002
@@ -67,7 +67,7 @@ int fat_get_block(struct inode *inode, s
phys = fat_bmap(inode, iblock);
if (!phys)
BUG();
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
map_bh(bh_result, inode->i_sb, phys);
return 0;
}
--- 2.5.9/fs/hpfs/file.c~cleanup-070-bh_flags Wed Apr 24 01:33:52 2002
+++ 2.5.9-akpm/fs/hpfs/file.c Wed Apr 24 01:36:45 2002
@@ -91,7 +91,7 @@ int hpfs_get_block(struct inode *inode,
}
inode->i_blocks++;
hpfs_i(inode)->mmu_private += 512;
- bh_result->b_state |= 1UL << BH_New;
+ set_buffer_new(bh_result);
map_bh(bh_result, inode->i_sb, s);
return 0;
}
--- 2.5.9/fs/jfs/jfs_metapage.c~cleanup-070-bh_flags Wed Apr 24 01:33:52 2002
+++ 2.5.9-akpm/fs/jfs/jfs_metapage.c Wed Apr 24 01:37:09 2002
@@ -267,7 +267,7 @@ static int direct_get_block(struct inode
struct buffer_head *bh_result, int create)
{
if (create)
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
map_bh(bh_result, ip->i_sb, lblock);
--- 2.5.9/fs/jfs/inode.c~cleanup-070-bh_flags Wed Apr 24 01:33:52 2002
+++ 2.5.9-akpm/fs/jfs/inode.c Wed Apr 24 01:37:36 2002
@@ -229,7 +229,7 @@ static int jfs_get_block(struct inode *i
rc = extRecord(ip, &xad);
if (rc)
goto unlock;
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
}
map_bh(bh_result, ip->i_sb, xaddr);
@@ -249,7 +249,7 @@ static int jfs_get_block(struct inode *i
if (rc)
goto unlock;
- bh_result->b_state |= (1UL << BH_New);
+ set_buffer_new(bh_result);
map_bh(bh_result, ip->i_sb, addressXAD(&xad));
#else /* _JFS_4K */
reply other threads:[~2002-04-24 9:02 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3CC673CF.15794899@zip.com.au \
--to=akpm@zip.com.au \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.