diff mbox

backlight: report error on failure

Message ID 1484774630-4228-1-git-send-email-sudipm.mukherjee@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sudip Mukherjee Jan. 18, 2017, 9:23 p.m. UTC
It is possible to update the backlight power and the brightness using
the sysfs and on writing it either returns the count or if the callback
function does not exist then returns the error code 'ENXIO'.

We have a situation where the userspace client is writing to the sysfs
to update the power and since the callback function exists the client
receives the return value as count and considers the operation to be
successful. That is correct as the write to the sysfs was successful.
But there is no way to know if the actual operation was done or not.

backlight_update_status() returns the error code if it fails. Pass that
to the userspace client who is trying to update the power so that the
client knows that the operation failed.

Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
---
 drivers/video/backlight/backlight.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

Comments

Sudip Mukherjee Jan. 30, 2017, 11:04 p.m. UTC | #1
On Wednesday 18 January 2017 09:23 PM, Sudip Mukherjee wrote:
> It is possible to update the backlight power and the brightness using
> the sysfs and on writing it either returns the count or if the callback
> function does not exist then returns the error code 'ENXIO'.
>
> We have a situation where the userspace client is writing to the sysfs
> to update the power and since the callback function exists the client
> receives the return value as count and considers the operation to be
> successful. That is correct as the write to the sysfs was successful.
> But there is no way to know if the actual operation was done or not.
>
> backlight_update_status() returns the error code if it fails. Pass that
> to the userspace client who is trying to update the power so that the
> client knows that the operation failed.
>
> Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
> ---

A gentle ping.

--
Regards
Sudip


>   drivers/video/backlight/backlight.c | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index 288318a..74b72b5 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
> @@ -146,9 +146,9 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
>   		pr_debug("set power to %lu\n", power);
>   		if (bd->props.power != power) {
>   			bd->props.power = power;
> -			backlight_update_status(bd);
> +			rc = backlight_update_status(bd);
>   		}
> -		rc = count;
> +		rc = rc ? rc : count;
>   	}
>   	mutex_unlock(&bd->ops_lock);
>
> @@ -176,8 +176,7 @@ int backlight_device_set_brightness(struct backlight_device *bd,
>   		else {
>   			pr_debug("set brightness to %lu\n", brightness);
>   			bd->props.brightness = brightness;
> -			backlight_update_status(bd);
> -			rc = 0;
> +			rc = backlight_update_status(bd);
>   		}
>   	}
>   	mutex_unlock(&bd->ops_lock);
>

--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lee Jones Feb. 8, 2017, 12:54 p.m. UTC | #2
Cc'ing Daniel Thompson, the new Maintainer.

On Wed, 18 Jan 2017, Sudip Mukherjee wrote:

> It is possible to update the backlight power and the brightness using
> the sysfs and on writing it either returns the count or if the callback
> function does not exist then returns the error code 'ENXIO'.
> 
> We have a situation where the userspace client is writing to the sysfs
> to update the power and since the callback function exists the client
> receives the return value as count and considers the operation to be
> successful. That is correct as the write to the sysfs was successful.
> But there is no way to know if the actual operation was done or not.
> 
> backlight_update_status() returns the error code if it fails. Pass that
> to the userspace client who is trying to update the power so that the
> client knows that the operation failed.
> 
> Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
> ---
>  drivers/video/backlight/backlight.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index 288318a..74b72b5 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
> @@ -146,9 +146,9 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
>  		pr_debug("set power to %lu\n", power);
>  		if (bd->props.power != power) {
>  			bd->props.power = power;
> -			backlight_update_status(bd);
> +			rc = backlight_update_status(bd);
>  		}
> -		rc = count;
> +		rc = rc ? rc : count;
>  	}
>  	mutex_unlock(&bd->ops_lock);
>  
> @@ -176,8 +176,7 @@ int backlight_device_set_brightness(struct backlight_device *bd,
>  		else {
>  			pr_debug("set brightness to %lu\n", brightness);
>  			bd->props.brightness = brightness;
> -			backlight_update_status(bd);
> -			rc = 0;
> +			rc = backlight_update_status(bd);
>  		}
>  	}
>  	mutex_unlock(&bd->ops_lock);
Sudip Mukherjee Feb. 18, 2017, 4:31 p.m. UTC | #3
On Monday 30 January 2017 11:04 PM, Sudip Mukherjee wrote:
> On Wednesday 18 January 2017 09:23 PM, Sudip Mukherjee wrote:
>> It is possible to update the backlight power and the brightness using
>> the sysfs and on writing it either returns the count or if the callback
>> function does not exist then returns the error code 'ENXIO'.
>>
>> We have a situation where the userspace client is writing to the sysfs
>> to update the power and since the callback function exists the client
>> receives the return value as count and considers the operation to be
>> successful. That is correct as the write to the sysfs was successful.
>> But there is no way to know if the actual operation was done or not.
>>
>> backlight_update_status() returns the error code if it fails. Pass that
>> to the userspace client who is trying to update the power so that the
>> client knows that the operation failed.
>>
>> Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
>> ---
>
> A gentle ping.

