Skip to content

Commit

Permalink
mtd: Remove mtd_erase_callback() entirely
Browse files Browse the repository at this point in the history
The original purpose of mtd_erase_callback() in Linux at the time it was
imported to U-Boot, was to inform the caller that erasing is done (since
it was an asynchronous operation).

All supplied callback methods in U-Boot do nothing, but the
mtd_erase_callback() function was (until previous patch) grossly abused
in U-Boot's mtdpart implementation for completely different purpose.

Since we got rid of the abusement, remove the mtd_erase_callback()
function and the .callback member from struct erase_info entirely, in
order to avoid such problems in the future.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
  • Loading branch information
elkablo authored and openedev committed Oct 23, 2021
1 parent a60397d commit 0d1ecc9
Show file tree
Hide file tree
Showing 15 changed files with 5 additions and 91 deletions.
9 changes: 2 additions & 7 deletions cmd/onenand.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,9 +186,7 @@ static int onenand_block_write(loff_t to, size_t len,
static int onenand_block_erase(u32 start, u32 size, int force)
{
struct onenand_chip *this = mtd->priv;
struct erase_info instr = {
.callback = NULL,
};
struct erase_info instr = {};
loff_t ofs;
int ret;
int blocksize = 1 << this->erase_shift;
Expand Down Expand Up @@ -219,10 +217,7 @@ static int onenand_block_erase(u32 start, u32 size, int force)
static int onenand_block_test(u32 start, u32 size)
{
struct onenand_chip *this = mtd->priv;
struct erase_info instr = {
.callback = NULL,
.priv = 0,
};
struct erase_info instr = {};

int blocks;
loff_t ofs;
Expand Down
3 changes: 0 additions & 3 deletions drivers/mtd/altera_qspi.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@ static int altera_qspi_erase(struct mtd_info *mtd, struct erase_info *instr)
putc('\n');
instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
instr->state = MTD_ERASE_FAILED;
mtd_erase_callback(instr);
return -EIO;
}
flash = pdata->base + addr;
Expand All @@ -177,7 +176,6 @@ static int altera_qspi_erase(struct mtd_info *mtd, struct erase_info *instr)
writel(stat, &regs->isr); /* clear isr */
instr->fail_addr = addr;
instr->state = MTD_ERASE_FAILED;
mtd_erase_callback(instr);
return -EIO;
}
if (flash_verbose)
Expand All @@ -189,7 +187,6 @@ static int altera_qspi_erase(struct mtd_info *mtd, struct erase_info *instr)
addr += mtd->erasesize;
}
instr->state = MTD_ERASE_DONE;
mtd_erase_callback(instr);

return 0;
}
Expand Down
1 change: 0 additions & 1 deletion drivers/mtd/cfi_mtd.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ static int cfi_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
}

instr->state = MTD_ERASE_DONE;
mtd_erase_callback(instr);
return 0;
}

Expand Down
11 changes: 0 additions & 11 deletions drivers/mtd/mtdconcat.c
Original file line number Diff line number Diff line change
Expand Up @@ -338,14 +338,6 @@ concat_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops)
return -EINVAL;
}

static void concat_erase_callback(struct erase_info *instr)
{
/* Nothing to do here in U-Boot */
#ifndef __UBOOT__
wake_up((wait_queue_head_t *) instr->priv);
#endif
}

static int concat_dev_erase(struct mtd_info *mtd, struct erase_info *erase)
{
int err;
Expand All @@ -358,7 +350,6 @@ static int concat_dev_erase(struct mtd_info *mtd, struct erase_info *erase)
init_waitqueue_head(&waitq);

erase->mtd = mtd;
erase->callback = concat_erase_callback;
erase->priv = (unsigned long) &waitq;

/*
Expand Down Expand Up @@ -498,8 +489,6 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr)
if (err)
return err;

if (instr->callback)
instr->callback(instr);
return 0;
}

Expand Down
8 changes: 0 additions & 8 deletions drivers/mtd/mtdcore.c
Original file line number Diff line number Diff line change
Expand Up @@ -906,13 +906,6 @@ void __put_mtd_device(struct mtd_info *mtd)
}
EXPORT_SYMBOL_GPL(__put_mtd_device);

/*
* Erase is an asynchronous operation. Device drivers are supposed
* to call instr->callback() whenever the operation completes, even
* if it completes with a failure.
* Callers are supposed to pass a callback function and wait for it
* to be called before writing to the block.
*/
int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
{
if (instr->addr > mtd->size || instr->len > mtd->size - instr->addr)
Expand All @@ -922,7 +915,6 @@ int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
if (!instr->len) {
instr->state = MTD_ERASE_DONE;
mtd_erase_callback(instr);
return 0;
}
return mtd->_erase(mtd, instr);
Expand Down
21 changes: 0 additions & 21 deletions drivers/mtd/mtdpart.c
Original file line number Diff line number Diff line change
Expand Up @@ -456,27 +456,6 @@ static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
return ret;
}

void mtd_erase_callback(struct erase_info *instr)
{
if (!instr->callback)
return;

if (instr->mtd->_erase == part_erase && instr->len) {
if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
instr->fail_addr -= instr->mtd->offset;
instr->addr -= instr->mtd->offset;
}

instr->callback(instr);

if (instr->mtd->_erase == part_erase && instr->len) {
if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
instr->fail_addr += instr->mtd->offset;
instr->addr += instr->mtd->offset;
}
}
EXPORT_SYMBOL_GPL(mtd_erase_callback);

static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
return mtd->parent->_lock(mtd->parent, ofs + mtd->offset, len);
Expand Down
4 changes: 0 additions & 4 deletions drivers/mtd/nand/raw/nand_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -3602,10 +3602,6 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
chip->select_chip(mtd, -1);
nand_release_device(mtd);

/* Do call back function */
if (!ret)
mtd_erase_callback(instr);

/* Return more or less happy */
return ret;
}
Expand Down
3 changes: 0 additions & 3 deletions drivers/mtd/onenand/onenand_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1836,9 +1836,6 @@ int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
erase_exit:

ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO;
/* Do call back function */
if (!ret)
mtd_erase_callback(instr);

