diff --git a/sftl.c b/sftl.c index b0352de..113556f 100644 --- a/sftl.c +++ b/sftl.c @@ -75,7 +75,7 @@ static void sftl_transfer(struct sftl_dev *dev, sector_t sector, if ((offset + nblocks) > dev->size) { - INFO("Beyond-end write (starting sector = %ld, count = %ld)\n", offset, nblocks); + INFO("Beyond-end write (starting sector = %ld, count = %ld)", offset, nblocks); return; } @@ -127,17 +127,26 @@ static struct block_device_operations sftl_ops = { .getgeo = sftl_getgeo }; -static int __init sftl_init(void) +static int sftl_reg_major(void) { - /* Register major number */ - major_num = register_blkdev(major_num, "sftl"); - if (major_num < 0) + if (!major_num) { - printk(KERN_WARNING "sftl: unable to get major number\n"); + /* Register major number */ + major_num = register_blkdev(major_num, "sftl"); + if (major_num < 0) + { + printk(KERN_WARNING "sftl: unable to get major number\n"); + return -1; + } } return 0; } +static int __init sftl_init(void) +{ + return sftl_reg_major(); +} + static void sftl_free_device(struct sftl_dev *dev) { if (!dev) @@ -184,6 +193,10 @@ static struct sftl_dev *add_device(char *devname) struct block_device *bdev; struct sftl_dev *dev; int error, index; + uint64_t t; + + if (!major_num) + sftl_reg_major(); if (!devname) return NULL; @@ -209,7 +222,9 @@ static struct sftl_dev *add_device(char *devname) mutex_init(&dev->write_mutex); - dev->segs = bdev->bd_block_size / clust_blocks / (seg_sz+1); + t = dev->blkdev->bd_inode->i_size; + do_div(t, clust_sz*seg_sz + phy_sz); + dev->segs = (uint32_t)t; //!!! dev->size = dev->segs * seg_sz * clust_blocks; dev->reserved_segs = seg_sz * (seg_sz+1); @@ -242,13 +257,14 @@ static struct sftl_dev *add_device(char *devname) snprintf(dev->gd->disk_name, 32, "sftl%d", index); set_capacity(dev->gd, dev->size); dev->gd->queue = dev->queue; + INFO("gd = %d %d %d", dev->gd->minors, dev->gd->major, dev->gd->first_minor); add_disk(dev->gd); /* Read maps from the device */ list_add(&dev->list, &sftl_device_list); - INFO("%s: translating %s", dev->gd->disk_name, devname); + INFO("%s: translating %s; %d sectors", dev->gd->disk_name, devname, dev->size); return dev; devinit_err: