kern
diff src/fs.c @ 95:ec62cbe00b55
whatever
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 11 Dec 2011 21:15:35 +0200 |
parents | b3351d018ac6 |
children | 07fe6a614185 |
line diff
1.1 --- a/src/fs.c Sun Dec 11 11:12:30 2011 +0200 1.2 +++ b/src/fs.c Sun Dec 11 21:15:35 2011 +0200 1.3 @@ -10,6 +10,13 @@ 1.4 #include "fs.h" 1.5 #include "bdev.h" 1.6 1.7 +#define BM_IDX(x) ((x) / 32) 1.8 +#define BM_BIT(x) ((x) & 0x1f) 1.9 + 1.10 +#define BM_ISFREE(bm, x) (((bm)[BM_IDX(x)] & (1 << BM_BIT(x))) == 0) 1.11 +#define BM_SET(bm, x) ((bm)[BM_IDX(x)] |= (1 << BM_BIT(x))) 1.12 +#define BM_CLR(bm, x) ((bm)[BM_IDX(x)] &= ~(1 << BM_BIT(x))) 1.13 + 1.14 1.15 int openfs(struct filesys *fs, dev_t dev); 1.16 static int read_superblock(struct filesys *fs); 1.17 @@ -156,3 +163,35 @@ 1.18 free(buf); 1.19 return 0; 1.20 } 1.21 + 1.22 +static int find_free(uint32_t *bm, int sz) 1.23 +{ 1.24 + int i; 1.25 + uint32_t ent; 1.26 + 1.27 + for(i=0; i<=sz/32; i++) { 1.28 + if(bm[i] != 0xffffffff) { 1.29 + ent = i * 32; 1.30 + for(j=0; j<32; j++) { 1.31 + if(BM_ISFREE(bm, ent)) { 1.32 + return ent; 1.33 + } 1.34 + } 1.35 + 1.36 + panic("shouldn't happen (in find_free:fs.c)"); 1.37 + } 1.38 + } 1.39 + 1.40 + return -1; 1.41 +} 1.42 + 1.43 +static int alloc_inode(struct filesys *fs) 1.44 +{ 1.45 + int ino; 1.46 + 1.47 + if((ino = find_free(fs->ibm, fs->ibm_count)) == -1) { 1.48 + return -1; 1.49 + } 1.50 + BM_SET(fs->ibm, ino); 1.51 + return 0; 1.52 +}