Ignore:
File:
1 edited

Legend:

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

    rf9b2cb4c r4e00f87  
    3737 */
    3838
     39#include "../../srv/vfs/vfs.h"
    3940#include <ipc/loc.h>
    4041#include <ipc/services.h>
    4142#include <errno.h>
     43#include <sys/mman.h>
    4244#include <async.h>
    4345#include <as.h>
     
    5557#include "block.h"
    5658
    57 #define MAX_WRITE_RETRIES 10
    58 
    5959/** Lock protecting the device connection list */
    6060static FIBRIL_MUTEX_INITIALIZE(dcl_lock);
     
    8181        void *bb_buf;
    8282        aoff64_t bb_addr;
    83         aoff64_t pblocks;    /**< Number of physical blocks */
    8483        size_t pblock_size;  /**< Physical block size. */
    8584        cache_t *cache;
     
    9493        fibril_mutex_lock(&dcl_lock);
    9594       
    96         list_foreach(dcl, link, devcon_t, devcon) {
     95        list_foreach(dcl, cur) {
     96                devcon_t *devcon = list_get_instance(cur, devcon_t, link);
    9797                if (devcon->service_id == service_id) {
    9898                        fibril_mutex_unlock(&dcl_lock);
     
    106106
    107107static int devcon_add(service_id_t service_id, async_sess_t *sess,
    108     size_t bsize, aoff64_t dev_size, bd_t *bd)
     108    size_t bsize, bd_t *bd)
    109109{
    110110        devcon_t *devcon;
     
    121121        devcon->bb_addr = 0;
    122122        devcon->pblock_size = bsize;
    123         devcon->pblocks = dev_size;
    124123        devcon->cache = NULL;
    125124       
    126125        fibril_mutex_lock(&dcl_lock);
    127         list_foreach(dcl, link, devcon_t, d) {
     126        list_foreach(dcl, cur) {
     127                devcon_t *d = list_get_instance(cur, devcon_t, link);
    128128                if (d->service_id == service_id) {
    129129                        fibril_mutex_unlock(&dcl_lock);
     
    144144}
    145145
    146 int block_init(service_id_t service_id, size_t comm_size)
     146int block_init(exch_mgmt_t mgmt, service_id_t service_id,
     147    size_t comm_size)
    147148{
    148149        bd_t *bd;
    149150
    150         async_sess_t *sess = loc_service_connect(service_id, INTERFACE_BLOCK,
     151        async_sess_t *sess = loc_service_connect(mgmt, service_id,
    151152            IPC_FLAG_BLOCKING);
    152153        if (!sess) {
     
    167168                return rc;
    168169        }
    169 
    170         aoff64_t dev_size;
    171         rc = bd_get_num_blocks(bd, &dev_size);
     170       
     171        rc = devcon_add(service_id, sess, bsize, bd);
    172172        if (rc != EOK) {
    173173                bd_close(bd);
     
    176176        }
    177177       
    178         rc = devcon_add(service_id, sess, bsize, dev_size, bd);
    179         if (rc != EOK) {
    180                 bd_close(bd);
    181                 async_hangup(sess);
    182                 return rc;
    183         }
    184        
    185178        return EOK;
    186179}
     
    193186        if (devcon->cache)
    194187                (void) block_cache_fini(service_id);
    195        
    196         (void)bd_sync_cache(devcon->bd, 0, 0);
    197188       
    198189        devcon_remove(devcon);
     
    362353        fibril_mutex_initialize(&b->lock);
    363354        b->refcnt = 1;
    364         b->write_failures = 0;
    365355        b->dirty = false;
    366356        b->toxic = false;
     
    387377        block_t *b;
    388378        link_t *link;
    389         aoff64_t p_ba;
     379
    390380        int rc;
    391381       
     
    396386       
    397387        cache = devcon->cache;
    398 
    399         /* Check whether the logical block (or part of it) is beyond
    400          * the end of the device or not.
    401          */
    402         p_ba = ba_ltop(devcon, ba);
    403         p_ba += cache->blocks_cluster;
    404         if (p_ba >= devcon->pblocks) {
    405                 /* This request cannot be satisfied */
    406                 return EIO;
    407         }
    408 
    409388
    410389retry:
     
    483462                                         * another block next time.
    484463                                         */
    485                                         if (b->write_failures < MAX_WRITE_RETRIES) {
    486                                                 b->write_failures++;
    487                                                 fibril_mutex_unlock(&b->lock);
    488                                                 goto retry;
    489                                         } else {
    490                                                 printf("Too many errors writing block %"
    491                                                     PRIuOFF64 "from device handle %" PRIun "\n"
    492                                                     "SEVERE DATA LOSS POSSIBLE\n",
    493                                                     b->lba, devcon->service_id);
    494                                         }
    495                                 } else
    496                                         b->write_failures = 0;
    497 
     464                                        fibril_mutex_unlock(&b->lock);
     465                                        goto retry;
     466                                }
    498467                                b->dirty = false;
    499468                                if (!fibril_mutex_trylock(&cache->lock)) {
     
    612581                rc = write_blocks(devcon, block->pba, cache->blocks_cluster,
    613582                    block->data, block->size);
    614                 if (rc == EOK)
    615                         block->write_failures = 0;
    616583                block->dirty = false;
    617584        }
     
    639606                                 */
    640607                                block->refcnt++;
    641 
    642                                 if (block->write_failures < MAX_WRITE_RETRIES) {
    643                                         block->write_failures++;
    644                                         fibril_mutex_unlock(&block->lock);
    645                                         fibril_mutex_unlock(&cache->lock);
    646                                         goto retry;
    647                                 } else {
    648                                         printf("Too many errors writing block %"
    649                                             PRIuOFF64 "from device handle %" PRIun "\n"
    650                                             "SEVERE DATA LOSS POSSIBLE\n",
    651                                             block->lba, devcon->service_id);
    652                                 }
     608                                fibril_mutex_unlock(&block->lock);
     609                                fibril_mutex_unlock(&cache->lock);
     610                                goto retry;
    653611                        }
    654612                        /*
     
    816774        devcon_t *devcon = devcon_search(service_id);
    817775        assert(devcon);
    818 
     776       
    819777        return bd_get_num_blocks(devcon->bd, nblocks);
    820778}
     
    878836 *
    879837 * @return Allocated TOC structure.
    880  * @return EOK on success or negative error code.
    881  *
    882  */
    883 int block_read_toc(service_id_t service_id, uint8_t session, void *buf,
    884     size_t bufsize)
     838 * @return NULL on failure.
     839 *
     840 */
     841toc_block_t *block_get_toc(service_id_t service_id, uint8_t session)
    885842{
    886843        devcon_t *devcon = devcon_search(service_id);
    887        
    888         assert(devcon);
    889         return bd_read_toc(devcon->bd, session, buf, bufsize);
     844        toc_block_t *toc = NULL;
     845        int rc;
     846       
     847        assert(devcon);
     848       
     849        toc = (toc_block_t *) malloc(sizeof(toc_block_t));
     850        if (toc == NULL)
     851                return NULL;
     852       
     853        rc = bd_read_toc(devcon->bd, session, toc, sizeof(toc_block_t));
     854        if (rc != EOK) {
     855                free(toc);
     856                return NULL;
     857        }
     858       
     859        return toc;
    890860}
    891861
Note: See TracChangeset for help on using the changeset viewer.