<div>There are at least two separate cases here:</div>
<div>&nbsp;</div>
<div>1. device is out of space while writing an existing file. </div>
<div>
<div>This problem here is actually became worse with&nbsp;revision 1.32 of yaffs_fs.c that changed &nbsp;<strong>&nbsp;&nbsp;</strong></div></div>
<div>yaffs_commit_write routine to returns -1 (which is translated into EACESS errno)&nbsp;and at least is misleading. The&nbsp;attached patch fixes this problem while keeping desired effect of change 1.32.&nbsp;&nbsp;</div>
<div>It also fixes a problem with partially&nbsp;written data that actually should return the amount of data written.</div>
<div>&nbsp;</div>
<div>2. device is out of space while creating new&nbsp;object. In this case current code returns ENOMEM error code which is also misleading. Unfortunatly, I do not see a simple fix here,&nbsp; the structure of code is such that it is hard to diffirenciate out-of-memory vs. out-of-space situation here but I think ENOSPC would be better here because it is more likely to happen.
</div>
<div>&nbsp;</div>
<div>M. </div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>--- yaffs_fs.c&nbsp;2005-12-16 18:23:10.000000000 -0800<br>+++ ./new/yaffs_fs.c&nbsp;2005-12-21 16:53:31.000000000 -0800<br>@@ -624,10 +624,9 @@<br>&nbsp;<br>&nbsp;&nbsp;T(YAFFS_TRACE_OS,<br>&nbsp;&nbsp;&nbsp; (KERN_DEBUG &quot;yaffs_commit_write returning %d\n&quot;,
<br>-&nbsp;&nbsp;&nbsp; nWritten == nBytes ? 0 : -1));<br>-<br>-&nbsp;return nWritten == nBytes ? 0 : -1;<br>+&nbsp;&nbsp;&nbsp; nWritten == nBytes ? 0 : nWritten));<br>&nbsp;<br>+&nbsp;return nWritten == nBytes ? 0 : nWritten;<br>&nbsp;}<br>&nbsp;<br>&nbsp;static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj)
<br>@@ -785,7 +784,7 @@<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;yaffs_GrossUnlock(dev);<br>&nbsp;<br>-&nbsp;return nWritten != n ? -ENOSPC : nWritten;<br>+&nbsp;&nbsp;&nbsp; return&nbsp; ( nWritten == n || nWritten &gt; 0 ) ? nWritten : -ENOSPC;<br>&nbsp;}<br>&nbsp;<br>&nbsp;static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir)
<br>&nbsp;</div>