 e4ac80eb60
			
		
	
	
		e4ac80eb60
		
	
	
	
	
		
			
			. warnings (sometimes promoted to errors) in servers/ and kernel/ . -Os for ext2 boot module to make it small enough
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "fs.h"
 | |
| #include "buf.h"
 | |
| #include "inode.h"
 | |
| #include <minix/vfsif.h>
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				fs_ftrunc				     *
 | |
|  *===========================================================================*/
 | |
| int fs_ftrunc(message *fs_m_in, message *fs_m_out)
 | |
| {
 | |
|   struct inode *rip;
 | |
|   off_t start;
 | |
|   ino_t inumb;
 | |
| 
 | |
|   inumb = (ino_t) fs_m_in->REQ_INODE_NR;
 | |
| 
 | |
|   if( (rip = find_inode(inumb)) == NULL) return(EINVAL);
 | |
| 
 | |
|   start = fs_m_in->REQ_TRC_START_LO;
 | |
| 
 | |
|   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);
 | |
| }
 |