* [Ocfs2-devel] [PATCH] remove ocfs2_write_blocks
@ 2005-09-18 5:36 Christoph Hellwig
2005-09-20 15:24 ` Mark Fasheh
0 siblings, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2005-09-18 5:36 UTC (permalink / raw)
To: ocfs2-devel
we only need ocfs2_write_block because there's never more than one
buffer written.
Also remove lots of useless checks and replace the useful ones with
BUG_ON.
While we're at it, can someone please audit the buffer_head end_io
handlers in ocfs? comparing them to the generic ones in fs/buffer.c
the buffered I/O in ocfs seems to lack grabbing a reference for the
duration of the I/O. It might in fact be possible to just use the
generic completetion handlers.
Index: fs/ocfs2/buffer_head_io.c
===================================================================
--- fs/ocfs2/buffer_head_io.c (revision 2593)
+++ fs/ocfs2/buffer_head_io.c (working copy)
@@ -52,21 +52,16 @@
unlock_buffer(bh);
}
-int ocfs2_write_blocks(ocfs2_super *osb, struct buffer_head *bhs[],
- int nr, struct inode *inode)
+int ocfs2_write_block(ocfs2_super *osb, struct buffer_head *bh,
+ struct inode *inode)
{
int status = 0;
- int i;
- struct buffer_head *bh;
- mlog_entry("(bh[0]->b_blocknr = %llu, nr=%d, inode=%p)\n",
- (unsigned long long)bhs[0]->b_blocknr, nr, inode);
+ mlog_entry("(bh->b_blocknr = %llu, inode=%p)\n",
+ (unsigned long long)bh->b_blocknr, inode);
- if (osb == NULL || osb->sb == NULL || bhs == NULL) {
- status = -EINVAL;
- mlog_errno(status);
- goto bail;
- }
+ BUG_ON(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO);
+ BUG_ON(buffer_jbd(bh));
/* No need to check for a soft readonly file system here. non
* journalled writes are only ever done on system files which
@@ -76,70 +71,34 @@
goto bail;
}
- if (inode)
- down(&OCFS2_I(inode)->ip_io_sem);
- for (i = 0 ; i < nr ; i++) {
- bh = bhs[i];
- if (bh == NULL) {
- if (inode)
- up(&OCFS2_I(inode)->ip_io_sem);
- status = -EIO;
- mlog_errno(status);
- goto bail;
- }
+ down(&OCFS2_I(inode)->ip_io_sem);
- if (unlikely(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO)) {
- BUG();
- status = -EIO;
- mlog_errno(status);
- goto bail;
- }
+ lock_buffer(bh);
+ set_buffer_uptodate(bh);
- if (unlikely(buffer_jbd(bh))) {
- /* What are you thinking?! */
- mlog(ML_ERROR, "trying to write a jbd managed bh "
- "(blocknr = %llu), nr=%d\n",
- (unsigned long long)bh->b_blocknr, nr);
- BUG();
- }
+ /* remove from dirty list before I/O. */
+ clear_buffer_dirty(bh);
- lock_buffer(bh);
+ bh->b_end_io = ocfs2_end_buffer_io_sync;
+ submit_bh(WRITE, bh);
- set_buffer_uptodate(bh);
+ wait_on_buffer(bh);
- /* remove from dirty list before I/O. */
- clear_buffer_dirty(bh);
-
- bh->b_end_io = ocfs2_end_buffer_io_sync;
- submit_bh(WRITE, bh);
+ if (buffer_uptodate(bh))
+ ocfs2_set_buffer_uptodate(inode, bh);
+ else {
+ /* Status won't be cleared from here on out,
+ * so we can safely record this and loop back
+ * to cleanup the other buffers. Don't need to
+ * remove the clustered uptodate information
+ * for this bh as it's not marked locally
+ * uptodate. */
+ status = -EIO;
+ brelse(bh);
}
- for (i = (nr - 1) ; i >= 0; i--) {
- bh = bhs[i];
-
- wait_on_buffer(bh);
-
- if (!buffer_uptodate(bh)) {
- /* Status won't be cleared from here on out,
- * so we can safely record this and loop back
- * to cleanup the other buffers. Don't need to
- * remove the clustered uptodate information
- * for this bh as it's not marked locally
- * uptodate. */
- status = -EIO;
- brelse(bh);
- bhs[i] = NULL;
- continue;
- }
-
- if (inode)
- ocfs2_set_buffer_uptodate(inode, bh);
- }
- if (inode)
- up(&OCFS2_I(inode)->ip_io_sem);
-
-bail:
-
+ up(&OCFS2_I(inode)->ip_io_sem);
+ bail:
mlog_exit(status);
return status;
}
Index: fs/ocfs2/buffer_head_io.h
===================================================================
--- fs/ocfs2/buffer_head_io.h (revision 2593)
+++ fs/ocfs2/buffer_head_io.h (working copy)
@@ -32,19 +32,13 @@
int uptodate);
/* Yosh made me do it. */
-static inline int ocfs2_write_block(ocfs2_super *osb,
- struct buffer_head *bh,
- struct inode *inode);
static inline int ocfs2_read_block(ocfs2_super *osb,
u64 off,
struct buffer_head **bh,
int flags,
struct inode *inode);
-int ocfs2_write_blocks(ocfs2_super *osb,
- struct buffer_head *bh[],
- int nr,
- struct inode *inode);
+int ocfs2_write_block(ocfs2_super *, struct buffer_head *, struct inode *);
int ocfs2_read_blocks(ocfs2_super *osb,
u64 block,
int nr,
@@ -56,16 +50,6 @@
#define OCFS2_BH_CACHED 1
#define OCFS2_BH_READAHEAD 8 /* use this to pass READA down to submit_bh */
-static inline int ocfs2_write_block(ocfs2_super * osb, struct buffer_head *bh,
- struct inode *inode)
-{
- int status;
-
- status = ocfs2_write_blocks(osb, &bh, 1, inode);
-
- return status;
-}
-
static inline int ocfs2_read_block(ocfs2_super * osb, u64 off,
struct buffer_head **bh, int flags,
struct inode *inode)
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Ocfs2-devel] [PATCH] remove ocfs2_write_blocks
2005-09-18 5:36 [Ocfs2-devel] [PATCH] remove ocfs2_write_blocks Christoph Hellwig
@ 2005-09-20 15:24 ` Mark Fasheh
2005-09-20 15:27 ` Christoph Hellwig
0 siblings, 1 reply; 4+ messages in thread
From: Mark Fasheh @ 2005-09-20 15:24 UTC (permalink / raw)
To: ocfs2-devel
Thanks - committed.
I took some liberties with the patch:
- merged it with the newest version of buffer_head_io.c (it got some
readonly goodness since your patch was created)
- added a couple minor cleanups of my own
- you forgot to update a comment, which I did
--Mark
On Sun, Sep 18, 2005 at 12:36:17PM +0200, Christoph Hellwig wrote:
> we only need ocfs2_write_block because there's never more than one
> buffer written.
>
> Also remove lots of useless checks and replace the useful ones with
> BUG_ON.
>
> While we're at it, can someone please audit the buffer_head end_io
> handlers in ocfs? comparing them to the generic ones in fs/buffer.c
> the buffered I/O in ocfs seems to lack grabbing a reference for the
> duration of the I/O. It might in fact be possible to just use the
> generic completetion handlers.
>
>
> Index: fs/ocfs2/buffer_head_io.c
> ===================================================================
> --- fs/ocfs2/buffer_head_io.c (revision 2593)
> +++ fs/ocfs2/buffer_head_io.c (working copy)
> @@ -52,21 +52,16 @@
> unlock_buffer(bh);
> }
>
> -int ocfs2_write_blocks(ocfs2_super *osb, struct buffer_head *bhs[],
> - int nr, struct inode *inode)
> +int ocfs2_write_block(ocfs2_super *osb, struct buffer_head *bh,
> + struct inode *inode)
> {
> int status = 0;
> - int i;
> - struct buffer_head *bh;
>
> - mlog_entry("(bh[0]->b_blocknr = %llu, nr=%d, inode=%p)\n",
> - (unsigned long long)bhs[0]->b_blocknr, nr, inode);
> + mlog_entry("(bh->b_blocknr = %llu, inode=%p)\n",
> + (unsigned long long)bh->b_blocknr, inode);
>
> - if (osb == NULL || osb->sb == NULL || bhs == NULL) {
> - status = -EINVAL;
> - mlog_errno(status);
> - goto bail;
> - }
> + BUG_ON(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO);
> + BUG_ON(buffer_jbd(bh));
>
> /* No need to check for a soft readonly file system here. non
> * journalled writes are only ever done on system files which
> @@ -76,70 +71,34 @@
> goto bail;
> }
>
> - if (inode)
> - down(&OCFS2_I(inode)->ip_io_sem);
> - for (i = 0 ; i < nr ; i++) {
> - bh = bhs[i];
> - if (bh == NULL) {
> - if (inode)
> - up(&OCFS2_I(inode)->ip_io_sem);
> - status = -EIO;
> - mlog_errno(status);
> - goto bail;
> - }
> + down(&OCFS2_I(inode)->ip_io_sem);
>
> - if (unlikely(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO)) {
> - BUG();
> - status = -EIO;
> - mlog_errno(status);
> - goto bail;
> - }
> + lock_buffer(bh);
> + set_buffer_uptodate(bh);
>
> - if (unlikely(buffer_jbd(bh))) {
> - /* What are you thinking?! */
> - mlog(ML_ERROR, "trying to write a jbd managed bh "
> - "(blocknr = %llu), nr=%d\n",
> - (unsigned long long)bh->b_blocknr, nr);
> - BUG();
> - }
> + /* remove from dirty list before I/O. */
> + clear_buffer_dirty(bh);
>
> - lock_buffer(bh);
> + bh->b_end_io = ocfs2_end_buffer_io_sync;
> + submit_bh(WRITE, bh);
>
> - set_buffer_uptodate(bh);
> + wait_on_buffer(bh);
>
> - /* remove from dirty list before I/O. */
> - clear_buffer_dirty(bh);
> -
> - bh->b_end_io = ocfs2_end_buffer_io_sync;
> - submit_bh(WRITE, bh);
> + if (buffer_uptodate(bh))
> + ocfs2_set_buffer_uptodate(inode, bh);
> + else {
> + /* Status won't be cleared from here on out,
> + * so we can safely record this and loop back
> + * to cleanup the other buffers. Don't need to
> + * remove the clustered uptodate information
> + * for this bh as it's not marked locally
> + * uptodate. */
> + status = -EIO;
> + brelse(bh);
> }
>
> - for (i = (nr - 1) ; i >= 0; i--) {
> - bh = bhs[i];
> -
> - wait_on_buffer(bh);
> -
> - if (!buffer_uptodate(bh)) {
> - /* Status won't be cleared from here on out,
> - * so we can safely record this and loop back
> - * to cleanup the other buffers. Don't need to
> - * remove the clustered uptodate information
> - * for this bh as it's not marked locally
> - * uptodate. */
> - status = -EIO;
> - brelse(bh);
> - bhs[i] = NULL;
> - continue;
> - }
> -
> - if (inode)
> - ocfs2_set_buffer_uptodate(inode, bh);
> - }
> - if (inode)
> - up(&OCFS2_I(inode)->ip_io_sem);
> -
> -bail:
> -
> + up(&OCFS2_I(inode)->ip_io_sem);
> + bail:
> mlog_exit(status);
> return status;
> }
> Index: fs/ocfs2/buffer_head_io.h
> ===================================================================
> --- fs/ocfs2/buffer_head_io.h (revision 2593)
> +++ fs/ocfs2/buffer_head_io.h (working copy)
> @@ -32,19 +32,13 @@
> int uptodate);
>
> /* Yosh made me do it. */
> -static inline int ocfs2_write_block(ocfs2_super *osb,
> - struct buffer_head *bh,
> - struct inode *inode);
> static inline int ocfs2_read_block(ocfs2_super *osb,
> u64 off,
> struct buffer_head **bh,
> int flags,
> struct inode *inode);
>
> -int ocfs2_write_blocks(ocfs2_super *osb,
> - struct buffer_head *bh[],
> - int nr,
> - struct inode *inode);
> +int ocfs2_write_block(ocfs2_super *, struct buffer_head *, struct inode *);
> int ocfs2_read_blocks(ocfs2_super *osb,
> u64 block,
> int nr,
> @@ -56,16 +50,6 @@
> #define OCFS2_BH_CACHED 1
> #define OCFS2_BH_READAHEAD 8 /* use this to pass READA down to submit_bh */
>
> -static inline int ocfs2_write_block(ocfs2_super * osb, struct buffer_head *bh,
> - struct inode *inode)
> -{
> - int status;
> -
> - status = ocfs2_write_blocks(osb, &bh, 1, inode);
> -
> - return status;
> -}
> -
> static inline int ocfs2_read_block(ocfs2_super * osb, u64 off,
> struct buffer_head **bh, int flags,
> struct inode *inode)
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel@oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
--
Mark Fasheh
Senior Software Developer, Oracle
mark.fasheh@oracle.com
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Ocfs2-devel] [PATCH] remove ocfs2_write_blocks
2005-09-20 15:24 ` Mark Fasheh
@ 2005-09-20 15:27 ` Christoph Hellwig
2005-09-20 15:37 ` Mark Fasheh
0 siblings, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2005-09-20 15:27 UTC (permalink / raw)
To: ocfs2-devel
On Tue, Sep 20, 2005 at 01:24:39PM -0700, Mark Fasheh wrote:
> Thanks - committed.
>
> I took some liberties with the patch:
> - merged it with the newest version of buffer_head_io.c (it got some
> readonly goodness since your patch was created)
> - added a couple minor cleanups of my own
> - you forgot to update a comment, which I did
I think you lost the get_bh() that zab added after I submitted the
patch.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Ocfs2-devel] [PATCH] remove ocfs2_write_blocks
2005-09-20 15:27 ` Christoph Hellwig
@ 2005-09-20 15:37 ` Mark Fasheh
0 siblings, 0 replies; 4+ messages in thread
From: Mark Fasheh @ 2005-09-20 15:37 UTC (permalink / raw)
To: ocfs2-devel
On Tue, Sep 20, 2005 at 10:27:19PM +0200, Christoph Hellwig wrote:
> I think you lost the get_bh() that zab added after I submitted the
> patch.
Erf, you're right. Thanks for the catch...
--Mark
--
Mark Fasheh
Senior Software Developer, Oracle
mark.fasheh@oracle.com
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2005-09-20 15:37 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-18 5:36 [Ocfs2-devel] [PATCH] remove ocfs2_write_blocks Christoph Hellwig
2005-09-20 15:24 ` Mark Fasheh
2005-09-20 15:27 ` Christoph Hellwig
2005-09-20 15:37 ` Mark Fasheh
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.