Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1306024imu; Wed, 16 Jan 2019 16:51:26 -0800 (PST) X-Google-Smtp-Source: ALg8bN45d2Ntg04L6SCp3gjSt4+ucTaiqD7yjRtfHUx5yVkMOQnhQFRt04ioVVcPfnWrv4RrDtWj X-Received: by 2002:a63:89c2:: with SMTP id v185mr10750692pgd.97.1547686286707; Wed, 16 Jan 2019 16:51:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547686286; cv=none; d=google.com; s=arc-20160816; b=g1FN08/oklLmHSvjsQO2PbQ5X735+i8lo6tmGATSizdelx+5OnE+FYPa+1jk9YBuBE Adg2qDEFflAVvLBQ3Ogsfs9Aipod43CPX6IyGbhDGFXUzsfeewTo1PGvrjv8MwU6GmDq NPpqHpLRlMRzmBAu7H2FLZ7RsHw1feMJ+te6Gqd4iimr1dyaNcLC/7mmvnBpYrJlwmFl LuPjuzp/wchUeRAn2sMj+QHG+LPhOprBmgMzTGHdGq8vZyDrevJt4xpWV2z9ryFdOGih diCxEzK5VG4Nc7NX/ZriXAyH6Il83ZLS7MzVUddFgNZ8amI/MC+G1l5KRGQ75/EYMcko QJqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:cc:to:subject:date:from :dkim-filter; bh=jeezPl5WlIlLm27fPntZtd+r0/C4wZeof6xXjgDLnxo=; b=1D1pN/tMbWefInwGT9XRnOJauvkmhih7qb9TXmW4mGab0Ny+ShdHQYeXJk+GI2sPdP 07U/drPkrQv2b6+KH0smA7iBQIsoq8p9ietC03/zLoCG/gzArPyDyg9WFZpKRvr2yZZO /UtkEcnsjPREEg5IdqqI27KJLC4/ziL5RZkIeawBX5lFFICHmQ8ldqcz/JcjaZBIioyN vsMOw6C1yE71bw6XrsjcKXS6M1wSA6fMafrjQb+hY7U4Og2I8f9X4bqxeKPxtQm606wj vZfee8Cx6iVA1E5Um2fzY99GX082HPJz5nxtedx7xFgoJi4KtF4e9+8zedE3Lv9zrgRg CpqQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u72si7324600pgc.360.2019.01.16.16.51.08; Wed, 16 Jan 2019 16:51:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730048AbfAPXEC (ORCPT + 99 others); Wed, 16 Jan 2019 18:04:02 -0500 Received: from mailgw1.fjfi.cvut.cz ([147.32.9.3]:45658 "EHLO mailgw1.fjfi.cvut.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727080AbfAPXDy (ORCPT ); Wed, 16 Jan 2019 18:03:54 -0500 Received: from localhost (localhost [127.0.0.1]) by mailgw1.fjfi.cvut.cz (Postfix) with ESMTP id 913E8B0439; Wed, 16 Jan 2019 23:55:49 +0100 (CET) X-CTU-FNSPE-Virus-Scanned: amavisd-new at fjfi.cvut.cz Received: from mailgw1.fjfi.cvut.cz ([127.0.0.1]) by localhost (mailgw1.fjfi.cvut.cz [127.0.0.1]) (amavisd-new, port 10022) with ESMTP id 3g05-g5j8Isg; Wed, 16 Jan 2019 23:55:45 +0100 (CET) Received: from linux.fjfi.cvut.cz (linux.fjfi.cvut.cz [147.32.5.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mailgw1.fjfi.cvut.cz (Postfix) with ESMTPS id AD9E6B03CB; Wed, 16 Jan 2019 23:55:43 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 mailgw1.fjfi.cvut.cz AD9E6B03CB Received: by linux.fjfi.cvut.cz (Postfix, from userid 1001) id 931996004E; Wed, 16 Jan 2019 23:55:43 +0100 (CET) From: Jonas Rabenstein Date: Mon, 19 Mar 2018 19:36:48 +0100 Subject: [PATCH 09/16] block: sed-opal: split generation of bytestring header and content To: Jens Axboe , Scott Bauer , Jonathan Derrick , linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Jonas Rabenstein Message-Id: <20190116225543.931996004E@linux.fjfi.cvut.cz> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Split the header generation from the (normal) memcpy part if a bytestring is copied into the command buffer. This allows in-place generation of the bytestring content. For example, copy_from_user may be used without an intermediate buffer. Signed-off-by: Jonas Rabenstein --- block/sed-opal.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/block/sed-opal.c b/block/sed-opal.c index 4225f23b2165..db966bbc5a05 100644 --- a/block/sed-opal.c +++ b/block/sed-opal.c @@ -586,14 +586,11 @@ static void add_token_u64(int *err, struct opal_dev *cmd, u64 number) add_token_u8(err, cmd, number >> (len * 8)); } -static void add_token_bytestring(int *err, struct opal_dev *cmd, - const u8 *bytestring, size_t len) +static u8 *add_bytestring_header(int *err, struct opal_dev *cmd, size_t len) { size_t header_len = 1; bool is_short_atom = true; - - if (*err) - return; + char *start; if (len & ~SHORT_ATOM_LEN_MASK) { header_len = 2; @@ -602,17 +599,27 @@ static void add_token_bytestring(int *err, struct opal_dev *cmd, if (!can_add(err, cmd, header_len + len)) { pr_debug("Error adding bytestring: end of buffer.\n"); - return; + return NULL; } if (is_short_atom) add_short_atom_header(cmd, true, false, len); else add_medium_atom_header(cmd, true, false, len); - - memcpy(&cmd->cmd[cmd->pos], bytestring, len); + start = &cmd->cmd[cmd->pos]; cmd->pos += len; + return start; +} +static void add_token_bytestring(int *err, struct opal_dev *cmd, + const u8 *bytestring, size_t len) +{ + u8 *start; + + start = add_bytestring_header(err, cmd, len); + if (!start) + return; + memcpy(start, bytestring, len); } static int build_locking_range(u8 *buffer, size_t length, u8 lr) -- 2.20.1