Hi Andrew,

Its more than one month now that this patch was submitted. Can you 
please take it through your tree... else it will miss the merge window.

Regards
Sudip

>
>
>>   drivers/video/backlight/backlight.c | 7 +++----
>>   1 file changed, 3 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/video/backlight/backlight.c
>> b/drivers/video/backlight/backlight.c
>> index 288318a..74b72b5 100644
>> --- a/drivers/video/backlight/backlight.c
>> +++ b/drivers/video/backlight/backlight.c
>> @@ -146,9 +146,9 @@ static ssize_t bl_power_store(struct device *dev,
>> struct device_attribute *attr,
>>           pr_debug("set power to %lu\n", power);
>>           if (bd->props.power != power) {
>>               bd->props.power = power;
>> -            backlight_update_status(bd);
>> +            rc = backlight_update_status(bd);
>>           }
>> -        rc = count;
>> +        rc = rc ? rc : count;
>>       }
>>       mutex_unlock(&bd->ops_lock);
>>
>> @@ -176,8 +176,7 @@ int backlight_device_set_brightness(struct
>> backlight_device *bd,
>>           else {
>>               pr_debug("set brightness to %lu\n", brightness);
>>               bd->props.brightness = brightness;
>> -            backlight_update_status(bd);
>> -            rc = 0;
>> +            rc = backlight_update_status(bd);
>>           }
>>       }
>>       mutex_unlock(&bd->ops_lock);
>>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Thompson Feb. 19, 2017, 8:13 a.m. UTC | #4
On Wed, Jan 18, 2017 at 09:23:50PM +0000, Sudip Mukherjee wrote:
> It is possible to update the backlight power and the brightness using
> the sysfs and on writing it either returns the count or if the callback
> function does not exist then returns the error code 'ENXIO'.
> 
> We have a situation where the userspace client is writing to the sysfs
> to update the power and since the callback function exists the client
> receives the return value as count and considers the operation to be
> successful. That is correct as the write to the sysfs was successful.
> But there is no way to know if the actual operation was done or not.

For brightness there is the actual_brightness file... but I don't think
there's anything for power.


> backlight_update_status() returns the error code if it fails. Pass that
> to the userspace client who is trying to update the power so that the
> client knows that the operation failed.

Strictly speaking this is an ABI change. Its probably a harmless one
making it ok to change but I'm interested what testing or code review 
you've done to be sure the userspace doesn't do odd things if the kernel
starts to pass through errors.


> Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
> ---
>  drivers/video/backlight/backlight.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index 288318a..74b72b5 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
> @@ -146,9 +146,9 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
>  		pr_debug("set power to %lu\n", power);
>  		if (bd->props.power != power) {
>  			bd->props.power = power;
> -			backlight_update_status(bd);
> +			rc = backlight_update_status(bd);
>  		}
> -		rc = count;
> +		rc = rc ? rc : count;

