Dne 16.3.2017 v 19:49 James Bottomley napsal(a): 
> diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c
> index 65fed71..ae89082 100644
> --- a/drivers/misc/enclosure.c
> +++ b/drivers/misc/enclosure.c
> @@ -375,6 +375,7 @@ int enclosure_add_device(struct enclosure_device *edev, 
> int component,
>                        struct device *dev)
>  {
>       struct enclosure_component *cdev;
> +     int err;
>  
>       if (!edev || component >= edev->components)
>               return -EINVAL;
> @@ -384,12 +385,15 @@ int enclosure_add_device(struct enclosure_device *edev, 
> int component,
>       if (cdev->dev == dev)
>               return -EEXIST;
>  
> -     if (cdev->dev)
> +     if (cdev->dev) {
>               enclosure_remove_links(cdev);
> -
> -     put_device(cdev->dev);
> -     cdev->dev = get_device(dev);
> -     return enclosure_add_links(cdev);
> +             put_device(cdev->dev);
> +             cdev->dev = NULL;
> +     }
> +     err = enclosure_add_links(cdev);
> +     if (!err)
> +             cdev->dev = get_device(dev);
> +     return err;
>  }
>  EXPORT_SYMBOL_GPL(enclosure_add_device);
>  
>


I will ask our customer to test your patch,
there is only a small problem: you can't set cdev->dev = NULL
and then call enclosure_add_links(cdev) because you will end up dereferencing
a NULL pointer.
I suggest a slightly different patch:

@@ -375,6 +379,7 @@ int enclosure_add_device(struct enclosure_device *edev, int 
component,
                         struct device *dev)
 {
        struct enclosure_component *cdev;
+       int err;
 
        if (!edev || component >= edev->components)
                return -EINVAL;
@@ -384,12 +389,18 @@ int enclosure_add_device(struct enclosure_device *edev, 
int component,
        if (cdev->dev == dev)
                return -EEXIST;
 
-       if (cdev->dev)
+       if (cdev->dev) {
                enclosure_remove_links(cdev);
-
-       put_device(cdev->dev);
+               put_device(cdev->dev);
+       }
        cdev->dev = get_device(dev);
-       return enclosure_add_links(cdev);
+
+       err = enclosure_add_links(cdev);
+       if (err) {
+               put_device(cdev->dev);
+               cdev->dev = NULL;
+       }
+       return err;
 }
 EXPORT_SYMBOL_GPL(enclosure_add_device);
 
Thanks,
Maurizio.
 

Reply via email to