mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 03:24:55 +08:00
c00c310eac
In particular, remove the bit in the LICENCE file about contacting Red Hat for alternative arrangements. Their errant IS department broke that arrangement a long time ago -- the policy of collecting copyright assignments from contributors came to an end when the plug was pulled on the servers hosting the project, without notice or reason. We do still dual-license it for use with eCos, with the GPL+exception licence approved by the FSF as being GPL-compatible. It's just that nobody has the right to license it differently. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
80 lines
1.8 KiB
C
80 lines
1.8 KiB
C
/*
|
|
* JFFS2 -- Journalling Flash File System, Version 2.
|
|
*
|
|
* Copyright © 2001-2007 Red Hat, Inc.
|
|
*
|
|
* Created by David Woodhouse <dwmw2@infradead.org>
|
|
*
|
|
* For licensing information, see the file 'LICENCE' in this directory.
|
|
*
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/mtd/mtd.h>
|
|
#include "nodelist.h"
|
|
|
|
/* This ought to be in core MTD code. All registered MTD devices
|
|
without writev should have this put in place. Bug the MTD
|
|
maintainer */
|
|
static inline int mtd_fake_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
|
unsigned long count, loff_t to, size_t *retlen)
|
|
{
|
|
unsigned long i;
|
|
size_t totlen = 0, thislen;
|
|
int ret = 0;
|
|
|
|
for (i=0; i<count; i++) {
|
|
if (!vecs[i].iov_len)
|
|
continue;
|
|
ret = mtd->write(mtd, to, vecs[i].iov_len, &thislen, vecs[i].iov_base);
|
|
totlen += thislen;
|
|
if (ret || thislen != vecs[i].iov_len)
|
|
break;
|
|
to += vecs[i].iov_len;
|
|
}
|
|
if (retlen)
|
|
*retlen = totlen;
|
|
return ret;
|
|
}
|
|
|
|
int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs,
|
|
unsigned long count, loff_t to, size_t *retlen)
|
|
{
|
|
if (!jffs2_is_writebuffered(c)) {
|
|
if (jffs2_sum_active()) {
|
|
int res;
|
|
res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to);
|
|
if (res) {
|
|
return res;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (c->mtd->writev)
|
|
return c->mtd->writev(c->mtd, vecs, count, to, retlen);
|
|
else {
|
|
return mtd_fake_writev(c->mtd, vecs, count, to, retlen);
|
|
}
|
|
}
|
|
|
|
int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len,
|
|
size_t *retlen, const u_char *buf)
|
|
{
|
|
int ret;
|
|
ret = c->mtd->write(c->mtd, ofs, len, retlen, buf);
|
|
|
|
if (jffs2_sum_active()) {
|
|
struct kvec vecs[1];
|
|
int res;
|
|
|
|
vecs[0].iov_base = (unsigned char *) buf;
|
|
vecs[0].iov_len = len;
|
|
|
|
res = jffs2_sum_add_kvec(c, vecs, 1, (uint32_t) ofs);
|
|
if (res) {
|
|
return res;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|