1 #include <lunaix/block.h>
2 #include <lunaix/fs/api.h>
3 #include <lunaix/mm/valloc.h>
4 #include <lunaix/mm/cake.h>
5 #include <lunaix/spike.h>
9 struct cake_pile* drec_cache_pile;
12 iso9660_init_inode(struct v_superblock* vsb, struct v_inode* inode);
15 __iso9660_rd_capacity(struct v_superblock* vsb)
17 struct iso_superblock* isovsb = (struct iso_superblock*)vsb->data;
18 return isovsb->volume_size;
22 __vsb_release(struct v_superblock* vsb)
28 iso9660_mount(struct v_superblock* vsb, struct v_dnode* mount_point)
30 struct device* dev = vsb->dev;
31 struct iso_vol* vdesc = (struct iso_vol*)valloc(ISO9660_BLKSZ);
32 struct iso_vol_primary* vprim = NULL;
36 errno = dev->ops.read(dev, vdesc, ISO9660_BLKSZ * lba, ISO9660_BLKSZ);
41 if (*(u32_t*)vdesc->std_id != ISO_SIGNATURE_LO) {
45 if (vdesc->type == ISO_VOLPRIM) {
46 vprim = (struct iso_vol_primary*)vdesc;
50 } while (vdesc->type != ISO_VOLTERM);
57 struct iso_superblock* isovsb = valloc(sizeof(*isovsb));
58 isovsb->lb_size = vprim->lb_size.le;
59 isovsb->volume_size = vprim->vol_size.le * isovsb->lb_size;
62 vsb->ops.init_inode = iso9660_init_inode;
63 vsb->ops.read_capacity = __iso9660_rd_capacity;
64 vsb->ops.release = __vsb_release;
65 vsb->blksize = ISO9660_BLKSZ;
67 struct v_inode* rootino = vfs_i_alloc(vsb);
68 struct iso_var_mdu* mdu = (struct iso_var_mdu*)vprim->root_record;
69 struct iso_drecord* dir = iso9660_get_drecord(mdu);
77 struct iso_drecache drecache;
78 iso9660_fill_drecache(&drecache, dir, mdu->len);
80 if ((errno = iso9660_fill_inode(rootino, &drecache, 0)) < 0) {
86 if ((errno = iso9660_setup_dnode(mount_point, rootino)) < 0) {
92 vfs_i_addhash(rootino);
103 iso9660_unmount(struct v_superblock* vsb)
111 struct filesystem* fs;
112 fs = fsapi_fs_declare("iso9660", FSTYPE_ROFS);
114 fsapi_fs_set_mntops(fs, iso9660_mount, iso9660_unmount);
115 fsapi_fs_finalise(fs);
118 cake_new_pile("iso_drec", sizeof(struct iso_drecache), 1, 0);
120 EXPORT_FILE_SYSTEM(iso9660, iso9660_init);