Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a6600be authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds
Browse files

[PATCH] fbdev: Honor the return value of device_create_file



Check the return value of device_create_file().  If return is 'fail', remove
attributes by calling device_remove_file().

Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 928e964f
Loading
Loading
Loading
Loading
+28 −7
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include <linux/console.h>
#include <linux/module.h>

#define FB_SYSFS_FLAG_ATTR 1

/**
 * framebuffer_alloc - creates a new frame buffer info structure
 *
@@ -483,12 +485,27 @@ static struct class_device_attribute class_device_attrs[] = {

int fb_init_class_device(struct fb_info *fb_info)
{
	unsigned int i;
	int i, error = 0;

	class_set_devdata(fb_info->class_device, fb_info);

	for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
		class_device_create_file(fb_info->class_device,
	fb_info->class_flag |= FB_SYSFS_FLAG_ATTR;

	for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) {
		error = class_device_create_file(fb_info->class_device,
						 &class_device_attrs[i]);

		if (error)
			break;
	}

	if (error) {
		while (--i >= 0)
			class_device_remove_file(fb_info->class_device,
						 &class_device_attrs[i]);
		fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR;
	}

	return 0;
}

@@ -496,9 +513,13 @@ void fb_cleanup_class_device(struct fb_info *fb_info)
{
	unsigned int i;

	if (fb_info->class_flag & FB_SYSFS_FLAG_ATTR) {
		for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
			class_device_remove_file(fb_info->class_device,
						 &class_device_attrs[i]);

		fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR;
	}
}

#ifdef CONFIG_FB_BACKLIGHT
+1 −0
Original line number Diff line number Diff line
@@ -776,6 +776,7 @@ struct fb_info {
	struct fb_ops *fbops;
	struct device *device;
	struct class_device *class_device; /* sysfs per device attrs */
	int class_flag;                    /* private sysfs flags */
#ifdef CONFIG_FB_TILEBLITTING
	struct fb_tile_ops *tileops;    /* Tile Blitting */
#endif