linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] reading the last block on a bdev
@ 2004-03-09 21:19 Chris Mason
  0 siblings, 0 replies; only message in thread
From: Chris Mason @ 2004-03-09 21:19 UTC (permalink / raw)
  To: linux-kernel, akpm

[-- Attachment #1: Type: text/plain, Size: 520 bytes --]

Hello everyone,

This patch fixes a problem we're hitting on ia64 with page sizes > 4k.  

When the page size is greater than the block size, and parts of the page
fall past the end of the device, readpage will fail because
blkdev_get_block returns -EIO for blocks past i_size.

The attached patch changes blkdev_get_block to return holes when reading
past the end of the device, which allows us to read that last valid 4k
block and then fill the rest of the page with zeros.   Writes will still
fail with -EIO.

-chris

[-- Attachment #2: blkdev_get_block-partial --]
[-- Type: text/x-patch, Size: 801 bytes --]

Index: linux.t/fs/block_dev.c
===================================================================
--- linux.t.orig/fs/block_dev.c	2004-03-08 09:56:06.000000000 -0500
+++ linux.t/fs/block_dev.c	2004-03-09 09:48:15.000000000 -0500
@@ -116,9 +116,18 @@ static int
 blkdev_get_block(struct inode *inode, sector_t iblock,
 		struct buffer_head *bh, int create)
 {
-	if (iblock >= max_block(I_BDEV(inode)))
-		return -EIO;
-
+	if (iblock >= max_block(I_BDEV(inode))) {
+		if (create)
+			return -EIO;
+
+		/* 
+		 * for reads, we're just trying to fill a partial page.
+		 * return a hole, they will have to call get_block again
+		 * before they can fill it, and they will get -EIO at that
+		 * time
+		 */
+		return 0;
+	}
 	bh->b_bdev = I_BDEV(inode);
 	bh->b_blocknr = iblock;
 	set_buffer_mapped(bh);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-03-09 21:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-03-09 21:19 [PATCH] reading the last block on a bdev Chris Mason

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).