mtd: harmonize mtd_writev usage
This patch makes the 'mtd_writev()' function more usable and logical. We first teach it to fall-back to the 'default_mtd_writev()' function if the MTD driver does not define its own '->writev()' method. Then we make block2mtd and JFFS2 just 'mtd_writev()' instead of 'default_mtd_writev()' function. This means we can now stop exporting 'default_mtd_writev()' and instead, export 'mtd_writev()'. This is much cleaner and more logical, as well as allows us to get read of another direct 'mtd->writev' access in JFFS2. Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
e2936b2af5
commit
1dbebd3256
@ -288,7 +288,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
|
|||||||
dev->mtd.flags = MTD_CAP_RAM;
|
dev->mtd.flags = MTD_CAP_RAM;
|
||||||
dev->mtd.erase = block2mtd_erase;
|
dev->mtd.erase = block2mtd_erase;
|
||||||
dev->mtd.write = block2mtd_write;
|
dev->mtd.write = block2mtd_write;
|
||||||
dev->mtd.writev = default_mtd_writev;
|
dev->mtd.writev = mtd_writev;
|
||||||
dev->mtd.sync = block2mtd_sync;
|
dev->mtd.sync = block2mtd_sync;
|
||||||
dev->mtd.read = block2mtd_read;
|
dev->mtd.read = block2mtd_read;
|
||||||
dev->mtd.priv = dev;
|
dev->mtd.priv = dev;
|
||||||
|
@ -696,8 +696,8 @@ EXPORT_SYMBOL_GPL(__put_mtd_device);
|
|||||||
* This function returns zero in case of success and a negative error code in
|
* This function returns zero in case of success and a negative error code in
|
||||||
* case of failure.
|
* case of failure.
|
||||||
*/
|
*/
|
||||||
int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
static int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
||||||
unsigned long count, loff_t to, size_t *retlen)
|
unsigned long count, loff_t to, size_t *retlen)
|
||||||
{
|
{
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
size_t totlen = 0, thislen;
|
size_t totlen = 0, thislen;
|
||||||
@ -716,7 +716,27 @@ int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
|||||||
*retlen = totlen;
|
*retlen = totlen;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(default_mtd_writev);
|
|
||||||
|
/*
|
||||||
|
* mtd_writev - the vector-based MTD write method
|
||||||
|
* @mtd: mtd device description object pointer
|
||||||
|
* @vecs: the vectors to write
|
||||||
|
* @count: count of vectors in @vecs
|
||||||
|
* @to: the MTD device offset to write to
|
||||||
|
* @retlen: on exit contains the count of bytes written to the MTD device.
|
||||||
|
*
|
||||||
|
* This function returns zero in case of success and a negative error code in
|
||||||
|
* case of failure.
|
||||||
|
*/
|
||||||
|
int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
||||||
|
unsigned long count, loff_t to, size_t *retlen)
|
||||||
|
{
|
||||||
|
*retlen = 0;
|
||||||
|
if (!mtd->writev)
|
||||||
|
return default_mtd_writev(mtd, vecs, count, to, retlen);
|
||||||
|
return mtd->writev(mtd, vecs, count, to, retlen);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(mtd_writev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mtd_kmalloc_up_to - allocate a contiguous buffer up to the specified size
|
* mtd_kmalloc_up_to - allocate a contiguous buffer up to the specified size
|
||||||
|
@ -26,11 +26,7 @@ int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->mtd->writev)
|
return mtd_writev(c->mtd, vecs, count, to, retlen);
|
||||||
return mtd_writev(c->mtd, vecs, count, to, retlen);
|
|
||||||
else {
|
|
||||||
return default_mtd_writev(c->mtd, vecs, count, to, retlen);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len,
|
int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len,
|
||||||
|
@ -394,16 +394,8 @@ static inline int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
|
|||||||
return mtd->lock_user_prot_reg(mtd, from, len);
|
return mtd->lock_user_prot_reg(mtd, from, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
||||||
* kvec-based read/write method. NB: The 'count' parameter is the number of
|
unsigned long count, loff_t to, size_t *retlen);
|
||||||
* _vectors_, each of which contains an (ofs, len) tuple.
|
|
||||||
*/
|
|
||||||
static inline int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
|
||||||
unsigned long count, loff_t to, size_t *retlen)
|
|
||||||
{
|
|
||||||
*retlen = 0;
|
|
||||||
return mtd->writev(mtd, vecs, count, to, retlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void mtd_sync(struct mtd_info *mtd)
|
static inline void mtd_sync(struct mtd_info *mtd)
|
||||||
{
|
{
|
||||||
@ -510,10 +502,6 @@ struct mtd_notifier {
|
|||||||
|
|
||||||
extern void register_mtd_user (struct mtd_notifier *new);
|
extern void register_mtd_user (struct mtd_notifier *new);
|
||||||
extern int unregister_mtd_user (struct mtd_notifier *old);
|
extern int unregister_mtd_user (struct mtd_notifier *old);
|
||||||
|
|
||||||
int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
|
||||||
unsigned long count, loff_t to, size_t *retlen);
|
|
||||||
|
|
||||||
void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size);
|
void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size);
|
||||||
|
|
||||||
void mtd_erase_callback(struct erase_info *instr);
|
void mtd_erase_callback(struct erase_info *instr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user