Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 2e07f62c in mainline for uspace/srv/fs/fat/fat_idx.c


Ignore:
Timestamp:
2010-01-31T18:11:24Z (12 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
1735f3e, 7d6f7d2b
Parents:
ab4bace (diff), 430de97 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge progress from the file system branch allowing FAT to be unmounted.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat_idx.c

    rab4bace r2e07f62c  
    149149{
    150150        dev_handle_t dev_handle = (dev_handle_t)key[UPH_DH_KEY];
    151         fat_cluster_t pfc = (fat_cluster_t)key[UPH_PFC_KEY];
    152         unsigned pdi = (unsigned)key[UPH_PDI_KEY];
     151        fat_cluster_t pfc;
     152        unsigned pdi;
    153153        fat_idx_t *fidx = list_get_instance(item, fat_idx_t, uph_link);
    154154
    155         return (dev_handle == fidx->dev_handle) && (pfc == fidx->pfc) &&
    156             (pdi == fidx->pdi);
     155        switch (keys) {
     156        case 1:
     157                return (dev_handle == fidx->dev_handle);
     158        case 3:
     159                pfc = (fat_cluster_t) key[UPH_PFC_KEY];
     160                pdi = (unsigned) key[UPH_PDI_KEY];
     161                return (dev_handle == fidx->dev_handle) && (pfc == fidx->pfc) &&
     162                    (pdi == fidx->pdi);
     163        default:
     164                assert((keys == 1) || (keys == 3));
     165        }
    157166}
    158167
     
    197206{
    198207        dev_handle_t dev_handle = (dev_handle_t)key[UIH_DH_KEY];
    199         fs_index_t index = (fs_index_t)key[UIH_INDEX_KEY];
     208        fs_index_t index;
    200209        fat_idx_t *fidx = list_get_instance(item, fat_idx_t, uih_link);
    201210
    202         return (dev_handle == fidx->dev_handle) && (index == fidx->index);
     211        switch (keys) {
     212        case 1:
     213                return (dev_handle == fidx->dev_handle);
     214        case 2:
     215                index = (fs_index_t) key[UIH_INDEX_KEY];
     216                return (dev_handle == fidx->dev_handle) &&
     217                    (index == fidx->index);
     218        default:
     219                assert((keys == 1) || (keys == 2));
     220        }
    203221}
    204222
    205223static void idx_remove_callback(link_t *item)
    206224{
    207         /* nothing to do */
     225        fat_idx_t *fidx = list_get_instance(item, fat_idx_t, uih_link);
     226
     227        free(fidx);
    208228}
    209229
     
    486506                [UIH_INDEX_KEY] = idx->index,
    487507        };
     508        dev_handle_t dev_handle = idx->dev_handle;
     509        fs_index_t index = idx->index;
    488510
    489511        assert(idx->pfc == FAT_CLST_RES0);
     
    498520        fibril_mutex_unlock(&used_lock);
    499521        /* Release the VFS index. */
    500         fat_index_free(idx->dev_handle, idx->index);
    501         /* Deallocate the structure. */
    502         free(idx);
     522        fat_index_free(dev_handle, index);
     523        /* The index structure itself is freed in idx_remove_callback(). */
    503524}
    504525
     
    543564void fat_idx_fini_by_dev_handle(dev_handle_t dev_handle)
    544565{
    545         unused_t *u;
    546 
    547         u = unused_find(dev_handle, true);
     566        unsigned long ikey[] = {
     567                [UIH_DH_KEY] = dev_handle
     568        };
     569        unsigned long pkey[] = {
     570                [UPH_DH_KEY] = dev_handle
     571        };
     572
     573        /*
     574         * Remove this instance's index structure from up_hash and ui_hash.
     575         * Process up_hash first and ui_hash second because the index structure
     576         * is actually removed in idx_remove_callback().
     577         */
     578        fibril_mutex_lock(&used_lock);
     579        hash_table_remove(&up_hash, pkey, 1);
     580        hash_table_remove(&ui_hash, ikey, 1);
     581        fibril_mutex_unlock(&used_lock);
     582
     583        /*
     584         * Free the unused and freed structures for this instance.
     585         */
     586        unused_t *u = unused_find(dev_handle, true);
    548587        assert(u);
    549588        list_remove(&u->link);
Note: See TracChangeset for help on using the changeset viewer.