]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mtd: powernv_flash: Don't return -ERESTARTSYS on interrupted token acquisition
authorCyril Bur <cyrilbur@gmail.com>
Fri, 3 Nov 2017 02:41:40 +0000 (13:41 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 6 Nov 2017 09:20:26 +0000 (20:20 +1100)
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>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
drivers/mtd/devices/powernv_flash.c

index 4dd3b5d2feb210878f2101905891feaf334a1452..3343d4f5c4f3aad41f1af29295ebec5deeafbbfd 100644 (file)
@@ -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;
        }