Lines Matching refs:dev
33 static ssize_t bio_default_read(struct bdev *dev, void *_buf, off_t offset, size_t len) { in bio_default_read() argument
38 STACKBUF_DMA_ALIGN(temp, dev->block_size); // temporary buffer for partial block transfers in bio_default_read()
41 block = divpow2(offset, dev->block_shift); in bio_default_read()
45 if ((offset % dev->block_size) != 0) { in bio_default_read()
47 err = bio_read_block(dev, temp, block, 1); in bio_default_read()
50 } else if ((size_t)err != dev->block_size) { in bio_default_read()
56 size_t block_offset = offset % dev->block_size; in bio_default_read()
57 size_t tocopy = MIN(dev->block_size - block_offset, len); in bio_default_read()
71 (dev->flags & BIO_FLAG_CACHE_ALIGNED_READS) && in bio_default_read()
75 while (len >= dev->block_size) { in bio_default_read()
77 err = bio_read_block(dev, temp, block, 1); in bio_default_read()
80 } else if ((size_t)err != dev->block_size) { in bio_default_read()
84 memcpy(buf, temp, dev->block_size); in bio_default_read()
86 buf += dev->block_size; in bio_default_read()
87 len -= dev->block_size; in bio_default_read()
88 bytes_read += dev->block_size; in bio_default_read()
92 uint32_t num_blocks = divpow2(len, dev->block_shift); in bio_default_read()
93 err = bio_read_block(dev, buf, block, num_blocks); in bio_default_read()
96 } else if ((size_t)err != dev->block_size * num_blocks) { in bio_default_read()
110 err = bio_read_block(dev, temp, block, 1); in bio_default_read()
113 } else if ((size_t)err != dev->block_size) { in bio_default_read()
129 static ssize_t bio_default_write(struct bdev *dev, const void *_buf, off_t offset, size_t len) { in bio_default_write() argument
134 STACKBUF_DMA_ALIGN(temp, dev->block_size); // temporary buffer for partial block transfers in bio_default_write()
137 block = divpow2(offset, dev->block_shift); in bio_default_write()
141 if ((offset % dev->block_size) != 0) { in bio_default_write()
143 err = bio_read_block(dev, temp, block, 1); in bio_default_write()
146 } else if ((size_t)err != dev->block_size) { in bio_default_write()
152 size_t block_offset = offset % dev->block_size; in bio_default_write()
153 size_t tocopy = MIN(dev->block_size - block_offset, len); in bio_default_write()
157 err = bio_write_block(dev, temp, block, 1); in bio_default_write()
160 } else if ((size_t)err != dev->block_size) { in bio_default_write()
176 (dev->flags & BIO_FLAG_CACHE_ALIGNED_WRITES) && in bio_default_write()
181 while (len >= dev->block_size) { in bio_default_write()
183 memcpy(temp, buf, dev->block_size); in bio_default_write()
184 err = bio_write_block(dev, temp, block, 1); in bio_default_write()
187 } else if ((size_t)err != dev->block_size) { in bio_default_write()
192 buf += dev->block_size; in bio_default_write()
193 len -= dev->block_size; in bio_default_write()
194 bytes_written += dev->block_size; in bio_default_write()
198 uint32_t block_count = divpow2(len, dev->block_shift); in bio_default_write()
199 err = bio_write_block(dev, buf, block, block_count); in bio_default_write()
202 } else if ((size_t)err != dev->block_size * block_count) { in bio_default_write()
207 DEBUG_ASSERT((size_t)err == (block_count * dev->block_size)); in bio_default_write()
219 err = bio_read_block(dev, temp, block, 1); in bio_default_write()
222 } else if ((size_t)err != dev->block_size) { in bio_default_write()
231 err = bio_write_block(dev, temp, block, 1); in bio_default_write()
234 } else if ((size_t)err != dev->block_size) { in bio_default_write()
247 static ssize_t bio_default_erase(struct bdev *dev, off_t offset, size_t len) { in bio_default_erase() argument
249 STACKBUF_DMA_ALIGN(erase_buf, dev->block_size); in bio_default_erase()
251 memset(erase_buf, dev->erase_byte, dev->block_size); in bio_default_erase()
257 size_t towrite = MIN(remaining, dev->block_size); in bio_default_erase()
259 ssize_t written = bio_write(dev, erase_buf, pos, towrite); in bio_default_erase()
274 static ssize_t bio_default_read_block(struct bdev *dev, void *buf, bnum_t block, uint count) { in bio_default_read_block() argument
278 static ssize_t bio_default_write_block(struct bdev *dev, const void *buf, bnum_t block, uint count)… in bio_default_write_block() argument
282 static void bdev_inc_ref(bdev_t *dev) { in bdev_inc_ref() argument
283 LTRACEF("Add ref \"%s\" %d -> %d\n", dev->name, dev->ref, dev->ref + 1); in bdev_inc_ref()
284 atomic_add(&dev->ref, 1); in bdev_inc_ref()
287 static void bdev_dec_ref(bdev_t *dev) { in bdev_dec_ref() argument
288 int oldval = atomic_add(&dev->ref, -1); in bdev_dec_ref()
290 LTRACEF("Dec ref \"%s\" %d -> %d\n", dev->name, oldval, dev->ref); in bdev_dec_ref()
294 DEBUG_ASSERT(!list_in_list(&dev->node)); in bdev_dec_ref()
296 TRACEF("last ref, removing (%s)\n", dev->name); in bdev_dec_ref()
299 if (dev->close) in bdev_dec_ref()
300 dev->close(dev); in bdev_dec_ref()
302 free(dev->name); in bdev_dec_ref()
306 size_t bio_trim_range(const bdev_t *dev, off_t offset, size_t len) { in bio_trim_range() argument
310 if (offset >= dev->total_size) in bio_trim_range()
314 if ((off_t)(offset + len) > dev->total_size) in bio_trim_range()
315 len = dev->total_size - offset; in bio_trim_range()
320 uint bio_trim_block_range(const bdev_t *dev, bnum_t block, uint count) { in bio_trim_block_range() argument
321 if (block > dev->block_count) in bio_trim_block_range()
325 if (block + count > dev->block_count) in bio_trim_block_range()
326 count = dev->block_count - block; in bio_trim_block_range()
352 void bio_close(bdev_t *dev) { in bio_close() argument
353 DEBUG_ASSERT(dev); in bio_close()
354 LTRACEF(" '%s'\n", dev->name); in bio_close()
355 bdev_dec_ref(dev); in bio_close()
358 ssize_t bio_read(bdev_t *dev, void *buf, off_t offset, size_t len) { in bio_read() argument
359 LTRACEF("dev '%s', buf %p, offset %lld, len %zd\n", dev->name, buf, offset, len); in bio_read()
361 DEBUG_ASSERT(dev && dev->ref > 0); in bio_read()
365 len = bio_trim_range(dev, offset, len); in bio_read()
369 return dev->read(dev, buf, offset, len); in bio_read()
372 status_t bio_read_async(bdev_t *dev, void *buf, off_t offset, size_t len, in bio_read_async() argument
374 LTRACEF("dev '%s', buf %p, offset %lld, len %zd\n", dev->name, buf, offset, in bio_read_async()
377 DEBUG_ASSERT(dev && dev->ref > 0); in bio_read_async()
379 if (dev->read_async == NULL) { in bio_read_async()
384 len = bio_trim_range(dev, offset, len); in bio_read_async()
389 return dev->read_async(dev, buf, offset, len, callback, callback_context); in bio_read_async()
392 ssize_t bio_read_block(bdev_t *dev, void *buf, bnum_t block, uint count) { in bio_read_block() argument
393 LTRACEF("dev '%s', buf %p, block %d, count %u\n", dev->name, buf, block, count); in bio_read_block()
395 DEBUG_ASSERT(dev && dev->ref > 0); in bio_read_block()
399 count = bio_trim_block_range(dev, block, count); in bio_read_block()
403 return dev->read_block(dev, buf, block, count); in bio_read_block()
406 ssize_t bio_write(bdev_t *dev, const void *buf, off_t offset, size_t len) { in bio_write() argument
407 LTRACEF("dev '%s', buf %p, offset %lld, len %zd\n", dev->name, buf, offset, len); in bio_write()
409 DEBUG_ASSERT(dev && dev->ref > 0); in bio_write()
413 len = bio_trim_range(dev, offset, len); in bio_write()
417 return dev->write(dev, buf, offset, len); in bio_write()
420 ssize_t bio_write_block(bdev_t *dev, const void *buf, bnum_t block, uint count) { in bio_write_block() argument
421 LTRACEF("dev '%s', buf %p, block %d, count %u\n", dev->name, buf, block, count); in bio_write_block()
423 DEBUG_ASSERT(dev && dev->ref > 0); in bio_write_block()
427 count = bio_trim_block_range(dev, block, count); in bio_write_block()
431 return dev->write_block(dev, buf, block, count); in bio_write_block()
434 ssize_t bio_erase(bdev_t *dev, off_t offset, size_t len) { in bio_erase() argument
435 LTRACEF("dev '%s', offset %lld, len %zd\n", dev->name, offset, len); in bio_erase()
437 DEBUG_ASSERT(dev && dev->ref > 0); in bio_erase()
440 len = bio_trim_range(dev, offset, len); in bio_erase()
444 return dev->erase(dev, offset, len); in bio_erase()
447 int bio_ioctl(bdev_t *dev, int request, void *argp) { in bio_ioctl() argument
448 LTRACEF("dev '%s', request %08x, argp %p\n", dev->name, request, argp); in bio_ioctl()
450 if (dev->ioctl == NULL) { in bio_ioctl()
453 return dev->ioctl(dev, request, argp); in bio_ioctl()
457 void bio_initialize_bdev(bdev_t *dev, in bio_initialize_bdev() argument
464 DEBUG_ASSERT(dev); in bio_initialize_bdev()
470 list_clear_node(&dev->node); in bio_initialize_bdev()
471 dev->name = strdup(name); in bio_initialize_bdev()
472 dev->block_size = block_size; in bio_initialize_bdev()
473 dev->block_count = block_count; in bio_initialize_bdev()
474 dev->block_shift = log2_uint(block_size); in bio_initialize_bdev()
475 dev->total_size = (off_t)block_count << dev->block_shift; in bio_initialize_bdev()
476 dev->geometry_count = geometry_count; in bio_initialize_bdev()
477 dev->geometry = geometry; in bio_initialize_bdev()
478 dev->erase_byte = 0; in bio_initialize_bdev()
479 dev->ref = 0; in bio_initialize_bdev()
480 dev->flags = flags; in bio_initialize_bdev()
504 DEBUG_ASSERT(!(info->size & (((off_t)1 << dev->block_shift) - 1))); in bio_initialize_bdev()
511 bio_geometry_info_t *r1 = dev->geometry + i; in bio_initialize_bdev()
512 bio_geometry_info_t *r2 = dev->geometry + i + 1; in bio_initialize_bdev()
516 bio_geometry_info_t *r2 = dev->geometry + j; in bio_initialize_bdev()
524 dev->read = bio_default_read; in bio_initialize_bdev()
525 dev->read_block = bio_default_read_block; in bio_initialize_bdev()
526 dev->write = bio_default_write; in bio_initialize_bdev()
527 dev->write_block = bio_default_write_block; in bio_initialize_bdev()
528 dev->erase = bio_default_erase; in bio_initialize_bdev()
529 dev->close = NULL; in bio_initialize_bdev()
532 void bio_register_device(bdev_t *dev) { in bio_register_device() argument
533 DEBUG_ASSERT(dev); in bio_register_device()
535 LTRACEF(" '%s'\n", dev->name); in bio_register_device()
537 bdev_inc_ref(dev); in bio_register_device()
540 list_add_tail(&bdevs.list, &dev->node); in bio_register_device()
544 void bio_unregister_device(bdev_t *dev) { in bio_unregister_device() argument
545 DEBUG_ASSERT(dev); in bio_unregister_device()
547 LTRACEF(" '%s'\n", dev->name); in bio_unregister_device()
551 list_delete(&dev->node); in bio_unregister_device()
554 bdev_dec_ref(dev); // remove the ref the list used to have in bio_unregister_device()