Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Artem Bityutskiy and committed by
David Woodhouse
1dbebd32 e2936b2a

+27 -23
+1 -1
drivers/mtd/devices/block2mtd.c
··· 288 288 dev->mtd.flags = MTD_CAP_RAM; 289 289 dev->mtd.erase = block2mtd_erase; 290 290 dev->mtd.write = block2mtd_write; 291 - dev->mtd.writev = default_mtd_writev; 291 + dev->mtd.writev = mtd_writev; 292 292 dev->mtd.sync = block2mtd_sync; 293 293 dev->mtd.read = block2mtd_read; 294 294 dev->mtd.priv = dev;
+23 -3
drivers/mtd/mtdcore.c
··· 696 696 * This function returns zero in case of success and a negative error code in 697 697 * case of failure. 698 698 */ 699 - int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 700 - unsigned long count, loff_t to, size_t *retlen) 699 + static int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 700 + unsigned long count, loff_t to, size_t *retlen) 701 701 { 702 702 unsigned long i; 703 703 size_t totlen = 0, thislen; ··· 716 716 *retlen = totlen; 717 717 return ret; 718 718 } 719 - EXPORT_SYMBOL_GPL(default_mtd_writev); 719 + 720 + /* 721 + * mtd_writev - the vector-based MTD write method 722 + * @mtd: mtd device description object pointer 723 + * @vecs: the vectors to write 724 + * @count: count of vectors in @vecs 725 + * @to: the MTD device offset to write to 726 + * @retlen: on exit contains the count of bytes written to the MTD device. 727 + * 728 + * This function returns zero in case of success and a negative error code in 729 + * case of failure. 730 + */ 731 + int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 732 + unsigned long count, loff_t to, size_t *retlen) 733 + { 734 + *retlen = 0; 735 + if (!mtd->writev) 736 + return default_mtd_writev(mtd, vecs, count, to, retlen); 737 + return mtd->writev(mtd, vecs, count, to, retlen); 738 + } 739 + EXPORT_SYMBOL_GPL(mtd_writev); 720 740 721 741 /** 722 742 * mtd_kmalloc_up_to - allocate a contiguous buffer up to the specified size
+1 -5
fs/jffs2/writev.c
··· 26 26 } 27 27 } 28 28 29 - if (c->mtd->writev) 30 - return mtd_writev(c->mtd, vecs, count, to, retlen); 31 - else { 32 - return default_mtd_writev(c->mtd, vecs, count, to, retlen); 33 - } 29 + return mtd_writev(c->mtd, vecs, count, to, retlen); 34 30 } 35 31 36 32 int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len,
+2 -14
include/linux/mtd/mtd.h
··· 394 394 return mtd->lock_user_prot_reg(mtd, from, len); 395 395 } 396 396 397 - /* 398 - * kvec-based read/write method. NB: The 'count' parameter is the number of 399 - * _vectors_, each of which contains an (ofs, len) tuple. 400 - */ 401 - static inline int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 402 - unsigned long count, loff_t to, size_t *retlen) 403 - { 404 - *retlen = 0; 405 - return mtd->writev(mtd, vecs, count, to, retlen); 406 - } 397 + int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 398 + unsigned long count, loff_t to, size_t *retlen); 407 399 408 400 static inline void mtd_sync(struct mtd_info *mtd) 409 401 { ··· 502 510 503 511 extern void register_mtd_user (struct mtd_notifier *new); 504 512 extern int unregister_mtd_user (struct mtd_notifier *old); 505 - 506 - int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 507 - unsigned long count, loff_t to, size_t *retlen); 508 - 509 513 void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size); 510 514 511 515 void mtd_erase_callback(struct erase_info *instr);