--- ./fs/buffer.c.~1~ Mon Jan 7 18:57:05 2002 +++ ./fs/buffer.c Mon Jan 7 19:04:33 2002 @@ -2066,8 +2066,10 @@ { int i, nr_blocks, retval; unsigned long * blocks = iobuf->blocks; + int length; - nr_blocks = iobuf->length / blocksize; + length = iobuf->length; + nr_blocks = length / blocksize; /* build the blocklist */ for (i = 0; i < nr_blocks; i++, blocknr++) { struct buffer_head bh; @@ -2077,8 +2079,14 @@ bh.b_size = blocksize; retval = get_block(inode, blocknr, &bh, rw == READ ? 0 : 1); - if (retval) - goto out; + if (retval) { + if (!i) + /* report error to userspace */ + goto out; + else + /* do short I/O utill 'i' */ + break; + } if (rw == READ) { if (buffer_new(&bh)) @@ -2097,9 +2105,13 @@ blocks[i] = bh.b_blocknr; } + /* patch length to handle short I/O */ + iobuf->length = i * blocksize; retval = brw_kiovec(rw, 1, &iobuf, inode->i_dev, iobuf->blocks, blocksize); - + /* restore orig length */ + iobuf->length = length; out: + return retval; }