Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/block/libblock.c

    r96b02eb9 r5716e9a  
    4444#include <sys/mman.h>
    4545#include <async.h>
    46 #include <ipc/ipc.h>
    4746#include <as.h>
    4847#include <assert.h>
     
    177176        if (rc != EOK) {
    178177                munmap(comm_area, comm_size);
    179                 ipc_hangup(dev_phone);
     178                async_hangup(dev_phone);
    180179                return rc;
    181180        }
     
    183182        if (get_block_size(dev_phone, &bsize) != EOK) {
    184183                munmap(comm_area, comm_size);
    185                 ipc_hangup(dev_phone);
     184                async_hangup(dev_phone);
    186185                return rc;
    187186        }
     
    190189        if (rc != EOK) {
    191190                munmap(comm_area, comm_size);
    192                 ipc_hangup(dev_phone);
     191                async_hangup(dev_phone);
    193192                return rc;
    194193        }
     
    211210
    212211        munmap(devcon->comm_area, devcon->comm_size);
    213         ipc_hangup(devcon->dev_phone);
     212        async_hangup(devcon->dev_phone);
    214213
    215214        free(devcon);   
     
    295294
    296295        /* Allow 1:1 or small-to-large block size translation */
    297         if (cache->lblock_size % devcon->pblock_size != 0)
     296        if (cache->lblock_size % devcon->pblock_size != 0) {
     297                free(cache);
    298298                return ENOTSUP;
     299        }
    299300
    300301        cache->blocks_cluster = cache->lblock_size / devcon->pblock_size;
     
    410411        l = hash_table_find(&cache->block_hash, &key);
    411412        if (l) {
     413found:
    412414                /*
    413415                 * We found the block in the cache.
     
    437439                        if (!b->data) {
    438440                                free(b);
     441                                b = NULL;
    439442                                goto recycle;
    440443                        }
     
    492495                                        goto retry;
    493496                                }
     497                                l = hash_table_find(&cache->block_hash, &key);
     498                                if (l) {
     499                                        /*
     500                                         * Someone else must have already
     501                                         * instantiated the block while we were
     502                                         * not holding the cache lock.
     503                                         * Leave the recycled block on the
     504                                         * freelist and continue as if we
     505                                         * found the block of interest during
     506                                         * the first try.
     507                                         */
     508                                        fibril_mutex_unlock(&b->lock);
     509                                        goto found;
     510                                }
    494511
    495512                        }
     
    564581        assert(devcon);
    565582        assert(devcon->cache);
     583        assert(block->refcnt >= 1);
    566584
    567585        cache = devcon->cache;
     
    623641                        unsigned long key = block->lba;
    624642                        hash_table_remove(&cache->block_hash, &key, 1);
     643                        fibril_mutex_unlock(&block->lock);
     644                        free(block->data);
    625645                        free(block);
    626                         free(block->data);
    627646                        cache->blocks_cached--;
    628647                        fibril_mutex_unlock(&cache->lock);
Note: See TracChangeset for help on using the changeset viewer.