nuclear@93: /* implementation of the filesystem-related syscalls */ nuclear@93: nuclear@93: #include nuclear@93: #include nuclear@93: #include nuclear@93: #include nuclear@93: #include nuclear@93: #include "fs.h" nuclear@93: #include "part.h" nuclear@93: #include "panic.h" nuclear@93: #include "bdev.h" nuclear@93: nuclear@93: static dev_t find_rootfs(void); nuclear@93: nuclear@93: /* list of mounted filesystems nuclear@93: * XXX currently only one, the root filesystem nuclear@93: */ nuclear@93: static struct filesys *fslist; nuclear@93: nuclear@93: nuclear@93: int sys_mount(char *mtpt, char *devname, unsigned int flags) nuclear@93: { nuclear@93: dev_t dev; nuclear@93: int err; nuclear@93: struct filesys *fs; nuclear@93: nuclear@93: if(strcmp(mtpt, "/") != 0) { nuclear@93: printf("only root can be mounted at the moment\n"); nuclear@93: return -EBUG; nuclear@93: } nuclear@93: nuclear@93: /* mounting root filesystem */ nuclear@93: if(fslist) { nuclear@93: printf("root already mounted\n"); nuclear@93: return -EBUSY; nuclear@93: } nuclear@93: nuclear@93: if(devname) { nuclear@93: dev = bdev_by_name(devname); nuclear@93: } else { nuclear@93: /* try to autodetect it */ nuclear@93: dev = find_rootfs(); nuclear@93: } nuclear@93: if(!dev) { nuclear@93: err = -ENOENT; nuclear@93: goto rootfail; nuclear@93: } nuclear@93: nuclear@93: if(!(fs = malloc(sizeof *fslist))) { nuclear@93: err = -ENOMEM; nuclear@93: goto rootfail; nuclear@93: } nuclear@93: if((err = openfs(fs, dev)) != 0) { nuclear@93: free(fs); nuclear@93: goto rootfail; nuclear@93: } nuclear@93: nuclear@93: fslist = fs; nuclear@93: return 0; nuclear@93: nuclear@93: rootfail: nuclear@93: panic("failed to mount root filesystem: %d\n", -err); nuclear@93: return err; /* unreachable */ nuclear@93: } nuclear@93: nuclear@93: #define PART_TYPE 0xcc nuclear@93: static dev_t find_rootfs(void) nuclear@93: { nuclear@93: dev_t dev = 0; nuclear@93: int i, num_dev, partid; nuclear@93: struct partition *plist, *p; nuclear@93: struct superblock *sb = malloc(BLKSZ); nuclear@93: char name[16]; nuclear@93: nuclear@93: assert(sb); nuclear@93: nuclear@93: num_dev = ata_num_devices(); nuclear@93: for(i=0; istart_sect / 2 + 1, BLKSZ, sb); nuclear@93: nuclear@93: if(sb->magic == MAGIC) { nuclear@93: sprintf(name, "ata%dp%d", i, partid); nuclear@93: printf("found root: %s\n", name); nuclear@93: dev = bdev_by_name(name); nuclear@93: break; nuclear@93: } nuclear@93: } nuclear@93: p = p->next; nuclear@93: partid++; nuclear@93: } nuclear@93: free_part_list(plist); nuclear@93: if(dev) break; nuclear@93: } nuclear@93: nuclear@93: free(sb); nuclear@93: return dev; nuclear@93: }