/* Deselect and wake up anyone waiting on the device */
onenand_release_device(mtd);
Expand Down
1 change: 0 additions & 1 deletion drivers/mtd/spi/sf_mtd.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ static int spi_flash_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
}

instr->state = MTD_ERASE_DONE;
mtd_erase_callback(instr);

return 0;
}
Expand Down
5 changes: 2 additions & 3 deletions drivers/mtd/spi/spi-nor-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,7 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
div_u64_rem(instr->len, mtd->erasesize, &rem);
if (rem) {
ret = -EINVAL;
goto erase_err_callback;
goto err;
}

addr = instr->addr;
Expand Down Expand Up @@ -966,14 +966,13 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
if (!ret)
ret = err;

erase_err_callback:
err:
if (ret) {
instr->fail_addr = addr_known ? addr : MTD_FAIL_ADDR_UNKNOWN;
instr->state = MTD_ERASE_FAILED;
} else {
instr->state = MTD_ERASE_DONE;
}
mtd_erase_callback(instr);

return ret;
}
Expand Down
13 changes: 0 additions & 13 deletions drivers/mtd/ubi/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,18 +304,6 @@ int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
return err;
}

/**
* erase_callback - MTD erasure call-back.
* @ei: MTD erase information object.
*
* Note, even though MTD erase interface is asynchronous, all the current
* implementations are synchronous anyway.
*/
static void erase_callback(struct erase_info *ei)
{
wake_up_interruptible((wait_queue_head_t *)ei->priv);
}

/**
* do_sync_erase - synchronously erase a physical eraseblock.
* @ubi: UBI device description object
Expand Down Expand Up @@ -346,7 +334,6 @@ static int do_sync_erase(struct ubi_device *ubi, int pnum)
ei.mtd = ubi->mtd;
ei.addr = (loff_t)pnum * ubi->peb_size;
ei.len = ubi->peb_size;
ei.callback = erase_callback;
ei.priv = (unsigned long)&wq;

err = mtd_erase(ubi->mtd, &ei);
Expand Down
4 changes: 1 addition & 3 deletions env/onenand.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,7 @@ static int env_onenand_save(void)
#endif
loff_t env_addr = CONFIG_ENV_ADDR;
size_t retlen;
struct erase_info instr = {
.callback = NULL,
};
struct erase_info instr = {};

ret = env_export(&env_new);
if (ret)
Expand Down
1 change: 0 additions & 1 deletion fs/yaffs2/yaffs_mtdif.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,6 @@ int nandmtd_EraseBlockInNAND(struct yaffs_dev *dev, int blockNumber)
ei.len = dev->data_bytes_per_chunk * dev->param.chunks_per_block;
ei.time = 1000;
ei.retries = 2;
ei.callback = NULL;
ei.priv = (u_long) dev;

/* Todo finish off the ei if required */
Expand Down
11 changes: 0 additions & 11 deletions include/linux/mtd/mtd.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ struct erase_info {
u_long retries;
unsigned dev;
unsigned cell;
void (*callback) (struct erase_info *self);
u_long priv;
u_char state;
struct erase_info *next;
Expand Down Expand Up @@ -535,16 +534,6 @@ extern int unregister_mtd_user (struct mtd_notifier *old);
#endif
void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size);

#ifdef CONFIG_MTD_PARTITIONS
void mtd_erase_callback(struct erase_info *instr);
#else
static inline void mtd_erase_callback(struct erase_info *instr)
{
if (instr->callback)
instr->callback(instr);
}
#endif

static inline int mtd_is_bitflip(int err) {
return err == -EUCLEAN;
}
Expand Down
1 change: 0 additions & 1 deletion include/nand.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ static inline int nand_erase(struct mtd_info *info, loff_t off, size_t size)
instr.mtd = info;
instr.addr = off;
instr.len = size;
instr.callback = 0;

return mtd_erase(info, &instr);
}
Expand Down

0 comments on commit 0d1ecc9

Please sign in to comment.