Skip to contentSkip to conversation

larger b_size, and misc fixlets

PATCH In review Andrew Morton 3 participants 4 messages May 19, 2002 VFS

lore
Share & tools
lore
#0 lore raw

PATCH 6/15 larger b_size, and misc fixlets

Miscellany.

- make the printk in buffer_io_error() sector_t-aware.

- Some buffer.c cleanups from AntonA: remove a couple of !uptodate checks, and set a new buffer's b_blocknr to -1 in a more sensible place.

- Make buffer_head.b_size a 32-bit quantity. Needed for 64k pagesize on ia64. Does not increase sizeof(struct buffer_head).

=====================================

fs/buffer.c renamed from fs/buffer.c~sector_t-printing +9 -13
@@ -179,8 +179,8 @@ __clear_page_buffers(struct page *page)
 
 static void buffer_io_error(struct buffer_head *bh)
 {
-	printk(KERN_ERR "Buffer I/O error on device %s, logical block %ld\n",
-			bdevname(bh->b_bdev), bh->b_blocknr);
+	printk(KERN_ERR "Buffer I/O error on device %s, logical block %Ld\n",
+			bdevname(bh->b_bdev), (u64)bh->b_blocknr);
 }
 
 /*
@@ -189,12 +189,12 @@ static void buffer_io_error(struct buffe
  */
 void end_buffer_io_sync(struct buffer_head *bh, int uptodate)
 {
-	if (!uptodate)
-		buffer_io_error(bh);
-	if (uptodate)
+	if (uptodate) {
 		set_buffer_uptodate(bh);
-	else
+	} else {
+		buffer_io_error(bh);
 		clear_buffer_uptodate(bh);
+	}
 	unlock_buffer(bh);
 	put_bh(bh);
 }
@@ -519,14 +519,12 @@ static void end_buffer_async_read(struct
 
 	BUG_ON(!buffer_async_read(bh));
 
-	if (!uptodate)
-		buffer_io_error(bh);
-
 	page = bh->b_page;
 	if (uptodate) {
 		set_buffer_uptodate(bh);
 	} else {
 		clear_buffer_uptodate(bh);
+		buffer_io_error(bh);
 		SetPageError(page);
 	}
 
@@ -579,13 +577,11 @@ static void end_buffer_async_write(struc
 
 	BUG_ON(!buffer_async_write(bh));
 
-	if (!uptodate)
-		buffer_io_error(bh);
-
 	page = bh->b_page;
 	if (uptodate) {
 		set_buffer_uptodate(bh);
 	} else {
+		buffer_io_error(bh);
 		clear_buffer_uptodate(bh);
 		SetPageError(page);
 	}
@@ -907,6 +903,7 @@ try_again:
 
 		bh->b_bdev = NULL;
 		bh->b_this_page = head;
+		bh->b_blocknr = -1;
 		head = bh;
 
 		bh->b_state = 0;
@@ -2442,7 +2439,6 @@ static void init_buffer_head(void *data,
 		struct buffer_head * bh = (struct buffer_head *)data;
 
 		memset(bh, 0, sizeof(*bh));
-		bh->b_blocknr = -1;
 		INIT_LIST_HEAD(&bh->b_assoc_buffers);
 	}
 }
include/linux/buffer_head.h renamed from include/linux/buffer_head.h~sector_t-printing +1 -1
@@ -44,7 +44,7 @@ struct buffer_head {
 	struct page *b_page;		/* the page this bh is mapped to */
 
 	sector_t b_blocknr;		/* block number */
-	unsigned short b_size;		/* block size */
+	u32 b_size;			/* block size */
 	char *b_data;			/* pointer to data block */
 
 	struct block_device *b_bdev;

-

#1 lore raw

fs/buffer.c __clear_page_buffers(struct page *page) · line 184

Quoted 13 lines · Andrew Morton

- make the printk in buffer_io_error() sector_t-aware.
=====================================

fs/buffer.c renamed from fs/buffer.c~sector_t-printing +2 -2
@@ -179,8 +179,8 @@ __clear_page_buffers(struct page *page)
 
 static void buffer_io_error(struct buffer_head *bh)
 {
-	printk(KERN_ERR "Buffer I/O error on device %s, logical block %ld\n",
-			bdevname(bh->b_bdev), bh->b_blocknr);
+	printk(KERN_ERR "Buffer I/O error on device %s, logical block %Ld\n",
+			bdevname(bh->b_bdev), (u64)bh->b_blocknr);
 }

Not that I'm a 64-bit system user/developer, but it is my understanding that u64 == long on a 64-bit platform, so your cast to u64 does not actually change the type of b_blocknr as far as printk is concerned. You would need to cast it to unsigned long long instead.

Cheers, Andreas
--
Andreas Dilger
http://www-mddsp.enel.ucalgary.ca/People/adilger/
http://sourceforge.net/projects/ext2resize/

#2 lore raw
In reply to Andrew Morton
Quoted 8 lines · Andreas Dilger
Quoted 6 lines · Andrew Morton

- make the printk in buffer_io_error() sector_t-aware.
=====================================

fs/buffer.c Sun May 19 12:02:57 2002 renamed from fs/buffer.c~sector_t-printing Sun May 19 11:49:47 2002 +0 -0
@@ -179,8 +179,8 @@ __clear_page_buffers(struct page *page)
 
Quoted 13 lines

fs/buffer.c Sun May 19 12:02:57 2002 __clear_page_buffers(struct page *page) · line 184

Quoted 7 lines
fs/buffer.c Sun May 19 12:02:57 2002 renamed from fs/buffer.c~sector_t-printing Sun May 19 11:49:47 2002 +2 -2
 static void buffer_io_error(struct buffer_head *bh)
 {
-     printk(KERN_ERR "Buffer I/O error on device %s, logical block %ld\n",
-                     bdevname(bh->b_bdev), bh->b_blocknr);
+     printk(KERN_ERR "Buffer I/O error on device %s, logical block %Ld\n",
+                     bdevname(bh->b_bdev), (u64)bh->b_blocknr);
 }

Not that I'm a 64-bit system user/developer, but it is my understanding that u64 == long on a 64-bit platform, so your cast to u64 does not actually change the type of b_blocknr as far as printk is concerned. You would need to cast it to unsigned long long instead.

Yes, I suppose so. That more closely matches what "%L" does.

-

#3 lore raw
Quoted 7 lines · Andrew Morton
Quoted 6 lines · Andreas Dilger
Quoted 4 lines · Andrew Morton
fs/buffer.c renamed from fs/buffer.c~sector_t-printing +2 -2
-     printk(KERN_ERR "Buffer I/O error on device %s, logical block %ld\n",
-                     bdevname(bh->b_bdev), bh->b_blocknr);
+     printk(KERN_ERR "Buffer I/O error on device %s, logical block %Ld\n",
+                     bdevname(bh->b_bdev), (u64)bh->b_blocknr);
Quoted 6 lines
Quoted 4 lines

Not that I'm a 64-bit system user/developer, but it is my understanding that u64 == long on a 64-bit platform, so your cast to u64 does not actually change the type of b_blocknr as far as printk is concerned. You would need to cast it to unsigned long long instead.

Yes, I suppose so. That more closely matches what "%L" does.

/me can't help it: Didn't I say earlier on that one has to use (unsigned) long long and not u64? (-; But noone would listen...

But to be fully correct, if you want unsigned long long you really ought to write %Lu not %Ld... (-8

Cheers,
Anton

Signature · 3 lines
Anton Altaparmakov <aia21 at cantab.net> (replace at with @)
Linux NTFS maintainer / IRC: #ntfs on irc.openprojects.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/