* [PATCH] 64bit file support @ 2012-06-26 19:54 Sascha Hauer 2012-06-26 19:54 ` [PATCH 01/10] mtd: fix arguments to bad block ioctls Sascha Hauer ` (9 more replies) 0 siblings, 10 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox Hi All, The following adds 64bit file support for barebox. It has been runtime tested on a babbage board with a 8G SD card and on a pcm038 board with a 8G USB stick. Compile tested with all defconfigs. Sascha ---------------------------------------------------------------- Sascha Hauer (10): mtd: fix arguments to bad block ioctls nand-bb: bb->offset may become a 64bit type use loff_t for file offsets introduce strtoull_suffix function make parse_area_spec arguments loff_t make memory display 64bit capable make st_size in struct stat 64 bit make cdev 64bit capable memory commands: Make 64bit capable partitions: Make 64bit capable arch/arm/mach-imx/iim.c | 8 +++---- arch/arm/mach-mxs/ocotp.c | 4 ++-- arch/sandbox/board/hostfile.c | 4 ++-- commands/crc.c | 4 ++-- commands/digest.c | 4 ++-- commands/flash.c | 4 ++-- commands/ls.c | 2 +- commands/mem.c | 49 ++++++++++++++++++++--------------------- common/block.c | 6 ++--- common/partitions.c | 29 ------------------------ drivers/base/driver.c | 2 +- drivers/eeprom/at25.c | 8 +++---- drivers/mfd/lp3972.c | 2 +- drivers/mfd/mc13xxx.c | 4 ++-- drivers/mfd/mc34704.c | 4 ++-- drivers/mfd/mc34708.c | 6 +++-- drivers/mfd/mc9sdz60.c | 4 ++-- drivers/mfd/twl-core.c | 4 ++-- drivers/mtd/core.c | 20 ++++++++++------- drivers/mtd/mtdoob.c | 3 ++- drivers/mtd/mtdraw.c | 9 +++++--- drivers/mtd/nand/nand-bb.c | 30 ++++++++++++------------- drivers/mtd/ubi/cdev.c | 8 +++---- drivers/net/miidev.c | 4 ++-- drivers/nor/cfi_flash.c | 8 +++---- drivers/nor/m25p80.c | 16 +++++++++----- fs/cramfs/cramfs.c | 2 +- fs/devfs-core.c | 17 +++++++------- fs/devfs.c | 10 ++++----- fs/fat/fat.c | 6 ++--- fs/fs.c | 12 +++++----- fs/nfs.c | 2 +- fs/ramfs.c | 2 +- fs/tftp.c | 2 +- include/common.h | 5 +++-- include/driver.h | 28 +++++++++++------------ include/fs.h | 12 +++++----- include/linux/stat.h | 2 +- include/partition.h | 2 +- lib/misc.c | 24 ++++++++++++-------- lib/vsprintf.c | 1 + 41 files changed, 183 insertions(+), 190 deletions(-) _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 01/10] mtd: fix arguments to bad block ioctls 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer @ 2012-06-26 19:54 ` Sascha Hauer 2012-06-26 19:54 ` [PATCH 02/10] nand-bb: bb->offset may become a 64bit type Sascha Hauer ` (8 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox In the Kernel the mtd ioctls expect a pointer to the offset, whereas barebox interprets the pointer itself as an offset. Since we want to add 64bit support for file sizes a pointer may not be sufficient, so align with the kernel and convert it to a pointer to the offset. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- drivers/mtd/core.c | 5 +++-- drivers/mtd/nand/nand-bb.c | 18 +++++++++--------- fs/devfs-core.c | 6 +++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 87dcba6..2ce08a6 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -123,16 +123,17 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) struct mtd_ecc_stats *ecc = buf; #endif struct region_info_user *reg = buf; + off_t *offset = buf; switch (request) { case MEMGETBADBLOCK: dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf); - ret = mtd->block_isbad(mtd, (off_t)buf); + ret = mtd->block_isbad(mtd, *offset); break; #ifdef CONFIG_MTD_WRITE case MEMSETBADBLOCK: dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf); - ret = mtd->block_markbad(mtd, (off_t)buf); + ret = mtd->block_markbad(mtd, *offset); break; #endif case MEMGETINFO: diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c index bd30438..fcc4821 100644 --- a/drivers/mtd/nand/nand-bb.c +++ b/drivers/mtd/nand/nand-bb.c @@ -42,9 +42,9 @@ struct nand_bb { struct mtd_info_user info; - size_t raw_size; - size_t size; - off_t offset; + loff_t raw_size; + loff_t size; + loff_t offset; unsigned long flags; void *writebuf; @@ -63,12 +63,12 @@ static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count, debug("%s %d %d\n", __func__, offset, count); while(count) { - ret = cdev_ioctl(parent, MEMGETBADBLOCK, (void *)bb->offset); + ret = cdev_ioctl(parent, MEMGETBADBLOCK, &bb->offset); if (ret < 0) return ret; if (ret) { - printf("skipping bad block at 0x%08lx\n", bb->offset); + printf("skipping bad block at 0x%08llx\n", bb->offset); bb->offset += bb->info.erasesize; continue; } @@ -96,10 +96,10 @@ static int nand_bb_write_buf(struct nand_bb *bb, size_t count) int ret, now; struct cdev *parent = bb->cdev_parent; void *buf = bb->writebuf; - int cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1); + off_t cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1); while (count) { - ret = cdev_ioctl(parent, MEMGETBADBLOCK, (void *)cur_ofs); + ret = cdev_ioctl(parent, MEMGETBADBLOCK, &cur_ofs); if (ret < 0) return ret; @@ -197,11 +197,11 @@ static int nand_bb_close(struct cdev *cdev) static int nand_bb_calc_size(struct nand_bb *bb) { - ulong pos = 0; + loff_t pos = 0; int ret; while (pos < bb->raw_size) { - ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, (void *)pos); + ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, &pos); if (ret < 0) return ret; if (!ret) diff --git a/fs/devfs-core.c b/fs/devfs-core.c index ff6a976..6a56d34 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -123,15 +123,15 @@ int cdev_flush(struct cdev *cdev) static int partition_ioctl(struct cdev *cdev, int request, void *buf) { int ret = 0; - size_t offset; + loff_t offset, *_buf = buf; struct mtd_info_user *user = buf; switch (request) { case MEMSETBADBLOCK: case MEMGETBADBLOCK: - offset = (off_t)buf; + offset = *_buf; offset += cdev->offset; - ret = cdev->ops->ioctl(cdev, request, (void *)offset); + ret = cdev->ops->ioctl(cdev, request, &offset); break; case MEMGETINFO: if (cdev->mtd) { -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 02/10] nand-bb: bb->offset may become a 64bit type 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer 2012-06-26 19:54 ` [PATCH 01/10] mtd: fix arguments to bad block ioctls Sascha Hauer @ 2012-06-26 19:54 ` Sascha Hauer 2012-06-26 19:54 ` [PATCH 03/10] use loff_t for file offsets Sascha Hauer ` (7 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- drivers/mtd/nand/nand-bb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c index fcc4821..0377f1e 100644 --- a/drivers/mtd/nand/nand-bb.c +++ b/drivers/mtd/nand/nand-bb.c @@ -74,7 +74,7 @@ static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count, } now = min(count, (size_t)(bb->info.erasesize - - (bb->offset % bb->info.erasesize))); + ((size_t)bb->offset % bb->info.erasesize))); ret = cdev_read(parent, buf, now, bb->offset, 0); if (ret < 0) return ret; -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 03/10] use loff_t for file offsets 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer 2012-06-26 19:54 ` [PATCH 01/10] mtd: fix arguments to bad block ioctls Sascha Hauer 2012-06-26 19:54 ` [PATCH 02/10] nand-bb: bb->offset may become a 64bit type Sascha Hauer @ 2012-06-26 19:54 ` Sascha Hauer 2012-06-26 19:54 ` [PATCH 04/10] introduce strtoull_suffix function Sascha Hauer ` (6 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox This is a first step for 64bit file support: Make the file sizes/offsets 64bit. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- arch/arm/mach-imx/iim.c | 8 ++++---- arch/arm/mach-mxs/ocotp.c | 4 ++-- arch/sandbox/board/hostfile.c | 4 ++-- commands/mem.c | 2 +- common/block.c | 4 ++-- drivers/eeprom/at25.c | 8 ++++---- drivers/mfd/lp3972.c | 2 +- drivers/mfd/mc13xxx.c | 4 ++-- drivers/mfd/mc34704.c | 4 ++-- drivers/mfd/mc34708.c | 6 ++++-- drivers/mfd/mc9sdz60.c | 4 ++-- drivers/mfd/twl-core.c | 4 ++-- drivers/mtd/core.c | 17 ++++++++++------- drivers/mtd/mtdoob.c | 3 ++- drivers/mtd/mtdraw.c | 9 ++++++--- drivers/mtd/nand/nand-bb.c | 10 +++++----- drivers/mtd/ubi/cdev.c | 8 ++++---- drivers/net/miidev.c | 4 ++-- drivers/nor/cfi_flash.c | 8 ++++---- drivers/nor/m25p80.c | 16 ++++++++++------ fs/cramfs/cramfs.c | 2 +- fs/devfs.c | 6 +++--- fs/fat/fat.c | 6 +++--- fs/fs.c | 10 +++++----- fs/nfs.c | 2 +- fs/ramfs.c | 2 +- fs/tftp.c | 2 +- include/driver.h | 16 ++++++++-------- include/fs.h | 12 ++++++------ 29 files changed, 100 insertions(+), 87 deletions(-) diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c index f2ace8a..0da8ea0 100644 --- a/arch/arm/mach-imx/iim.c +++ b/arch/arm/mach-imx/iim.c @@ -84,7 +84,7 @@ static int do_fuse_sense(void __iomem *reg_base, unsigned int bank, } static ssize_t imx_iim_cdev_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { ulong size, i; struct iim_priv *priv = cdev->priv; @@ -94,7 +94,7 @@ static ssize_t imx_iim_cdev_read(struct cdev *cdev, void *buf, size_t count, if ((sense_param = dev_get_param(cdev->dev, "explicit_sense_enable"))) explicit_sense = simple_strtoul(sense_param, NULL, 0); - size = min((ulong)count, priv->banksize - offset); + size = min((loff_t)count, priv->banksize - offset); if (explicit_sense) { for (i = 0; i < size; i++) { int row_val; @@ -176,7 +176,7 @@ out: #endif /* CONFIG_IMX_IIM_FUSE_BLOW */ static ssize_t imx_iim_cdev_write(struct cdev *cdev, const void *buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { ulong size, i; struct iim_priv *priv = cdev->priv; @@ -186,7 +186,7 @@ static ssize_t imx_iim_cdev_write(struct cdev *cdev, const void *buf, size_t cou if ((write_param = dev_get_param(cdev->dev, "permanent_write_enable"))) blow_enable = simple_strtoul(write_param, NULL, 0); - size = min((ulong)count, priv->banksize - offset); + size = min((loff_t)count, priv->banksize - offset); #ifdef CONFIG_IMX_IIM_FUSE_BLOW if (blow_enable) { for (i = 0; i < size; i++) { diff --git a/arch/arm/mach-mxs/ocotp.c b/arch/arm/mach-mxs/ocotp.c index 38f9ffd..86e63dc 100644 --- a/arch/arm/mach-mxs/ocotp.c +++ b/arch/arm/mach-mxs/ocotp.c @@ -40,11 +40,11 @@ struct ocotp_priv { }; static ssize_t mxs_ocotp_cdev_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct ocotp_priv *priv = cdev->priv; void __iomem *base = priv->base; - size_t size = min((ulong)count, cdev->size - offset); + size_t size = min((loff_t)count, cdev->size - offset); uint64_t start; int i; diff --git a/arch/sandbox/board/hostfile.c b/arch/sandbox/board/hostfile.c index 90a9741..96fa100 100644 --- a/arch/sandbox/board/hostfile.c +++ b/arch/sandbox/board/hostfile.c @@ -34,7 +34,7 @@ struct hf_priv { struct hf_platform_data *pdata; }; -static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { struct hf_platform_data *hf = cdev->priv; int fd = hf->fd; @@ -45,7 +45,7 @@ static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset, return linux_read(fd, buf, count); } -static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { struct hf_platform_data *hf = cdev->priv; int fd = hf->fd; diff --git a/commands/mem.c b/commands/mem.c index 080bfde..649d5bf 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -624,7 +624,7 @@ static int mem_init(void) device_initcall(mem_init); -static ssize_t zero_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +static ssize_t zero_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { memset(buf, 0, count); return count; diff --git a/common/block.c b/common/block.c index 71ecfd5..1db06cc 100644 --- a/common/block.c +++ b/common/block.c @@ -179,7 +179,7 @@ static void *block_get(struct block_device *blk, int block) } static ssize_t block_read(struct cdev *cdev, void *buf, size_t count, - unsigned long offset, unsigned long flags) + loff_t offset, unsigned long flags) { struct block_device *blk = cdev->priv; unsigned long mask = BLOCKSIZE(blk) - 1; @@ -256,7 +256,7 @@ static int block_put(struct block_device *blk, const void *buf, int block) } static ssize_t block_write(struct cdev *cdev, const void *buf, size_t count, - unsigned long offset, ulong flags) + loff_t offset, ulong flags) { struct block_device *blk = cdev->priv; unsigned long mask = BLOCKSIZE(blk) - 1; diff --git a/drivers/eeprom/at25.c b/drivers/eeprom/at25.c index 8a979d5..03d191e 100644 --- a/drivers/eeprom/at25.c +++ b/drivers/eeprom/at25.c @@ -67,7 +67,7 @@ struct at25_data { static ssize_t at25_ee_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, + loff_t offset, ulong flags) { u8 command[EE_MAXADDRLEN + 1]; @@ -117,7 +117,7 @@ static ssize_t at25_ee_read(struct cdev *cdev, */ status = spi_sync(at25->spi, &m); dev_dbg(at25->cdev.dev, - "read %d bytes at %lu --> %d\n", + "read %d bytes at %llu --> %d\n", count, offset, (int) status); return status ? status : count; @@ -126,7 +126,7 @@ static ssize_t at25_ee_read(struct cdev *cdev, static ssize_t at25_ee_write(struct cdev *cdev, const void *buf, size_t count, - ulong off, + loff_t off, ulong flags) { ssize_t status = 0; @@ -232,7 +232,7 @@ static ssize_t at25_ee_write(struct cdev *cdev, return written ? written : status; } -static off_t at25_ee_lseek(struct cdev *cdev, off_t off) +static loff_t at25_ee_lseek(struct cdev *cdev, loff_t off) { return off; } diff --git a/drivers/mfd/lp3972.c b/drivers/mfd/lp3972.c index 9826699..0f3093b 100644 --- a/drivers/mfd/lp3972.c +++ b/drivers/mfd/lp3972.c @@ -58,7 +58,7 @@ static u32 lp_read_reg(struct lp_priv *lp, int reg) return buf; } -static ssize_t lp_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t lp_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { struct lp_priv *priv = to_lp_priv(cdev); int i = count; diff --git a/drivers/mfd/mc13xxx.c b/drivers/mfd/mc13xxx.c index f9477a3..2934e9d 100644 --- a/drivers/mfd/mc13xxx.c +++ b/drivers/mfd/mc13xxx.c @@ -160,7 +160,7 @@ int mc13xxx_set_bits(struct mc13xxx *mc13xxx, u8 reg, u32 mask, u32 val) } EXPORT_SYMBOL(mc13xxx_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { struct mc13xxx *priv = to_mc13xxx(cdev); u32 *buf = _buf; @@ -181,7 +181,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset return count; } -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) { struct mc13xxx *mc13xxx = to_mc13xxx(cdev); const u32 *buf = _buf; diff --git a/drivers/mfd/mc34704.c b/drivers/mfd/mc34704.c index a2171b3..20c01e2 100644 --- a/drivers/mfd/mc34704.c +++ b/drivers/mfd/mc34704.c @@ -65,7 +65,7 @@ int mc34704_reg_write(struct mc34704 *mc34704, u8 reg, u8 val) EXPORT_SYMBOL(mc34704_reg_write) static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct mc34704 *priv = to_mc34704(cdev); u8 *buf = _buf; @@ -85,7 +85,7 @@ static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count, } static ssize_t mc34704_write(struct cdev *cdev, const void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct mc34704 *mc34704 = to_mc34704(cdev); const u8 *buf = _buf; diff --git a/drivers/mfd/mc34708.c b/drivers/mfd/mc34708.c index e7f40c0..02c58a9 100644 --- a/drivers/mfd/mc34708.c +++ b/drivers/mfd/mc34708.c @@ -163,7 +163,8 @@ int mc34708_set_bits(struct mc34708 *mc34708, enum mc34708_reg reg, u32 mask, u3 } EXPORT_SYMBOL(mc34708_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, + loff_t offset, ulong flags) { struct mc34708 *priv = to_mc34708(cdev); u32 *buf = _buf; @@ -184,7 +185,8 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset return count; } -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, + loff_t offset, ulong flags) { struct mc34708 *mc34708 = to_mc34708(cdev); const u32 *buf = _buf; diff --git a/drivers/mfd/mc9sdz60.c b/drivers/mfd/mc9sdz60.c index db208ec..0cd5007 100644 --- a/drivers/mfd/mc9sdz60.c +++ b/drivers/mfd/mc9sdz60.c @@ -78,7 +78,7 @@ int mc9sdz60_set_bits(struct mc9sdz60 *mc9sdz60, enum mc9sdz60_reg reg, u8 mask, } EXPORT_SYMBOL(mc9sdz60_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { struct mc9sdz60 *mc9sdz60 = to_mc9sdz60(cdev); u8 *buf = _buf; @@ -97,7 +97,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset return count; } -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) { struct mc9sdz60 *mc9sdz60 = to_mc9sdz60(cdev); const u8 *buf = _buf; diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index cb2c03d..20bde2c 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -112,7 +112,7 @@ int twlcore_set_bits(struct twlcore *twlcore, u16 reg, u8 mask, u8 val) EXPORT_SYMBOL(twlcore_set_bits); static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct twlcore *priv = to_twlcore(cdev); u8 *buf = _buf; @@ -131,7 +131,7 @@ static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count, } static ssize_t twl_write(struct cdev *cdev, const void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct twlcore *twlcore = to_twlcore(cdev); const u8 *buf = _buf; diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 2ce08a6..5510439 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -31,11 +31,12 @@ static LIST_HEAD(mtd_register_hooks); static ssize_t mtd_read(struct cdev *cdev, void* buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = cdev->priv; size_t retlen; int ret; + unsigned long offset = _offset; debug("mtd_read: 0x%08lx 0x%08x\n", offset, count); @@ -64,13 +65,14 @@ static int all_ff(const void *buf, int len) } static ssize_t mtd_write(struct cdev* cdev, const void *buf, size_t _count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = cdev->priv; size_t retlen, now; int ret = 0; void *wrbuf = NULL; size_t count = _count; + unsigned long offset = _offset; if (NOTALIGNED(offset)) { printf("offset 0x%0lx not page aligned\n", offset); @@ -123,16 +125,16 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) struct mtd_ecc_stats *ecc = buf; #endif struct region_info_user *reg = buf; - off_t *offset = buf; + loff_t *offset = buf; switch (request) { case MEMGETBADBLOCK: - dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf); + dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08llx\n", *offset); ret = mtd->block_isbad(mtd, *offset); break; #ifdef CONFIG_MTD_WRITE case MEMSETBADBLOCK: - dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf); + dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08llx\n", *offset); ret = mtd->block_markbad(mtd, *offset); break; #endif @@ -157,9 +159,10 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) #endif case MEMGETREGIONINFO: if (cdev->mtd) { + unsigned long size = cdev->size; reg->offset = cdev->offset; reg->erasesize = cdev->mtd->erasesize; - reg->numblocks = cdev->size/reg->erasesize; + reg->numblocks = size / reg->erasesize; reg->regionindex = cdev->mtd->index; } break; @@ -171,7 +174,7 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) } #ifdef CONFIG_MTD_WRITE -static ssize_t mtd_erase(struct cdev *cdev, size_t count, unsigned long offset) +static ssize_t mtd_erase(struct cdev *cdev, size_t count, loff_t offset) { struct mtd_info *mtd = cdev->priv; struct erase_info erase; diff --git a/drivers/mtd/mtdoob.c b/drivers/mtd/mtdoob.c index be656a4..e4dd1a0 100644 --- a/drivers/mtd/mtdoob.c +++ b/drivers/mtd/mtdoob.c @@ -38,11 +38,12 @@ static struct mtd_info *to_mtd(struct cdev *cdev) } static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = to_mtd(cdev); struct mtd_oob_ops ops; int ret; + unsigned long offset = _offset; if (count < mtd->oobsize) return -EINVAL; diff --git a/drivers/mtd/mtdraw.c b/drivers/mtd/mtdraw.c index 7abe235..24f7358 100644 --- a/drivers/mtd/mtdraw.c +++ b/drivers/mtd/mtdraw.c @@ -116,12 +116,13 @@ err: } static ssize_t mtdraw_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = to_mtd(cdev); ssize_t retlen = 0, ret = 1, toread; ulong numpage; int skip; + unsigned long offset = _offset; numpage = offset / (mtd->writesize + mtd->oobsize); skip = offset % (mtd->writesize + mtd->oobsize); @@ -167,13 +168,14 @@ static void mtdraw_fillbuf(struct mtdraw *mtdraw, const void *src, int nbbytes) } static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtdraw *mtdraw = to_mtdraw(cdev); struct mtd_info *mtd = to_mtd(cdev); int bsz = mtd->writesize + mtd->oobsize; ulong numpage; size_t retlen = 0, tofill; + unsigned long offset = _offset; int ret = 0; if (mtdraw->write_fill && @@ -220,10 +222,11 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count, } } -static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, ulong offset) +static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, loff_t _offset) { struct mtd_info *mtd = to_mtd(cdev); struct erase_info erase; + unsigned long offset = _offset; int ret; offset = offset / (mtd->writesize + mtd->oobsize) * mtd->writesize; diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c index 0377f1e..d272749 100644 --- a/drivers/mtd/nand/nand-bb.c +++ b/drivers/mtd/nand/nand-bb.c @@ -54,7 +54,7 @@ struct nand_bb { }; static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count, - unsigned long offset, ulong flags) + loff_t offset, ulong flags) { struct nand_bb *bb = cdev->priv; struct cdev *parent = bb->cdev_parent; @@ -123,12 +123,12 @@ static int nand_bb_write_buf(struct nand_bb *bb, size_t count) } static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count, - unsigned long offset, ulong flags) + loff_t offset, ulong flags) { struct nand_bb *bb = cdev->priv; int bytes = count, now, wroffs, ret; - debug("%s offset: 0x%08x count: 0x%08x\n", __func__, offset, count); + debug("%s offset: 0x%08llx count: 0x%08x\n", __func__, offset, count); while (count) { wroffs = bb->offset % BB_WRITEBUF_SIZE; @@ -152,7 +152,7 @@ static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count, return bytes; } -static int nand_bb_erase(struct cdev *cdev, size_t count, unsigned long offset) +static int nand_bb_erase(struct cdev *cdev, size_t count, loff_t offset) { struct nand_bb *bb = cdev->priv; @@ -213,7 +213,7 @@ static int nand_bb_calc_size(struct nand_bb *bb) return 0; } -static off_t nand_bb_lseek(struct cdev *cdev, off_t __offset) +static loff_t nand_bb_lseek(struct cdev *cdev, loff_t __offset) { struct nand_bb *bb = cdev->priv; unsigned long raw_pos = 0; diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index 95bef1f..c99b64d 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c @@ -12,7 +12,7 @@ struct ubi_volume_cdev_priv { }; static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size, - unsigned long offset, unsigned long flags) + loff_t offset, unsigned long flags) { struct ubi_volume_cdev_priv *priv = cdev->priv; struct ubi_volume *vol = priv->vol; @@ -23,7 +23,7 @@ static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size, loff_t offp = offset; int usable_leb_size = vol->usable_leb_size; - printf("%s: %d @ 0x%08lx\n", __func__, size, offset); + printf("%s: %d @ 0x%08llx\n", __func__, size, offset); len = size > usable_leb_size ? usable_leb_size : size; @@ -56,7 +56,7 @@ static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size, } static ssize_t ubi_volume_cdev_write(struct cdev* cdev, const void *buf, - size_t size, unsigned long offset, unsigned long flags) + size_t size, loff_t offset, unsigned long flags) { struct ubi_volume_cdev_priv *priv = cdev->priv; struct ubi_volume *vol = priv->vol; @@ -121,7 +121,7 @@ static int ubi_volume_cdev_close(struct cdev *cdev) return 0; } -static off_t ubi_volume_cdev_lseek(struct cdev *cdev, off_t ofs) +static loff_t ubi_volume_cdev_lseek(struct cdev *cdev, loff_t ofs) { struct ubi_volume_cdev_priv *priv = cdev->priv; diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c index f47fc9e..d23775b 100644 --- a/drivers/net/miidev.c +++ b/drivers/net/miidev.c @@ -180,7 +180,7 @@ int miidev_print_status(struct mii_device *mdev) return 0; } -static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { int i = count; uint16_t *buf = _buf; @@ -196,7 +196,7 @@ static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong of return count; } -static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) { int i = count; const uint16_t *buf = _buf; diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c index 654e647..227ea7b 100644 --- a/drivers/nor/cfi_flash.c +++ b/drivers/nor/cfi_flash.c @@ -456,7 +456,7 @@ flash_sect_t find_sector (struct flash_info *info, ulong addr) return sector; } -static int __cfi_erase(struct cdev *cdev, size_t count, unsigned long offset, +static int __cfi_erase(struct cdev *cdev, size_t count, loff_t offset, int verbose) { struct flash_info *finfo = (struct flash_info *)cdev->priv; @@ -491,7 +491,7 @@ out: return ret; } -static int cfi_erase(struct cdev *cdev, size_t count, unsigned long offset) +static int cfi_erase(struct cdev *cdev, size_t count, loff_t offset) { return __cfi_erase(cdev, count, offset, 1); } @@ -628,7 +628,7 @@ static int flash_real_protect (struct flash_info *info, long sector, int prot) return retcode; } -static int cfi_protect(struct cdev *cdev, size_t count, unsigned long offset, int prot) +static int cfi_protect(struct cdev *cdev, size_t count, loff_t offset, int prot) { struct flash_info *finfo = (struct flash_info *)cdev->priv; unsigned long start, end; @@ -651,7 +651,7 @@ out: return ret; } -static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, unsigned long offset, ulong flags) +static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { struct flash_info *finfo = (struct flash_info *)cdev->priv; int ret; diff --git a/drivers/nor/m25p80.c b/drivers/nor/m25p80.c index 77669c2..1440227 100644 --- a/drivers/nor/m25p80.c +++ b/drivers/nor/m25p80.c @@ -194,13 +194,14 @@ static int erase_sector(struct m25p *flash, u32 offset) * Erase an address range on the flash chip. The address range may extend * one or more erase sectors. Return an error is there is a problem erasing. */ -static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offset) +static ssize_t m25p80_erase(struct cdev *cdev, size_t count, loff_t offset) { struct m25p *flash = cdev->priv; u32 addr, len; u32 start_sector; u32 end_sector; u32 progress = 0; + int eraseshift = ffs(flash->erasesize) - 1; dev_dbg(&flash->spi->dev, "%s %s 0x%llx, len %lld\n", __func__, "at", (long long)offset, (long long)count); @@ -212,8 +213,8 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offse addr = offset; len = count; - start_sector = offset / flash->erasesize; - end_sector = (offset + count - 1) / flash->erasesize; + start_sector = offset >> eraseshift; + end_sector = (offset + count - 1) >> eraseshift; init_progression_bar(end_sector - start_sector + 1); /* whole-chip erase? */ @@ -250,7 +251,8 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offse return 0; } -ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, + ulong flags) { struct m25p *flash = cdev->priv; struct spi_transfer t[2]; @@ -302,7 +304,8 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ul return retlen; } -ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, + loff_t offset, ulong flags) { struct m25p *flash = cdev->priv; struct spi_transfer t[2]; @@ -381,7 +384,8 @@ ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, ulong off return retlen; } #ifdef CONFIG_MTD_SST25L -ssize_t sst_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t sst_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, + ulong flags) { struct m25p *flash = cdev->priv; struct spi_transfer t[2]; diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c index c7c798b..99f6d49 100644 --- a/fs/cramfs/cramfs.c +++ b/fs/cramfs/cramfs.c @@ -358,7 +358,7 @@ static int cramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size) return outsize; } -static off_t cramfs_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t cramfs_lseek(struct device_d *dev, FILE *f, loff_t pos) { f->pos = pos; return f->pos; diff --git a/fs/devfs.c b/fs/devfs.c index ae48451..863f4ec 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -52,7 +52,7 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s return cdev_write(cdev, buf, size, f->pos, f->flags); } -static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) +static loff_t devfs_lseek(struct device_d *_dev, FILE *f, loff_t pos) { struct cdev *cdev = f->inode; off_t ret = -1; @@ -66,7 +66,7 @@ static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) return ret - cdev->offset; } -static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset) +static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, loff_t offset) { struct cdev *cdev = f->inode; @@ -79,7 +79,7 @@ static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned lo return cdev->ops->erase(cdev, count, offset + cdev->offset); } -static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot) +static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, loff_t offset, int prot) { struct cdev *cdev = f->inode; diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 21464bd..5e6c81c 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -49,7 +49,7 @@ DRESULT disk_read(FATFS *fat, BYTE *buf, DWORD sector, BYTE count) debug("%s: sector: %ld count: %d\n", __func__, sector, count); - ret = cdev_read(priv->cdev, buf, count << 9, sector * 512, 0); + ret = cdev_read(priv->cdev, buf, count << 9, (loff_t)sector * 512, 0); if (ret != count << 9) return ret; @@ -64,7 +64,7 @@ DRESULT disk_write(FATFS *fat, const BYTE *buf, DWORD sector, BYTE count) debug("%s: buf: %p sector: %ld count: %d\n", __func__, buf, sector, count); - ret = cdev_write(priv->cdev, buf, count << 9, sector * 512, 0); + ret = cdev_write(priv->cdev, buf, count << 9, (loff_t)sector * 512, 0); if (ret != count << 9) return ret; @@ -271,7 +271,7 @@ static int fat_read(struct device_d *_dev, FILE *f, void *buf, size_t insize) return outsize; } -static off_t fat_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t fat_lseek(struct device_d *dev, FILE *f, loff_t pos) { FIL *f_file = f->inode; int ret; diff --git a/fs/fs.c b/fs/fs.c index af73c8c..6d1d703 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -692,7 +692,7 @@ int flush(int fd) return ret; } -off_t lseek(int fildes, off_t offset, int whence) +loff_t lseek(int fildes, loff_t offset, int whence) { struct device_d *dev; struct fs_driver_d *fsdrv; @@ -1243,7 +1243,7 @@ static void memcpy_sz(void *_dst, const void *_src, ulong count, ulong rwsize) } } -ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { ulong size; struct device_d *dev; @@ -1252,13 +1252,13 @@ ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong return -1; dev = cdev->dev; - size = min((ulong)count, dev->resource[0].size - offset); + size = min((loff_t)count, dev->resource[0].size - offset); memcpy_sz(buf, dev_get_mem_region(dev, 0) + offset, size, flags & O_RWSIZE_MASK); return size; } EXPORT_SYMBOL(mem_read); -ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { ulong size; struct device_d *dev; @@ -1267,7 +1267,7 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset return -1; dev = cdev->dev; - size = min((ulong)count, dev->resource[0].size - offset); + size = min((loff_t)count, dev->resource[0].size - offset); memcpy_sz(dev_get_mem_region(dev, 0) + offset, buf, size, flags & O_RWSIZE_MASK); return size; } diff --git a/fs/nfs.c b/fs/nfs.c index 75a8f25..79e667f 100644 --- a/fs/nfs.c +++ b/fs/nfs.c @@ -805,7 +805,7 @@ static int nfs_read(struct device_d *dev, FILE *file, void *buf, size_t insize) return outsize; } -static off_t nfs_lseek(struct device_d *dev, FILE *file, off_t pos) +static loff_t nfs_lseek(struct device_d *dev, FILE *file, loff_t pos) { struct file_priv *priv = file->inode; diff --git a/fs/ramfs.c b/fs/ramfs.c index cec5e76..91d06b8 100644 --- a/fs/ramfs.c +++ b/fs/ramfs.c @@ -428,7 +428,7 @@ static int ramfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t i return insize; } -static off_t ramfs_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t ramfs_lseek(struct device_d *dev, FILE *f, loff_t pos) { f->pos = pos; return f->pos; diff --git a/fs/tftp.c b/fs/tftp.c index 6586270..b58d6fc 100644 --- a/fs/tftp.c +++ b/fs/tftp.c @@ -569,7 +569,7 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize) return outsize; } -static off_t tftp_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t tftp_lseek(struct device_d *dev, FILE *f, loff_t pos) { /* not implemented in tftp protocol */ return -ENOSYS; diff --git a/include/driver.h b/include/driver.h index 09dd1e4..4a8d48a 100644 --- a/include/driver.h +++ b/include/driver.h @@ -301,8 +301,8 @@ struct cdev; int dev_protect(struct device_d *dev, size_t count, unsigned long offset, int prot); /* These are used by drivers which work with direct memory accesses */ -ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags); -ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags); +ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags); +ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags); int mem_memmap(struct cdev *cdev, void **map, int flags); /* Use this if you have nothing to do in your drivers probe function */ @@ -316,7 +316,7 @@ void devices_shutdown(void); int generic_memmap_ro(struct cdev *dev, void **map, int flags); int generic_memmap_rw(struct cdev *dev, void **map, int flags); -static inline off_t dev_lseek_default(struct cdev *cdev, off_t ofs) +static inline loff_t dev_lseek_default(struct cdev *cdev, loff_t ofs) { return ofs; } @@ -373,18 +373,18 @@ extern struct bus_type platform_bus; struct file_operations { /*! Called in response of reading from this device. Required */ - ssize_t (*read)(struct cdev*, void* buf, size_t count, ulong offset, ulong flags); + ssize_t (*read)(struct cdev*, void* buf, size_t count, loff_t offset, ulong flags); /*! Called in response of write to this device. Required */ - ssize_t (*write)(struct cdev*, const void* buf, size_t count, ulong offset, ulong flags); + ssize_t (*write)(struct cdev*, const void* buf, size_t count, loff_t offset, ulong flags); int (*ioctl)(struct cdev*, int, void *); - off_t (*lseek)(struct cdev*, off_t); + loff_t (*lseek)(struct cdev*, loff_t); int (*open)(struct cdev*, unsigned long flags); int (*close)(struct cdev*); int (*flush)(struct cdev*); - int (*erase)(struct cdev*, size_t count, unsigned long offset); - int (*protect)(struct cdev*, size_t count, unsigned long offset, int prot); + int (*erase)(struct cdev*, size_t count, loff_t offset); + int (*protect)(struct cdev*, size_t count, loff_t offset, int prot); int (*memmap)(struct cdev*, void **map, int flags); }; diff --git a/include/fs.h b/include/fs.h index d82f026..2b1023e 100644 --- a/include/fs.h +++ b/include/fs.h @@ -23,8 +23,8 @@ typedef struct dir { typedef struct filep { struct device_d *dev; /* The device this FILE belongs to */ - ulong pos; /* current position in stream */ - ulong size; /* The size of this inode */ + loff_t pos; /* current position in stream */ + loff_t size; /* The size of this inode */ ulong flags; /* the O_* flags from open */ void *inode; /* private to the filesystem driver */ @@ -54,7 +54,7 @@ struct fs_driver_d { int (*read)(struct device_d *dev, FILE *f, void *buf, size_t size); int (*write)(struct device_d *dev, FILE *f, const void *buf, size_t size); int (*flush)(struct device_d *dev, FILE *f); - off_t (*lseek)(struct device_d *dev, FILE *f, off_t pos); + loff_t (*lseek)(struct device_d *dev, FILE *f, loff_t pos); struct dir* (*opendir)(struct device_d *dev, const char *pathname); struct dirent* (*readdir)(struct device_d *dev, struct dir *dir); @@ -63,9 +63,9 @@ struct fs_driver_d { int (*ioctl)(struct device_d *dev, FILE *f, int request, void *buf); int (*erase)(struct device_d *dev, FILE *f, size_t count, - unsigned long offset); + loff_t offset); int (*protect)(struct device_d *dev, FILE *f, size_t count, - unsigned long offset, int prot); + loff_t offset, int prot); int (*memmap)(struct device_d *dev, FILE *f, void **map, int flags); @@ -109,7 +109,7 @@ ssize_t write(int fd, const void *buf, size_t count); #define SEEK_CUR 2 #define SEEK_END 3 -off_t lseek(int fildes, off_t offset, int whence); +loff_t lseek(int fildes, loff_t offset, int whence); int mkdir (const char *pathname, mode_t mode); /* Create a directory and its parents */ -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 04/10] introduce strtoull_suffix function 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (2 preceding siblings ...) 2012-06-26 19:54 ` [PATCH 03/10] use loff_t for file offsets Sascha Hauer @ 2012-06-26 19:54 ` Sascha Hauer 2012-06-26 19:54 ` [PATCH 05/10] make parse_area_spec arguments loff_t Sascha Hauer ` (5 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- include/common.h | 1 + lib/misc.c | 14 ++++++++++---- lib/vsprintf.c | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/common.h b/include/common.h index d2347f8..328aa30 100644 --- a/include/common.h +++ b/include/common.h @@ -142,6 +142,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size); /* Just like simple_strtoul(), but this one honors a K/M/G suffix */ unsigned long strtoul_suffix(const char *str, char **endp, int base); +unsigned long long strtoull_suffix(const char *str, char **endp, int base); void start_barebox(void); void shutdown_barebox(void); diff --git a/lib/misc.c b/lib/misc.c index 549b960..cdf0185 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -27,15 +27,15 @@ #include <linux/ctype.h> /* - * Like simple_strtoul() but handles an optional G, M, K or k + * Like simple_strtoull() but handles an optional G, M, K or k * suffix for Gigabyte, Megabyte or Kilobyte */ -unsigned long strtoul_suffix(const char *str, char **endp, int base) +unsigned long long strtoull_suffix(const char *str, char **endp, int base) { - unsigned long val; + unsigned long long val; char *end; - val = simple_strtoul(str, &end, base); + val = simple_strtoull(str, &end, base); switch (*end) { case 'G': @@ -55,6 +55,12 @@ unsigned long strtoul_suffix(const char *str, char **endp, int base) return val; } +EXPORT_SYMBOL(strtoull_suffix); + +unsigned long strtoul_suffix(const char *str, char **endp, int base) +{ + return strtoull_suffix(str, endp, base); +} EXPORT_SYMBOL(strtoul_suffix); /* diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 9763515..17c1973 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -83,6 +83,7 @@ unsigned long long simple_strtoull (const char *cp, char **endp, unsigned int ba *endp = (char *) cp; return result; } +EXPORT_SYMBOL(simple_strtoll); /* we use this so that we can do without the ctype library */ #define is_digit(c) ((c) >= '0' && (c) <= '9') -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 05/10] make parse_area_spec arguments loff_t 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (3 preceding siblings ...) 2012-06-26 19:54 ` [PATCH 04/10] introduce strtoull_suffix function Sascha Hauer @ 2012-06-26 19:54 ` Sascha Hauer 2012-06-26 19:54 ` [PATCH 06/10] make memory display 64bit capable Sascha Hauer ` (4 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- commands/crc.c | 4 ++-- commands/digest.c | 4 ++-- commands/flash.c | 4 ++-- commands/mem.c | 4 ++-- include/common.h | 2 +- lib/misc.c | 10 +++++----- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/commands/crc.c b/commands/crc.c index df22941..09af6aa 100644 --- a/commands/crc.c +++ b/commands/crc.c @@ -84,8 +84,8 @@ out: static int do_crc(int argc, char *argv[]) { - ulong start = 0, size = ~0, total = 0; - ulong crc = 0, vcrc = 0; + loff_t start = 0, size = ~0; + ulong crc = 0, vcrc = 0, total = 0; char *filename = "/dev/mem"; #ifdef CONFIG_CMD_CRC_CMP char *vfilename = NULL; diff --git a/commands/digest.c b/commands/digest.c index 8432914..07cbec9 100644 --- a/commands/digest.c +++ b/commands/digest.c @@ -51,7 +51,7 @@ static int do_digest(char *algorithm, int argc, char *argv[]) argv++; while (*argv) { char *filename = "/dev/mem"; - ulong start = 0, size = ~0; + loff_t start = 0, size = ~0; /* arguments are either file, file+area or area */ if (parse_area_spec(*argv, &start, &size)) { @@ -66,7 +66,7 @@ static int do_digest(char *algorithm, int argc, char *argv[]) for (i = 0; i < d->length; i++) printf("%02x", hash[i]); - printf(" %s\t0x%08lx ... 0x%08lx\n", filename, start, start + size); + printf(" %s\t0x%08llx ... 0x%08llx\n", filename, start, start + size); argv++; } diff --git a/commands/flash.c b/commands/flash.c index 1fcb1cf..d71349a 100644 --- a/commands/flash.c +++ b/commands/flash.c @@ -41,7 +41,7 @@ static int do_flerase(int argc, char *argv[]) int fd; char *filename = NULL; struct stat s; - unsigned long start = 0, size = ~0; + loff_t start = 0, size = ~0; int ret = 0; if (argc == 1) @@ -109,7 +109,7 @@ static int do_protect(int argc, char *argv[]) char *filename = NULL; struct stat s; int prot = 1; - unsigned long start = 0, size = ~0; + loff_t start = 0, size = ~0; int ret = 0, err; if (argc == 1) diff --git a/commands/mem.c b/commands/mem.c index 649d5bf..0719700 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -163,7 +163,7 @@ static int mem_parse_options(int argc, char *argv[], char *optstr, int *mode, static int do_mem_md(int argc, char *argv[]) { - ulong start = 0, size = 0x100; + loff_t start = 0, size = 0x100; int r, now; int ret = 0; int fd; @@ -187,7 +187,7 @@ static int do_mem_md(int argc, char *argv[]) return 1; do { - now = min(size, RW_BUF_SIZE); + now = min(size, (loff_t)RW_BUF_SIZE); r = read(fd, rw_buf, now); if (r < 0) { perror("read"); diff --git a/include/common.h b/include/common.h index 328aa30..08ff0f3 100644 --- a/include/common.h +++ b/include/common.h @@ -138,7 +138,7 @@ struct memarea_info { unsigned long flags; }; -int parse_area_spec(const char *str, ulong *start, ulong *size); +int parse_area_spec(const char *str, loff_t *start, loff_t *size); /* Just like simple_strtoul(), but this one honors a K/M/G suffix */ unsigned long strtoul_suffix(const char *str, char **endp, int base); diff --git a/lib/misc.c b/lib/misc.c index cdf0185..8a95396 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -75,15 +75,15 @@ EXPORT_SYMBOL(strtoul_suffix); * 0x1000 -> start = 0x1000, size = ~0 * 1M+1k -> start = 0x100000, size = 0x400 */ -int parse_area_spec(const char *str, ulong *start, ulong *size) +int parse_area_spec(const char *str, loff_t *start, loff_t *size) { char *endp; - ulong end; + loff_t end; if (!isdigit(*str)) return -1; - *start = strtoul_suffix(str, &endp, 0); + *start = strtoull_suffix(str, &endp, 0); str = endp; @@ -95,7 +95,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size) if (*str == '-') { /* beginning and end given */ - end = strtoul_suffix(str + 1, NULL, 0); + end = strtoull_suffix(str + 1, NULL, 0); if (end < *start) { printf("end < start\n"); return -1; @@ -106,7 +106,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size) if (*str == '+') { /* beginning and size given */ - *size = strtoul_suffix(str + 1, NULL, 0); + *size = strtoull_suffix(str + 1, NULL, 0); return 0; } -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 06/10] make memory display 64bit capable 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (4 preceding siblings ...) 2012-06-26 19:54 ` [PATCH 05/10] make parse_area_spec arguments loff_t Sascha Hauer @ 2012-06-26 19:54 ` Sascha Hauer 2012-06-26 19:55 ` [PATCH 07/10] make st_size in struct stat 64 bit Sascha Hauer ` (3 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:54 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- commands/mem.c | 4 ++-- include/common.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/mem.c b/commands/mem.c index 0719700..2b85f82 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -55,7 +55,7 @@ static char *DEVMEM = "/dev/mem"; */ #define DISP_LINE_LEN 16 -int memory_display(char *addr, ulong offs, ulong nbytes, int size) +int memory_display(char *addr, loff_t offs, ulong nbytes, int size) { ulong linebytes, i; u_char *cp; @@ -72,7 +72,7 @@ int memory_display(char *addr, ulong offs, ulong nbytes, int size) u_char *ucp = (u_char *)linebuf; uint count = 52; - printf("%08lx:", offs); + printf("%08llx:", offs); linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes; for (i = 0; i < linebytes; i += size) { diff --git a/include/common.h b/include/common.h index 08ff0f3..799941d 100644 --- a/include/common.h +++ b/include/common.h @@ -211,7 +211,7 @@ int run_shell(void); #define PAGE_SIZE 4096 #define PAGE_SHIFT 12 -int memory_display(char *addr, ulong offs, ulong nbytes, int size); +int memory_display(char *addr, loff_t offs, ulong nbytes, int size); extern const char version_string[]; #ifdef CONFIG_BANNER -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 07/10] make st_size in struct stat 64 bit 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (5 preceding siblings ...) 2012-06-26 19:54 ` [PATCH 06/10] make memory display 64bit capable Sascha Hauer @ 2012-06-26 19:55 ` Sascha Hauer 2012-06-26 19:55 ` [PATCH 08/10] make cdev 64bit capable Sascha Hauer ` (2 subsequent siblings) 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:55 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- commands/ls.c | 2 +- include/linux/stat.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/ls.c b/commands/ls.c index ad609f3..fbcbadc 100644 --- a/commands/ls.c +++ b/commands/ls.c @@ -35,7 +35,7 @@ static void ls_one(const char *path, struct stat *s) unsigned int namelen = strlen(path); mkmodestr(s->st_mode, modestr); - printf("%s %10lu %*.*s\n", modestr, s->st_size, namelen, namelen, path); + printf("%s %10llu %*.*s\n", modestr, s->st_size, namelen, namelen, path); } int ls(const char *path, ulong flags) diff --git a/include/linux/stat.h b/include/linux/stat.h index bc7dce4..af022c5 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -52,7 +52,7 @@ struct stat { unsigned short st_gid; unsigned short st_rdev; unsigned short __pad2; - unsigned long st_size; + loff_t st_size; unsigned long st_blksize; unsigned long st_blocks; unsigned long st_atime; -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 08/10] make cdev 64bit capable 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (6 preceding siblings ...) 2012-06-26 19:55 ` [PATCH 07/10] make st_size in struct stat 64 bit Sascha Hauer @ 2012-06-26 19:55 ` Sascha Hauer 2012-06-26 19:55 ` [PATCH 09/10] memory commands: Make " Sascha Hauer 2012-06-26 19:55 ` [PATCH 10/10] partitions: " Sascha Hauer 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:55 UTC (permalink / raw) To: barebox Next step to 64bit support: Make cdev size a 64bit type. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- common/block.c | 2 +- drivers/base/driver.c | 2 +- fs/devfs-core.c | 9 +++++---- fs/devfs.c | 4 ++-- fs/fs.c | 2 +- include/driver.h | 10 +++++----- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/common/block.c b/common/block.c index 1db06cc..e40374f 100644 --- a/common/block.c +++ b/common/block.c @@ -338,7 +338,7 @@ static struct file_operations block_ops = { int blockdevice_register(struct block_device *blk) { - size_t size = blk->num_blocks * BLOCKSIZE(blk); + loff_t size = (loff_t)blk->num_blocks * BLOCKSIZE(blk); int ret; int i; diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 547d684..29b0010 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c @@ -337,7 +337,7 @@ static int do_devinfo_subtree(struct device_d *dev, int depth) list_for_each_entry(cdev, &dev->cdevs, devices_list) { for (i = 0; i < depth + 1; i++) printf(" "); - printf("`---- 0x%08lx-0x%08lx: /dev/%s\n", + printf("`---- 0x%08llx-0x%08llx: /dev/%s\n", cdev->offset, cdev->offset + cdev->size - 1, cdev->name); diff --git a/fs/devfs-core.c b/fs/devfs-core.c index 6a56d34..b66965e 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -96,7 +96,7 @@ void cdev_close(struct cdev *cdev) cdev->ops->close(cdev); } -ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { if (!cdev->ops->read) return -ENOSYS; @@ -104,7 +104,7 @@ ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulon return cdev->ops->read(cdev, buf, count, cdev->offset +offset, flags); } -ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { if (!cdev->ops->write) return -ENOSYS; @@ -165,10 +165,11 @@ static int partition_ioctl(struct cdev *cdev, int request, void *buf) case MEMGETREGIONINFO: if (cdev->mtd) { struct region_info_user *reg = buf; + int erasesize_shift = ffs(cdev->mtd->erasesize) - 1; reg->offset = cdev->offset; reg->erasesize = cdev->mtd->erasesize; - reg->numblocks = cdev->size/reg->erasesize; + reg->numblocks = cdev->size >> erasesize_shift; reg->regionindex = cdev->mtd->index; } break; @@ -191,7 +192,7 @@ int cdev_ioctl(struct cdev *cdev, int request, void *buf) return cdev->ops->ioctl(cdev, request, buf); } -int cdev_erase(struct cdev *cdev, size_t count, unsigned long offset) +int cdev_erase(struct cdev *cdev, size_t count, loff_t offset) { if (!cdev->ops->erase) return -ENOSYS; diff --git a/fs/devfs.c b/fs/devfs.c index 863f4ec..5aace36 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -55,7 +55,7 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s static loff_t devfs_lseek(struct device_d *_dev, FILE *f, loff_t pos) { struct cdev *cdev = f->inode; - off_t ret = -1; + loff_t ret = -1; if (cdev->ops->lseek) ret = cdev->ops->lseek(cdev, pos + cdev->offset); @@ -100,7 +100,7 @@ static int devfs_memmap(struct device_d *_dev, FILE *f, void **map, int flags) ret = cdev->ops->memmap(cdev, map, flags); if (!ret) - *map = (void *)((unsigned long)*map + cdev->offset); + *map = (void *)((unsigned long)*map + (unsigned long)cdev->offset); return ret; } diff --git a/fs/fs.c b/fs/fs.c index 6d1d703..7dd6c03 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -697,7 +697,7 @@ loff_t lseek(int fildes, loff_t offset, int whence) struct device_d *dev; struct fs_driver_d *fsdrv; FILE *f = &files[fildes]; - off_t pos; + loff_t pos; int ret; if (check_fd(fildes)) diff --git a/include/driver.h b/include/driver.h index 4a8d48a..0b6d1b3 100644 --- a/include/driver.h +++ b/include/driver.h @@ -395,8 +395,8 @@ struct cdev { struct list_head list; struct list_head devices_list; char *name; - unsigned long offset; - size_t size; + loff_t offset; + loff_t size; unsigned int flags; int open; struct mtd_info *mtd; @@ -409,10 +409,10 @@ struct cdev *cdev_by_name(const char *filename); struct cdev *cdev_open(const char *name, unsigned long flags); void cdev_close(struct cdev *cdev); int cdev_flush(struct cdev *cdev); -ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags); -ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags); +ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags); +ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags); int cdev_ioctl(struct cdev *cdev, int cmd, void *buf); -int cdev_erase(struct cdev *cdev, size_t count, unsigned long offset); +int cdev_erase(struct cdev *cdev, size_t count, loff_t offset); #define DEVFS_PARTITION_FIXED (1 << 0) #define DEVFS_PARTITION_READONLY (1 << 1) -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 09/10] memory commands: Make 64bit capable 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (7 preceding siblings ...) 2012-06-26 19:55 ` [PATCH 08/10] make cdev 64bit capable Sascha Hauer @ 2012-06-26 19:55 ` Sascha Hauer 2012-06-26 19:55 ` [PATCH 10/10] partitions: " Sascha Hauer 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:55 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- commands/mem.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/commands/mem.c b/commands/mem.c index 2b85f82..b8e3bc4 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -43,7 +43,7 @@ #define PRINTF(fmt,args...) #endif -#define RW_BUF_SIZE (ulong)4096 +#define RW_BUF_SIZE 4096 static char *rw_buf; static char *DEVMEM = "/dev/mem"; @@ -108,7 +108,7 @@ int memory_display(char *addr, loff_t offs, ulong nbytes, int size) return 0; } -static int open_and_lseek(const char *filename, int mode, off_t pos) +static int open_and_lseek(const char *filename, int mode, loff_t pos) { int fd, ret; @@ -240,7 +240,7 @@ static int do_mem_mw(int argc, char *argv[]) int fd; char *filename = DEVMEM; int mode = O_RWSIZE_4; - ulong adr; + loff_t adr; if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &filename) < 0) return 1; @@ -248,7 +248,7 @@ static int do_mem_mw(int argc, char *argv[]) if (optind + 1 >= argc) return COMMAND_ERROR_USAGE; - adr = strtoul_suffix(argv[optind++], NULL, 0); + adr = strtoull_suffix(argv[optind++], NULL, 0); fd = open_and_lseek(filename, mode | O_WRONLY, adr); if (fd < 0) @@ -300,7 +300,7 @@ BAREBOX_CMD_END static int do_mem_cmp(int argc, char *argv[]) { - ulong addr1, addr2, count = ~0; + loff_t addr1, addr2, count = ~0; int mode = O_RWSIZE_1; char *sourcefile = DEVMEM; char *destfile = DEVMEM; @@ -316,8 +316,8 @@ static int do_mem_cmp(int argc, char *argv[]) if (optind + 2 > argc) return COMMAND_ERROR_USAGE; - addr1 = strtoul_suffix(argv[optind], NULL, 0); - addr2 = strtoul_suffix(argv[optind + 1], NULL, 0); + addr1 = strtoull_suffix(argv[optind], NULL, 0); + addr2 = strtoull_suffix(argv[optind + 1], NULL, 0); if (optind + 2 == argc) { if (sourcefile == DEVMEM) { @@ -330,7 +330,7 @@ static int do_mem_cmp(int argc, char *argv[]) } count = statbuf.st_size - addr1; } else { - count = strtoul_suffix(argv[optind + 2], NULL, 0); + count = strtoull_suffix(argv[optind + 2], NULL, 0); } sourcefd = open_and_lseek(sourcefile, mode | O_RDONLY, addr1); @@ -348,7 +348,7 @@ static int do_mem_cmp(int argc, char *argv[]) while (count > 0) { int now, r1, r2, i; - now = min(RW_BUF_SIZE, count); + now = min((loff_t)RW_BUF_SIZE, count); r1 = read(sourcefd, rw_buf, now); if (r1 < 0) { @@ -409,8 +409,7 @@ BAREBOX_CMD_END static int do_mem_cp(int argc, char *argv[]) { - ulong count; - ulong dest, src; + loff_t count, dest, src; char *sourcefile = DEVMEM; char *destfile = DEVMEM; int sourcefd, destfd; @@ -424,8 +423,8 @@ static int do_mem_cp(int argc, char *argv[]) if (optind + 2 > argc) return COMMAND_ERROR_USAGE; - src = strtoul_suffix(argv[optind], NULL, 0); - dest = strtoul_suffix(argv[optind + 1], NULL, 0); + src = strtoull_suffix(argv[optind], NULL, 0); + dest = strtoull_suffix(argv[optind + 1], NULL, 0); if (optind + 2 == argc) { if (sourcefile == DEVMEM) { @@ -438,7 +437,7 @@ static int do_mem_cp(int argc, char *argv[]) } count = statbuf.st_size - src; } else { - count = strtoul_suffix(argv[optind + 2], NULL, 0); + count = strtoull_suffix(argv[optind + 2], NULL, 0); } sourcefd = open_and_lseek(sourcefile, mode | O_RDONLY, src); @@ -454,7 +453,7 @@ static int do_mem_cp(int argc, char *argv[]) while (count > 0) { int now, r, w, tmp; - now = min(RW_BUF_SIZE, count); + now = min((loff_t)RW_BUF_SIZE, count); r = read(sourcefd, rw_buf, now); if (r < 0) { @@ -516,7 +515,7 @@ BAREBOX_CMD_END static int do_memset(int argc, char *argv[]) { - ulong s, c, n; + loff_t s, c, n; int fd; char *buf; int mode = O_RWSIZE_1; @@ -529,9 +528,9 @@ static int do_memset(int argc, char *argv[]) if (optind + 3 > argc) return COMMAND_ERROR_USAGE; - s = strtoul_suffix(argv[optind], NULL, 0); - c = strtoul_suffix(argv[optind + 1], NULL, 0); - n = strtoul_suffix(argv[optind + 2], NULL, 0); + s = strtoull_suffix(argv[optind], NULL, 0); + c = strtoull_suffix(argv[optind + 1], NULL, 0); + n = strtoull_suffix(argv[optind + 2], NULL, 0); fd = open_and_lseek(file, mode | O_WRONLY, s); if (fd < 0) @@ -543,7 +542,7 @@ static int do_memset(int argc, char *argv[]) while (n > 0) { int now; - now = min(RW_BUF_SIZE, n); + now = min((loff_t)RW_BUF_SIZE, n); ret = write(fd, buf, now); if (ret < 0) { -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 10/10] partitions: Make 64bit capable 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer ` (8 preceding siblings ...) 2012-06-26 19:55 ` [PATCH 09/10] memory commands: Make " Sascha Hauer @ 2012-06-26 19:55 ` Sascha Hauer 9 siblings, 0 replies; 11+ messages in thread From: Sascha Hauer @ 2012-06-26 19:55 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- common/partitions.c | 29 ----------------------------- fs/devfs-core.c | 2 +- include/driver.h | 2 +- include/partition.h | 2 +- 4 files changed, 3 insertions(+), 32 deletions(-) diff --git a/common/partitions.c b/common/partitions.c index 74b4f12..a8c9625 100644 --- a/common/partitions.c +++ b/common/partitions.c @@ -43,23 +43,6 @@ struct partition_desc { }; /** - * Reject values which cannot be used in Barebox - * @param val Value to be check - * @return 0 if value can be used in Barebox, -EINVAL if not - * - * @note this routine can be removed when Barebox uses file offsets larger - * than 32 bit - */ -static int check_offset_value(uint64_t val) -{ -#if 1 /* until Barebox can handle 64 bit offsets */ - if (val > (__INT_MAX__ / SECTOR_SIZE)) - return -EINVAL; -#endif - return 0; -} - -/** * Guess the size of the disk, based on the partition table entries * @param dev device to create partitions for * @param table partition table @@ -76,12 +59,6 @@ static int disk_guess_size(struct device_d *dev, struct partition_entry *table) size += get_unaligned(&table[i].partition_size); } } - /* limit disk sector counts we can't handle due to 32 bit limits */ - if (check_offset_value(size) != 0) { - dev_warn(dev, "Warning: Sector count limited due to 31 bit" - "contraints\n"); - size = __INT_MAX__ / SECTOR_SIZE; - } return (int)size; } @@ -126,12 +103,6 @@ static void __maybe_unused try_dos_partition(struct block_device *blk, pentry.first_sec = get_unaligned(&table[i].partition_start); pentry.size = get_unaligned(&table[i].partition_size); - /* do we have to ignore this partition due to limitations? */ - if (check_offset_value(pentry.first_sec) != 0) - continue; - if (check_offset_value(pentry.size) != 0) - continue; - if (pentry.first_sec != 0) { pd->parts[pd->used_entries].first_sec = pentry.first_sec; pd->parts[pd->used_entries].size = pentry.size; diff --git a/fs/devfs-core.c b/fs/devfs-core.c index b66965e..cdb8f79 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -227,7 +227,7 @@ int devfs_remove(struct cdev *cdev) return 0; } -int devfs_add_partition(const char *devname, unsigned long offset, size_t size, +int devfs_add_partition(const char *devname, loff_t offset, loff_t size, int flags, const char *name) { struct cdev *cdev, *new; diff --git a/include/driver.h b/include/driver.h index 0b6d1b3..eacd8e6 100644 --- a/include/driver.h +++ b/include/driver.h @@ -418,7 +418,7 @@ int cdev_erase(struct cdev *cdev, size_t count, loff_t offset); #define DEVFS_PARTITION_READONLY (1 << 1) #define DEVFS_IS_PARTITION (1 << 2) -int devfs_add_partition(const char *devname, unsigned long offset, size_t size, +int devfs_add_partition(const char *devname, loff_t offset, loff_t size, int flags, const char *name); int devfs_del_partition(const char *name); diff --git a/include/partition.h b/include/partition.h index 0827bb4..8ad7490 100644 --- a/include/partition.h +++ b/include/partition.h @@ -8,7 +8,7 @@ struct partition { int flags; - unsigned long offset; + loff_t offset; struct device_d *physdev; struct device_d device; -- 1.7.10 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2012-06-26 19:55 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-06-26 19:54 [PATCH] 64bit file support Sascha Hauer 2012-06-26 19:54 ` [PATCH 01/10] mtd: fix arguments to bad block ioctls Sascha Hauer 2012-06-26 19:54 ` [PATCH 02/10] nand-bb: bb->offset may become a 64bit type Sascha Hauer 2012-06-26 19:54 ` [PATCH 03/10] use loff_t for file offsets Sascha Hauer 2012-06-26 19:54 ` [PATCH 04/10] introduce strtoull_suffix function Sascha Hauer 2012-06-26 19:54 ` [PATCH 05/10] make parse_area_spec arguments loff_t Sascha Hauer 2012-06-26 19:54 ` [PATCH 06/10] make memory display 64bit capable Sascha Hauer 2012-06-26 19:55 ` [PATCH 07/10] make st_size in struct stat 64 bit Sascha Hauer 2012-06-26 19:55 ` [PATCH 08/10] make cdev 64bit capable Sascha Hauer 2012-06-26 19:55 ` [PATCH 09/10] memory commands: Make " Sascha Hauer 2012-06-26 19:55 ` [PATCH 10/10] partitions: " Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox