1 | /* mount_testkit.c
2 | ---------------
3 | $Id: mount_testkit.c,v 1.2 2003/09/22 09:03:26 stewart Exp $
4 |
5 | This is the code to mount a fcfs volume using the testkit stuff.
6 | a bit icky, but it should work.
7 |
8 | (C)2003 Stewart Smith
9 | Distributed under the GNU Public License
10 | */
11 |
12 | #include <stdio.h>
13 | #include <stdlib.h>
14 | #include <sys/stat.h>
15 | #include <unistd.h>
16 | #include <fcntl.h>
17 | #include <string.h>
18 | #include <time.h>
19 |
20 |
21 | #include "testkit/block_dev.h"
22 | #include "testkit/types.h"
23 | #include "testkit/bitops.h"
24 | #include "disk.h"
25 |
26 | #include "super_block.h"
27 | #include "onode.h"
28 | #include "onode_index.h"
29 | #include "space_bitmap.h"
30 |
31 |
32 | struct fcfs_disk *fcfs_mount(char *name)
33 | {
34 | struct block_device bdev,*bdevproper;
35 | struct fcfs_disk *disk,*diskproper;
36 | struct fcfs_disk_block *block;
37 | u32 bsize; // block size (bytes)
38 | u64 blocksnr; // number of blocks
39 |
40 | bdevproper = (struct block_device*)malloc(sizeof(struct block_device));
41 | if(bdevproper==NULL)
42 | {
43 | fprintf(stderr,"No memory for bdevproper\n");
44 | abort();
45 | }
46 |
47 | block_dev_init();
48 | block_dev_new(&bdev,name,4096,1);
49 | disk = disk_new(&bdev);
50 |
51 | block = disk_getblock(disk,0);
52 | disk->sb = (struct fcfs_sb*)block->data;
53 |
54 | bsize = disk->sb->bsize;
55 | blocksnr = disk->sb->blocksnr;
56 |
57 | /* clean up after initial detection */
58 | disk_freeblock(block);
59 | disk_free(disk);
60 |
61 | /* Let's use our knowledge to make a proper disk */
62 | block_dev_new(bdevproper,name,bsize,blocksnr);
63 | diskproper = disk_new(bdevproper);
64 |
65 | /* Put proper superblock into disk */
66 | block = disk_getblock(diskproper,0);
67 | disk->sb_block = block;
68 | disk->sb = (struct fcfs_sb*)block->data;
69 |
70 | fcfs_sb_mark_dirty(disk);
71 |
72 | return disk;
73 | }
74 |
75 | int fcfs_umount(struct fcfs_disk *disk)
76 | {
77 | fcfs_sb_mark_clean(disk);
78 | disk_freeblock(disk->sb_block);
79 | disk_free(disk);
80 | return 0;
81 | }