 f369157d95
			
		
	
	
		f369157d95
		
	
	
	
	
		
			
			. pipes in pfs . vnodes in vfs . thread stack sizes in vfs Change-Id: Ib27dedd42f57a90821a5b950cd7ea25cb2b42f3f
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* This file manages the super block table and the related data structures,
 | |
|  * namely, the bit maps that keep track of which zones and which inodes are
 | |
|  * allocated and which are free.  When a new inode or zone is needed, the
 | |
|  * appropriate bit map is searched for a free entry.
 | |
|  *
 | |
|  * The entry points into this file are
 | |
|  *   alloc_bit:       somebody wants to allocate a zone or inode; find one
 | |
|  *   free_bit:        indicate that a zone or inode is available for allocation
 | |
|  */
 | |
| 
 | |
| #include "fs.h"
 | |
| #include "buf.h"
 | |
| #include "inode.h"
 | |
| #include "const.h"
 | |
| 
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				alloc_bit				     *
 | |
|  *===========================================================================*/
 | |
| bit_t alloc_bit(void)
 | |
| {
 | |
| /* Allocate a bit from a bit map and return its bit number. */
 | |
|   bitchunk_t *wptr, *wlim;
 | |
|   bit_t b;
 | |
|   unsigned int i, bcount;
 | |
| 
 | |
|   bcount = FS_BITMAP_CHUNKS(PFS_NR_INODES); /* Inode map has this many chunks. */
 | |
|   wlim = &inodemap[bcount]; /* Point to last chunk in inodemap. */
 | |
| 
 | |
|   for (wptr = &inodemap[0]; wptr < wlim; wptr++) {
 | |
| 	/* Does this word contain a free bit? */
 | |
| 	if (*wptr == (bitchunk_t) ~0) continue; /* No. Go to next word */
 | |
| 
 | |
| 	/* Find and allocate the free bit. */
 | |
| 	for (i = 0; (*wptr & (1 << i)) != 0; ++i) {}
 | |
| 
 | |
| 	/* Get inode number */
 | |
| 	b = (bit_t) ((wptr - &inodemap[0]) * FS_BITCHUNK_BITS + i);
 | |
| 
 | |
| 	/* Don't allocate bits beyond end of map. */
 | |
| 	if (b >= PFS_NR_INODES) break;
 | |
| 
 | |
| 	/* Allocate and return bit number. */
 | |
| 	*wptr |= 1 << i;
 | |
| 
 | |
| 	/* Mark server 'busy' */
 | |
| 	busy++;
 | |
| 	return(b);
 | |
|   }
 | |
| 
 | |
|   return(NO_BIT);			/* no bit could be allocated */
 | |
| }
 | |
| 
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				free_bit				     *
 | |
|  *===========================================================================*/
 | |
| void free_bit(bit_returned)
 | |
| bit_t bit_returned;		/* number of bit to insert into the inode map*/
 | |
| {
 | |
|   bitchunk_t *k, mask;
 | |
|   bit_t bit;
 | |
|   unsigned word;
 | |
| 
 | |
|   /* Get word offset and bit within offset */
 | |
|   word = (unsigned) (bit_returned / (bit_t) FS_BITCHUNK_BITS);
 | |
|   bit = bit_returned % (bit_t) FS_BITCHUNK_BITS;
 | |
| 
 | |
|   /* Unset bit */
 | |
|   k = &inodemap[word];
 | |
|   mask = (unsigned) 1 << bit;
 | |
|   *k &= ~mask;
 | |
| 
 | |
|   busy--; /* One inode less in use. */
 | |
| }
 |