162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * JFFS2 -- Journalling Flash File System, Version 2.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright © 2001-2007 Red Hat, Inc.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Created by David Woodhouse <dwmw2@infradead.org>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * For licensing information, see the file 'LICENCE' in this directory.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci#include <linux/mtd/mtd.h>
1462306a36Sopenharmony_ci#include "nodelist.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciint jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs,
1762306a36Sopenharmony_ci			      unsigned long count, loff_t to, size_t *retlen)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	if (!jffs2_is_writebuffered(c)) {
2062306a36Sopenharmony_ci		if (jffs2_sum_active()) {
2162306a36Sopenharmony_ci			int res;
2262306a36Sopenharmony_ci			res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to);
2362306a36Sopenharmony_ci			if (res) {
2462306a36Sopenharmony_ci				return res;
2562306a36Sopenharmony_ci			}
2662306a36Sopenharmony_ci		}
2762306a36Sopenharmony_ci	}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	return mtd_writev(c->mtd, vecs, count, to, retlen);
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciint jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len,
3362306a36Sopenharmony_ci			size_t *retlen, const u_char *buf)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	int ret;
3662306a36Sopenharmony_ci	ret = mtd_write(c->mtd, ofs, len, retlen, buf);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	if (jffs2_sum_active()) {
3962306a36Sopenharmony_ci		struct kvec vecs[1];
4062306a36Sopenharmony_ci		int res;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci		vecs[0].iov_base = (unsigned char *) buf;
4362306a36Sopenharmony_ci		vecs[0].iov_len = len;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci		res = jffs2_sum_add_kvec(c, vecs, 1, (uint32_t) ofs);
4662306a36Sopenharmony_ci		if (res) {
4762306a36Sopenharmony_ci			return res;
4862306a36Sopenharmony_ci		}
4962306a36Sopenharmony_ci	}
5062306a36Sopenharmony_ci	return ret;
5162306a36Sopenharmony_ci}
52