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

leds: leds-ns2: fix private driver data storage

dev_set_drvdata() can't be used to set the driver private data pointer.
This would overwrite the led classdev object previously registered by
led_classdev_register().

Note that despite this mistake, the driver work fine because led_dat and
led_dat->cdev are at the same memory address.

Signed-off-by: Simon Guinot <sguinot@lacie.com>
Signed-off-by: Nicolas Pitre <nico@fluxnic.net>

authored by

Simon Guinot and committed by
Nicolas Pitre
e5971bbc b51d92da

+6 -3
+6 -3
drivers/leds/leds-ns2.c
··· 141 141 struct device_attribute *attr, 142 142 const char *buff, size_t count) 143 143 { 144 + struct led_classdev *led_cdev = dev_get_drvdata(dev); 145 + struct ns2_led_data *led_dat = 146 + container_of(led_cdev, struct ns2_led_data, cdev); 144 147 int ret; 145 148 unsigned long enable; 146 149 enum ns2_led_modes mode; 147 - struct ns2_led_data *led_dat = dev_get_drvdata(dev); 148 150 149 151 ret = strict_strtoul(buff, 10, &enable); 150 152 if (ret < 0) ··· 174 172 static ssize_t ns2_led_sata_show(struct device *dev, 175 173 struct device_attribute *attr, char *buf) 176 174 { 177 - struct ns2_led_data *led_dat = dev_get_drvdata(dev); 175 + struct led_classdev *led_cdev = dev_get_drvdata(dev); 176 + struct ns2_led_data *led_dat = 177 + container_of(led_cdev, struct ns2_led_data, cdev); 178 178 179 179 return sprintf(buf, "%d\n", led_dat->sata); 180 180 } ··· 238 234 if (ret < 0) 239 235 goto err_free_slow; 240 236 241 - dev_set_drvdata(led_dat->cdev.dev, led_dat); 242 237 ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata); 243 238 if (ret < 0) 244 239 goto err_free_cdev;