mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
The goal of summary is to speed up the mount time. Erase block summary (EBS) stores summary information at the end of every (closed) erase block. It is no longer necessary to scan all nodes separetly (and read all pages of them) just read this "small" summary, where every information is stored which is needed at mount time. This summary information is stored in a JFFS2_FEATURE_RWCOMPAT_DELETE. During the mount process if there is no summary info the orignal scan process will be executed. EBS works with NAND and NOR flashes, too. There is a user space tool called sumtool to generate this summary information for a JFFS2 image. Signed-off-by: Ferenc Havasi <havasi@inf.u-szeged.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
81 lines
1.8 KiB
C
81 lines
1.8 KiB
C
/*
|
|
* JFFS2 -- Journalling Flash File System, Version 2.
|
|
*
|
|
* Copyright (C) 2001, 2002 Red Hat, Inc.
|
|
*
|
|
* Created by David Woodhouse <dwmw2@infradead.org>
|
|
*
|
|
* For licensing information, see the file 'LICENCE' in this directory.
|
|
*
|
|
* $Id: writev.c,v 1.7 2005/09/07 08:34:55 havasi Exp $
|
|
*
|
|
*/
|
|
|
|
#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 (c->mtd->writev)
|
|
return c->mtd->writev(c->mtd, vecs, count, to, retlen);
|
|
else {
|
|
if (jffs2_sum_active()) {
|
|
int res;
|
|
|
|
res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to);
|
|
if (res) {
|
|
return res;
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|