
In order to avoid creating libfsdriver exceptions, two changes to VFS are necessary: - the returned position field for reads/writes is no longer abused to return the new pipe size; VFS is perfectly capable of updating the size itself; - during system startup, PFS is now sent a mount request, just like all other file systems. In proper "two steps forward, one step back" fashion, the latter point has the consequence that PFS can no longer drop its privileges at startup. This is probably best resolved with a more general solution for all boot image system services. The upside is that PFS no longer needs to be linked with libc. Change-Id: I92e2410cdb0d93d0e6107bae10bc08efc2dbb8b3
43 lines
1.4 KiB
C
43 lines
1.4 KiB
C
#include "fs.h"
|
|
|
|
/*===========================================================================*
|
|
* fs_trunc *
|
|
*===========================================================================*/
|
|
int fs_trunc(ino_t ino_nr, off_t start, off_t end)
|
|
{
|
|
struct inode *rip;
|
|
|
|
if( (rip = find_inode(ino_nr)) == NULL) return(EINVAL);
|
|
|
|
if (end != 0) return(EINVAL); /* creating holes is not supported */
|
|
|
|
return truncate_inode(rip, start);
|
|
}
|
|
|
|
|
|
/*===========================================================================*
|
|
* truncate_inode *
|
|
*===========================================================================*/
|
|
int truncate_inode(rip, newsize)
|
|
register struct inode *rip; /* pointer to inode to be truncated */
|
|
off_t newsize; /* inode must become this size */
|
|
{
|
|
/* Set inode to a certain size, freeing any zones no longer referenced
|
|
* and updating the size in the inode. If the inode is extended, the
|
|
* extra space is a hole that reads as zeroes.
|
|
*
|
|
* Nothing special has to happen to file pointers if inode is opened in
|
|
* O_APPEND mode, as this is different per fd and is checked when
|
|
* writing is done.
|
|
*/
|
|
|
|
/* Pipes can shrink, so adjust size to make sure all zones are removed. */
|
|
if(newsize != 0) return(EINVAL); /* Only truncate pipes to 0. */
|
|
rip->i_size = newsize;
|
|
|
|
/* Next correct the inode size. */
|
|
wipe_inode(rip); /* Pipes can only be truncated to 0. */
|
|
|
|
return(OK);
|
|
}
|