[Yaffs] PATCH!!! PATCH!!! (Was Sorry state of YAFFS2)
Martin Fouts
Martin.Fouts at palmsource.com
Thu Oct 27 09:06:29 BST 2005
Thank you for your patch. I've added it to the queue, and will test it
when I get the chance.
Unfortunately, I'm leaving on vacation on Friday, so it probably won't
be until after the 15th of November.
Marty
> -----Original Message-----
> From: yaffs-bounces at stoneboat.aleph1.co.uk
> [mailto:yaffs-bounces at stoneboat.aleph1.co.uk] On Behalf Of
> Sergey Kubushyn
> Sent: Friday, October 14, 2005 7:07 PM
> To: Charles Manning
> Cc: yaffs-list
> Subject: [Yaffs] PATCH!!! PATCH!!! (Was Sorry state of YAFFS2)
>
> On Fri, 14 Oct 2005, Charles Manning wrote:
>
> > On Friday 14 October 2005 08:54, you wrote:
> > > On Thu, 2005-10-13 at 11:09 -0700, Sergey Kubushyn wrote:
> > > > First of all, I must tell ya that your mailing list is
> extremely
> > > > selective in sending messages. I did NOT get your message in the
> > mail.
> > > > Ian's message also didn't come through. Other messages
> did. That's
> > why
> > > > your message had been copied and inserted into this
> email by hand.
> > > >
> > > > Do you think I'd miss your posting thus making you "right" in
> > having the
> > > > last word? It's kinda childish...
> >
> > Lots of abuse, and now paranoia?
> >
> > I don't own the list, Aleph One does. AFAIK, the list is completely
> > open and unfiltered in any way.
> >
> > As I have said before, I am not prepared to put the energy into
> > reading Sergey's abusive nonsense and I have a filter on my
> personal
> > emailer that does not allow anything from him in (though it
> does not
> > apply any filtersing to outbound stuff). Applying a filter is not
> > something I did lightly.
> > In
> > over 20 years in the business have never done this before
> and hope to
> > never be moved to do it again.
> >
> > Perhaps this filtering is causing some loss of feedback,
> but I think
> > there's probably better feedback coming from the rest of
> the YAFFSers
> > that are more constructive in their approach. Bottom line for me is
> > that I am not prepared to pander to Sergey's outbursts for the few
> > bits of useful feedback.
>
> Sorry for overestimating you, I've been thinking you are smarter :((
>
> > If someone else wants to screen Sergey's stuff and repost
> the useful
> > content I am willing to read that. Otherwise, I don't think
> the signal
> > to noise ratio is high enough to warrant reading.
> >
> > I continue to try work the problem of the mtd interface to
> resolve it
> > the correct way, rather than the ugly hack way.
> Unfortunately this is
> > taking longer than expected (over 2 months now!) so it is probably
> > worth putting the ugly hack into the CVS for now. If someone better
> > equipped with test hardware etc would like to do this, I would not
> > mind at all is someone else works the problem.
>
> I don't know what took you that long to do a trivial thing.
> But looking into that YAFFS code with lot of irregular
> structures casted to (__u8 *) I can now understand -- that
> was lack of knowledge, starting with C programming basics. I
> suggest you should read a good book on C programming. When
> you're through with it, go take some reading on kernel
> programming. It usually helps. Read books, they rule. Then
> you would also probably be able to read THE F#$%%^ING kernel
> source instead of IRC'ing and trying to resolve problems that
> do NOT exist.
>
> Here is the proper patch that makes your wonderOS work with
> _ANY_ large page auto OOB layout. No matter HW, SOFT, bad
> blocks at the beginning, at the end, in the middle of, ECC at
> the left, at the right or wherever you want.
> It does NOT require ANY special MTD or custom crafted kernel
> and works with any of stock ones.
>
> This patch also fixes some spectacularly stupid errors that
> are not errors per se but total lack of understanding how C
> works, less for Linux kernel.
>
> I do, really _DO_ hope to see it applied and that "Fix your
> MTD" mantra thrown away forever. You better start fixing bugs
> in your wonderFS. I'd suggest to start from explaining why 36
> Mbyte tar takes 51 Mbytes on YAFFS2 FS. And here is a hint -
> without that included patch it took 56 Mbytes. If it's too
> complex for you, try to look for any illegal cast usage on
> irregular data structures. I'm sending you a small program
> that illustrates the point of data alignment, you can compile
> and run it to see yourself how it makes a surprise even on ix86...
>
> === Cut ===
> diff -urN linux-2.6.12.orig/fs/yaffs2/yaffs_mtdif2.c
> linux-2.6.12/fs/yaffs2/yaffs_mtdif2.c
> --- linux-2.6.12.orig/fs/yaffs2/yaffs_mtdif2.c
> 2005-10-14 11:46:50.000000000 -0700
> +++ linux-2.6.12/fs/yaffs2/yaffs_mtdif2.c 2005-10-14
> 16:52:40.000000000 -0700
> @@ -29,6 +29,130 @@
>
> #include "yaffs_packedtags2.h"
>
> +#define PT2_BYTES 25
> +
> +void nandmtd2_pt2buf(yaffs_Device *dev, yaffs_PackedTags2 *pt, int
> +is_raw) {
> + struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
> + int i, j = 0, k, n;
> + __u8 pt2_byte_buf[PT2_BYTES];
> +
> + /* Pack buffer with 0xff */
> + for (i = 0; i < mtd->oobsize; i++)
> + dev->spareBuffer[i] = 0xff;
> +
> + if (!is_raw) {
> + *((unsigned int *) &dev->spareBuffer[0]) =
> pt->t.sequenceNumber;
> + *((unsigned int *) &dev->spareBuffer[4]) =
> pt->t.objectId;
> + *((unsigned int *) &dev->spareBuffer[8]) =
> pt->t.chunkId;
> + *((unsigned int *) &dev->spareBuffer[12]) =
> pt->t.byteCount;
> + dev->spareBuffer[16] = pt->ecc.colParity;
> + dev->spareBuffer[17] = pt->ecc.lineParity & 0xff;
> + dev->spareBuffer[18] = (pt->ecc.lineParity >> 8) & 0xff;
> + dev->spareBuffer[19] = (pt->ecc.lineParity >>
> 16) & 0xff;
> + dev->spareBuffer[20] = (pt->ecc.lineParity >>
> 24) & 0xff;
> + dev->spareBuffer[21] = pt->ecc.lineParityPrime & 0xff;
> + dev->spareBuffer[22] = (pt->ecc.lineParityPrime
> >> 8) & 0xff;
> + dev->spareBuffer[23] = (pt->ecc.lineParityPrime
> >> 16) & 0xff;
> + dev->spareBuffer[24] = (pt->ecc.lineParityPrime
> >> 24) & 0xff;
> + } else {
> + *((unsigned int *) &pt2_byte_buf[0]) =
> pt->t.sequenceNumber;
> + *((unsigned int *) &pt2_byte_buf[4]) = pt->t.objectId;
> + *((unsigned int *) &pt2_byte_buf[8]) = pt->t.chunkId;
> + *((unsigned int *) &pt2_byte_buf[12]) = pt->t.byteCount;
> + pt2_byte_buf[16] = pt->ecc.colParity;
> + pt2_byte_buf[17] = pt->ecc.lineParity & 0xff;
> + pt2_byte_buf[18] = (pt->ecc.lineParity >> 8) & 0xff;
> + pt2_byte_buf[19] = (pt->ecc.lineParity >> 16) & 0xff;
> + pt2_byte_buf[20] = (pt->ecc.lineParity >> 24) & 0xff;
> + pt2_byte_buf[21] = pt->ecc.lineParityPrime & 0xff;
> + pt2_byte_buf[22] = (pt->ecc.lineParityPrime >>
> 8) & 0xff;
> + pt2_byte_buf[23] = (pt->ecc.lineParityPrime >>
> 16) & 0xff;
> + pt2_byte_buf[24] = (pt->ecc.lineParityPrime >>
> 24) & 0xff;
> +
> + k = mtd->oobinfo.oobfree[j][0];
> + n = mtd->oobinfo.oobfree[j][1];
> +
> + if (n == 0) {
> + T(YAFFS_TRACE_ERROR, (TSTR("No OOB
> space for tags" TENDSTR)));
> + YBUG();
> + }
> +
> + for (i = 0; i < PT2_BYTES; i++) {
> + if (n == 0) {
> + j++;
> + k = mtd->oobinfo.oobfree[j][0];
> + n = mtd->oobinfo.oobfree[j][1];
> + if (n == 0) {
> + T(YAFFS_TRACE_ERROR,
> (TSTR("No OOB space for tags" TENDSTR)));
> + YBUG();
> + }
> + }
> + dev->spareBuffer[k++] = pt2_byte_buf[i];
> + n--;
> + }
> + }
> +}
> +
> +void nandmtd2_buf2pt(yaffs_Device *dev, yaffs_PackedTags2 *pt, int
> +is_raw) {
> + struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
> + int i, j = 0, k, n;
> + __u8 pt2_byte_buf[PT2_BYTES];
> +
> +
> + if (!is_raw) {
> + pt->t.sequenceNumber = *((unsigned int *)
> &dev->spareBuffer[0]);
> + pt->t.objectId = *((unsigned int *)
> &dev->spareBuffer[4]);
> + pt->t.chunkId = *((unsigned int *)
> &dev->spareBuffer[8]);
> + pt->t.byteCount = *((unsigned int *)
> &dev->spareBuffer[12]);
> + pt->ecc.colParity = dev->spareBuffer[16];
> + pt->ecc.lineParity = (dev->spareBuffer[17] &
> 0x000000ff) |
> + ((dev->spareBuffer[18] << 8) & 0x0000ff00) |
> + ((dev->spareBuffer[19] << 16) & 0x00ff0000) |
> + ((dev->spareBuffer[20] >> 24) & 0xff000000);
> + pt->ecc.lineParityPrime = (dev->spareBuffer[21]
> & 0x000000ff) |
> + ((dev->spareBuffer[22] << 8) & 0x0000ff00) |
> + ((dev->spareBuffer[23] << 16) & 0x00ff0000) |
> + ((dev->spareBuffer[24] >> 24) & 0xff000000);
> + } else {
> + k = mtd->oobinfo.oobfree[j][0];
> + n = mtd->oobinfo.oobfree[j][1];
> +
> + if (n == 0) {
> + T(YAFFS_TRACE_ERROR, (TSTR("No space in
> OOB for tags" TENDSTR)));
> + YBUG();
> + }
> +
> + for (i = 0; i < PT2_BYTES; i++) {
> + if (n == 0) {
> + j++;
> + k = mtd->oobinfo.oobfree[j][0];
> + n = mtd->oobinfo.oobfree[j][1];
> + if (n == 0) {
> + T(YAFFS_TRACE_ERROR,
> (TSTR("No space in OOB for tags" TENDSTR)));
> + YBUG();
> + }
> + }
> + pt2_byte_buf[i] = dev->spareBuffer[k++];
> + n--;
> + }
> + pt->t.sequenceNumber = *((unsigned int *)
> &pt2_byte_buf[0]);
> + pt->t.objectId = *((unsigned int *) &pt2_byte_buf[4]);
> + pt->t.chunkId = *((unsigned int *) &pt2_byte_buf[8]);
> + pt->t.byteCount = *((unsigned int *) &pt2_byte_buf[12]);
> + pt->ecc.colParity = pt2_byte_buf[16];
> + pt->ecc.lineParity = (pt2_byte_buf[17] & 0x000000ff) |
> + ((pt2_byte_buf[18] << 8) & 0x0000ff00) |
> + ((pt2_byte_buf[19] << 16) & 0x00ff0000) |
> + ((pt2_byte_buf[20] << 24) & 0xff000000);
> + pt->ecc.lineParityPrime = (pt2_byte_buf[21] &
> 0x000000ff) |
> + ((pt2_byte_buf[22] << 8) & 0x0000ff00) |
> + ((pt2_byte_buf[23] << 16) & 0x00ff0000) |
> + ((pt2_byte_buf[24] << 24) & 0xff000000);
> + }
> +}
> +
> int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev,
> int chunkInNAND,
> const __u8 * data,
> const yaffs_ExtendedTags
> * tags) @@ -51,24 +176,22 @@
> }
>
> if (data && tags) {
> - if (dev->useNANDECC)
> - retval =
> - mtd->write_ecc(mtd, addr,
> dev->nBytesPerChunk,
> - &dummy, data, (__u8
> *) & pt, NULL);
> - else
> + nandmtd2_pt2buf(dev, &pt, 0);
> retval =
> mtd->write_ecc(mtd, addr,
> dev->nBytesPerChunk,
> - &dummy, data, (__u8
> *) & pt, NULL);
> + &dummy, data,
> dev->spareBuffer,
> + NULL);
> } else {
> if (data)
> retval =
> mtd->write(mtd, addr,
> dev->nBytesPerChunk, &dummy,
> data);
> - if (tags)
> + if (tags) {
> + nandmtd2_pt2buf(dev, &pt, 1);
> retval =
> mtd->write_oob(mtd, addr,
> mtd->oobsize, &dummy,
> - (__u8 *) & pt);
> -
> + dev->spareBuffer);
> + }
> }
>
> if (retval == 0)
> @@ -94,30 +217,24 @@
> TENDSTR), chunkInNAND, data, tags));
>
> if (data && tags) {
> - if (dev->useNANDECC) {
> retval =
> mtd->read_ecc(mtd, addr,
> dev->nBytesPerChunk,
> &dummy, data,
> dev->spareBuffer,
> NULL);
> - } else {
> - retval =
> - mtd->read_ecc(mtd, addr,
> dev->nBytesPerChunk,
> - &dummy, data,
> dev->spareBuffer,
> - NULL);
> - }
> + nandmtd2_buf2pt(dev, &pt, 0);
> } else {
> if (data)
> retval =
> mtd->read(mtd, addr,
> dev->nBytesPerChunk, &dummy,
> data);
> - if (tags)
> + if (tags) {
> retval =
> mtd->read_oob(mtd, addr,
> mtd->oobsize, &dummy,
> dev->spareBuffer);
> + nandmtd2_buf2pt(dev, &pt, 1);
> + }
> }
>
> - memcpy(&pt, dev->spareBuffer, sizeof(pt));
> -
> if (tags)
> yaffs_UnpackTags2(tags, &pt);
>
> @@ -178,10 +295,11 @@
> *sequenceNumber = 0;
> *state = YAFFS_BLOCK_STATE_EMPTY;
> }
> +
> + T(YAFFS_TRACE_MTD,
> + (TSTR("block is OK seq %d state %d" TENDSTR),
> *sequenceNumber,
> + *state));
> }
> - T(YAFFS_TRACE_MTD,
> - (TSTR("block is bad seq %d state %d" TENDSTR),
> *sequenceNumber,
> - *state));
>
> if (retval == 0)
> return YAFFS_OK;
> === Cut ===
>
> ---
> ******************************************************************
> * KSI at home KOI8 Net < > The impossible we do immediately. *
> * Las Vegas NV, USA < > Miracles require 24-hour notice. *
> ******************************************************************
>
>
> _______________________________________________
> yaffs mailing list
> yaffs at stoneboat.aleph1.co.uk
> http://stoneboat.aleph1.co.uk/cgi-bin/mailman/listinfo/yaffs
>
More information about the yaffs
mailing list