Ticket #2089: iso9660.newvfs.diff

File iso9660.newvfs.diff, 13.5 KB (added by dustin howett, 12 years ago)

Aforementioned patch.

  • build/jam/HaikuImage

     
    134134BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
    135135    config_manager agp_gart usb firewire
    136136;
    137 BEOS_ADD_ONS_FILE_SYSTEMS = bfs fat ;
    138 #cdda googlefs iso9660 nfs $(GPL_ONLY)ntfs ;
     137BEOS_ADD_ONS_FILE_SYSTEMS = bfs fat iso9660 ;
     138#cdda googlefs nfs $(GPL_ONLY)ntfs ;
    139139
    140140
    141141# modules
  • src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp

     
    9797
    9898
    9999static status_t
    100 fs_mount(dev_t mountID, const char *device, uint32 flags,
    101     const char *args, void **_volume, ino_t *_rootID)
     100fs_mount(fs_volume *_volume, const char *device, uint32 flags,
     101    const char *args, ino_t *_rootID)
    102102{
    103103    bool allowJoliet = true;
    104104    nspace *volume;
     
    127127    status_t result = ISOMount(device, O_RDONLY, &volume, allowJoliet);
    128128    if (result == B_OK) {
    129129        *_rootID = ISO_ROOTNODE_ID;
    130         *_volume = volume;
    131130
    132         volume->id = mountID;
     131        _volume->private_volume = volume;
     132        _volume->ops = &sISO9660VolumeOps;
     133        volume->volume = _volume;
     134        volume->id = _volume->id;
    133135
    134         result = publish_vnode(mountID, *_rootID, &volume->rootDirRec);
     136        result = publish_vnode(_volume, *_rootID, &volume->rootDirRec,
     137            &sISO9660VnodeOps, volume->rootDirRec.attr.stat[FS_DATA_FORMAT].st_mode, 0);
    135138        if (result != B_OK) {
    136139            block_cache_delete(volume->fBlockCache, false);
    137140            free(volume);
     
    143146
    144147
    145148static status_t
    146 fs_unmount(void *_ns)
     149fs_unmount(fs_volume *_vol)
    147150{
    148151    status_t result = B_NO_ERROR;
    149     nspace *ns = (nspace *)_ns;
     152    nspace *ns = (nspace *)_vol->private_volume;
    150153
    151154    TRACE(("fs_unmount - ENTER\n"));
    152155
    153156    // Unlike in BeOS, we need to put the reference to our root node ourselves
    154     put_vnode(ns->id, ISO_ROOTNODE_ID);
     157    put_vnode(_vol, ISO_ROOTNODE_ID);
    155158
    156159    block_cache_delete(ns->fBlockCache, false);
    157160    close(ns->fdOfSession);
     
    165168
    166169
    167170static status_t
    168 fs_read_fs_stat(void *_ns, struct fs_info *fss)
     171fs_read_fs_stat(fs_volume *_vol, struct fs_info *fss)
    169172{
    170     nspace *ns = (nspace *)_ns;
     173    nspace *ns = (nspace *)_vol->private_volume;
    171174    int i;
    172175
    173176    fss->flags = B_FS_IS_PERSISTENT | B_FS_IS_READONLY;
     
    195198
    196199
    197200static status_t
    198 fs_get_vnode_name(void *ns, void *_node, char *buffer, size_t bufferSize)
     201fs_get_vnode_name(fs_volume *_vol, fs_vnode *_node, char *buffer, size_t bufferSize)
    199202{
    200     vnode *node = (vnode*)_node;
     203    vnode *node = (vnode*)_node->private_node;
    201204
    202205    strlcpy(buffer, node->fileIDString, bufferSize);
    203206    return B_OK;
     
    205208
    206209
    207210static status_t
    208 fs_walk(void *_ns, void *base, const char *file, ino_t *_vnodeID, int *_type)
     211fs_walk(fs_volume *_vol, fs_vnode *_base, const char *file, ino_t *_vnodeID)
    209212{
    210     nspace *ns = (nspace *)_ns;
    211     vnode *baseNode = (vnode*)base;
     213    nspace *ns = (nspace *)_vol->private_volume;
     214    vnode *baseNode = (vnode*)_base->private_node;
    212215    vnode *newNode = NULL;
    213216
    214217    TRACE(("fs_walk - looking for %s in dir file of length %d\n", file,
     
    218221        // base directory
    219222        TRACE(("fs_walk - found \".\" file.\n"));
    220223        *_vnodeID = baseNode->id;
    221         *_type = S_IFDIR;
    222         return get_vnode(ns->id, *_vnodeID, (void **)&newNode);
     224        return get_vnode(_vol, *_vnodeID, (void **)&newNode);
    223225    } else if (strcmp(file, "..") == 0) {
    224226        // parent directory
    225227        TRACE(("fs_walk - found \"..\" file.\n"));
    226228        *_vnodeID = baseNode->parID;
    227         *_type = S_IFDIR;
    228         return get_vnode(ns->id, *_vnodeID, (void **)&newNode);
     229        return get_vnode(_vol, *_vnodeID, (void **)&newNode);
    229230    }
    230231
    231232    // look up file in the directory
     
    269270                            + (blockBytesRead & 0xffffffff);
    270271                        TRACE(("fs_walk - New vnode id is %Ld\n", *_vnodeID));
    271272
    272                         result = get_vnode(ns->id, *_vnodeID,
     273                        result = get_vnode(_vol, *_vnodeID,
    273274                            (void **)&newNode);
    274275                        if (result == B_OK) {
    275276                            newNode->parID = baseNode->id;
     
    302303            done = TRUE;
    303304    }
    304305
    305     if (newNode)
    306         *_type = newNode->attr.stat[FS_DATA_FORMAT].st_mode;
    307 
    308306    TRACE(("fs_walk - EXIT, result is %s, vnid is %Lu\n",
    309307        strerror(result), *_vnodeID));
    310308    return result;
     
    312310
    313311
    314312static status_t
    315 fs_read_vnode(void *_ns, ino_t vnodeID, void **_node, bool reenter)
     313fs_read_vnode(fs_volume *_vol, ino_t vnodeID, fs_vnode *_node,
     314    int *_type, uint32 *_flags, bool reenter)
    316315{
    317     nspace *ns = (nspace*)_ns;
     316    nspace *ns = (nspace*)_vol->private_volume;
    318317
    319318    vnode *newNode = (vnode*)calloc(sizeof(vnode), 1);
    320319    if (newNode == NULL)
     
    345344    }
    346345   
    347346    newNode->id = vnodeID;
    348     *_node = (void *)newNode;
     347    _node->private_node = newNode;
     348    _node->ops = &sISO9660VnodeOps;
     349    *_type = newNode->attr.stat[FS_DATA_FORMAT].st_mode & ~(S_IWUSR | S_IWGRP | S_IWOTH);
     350    *_flags = 0;
    349351
    350352    if ((newNode->flags & ISO_ISDIR) == 0) {
    351353        newNode->cache = file_cache_create(ns->id, vnodeID,
     
    357359
    358360
    359361static status_t
    360 fs_release_vnode(void *ns, void *_node, bool reenter)
     362fs_release_vnode(fs_volume *_vol, fs_vnode *_node, bool reenter)
    361363{
    362364    status_t result = B_NO_ERROR;
    363     vnode *node = (vnode*)_node;
     365    vnode *node = (vnode*)_node->private_node;
    364366
    365     (void)ns;
     367    (void)_vol;
    366368    (void)reenter;
    367369
    368370    TRACE(("fs_release_vnode - ENTER (0x%x)\n", node));
     
    386388
    387389
    388390static status_t
    389 fs_read_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
     391fs_read_pages(fs_volume *_vol, fs_vnode *_node, void * _cookie, off_t pos,
    390392    const iovec *vecs, size_t count, size_t *_numBytes, bool reenter)
    391393{
    392     nspace *ns = (nspace *)_fs;
    393     vnode *node = (vnode *)_node;
     394    nspace *ns = (nspace *)_vol->private_volume;
     395    vnode *node = (vnode *)_node->private_node;
    394396
    395397    uint32 fileSize = node->dataLen[FS_DATA_FORMAT];
    396398    size_t bytesLeft = *_numBytes;
     
    417419
    418420
    419421static status_t
    420 fs_read_stat(void *_ns, void *_node, struct stat *st)
     422fs_read_stat(fs_volume *_vol, fs_vnode *_node, struct stat *st)
    421423{
    422     nspace *ns = (nspace*)_ns;
    423     vnode *node = (vnode*)_node;
     424    nspace *ns = (nspace*)_vol->private_volume;
     425    vnode *node = (vnode*)_node->private_node;
    424426    status_t result = B_NO_ERROR;
    425427    time_t time;
    426428
     
    446448
    447449
    448450static status_t
    449 fs_open(void *_ns, void *_node, int omode, void **cookie)
     451fs_open(fs_volume *_vol, fs_vnode *_node, int omode, void **cookie)
    450452{
    451453    status_t result = B_NO_ERROR;
    452454
    453     (void)_ns;
     455    (void)_vol;
    454456    (void)cookie;
    455457
    456458    // Do not allow any of the write-like open modes to get by
     
    464466
    465467
    466468static status_t
    467 fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buffer,
     469fs_read(fs_volume *_vol, fs_vnode *_node, void *cookie, off_t pos, void *buffer,
    468470    size_t *_length)
    469471{
    470     vnode *node = (vnode *)_node;
     472    vnode *node = (vnode *)_node->private_node;
    471473
    472474    if (node->flags & ISO_ISDIR)
    473475        return EISDIR;
     
    487489
    488490
    489491static status_t
    490 fs_close(void *ns, void *node, void *cookie)
     492fs_close(fs_volume *_vol, fs_vnode *_node, void *cookie)
    491493{
    492     (void)ns;
    493     (void)node;
     494    (void)_vol;
     495    (void)_node;
    494496    (void)cookie;
    495497
    496498    return B_OK;
     
    498500
    499501
    500502static status_t
    501 fs_free_cookie(void *ns, void *node, void *cookie)
     503fs_free_cookie(fs_volume *_vol, fs_vnode *_node, void *cookie)
    502504{
    503     (void)ns;
    504     (void)node;
     505    (void)_vol;
     506    (void)_node;
    505507    (void)cookie;
    506508
    507509    return B_OK;
     
    509511
    510512
    511513static status_t
    512 fs_access(void *ns, void *node, int mode)
     514fs_access(fs_volume *_vol, fs_vnode *_node, int mode)
    513515{
    514     (void)ns;
    515     (void)node;
     516    (void)_vol;
     517    (void)_node;
    516518    (void)mode;
    517519
    518520    return B_OK;
     
    520522
    521523
    522524static status_t
    523 fs_read_link(void */*_volume*/, void *_node, char *buffer, size_t *_bufferSize)
     525fs_read_link(fs_volume *_vol, fs_vnode *_node, char *buffer, size_t *_bufferSize)
    524526{
    525     vnode *node = (vnode *)_node;
     527    vnode *node = (vnode *)_node->private_node;
    526528
    527529    if (!S_ISLNK(node->attr.stat[FS_DATA_FORMAT].st_mode))
    528530        return B_BAD_VALUE;
     
    540542
    541543
    542544static status_t
    543 fs_open_dir(void *_ns, void *_node, void **cookie)
     545fs_open_dir(fs_volume *_vol, fs_vnode *_node, void **cookie)
    544546{
    545     vnode *node = (vnode *)_node;
     547    vnode *node = (vnode *)_node->private_node;
    546548
    547549    TRACE(("fs_open_dir - node is 0x%x\n", _node));
    548550
     
    565567
    566568
    567569static status_t
    568 fs_read_dir(void *_ns, void *_node, void *_cookie, struct dirent *buffer,
     570fs_read_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie, struct dirent *buffer,
    569571    size_t bufferSize, uint32 *num)
    570572{
    571     nspace *ns = (nspace *)_ns;
     573    nspace *ns = (nspace *)_vol->private_volume;
    572574    dircookie *dirCookie = (dircookie *)_cookie;
    573575
    574576    TRACE(("fs_read_dir - ENTER\n"));
     
    593595           
    594596
    595597static status_t
    596 fs_rewind_dir(void *ns, void *node, void* _cookie)
     598fs_rewind_dir(fs_volume *_vol, fs_vnode *_node, void* _cookie)
    597599{
    598600    dircookie *cookie = (dircookie*)_cookie;
    599601
     
    604606
    605607
    606608static status_t
    607 fs_close_dir(void *ns, void *node, void *cookie)
     609fs_close_dir(fs_volume *_vol, fs_vnode *_node, void *cookie)
    608610{
    609611    return B_OK;
    610612}
    611613
    612614
    613615static status_t
    614 fs_free_dir_cookie(void *ns, void *node, void *cookie)
     616fs_free_dir_cookie(fs_volume *_vol, fs_vnode *_node, void *cookie)
    615617{
    616618    free(cookie);
    617619    return B_OK;
     
    634636}
    635637
    636638
    637 static file_system_module_info sISO660FileSystem = {
    638     {
    639         "file_systems/iso9660" B_CURRENT_FS_API_VERSION,
    640         0,
    641         iso_std_ops,
    642     },
     639fs_volume_ops sISO9660VolumeOps = {
     640    &fs_unmount,
     641    &fs_read_fs_stat,
     642    NULL,
     643    NULL,
     644    &fs_read_vnode,
    643645
    644     "ISO9660 File System",
    645     0,  // DDM flags
     646    /* index and index directory ops */
     647    NULL,
     648    NULL,
     649    NULL,
     650    NULL,
     651    NULL,
     652    NULL,
     653    NULL,
     654    NULL,
    646655
    647     // scanning
    648     fs_identify_partition,
    649     fs_scan_partition,
    650     fs_free_identify_partition_cookie,
    651     NULL,   // free_partition_content_cookie()
     656    /* query ops */
     657    NULL,
     658    NULL,
     659    NULL,
     660    NULL,
     661    NULL,
    652662
    653     &fs_mount,
    654     &fs_unmount,
    655     &fs_read_fs_stat,
     663    /* FS layer ops */
    656664    NULL,
    657665    NULL,
     666};
    658667
    659     /* vnode operations */
     668fs_vnode_ops sISO9660VnodeOps = {
    660669    &fs_walk,
    661670    &fs_get_vnode_name,
    662     &fs_read_vnode,
    663671    &fs_release_vnode,
    664     NULL,   // fs_remove_vnode()
     672    NULL,
    665673
    666     /* VM file access */
    667     NULL,   // fs_can_page
     674    /* vm-related ops */
     675    NULL,
    668676    &fs_read_pages,
    669     NULL,   // fs_write_pages
     677    NULL,
    670678
    671     NULL,   // fs_get_file_map
     679    /* cache file access */
     680    NULL,
    672681
    673     NULL,   // fs_ioctl
    674     NULL,   // fs_set_flags
    675     NULL,   // fs_select
    676     NULL,   // fs_deselect
    677     NULL,   // fs_fsync
    678 
     682    /* common */
     683    NULL,
     684    NULL,
     685    NULL,
     686    NULL,
     687    NULL,
    679688    &fs_read_link,
    680     NULL,   // fs_create_symlink
    681 
    682     NULL,   // fs_link,
    683     NULL,   // fs_unlink
    684     NULL,   // fs_rename
    685 
     689    NULL,
     690    NULL,
     691    NULL,
     692    NULL,
    686693    &fs_access,
    687694    &fs_read_stat,
    688     NULL,   // fs_write_stat
     695    NULL,
    689696
    690     /* file operations */
    691     NULL,   // fs_create
     697    /* file */
     698    NULL,
    692699    &fs_open,
    693700    &fs_close,
    694701    &fs_free_cookie,
    695702    &fs_read,
    696     NULL,   // fs_write
     703    NULL,
    697704
    698     /* directory operations */
    699     NULL,   // fs_create_dir
    700     NULL,   // fs_remove_dir
     705    /* dir */
     706    NULL,
     707    NULL,
    701708    &fs_open_dir,
    702709    &fs_close_dir,
    703710    &fs_free_dir_cookie,
    704711    &fs_read_dir,
    705712    &fs_rewind_dir,
    706    
    707     /* attribute directory operations */
    708     NULL,   // fs_open_attr_dir
    709     NULL,   // fs_close_attr_dir
    710     NULL,   // fs_free_attr_dir_cookie
    711     NULL,   // fs_read_attr_dir
    712     NULL,   // fs_rewind_attr_dir
    713713
    714     /* attribute operations */
    715     NULL,   // fs_create_attr
    716     NULL,   // fs_open_attr
    717     NULL,   // fs_close_attr
    718     NULL,   // fs_free_attr_cookie
    719     NULL,   // fs_read_attr
    720     NULL,   // fs_write_attr
     714    /* attribute directory ops */
     715    NULL,
     716    NULL,
     717    NULL,
     718    NULL,
     719    NULL,
    721720
    722     NULL,   // fs_read_attr_stat
    723     NULL,   // fs_write_attr_stat
    724     NULL,   // fs_rename_attr
    725     NULL,   // fs_remove_attr
     721    /* attribute ops */
     722    NULL,
     723    NULL,
     724    NULL,
     725    NULL,
     726    NULL,
     727    NULL,
     728    NULL,
     729    NULL,
     730    NULL,
     731    NULL,
    726732
    727     /* index directory & index operations */
    728     NULL,   // fs_open_index_dir
    729     NULL,   // fs_close_index_dir
    730     NULL,   // fs_free_index_dir_cookie
    731     NULL,   // fs_read_index_dir
    732     NULL,   // fs_rewind_index_dir
     733    /* node and FS layer support */
     734    NULL,
     735    NULL,
     736};
    733737
    734     NULL,   // fs_create_index
    735     NULL,   // fs_remove_index
    736     NULL,   // fs_stat_index
     738static file_system_module_info sISO660FileSystem = {
     739    {
     740        "file_systems/iso9660" B_CURRENT_FS_API_VERSION,
     741        0,
     742        iso_std_ops,
     743    },
    737744
    738     /* query operations */
    739     NULL,   // fs_open_query
    740     NULL,   // fs_close_query
    741     NULL,   // fs_free_query_cookie
    742     NULL,   // fs_read_query
    743     NULL,   // fs_rewind_query
     745    "ISO9660 File System",
     746    0,  // DDM flags
     747
     748    // scanning
     749    fs_identify_partition,
     750    fs_scan_partition,
     751    fs_free_identify_partition_cookie,
     752    NULL,   // free_partition_content_cookie()
     753
     754    &fs_mount,
     755
     756    /* capability querying */
     757    NULL,
     758    NULL,
     759    NULL,
     760    NULL,
     761    NULL,
     762    NULL,
     763
     764    /* shadow partition modifications */
     765    NULL,
     766
     767    /* writing */
     768    NULL,
     769    NULL,
     770    NULL,
     771    NULL,
     772    NULL,
     773    NULL,
     774    NULL,
    744775};
    745776
    746777module_info *modules[] = {
  • src/add-ons/kernel/file_systems/iso9660/iso9660.h

     
    165165
    166166typedef struct nspace {
    167167    // Start of members other drivers will definitely want.
    168     dev_t           id;             // ID passed in to fs_mount
     168    fs_volume       *volume;            // volume passed fo fs_mount
     169    dev_t           id;
    169170    int             fd;             // File descriptor
    170171    int             fdOfSession;    // File descriptor of the (mounted) session
    171172    //unsigned int  blockSize;      // usually need this, but it's part of ISO
     
    220221    uint8           fileStructVers;     // File structure version                               byte882
    221222} nspace;
    222223
     224extern fs_volume_ops sISO9660VolumeOps;
     225extern fs_vnode_ops sISO9660VnodeOps;
     226
    223227#ifdef __cplusplus
    224228extern "C" {
    225229#endif