[RHEL7,COMMIT] target: don't call an unmap callback if a range length is zero

Submitted by Konstantin Khorenko on Dec. 27, 2017, 4:05 p.m.

Details

Message ID 201712271605.vBRG5hKS013863@finist_ce7.work
State New
Series "target: don't call an unmap callback if a range length is zero"
Headers show

Commit Message

Konstantin Khorenko Dec. 27, 2017, 4:05 p.m.
The commit is pushed to "branch-rh7-3.10.0-693.11.1.vz7.39.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.11.1.vz7.39.9
------>
commit ab1e0ca107585279a02870be5aa06378d2da742d
Author: Andrei Vagin <avagin@openvz.org>
Date:   Wed Dec 27 19:05:43 2017 +0300

    target: don't call an unmap callback if a range length is zero
    
    If a length of a range is zero, it means there is nothing to unmap
    and we can skip this range.
    
    Here is one more reason, why we have to skip such ranges.  An unmap
    callback calls file_operations->fallocate(), but the man page for the
    fallocate syscall says that fallocate(fd, mode, offset, let) returns
    EINVAL, if len is zero. It means that file_operations->fallocate() isn't
    obligated to handle zero ranges too.
    
    According to specification, UNMAP command can be received with a zero range:
    If the UNMAP BLOCK DESCRIPTOR DATA LENGTH is set to zero, then no unmap block
    descriptors are included in the UNMAP parameter list. This condition shall not
    be considered an error.
    
    The issues has been found while running libscsi tests.
    https://github.com/sahlberg/libiscsi
    
    https://patchwork.kernel.org/patch/10110977/
    https://jira.sw.ru/browse/PSBM-79534
    
    Cc: Alexey.Kuznetsov@acronis.com
    Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
---
 drivers/target/target_core_sbc.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index 59a1235a633a..99fb25f681af 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -1132,9 +1132,11 @@  sbc_execute_unmap(struct se_cmd *cmd,
 			goto err;
 		}
 
-		ret = do_unmap_fn(cmd, priv, lba, range);
-		if (ret)
-			goto err;
+		if (range) {
+			ret = do_unmap_fn(cmd, priv, lba, range);
+			if (ret)
+				goto err;
+		}
 
 		ptr += 16;
 		size -= 16;