Commit e5971bbc1caf0ccbab3fea74fe37abb649d1c7cf
Committed by
Nicolas Pitre
1 parent
b51d92da4e
Exists in
master
and in
7 other branches
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>
Showing 1 changed file with 6 additions and 3 deletions Side-by-side Diff
drivers/leds/leds-ns2.c
... | ... | @@ -141,10 +141,12 @@ |
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) |
... | ... | @@ -172,7 +174,9 @@ |
172 | 174 | static ssize_t ns2_led_sata_show(struct device *dev, |
173 | 175 | struct device_attribute *attr, char *buf) |
174 | 176 | { |
175 | - struct ns2_led_data *led_dat = dev_get_drvdata(dev); | |
177 | + struct led_classdev *led_cdev = dev_get_drvdata(dev); | |
178 | + struct ns2_led_data *led_dat = | |
179 | + container_of(led_cdev, struct ns2_led_data, cdev); | |
176 | 180 | |
177 | 181 | return sprintf(buf, "%d\n", led_dat->sata); |
178 | 182 | } |
... | ... | @@ -234,7 +238,6 @@ |
234 | 238 | if (ret < 0) |
235 | 239 | goto err_free_slow; |
236 | 240 | |
237 | - dev_set_drvdata(led_dat->cdev.dev, led_dat); | |
238 | 241 | ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata); |
239 | 242 | if (ret < 0) |
240 | 243 | goto err_free_cdev; |