Changeset 79ae36dd in mainline for uspace/lib/block/libblock.c
- Timestamp:
- 2011-06-08T19:01:55Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0eff68e
- Parents:
- 764d71e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/libblock.c
r764d71e r79ae36dd 62 62 static LIST_INITIALIZE(dcl_head); 63 63 64 #define CACHE_BUCKETS_LOG2 65 #define CACHE_BUCKETS 64 #define CACHE_BUCKETS_LOG2 10 65 #define CACHE_BUCKETS (1 << CACHE_BUCKETS_LOG2) 66 66 67 67 typedef struct { 68 68 fibril_mutex_t lock; 69 size_t lblock_size; 70 unsigned blocks_cluster; 71 unsigned block_count; 72 unsigned blocks_cached; 69 size_t lblock_size; /**< Logical block size. */ 70 unsigned blocks_cluster; /**< Physical blocks per block_t */ 71 unsigned block_count; /**< Total number of blocks. */ 72 unsigned blocks_cached; /**< Number of cached blocks. */ 73 73 hash_table_t block_hash; 74 74 link_t free_head; … … 79 79 link_t link; 80 80 devmap_handle_t devmap_handle; 81 int dev_phone;81 async_sess_t *sess; 82 82 fibril_mutex_t comm_area_lock; 83 83 void *comm_area; … … 85 85 void *bb_buf; 86 86 aoff64_t bb_addr; 87 size_t pblock_size; 87 size_t pblock_size; /**< Physical block size. */ 88 88 cache_t *cache; 89 89 } devcon_t; 90 90 91 static int read_blocks(devcon_t * devcon, aoff64_t ba, size_t cnt);92 static int write_blocks(devcon_t * devcon, aoff64_t ba, size_t cnt);93 static int get_block_size( int dev_phone, size_t *bsize);94 static int get_num_blocks( int dev_phone, aoff64_t *nblocks);95 static aoff64_t ba_ltop(devcon_t * devcon, aoff64_t lba);91 static int read_blocks(devcon_t *, aoff64_t, size_t); 92 static int write_blocks(devcon_t *, aoff64_t, size_t); 93 static int get_block_size(async_sess_t *, size_t *); 94 static int get_num_blocks(async_sess_t *, aoff64_t *); 95 static aoff64_t ba_ltop(devcon_t *, aoff64_t); 96 96 97 97 static devcon_t *devcon_search(devmap_handle_t devmap_handle) 98 98 { 99 99 link_t *cur; 100 100 101 101 fibril_mutex_lock(&dcl_lock); 102 102 103 for (cur = dcl_head.next; cur != &dcl_head; cur = cur->next) { 103 104 devcon_t *devcon = list_get_instance(cur, devcon_t, link); … … 107 108 } 108 109 } 110 109 111 fibril_mutex_unlock(&dcl_lock); 110 112 return NULL; 111 113 } 112 114 113 static int devcon_add(devmap_handle_t devmap_handle, int dev_phone, size_t bsize,114 void *comm_area, size_t comm_size)115 static int devcon_add(devmap_handle_t devmap_handle, async_sess_t *sess, 116 size_t bsize, void *comm_area, size_t comm_size) 115 117 { 116 118 link_t *cur; 117 119 devcon_t *devcon; 118 120 119 121 if (comm_size < bsize) 120 122 return EINVAL; 121 123 122 124 devcon = malloc(sizeof(devcon_t)); 123 125 if (!devcon) … … 126 128 link_initialize(&devcon->link); 127 129 devcon->devmap_handle = devmap_handle; 128 devcon-> dev_phone = dev_phone;130 devcon->sess = sess; 129 131 fibril_mutex_initialize(&devcon->comm_area_lock); 130 132 devcon->comm_area = comm_area; … … 134 136 devcon->pblock_size = bsize; 135 137 devcon->cache = NULL; 136 138 137 139 fibril_mutex_lock(&dcl_lock); 138 140 for (cur = dcl_head.next; cur != &dcl_head; cur = cur->next) { … … 156 158 } 157 159 158 int block_init(devmap_handle_t devmap_handle, size_t comm_size) 159 { 160 int rc; 161 int dev_phone; 162 void *comm_area; 163 size_t bsize; 164 165 comm_area = mmap(NULL, comm_size, PROTO_READ | PROTO_WRITE, 160 int block_init(exch_mgmt_t mgmt, devmap_handle_t devmap_handle, 161 size_t comm_size) 162 { 163 void *comm_area = mmap(NULL, comm_size, PROTO_READ | PROTO_WRITE, 166 164 MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); 167 if (!comm_area) {165 if (!comm_area) 168 166 return ENOMEM; 169 }170 171 dev_phone = devmap_device_connect(devmap_handle,IPC_FLAG_BLOCKING);172 if ( dev_phone < 0) {167 168 async_sess_t *sess = devmap_device_connect(mgmt, devmap_handle, 169 IPC_FLAG_BLOCKING); 170 if (!sess) { 173 171 munmap(comm_area, comm_size); 174 return dev_phone; 175 } 176 177 rc = async_share_out_start(dev_phone, comm_area, 172 return ENOENT; 173 } 174 175 async_exch_t *exch = async_exchange_begin(sess); 176 int rc = async_share_out_start(exch, comm_area, 178 177 AS_AREA_READ | AS_AREA_WRITE); 179 if (rc != EOK) { 180 munmap(comm_area, comm_size); 181 async_hangup(dev_phone); 182 return rc; 183 } 184 185 if (get_block_size(dev_phone, &bsize) != EOK) { 186 munmap(comm_area, comm_size); 187 async_hangup(dev_phone); 188 return rc; 189 } 190 191 rc = devcon_add(devmap_handle, dev_phone, bsize, comm_area, comm_size); 178 async_exchange_end(exch); 179 192 180 if (rc != EOK) { 193 181 munmap(comm_area, comm_size); 194 async_hangup( dev_phone);182 async_hangup(sess); 195 183 return rc; 196 184 } 197 185 186 size_t bsize; 187 rc = get_block_size(sess, &bsize); 188 189 if (rc != EOK) { 190 munmap(comm_area, comm_size); 191 async_hangup(sess); 192 return rc; 193 } 194 195 rc = devcon_add(devmap_handle, sess, bsize, comm_area, comm_size); 196 if (rc != EOK) { 197 munmap(comm_area, comm_size); 198 async_hangup(sess); 199 return rc; 200 } 201 198 202 return EOK; 199 203 } … … 206 210 if (devcon->cache) 207 211 (void) block_cache_fini(devmap_handle); 208 212 209 213 devcon_remove(devcon); 210 214 211 215 if (devcon->bb_buf) 212 216 free(devcon->bb_buf); 213 217 214 218 munmap(devcon->comm_area, devcon->comm_size); 215 async_hangup(devcon-> dev_phone);216 217 free(devcon); 219 async_hangup(devcon->sess); 220 221 free(devcon); 218 222 } 219 223 … … 808 812 assert(devcon); 809 813 810 return get_block_size(devcon-> dev_phone, bsize);814 return get_block_size(devcon->sess, bsize); 811 815 } 812 816 … … 820 824 int block_get_nblocks(devmap_handle_t devmap_handle, aoff64_t *nblocks) 821 825 { 822 devcon_t *devcon; 823 824 devcon = devcon_search(devmap_handle); 825 assert(devcon); 826 827 return get_num_blocks(devcon->dev_phone, nblocks); 826 devcon_t *devcon = devcon_search(devmap_handle); 827 assert(devcon); 828 829 return get_num_blocks(devcon->sess, nblocks); 828 830 } 829 831 … … 891 893 static int read_blocks(devcon_t *devcon, aoff64_t ba, size_t cnt) 892 894 { 893 int rc;894 895 as sert(devcon);896 rc = async_req_3_0(devcon->dev_phone, BD_READ_BLOCKS, LOWER32(ba),895 assert(devcon); 896 897 async_exch_t *exch = async_exchange_begin(devcon->sess); 898 int rc = async_req_3_0(exch, BD_READ_BLOCKS, LOWER32(ba), 897 899 UPPER32(ba), cnt); 900 async_exchange_end(exch); 901 898 902 if (rc != EOK) { 899 903 printf("Error %d reading %zu blocks starting at block %" PRIuOFF64 … … 904 908 #endif 905 909 } 910 906 911 return rc; 907 912 } … … 918 923 static int write_blocks(devcon_t *devcon, aoff64_t ba, size_t cnt) 919 924 { 920 int rc;921 922 as sert(devcon);923 rc = async_req_3_0(devcon->dev_phone, BD_WRITE_BLOCKS, LOWER32(ba),925 assert(devcon); 926 927 async_exch_t *exch = async_exchange_begin(devcon->sess); 928 int rc = async_req_3_0(exch, BD_WRITE_BLOCKS, LOWER32(ba), 924 929 UPPER32(ba), cnt); 930 async_exchange_end(exch); 931 925 932 if (rc != EOK) { 926 933 printf("Error %d writing %zu blocks starting at block %" PRIuOFF64 … … 930 937 #endif 931 938 } 939 932 940 return rc; 933 941 } 934 942 935 943 /** Get block size used by the device. */ 936 static int get_block_size( int dev_phone, size_t *bsize)944 static int get_block_size(async_sess_t *sess, size_t *bsize) 937 945 { 938 946 sysarg_t bs; 939 int rc; 940 941 rc = async_req_0_1(dev_phone, BD_GET_BLOCK_SIZE, &bs); 947 948 async_exch_t *exch = async_exchange_begin(sess); 949 int rc = async_req_0_1(exch, BD_GET_BLOCK_SIZE, &bs); 950 async_exchange_end(exch); 951 942 952 if (rc == EOK) 943 953 *bsize = (size_t) bs; 944 954 945 955 return rc; 946 956 } 947 957 948 958 /** Get total number of blocks on block device. */ 949 static int get_num_blocks(int dev_phone, aoff64_t *nblocks) 950 { 951 sysarg_t nb_l, nb_h; 952 int rc; 953 954 rc = async_req_0_2(dev_phone, BD_GET_NUM_BLOCKS, &nb_l, &nb_h); 955 if (rc == EOK) { 959 static int get_num_blocks(async_sess_t *sess, aoff64_t *nblocks) 960 { 961 sysarg_t nb_l; 962 sysarg_t nb_h; 963 964 async_exch_t *exch = async_exchange_begin(sess); 965 int rc = async_req_0_2(exch, BD_GET_NUM_BLOCKS, &nb_l, &nb_h); 966 async_exchange_end(exch); 967 968 if (rc == EOK) 956 969 *nblocks = (aoff64_t) MERGE_LOUP32(nb_l, nb_h); 957 } 958 970 959 971 return rc; 960 972 }
Note:
See TracChangeset
for help on using the changeset viewer.