Make sync_dirty_buffer() return the result of its syncing. Signed-off-by: Andrew Morton --- 25-akpm/fs/buffer.c | 12 +++++++++--- 25-akpm/include/linux/buffer_head.h | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff -puN fs/buffer.c~sync_dirty_buffer-retval fs/buffer.c --- 25/fs/buffer.c~sync_dirty_buffer-retval 2004-07-11 14:26:04.840915912 -0700 +++ 25-akpm/fs/buffer.c 2004-07-11 14:26:04.846915000 -0700 @@ -2868,20 +2868,26 @@ void ll_rw_block(int rw, int nr, struct /* * For a data-integrity writeout, we need to wait upon any in-progress I/O - * and then start new I/O and then wait upon it. + * and then start new I/O and then wait upon it. The caller must have a ref on + * the buffer_head. */ -void sync_dirty_buffer(struct buffer_head *bh) +int sync_dirty_buffer(struct buffer_head *bh) { + int ret = 0; + WARN_ON(atomic_read(&bh->b_count) < 1); lock_buffer(bh); if (test_clear_buffer_dirty(bh)) { get_bh(bh); bh->b_end_io = end_buffer_write_sync; - submit_bh(WRITE, bh); + ret = submit_bh(WRITE, bh); wait_on_buffer(bh); + if (!ret && !buffer_uptodate(bh)) + ret = -EIO; } else { unlock_buffer(bh); } + return ret; } /* diff -puN include/linux/buffer_head.h~sync_dirty_buffer-retval include/linux/buffer_head.h --- 25/include/linux/buffer_head.h~sync_dirty_buffer-retval 2004-07-11 14:26:04.841915760 -0700 +++ 25-akpm/include/linux/buffer_head.h 2004-07-11 14:26:04.847914848 -0700 @@ -174,7 +174,7 @@ void free_buffer_head(struct buffer_head void FASTCALL(unlock_buffer(struct buffer_head *bh)); void FASTCALL(__lock_buffer(struct buffer_head *bh)); void ll_rw_block(int, int, struct buffer_head * bh[]); -void sync_dirty_buffer(struct buffer_head *bh); +int sync_dirty_buffer(struct buffer_head *bh); int submit_bh(int, struct buffer_head *); void write_boundary_block(struct block_device *bdev, sector_t bblock, unsigned blocksize); _