| 625 | } |
| 626 | |
| 627 | static int |
| 628 | prep_cdevsw(struct cdevsw *devsw, int flags) |
| 629 | { |
| 630 | struct cdevsw *dsw2; |
| 631 | |
| 632 | dev_lock_assert_locked(); |
| 633 | if (devsw->d_flags & D_INIT) |
| 634 | return (0); |
| 635 | if (devsw->d_flags & D_NEEDGIANT) { |
| 636 | dev_unlock(); |
| 637 | dsw2 = malloc(sizeof *dsw2, M_DEVT, |
| 638 | (flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK); |
| 639 | dev_lock(); |
| 640 | if (dsw2 == NULL && !(devsw->d_flags & D_INIT)) |
| 641 | return (ENOMEM); |
| 642 | } else |
| 643 | dsw2 = NULL; |
| 644 | if (devsw->d_flags & D_INIT) { |
| 645 | if (dsw2 != NULL) |
| 646 | cdevsw_free_devlocked(dsw2); |
| 647 | return (0); |
| 648 | } |
| 649 | |
| 650 | if (devsw->d_version != D_VERSION_04) { |
| 651 | printf( |
| 652 | "WARNING: Device driver \"%s\" has wrong version %s\n", |
| 653 | devsw->d_name == NULL ? "???" : devsw->d_name, |
| 654 | "and is disabled. Recompile KLD module."); |
| 655 | devsw->d_open = dead_open; |
| 656 | devsw->d_close = dead_close; |
| 657 | devsw->d_read = dead_read; |
| 658 | devsw->d_write = dead_write; |
| 659 | devsw->d_ioctl = dead_ioctl; |
| 660 | devsw->d_poll = dead_poll; |
| 661 | devsw->d_mmap = dead_mmap; |
| 662 | devsw->d_mmap_single = dead_mmap_single; |
| 663 | devsw->d_strategy = dead_strategy; |
| 664 | devsw->d_dump = dead_dump; |
| 665 | devsw->d_kqfilter = dead_kqfilter; |
| 666 | } |
| 667 | |
| 668 | if (devsw->d_flags & D_NEEDGIANT) { |
| 669 | printf("WARNING: Device \"%s\" is Giant locked and may be " |
| 670 | "deleted before FreeBSD 14.0.\n", |
| 671 | devsw->d_name == NULL ? "???" : devsw->d_name); |
| 672 | if (devsw->d_gianttrick == NULL) { |
| 673 | memcpy(dsw2, devsw, sizeof *dsw2); |
| 674 | devsw->d_gianttrick = dsw2; |
| 675 | dsw2 = NULL; |
| 676 | } |
| 677 | } |
| 678 | |
| 679 | #define FIXUP(member, noop, giant) \ |
| 680 | do { \ |
| 681 | if (devsw->member == NULL) { \ |
| 682 | devsw->member = noop; \ |
| 683 | } else if (devsw->d_flags & D_NEEDGIANT) \ |
| 684 | devsw->member = giant; \ |
no test coverage detected