writev.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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.6 2004/11/16 20:36:12 dwmw2 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 (c->mtd->writev)
  42. return c->mtd->writev(c->mtd, vecs, count, to, retlen);
  43. else
  44. return mtd_fake_writev(c->mtd, vecs, count, to, retlen);
  45. }