From: Edward Shishkin This is waiting for IO completion, and no success because of new plugging policy introduced by block layer folks. The attached patch should help. Andrew, please apply. Signed-off-by: Edward Shishkin Cc: Vladimir Saveliev Cc: Jens Axboe Signed-off-by: Andrew Morton --- fs/reiser4/status_flags.c | 2 ++ fs/reiser4/wander.c | 18 +++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff -puN fs/reiser4/status_flags.c~reiser4-vs-git-block3 fs/reiser4/status_flags.c --- a/fs/reiser4/status_flags.c~reiser4-vs-git-block3 +++ a/fs/reiser4/status_flags.c @@ -63,6 +63,7 @@ int reiser4_status_init(reiser4_block_nr } lock_page(page); submit_bio(READ, bio); + blk_replug_current_nested(); wait_on_page_locked(page); if (!PageUptodate(page)) { warning("green-2007", @@ -157,6 +158,7 @@ int reiser4_status_write(__u64 status, _ lock_page(get_super_private(sb)->status_page); // Safe as nobody should touch our page. /* We can block now, but we have no other choice anyway */ submit_bio(WRITE, bio); + blk_replug_current_nested(); return 0; // We do not wait for io to finish. } diff -puN fs/reiser4/wander.c~reiser4-vs-git-block3 fs/reiser4/wander.c --- a/fs/reiser4/wander.c~reiser4-vs-git-block3 +++ a/fs/reiser4/wander.c @@ -718,6 +718,7 @@ static int write_jnodes_to_disk_extent( jnode *first, int nr, const reiser4_block_nr *block_p, flush_queue_t *fq, int flags) { + int ret = 0; struct super_block *super = reiser4_get_current_sb(); int write_op = ( flags & WRITEOUT_BARRIER ) ? WRITE_BARRIER : WRITE; int max_blocks; @@ -738,9 +739,10 @@ static int write_jnodes_to_disk_extent( int nr_used; bio = bio_alloc(GFP_NOIO, nr_blocks); - if (!bio) - return RETERR(-ENOMEM); - + if (!bio) { + ret = RETERR(-ENOMEM); + break; + } bio->bi_bdev = super->s_bdev; bio->bi_sector = block * (super->s_blocksize >> 9); for (nr_used = 0, i = 0; i < nr_blocks; i++) { @@ -843,8 +845,10 @@ static int write_jnodes_to_disk_extent( reiser4_submit_bio(write_op, bio); not_supported = bio_flagged(bio, BIO_EOPNOTSUPP); bio_put(bio); - if (not_supported) - return -EOPNOTSUPP; + if (not_supported) { + ret = -EOPNOTSUPP; + break; + } } block += nr_used - 1; @@ -855,8 +859,8 @@ static int write_jnodes_to_disk_extent( } nr -= nr_used; } - - return 0; + blk_replug_current_nested(); + return ret; } /* This is a procedure which recovers a contiguous sequences of disk block _