mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 22:52:35 +02:00
support 4GB disk.
This commit is contained in:
parent
17c6f64a46
commit
1cb77a4a76
28
drivers/mtd/mtd_blkdevs.c
Normal file → Executable file
28
drivers/mtd/mtd_blkdevs.c
Normal file → Executable file
|
|
@ -38,9 +38,24 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
|
|||
{
|
||||
unsigned long block, nsect;
|
||||
char *buf;
|
||||
|
||||
#if 0
|
||||
block = blk_rq_pos(req) << 9 >> tr->blkshift;
|
||||
nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
|
||||
#else //modify by zyf for cap>=4GB 20110120
|
||||
block = blk_rq_pos(req);
|
||||
nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
|
||||
if(tr->blkshift != 9)
|
||||
{
|
||||
if(tr->blkshift > 9)
|
||||
{
|
||||
block = blk_rq_pos(req) >> (tr->blkshift - 9);
|
||||
}
|
||||
else
|
||||
{
|
||||
block = blk_rq_pos(req) << (9 - tr->blkshift);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
buf = req->buffer;
|
||||
|
||||
|
|
@ -56,8 +71,8 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
|
|||
|
||||
switch(rq_data_dir(req)) {
|
||||
case READ:
|
||||
for (; nsect > 0; nsect--, block++, buf += tr->blksize)
|
||||
if (tr->readsect(dev, block, buf))
|
||||
//for (; nsect > 0; nsect--, block++, buf += tr->blksize)
|
||||
if (tr->readsect(dev, block,nsect, buf))
|
||||
return -EIO;
|
||||
return 0;
|
||||
|
||||
|
|
@ -65,8 +80,8 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
|
|||
if (!tr->writesect)
|
||||
return -EIO;
|
||||
|
||||
for (; nsect > 0; nsect--, block++, buf += tr->blksize)
|
||||
if (tr->writesect(dev, block, buf))
|
||||
//for (; nsect > 0; nsect--, block++, buf += tr->blksize)
|
||||
if (tr->writesect(dev, block,nsect, buf))
|
||||
return -EIO;
|
||||
return 0;
|
||||
|
||||
|
|
@ -277,7 +292,8 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
|
|||
|
||||
/* 2.5 has capacity in units of 512 bytes while still
|
||||
having BLOCK_SIZE_BITS set to 10. Just to keep us amused. */
|
||||
set_capacity(gd, (new->size * tr->blksize) >> 9);
|
||||
//set_capacity(gd, (new->size * tr->blksize) >> 9);
|
||||
set_capacity(gd, (new->size >> 9) * tr->blksize); //modify by zyf for cap>=4GB 20110120
|
||||
|
||||
gd->private_data = new;
|
||||
new->blkcore_priv = gd;
|
||||
|
|
|
|||
8
drivers/mtd/mtdblock.c
Normal file → Executable file
8
drivers/mtd/mtdblock.c
Normal file → Executable file
|
|
@ -242,14 +242,14 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
|
|||
}
|
||||
|
||||
static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, char *buf)
|
||||
unsigned long block,unsigned long nsect, char *buf)
|
||||
{
|
||||
struct mtdblk_dev *mtdblk = mtdblks[dev->devnum];
|
||||
return do_cached_read(mtdblk, block<<9, 512, buf);
|
||||
return do_cached_read(mtdblk, block<<9, 512*nsect, buf);
|
||||
}
|
||||
|
||||
static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, char *buf)
|
||||
unsigned long block,unsigned long nsect, char *buf)
|
||||
{
|
||||
struct mtdblk_dev *mtdblk = mtdblks[dev->devnum];
|
||||
if (unlikely(!mtdblk->cache_data && mtdblk->cache_size)) {
|
||||
|
|
@ -261,7 +261,7 @@ static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
|
|||
* return -EAGAIN sometimes, but why bother?
|
||||
*/
|
||||
}
|
||||
return do_cached_write(mtdblk, block<<9, 512, buf);
|
||||
return do_cached_write(mtdblk, block<<9, 512*nsect, buf);
|
||||
}
|
||||
|
||||
static int mtdblock_open(struct mtd_blktrans_dev *mbd)
|
||||
|
|
|
|||
|
|
@ -10,21 +10,21 @@
|
|||
#include <linux/mtd/blktrans.h>
|
||||
|
||||
static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, char *buf)
|
||||
unsigned long block, unsigned long nsect, char *buf)
|
||||
{
|
||||
size_t retlen;
|
||||
|
||||
if (dev->mtd->read(dev->mtd, (block * 512), 512, &retlen, buf))
|
||||
if (dev->mtd->read(dev->mtd, (block * 512), 512*nsect, &retlen, buf))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, char *buf)
|
||||
unsigned long block, unsigned long nsect, char *buf)
|
||||
{
|
||||
size_t retlen;
|
||||
|
||||
if (dev->mtd->write(dev->mtd, (block * 512), 512, &retlen, buf))
|
||||
if (dev->mtd->write(dev->mtd, (block * 512), 512*nsect, &retlen, buf))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
4
include/linux/mtd/blktrans.h
Normal file → Executable file
4
include/linux/mtd/blktrans.h
Normal file → Executable file
|
|
@ -38,9 +38,9 @@ struct mtd_blktrans_ops {
|
|||
|
||||
/* Access functions */
|
||||
int (*readsect)(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, char *buffer);
|
||||
unsigned long block,unsigned long nsect, char *buffer);
|
||||
int (*writesect)(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, char *buffer);
|
||||
unsigned long block,unsigned long nsect, char *buffer);
|
||||
int (*discard)(struct mtd_blktrans_dev *dev,
|
||||
unsigned long block, unsigned nr_blocks);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user