X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/a36758a5018f6a3792c164cd2a313d4f61b7111e..cbc8fdbfe473e23e19690204418e19999a9522d1:/lunaix-os/kernel/fs/iso9660/mount.c diff --git a/lunaix-os/kernel/fs/iso9660/mount.c b/lunaix-os/kernel/fs/iso9660/mount.c index 5d7bb81..aeb6e3b 100644 --- a/lunaix-os/kernel/fs/iso9660/mount.c +++ b/lunaix-os/kernel/fs/iso9660/mount.c @@ -1,23 +1,29 @@ #include -#include -#include +#include #include +#include #include -#include +#include "iso9660.h" struct cake_pile* drec_cache_pile; extern void iso9660_init_inode(struct v_superblock* vsb, struct v_inode* inode); -uint32_t -iso9660_rd_capacity(struct v_superblock* vsb) +static size_t +__iso9660_rd_capacity(struct v_superblock* vsb) { struct iso_superblock* isovsb = (struct iso_superblock*)vsb->data; return isovsb->volume_size; } +static void +__vsb_release(struct v_superblock* vsb) +{ + vfree(vsb->data); +} + int iso9660_mount(struct v_superblock* vsb, struct v_dnode* mount_point) { @@ -27,7 +33,7 @@ iso9660_mount(struct v_superblock* vsb, struct v_dnode* mount_point) u32_t lba = 16; int errno = 0; do { - errno = dev->read(dev, vdesc, ISO9660_BLKSZ * lba, ISO9660_BLKSZ); + errno = dev->ops.read(dev, vdesc, ISO9660_BLKSZ * lba, ISO9660_BLKSZ); if (errno < 0) { errno = EIO; goto done; @@ -54,11 +60,13 @@ iso9660_mount(struct v_superblock* vsb, struct v_dnode* mount_point) vsb->data = isovsb; vsb->ops.init_inode = iso9660_init_inode; - vsb->ops.read_capacity = iso9660_rd_capacity; + vsb->ops.read_capacity = __iso9660_rd_capacity; + vsb->ops.release = __vsb_release; + vsb->blksize = ISO9660_BLKSZ; struct v_inode* rootino = vfs_i_alloc(vsb); - struct iso_drecord* dir = - iso9660_get_drecord((struct iso_var_mdu*)vprim->root_record); + struct iso_var_mdu* mdu = (struct iso_var_mdu*)vprim->root_record; + struct iso_drecord* dir = iso9660_get_drecord(mdu); if (!dir) { vfree(isovsb); @@ -67,7 +75,7 @@ iso9660_mount(struct v_superblock* vsb, struct v_dnode* mount_point) } struct iso_drecache drecache; - iso9660_fill_drecache(&drecache, dir); + iso9660_fill_drecache(&drecache, dir, mdu->len); if ((errno = iso9660_fill_inode(rootino, &drecache, 0)) < 0) { vfree(isovsb); @@ -89,22 +97,24 @@ done: return errno; } + + int iso9660_unmount(struct v_superblock* vsb) { - // TODO clean up + return 0; } void iso9660_init() { + struct filesystem* fs; + fs = fsapi_fs_declare("iso9660", FSTYPE_ROFS); + + fsapi_fs_set_mntops(fs, iso9660_mount, iso9660_unmount); + fsapi_fs_finalise(fs); + drec_cache_pile = cake_new_pile("iso_drec", sizeof(struct iso_drecache), 1, 0); - - struct filesystem* fs = fsm_new_fs("iso9660", -1); - fs->types |= FSTYPE_ROFS; - fs->mount = iso9660_mount; - fs->unmount = iso9660_unmount; - - fsm_register(fs); -} \ No newline at end of file +} +EXPORT_FILE_SYSTEM(iso9660, iso9660_init); \ No newline at end of file