Shouldn't bd->props,power be rolled back on error?

Without it we end up in an odd situation with the lazy updates, 
specifically if the userspace observes original error and retries then we
will spuriously succeed due to the lazy update (leaving us not much 
better off than without this change).


>  	mutex_unlock(&bd->ops_lock);
>  
> @@ -176,8 +176,7 @@ int backlight_device_set_brightness(struct backlight_device *bd,
>  		else {
>  			pr_debug("set brightness to %lu\n", brightness);
>  			bd->props.brightness = brightness;
> -			backlight_update_status(bd);
> -			rc = 0;
> +			rc = backlight_update_status(bd);

Again, there is no roll back on error.


Daniel.
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Thompson Feb. 19, 2017, 8:26 a.m. UTC | #5
On Sat, Feb 18, 2017 at 04:31:43PM +0000, Sudip Mukherjee wrote:
> On Monday 30 January 2017 11:04 PM, Sudip Mukherjee wrote:
> > On Wednesday 18 January 2017 09:23 PM, Sudip Mukherjee wrote:
> > > It is possible to update the backlight power and the brightness using
> > > the sysfs and on writing it either returns the count or if the callback
> > > function does not exist then returns the error code 'ENXIO'.
> > > 
> > > We have a situation where the userspace client is writing to the sysfs
> > > to update the power and since the callback function exists the client
> > > receives the return value as count and considers the operation to be
> > > successful. That is correct as the write to the sysfs was successful.
> > > But there is no way to know if the actual operation was done or not.
> > > 
> > > backlight_update_status() returns the error code if it fails. Pass that
> > > to the userspace client who is trying to update the power so that the
> > > client knows that the operation failed.
> > > 
> > > Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
> > > ---
> > 
> > A gentle ping.
> 
> Hi Andrew,
> 
> Its more than one month now that this patch was submitted. Can you please
> take it through your tree... else it will miss the merge window.

Sorry you've been waiting so long for a review. Your "gentle ping" did
result in a few minor tweaks to the maintainers but what it didn't
(until today) provoke was  review!

To be honest, the ABI changes in the patch meant I wanted to check a 
few things first. However prompted by this mail I've just replied with 
the review I *should* have sent out a week ago [asking you rather than 
me to fill in some details about the likely effect of the ABI change ;-) ].

BTW, I did do some archeology eariler in the week and I think the kernel
has been swallowing error codes here for >10 years, so I'm curious if this
is a theoretic bug fix or are you aware of some tangible problem in 
userspace that results from it?


Daniel.
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sudip Mukherjee Feb. 20, 2017, 8:52 p.m. UTC | #6
On Sun, Feb 19, 2017 at 08:26:18AM +0000, Daniel Thompson wrote:
> On Sat, Feb 18, 2017 at 04:31:43PM +0000, Sudip Mukherjee wrote:
> > On Monday 30 January 2017 11:04 PM, Sudip Mukherjee wrote:
> > > On Wednesday 18 January 2017 09:23 PM, Sudip Mukherjee wrote:
> > > > It is possible to update the backlight power and the brightness using
> > > > the sysfs and on writing it either returns the count or if the callback
> > > > function does not exist then returns the error code 'ENXIO'.
> > > > 
> > > > We have a situation where the userspace client is writing to the sysfs
> > > > to update the power and since the callback function exists the client
> > > > receives the return value as count and considers the operation to be
> > > > successful. That is correct as the write to the sysfs was successful.
> > > > But there is no way to know if the actual operation was done or not.
> > > > 
> > > > backlight_update_status() returns the error code if it fails. Pass that
> > > > to the userspace client who is trying to update the power so that the
> > > > client knows that the operation failed.
> > > > 
> > > > Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
> > > > ---
> > > 
> > > A gentle ping.
> > 
> > Hi Andrew,
> > 
> > Its more than one month now that this patch was submitted. Can you please
> > take it through your tree... else it will miss the merge window.
> 
> Sorry you've been waiting so long for a review. Your "gentle ping" did
> result in a few minor tweaks to the maintainers but what it didn't
> (until today) provoke was  review!

what tweaks? I can see that now you are the new maintainer.Is that the
result of my ping? :)

