Re: [Yaffs] Performance of overwrite vs new file

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Charles Manning
Date:  
To: yaffs
CC: Roberts Nathan-mcg31137, Peter Barada
Subject: Re: [Yaffs] Performance of overwrite vs new file

> Can YAFFS detect this situation and effectively "unlink" the file first?


There are some subtle issues that make this tricky.

What you're really saying is not so much an "unlink" (even though I know I
used that term), but a "deletion".

To do this YAFFS would have to detect attempts to resize a file to zero and
pull some slight of hand to make this happen. I'll explain....

The main issue is really that YAFFS uses object numbers as inode numbers
(apart from a special case for hard links). This is nice and simple (apart
from hard link handling), but has some limitations.

YAFFS uses obbjectId to identify the chunks (==pages) of data and object
headers (== file info records) that go with a file. When we soft delete a
file all that happens on NAND is that the file is moved into the "unlinked"
or "deleted" directory and actual deletion is performed by garbage
collection. The file no longer exists from a Linux perspective so we can do
whatwever we like with it. Soft deleting essentially says to the garbage
collector that all chunks related to objectId 123 should be treated as being
discarded and there is no need to treat them on a one-by-one basis. THis
blanket treatment saves us a lot of programming time and makes soft delete
faster.

When we resize a file we cannot treat it this way because the inode still
exists. Consider the following

h = open(fname,O_TRUCT | O_RDWR);
write(h,x,500);
close(h);
// gc happens here

The inode (==objectId), say 123 has been truncated (ie all the data chunks
discarded), then written to. Clearly if the gc was told that all data chunks
for 123 could be deleted, then the gc could delete valid data too.

Thus, at present the way YAFFS does this would be to physically mark the
truncated chunks. This unfortunately takes time.

OK, so what could could we do about this?

Well one thing to do would be to break the 1:1 relationship between inodes and
objectIds. This would allow us to delete an object without deleting the
inode. To explain, I'll run the previous example again.

// Let's say we start with inode 123 = objectId 456

h = open(fname,O_TRUCT | O_RDWR);
// Opening inode 123 which currently has object id 456.
// Fire sneaky rule:
// a) Create new objectId 678 scoping the file info out of objectId 456. Fix
up the mapping so inode 123 <--> 678
// b) SoftDelete objectId 456.

write(h,x,500);
// Write to inode 123 == objectId 678.


It would be OK to do this as a "patch table" in yaffs_fs.c. That is, when
yaffs starts up it starts with the 1:1 mapping numbers and only makes a
"patch table" for files that have changed.

This would work for resizes to zero, but not resizes to non-zero sizes. That
probably does not matter since most resizes - probably a good 90% or more -
are resizes to zero.

I don't know when I would have time to do this, but if someone wants to try
I'd be interested to see the outcome.

-- CHarles