Changeset a35b458 in mainline for uspace/lib/block
- Timestamp:
- 2018-03-02T20:10:49Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
-
uspace/lib/block/block.c (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/block.c
r3061bc1 ra35b458 95 95 { 96 96 fibril_mutex_lock(&dcl_lock); 97 97 98 98 list_foreach(dcl, link, devcon_t, devcon) { 99 99 if (devcon->service_id == service_id) { … … 102 102 } 103 103 } 104 104 105 105 fibril_mutex_unlock(&dcl_lock); 106 106 return NULL; … … 111 111 { 112 112 devcon_t *devcon; 113 113 114 114 devcon = malloc(sizeof(devcon_t)); 115 115 if (!devcon) 116 116 return ENOMEM; 117 117 118 118 link_initialize(&devcon->link); 119 119 devcon->service_id = service_id; … … 125 125 devcon->pblocks = dev_size; 126 126 devcon->cache = NULL; 127 127 128 128 fibril_mutex_lock(&dcl_lock); 129 129 list_foreach(dcl, link, devcon_t, d) { … … 155 155 return ENOENT; 156 156 } 157 157 158 158 errno_t rc = bd_open(sess, &bd); 159 159 if (rc != EOK) { … … 161 161 return rc; 162 162 } 163 163 164 164 size_t bsize; 165 165 rc = bd_get_block_size(bd, &bsize); … … 177 177 return rc; 178 178 } 179 179 180 180 rc = devcon_add(service_id, sess, bsize, dev_size, bd); 181 181 if (rc != EOK) { … … 184 184 return rc; 185 185 } 186 186 187 187 return EOK; 188 188 } … … 192 192 devcon_t *devcon = devcon_search(service_id); 193 193 assert(devcon); 194 194 195 195 if (devcon->cache) 196 196 (void) block_cache_fini(service_id); 197 197 198 198 (void)bd_sync_cache(devcon->bd, 0, 0); 199 199 200 200 devcon_remove(devcon); 201 201 202 202 if (devcon->bb_buf) 203 203 free(devcon->bb_buf); 204 204 205 205 bd_close(devcon->bd); 206 206 async_hangup(devcon->sess); 207 207 208 208 free(devcon); 209 209 } … … 282 282 if (!cache) 283 283 return ENOMEM; 284 284 285 285 fibril_mutex_initialize(&cache->lock); 286 286 list_initialize(&cache->free_list); … … 318 318 return EOK; 319 319 cache = devcon->cache; 320 320 321 321 /* 322 322 * We are expecting to find all blocks for this device handle on the … … 337 337 338 338 hash_table_remove_item(&cache->block_hash, &b->hash_link); 339 339 340 340 free(b->data); 341 341 free(b); … … 391 391 aoff64_t p_ba; 392 392 errno_t rc; 393 393 394 394 devcon = devcon_search(service_id); 395 395 396 396 assert(devcon); 397 397 assert(devcon->cache); 398 398 399 399 cache = devcon->cache; 400 400 … … 712 712 assert(devcon); 713 713 block_size = devcon->pblock_size; 714 714 715 715 while (left > 0) { 716 716 size_t rd; 717 717 718 718 if (*bufpos + left < *buflen) 719 719 rd = left; 720 720 else 721 721 rd = *buflen - *bufpos; 722 722 723 723 if (rd > 0) { 724 724 /* … … 732 732 left -= rd; 733 733 } 734 734 735 735 if (*bufpos == *buflen) { 736 736 /* Refill the communication buffer with a new block. */ … … 742 742 return rc; 743 743 } 744 744 745 745 *bufpos = 0; 746 746 *buflen = block_size; 747 747 } 748 748 } 749 749 750 750 return EOK; 751 751 } … … 860 860 size_t blocks; 861 861 size_t offset; 862 862 863 863 rc = block_get_bsize(service_id, &phys_block_size); 864 864 if (rc != EOK) { 865 865 return rc; 866 866 } 867 867 868 868 /* calculate data position and required space */ 869 869 first_block = abs_offset / phys_block_size; … … 872 872 blocks = last_block - first_block + 1; 873 873 buf_size = blocks * phys_block_size; 874 874 875 875 /* read the data into memory */ 876 876 buffer = malloc(buf_size); … … 878 878 return ENOMEM; 879 879 } 880 880 881 881 rc = block_read_direct(service_id, first_block, blocks, buffer); 882 882 if (rc != EOK) { … … 884 884 return rc; 885 885 } 886 886 887 887 /* copy the data from the buffer */ 888 888 memcpy(data, buffer + offset, bytes); 889 889 free(buffer); 890 890 891 891 return EOK; 892 892 } … … 905 905 { 906 906 devcon_t *devcon = devcon_search(service_id); 907 907 908 908 assert(devcon); 909 909 return bd_read_toc(devcon->bd, session, buf, bufsize); … … 923 923 { 924 924 assert(devcon); 925 925 926 926 errno_t rc = bd_read_blocks(devcon->bd, ba, cnt, buf, size); 927 927 if (rc != EOK) { … … 933 933 #endif 934 934 } 935 935 936 936 return rc; 937 937 } … … 950 950 { 951 951 assert(devcon); 952 952 953 953 errno_t rc = bd_write_blocks(devcon->bd, ba, cnt, data, size); 954 954 if (rc != EOK) { … … 959 959 #endif 960 960 } 961 961 962 962 return rc; 963 963 }
Note:
See TracChangeset
for help on using the changeset viewer.
