Lines Matching refs:dev

1 /*	$NetBSD: dev-io.c,v 1.9 2010/12/29 00:14:04 haad Exp $	*/
69 int fd = dev_fd(where->dev);
75 dev_name(where->dev));
92 dev_name(where->dev), (uint64_t) where->start,
106 " at %" PRIu64 ": %s", dev_name(where->dev),
132 static int _get_block_size(struct device *dev, unsigned int *size)
134 const char *name = dev_name(dev);
141 if ((dev->block_size == -1)) {
143 if (prop_dictionary_recv_ioctl(dev_fd(dev), DIOCGDISKINFO, &disk_dict)) {
144 if (ioctl(dev_fd(dev), DIOCGDINFO, &lab) < 0) {
145 dev->block_size = DEV_BSIZE;
147 dev->block_size = lab.d_secsize;
151 dev->block_size = secsize;
154 if (ioctl(dev_fd(dev), BLKBSZGET, &dev->block_size) < 0) {
159 log_debug("%s: block size is %u bytes", name, dev->block_size);
162 *size = (unsigned int) dev->block_size;
197 if (!(where->dev->flags & DEV_REGULAR) &&
198 !_get_block_size(where->dev, &block_size))
246 static int _dev_get_size_file(const struct device *dev, uint64_t *size)
248 const char *name = dev_name(dev);
264 static int _dev_get_size_dev(const struct device *dev, uint64_t *size)
267 const char *name = dev_name(dev);
315 static int _dev_read_ahead_dev(struct device *dev, uint32_t *read_ahead)
320 if (dev->read_ahead != -1) {
321 *read_ahead = (uint32_t) dev->read_ahead;
325 if (!dev_open(dev))
328 if (ioctl(dev->fd, BLKRAGET, &read_ahead_long) < 0) {
329 log_sys_error("ioctl BLKRAGET", dev_name(dev));
330 if (!dev_close(dev))
335 if (!dev_close(dev))
339 dev->read_ahead = read_ahead_long;
342 dev_name(dev), *read_ahead);
351 int dev_get_size(const struct device *dev, uint64_t *size)
353 if (!dev)
356 if ((dev->flags & DEV_REGULAR))
357 return _dev_get_size_file(dev, size);
359 return _dev_get_size_dev(dev, size);
362 int dev_get_read_ahead(struct device *dev, uint32_t *read_ahead)
364 if (!dev)
367 if (dev->flags & DEV_REGULAR) {
372 return _dev_read_ahead_dev(dev, read_ahead);
376 int dev_get_sectsize(struct device *dev, uint32_t *size)
380 const char *name = dev_name(dev);
405 void dev_flush(struct device *dev)
408 if (!(dev->flags & DEV_REGULAR) && ioctl(dev->fd, BLKFLSBUF, 0) >= 0)
412 if (fsync(dev->fd) >= 0)
418 int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
430 if (dev->fd >= 0) {
431 if (((dev->flags & DEV_OPENED_RW) || !need_rw) &&
432 ((dev->flags & DEV_OPENED_EXCL) || !need_excl)) {
433 dev->open_count++;
437 if (dev->open_count && !need_excl) {
440 dev_name(dev));
441 dev->open_count++;
444 dev_close_immediate(dev);
449 dev_name(dev));
451 if (dev->flags & DEV_REGULAR)
452 name = dev_name(dev);
453 else if (!(name = dev_name_confirmed(dev, quiet)))
456 if (!(dev->flags & DEV_REGULAR)) {
461 if (buf.st_rdev != dev->dev) {
469 if (!(dev->flags & DEV_O_DIRECT_TESTED))
470 dev->flags |= DEV_O_DIRECT;
472 if ((dev->flags & DEV_O_DIRECT))
479 if (!(dev->flags & DEV_REGULAR))
483 if ((dev->fd = open(name, flags, 0777)) < 0) {
485 if (direct && !(dev->flags & DEV_O_DIRECT_TESTED)) {
487 if ((dev->fd = open(name, flags, 0777)) >= 0) {
488 dev->flags &= ~DEV_O_DIRECT;
505 dev->flags |= DEV_O_DIRECT_TESTED;
507 dev->open_count++;
508 dev->flags &= ~DEV_ACCESSED_W;
511 dev->flags |= DEV_OPENED_RW;
513 dev->flags &= ~DEV_OPENED_RW;
516 dev->flags |= DEV_OPENED_EXCL;
518 dev->flags &= ~DEV_OPENED_EXCL;
520 if (!(dev->flags & DEV_REGULAR) &&
521 ((fstat(dev->fd, &buf) < 0) || (buf.st_rdev != dev->dev))) {
523 dev_close_immediate(dev);
528 if (!(dev->flags & DEV_REGULAR))
529 dev_flush(dev);
533 dev->end = lseek(dev->fd, (off_t) 0, SEEK_END);
535 dm_list_add(&_open_devices, &dev->open_list);
537 log_debug("Opened %s %s%s%s", dev_name(dev),
538 dev->flags & DEV_OPENED_RW ? "RW" : "RO",
539 dev->flags & DEV_OPENED_EXCL ? " O_EXCL" : "",
540 dev->flags & DEV_O_DIRECT ? " O_DIRECT" : "");
545 int dev_open_quiet(struct device *dev)
551 return dev_open_flags(dev, flags, 1, 1);
554 int dev_open(struct device *dev)
560 return dev_open_flags(dev, flags, 1, 0);
563 int dev_test_excl(struct device *dev)
571 r = dev_open_flags(dev, flags, 1, 1);
573 dev_close_immediate(dev);
578 static void _close(struct device *dev)
580 if (close(dev->fd))
581 log_sys_error("close", dev_name(dev));
582 dev->fd = -1;
583 dev->block_size = -1;
584 dm_list_del(&dev->open_list);
586 log_debug("Closed %s", dev_name(dev));
588 if (dev->flags & DEV_ALLOCED) {
589 dm_free((void *) dm_list_item(dev->aliases.n, struct str_list)->
591 dm_free(dev->aliases.n);
592 dm_free(dev);
596 static int _dev_close(struct device *dev, int immediate)
600 if (dev->fd < 0) {
602 "which is not open.", dev_name(dev));
607 if (dev->flags & DEV_ACCESSED_W)
608 dev_flush(dev);
611 if (dev->open_count > 0)
612 dev->open_count--;
614 if (immediate && dev->open_count)
616 dev_name(dev));
620 (dev->open_count < 1 &&
621 (!(info = info_from_pvid(dev->pvid, 0)) ||
624 _close(dev);
629 int dev_close(struct device *dev)
631 return _dev_close(dev, 0);
634 int dev_close_immediate(struct device *dev)
636 return _dev_close(dev, 1);
642 struct device *dev;
645 dev = dm_list_struct_base(doh, struct device, open_list);
646 if (dev->open_count < 1)
647 _close(dev);
651 int dev_read(struct device *dev, uint64_t offset, size_t len, void *buffer)
655 if (!dev->open_count)
658 where.dev = dev;
666 * Read from 'dev' into 'buf', possibly in 2 distinct regions, denoted
670 int dev_read_circular(struct device *dev, uint64_t offset, size_t len,
673 if (!dev_read(dev, offset, len, buf)) {
674 log_error("Read from %s failed", dev_name(dev));
685 if (!dev_read(dev, offset2, len2, buf + len)) {
687 dev_name(dev));
699 int dev_append(struct device *dev, size_t len, void *buffer)
703 if (!dev->open_count)
706 r = dev_write(dev, dev->end, len, buffer);
707 dev->end += (uint64_t) len;
710 dev_flush(dev);
715 int dev_write(struct device *dev, uint64_t offset, size_t len, void *buffer)
719 if (!dev->open_count)
722 where.dev = dev;
726 dev->flags |= DEV_ACCESSED_W;
731 int dev_set(struct device *dev, uint64_t offset, size_t len, int value)
736 if (!dev_open(dev))
741 dev_name(dev), offset, len);
744 " sectors", dev_name(dev), offset >> SECTOR_SHIFT,
750 if (!dev_write(dev, offset, s, buffer))
760 dev->flags |= DEV_ACCESSED_W;
762 if (!dev_close(dev))