[v4,04/10] mtd: powernv_flash: Don't return -ERESTARTSYS on interrupted token acquisition

Message ID 20171010033302.20854-5-cyrilbur@gmail.com
State Superseded
Headers show
Series
  • Allow opal-async waiters to get interrupted
Related show

Commit Message

Cyril Bur Oct. 10, 2017, 3:32 a.m.
Because the MTD core might split up a read() or write() from userspace
into several calls to the driver, we may fail to get a token but already
have done some work, best to return -EINTR back to userspace and have
them decide what to do.

Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
---
 drivers/mtd/devices/powernv_flash.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Boris Brezillon Oct. 30, 2017, 8:51 a.m. | #1
On Tue, 10 Oct 2017 14:32:56 +1100
Cyril Bur <cyrilbur@gmail.com> wrote:

> Because the MTD core might split up a read() or write() from userspace
> into several calls to the driver, we may fail to get a token but already
> have done some work, best to return -EINTR back to userspace and have
> them decide what to do.
> 
> Signed-off-by: Cyril Bur <cyrilbur@gmail.com>

Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>

> ---
>  drivers/mtd/devices/powernv_flash.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/mtd/devices/powernv_flash.c b/drivers/mtd/devices/powernv_flash.c
> index 4dd3b5d2feb2..3343d4f5c4f3 100644
> --- a/drivers/mtd/devices/powernv_flash.c
> +++ b/drivers/mtd/devices/powernv_flash.c
> @@ -47,6 +47,11 @@ enum flash_op {
>  	FLASH_OP_ERASE,
>  };
>  
> +/*
> + * Don't return -ERESTARTSYS if we can't get a token, the MTD core
> + * might have split up the call from userspace and called into the
> + * driver more than once, we'll already have done some amount of work.
> + */
>  static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
>  		loff_t offset, size_t len, size_t *retlen, u_char *buf)
>  {
> @@ -63,6 +68,8 @@ static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
>  	if (token < 0) {
>  		if (token != -ERESTARTSYS)
>  			dev_err(dev, "Failed to get an async token\n");
> +		else
> +			token = -EINTR;
>  		return token;
>  	}
>

Patch

diff --git a/drivers/mtd/devices/powernv_flash.c b/drivers/mtd/devices/powernv_flash.c
index 4dd3b5d2feb2..3343d4f5c4f3 100644
--- a/drivers/mtd/devices/powernv_flash.c
+++ b/drivers/mtd/devices/powernv_flash.c
@@ -47,6 +47,11 @@  enum flash_op {
 	FLASH_OP_ERASE,
 };
 
+/*
+ * Don't return -ERESTARTSYS if we can't get a token, the MTD core
+ * might have split up the call from userspace and called into the
+ * driver more than once, we'll already have done some amount of work.
+ */
 static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
 		loff_t offset, size_t len, size_t *retlen, u_char *buf)
 {
@@ -63,6 +68,8 @@  static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op,
 	if (token < 0) {
 		if (token != -ERESTARTSYS)
 			dev_err(dev, "Failed to get an async token\n");
+		else
+			token = -EINTR;
 		return token;
 	}