Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-misc-next-fixes-2016-12-10' of git://anongit.freedesktop.org/git/drm-misc into drm-next

single fix for backwards compat.

* tag 'drm-misc-next-fixes-2016-12-10' of git://anongit.freedesktop.org/git/drm-misc:
drm: Add fake controlD* symlinks for backwards compat

+62
+62
drivers/gpu/drm/drm_drv.c
··· 647 647 } 648 648 EXPORT_SYMBOL(drm_dev_unref); 649 649 650 + static int create_compat_control_link(struct drm_device *dev) 651 + { 652 + struct drm_minor *minor; 653 + char *name; 654 + int ret; 655 + 656 + if (!drm_core_check_feature(dev, DRIVER_MODESET)) 657 + return 0; 658 + 659 + minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY); 660 + if (!minor) 661 + return 0; 662 + 663 + /* 664 + * Some existing userspace out there uses the existing of the controlD* 665 + * sysfs files to figure out whether it's a modeset driver. It only does 666 + * readdir, hence a symlink is sufficient (and the least confusing 667 + * option). Otherwise controlD* is entirely unused. 668 + * 669 + * Old controlD chardev have been allocated in the range 670 + * 64-127. 671 + */ 672 + name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64); 673 + if (!name) 674 + return -ENOMEM; 675 + 676 + ret = sysfs_create_link(minor->kdev->kobj.parent, 677 + &minor->kdev->kobj, 678 + name); 679 + 680 + kfree(name); 681 + 682 + return ret; 683 + } 684 + 685 + static void remove_compat_control_link(struct drm_device *dev) 686 + { 687 + struct drm_minor *minor; 688 + char *name; 689 + 690 + if (!drm_core_check_feature(dev, DRIVER_MODESET)) 691 + return; 692 + 693 + minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY); 694 + if (!minor) 695 + return; 696 + 697 + name = kasprintf(GFP_KERNEL, "controlD%d", minor->index); 698 + if (!name) 699 + return; 700 + 701 + sysfs_remove_link(minor->kdev->kobj.parent, name); 702 + 703 + kfree(name); 704 + } 705 + 650 706 /** 651 707 * drm_dev_register - Register DRM device 652 708 * @dev: Device to register ··· 741 685 if (ret) 742 686 goto err_minors; 743 687 688 + ret = create_compat_control_link(dev); 689 + if (ret) 690 + goto err_minors; 691 + 744 692 if (dev->driver->load) { 745 693 ret = dev->driver->load(dev, flags); 746 694 if (ret) ··· 758 698 goto out_unlock; 759 699 760 700 err_minors: 701 + remove_compat_control_link(dev); 761 702 drm_minor_unregister(dev, DRM_MINOR_PRIMARY); 762 703 drm_minor_unregister(dev, DRM_MINOR_RENDER); 763 704 drm_minor_unregister(dev, DRM_MINOR_CONTROL); ··· 799 738 list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) 800 739 drm_legacy_rmmap(dev, r_list->map); 801 740 741 + remove_compat_control_link(dev); 802 742 drm_minor_unregister(dev, DRM_MINOR_PRIMARY); 803 743 drm_minor_unregister(dev, DRM_MINOR_RENDER); 804 744 drm_minor_unregister(dev, DRM_MINOR_CONTROL);