Re: [CFT][PATCH] cleanup of partition code

From: Matt_Domsch@Dell.com
Date: Tue Oct 02 2001 - 16:49:48 EST


Alexander:

In the IA-64 port lives the EFI GUID Partition Table (GPT) partitioning
code. It's not yet merged into the mainline kernel tree. I've made a
first-stab at a patch to make the GPT code use the page cache, and I'd
appreciate you taking a look.

Start with 2.4.10
apply 2.4.11-pre1
apply your latest partition patch (partition-d-S11-pre1 I think)
apply latest ia64 patch
 (there's one rejection in include/linux/genhd.h that's easy to fix)
apply http://domsch.com/linux/patches/linux-2.4.10-gpt-20011001.patch
apply
http://domsch.com/linux/patches/linux-2.4.10-gpt-pagecache-20011001.patch

The GPT code is in fs/partition/efi.[ch]. I'm concerned about reading a
page or partial page at the end of a disk, particularly an odd-sized disk.
In the pagecache patch I remove the set_blocksize() stuff, as it's not clear
if it's still needed, or if a disk with sectors % PAGE_CACHE_SIZE != 0 can
even read those last sectors.

Reading even the first few sectors fails with these patches, where if I
remove your partition patch and my pagecache patch, it works fine. I'm
certain it's a bug in my read_lba() code, which could use to be optimized
also.

static size_t
read_lba(struct gendisk *hd, struct block_device *bdev, u64 lba, u8 *buffer,
size_t count)
{

        size_t totalreadcount = 0, bytesread;
        int i, blockstoread, blocksize;
        Sect sect;
        unsigned char *data=NULL;

        if (!hd || !buffer || !count) return 0;

        blocksize = get_hardsect_size(to_kdev_t(bdev->bd_dev));
        blockstoread = count / blocksize;
        if (count % blocksize) blockstoread += 1;
        for (i=0; i<blockstoread; i++) {
                data = read_dev_sector(bdev, lba, &sect);
                if (!data) {
                        put_dev_sector(sect);
                        return totalreadcount;
                }

                bytesread = (count > 512 ? 512 : count);
                memcpy(buffer, data, bytesread);
                put_dev_sector(sect);

                buffer += bytesread; /* Advance the buffer pointer
*/
                totalreadcount += bytesread; /* Advance the total read count
*/
                count -= bytesread; /* Subtract bytesread from count
*/
        }

        return totalreadcount;
}

I'd appreciate your pointers.

Thanks,
Matt

--
Matt Domsch
Sr. Software Engineer
Dell Linux Solutions
www.dell.com/linux
#2 Linux Server provider with 17% in the US and 14% Worldwide (IDC)!
#3 Unix provider with 18% in the US (Dataquest)!
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Oct 07 2001 - 21:00:24 EST