> 
> To be honest, the ABI changes in the patch meant I wanted to check a 
> few things first. However prompted by this mail I've just replied with 
> the review I *should* have sent out a week ago [asking you rather than 
> me to fill in some details about the likely effect of the ABI change ;-) ].
> 
> BTW, I did do some archeology eariler in the week and I think the kernel
> has been swallowing error codes here for >10 years, so I'm curious if this
> is a theoretic bug fix or are you aware of some tangible problem in 
> userspace that results from it?

I will reply to your other mail later this week. I am on a short holiday
now with very limited access.

But the problem that prompted me to send this patch is the current project
that I am working on now. And we faced this there. The userspace code is
writing to the sysfs node to poweron the backlight and reported success.
But sometimes we noticed that backlight was not actally powered on. And
that lead me to check the code and noticed that it is swallowing all the
errors.

Regards
Sudip
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lee Jones Feb. 22, 2017, 8:52 a.m. UTC | #7
On Mon, 20 Feb 2017, Sudip Mukherjee wrote:

> On Sun, Feb 19, 2017 at 08:26:18AM +0000, Daniel Thompson wrote:
> > On Sat, Feb 18, 2017 at 04:31:43PM +0000, Sudip Mukherjee wrote:
> > > On Monday 30 January 2017 11:04 PM, Sudip Mukherjee wrote:
> > > > On Wednesday 18 January 2017 09:23 PM, Sudip Mukherjee wrote:
> > > > > It is possible to update the backlight power and the brightness using
> > > > > the sysfs and on writing it either returns the count or if the callback
> > > > > function does not exist then returns the error code 'ENXIO'.
> > > > > 
> > > > > We have a situation where the userspace client is writing to the sysfs
> > > > > to update the power and since the callback function exists the client
> > > > > receives the return value as count and considers the operation to be
> > > > > successful. That is correct as the write to the sysfs was successful.
> > > > > But there is no way to know if the actual operation was done or not.
> > > > > 
> > > > > backlight_update_status() returns the error code if it fails. Pass that
> > > > > to the userspace client who is trying to update the power so that the
> > > > > client knows that the operation failed.
> > > > > 
> > > > > Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
> > > > > ---
> > > > 
> > > > A gentle ping.
> > > 
> > > Hi Andrew,
> > > 
> > > Its more than one month now that this patch was submitted. Can you please
> > > take it through your tree... else it will miss the merge window.
> > 
> > Sorry you've been waiting so long for a review. Your "gentle ping" did
> > result in a few minor tweaks to the maintainers but what it didn't
> > (until today) provoke was  review!
> 
> what tweaks? I can see that now you are the new maintainer.Is that the
> result of my ping? :)

Pings never have any effect and are thus always discouraged. ;)

The amount of pending reviews on Backlight patches were what provoked
me to find a new, diligent Maintainer for the subsystem.
diff mbox

Patch

diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index 288318a..74b72b5 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -146,9 +146,9 @@  static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
 		pr_debug("set power to %lu\n", power);
 		if (bd->props.power != power) {
 			bd->props.power = power;
-			backlight_update_status(bd);
+			rc = backlight_update_status(bd);
 		}
-		rc = count;
+		rc = rc ? rc : count;
 	}
 	mutex_unlock(&bd->ops_lock);
 
@@ -176,8 +176,7 @@  int backlight_device_set_brightness(struct backlight_device *bd,
 		else {
 			pr_debug("set brightness to %lu\n", brightness);
 			bd->props.brightness = brightness;
-			backlight_update_status(bd);
-			rc = 0;
+			rc = backlight_update_status(bd);
 		}
 	}
 	mutex_unlock(&bd->ops_lock);