writev.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * JFFS2 -- Journalling Flash File System, Version 2.
  3. *
  4. * Copyright (C) 2001, 2002 Red Hat, Inc.
  5. *
  6. * Created by David Woodhouse <dwmw2@infradead.org>
  7. *
  8. * For licensing information, see the file 'LICENCE' in this directory.
  9. *
  10. * $Id: writev.c,v 1.8 2005/09/09 15:11:58 havasi Exp $
  11. *
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/mtd/mtd.h>
  15. #include "nodelist.h"
  16. /* This ought to be in core MTD code. All registered MTD devices
  17. without writev should have this put in place. Bug the MTD
  18. maintainer */
  19. static inline int mtd_fake_writev(struct mtd_info *mtd, const struct kvec *vecs,
  20. unsigned long count, loff_t to, size_t *retlen)
  21. {
  22. unsigned long i;
  23. size_t totlen = 0, thislen;
  24. int ret = 0;
  25. for (i=0; i<count; i++) {
  26. if (!vecs[i].iov_len)
  27. continue;
  28. ret = mtd->write(mtd, to, vecs[i].iov_len, &thislen, vecs[i].iov_base);
  29. totlen += thislen;
  30. if (ret || thislen != vecs[i].iov_len)
  31. break;
  32. to += vecs[i].iov_len;
  33. }
  34. if (retlen)
  35. *retlen = totlen;
  36. return ret;
  37. }
  38. int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs,
  39. unsigned long count, loff_t to, size_t *retlen)
  40. {
  41. if (!jffs2_is_writebuffered(c)) {
  42. if (jffs2_sum_active()) {
  43. int res;
  44. res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to);
  45. if (res) {
  46. return res;
  47. }
  48. }
  49. }
  50. if (c->mtd->writev)
  51. return c->mtd->writev(c->mtd, vecs, count, to, retlen);
  52. else {
  53. return mtd_fake_writev(c->mtd, vecs, count, to, retlen);
  54. }
  55. }
  56. int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len,
  57. size_t *retlen, const u_char *buf)
  58. {
  59. int ret;
  60. ret = c->mtd->write(c->mtd, ofs, len, retlen, buf);
  61. if (jffs2_sum_active()) {
  62. struct kvec vecs[1];
  63. int res;
  64. vecs[0].iov_base = (unsigned char *) buf;
  65. vecs[0].iov_len = len;
  66. res = jffs2_sum_add_kvec(c, vecs, 1, (uint32_t) ofs);
  67. if (res) {
  68. return res;
  69. }
  70. }
  71. return ret;
  72. }