On 12/22/05, Todd Poynor <tpoynor@mvista.com> wrote:
Mikhail Ryleev wrote:

> It also fixes a problem with partially written data that actually should
> return the amount of data written.

May be OK, most callers will simply treat as an error, but various other
commit_write implementations don't do this.  What code expects a partial
count return?
 
For example it is called by generic_file_write routine which is an implementation of "write" call. 
Since it is that generic, we have to be extremely careful what we return here. 
As for partial count return,  if we change the state of the file, advance file pointer or change the size of the file,
we have to let the caller know that that happened. An alternative would be to completely discard changes,
probably it is much better but far more complex.     
 

> 2. device is out of space while creating new object. In this case
> current code returns ENOMEM error code which is also misleading.
> Unfortunatly, I do not see a simple fix here,  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.
>
>...
> @@ -785,7 +784,7 @@
>   }
>   yaffs_GrossUnlock(dev);
>
> - return nWritten != n ? -ENOSPC : nWritten;
> +   return ( nWritten == n || nWritten > 0 ) ? nWritten : -ENOSPC;

Can't match the code change to the description above, how was ENOMEM
returned before?
 
ENOMEM is returned by yaffs_mknod call in case it failed to create new object for whatever reason and not in that patch.
I do not have simple solution for that, other then replace it with ENOSPC which is arguably not much better.  
 

Is a check for nWritten < 0 (-ENOMEM) appropriate?  Or else ( nWritten
== n || nWritten > 0 ) can simply be nWritten > 0 .

--
Todd