From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Tony Battersby" Subject: [PATCH] [RFC] LBD fixes for Linux 2.6.10 [1/2] Date: Tue, 11 Jan 2005 13:47:31 -0500 Message-ID: <05Jan11.134758est.332232@cyborg.cybernetics.com> Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Return-path: Received: from cyborg.cybernetics.com ([206.246.200.18]:59399 "EHLO cybernetics.com") by vger.kernel.org with ESMTP id S261589AbVAKSsF (ORCPT ); Tue, 11 Jan 2005 13:48:05 -0500 To: Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org This patch fixes some LBD problems in the core Linux filesystem code. I will send another message that has fixes for various filesystems. (For review, enabling LBD [large block device support] changes sector_t to a 64-bit quantity on i386 to support disks >= 2 TB. All sector numbers should be of type sector_t rather than long or unsigned long, which are only 32-bit on i386. One must also be careful to typecast long or int values to a 64-bit value before shifting left to avoid losing bits.) I haven't tested these changes at all, so please review and comment. Anthony J. Battersby Cybernetics diff -urpN linux-2.6.10/fs/buffer.c linux-2.6.10-lbd-fix/fs/buffer.c --- linux-2.6.10/fs/buffer.c Fri Dec 24 16:34:58 2004 +++ linux-2.6.10-lbd-fix/fs/buffer.c Wed Dec 29 10:30:31 2004 @@ -1754,7 +1754,7 @@ static int __block_write_full_page(struc * handle that here by just cleaning them. */ - block = page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); + block = (sector_t) page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); head = page_buffers(page); bh = head; @@ -2536,7 +2536,7 @@ int block_truncate_page(struct address_s pgoff_t index = from >> PAGE_CACHE_SHIFT; unsigned offset = from & (PAGE_CACHE_SIZE-1); unsigned blocksize; - pgoff_t iblock; + sector_t iblock; unsigned length, pos; struct inode *inode = mapping->host; struct page *page; @@ -2552,7 +2552,7 @@ int block_truncate_page(struct address_s return 0; length = blocksize - length; - iblock = index << (PAGE_CACHE_SHIFT - inode->i_blkbits); + iblock = (sector_t) index << (PAGE_CACHE_SHIFT - inode->i_blkbits); page = grab_cache_page(mapping, index); err = -ENOMEM; diff -urpN linux-2.6.10/fs/mpage.c linux-2.6.10-lbd-fix/fs/mpage.c --- linux-2.6.10/fs/mpage.c Fri Dec 24 16:34:26 2004 +++ linux-2.6.10-lbd-fix/fs/mpage.c Wed Dec 29 09:20:34 2004 @@ -226,7 +226,7 @@ do_mpage_readpage(struct bio *bio, struc if (page_has_buffers(page)) goto confused; - block_in_file = page->index << (PAGE_CACHE_SHIFT - blkbits); + block_in_file = (sector_t) page->index << (PAGE_CACHE_SHIFT - blkbits); last_block = (i_size_read(inode) + blocksize - 1) >> blkbits; bh.b_page = page; @@ -461,7 +461,7 @@ mpage_writepage(struct bio *bio, struct * The page has no buffers: map it to disk */ BUG_ON(!PageUptodate(page)); - block_in_file = page->index << (PAGE_CACHE_SHIFT - blkbits); + block_in_file = (sector_t) page->index << (PAGE_CACHE_SHIFT - blkbits); last_block = (i_size - 1) >> blkbits; map_bh.b_page = page; for (page_block = 0; page_block < blocks_per_page; ) {