Changes in uspace/lib/block/libblock.c [08cba4b:867e2555] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/libblock.c
r08cba4b r867e2555 39 39 #include "libblock.h" 40 40 #include "../../srv/vfs/vfs.h" 41 #include <ipc/ loc.h>41 #include <ipc/devmap.h> 42 42 #include <ipc/bd.h> 43 43 #include <ipc/services.h> … … 78 78 typedef struct { 79 79 link_t link; 80 service_id_t service_id;80 devmap_handle_t devmap_handle; 81 81 async_sess_t *sess; 82 82 fibril_mutex_t comm_area_lock; … … 95 95 static aoff64_t ba_ltop(devcon_t *, aoff64_t); 96 96 97 static devcon_t *devcon_search( service_id_t service_id)97 static devcon_t *devcon_search(devmap_handle_t devmap_handle) 98 98 { 99 99 fibril_mutex_lock(&dcl_lock); … … 101 101 list_foreach(dcl, cur) { 102 102 devcon_t *devcon = list_get_instance(cur, devcon_t, link); 103 if (devcon-> service_id == service_id) {103 if (devcon->devmap_handle == devmap_handle) { 104 104 fibril_mutex_unlock(&dcl_lock); 105 105 return devcon; … … 111 111 } 112 112 113 static int devcon_add( service_id_t service_id, async_sess_t *sess,113 static int devcon_add(devmap_handle_t devmap_handle, async_sess_t *sess, 114 114 size_t bsize, void *comm_area, size_t comm_size) 115 115 { … … 124 124 125 125 link_initialize(&devcon->link); 126 devcon-> service_id = service_id;126 devcon->devmap_handle = devmap_handle; 127 127 devcon->sess = sess; 128 128 fibril_mutex_initialize(&devcon->comm_area_lock); … … 137 137 list_foreach(dcl, cur) { 138 138 devcon_t *d = list_get_instance(cur, devcon_t, link); 139 if (d-> service_id == service_id) {139 if (d->devmap_handle == devmap_handle) { 140 140 fibril_mutex_unlock(&dcl_lock); 141 141 free(devcon); … … 155 155 } 156 156 157 int block_init(exch_mgmt_t mgmt, service_id_t service_id,157 int block_init(exch_mgmt_t mgmt, devmap_handle_t devmap_handle, 158 158 size_t comm_size) 159 159 { … … 163 163 return ENOMEM; 164 164 165 async_sess_t *sess = loc_service_connect(mgmt, service_id,165 async_sess_t *sess = devmap_device_connect(mgmt, devmap_handle, 166 166 IPC_FLAG_BLOCKING); 167 167 if (!sess) { … … 190 190 } 191 191 192 rc = devcon_add( service_id, sess, bsize, comm_area, comm_size);192 rc = devcon_add(devmap_handle, sess, bsize, comm_area, comm_size); 193 193 if (rc != EOK) { 194 194 munmap(comm_area, comm_size); … … 200 200 } 201 201 202 void block_fini( service_id_t service_id)203 { 204 devcon_t *devcon = devcon_search( service_id);202 void block_fini(devmap_handle_t devmap_handle) 203 { 204 devcon_t *devcon = devcon_search(devmap_handle); 205 205 assert(devcon); 206 206 207 207 if (devcon->cache) 208 (void) block_cache_fini( service_id);208 (void) block_cache_fini(devmap_handle); 209 209 210 210 devcon_remove(devcon); … … 219 219 } 220 220 221 int block_bb_read( service_id_t service_id, aoff64_t ba)221 int block_bb_read(devmap_handle_t devmap_handle, aoff64_t ba) 222 222 { 223 223 void *bb_buf; 224 224 int rc; 225 225 226 devcon_t *devcon = devcon_search( service_id);226 devcon_t *devcon = devcon_search(devmap_handle); 227 227 if (!devcon) 228 228 return ENOENT; … … 249 249 } 250 250 251 void *block_bb_get( service_id_t service_id)252 { 253 devcon_t *devcon = devcon_search( service_id);251 void *block_bb_get(devmap_handle_t devmap_handle) 252 { 253 devcon_t *devcon = devcon_search(devmap_handle); 254 254 assert(devcon); 255 255 return devcon->bb_buf; … … 277 277 }; 278 278 279 int block_cache_init( service_id_t service_id, size_t size, unsigned blocks,279 int block_cache_init(devmap_handle_t devmap_handle, size_t size, unsigned blocks, 280 280 enum cache_mode mode) 281 281 { 282 devcon_t *devcon = devcon_search( service_id);282 devcon_t *devcon = devcon_search(devmap_handle); 283 283 cache_t *cache; 284 284 if (!devcon) … … 315 315 } 316 316 317 int block_cache_fini( service_id_t service_id)318 { 319 devcon_t *devcon = devcon_search( service_id);317 int block_cache_fini(devmap_handle_t devmap_handle) 318 { 319 devcon_t *devcon = devcon_search(devmap_handle); 320 320 cache_t *cache; 321 321 int rc; … … 387 387 * @param block Pointer to where the function will store the 388 388 * block pointer on success. 389 * @param service_id Service IDof the block device.389 * @param devmap_handle Device handle of the block device. 390 390 * @param ba Block address (logical). 391 391 * @param flags If BLOCK_FLAGS_NOREAD is specified, block_get() … … 395 395 * @return EOK on success or a negative error code. 396 396 */ 397 int block_get(block_t **block, service_id_t service_id, aoff64_t ba, int flags)397 int block_get(block_t **block, devmap_handle_t devmap_handle, aoff64_t ba, int flags) 398 398 { 399 399 devcon_t *devcon; … … 408 408 int rc; 409 409 410 devcon = devcon_search( service_id);410 devcon = devcon_search(devmap_handle); 411 411 412 412 assert(devcon); … … 536 536 537 537 block_initialize(b); 538 b-> service_id = service_id;538 b->devmap_handle = devmap_handle; 539 539 b->size = cache->lblock_size; 540 540 b->lba = ba; … … 586 586 int block_put(block_t *block) 587 587 { 588 devcon_t *devcon = devcon_search(block-> service_id);588 devcon_t *devcon = devcon_search(block->devmap_handle); 589 589 cache_t *cache; 590 590 unsigned blocks_cached; … … 687 687 /** Read sequential data from a block device. 688 688 * 689 * @param service_id Service IDof the block device.689 * @param devmap_handle Device handle of the block device. 690 690 * @param bufpos Pointer to the first unread valid offset within the 691 691 * communication buffer. … … 699 699 * @return EOK on success or a negative return code on failure. 700 700 */ 701 int block_seqread( service_id_t service_id, size_t *bufpos, size_t *buflen,701 int block_seqread(devmap_handle_t devmap_handle, size_t *bufpos, size_t *buflen, 702 702 aoff64_t *pos, void *dst, size_t size) 703 703 { … … 707 707 devcon_t *devcon; 708 708 709 devcon = devcon_search( service_id);709 devcon = devcon_search(devmap_handle); 710 710 assert(devcon); 711 711 block_size = devcon->pblock_size; … … 753 753 /** Read blocks directly from device (bypass cache). 754 754 * 755 * @param service_id Service IDof the block device.755 * @param devmap_handle Device handle of the block device. 756 756 * @param ba Address of first block (physical). 757 757 * @param cnt Number of blocks. … … 760 760 * @return EOK on success or negative error code on failure. 761 761 */ 762 int block_read_direct( service_id_t service_id, aoff64_t ba, size_t cnt, void *buf)762 int block_read_direct(devmap_handle_t devmap_handle, aoff64_t ba, size_t cnt, void *buf) 763 763 { 764 764 devcon_t *devcon; 765 765 int rc; 766 766 767 devcon = devcon_search( service_id);767 devcon = devcon_search(devmap_handle); 768 768 assert(devcon); 769 769 … … 781 781 /** Write blocks directly to device (bypass cache). 782 782 * 783 * @param service_id Service IDof the block device.783 * @param devmap_handle Device handle of the block device. 784 784 * @param ba Address of first block (physical). 785 785 * @param cnt Number of blocks. … … 788 788 * @return EOK on success or negative error code on failure. 789 789 */ 790 int block_write_direct( service_id_t service_id, aoff64_t ba, size_t cnt,790 int block_write_direct(devmap_handle_t devmap_handle, aoff64_t ba, size_t cnt, 791 791 const void *data) 792 792 { … … 794 794 int rc; 795 795 796 devcon = devcon_search( service_id);796 devcon = devcon_search(devmap_handle); 797 797 assert(devcon); 798 798 … … 809 809 /** Get device block size. 810 810 * 811 * @param service_id Service IDof the block device.811 * @param devmap_handle Device handle of the block device. 812 812 * @param bsize Output block size. 813 813 * 814 814 * @return EOK on success or negative error code on failure. 815 815 */ 816 int block_get_bsize( service_id_t service_id, size_t *bsize)816 int block_get_bsize(devmap_handle_t devmap_handle, size_t *bsize) 817 817 { 818 818 devcon_t *devcon; 819 819 820 devcon = devcon_search( service_id);820 devcon = devcon_search(devmap_handle); 821 821 assert(devcon); 822 822 … … 826 826 /** Get number of blocks on device. 827 827 * 828 * @param service_id Service IDof the block device.828 * @param devmap_handle Device handle of the block device. 829 829 * @param nblocks Output number of blocks. 830 830 * 831 831 * @return EOK on success or negative error code on failure. 832 832 */ 833 int block_get_nblocks( service_id_t service_id, aoff64_t *nblocks)834 { 835 devcon_t *devcon = devcon_search( service_id);833 int block_get_nblocks(devmap_handle_t devmap_handle, aoff64_t *nblocks) 834 { 835 devcon_t *devcon = devcon_search(devmap_handle); 836 836 assert(devcon); 837 837 … … 841 841 /** Read bytes directly from the device (bypass cache) 842 842 * 843 * @param service_id Service IDof the block device.843 * @param devmap_handle Device handle of the block device. 844 844 * @param abs_offset Absolute offset in bytes where to start reading 845 845 * @param bytes Number of bytes to read … … 848 848 * @return EOK on success or negative error code on failure. 849 849 */ 850 int block_read_bytes_direct( service_id_t service_id, aoff64_t abs_offset,850 int block_read_bytes_direct(devmap_handle_t devmap_handle, aoff64_t abs_offset, 851 851 size_t bytes, void *data) 852 852 { … … 860 860 size_t offset; 861 861 862 rc = block_get_bsize( service_id, &phys_block_size);862 rc = block_get_bsize(devmap_handle, &phys_block_size); 863 863 if (rc != EOK) { 864 864 return rc; … … 878 878 } 879 879 880 rc = block_read_direct( service_id, first_block, blocks, buffer);880 rc = block_read_direct(devmap_handle, first_block, blocks, buffer); 881 881 if (rc != EOK) { 882 882 free(buffer); … … 889 889 890 890 return EOK; 891 }892 893 /** Get TOC from device.894 *895 * @param service_id Service ID of the block device.896 * @param session Starting session.897 *898 * @return Allocated TOC structure.899 * @return NULL on failure.900 *901 */902 toc_block_t *block_get_toc(service_id_t service_id, uint8_t session)903 {904 devcon_t *devcon = devcon_search(service_id);905 assert(devcon);906 907 toc_block_t *toc = NULL;908 909 fibril_mutex_lock(&devcon->comm_area_lock);910 911 async_exch_t *exch = async_exchange_begin(devcon->sess);912 int rc = async_req_1_0(exch, BD_READ_TOC, session);913 async_exchange_end(exch);914 915 if (rc == EOK) {916 toc = (toc_block_t *) malloc(sizeof(toc_block_t));917 if (toc != NULL) {918 memset(toc, 0, sizeof(toc_block_t));919 memcpy(toc, devcon->comm_area,920 min(devcon->pblock_size, sizeof(toc_block_t)));921 }922 }923 924 925 fibril_mutex_unlock(&devcon->comm_area_lock);926 927 return toc;928 891 } 929 892 … … 949 912 printf("Error %d reading %zu blocks starting at block %" PRIuOFF64 950 913 " from device handle %" PRIun "\n", rc, cnt, ba, 951 devcon-> service_id);914 devcon->devmap_handle); 952 915 #ifndef NDEBUG 953 916 stacktrace_print(); … … 978 941 if (rc != EOK) { 979 942 printf("Error %d writing %zu blocks starting at block %" PRIuOFF64 980 " to device handle %" PRIun "\n", rc, cnt, ba, devcon-> service_id);943 " to device handle %" PRIun "\n", rc, cnt, ba, devcon->devmap_handle); 981 944 #ifndef NDEBUG 982 945 stacktrace_print();
Note:
See TracChangeset
for help on using the changeset viewer.