Changeset 15d0046 in mainline for uspace/lib/block/block.c


Ignore:
Timestamp:
2014-09-12T13:22:33Z (10 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9b20126
Parents:
8db09e4 (diff), 105d8d6 (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 mainline changes

File:
1 edited

Legend:

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

    r8db09e4 r15d0046  
    5555#include "block.h"
    5656
     57#define MAX_WRITE_RETRIES 10
     58
    5759/** Lock protecting the device connection list */
    5860static FIBRIL_MUTEX_INITIALIZE(dcl_lock);
     
    7981        void *bb_buf;
    8082        aoff64_t bb_addr;
     83        aoff64_t pblocks;    /**< Number of physical blocks */
    8184        size_t pblock_size;  /**< Physical block size. */
    8285        cache_t *cache;
     
    103106
    104107static int devcon_add(service_id_t service_id, async_sess_t *sess,
    105     size_t bsize, bd_t *bd)
     108    size_t bsize, aoff64_t dev_size, bd_t *bd)
    106109{
    107110        devcon_t *devcon;
     
    118121        devcon->bb_addr = 0;
    119122        devcon->pblock_size = bsize;
     123        devcon->pblocks = dev_size;
    120124        devcon->cache = NULL;
    121125       
     
    164168                return rc;
    165169        }
    166        
    167         rc = devcon_add(service_id, sess, bsize, bd);
     170
     171        aoff64_t dev_size;
     172        rc = bd_get_num_blocks(bd, &dev_size);
    168173        if (rc != EOK) {
    169174                bd_close(bd);
     
    172177        }
    173178       
     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       
    174186        return EOK;
    175187}
     
    182194        if (devcon->cache)
    183195                (void) block_cache_fini(service_id);
     196       
     197        (void)bd_sync_cache(devcon->bd, 0, 0);
    184198       
    185199        devcon_remove(devcon);
     
    349363        fibril_mutex_initialize(&b->lock);
    350364        b->refcnt = 1;
     365        b->write_failures = 0;
    351366        b->dirty = false;
    352367        b->toxic = false;
     
    373388        block_t *b;
    374389        link_t *link;
    375 
     390        aoff64_t p_ba;
    376391        int rc;
    377392       
     
    382397       
    383398        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
    384410
    385411retry:
     
    458484                                         * another block next time.
    459485                                         */
    460                                         fibril_mutex_unlock(&b->lock);
    461                                         goto retry;
    462                                 }
     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
    463499                                b->dirty = false;
    464500                                if (!fibril_mutex_trylock(&cache->lock)) {
     
    577613                rc = write_blocks(devcon, block->pba, cache->blocks_cluster,
    578614                    block->data, block->size);
     615                if (rc == EOK)
     616                        block->write_failures = 0;
    579617                block->dirty = false;
    580618        }
     
    602640                                 */
    603641                                block->refcnt++;
    604                                 fibril_mutex_unlock(&block->lock);
    605                                 fibril_mutex_unlock(&cache->lock);
    606                                 goto retry;
     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                                }
    607654                        }
    608655                        /*
     
    770817        devcon_t *devcon = devcon_search(service_id);
    771818        assert(devcon);
    772        
     819
    773820        return bd_get_num_blocks(devcon->bd, nblocks);
    774821}
     
    832879 *
    833880 * @return Allocated TOC structure.
    834  * @return NULL on failure.
    835  *
    836  */
    837 toc_block_t *block_get_toc(service_id_t service_id, uint8_t session)
     881 * @return EOK on success or negative error code.
     882 *
     883 */
     884int block_read_toc(service_id_t service_id, uint8_t session, void *buf,
     885    size_t bufsize)
    838886{
    839887        devcon_t *devcon = devcon_search(service_id);
    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;
     888       
     889        assert(devcon);
     890        return bd_read_toc(devcon->bd, session, buf, bufsize);
    856891}
    857892
Note: See TracChangeset for help on using the changeset viewer.