Patch: linux-2.5.2-pre8/drivers/mtd compilation fixes
Adam J. Richter
adam at yggdrasil.com
Sat Jan 5 05:50:42 EST 2002
The following patch updates linux-2.5.2-pre8/drivers/mtd
to compile. This entails some kdev_t fixes and other updates
for changes to the block device driver interface.
In the case of one routine (ftl_reread_partitions), there was
a goto to a nonexistant label (goto leave), so I think there may have
been an incomplete patch applied to this subdirectory to begin with
(also, drivers/mtd/bootldr.c refers to a nonexistant "struct tag",
but that file is apparently not currently compiled anyhow).
I only know that this patch makes the code compile. I
have not tested it.
--
Adam J. Richter __ ______________ 4880 Stevens Creek Blvd, Suite 104
adam at yggdrasil.com \ / San Jose, California 95129-1034
+1 408 261-6630 | g g d r a s i l United States of America
fax +1 408 261-6631 "Free Software For The Rest Of Us."
-------------- next part --------------
--- linux-2.5.2-pre8/drivers/mtd/ftl.c Fri Jan 4 19:40:37 2002
+++ linux/drivers/mtd/ftl.c Sat Jan 5 02:37:28 2002
@@ -180,6 +180,7 @@
static struct hd_struct ftl_hd[MINOR_NR(MAX_DEV, 0, 0)];
static int ftl_sizes[MINOR_NR(MAX_DEV, 0, 0)];
static int ftl_blocksizes[MINOR_NR(MAX_DEV, 0, 0)];
+static spinlock_t ftl_queue_lock = SPIN_LOCK_UNLOCKED;
static struct gendisk ftl_gendisk = {
major: FTL_MAJOR,
@@ -195,7 +196,7 @@
u_int cmd, u_long arg);
static int ftl_open(struct inode *inode, struct file *file);
static release_t ftl_close(struct inode *inode, struct file *file);
-static int ftl_reread_partitions(int minor);
+static int ftl_reread_partitions(kdev_t dev);
static void ftl_erase_callback(struct erase_info *done);
@@ -842,7 +843,7 @@
static int ftl_open(struct inode *inode, struct file *file)
{
- int minor = MINOR(inode->i_rdev);
+ int minor = minor(inode->i_rdev);
partition_t *partition;
if (minor>>4 >= MAX_MTD_DEVICES)
@@ -878,7 +879,7 @@
static release_t ftl_close(struct inode *inode, struct file *file)
{
- int minor = MINOR(inode->i_rdev);
+ int minor = minor(inode->i_rdev);
partition_t *part = myparts[minor >> 4];
int i;
@@ -1114,7 +1115,7 @@
u_int cmd, u_long arg)
{
struct hd_geometry *geo = (struct hd_geometry *)arg;
- int ret = 0, minor = MINOR(inode->i_rdev);
+ int ret = 0, minor = minor(inode->i_rdev);
partition_t *part= myparts[minor >> 4];
u_long sect;
@@ -1139,7 +1140,7 @@
ret = put_user((u64)ftl_hd[minor].nr_sects << 9, (u64 *)arg);
break;
case BLKRRPART:
- ret = ftl_reread_partitions(minor);
+ ret = ftl_reread_partitions(inode->i_rdev);
break;
case BLKROSET:
case BLKROGET:
@@ -1161,25 +1162,24 @@
static int ftl_reread_partitions(kdev_t dev)
{
- int minor = MINOR(dev);
- partition_t *part = myparts[minor >> 4];
+ partition_t *part = myparts[minor(dev) >> 4];
int res;
- DEBUG(0, "ftl_cs: ftl_reread_partition(%d)\n", minor);
+ DEBUG(0, "ftl_cs: ftl_reread_partition(%d)\n", minor(dev));
if ((atomic_read(&part->open) > 1)) {
return -EBUSY;
}
res = wipe_partitions(dev);
if (res)
- goto leave;
+ return res;
scan_header(part);
- register_disk(&ftl_gendisk, whole >> PART_BITS, MAX_PART,
+ register_disk(&ftl_gendisk, dev, MAX_PART,
&ftl_blk_fops, le32_to_cpu(part->header.FormattedSize)/SECTOR_SIZE);
- return res;
+ return 0;
}
/*======================================================================
@@ -1190,37 +1190,30 @@
static void do_ftl_request(request_arg_t)
{
- int ret, minor;
+ int ret, index;
partition_t *part;
do {
// sti();
INIT_REQUEST;
- minor = MINOR(CURRENT->rq_dev);
+ index = minor(CURRENT->rq_dev);
- part = myparts[minor >> 4];
+ part = myparts[index >> 4];
if (part) {
ret = 0;
- switch (CURRENT->cmd) {
- case READ:
+ if (CURRENT->cmd == READ) {
ret = ftl_read(part, CURRENT->buffer,
- CURRENT->sector+ftl_hd[minor].start_sect,
+ CURRENT->sector+ftl_hd[index].start_sect,
CURRENT->current_nr_sectors);
if (ret) printk("ftl_read returned %d\n", ret);
- break;
-
- case WRITE:
+ }
+ else {
ret = ftl_write(part, CURRENT->buffer,
- CURRENT->sector+ftl_hd[minor].start_sect,
+ CURRENT->sector+ftl_hd[index].start_sect,
CURRENT->current_nr_sectors);
if (ret) printk("ftl_write returned %d\n", ret);
- break;
-
- default:
- panic("ftl_cs: unknown block command!\n");
-
}
} else {
ret = 1;
@@ -1294,7 +1287,7 @@
partition->state = FTL_FORMATTED;
atomic_set(&partition->open, 0);
myparts[device] = partition;
- ftl_reread_partitions(device << 4);
+ ftl_reread_partitions(mk_kdev(FTL_MAJOR, device << 4));
#ifdef PCMCIA_DEBUG
printk(KERN_INFO "ftl_cs: opening %d kb FTL partition\n",
le32_to_cpu(partition->header.FormattedSize) >> 10);
@@ -1355,7 +1348,8 @@
}
blksize_size[FTL_MAJOR] = ftl_blocksizes;
ftl_gendisk.major = FTL_MAJOR;
- blk_init_queue(BLK_DEFAULT_QUEUE(FTL_MAJOR), &do_ftl_request);
+ blk_init_queue(BLK_DEFAULT_QUEUE(FTL_MAJOR), &do_ftl_request,
+ &ftl_queue_lock);
add_gendisk(&ftl_gendisk);
register_mtd_user(&ftl_notifier);
@@ -1369,7 +1363,7 @@
unregister_blkdev(FTL_MAJOR, "ftl");
blk_cleanup_queue(BLK_DEFAULT_QUEUE(FTL_MAJOR));
- bklk_clear(FTL_MAJOR);
+ blk_clear(FTL_MAJOR);
del_gendisk(&ftl_gendisk);
}
--- linux-2.5.2-pre8/drivers/mtd/mtdblock.c Tue Nov 27 09:23:27 2001
+++ linux/drivers/mtd/mtdblock.c Sat Jan 5 02:27:14 2002
@@ -31,6 +31,7 @@
#else
#define QUEUE_PLUGGED (blk_queue_plugged(QUEUE))
#endif
+static spinlock_t mtdblock_queue_lock = SPIN_LOCK_UNLOCKED;
#ifdef CONFIG_DEVFS_FS
#include <linux/devfs_fs_kernel.h>
@@ -283,7 +284,7 @@
if (!inode)
return -EINVAL;
- dev = MINOR(inode->i_rdev);
+ dev = minor(inode->i_rdev);
if (dev >= MAX_MTD_DEVICES)
return -EINVAL;
@@ -373,7 +374,7 @@
invalidate_device(inode->i_rdev, 1);
- dev = MINOR(inode->i_rdev);
+ dev = minor(inode->i_rdev);
mtdblk = mtdblks[dev];
down(&mtdblk->cache_sem);
@@ -412,26 +413,24 @@
struct request *req;
struct mtdblk_dev *mtdblk;
unsigned int res;
+ int err;
for (;;) {
INIT_REQUEST;
req = CURRENT;
- spin_unlock_irq(&QUEUE->queue_lock);
- mtdblk = mtdblks[MINOR(req->rq_dev)];
+ spin_unlock_irq(QUEUE->queue_lock);
+ mtdblk = mtdblks[minor(req->rq_dev)];
res = 0;
- if (MINOR(req->rq_dev) >= MAX_MTD_DEVICES)
+ if (minor(req->rq_dev) >= MAX_MTD_DEVICES)
panic(__FUNCTION__": minor out of bound");
if ((req->sector + req->current_nr_sectors) > (mtdblk->mtd->size >> 9))
goto end_req;
// Handle the request
- switch (req->cmd)
+ if (req->cmd == READ)
{
- int err;
-
- case READ:
down(&mtdblk->cache_sem);
err = do_cached_read (mtdblk, req->sector << 9,
req->current_nr_sectors << 9,
@@ -439,13 +438,10 @@
up(&mtdblk->cache_sem);
if (!err)
res = 1;
- break;
-
- case WRITE:
- // Read only device
- if ( !(mtdblk->mtd->flags & MTD_WRITEABLE) )
- break;
-
+ }
+ else if ( (mtdblk->mtd->flags & MTD_WRITEABLE) ) {
+ // Write request to writable device
+
// Do the write
down(&mtdblk->cache_sem);
err = do_cached_write (mtdblk, req->sector << 9,
@@ -454,11 +450,10 @@
up(&mtdblk->cache_sem);
if (!err)
res = 1;
- break;
}
end_req:
- spin_lock_irq(&QUEUE->queue_lock);
+ spin_lock_irq(QUEUE->queue_lock);
end_request(res);
}
}
@@ -490,16 +485,16 @@
while (!leaving) {
add_wait_queue(&thr_wq, &wait);
set_current_state(TASK_INTERRUPTIBLE);
- spin_lock_irq(&QUEUE->queue_lock);
+ spin_lock_irq(QUEUE->queue_lock);
if (QUEUE_EMPTY || QUEUE_PLUGGED) {
- spin_unlock_irq(&QUEUE->queue_lock);
+ spin_unlock_irq(QUEUE->queue_lock);
schedule();
remove_wait_queue(&thr_wq, &wait);
} else {
remove_wait_queue(&thr_wq, &wait);
set_current_state(TASK_RUNNING);
handle_mtdblock_request();
- spin_unlock_irq(&QUEUE->queue_lock);
+ spin_unlock_irq(QUEUE->queue_lock);
}
}
@@ -525,7 +520,7 @@
{
struct mtdblk_dev *mtdblk;
- mtdblk = mtdblks[MINOR(inode->i_rdev)];
+ mtdblk = mtdblks[minor(inode->i_rdev)];
#ifdef PARANOIA
if (!mtdblk)
@@ -636,7 +631,8 @@
blksize_size[MAJOR_NR] = mtd_blksizes;
blk_size[MAJOR_NR] = mtd_sizes;
- blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request);
+ blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request,
+ &mtdblock_queue_lock);
kernel_thread (mtdblock_thread, NULL, CLONE_FS|CLONE_FILES|CLONE_SIGHAND);
return 0;
}
--- linux-2.5.2-pre8/drivers/mtd/mtdblock_ro.c Thu Oct 25 13:58:35 2001
+++ linux/drivers/mtd/mtdblock_ro.c Sat Jan 5 02:27:14 2002
@@ -31,6 +31,7 @@
#else
#define RQFUNC_ARG request_queue_t *q
#endif
+static spinlock_t mtdblock_queue_lock = SPIN_LOCK_UNLOCKED;
#ifdef MTDBLOCK_DEBUG
static int debug = MTDBLOCK_DEBUG;
@@ -52,7 +53,7 @@
if (inode == 0)
return -EINVAL;
- dev = MINOR(inode->i_rdev);
+ dev = minor(inode->i_rdev);
mtd = get_mtd_device(NULL, dev);
if (!mtd)
@@ -81,7 +82,7 @@
invalidate_device(inode->i_rdev, 1);
- dev = MINOR(inode->i_rdev);
+ dev = minor(inode->i_rdev);
mtd = __get_mtd_device(NULL, dev);
if (!mtd) {
@@ -105,6 +106,7 @@
struct request *current_request;
unsigned int res = 0;
struct mtd_info *mtd;
+ size_t retlen;
while (1)
{
@@ -113,7 +115,7 @@
INIT_REQUEST;
current_request = CURRENT;
- if (MINOR(current_request->rq_dev) >= MAX_MTD_DEVICES)
+ if (minor(current_request->rq_dev) >= MAX_MTD_DEVICES)
{
printk("mtd: Unsupported device!\n");
end_request(0);
@@ -122,9 +124,10 @@
// Grab our MTD structure
- mtd = __get_mtd_device(NULL, MINOR(current_request->rq_dev));
+ mtd = __get_mtd_device(NULL, minor(current_request->rq_dev));
if (!mtd) {
- printk("MTD device %d doesn't appear to exist any more\n", CURRENT_DEV);
+ printk("MTD device %d:%d doesn't appear to exist any more\n",
+ major(CURRENT_DEV), minor(CURRENT_DEV));
end_request(0);
}
@@ -139,7 +142,7 @@
/* Remove the request we are handling from the request list so nobody messes
with it */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)) && LINUX_VERSION_CODE < KERNEL_VERSION(2,5,1)
/* Now drop the lock that the ll_rw_blk functions grabbed for us
and process the request. This is necessary due to the extreme time
we spend processing it. */
@@ -147,32 +150,19 @@
#endif
// Handle the request
- switch (current_request->cmd)
+ if (current_request->cmd == READ)
{
- size_t retlen;
-
- case READ:
if (MTD_READ(mtd,current_request->sector<<9,
current_request->nr_sectors << 9,
&retlen, current_request->buffer) == 0)
res = 1;
else
res = 0;
- break;
-
- case WRITE:
-
- /* printk("mtdblock_request WRITE sector=%d(%d)\n",current_request->sector,
- current_request->nr_sectors);
- */
-
- // Read only device
- if ((mtd->flags & MTD_CAP_RAM) == 0)
- {
+ } else if ((mtd->flags & MTD_CAP_RAM) == 0) {
+ // Write to read only device
res = 0;
- break;
- }
-
+ } else {
+ // Write to writable device
// Do the write
if (MTD_WRITE(mtd,current_request->sector<<9,
current_request->nr_sectors << 9,
@@ -180,16 +170,10 @@
res = 1;
else
res = 0;
- break;
-
- // Shouldn't happen
- default:
- printk("mtd: unknown request\n");
- break;
}
// Grab the lock and re-thread the item onto the linked list
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)) && LINUX_VERSION_CODE < KERNEL_VERSION(2,5,1)
spin_lock_irq(&io_request_lock);
#endif
end_request(res);
@@ -203,7 +187,7 @@
{
struct mtd_info *mtd;
- mtd = __get_mtd_device(NULL, MINOR(inode->i_rdev));
+ mtd = __get_mtd_device(NULL, minor(inode->i_rdev));
if (!mtd) return -EINVAL;
@@ -266,7 +250,8 @@
blksize_size[MAJOR_NR] = NULL;
blk_size[MAJOR_NR] = mtd_sizes;
- blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request);
+ blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request,
+ &mtdblock_queue_lock);
return 0;
}
--- linux-2.5.2-pre8/drivers/mtd/mtdchar.c Thu Oct 4 15:14:59 2001
+++ linux/drivers/mtd/mtdchar.c Sat Jan 5 02:27:14 2002
@@ -60,7 +60,7 @@
static int mtd_open(struct inode *inode, struct file *file)
{
- int minor = MINOR(inode->i_rdev);
+ int minor = minor(inode->i_rdev);
int devnum = minor >> 1;
struct mtd_info *mtd;
--- linux-2.5.2-pre8/drivers/mtd/nftlcore.c Fri Jan 4 19:40:37 2002
+++ linux/drivers/mtd/nftlcore.c Sat Jan 5 02:27:14 2002
@@ -55,6 +55,7 @@
static int nftl_sizes[256];
static int nftl_blocksizes[256];
+static spinlock_t nftl_queue_lock = SPIN_LOCK_UNLOCKED;
/* .. for the Linux partition table handling. */
struct hd_struct part_table[256];
@@ -156,7 +157,7 @@
#if LINUX_VERSION_CODE < 0x20328
resetup_one_dev(&nftl_gendisk, firstfree);
#else
- grok_partitions(MKDEV(MAJOR_NR,firstfree<<NFTL_PARTN_BITS),
+ grok_partitions(mk_kdev(MAJOR_NR,firstfree<<NFTL_PARTN_BITS),
nftl->nr_sects);
#endif
}
@@ -779,7 +780,7 @@
struct NFTLrecord *nftl;
int res;
- nftl = NFTLs[MINOR(inode->i_rdev) >> NFTL_PARTN_BITS];
+ nftl = NFTLs[minor(inode->i_rdev) >> NFTL_PARTN_BITS];
if (!nftl) return -EINVAL;
@@ -845,7 +846,7 @@
/* We can do this because the generic code knows not to
touch the request at the head of the queue */
- spin_unlock_irq(&QUEUE->queue_lock);
+ spin_unlock_irq(QUEUE->queue_lock);
DEBUG(MTD_DEBUG_LEVEL2, "NFTL_request\n");
DEBUG(MTD_DEBUG_LEVEL3,
@@ -853,7 +854,7 @@
(req->cmd == READ) ? "Read " : "Write",
req->sector, req->current_nr_sectors);
- dev = MINOR(req->rq_dev);
+ dev = minor(req->rq_dev);
block = req->sector;
nsect = req->current_nr_sectors;
buffer = req->buffer;
@@ -875,7 +876,7 @@
if (block + nsect > part_table[dev].nr_sects) {
/* access past the end of device */
printk("nftl%c%d: bad access: block = %d, count = %d\n",
- (MINOR(req->rq_dev)>>6)+'a', dev & 0xf, block, nsect);
+ (minor(req->rq_dev)>>6)+'a', dev & 0xf, block, nsect);
up(&nftl->mutex);
res = 0; /* fail */
goto repeat;
@@ -898,7 +899,7 @@
DEBUG(MTD_DEBUG_LEVEL2,"NFTL read request completed OK\n");
up(&nftl->mutex);
goto repeat;
- } else if (req->cmd == WRITE) {
+ } else {
DEBUG(MTD_DEBUG_LEVEL2, "NFTL write request of 0x%x sectors @ %x "
"(req->nr_sectors == %lx)\n", nsect, block,
req->nr_sectors);
@@ -918,22 +919,17 @@
#endif /* CONFIG_NFTL_RW */
up(&nftl->mutex);
goto repeat;
- } else {
- DEBUG(MTD_DEBUG_LEVEL0, "NFTL unknown request\n");
- up(&nftl->mutex);
- res = 0;
- goto repeat;
}
repeat:
DEBUG(MTD_DEBUG_LEVEL3, "end_request(%d)\n", res);
- spin_lock_irq(&QUEUE->queue_lock);
+ spin_lock_irq(QUEUE->queue_lock);
end_request(res);
}
}
static int nftl_open(struct inode *ip, struct file *fp)
{
- int nftlnum = MINOR(ip->i_rdev) >> NFTL_PARTN_BITS;
+ int nftlnum = minor(ip->i_rdev) >> NFTL_PARTN_BITS;
struct NFTLrecord *thisNFTL;
thisNFTL = NFTLs[nftlnum];
@@ -947,7 +943,7 @@
#endif
if (!thisNFTL) {
DEBUG(MTD_DEBUG_LEVEL2,"ENODEV: thisNFTL = %d, minor = %d, ip = %p, fp = %p\n",
- nftlnum, ip->i_rdev, ip, fp);
+ nftlnum, minor(ip->i_rdev), ip, fp);
return -ENODEV;
}
@@ -967,7 +963,7 @@
{
struct NFTLrecord *thisNFTL;
- thisNFTL = NFTLs[MINOR(inode->i_rdev) / 16];
+ thisNFTL = NFTLs[minor(inode->i_rdev) / 16];
DEBUG(MTD_DEBUG_LEVEL2, "NFTL_release\n");
@@ -1027,7 +1023,8 @@
printk("unable to register NFTL block device on major %d\n", MAJOR_NR);
return -EBUSY;
} else {
- blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &nftl_request);
+ blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &nftl_request,
+ &nftl_queue_lock);
/* set block size to 1kB each */
for (i = 0; i < 256; i++) {
--- linux-2.5.2-pre8/drivers/mtd/chips/amd_flash.c Thu Oct 4 15:14:59 2001
+++ linux/drivers/mtd/chips/amd_flash.c Sat Jan 5 02:27:14 2002
@@ -22,6 +22,7 @@
#include <linux/mtd/map.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/flashchip.h>
+#include <linux/interrupt.h>
/* There's no limit. It exists only to avoid realloc. */
#define MAX_AMD_CHIPS 8
--- linux-2.5.2-pre8/drivers/mtd/devices/blkmtd.c Fri Jan 4 19:40:37 2002
+++ linux/drivers/mtd/devices/blkmtd.c Sat Jan 5 02:27:14 2002
@@ -55,7 +55,7 @@
#include <linux/pagemap.h>
#include <linux/iobuf.h>
#include <linux/slab.h>
-#include <linux/pagemap.h>
+#include <linux/blkdev.h>
#include <linux/mtd/compatmac.h>
#include <linux/mtd/mtd.h>
@@ -463,7 +463,7 @@
/* check page alignment of start and length */
DEBUG(2, "blkmtd: erase: dev = `%s' from = %d len = %ld\n",
- bdevname(rawdevice->binding->bd_dev), from, len);
+ bdevname(to_kdev_t(rawdevice->binding->bd_dev)), from, len);
if(from % PAGE_SIZE) {
printk("blkmtd: erase: addr not page aligned (addr = %d)\n", from);
instr->state = MTD_ERASE_FAILED;
@@ -553,7 +553,8 @@
*retlen = 0;
DEBUG(2, "blkmtd: read: dev = `%s' from = %ld len = %d buf = %p\n",
- bdevname(rawdevice->binding->bd_dev), (long int)from, len, buf);
+ bdevname(to_kdev_t(rawdevice->binding->bd_dev)),
+ (long int)from, len, buf);
pagenr = from >> PAGE_SHIFT;
offset = from - (pagenr << PAGE_SHIFT);
@@ -623,7 +624,8 @@
*retlen = 0;
DEBUG(2, "blkmtd: write: dev = `%s' to = %ld len = %d buf = %p\n",
- bdevname(rawdevice->binding->bd_dev), (long int)to, len, buf);
+ bdevname(to_kdev_t(rawdevice->binding->bd_dev)),
+ (long int)to, len, buf);
/* handle readonly and out of range numbers */
@@ -891,10 +893,10 @@
}
rdev = inode->i_rdev;
//filp_close(file, NULL);
+ maj = major(rdev);
+ min = minor(rdev);
DEBUG(1, "blkmtd: found a block device major = %d, minor = %d\n",
- MAJOR(rdev), MINOR(rdev));
- maj = MAJOR(rdev);
- min = MINOR(rdev);
+ maj, min);
if(maj == MTD_BLOCK_MAJOR) {
printk("blkmtd: attempting to use an MTD device as a block device\n");
@@ -935,7 +937,7 @@
}
memset(rawdevice, 0, sizeof(mtd_raw_dev_data_t));
// get the block device
- rawdevice->binding = bdget(kdev_t_to_nr(MKDEV(maj, min)));
+ rawdevice->binding = bdget(MKDEV(maj, min));
err = blkdev_get(rawdevice->binding, mode, 0, BDEV_RAW);
if (err) {
goto init_err;
More information about the linux-mtd
mailing list