123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include "fs.h"
- #include <minix/u64.h>
- #include <minix/bdev.h>
- #include <sys/param.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <minix/libminixfs.h>
- #include <math.h>
- #include "buf.h"
- #include "super.h"
- #include "inode.h"
- struct buf *get_block(dev_t dev, block_t block, int how)
- {
- struct buf *bp;
- int r;
- if ((r = lmfs_get_block(&bp, dev, block, how)) != OK && r != ENOENT)
- panic("MFS: error getting block (%llu,%u): %d", dev, block, r);
- assert(r == OK || how == PEEK);
- return (r == OK) ? bp : NULL;
- }
- zone_t alloc_zone(
- dev_t dev,
- zone_t z
- )
- {
- bit_t b, bit;
- struct super_block *sp;
- static int print_oos_msg = 1;
-
- sp = &superblock;
-
- if (z == sp->s_firstdatazone) {
- bit = sp->s_zsearch;
- } else {
- bit = (bit_t) (z - (sp->s_firstdatazone - 1));
- }
- b = alloc_bit(sp, ZMAP, bit);
- if (b == NO_BIT) {
- err_code = ENOSPC;
- if (print_oos_msg)
- printf("No space on device %d/%d\n", major(sp->s_dev),
- minor(sp->s_dev));
- print_oos_msg = 0;
- return(NO_ZONE);
- }
- print_oos_msg = 1;
- if (z == sp->s_firstdatazone) sp->s_zsearch = b;
- return( (zone_t) (sp->s_firstdatazone - 1) + (zone_t) b);
- }
- void free_zone(
- dev_t dev,
- zone_t numb
- )
- {
- register struct super_block *sp;
- bit_t bit;
-
- sp = &superblock;
- if (numb < sp->s_firstdatazone || numb >= sp->s_zones) return;
- bit = (bit_t) (numb - (zone_t) (sp->s_firstdatazone - 1));
- free_bit(sp, ZMAP, bit);
- if (bit < sp->s_zsearch) sp->s_zsearch = bit;
-
- assert(sp->s_log_zone_size == 0);
- lmfs_free_block(dev, (block_t)numb);
- }
|