Changeset 80e9e5e in mainline for uspace/lib
- Timestamp:
- 2011-07-27T01:54:34Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0837ab4
- Parents:
- c936c7f (diff), 75aa59a (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. - Location:
- uspace/lib
- Files:
-
- 9 edited
-
block/libblock.c (modified) (11 diffs)
-
c/generic/elf/elf_load.c (modified) (6 diffs)
-
c/generic/vfs/vfs.c (modified) (1 diff)
-
c/include/unistd.h (modified) (1 diff)
-
fs/libfs.c (modified) (19 diffs)
-
fs/libfs.h (modified) (3 diffs)
-
scsi/include/scsi/sbc.h (modified) (2 diffs)
-
scsi/include/scsi/spc.h (modified) (2 diffs)
-
scsi/src/spc.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/block/libblock.c
rc936c7f r80e9e5e 258 258 static hash_index_t cache_hash(unsigned long *key) 259 259 { 260 return *key& (CACHE_BUCKETS - 1);260 return MERGE_LOUP32(key[0], key[1]) & (CACHE_BUCKETS - 1); 261 261 } 262 262 … … 264 264 { 265 265 block_t *b = hash_table_get_instance(item, block_t, hash_link); 266 return b->lba == *key;266 return b->lba == MERGE_LOUP32(key[0], key[1]); 267 267 } 268 268 … … 305 305 cache->blocks_cluster = cache->lblock_size / devcon->pblock_size; 306 306 307 if (!hash_table_create(&cache->block_hash, CACHE_BUCKETS, 1,307 if (!hash_table_create(&cache->block_hash, CACHE_BUCKETS, 2, 308 308 &cache_ops)) { 309 309 free(cache); … … 344 344 } 345 345 346 unsigned long key = b->lba; 347 hash_table_remove(&cache->block_hash, &key, 1); 346 unsigned long key[2] = { 347 LOWER32(b->lba), 348 UPPER32(b->lba) 349 }; 350 hash_table_remove(&cache->block_hash, key, 2); 348 351 349 352 free(b->data); … … 398 401 block_t *b; 399 402 link_t *l; 400 unsigned long key = ba; 403 unsigned long key[2] = { 404 LOWER32(ba), 405 UPPER32(ba) 406 }; 407 401 408 int rc; 402 409 … … 413 420 414 421 fibril_mutex_lock(&cache->lock); 415 l = hash_table_find(&cache->block_hash, &key);422 l = hash_table_find(&cache->block_hash, key); 416 423 if (l) { 417 424 found: … … 451 458 * Try to recycle a block from the free list. 452 459 */ 453 unsigned long temp_key;454 460 recycle: 455 461 if (list_empty(&cache->free_list)) { … … 499 505 goto retry; 500 506 } 501 l = hash_table_find(&cache->block_hash, &key);507 l = hash_table_find(&cache->block_hash, key); 502 508 if (l) { 503 509 /* … … 522 528 */ 523 529 list_remove(&b->free_link); 524 temp_key = b->lba; 525 hash_table_remove(&cache->block_hash, &temp_key, 1); 530 unsigned long temp_key[2] = { 531 LOWER32(b->lba), 532 UPPER32(b->lba) 533 }; 534 hash_table_remove(&cache->block_hash, temp_key, 2); 526 535 } 527 536 … … 531 540 b->lba = ba; 532 541 b->pba = ba_ltop(devcon, b->lba); 533 hash_table_insert(&cache->block_hash, &key, &b->hash_link);542 hash_table_insert(&cache->block_hash, key, &b->hash_link); 534 543 535 544 /* … … 643 652 * Take the block out of the cache and free it. 644 653 */ 645 unsigned long key = block->lba; 646 hash_table_remove(&cache->block_hash, &key, 1); 654 unsigned long key[2] = { 655 LOWER32(block->lba), 656 UPPER32(block->lba) 657 }; 658 hash_table_remove(&cache->block_hash, key, 2); 647 659 fibril_mutex_unlock(&block->lock); 648 660 free(block->data); -
uspace/lib/c/generic/elf/elf_load.c
rc936c7f r80e9e5e 74 74 static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry); 75 75 76 /** Read until the buffer is read in its entirety. */77 static int my_read(int fd, void *buf, size_t len)78 {79 int cnt = 0;80 do {81 buf += cnt;82 len -= cnt;83 cnt = read(fd, buf, len);84 } while ((cnt > 0) && ((len - cnt) > 0));85 86 return cnt;87 }88 89 76 /** Load ELF binary from a file. 90 77 * … … 160 147 int i, rc; 161 148 162 rc = my_read(elf->fd, header, sizeof(elf_header_t));163 if (rc < 0) {149 rc = read_all(elf->fd, header, sizeof(elf_header_t)); 150 if (rc != sizeof(elf_header_t)) { 164 151 DPRINTF("Read error.\n"); 165 152 return EE_INVALID; … … 222 209 + i * sizeof(elf_segment_header_t), SEEK_SET); 223 210 224 rc = my_read(elf->fd, &segment_hdr,211 rc = read_all(elf->fd, &segment_hdr, 225 212 sizeof(elf_segment_header_t)); 226 if (rc < 0) {213 if (rc != sizeof(elf_segment_header_t)) { 227 214 DPRINTF("Read error.\n"); 228 215 return EE_INVALID; … … 244 231 + i * sizeof(elf_section_header_t), SEEK_SET); 245 232 246 rc = my_read(elf->fd, §ion_hdr,233 rc = read_all(elf->fd, §ion_hdr, 247 234 sizeof(elf_section_header_t)); 248 if (rc < 0) {235 if (rc != sizeof(elf_section_header_t)) { 249 236 DPRINTF("Read error.\n"); 250 237 return EE_INVALID; … … 334 321 uintptr_t seg_addr; 335 322 size_t mem_sz; 336 int rc;323 ssize_t rc; 337 324 338 325 bias = elf->bias; … … 412 399 if (now > left) now = left; 413 400 414 rc = my_read(elf->fd, dp, now);415 416 if (rc < 0) {401 rc = read_all(elf->fd, dp, now); 402 403 if (rc != (ssize_t) now) { 417 404 DPRINTF("Read error.\n"); 418 405 return EE_INVALID; -
uspace/lib/c/generic/vfs/vfs.c
rc936c7f r80e9e5e 417 417 } 418 418 419 /** Read entire buffer. 420 * 421 * In face of short reads this function continues reading until either 422 * the entire buffer is read or no more data is available (at end of file). 423 * 424 * @param fildes File descriptor 425 * @param buf Buffer, @a nbytes bytes long 426 * @param nbytes Number of bytes to read 427 * 428 * @return On success, positive number of bytes read. 429 * On failure, negative error code from read(). 430 */ 431 ssize_t read_all(int fildes, void *buf, size_t nbyte) 432 { 433 ssize_t cnt = 0; 434 size_t nread = 0; 435 uint8_t *bp = (uint8_t *) buf; 436 437 do { 438 bp += cnt; 439 nread += cnt; 440 cnt = read(fildes, bp, nbyte - nread); 441 } while (cnt > 0 && (nbyte - nread - cnt) > 0); 442 443 if (cnt < 0) 444 return cnt; 445 446 return nread + cnt; 447 } 448 449 /** Write entire buffer. 450 * 451 * This function fails if it cannot write exactly @a len bytes to the file. 452 * 453 * @param fildes File descriptor 454 * @param buf Data, @a nbytes bytes long 455 * @param nbytes Number of bytes to write 456 * 457 * @return EOK on error, return value from write() if writing 458 * failed. 459 */ 460 ssize_t write_all(int fildes, const void *buf, size_t nbyte) 461 { 462 ssize_t cnt = 0; 463 ssize_t nwritten = 0; 464 const uint8_t *bp = (uint8_t *) buf; 465 466 do { 467 bp += cnt; 468 nwritten += cnt; 469 cnt = write(fildes, bp, nbyte - nwritten); 470 } while (cnt > 0 && ((ssize_t )nbyte - nwritten - cnt) > 0); 471 472 if (cnt < 0) 473 return cnt; 474 475 if ((ssize_t)nbyte - nwritten - cnt > 0) 476 return EIO; 477 478 return nbyte; 479 } 480 419 481 int fsync(int fildes) 420 482 { -
uspace/lib/c/include/unistd.h
rc936c7f r80e9e5e 63 63 extern ssize_t read(int, void *, size_t); 64 64 65 extern ssize_t read_all(int, void *, size_t); 66 extern ssize_t write_all(int, const void *, size_t); 67 65 68 extern off64_t lseek(int, off64_t, int); 66 69 extern int ftruncate(int, aoff64_t); -
uspace/lib/fs/libfs.c
rc936c7f r80e9e5e 45 45 #include <mem.h> 46 46 #include <sys/stat.h> 47 #include <stdlib.h> 47 48 48 49 #define on_error(rc, action) \ … … 61 62 } while (0) 62 63 64 static fs_reg_t reg; 65 66 static vfs_out_ops_t *vfs_out_ops = NULL; 67 static libfs_ops_t *libfs_ops = NULL; 68 69 static void libfs_mount(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); 70 static void libfs_unmount(libfs_ops_t *, ipc_callid_t, ipc_call_t *); 71 static void libfs_lookup(libfs_ops_t *, fs_handle_t, ipc_callid_t, 72 ipc_call_t *); 73 static void libfs_stat(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); 74 static void libfs_open_node(libfs_ops_t *, fs_handle_t, ipc_callid_t, 75 ipc_call_t *); 76 77 static void vfs_out_mounted(ipc_callid_t rid, ipc_call_t *req) 78 { 79 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 80 char *opts; 81 int rc; 82 83 /* Accept the mount options. */ 84 rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 85 if (rc != EOK) { 86 async_answer_0(rid, rc); 87 return; 88 } 89 90 fs_index_t index; 91 aoff64_t size; 92 unsigned lnkcnt; 93 rc = vfs_out_ops->mounted(devmap_handle, opts, &index, &size, &lnkcnt); 94 95 if (rc == EOK) 96 async_answer_4(rid, EOK, index, LOWER32(size), UPPER32(size), 97 lnkcnt); 98 else 99 async_answer_0(rid, rc); 100 101 free(opts); 102 } 103 104 static void vfs_out_mount(ipc_callid_t rid, ipc_call_t *req) 105 { 106 libfs_mount(libfs_ops, reg.fs_handle, rid, req); 107 } 108 109 static void vfs_out_unmounted(ipc_callid_t rid, ipc_call_t *req) 110 { 111 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 112 int rc; 113 114 rc = vfs_out_ops->unmounted(devmap_handle); 115 116 async_answer_0(rid, rc); 117 } 118 119 static void vfs_out_unmount(ipc_callid_t rid, ipc_call_t *req) 120 { 121 122 libfs_unmount(libfs_ops, rid, req); 123 } 124 125 static void vfs_out_lookup(ipc_callid_t rid, ipc_call_t *req) 126 { 127 libfs_lookup(libfs_ops, reg.fs_handle, rid, req); 128 } 129 130 static void vfs_out_read(ipc_callid_t rid, ipc_call_t *req) 131 { 132 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 133 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*req); 134 aoff64_t pos = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*req), 135 IPC_GET_ARG4(*req)); 136 size_t rbytes; 137 int rc; 138 139 rc = vfs_out_ops->read(devmap_handle, index, pos, &rbytes); 140 141 if (rc == EOK) 142 async_answer_1(rid, EOK, rbytes); 143 else 144 async_answer_0(rid, rc); 145 } 146 147 static void vfs_out_write(ipc_callid_t rid, ipc_call_t *req) 148 { 149 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 150 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*req); 151 aoff64_t pos = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*req), 152 IPC_GET_ARG4(*req)); 153 size_t wbytes; 154 aoff64_t nsize; 155 int rc; 156 157 rc = vfs_out_ops->write(devmap_handle, index, pos, &wbytes, &nsize); 158 159 if (rc == EOK) 160 async_answer_3(rid, EOK, wbytes, LOWER32(nsize), UPPER32(nsize)); 161 else 162 async_answer_0(rid, rc); 163 } 164 165 static void vfs_out_truncate(ipc_callid_t rid, ipc_call_t *req) 166 { 167 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 168 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*req); 169 aoff64_t size = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*req), 170 IPC_GET_ARG4(*req)); 171 int rc; 172 173 rc = vfs_out_ops->truncate(devmap_handle, index, size); 174 175 async_answer_0(rid, rc); 176 } 177 178 static void vfs_out_close(ipc_callid_t rid, ipc_call_t *req) 179 { 180 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 181 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*req); 182 int rc; 183 184 rc = vfs_out_ops->close(devmap_handle, index); 185 186 async_answer_0(rid, rc); 187 } 188 189 static void vfs_out_destroy(ipc_callid_t rid, ipc_call_t *req) 190 { 191 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 192 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*req); 193 int rc; 194 195 rc = vfs_out_ops->destroy(devmap_handle, index); 196 197 async_answer_0(rid, rc); 198 } 199 200 static void vfs_out_open_node(ipc_callid_t rid, ipc_call_t *req) 201 { 202 libfs_open_node(libfs_ops, reg.fs_handle, rid, req); 203 } 204 205 static void vfs_out_stat(ipc_callid_t rid, ipc_call_t *req) 206 { 207 libfs_stat(libfs_ops, reg.fs_handle, rid, req); 208 } 209 210 static void vfs_out_sync(ipc_callid_t rid, ipc_call_t *req) 211 { 212 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 213 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*req); 214 int rc; 215 216 rc = vfs_out_ops->sync(devmap_handle, index); 217 218 async_answer_0(rid, rc); 219 } 220 221 static void vfs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 222 { 223 if (iid) { 224 /* 225 * This only happens for connections opened by 226 * IPC_M_CONNECT_ME_TO calls as opposed to callback connections 227 * created by IPC_M_CONNECT_TO_ME. 228 */ 229 async_answer_0(iid, EOK); 230 } 231 232 while (true) { 233 ipc_call_t call; 234 ipc_callid_t callid = async_get_call(&call); 235 236 if (!IPC_GET_IMETHOD(call)) 237 return; 238 239 switch (IPC_GET_IMETHOD(call)) { 240 case VFS_OUT_MOUNTED: 241 vfs_out_mounted(callid, &call); 242 break; 243 case VFS_OUT_MOUNT: 244 vfs_out_mount(callid, &call); 245 break; 246 case VFS_OUT_UNMOUNTED: 247 vfs_out_unmounted(callid, &call); 248 break; 249 case VFS_OUT_UNMOUNT: 250 vfs_out_unmount(callid, &call); 251 break; 252 case VFS_OUT_LOOKUP: 253 vfs_out_lookup(callid, &call); 254 break; 255 case VFS_OUT_READ: 256 vfs_out_read(callid, &call); 257 break; 258 case VFS_OUT_WRITE: 259 vfs_out_write(callid, &call); 260 break; 261 case VFS_OUT_TRUNCATE: 262 vfs_out_truncate(callid, &call); 263 break; 264 case VFS_OUT_CLOSE: 265 vfs_out_close(callid, &call); 266 break; 267 case VFS_OUT_DESTROY: 268 vfs_out_destroy(callid, &call); 269 break; 270 case VFS_OUT_OPEN_NODE: 271 vfs_out_open_node(callid, &call); 272 break; 273 case VFS_OUT_STAT: 274 vfs_out_stat(callid, &call); 275 break; 276 case VFS_OUT_SYNC: 277 vfs_out_sync(callid, &call); 278 break; 279 default: 280 async_answer_0(callid, ENOTSUP); 281 break; 282 } 283 } 284 } 285 63 286 /** Register file system server. 64 287 * … … 68 291 * 69 292 * @param sess Session for communication with VFS. 70 * @param reg File system registration structure. It will be71 * initialized by this function.72 293 * @param info VFS info structure supplied by the file system 73 294 * implementation. 74 * @param conn Connection fibril for handling all calls originating in75 * VFS.295 * @param vops Address of the vfs_out_ops_t structure. 296 * @param lops Address of the libfs_ops_t structure. 76 297 * 77 298 * @return EOK on success or a non-zero error code on errror. 78 299 * 79 300 */ 80 int fs_register(async_sess_t *sess, fs_reg_t *reg, vfs_info_t *info,81 async_client_conn_t conn)301 int fs_register(async_sess_t *sess, vfs_info_t *info, vfs_out_ops_t *vops, 302 libfs_ops_t *lops) 82 303 { 83 304 /* … … 104 325 105 326 /* 327 * Set VFS_OUT and libfs operations. 328 */ 329 vfs_out_ops = vops; 330 libfs_ops = lops; 331 332 /* 106 333 * Ask VFS for callback connection. 107 334 */ 108 async_connect_to_me(exch, 0, 0, 0, conn, NULL);335 async_connect_to_me(exch, 0, 0, 0, vfs_connection, NULL); 109 336 110 337 /* 111 338 * Allocate piece of address space for PLB. 112 339 */ 113 reg ->plb_ro = as_get_mappable_page(PLB_SIZE);114 if (!reg ->plb_ro) {340 reg.plb_ro = as_get_mappable_page(PLB_SIZE); 341 if (!reg.plb_ro) { 115 342 async_exchange_end(exch); 116 343 async_wait_for(req, NULL); … … 121 348 * Request sharing the Path Lookup Buffer with VFS. 122 349 */ 123 rc = async_share_in_start_0_0(exch, reg ->plb_ro, PLB_SIZE);350 rc = async_share_in_start_0_0(exch, reg.plb_ro, PLB_SIZE); 124 351 125 352 async_exchange_end(exch); … … 134 361 */ 135 362 async_wait_for(req, NULL); 136 reg ->fs_handle = (int) IPC_GET_ARG1(answer);363 reg.fs_handle = (int) IPC_GET_ARG1(answer); 137 364 138 365 /* … … 140 367 * the same connection fibril as well. 141 368 */ 142 async_set_client_connection( conn);369 async_set_client_connection(vfs_connection); 143 370 144 371 return IPC_GET_RETVAL(answer); … … 151 378 152 379 void libfs_mount(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, 153 ipc_call_t *req uest)154 { 155 devmap_handle_t mp_devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req uest);156 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*req uest);157 fs_handle_t mr_fs_handle = (fs_handle_t) IPC_GET_ARG3(*req uest);158 devmap_handle_t mr_devmap_handle = (devmap_handle_t) IPC_GET_ARG4(*req uest);380 ipc_call_t *req) 381 { 382 devmap_handle_t mp_devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 383 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*req); 384 fs_handle_t mr_fs_handle = (fs_handle_t) IPC_GET_ARG3(*req); 385 devmap_handle_t mr_devmap_handle = (devmap_handle_t) IPC_GET_ARG4(*req); 159 386 160 387 async_sess_t *mountee_sess = async_clone_receive(EXCHANGE_PARALLEL); … … 208 435 * Do not release the FS node so that it stays in memory. 209 436 */ 210 async_answer_ 3(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer),211 IPC_GET_ARG3(answer) );212 } 213 214 void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *req uest)215 { 216 devmap_handle_t mp_devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req uest);217 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*req uest);437 async_answer_4(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer), 438 IPC_GET_ARG3(answer), IPC_GET_ARG4(answer)); 439 } 440 441 void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *req) 442 { 443 devmap_handle_t mp_devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*req); 444 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*req); 218 445 fs_node_t *fn; 219 446 int res; … … 259 486 } 260 487 488 static char plb_get_char(unsigned pos) 489 { 490 return reg.plb_ro[pos % PLB_SIZE]; 491 } 492 261 493 /** Lookup VFS triplet by name in the file system name space. 262 494 * … … 273 505 */ 274 506 void libfs_lookup(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, 275 ipc_call_t *req uest)276 { 277 unsigned int first = IPC_GET_ARG1(*req uest);278 unsigned int last = IPC_GET_ARG2(*req uest);507 ipc_call_t *req) 508 { 509 unsigned int first = IPC_GET_ARG1(*req); 510 unsigned int last = IPC_GET_ARG2(*req); 279 511 unsigned int next = first; 280 devmap_handle_t devmap_handle = IPC_GET_ARG3(*req uest);281 int lflag = IPC_GET_ARG4(*req uest);282 fs_index_t index = IPC_GET_ARG5(*req uest);512 devmap_handle_t devmap_handle = IPC_GET_ARG3(*req); 513 int lflag = IPC_GET_ARG4(*req); 514 fs_index_t index = IPC_GET_ARG5(*req); 283 515 char component[NAME_MAX + 1]; 284 516 int len; … … 298 530 async_exch_t *exch = async_exchange_begin(cur->mp_data.sess); 299 531 async_forward_slow(rid, exch, VFS_OUT_LOOKUP, next, last, 300 cur->mp_data.devmap_handle, lflag, index, IPC_FF_ROUTE_FROM_ME); 532 cur->mp_data.devmap_handle, lflag, index, 533 IPC_FF_ROUTE_FROM_ME); 301 534 async_exchange_end(exch); 302 535 … … 306 539 307 540 /* Eat slash */ 308 if ( ops->plb_get_char(next) == '/')541 if (plb_get_char(next) == '/') 309 542 next++; 310 543 … … 319 552 /* Collect the component */ 320 553 len = 0; 321 while ((next <= last) && ( ops->plb_get_char(next) != '/')) {554 while ((next <= last) && (plb_get_char(next) != '/')) { 322 555 if (len + 1 == NAME_MAX) { 323 556 /* Component length overflow */ … … 325 558 goto out; 326 559 } 327 component[len++] = ops->plb_get_char(next);560 component[len++] = plb_get_char(next); 328 561 /* Process next character */ 329 562 next++; … … 357 590 358 591 async_exch_t *exch = async_exchange_begin(tmp->mp_data.sess); 359 async_forward_slow(rid, exch, VFS_OUT_LOOKUP, next, last,360 tmp->mp_data.devmap_handle, lflag, index,592 async_forward_slow(rid, exch, VFS_OUT_LOOKUP, next, 593 last, tmp->mp_data.devmap_handle, lflag, index, 361 594 IPC_FF_ROUTE_FROM_ME); 362 595 async_exchange_end(exch); … … 451 684 len = 0; 452 685 while (next <= last) { 453 if ( ops->plb_get_char(next) == '/') {686 if (plb_get_char(next) == '/') { 454 687 /* More than one component */ 455 688 async_answer_0(rid, ENOENT); … … 463 696 } 464 697 465 component[len++] = ops->plb_get_char(next);698 component[len++] = plb_get_char(next); 466 699 /* Process next character */ 467 700 next++; … … 637 870 rc = ops->node_open(fn); 638 871 aoff64_t size = ops->size_get(fn); 639 async_answer_4(rid, rc, LOWER32(size), UPPER32(size), ops->lnkcnt_get(fn), 872 async_answer_4(rid, rc, LOWER32(size), UPPER32(size), 873 ops->lnkcnt_get(fn), 640 874 (ops->is_file(fn) ? L_FILE : 0) | (ops->is_directory(fn) ? L_DIRECTORY : 0)); 641 875 -
uspace/lib/fs/libfs.h
rc936c7f r80e9e5e 43 43 44 44 typedef struct { 45 int (* mounted)(devmap_handle_t, const char *, fs_index_t *, aoff64_t *, 46 unsigned *); 47 int (* unmounted)(devmap_handle_t); 48 int (* read)(devmap_handle_t, fs_index_t, aoff64_t, size_t *); 49 int (* write)(devmap_handle_t, fs_index_t, aoff64_t, size_t *, 50 aoff64_t *); 51 int (* truncate)(devmap_handle_t, fs_index_t, aoff64_t); 52 int (* close)(devmap_handle_t, fs_index_t); 53 int (* destroy)(devmap_handle_t, fs_index_t); 54 int (* sync)(devmap_handle_t, fs_index_t); 55 } vfs_out_ops_t; 56 57 typedef struct { 45 58 bool mp_active; 46 59 async_sess_t *sess; … … 71 84 int (* has_children)(bool *, fs_node_t *); 72 85 /* 73 * The second set of methods are usually mere getters that do not return74 * an integer error code.86 * The second set of methods are usually mere getters that do not 87 * return an integer error code. 75 88 */ 76 89 fs_index_t (* index_get)(fs_node_t *); 77 90 aoff64_t (* size_get)(fs_node_t *); 78 91 unsigned int (* lnkcnt_get)(fs_node_t *); 79 char (* plb_get_char)(unsigned pos);80 92 bool (* is_directory)(fs_node_t *); 81 93 bool (* is_file)(fs_node_t *); … … 88 100 } fs_reg_t; 89 101 90 extern int fs_register(async_sess_t *, fs_reg_t *, vfs_info_t *,91 async_client_conn_t);102 extern int fs_register(async_sess_t *, vfs_info_t *, vfs_out_ops_t *, 103 libfs_ops_t *); 92 104 93 105 extern void fs_node_initialize(fs_node_t *); 94 95 extern void libfs_mount(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);96 extern void libfs_unmount(libfs_ops_t *, ipc_callid_t, ipc_call_t *);97 extern void libfs_lookup(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);98 extern void libfs_stat(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);99 extern void libfs_open_node(libfs_ops_t *, fs_handle_t, ipc_callid_t,100 ipc_call_t *);101 106 102 107 #endif -
uspace/lib/scsi/include/scsi/sbc.h
rc936c7f r80e9e5e 56 56 }; 57 57 58 /** SCSI Read (10) command */ 59 typedef struct { 60 /** Operation code (SCSI_CMD_READ_10) */ 61 uint8_t op_code; 62 /** RdProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */ 63 uint8_t flags; 64 /** Logical block address */ 65 uint32_t lba; 66 /** Reserved, Group Number */ 67 uint8_t group_no; 68 /** Transfer length */ 69 uint16_t xfer_len; 70 /** Control */ 71 uint8_t control; 72 } __attribute__((packed)) scsi_cdb_read_10_t; 73 58 74 /** SCSI Read (12) command */ 59 75 typedef struct { 60 76 /** Operation code (SCSI_CMD_READ_12) */ 61 77 uint8_t op_code; 62 /** RdProtect, DPO, FUA, Reserved, FUA_NV, Reserved*/78 /** RdProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */ 63 79 uint8_t flags; 64 80 /** Logical block address */ … … 115 131 } scsi_read_capacity_10_data_t; 116 132 133 /** SCSI Write (10) command */ 134 typedef struct { 135 /** Operation code (SCSI_CMD_WRITE_10) */ 136 uint8_t op_code; 137 /** WrProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */ 138 uint8_t flags; 139 /** Logical block address */ 140 uint32_t lba; 141 /** Reserved, Group Number */ 142 uint8_t group_no; 143 /** Transfer length */ 144 uint16_t xfer_len; 145 /** Control */ 146 uint8_t control; 147 } __attribute__((packed)) scsi_cdb_write_10_t; 148 117 149 /** SCSI Write (12) command */ 118 150 typedef struct { 119 151 /** Operation code (SCSI_CMD_WRITE_12) */ 120 152 uint8_t op_code; 121 /** WrProtect, DPO, FUA, Reserved, FUA_NV, Reserved*/153 /** WrProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */ 122 154 uint8_t flags; 123 155 /** Logical block address */ -
uspace/lib/scsi/include/scsi/spc.h
rc936c7f r80e9e5e 179 179 uint8_t additional_len; 180 180 /** Command-specific Information */ 181 uint 8_t cmd_spec;181 uint32_t cmd_spec; 182 182 /** Additional Sense Code */ 183 183 uint8_t additional_code; … … 205 205 SCSI_SK_ABORTED_COMMAND = 0xb, 206 206 SCSI_SK_VOLUME_OVERFLOW = 0xd, 207 SCSI_SK_MISCOMPARE = 0xe 207 SCSI_SK_MISCOMPARE = 0xe, 208 209 SCSI_SK_LIMIT = 0x10 208 210 }; 209 211 210 212 extern const char *scsi_dev_type_str[SCSI_DEV_LIMIT]; 213 extern const char *scsi_sense_key_str[SCSI_SK_LIMIT]; 214 211 215 extern const char *scsi_get_dev_type_str(unsigned); 216 extern const char *scsi_get_sense_key_str(unsigned); 212 217 213 218 #endif -
uspace/lib/scsi/src/spc.c
rc936c7f r80e9e5e 44 44 }; 45 45 46 const char *scsi_sense_key_str[SCSI_SK_LIMIT] = { 47 [SCSI_SK_NO_SENSE] = "No Sense", 48 [SCSI_SK_RECOVERED_ERROR] = "Recovered Error", 49 [SCSI_SK_NOT_READY] = "Not Ready", 50 [SCSI_SK_MEDIUM_ERROR] = "Medium Error", 51 [SCSI_SK_HARDWARE_ERROR] = "Hardware Error", 52 [SCSI_SK_ILLEGAL_REQUEST] = "Illegal Request", 53 [SCSI_SK_UNIT_ATTENTION] = "Unit Attention", 54 [SCSI_SK_DATA_PROTECT] = "Data Protect", 55 [SCSI_SK_BLANK_CHECK] = "Blank Check", 56 [SCSI_SK_VENDOR_SPECIFIC] = "Vendor-specific", 57 [SCSI_SK_COPY_ABORTED] = "Copy Aborted", 58 [SCSI_SK_ABORTED_COMMAND] = "Aborted Command", 59 [SCSI_SK_VOLUME_OVERFLOW] = "Volume Overflow", 60 [SCSI_SK_MISCOMPARE] = "Miscompare" 61 }; 62 46 63 /** Get peripheral device type string. 47 64 * … … 53 70 { 54 71 if (dev_type >= SCSI_DEV_LIMIT || scsi_dev_type_str[dev_type] == NULL) 55 return " <unknown>";72 return "Unknown"; 56 73 57 74 return scsi_dev_type_str[dev_type]; 58 75 } 76 77 /** Get sense key string. 78 * 79 * Return string description of SCSI sense key. 80 * The returned string is valid indefinitely, the caller should 81 * not attempt to free it. 82 */ 83 const char *scsi_get_sense_key_str(unsigned sense_key) 84 { 85 if (sense_key >= SCSI_SK_LIMIT || scsi_sense_key_str[sense_key] == NULL) 86 return "Unknown"; 87 88 return scsi_sense_key_str[sense_key]; 89 } 90
Note:
See TracChangeset
for help on using the changeset viewer.
