master
Vitaliy Filippov 2013-05-11 01:58:59 +04:00
parent 73c774101c
commit d7c582b416
1 changed files with 24 additions and 8 deletions

32
sftl.c
View File

@ -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: