[Yaffs] problem with object (file) creation

Charles Manning manningc2@actrix.gen.nz
Mon, 11 Oct 2004 07:26:27 +1300


Michael

Thank you very much for this. I too have struggled to sometimes get my he=
ad=20
around the vfs and how it works and the input from various people has bee=
m=20
very useful.

I will be investigating this ASAP.

Can you tell me what version of Linux you're using here? Some of these th=
ings=20
might be version specific.

Thanx

-- CHarles

On Saturday 09 October 2004 00:54, Michael Fischer wrote:
> Hello everyone,
> i am new to the list as well as to the linux vfs/fs stuff and i am look=
ing
> for any help/comments on the following:
> In some cases when copying a big number of files i got complains from t=
he
> cp command that a newly created file was a directory thus not beeing ab=
le
> to write data into it. The following steps would reproduce the behavior=
: -
> delete a directory with many files and subdirs recursively.
> - have some process which still has a reference to the dir or some file
> open (e.g. cd /test; rm -rf /test)
> - move or copy back the deleted dir-tree from some backup location.
>
> Debuging it further i found that the yaffs layer deletes objects which =
due
> to references still exist in the inode cache of the vfs layer. Looking =
into
> the code i found that yaffs_fs.c/yaffs_mknod =3D> __yaffs_mknod =3D>
> yaffs_FindNiceObjectBucket returns the object id . Depending on
> YAFFS_NOBJECT_BUCKETS you probably get an id of a recently deleted obje=
ct.
> When afterwards calling yaffs_get_inode(iget4) you get an possibly allr=
eady
> existing inode (inode reference count > 1). This inode doesnt get
> initialized so attributes like directory are still valid and cause the
> described behavior.
>
> so a small patch (read: fast dirty hack) of yaffs_mknod (see below) doe=
s
> solve the problem in my case:
>
> doitagain:
> 	obj =3D __yaffs_mknod ( parent, dentry, mode, rdev);
> 	if(obj)
> 	{
> 		inode =3D yaffs_get_inode(dir->i_sb, mode, rdev, obj);
> 		T(YAFFS_TRACE_OS,(KERN_DEBUG"yaffs_mknod created object %d count =3D
> %d\n",obj->objectId,atomic_read(&inode->i_count)));
> 		if (atomic_read(&inode->i_count) > 1) {
> 			iput(inode);
> 			yaffs_DeleteFile(obj);
> 			goto doitagain;
> 		}
> 		d_instantiate(dentry, inode);
> 		error =3D 0;
> 	}
> 	else
> 	{
>
> ok, as mentioned before i am new to all this therefore i am of cause un=
sure
> if i havnt overseen something or this is fixed in later versions or how=
 a
> clean patch could look like.
>
> Thanks a lot for any comments and best regards,
> Michael
>
>
>
>
>
>
>
> _______________________________________________
> yaffs mailing list
> yaffs@stoneboat.aleph1.co.uk
> http://stoneboat.aleph1.co.uk/cgi-bin/mailman/listinfo/yaffs