Changeset 6284978 in mainline for uspace/lib/libblock/libblock.c


Ignore:
Timestamp:
2008-11-02T10:21:31Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0c243b4
Parents:
2953f9a
Message:

Separate the block_init() phase from reading of the boot block.

File:
1 edited

Legend:

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

    r2953f9a r6284978  
    8383
    8484static int devcon_add(dev_handle_t dev_handle, int dev_phone, void *com_area,
    85    size_t com_size, void *bb_buf, off_t bb_off, size_t bb_size)
     85   size_t com_size)
    8686{
    8787        link_t *cur;
     
    9797        devcon->com_area = com_area;
    9898        devcon->com_size = com_size;
    99         devcon->bb_buf = bb_buf;
    100         devcon->bb_off = bb_off;
    101         devcon->bb_size = bb_size;
     99        devcon->bb_buf = NULL;
     100        devcon->bb_off = 0;
     101        devcon->bb_size = 0;
    102102
    103103        futex_down(&dcl_lock);
     
    122122}
    123123
    124 int
    125 block_init(dev_handle_t dev_handle, size_t com_size, off_t bb_off,
    126     size_t bb_size)
     124int block_init(dev_handle_t dev_handle, size_t com_size)
    127125{
    128126        int rc;
    129127        int dev_phone;
    130128        void *com_area;
    131         void *bb_buf;
    132        
    133         bb_buf = malloc(bb_size);
    134         if (!bb_buf)
    135                 return ENOMEM;
    136129       
    137130        com_area = mmap(NULL, com_size, PROTO_READ | PROTO_WRITE,
    138131            MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
    139132        if (!com_area) {
    140                 free(bb_buf);
    141133                return ENOMEM;
    142134        }
     
    145137
    146138        if (dev_phone < 0) {
    147                 free(bb_buf);
    148139                munmap(com_area, com_size);
    149140                return dev_phone;
     
    153144            AS_AREA_READ | AS_AREA_WRITE);
    154145        if (rc != EOK) {
    155                 free(bb_buf);
    156146                munmap(com_area, com_size);
    157147                ipc_hangup(dev_phone);
     
    159149        }
    160150       
    161         rc = devcon_add(dev_handle, dev_phone, com_area, com_size, bb_buf,
    162             bb_off, bb_size);
     151        rc = devcon_add(dev_handle, dev_phone, com_area, com_size);
    163152        if (rc != EOK) {
    164                 free(bb_buf);
    165153                munmap(com_area, com_size);
    166154                ipc_hangup(dev_phone);
     
    168156        }
    169157
     158        return EOK;
     159}
     160
     161void block_fini(dev_handle_t dev_handle)
     162{
     163        devcon_t *devcon = devcon_search(dev_handle);
     164        assert(devcon);
     165       
     166        devcon_remove(devcon);
     167
     168        if (devcon->bb_buf)
     169                free(devcon->bb_buf);
     170        munmap(devcon->com_area, devcon->com_size);
     171        ipc_hangup(devcon->dev_phone);
     172
     173        free(devcon);   
     174}
     175
     176int block_bb_read(dev_handle_t dev_handle, off_t off, size_t size)
     177{
     178        void *bb_buf;
     179
     180        devcon_t *devcon = devcon_search(dev_handle);
     181        if (!devcon)
     182                return ENOENT;
     183        if (devcon->bb_buf)
     184                return EEXIST;
     185        bb_buf = malloc(size);
     186        if (!bb_buf)
     187                return ENOMEM;
     188       
    170189        off_t bufpos = 0;
    171190        size_t buflen = 0;
    172         if (!block_read(dev_handle, &bufpos, &buflen, &bb_off,
    173             bb_buf, bb_size, bb_size)) {
    174                 block_fini(dev_handle);
     191        if (!block_read(dev_handle, &bufpos, &buflen, &off,
     192            bb_buf, size, size)) {
     193                free(bb_buf);
    175194                return EIO;     /* XXX real error code */
    176195        }
    177        
     196        devcon->bb_buf = bb_buf;
     197        devcon->bb_off = off;
     198        devcon->bb_size = size;
     199
    178200        return EOK;
    179 }
    180 
    181 void block_fini(dev_handle_t dev_handle)
    182 {
    183         devcon_t *devcon = devcon_search(dev_handle);
    184         assert(devcon);
    185        
    186         devcon_remove(devcon);
    187 
    188         free(devcon->bb_buf);
    189         munmap(devcon->com_area, devcon->com_size);
    190         ipc_hangup(devcon->dev_phone);
    191 
    192         free(devcon);   
    193201}
    194202
Note: See TracChangeset for help on using the changeset viewer.