Ignore:
File:
1 edited

Legend:

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

    rdd8b6a8 r2463df9  
    5555#include "block.h"
    5656
    57 #define MAX_WRITE_RETRIES 10
    58 
    5957/** Lock protecting the device connection list */
    6058static FIBRIL_MUTEX_INITIALIZE(dcl_lock);
     
    8179        void *bb_buf;
    8280        aoff64_t bb_addr;
    83         aoff64_t pblocks;    /**< Number of physical blocks */
    8481        size_t pblock_size;  /**< Physical block size. */
    8582        cache_t *cache;
     
    106103
    107104static int devcon_add(service_id_t service_id, async_sess_t *sess,
    108     size_t bsize, aoff64_t dev_size, bd_t *bd)
     105    size_t bsize, bd_t *bd)
    109106{
    110107        devcon_t *devcon;
     
    121118        devcon->bb_addr = 0;
    122119        devcon->pblock_size = bsize;
    123         devcon->pblocks = dev_size;
    124120        devcon->cache = NULL;
    125121       
     
    168164                return rc;
    169165        }
    170 
    171         aoff64_t dev_size;
    172         rc = bd_get_num_blocks(bd, &dev_size);
     166       
     167        rc = devcon_add(service_id, sess, bsize, bd);
    173168        if (rc != EOK) {
    174169                bd_close(bd);
     
    177172        }
    178173       
    179         rc = devcon_add(service_id, sess, bsize, dev_size, bd);
    180         if (rc != EOK) {
    181                 bd_close(bd);
    182                 async_hangup(sess);
    183                 return rc;
    184         }
    185        
    186174        return EOK;
    187175}
     
    194182        if (devcon->cache)
    195183                (void) block_cache_fini(service_id);
    196        
    197         (void)bd_sync_cache(devcon->bd, 0, 0);
    198184       
    199185        devcon_remove(devcon);
     
    363349        fibril_mutex_initialize(&b->lock);
    364350        b->refcnt = 1;
    365         b->write_failures = 0;
    366351        b->dirty = false;
    367352        b->toxic = false;
     
    388373        block_t *b;
    389374        link_t *link;
    390         aoff64_t p_ba;
     375
    391376        int rc;
    392377       
     
    397382       
    398383        cache = devcon->cache;
    399 
    400         /* Check whether the logical block (or part of it) is beyond
    401          * the end of the device or not.
    402          */
    403         p_ba = ba_ltop(devcon, ba);
    404         p_ba += cache->blocks_cluster;
    405         if (p_ba >= devcon->pblocks) {
    406                 /* This request cannot be satisfied */
    407                 return EIO;
    408         }
    409 
    410384
    411385retry:
     
    484458                                         * another block next time.
    485459                                         */
    486                                         if (b->write_failures < MAX_WRITE_RETRIES) {
    487                                                 b->write_failures++;
    488                                                 fibril_mutex_unlock(&b->lock);
    489                                                 goto retry;
    490                                         } else {
    491                                                 printf("Too many errors writing block %"
    492                                                     PRIuOFF64 "from device handle %" PRIun "\n"
    493                                                     "SEVERE DATA LOSS POSSIBLE\n",
    494                                                     b->lba, devcon->service_id);
    495                                         }
    496                                 } else
    497                                         b->write_failures = 0;
    498 
     460                                        fibril_mutex_unlock(&b->lock);
     461                                        goto retry;
     462                                }
    499463                                b->dirty = false;
    500464                                if (!fibril_mutex_trylock(&cache->lock)) {
     
    613577                rc = write_blocks(devcon, block->pba, cache->blocks_cluster,
    614578                    block->data, block->size);
    615                 if (rc == EOK)
    616                         block->write_failures = 0;
    617579                block->dirty = false;
    618580        }
     
    640602                                 */
    641603                                block->refcnt++;
    642 
    643                                 if (block->write_failures < MAX_WRITE_RETRIES) {
    644                                         block->write_failures++;
    645                                         fibril_mutex_unlock(&block->lock);
    646                                         fibril_mutex_unlock(&cache->lock);
    647                                         goto retry;
    648                                 } else {
    649                                         printf("Too many errors writing block %"
    650                                             PRIuOFF64 "from device handle %" PRIun "\n"
    651                                             "SEVERE DATA LOSS POSSIBLE\n",
    652                                             block->lba, devcon->service_id);
    653                                 }
     604                                fibril_mutex_unlock(&block->lock);
     605                                fibril_mutex_unlock(&cache->lock);
     606                                goto retry;
    654607                        }
    655608                        /*
     
    817770        devcon_t *devcon = devcon_search(service_id);
    818771        assert(devcon);
    819 
     772       
    820773        return bd_get_num_blocks(devcon->bd, nblocks);
    821774}
     
    879832 *
    880833 * @return Allocated TOC structure.
    881  * @return EOK on success or negative error code.
    882  *
    883  */
    884 int block_read_toc(service_id_t service_id, uint8_t session, void *buf,
    885     size_t bufsize)
     834 * @return NULL on failure.
     835 *
     836 */
     837toc_block_t *block_get_toc(service_id_t service_id, uint8_t session)
    886838{
    887839        devcon_t *devcon = devcon_search(service_id);
    888        
    889         assert(devcon);
    890         return bd_read_toc(devcon->bd, session, buf, bufsize);
     840        toc_block_t *toc = NULL;
     841        int rc;
     842       
     843        assert(devcon);
     844       
     845        toc = (toc_block_t *) malloc(sizeof(toc_block_t));
     846        if (toc == NULL)
     847                return NULL;
     848       
     849        rc = bd_read_toc(devcon->bd, session, toc, sizeof(toc_block_t));
     850        if (rc != EOK) {
     851                free(toc);
     852                return NULL;
     853        }
     854       
     855        return toc;
    891856}
    892857
Note: See TracChangeset for help on using the changeset viewer.