From patchwork Tue Dec 17 22:16:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181928 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6381327ile; Tue, 17 Dec 2019 14:17:37 -0800 (PST) X-Google-Smtp-Source: APXvYqwwgfy2TN66OsFb7fBmWsXo2Wtyuo76c5uH0oll6VhrrmuTdALtRp4029ZZ7djDo/waH/fN X-Received: by 2002:aca:ea43:: with SMTP id i64mr3107768oih.30.1576621057789; Tue, 17 Dec 2019 14:17:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621057; cv=none; d=google.com; s=arc-20160816; b=UM2FscpLYQfKovhBQIReUdD27Mfz6sfMSU571qeGmNaAVD3x75HNltLIWdYOfeQzAA x8XDyKSQJCiSq/7WbDEXGG+yl80TQUW4AYGqclTkqNMQRila+cQScuVutMyIpMQM0Hiq RPBl3VZmR6+oWuEcomGL/stTuIKORdhmlgt+FdFL0eHD8DCeXXmdXvmWYVUW3U3uSzR3 aJBqTtz/OHEuFBru1QHdz9vPWzsIJ9Nbf5TLMzmn8K/ekp0IjJXiQKOCHlG1lanle4ya 21NyLCPjSLlnSgwfvx4W76mReSVlNk+/ReF7Ehh6c0aS4hyoj5l03EKdX/gWB5ym0P1l Bv2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=bubUh0GBCj5Jhl4KZbVikN+PQfG4Bp8WbIF5pU+zTs4=; b=C+Avvmwcqe83lgFUkJOtcZqn0kfrnqenzmrArTskyvVcvtLuV1YwQgM+vvdyWE18S3 o2mBL4qvg5Gx5nLIR83VaczfEnJ8d3V4fussVIsMm0wAjrNCSQKhV1GxaL7+7Qc4xTf5 ruRz0I6qNgrnki3Tmrq2DDp4aRo3QG/ySB0pM+hvu6RXaLU9srbg/geTXxG37oAY0sYD WFbxybwQfAmAbHsp7yo9vyRgXVvpJjHlWD+Gx0hz90EcXCDnsuTg08d/IwLIQxsVTk3w m2giFEnRHeNygJvPUtwi10tUiLNmw/3hf4bSF+XN31YHqqPzfqmQIEmoNamTKlKCZPyC f4Lg== 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 w11si12499643oig.45.2019.12.17.14.17.37; Tue, 17 Dec 2019 14:17:37 -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 S1726526AbfLQWRg (ORCPT + 27 others); Tue, 17 Dec 2019 17:17:36 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:43261 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725886AbfLQWRf (ORCPT ); Tue, 17 Dec 2019 17:17:35 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1Ma1sQ-1iDauk3LgC-00W0Di; Tue, 17 Dec 2019 23:17:22 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 01/27] pktcdvd: fix regression on 64-bit architectures Date: Tue, 17 Dec 2019 23:16:42 +0100 Message-Id: <20191217221708.3730997-2-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:QMSOPeED49s201CoV/Q/8aHXf5yX2aoiUQkXnT4FSnobAR1P+ZS AjHcXURC1TcBRJslcM0go+hX9iCUkxwOPBvAe3WaNg3lqMqQFjSIfMlrLToOT1N/tCw6hO2 zOwEghWIgnPEe89YRhjL6pmHZYOlIxHRc6VqAA5VLAnaxIqc9epmlzoZE2W28a+I11/E1T8 eN7v7rzsLAL52VPep87VA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:q3r9egq/gLI=:eaRnFNzwV13WGZeABhyoCa kG6pSxM3N1jBbw3ItFcU5G6gCoLl6A20jd6nWRhp35jlLNyqBxWhRYZ8QIRjtnoL5Qk8vjNQm hDtQSpTngcgQO89psiQHtXxIsxlggGZOlPf2yawlOrfLb/SvakZpuY7BQCrV0WRG0LTyw4gvy afJx3VGKecnLAuvMQaV22cGRGlyz9pZfPQG0ygZVSYZV1FiyYh5ZQSX+mer5k6mfvHmkUn+3T YzHfUa+OyIC/Mamfdnu/bjuJG52WXGYFay1onrbGSNYms13077RIudBaIaWiHWBIh+3LJAIHS pKIe4/iNUYIIiYdcFx/p/jkg0JYMmWMKOB++MhNCdcsCKvcboEVQyzF2580ni2QV9L79sfSpp f3M4Cg7b9wWO9696JpTfpFoSCF7L6Ojt2W5tFp+nAn4i7ZHtyNgKpE2PxoI9zyMdm8/88wo5o Ir0gAKQcWJCyrIh461fpNETWT9UdaCZPt5J/vI3O9R4hzGIzm9nS4z55DqcTBmqWc8KQxS+5u xpUha18j3X3Tvf/Ckcq0vJ7SnSm4QOI1m9Hk7Roul2tz5+HL9bXEaJ6O4aBACvZiBAK0NQfO2 55iUqzA2Do9ZUxr07cSZOMz6j2VB80hXlCcQKu0g8HWsp73LJmFQ5VlD7Vm3DZ9R1M+w72zX2 bhQFI10kiVC9sGNSOIemMXU5lYjvDynxia/KafBznmGNhDIkQ5P8QyElg37HCZVjQuxzmKiw9 5U/sNmQG2oheV7assA7oI62z+vjrg2xZC6KBoiGsoM1iB4lNjM9ql5Y7ZR9Ulz5ZtDhCqMlxd ihoE9fwLKdX3XySzRDbM3JoPdOb04RmsNAiVkkeIasEjWfw6dgd8mdLqt5JWldxd3/cM/tc61 af5LnUUHqowZxtUs87eg== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The support for the compat ioctl did not actually do what it was supposed to do because of a typo, instead it broke native support for CDROM_LAST_WRITTEN and CDROM_SEND_PACKET on all architectures with CONFIG_COMPAT enabled. Fixes: 1b114b0817cc ("pktcdvd: add compat_ioctl handler") Signed-off-by: Arnd Bergmann ---- Please apply for v5.5, I just noticed the regression while rebasing some of the patches I created on top. --- drivers/block/pktcdvd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.20.0 diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index ee67bf929fac..861fc65a1b75 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -2707,7 +2707,7 @@ static const struct block_device_operations pktcdvd_ops = { .release = pkt_close, .ioctl = pkt_ioctl, #ifdef CONFIG_COMPAT - .ioctl = pkt_compat_ioctl, + .compat_ioctl = pkt_compat_ioctl, #endif .check_events = pkt_check_events, }; From patchwork Tue Dec 17 22:16:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181932 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6381502ile; Tue, 17 Dec 2019 14:17:47 -0800 (PST) X-Google-Smtp-Source: APXvYqwWQWbOBxmI4gwD9Z7vGpFGkHOAOVJe5q4eQ6k9NfiT1gNSBwkeaMhtGp5KjvKLCnlrgGtK X-Received: by 2002:a9d:51c1:: with SMTP id d1mr3047401oth.136.1576621067085; Tue, 17 Dec 2019 14:17:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621067; cv=none; d=google.com; s=arc-20160816; b=zFZe1fvuejkEZOI366oDXaCHpnQHTX5UNvFyGWx/kyFh5EmVOzhqfrbkGEETHNcAjp qqphGPsE+D96WbdtRoV5QseVVpOcnuYRrUqWbj1Uv/+XDB+MJhzpws/F9mngoDQzvz23 AExavqUE+f5nhi+raNo16qr81T3LWXgq62kmBO6V38e9HPiIzft8v0JtYfqUCRAo1D21 giWfErxNoYU8UhvztJBk6IG7rK2KNwb9PlTWah2t1UIrH2AacPBNMnCTxFKhgcUMXLtk Ht8BoAUgMcnC8IfwL6jnajIuMwkUZ/aPjBur+87tw6G7vVRy5WbXiwd1n0hTw6JZ0tDe t0Kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=WJwa9x+LkgorslQVsZDuDCLNaqjg2kFywjzbMxdWMGA=; b=tSp9GPn21ufaqM+AehHd8RU9u2RXFEdSiFzE7X7g2zyj/pk8/NP3Y5xMo9aCU824OO 75wQkLUOYx3iRmpbHmNpbvKS2iQ6W0lqiDvf+rftPl6kTslntUvhi3tCme/oA7DZVm1w q48kqLbSuuFNHt3xHDfK9E6G63p2XdV2yq3A340SWDDkZL1IYuybnbGfFkLAjarzkNN3 1gWB4aKfwxSqkI6Tj2cXKGRHLoXpVOvjMROEn00Xl/y/zKCgwbK3b7op/olsoDXrTmq7 YDdRvJXrYllnMpbVeyl8kzrp65HyziVT6K8SMAZErUcc3HyQbjXsZOTS6Yzbhq4zj44N LZ/g== 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 t1si12443707oth.94.2019.12.17.14.17.46; Tue, 17 Dec 2019 14:17:47 -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 S1726716AbfLQWRp (ORCPT + 27 others); Tue, 17 Dec 2019 17:17:45 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:49705 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726613AbfLQWRk (ORCPT ); Tue, 17 Dec 2019 17:17:40 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MFba4-1iTcQl3JfS-00H5hY; Tue, 17 Dec 2019 23:17:25 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann , Will Deacon Subject: [PATCH v2 06/27] compat: ARM64: always include asm-generic/compat.h Date: Tue, 17 Dec 2019 23:16:47 +0100 Message-Id: <20191217221708.3730997-7-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:KL1ro4KGbRgth3ZyPB/rUAk9SI9caDwc2wmp7lID3j5UJuG/6zE jjRLuKXhvnIFa8qaMfReNfEXctttFgrIVqB/F8fk6VYQq40G8/4HFBUMSIUgljh/CHDrt8Q 69toNQfZopjNWJs7hsjfa6yd254sA/h57NFTXYoc3PkHXFksuk6NUBA9BahejYNLdG0/ZsG N/KriVo2wRDf+NrqqW4hg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:QObuhZbO9AY=:n0QH6H90N+kFOplb/DnWZ7 AlmmIj0UejnAga/WbAExgs2nDVyWB/XfJ7GAn2Q1LEIaRzeMt+5oc3DltGf1LAybWfMe+LsWq qRT0IBjoptB0bN/M4aR7pGKQY9o275avtkdPO4ix1KuMR6QAf7CihdPYXkrrEWtF6y6HbQjGn +j7YNZ4ske8uUFEkTuPGN9vtjsXUD/g++1sMeTvNA0pysgKnDz1AcBec0pa6U2mC56CYbzz2O FAGnT6Rqnp7h8cluJ5tY52HItYlR8nB0dLN3UCUNFh9LKryA1hcvslQubQq5btgxFZ5ufDTtt aF4gllxZynPOzLuJ6cAgQU4GIEsPUXY7UKLnuvQmmrPh425Jxsg8lvAgtx9SBxdBK6Oe+Kgh0 JtarlkrG8OBIigoaX0oxhJDADSiQhBBrun0in9FXXqCqYjv9Q+5TOn6Sgv8bFVs3gmik7UpS9 YpU9Af5Fo18iTuNJYU7DsfcvLLKsd3Dig4yL8fNgjsWED2ZtnqCrtp8PAapztEhl18QRjRmf2 ZgwhrhZLP9qUXMW0EqH5thD1lHVAgMk4h6T7N7lAdvpdXxQ3dLpHb4QYh2d3YdPOZ8aU648pX zpj0K2wvorwOq6gIzurxnQu7AEgQ2rSPqauCjyu4gwNwYXNnsXHoWZtn9HhC4RCP3vcV8Ahq1 sY3YxVYa9uKMpx9ESnHjo0R6GMvaMBdYyb4e0JIsoY27AcD+gO56rXtfn5LzpdRpAuxxUQptk DVbjSB82MpSC8bXKr2ErxNXQ6NDIbDkAA8XwMFByKjYLaRu/w3DUnx9iiq6UBFIIGOIdgjMbw sNM/QJbtJxuaa5VyyvbYnk9ng7001Wn0sqVDJTkJ8VQkBltfwzmRa5Q0WYKHP5MJkQ2WoSspl VXUq4MYIhhGNm4ZWEO0w== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to use compat_* type defininitions in device drivers outside of CONFIG_COMPAT, move the inclusion of asm-generic/compat.h ahead of the #ifdef. All other architectures already do this. Acked-by: Will Deacon Signed-off-by: Arnd Bergmann --- arch/arm64/include/asm/compat.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) -- 2.20.0 diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h index b0d53a265f1d..7b4172ce497c 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -4,6 +4,9 @@ */ #ifndef __ASM_COMPAT_H #define __ASM_COMPAT_H + +#include + #ifdef CONFIG_COMPAT /* @@ -13,8 +16,6 @@ #include #include -#include - #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" From patchwork Tue Dec 17 22:16:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181951 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6384293ile; Tue, 17 Dec 2019 14:20:05 -0800 (PST) X-Google-Smtp-Source: APXvYqzaoB6nvEwf/CwIgRDBIeUW5i8qZvzC94Eua6jhqorolCpMaXGOZ51CITGnqFMhGB191n3Q X-Received: by 2002:a05:6808:191:: with SMTP id w17mr2885077oic.29.1576621205115; Tue, 17 Dec 2019 14:20:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621205; cv=none; d=google.com; s=arc-20160816; b=pZYJ04rMPPvJq3pN64nF/G4/xb3pS18FPbZzfPdz7hcIqVaL6HYXZvOWuubOU4+HtP Wmu4UgKDkbgJ1vCrPtShK2Ge8B75uiED++BlWMTAav++LEDaQ2xLDPHa7F1iMqcr5nG+ Q+7iWjy9me4bBtMmSlVZQJtAIQqAOAMy1C7/2CNb9JSFKjKXqE2VcxVzwG2Hlf+fCji7 qPYUbtgJwphAz8Mui30s5KQ+9Iw6iVBZcikKLKgivCV4yh4BZxA89/3sTl4R4dZTBKJ0 sucUzglynXL4mjdBQCXpz7Dq9acWpDPERp9nOtAQF1M7VFwPFgkJlN+CG8SxA/DT/yvg CrqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=23IOAgs2bGHAExW1ulBvpn7Bf/VXLRfWeyk9tWLnp2E=; b=JAwZh6FCu4UGchxz1OUkHxS5tS41yJ9YdVQZR+21bLOqr1tC197iB2cCzfPEHjRtDz ttDeXJv+QqR50YplIjgWM3QyF6AtKqg+QzJH7PFq6e/3xFFE1eKK2Qk2Pg0WWHjYvo6j f4yVgRic9H88poQzBdtT4PddZaiCaH+reqZC6kwkOv+lFL682a5Inc5Ws4M0HZ/k0Wg7 I8mIBHPR5ydpZaz1DGW6DgnuxpIm5QmJmI6dy4NmApMrXJ94wYidPJwnI+ZcDsR65EOL vqhaYCm7q31iKE0zglc182jC8bcuBu4Hdd9YDPUrkx96E3NMGvjji4eiozIPPJygk/Id MEhA== 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 l10si750402otr.159.2019.12.17.14.20.04; Tue, 17 Dec 2019 14:20:05 -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 S1727363AbfLQWUD (ORCPT + 27 others); Tue, 17 Dec 2019 17:20:03 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:38169 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726565AbfLQWRj (ORCPT ); Tue, 17 Dec 2019 17:17:39 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1N6bo8-1hctFg38KU-0185vc; Tue, 17 Dec 2019 23:17:26 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 08/27] compat: scsi: sg: fix v3 compat read/write interface Date: Tue, 17 Dec 2019 23:16:49 +0100 Message-Id: <20191217221708.3730997-9-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:EPgVRxHLVmXq6xV18Ht+/wrImzU2wxByo1tUXVa0LaSS0Tun9rb Uc1alnCqaf3enDvyoANS+9o6zakLERXmmuEXztsCTp13GfgiBuXeR8jX0IlKpanAmMPOqWA IgIBFsbJcd5fe1lM8c2OaGrhNBdk0tKSomd1i3EWYQkZkp1hy5WEi8N1II4JLvGhrBcdAW0 oDgUhAOGBaSxVKe/RbJEg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:P6dApjCTFbs=:9MBkCDnDPmp4VM9Ikqp3lq SU2sCvfOWxk0wq0gm6yls1Me6krnN0BpciuDY9QhkKQRUqOFO8sFGAjGN34N/hIoB9Q+PiSq6 oQxP7C++7OJnoydQ7H/JA3ksD3jV10zJciEn5IZWdyscG86GNIkxC+Zz2TIHIH11WcmwBGeht Y2vkJaROZnUwSgvqOZWp2Ak3pqIrf5nDWxf/kmx2DJVp/WS0wBRRcFP/oNwe65SN6RzAkBIuv XgDTmWi45gcHKI9+gb8Zza9Wec6hcLPcDZy56hLusJP8Cq+h184rs1L/28mje0jUSeRu5DsJX olK1cTlhScBiKVU9yJSXob1XZaBFPm3yVK92NVDpg63ry7oYWGzPZjzXlay2L0HrsKc9oK5j6 Yy0+pBDLdH+jziICwteGxGWSOpQ7wIIfaw1rceeiFeeP6Wr+iJrr1sJXaTBOtSlSYZQL5YPO2 CQnltBuEmfTR3ZybaZE0n2RsNQ4Ni50oJNHSxTa62y3msPziKqonM0MXIwh1ig/4qS+FxT6iz 0bmD9++FKEn81LFze5UUonsQGYF0t6fYlu4IVg+pMtpg12DEmGgIWfTcKaAnCl0i/pDv/X1ex Snx0EEx9jfVwD3PlWwfKkiK7wSZg2a1esBKEz9SPKM+I85vvFp0D0WNmWw+1lb/4VKETmxGuG YdbwI6EGjhVCMgw75nw5K+WjfsOyWcE7RSywgFPdyyrh0kjlCOhMcASpVI6UbFZVtjiLm9pSN rd/gRUkKhufS/zSOYtUzavKTnToYwbyvMFsqD4flfKIbFEUdh/ICpp62xxKaHZvcik6wkMW8G 3hec+15yIC/58C2OGDdPz+T/jedwh2d29hYQYmm77nzp+bzNJLkcdWxrr9Ty2QeXcV+O5Eyc/ YaqwT/oBqIOqkTgYBnMQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the v5.4 merge window, a cleanup patch from Al Viro conflicted with my rework of the compat handling for sg.c read(). Linus Torvalds did a correct merge but pointed out that the resulting code is still unsatisfactory. I later noticed that the sg_new_read() function still gets the compat mode wrong, when the 'count' argument is large enough to pass a compat_sg_io_hdr object, but not a nativ sg_io_hdr. To address both of these, move the definition of compat_sg_io_hdr into a scsi/sg.h to make it visible to sg.c and rewrite the logic for reading req_pack_id as well as the size check to a simpler version that gets the expected results. Fixes: c35a5cfb4150 ("scsi: sg: sg_read(): simplify reading ->pack_id of userland sg_io_hdr_t") Fixes: 98aaaec4a150 ("compat_ioctl: reimplement SG_IO handling") Signed-off-by: Arnd Bergmann --- block/scsi_ioctl.c | 29 +---------- drivers/scsi/sg.c | 126 +++++++++++++++++++++------------------------ include/scsi/sg.h | 30 +++++++++++ 3 files changed, 90 insertions(+), 95 deletions(-) -- 2.20.0 diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 650bade5ea5a..b61dbf4d8443 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -20,6 +20,7 @@ #include #include #include +#include struct blk_cmd_filter { unsigned long read_ok[BLK_SCSI_CMD_PER_LONG]; @@ -550,34 +551,6 @@ static inline int blk_send_start_stop(struct request_queue *q, return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data); } -#ifdef CONFIG_COMPAT -struct compat_sg_io_hdr { - compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */ - compat_int_t dxfer_direction; /* [i] data transfer direction */ - unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */ - unsigned char mx_sb_len; /* [i] max length to write to sbp */ - unsigned short iovec_count; /* [i] 0 implies no scatter gather */ - compat_uint_t dxfer_len; /* [i] byte count of data transfer */ - compat_uint_t dxferp; /* [i], [*io] points to data transfer memory - or scatter gather list */ - compat_uptr_t cmdp; /* [i], [*i] points to command to perform */ - compat_uptr_t sbp; /* [i], [*o] points to sense_buffer memory */ - compat_uint_t timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */ - compat_uint_t flags; /* [i] 0 -> default, see SG_FLAG... */ - compat_int_t pack_id; /* [i->o] unused internally (normally) */ - compat_uptr_t usr_ptr; /* [i->o] unused internally */ - unsigned char status; /* [o] scsi status */ - unsigned char masked_status; /* [o] shifted, masked scsi status */ - unsigned char msg_status; /* [o] messaging level data (optional) */ - unsigned char sb_len_wr; /* [o] byte count actually written to sbp */ - unsigned short host_status; /* [o] errors from host adapter */ - unsigned short driver_status; /* [o] errors from software driver */ - compat_int_t resid; /* [o] dxfer_len - actual_transferred */ - compat_uint_t duration; /* [o] time taken by cmd (unit: millisec) */ - compat_uint_t info; /* [o] auxiliary information */ -}; -#endif - int put_sg_io_hdr(const struct sg_io_hdr *hdr, void __user *argp) { #ifdef CONFIG_COMPAT diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 160748ad9c0f..eace8886d95a 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -405,6 +405,38 @@ sg_release(struct inode *inode, struct file *filp) return 0; } +static int get_sg_io_pack_id(int *pack_id, void __user *buf, size_t count) +{ + struct sg_header __user *old_hdr = buf; + int reply_len; + + if (count >= SZ_SG_HEADER) { + /* negative reply_len means v3 format, otherwise v1/v2 */ + if (get_user(reply_len, &old_hdr->reply_len)) + return -EFAULT; + + if (reply_len >= 0) + return get_user(*pack_id, &old_hdr->pack_id); + + if (in_compat_syscall() && + count >= sizeof(struct compat_sg_io_hdr)) { + struct compat_sg_io_hdr __user *hp = buf; + + return get_user(*pack_id, &hp->pack_id); + } + + if (count >= sizeof(struct sg_io_hdr)) { + struct sg_io_hdr __user *hp = buf; + + return get_user(*pack_id, &hp->pack_id); + } + } + + /* no valid header was passed, so ignore the pack_id */ + *pack_id = -1; + return 0; +} + static ssize_t sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) { @@ -413,8 +445,8 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) Sg_request *srp; int req_pack_id = -1; sg_io_hdr_t *hp; - struct sg_header *old_hdr = NULL; - int retval = 0; + struct sg_header *old_hdr; + int retval; /* * This could cause a response to be stranded. Close the associated @@ -429,79 +461,34 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, "sg_read: count=%d\n", (int) count)); - if (sfp->force_packid && (count >= SZ_SG_HEADER)) { - old_hdr = memdup_user(buf, SZ_SG_HEADER); - if (IS_ERR(old_hdr)) - return PTR_ERR(old_hdr); - if (old_hdr->reply_len < 0) { - if (count >= SZ_SG_IO_HDR) { - /* - * This is stupid. - * - * We're copying the whole sg_io_hdr_t from user - * space just to get the 'pack_id' field. But the - * field is at different offsets for the compat - * case, so we'll use "get_sg_io_hdr()" to copy - * the whole thing and convert it. - * - * We could do something like just calculating the - * offset based of 'in_compat_syscall()', but the - * 'compat_sg_io_hdr' definition is in the wrong - * place for that. - */ - sg_io_hdr_t *new_hdr; - new_hdr = kmalloc(SZ_SG_IO_HDR, GFP_KERNEL); - if (!new_hdr) { - retval = -ENOMEM; - goto free_old_hdr; - } - retval = get_sg_io_hdr(new_hdr, buf); - req_pack_id = new_hdr->pack_id; - kfree(new_hdr); - if (retval) { - retval = -EFAULT; - goto free_old_hdr; - } - } - } else - req_pack_id = old_hdr->pack_id; - } + if (sfp->force_packid) + retval = get_sg_io_pack_id(&req_pack_id, buf, count); + if (retval) + return retval; + srp = sg_get_rq_mark(sfp, req_pack_id); if (!srp) { /* now wait on packet to arrive */ - if (atomic_read(&sdp->detaching)) { - retval = -ENODEV; - goto free_old_hdr; - } - if (filp->f_flags & O_NONBLOCK) { - retval = -EAGAIN; - goto free_old_hdr; - } + if (atomic_read(&sdp->detaching)) + return -ENODEV; + if (filp->f_flags & O_NONBLOCK) + return -EAGAIN; retval = wait_event_interruptible(sfp->read_wait, (atomic_read(&sdp->detaching) || (srp = sg_get_rq_mark(sfp, req_pack_id)))); - if (atomic_read(&sdp->detaching)) { - retval = -ENODEV; - goto free_old_hdr; - } - if (retval) { + if (atomic_read(&sdp->detaching)) + return -ENODEV; + if (retval) /* -ERESTARTSYS as signal hit process */ - goto free_old_hdr; - } - } - if (srp->header.interface_id != '\0') { - retval = sg_new_read(sfp, buf, count, srp); - goto free_old_hdr; + return retval; } + if (srp->header.interface_id != '\0') + return sg_new_read(sfp, buf, count, srp); hp = &srp->header; - if (old_hdr == NULL) { - old_hdr = kmalloc(SZ_SG_HEADER, GFP_KERNEL); - if (! old_hdr) { - retval = -ENOMEM; - goto free_old_hdr; - } - } - memset(old_hdr, 0, SZ_SG_HEADER); + old_hdr = kzalloc(SZ_SG_HEADER, GFP_KERNEL); + if (!old_hdr) + return -ENOMEM; + old_hdr->reply_len = (int) hp->timeout; old_hdr->pack_len = old_hdr->reply_len; /* old, strange behaviour */ old_hdr->pack_id = hp->pack_id; @@ -575,7 +562,12 @@ sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp) int err = 0, err2; int len; - if (count < SZ_SG_IO_HDR) { + if (in_compat_syscall()) { + if (count < sizeof(struct compat_sg_io_hdr)) { + err = -EINVAL; + goto err_out; + } + } else if (count < SZ_SG_IO_HDR) { err = -EINVAL; goto err_out; } diff --git a/include/scsi/sg.h b/include/scsi/sg.h index f91bcca604e4..29c7ad04d2e2 100644 --- a/include/scsi/sg.h +++ b/include/scsi/sg.h @@ -68,6 +68,36 @@ typedef struct sg_io_hdr unsigned int info; /* [o] auxiliary information */ } sg_io_hdr_t; /* 64 bytes long (on i386) */ +#if defined(__KERNEL__) +#include + +struct compat_sg_io_hdr { + compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */ + compat_int_t dxfer_direction; /* [i] data transfer direction */ + unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */ + unsigned char mx_sb_len; /* [i] max length to write to sbp */ + unsigned short iovec_count; /* [i] 0 implies no scatter gather */ + compat_uint_t dxfer_len; /* [i] byte count of data transfer */ + compat_uint_t dxferp; /* [i], [*io] points to data transfer memory + or scatter gather list */ + compat_uptr_t cmdp; /* [i], [*i] points to command to perform */ + compat_uptr_t sbp; /* [i], [*o] points to sense_buffer memory */ + compat_uint_t timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */ + compat_uint_t flags; /* [i] 0 -> default, see SG_FLAG... */ + compat_int_t pack_id; /* [i->o] unused internally (normally) */ + compat_uptr_t usr_ptr; /* [i->o] unused internally */ + unsigned char status; /* [o] scsi status */ + unsigned char masked_status; /* [o] shifted, masked scsi status */ + unsigned char msg_status; /* [o] messaging level data (optional) */ + unsigned char sb_len_wr; /* [o] byte count actually written to sbp */ + unsigned short host_status; /* [o] errors from host adapter */ + unsigned short driver_status; /* [o] errors from software driver */ + compat_int_t resid; /* [o] dxfer_len - actual_transferred */ + compat_uint_t duration; /* [o] time taken by cmd (unit: millisec) */ + compat_uint_t info; /* [o] auxiliary information */ +}; +#endif + #define SG_INTERFACE_ID_ORIG 'S' /* Use negative values to flag difference from original sg_header structure */ From patchwork Tue Dec 17 22:16:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181953 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6384636ile; Tue, 17 Dec 2019 14:20:19 -0800 (PST) X-Google-Smtp-Source: APXvYqxLBSnVZaTfv19RVdIYeiPu/YaeATbpNJ7UqjYxD0x6g69yEsNFoQZBQp3vvaV097/T4TQ6 X-Received: by 2002:aca:c493:: with SMTP id u141mr3112137oif.62.1576621218826; Tue, 17 Dec 2019 14:20:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621218; cv=none; d=google.com; s=arc-20160816; b=W0c5jrz4iFFRAMOaFFsX7oxEpZM1pess6bKA6jnvaJX534sMLs9hGdTX6W3rMSFZup MNYIV1b86XsOpTMwBS6DhNrBx+xrF15qohaRtyexODOpBz+Jox1nbS4kTo0fBsh3WswU 6PBkG3VzO9PNZZB+pks8U+5MUJBXQTRvINO12bapwZAtDZJ6N9b6ta3LtjljdpbQfuZB kM3E6TxR0xyPYGwZgf+y9Gressohvr0cGryvZt9DFaAyybbsHXcVs4hzaIaLmR9fB8o/ WcS/PWD1HUhaIgfh/iTerBQvqIgqzXR2ZtKk8WhTmO2/IQ6H9cnC7JlLgEsNSMn/txNv GmGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ifKkTBxFwTCUmMa9/Y429xewhOO75eJaQUf4rVroTt0=; b=Es/XkCTMOyWSigg3Uy5IVV16pd+4bUzSjCBmfjwsCoQMs6H3IBGtDVNl5vzfPpePQ1 qKT4jlgLfkDbWYtBllleBF4/2rgb5lT7Xb2PokASnoEfLmMdxoZ8+bjLVMJbwoQvLyCh v7SW46sQhTvS1K6ShMt9Xi6a/QLLbo6C/7fQrWzjVMU44yLTbWkV0YfRYVjN1IdCDSaU k+a3zxREipVVAKixsoor1KJSiLX4HS+Jx+tQjEqVbV9IWL2c1CzmETkcZWkep6a5Viw+ vkmlfBbEt4W6GQwi+mey6kPO9sKvQmHo8Q2odudlRCXUWI20FRT1e6J2iS0p/Z0Z0VBV L0+A== 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 3si13164099oir.132.2019.12.17.14.20.18; Tue, 17 Dec 2019 14:20:18 -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 S1727397AbfLQWUR (ORCPT + 27 others); Tue, 17 Dec 2019 17:20:17 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:58879 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725812AbfLQWRi (ORCPT ); Tue, 17 Dec 2019 17:17:38 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MQvL7-1iMdCi0pIl-00Nzc1; Tue, 17 Dec 2019 23:17:27 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 09/27] compat_ioctl: block: add blkdev_compat_ptr_ioctl Date: Tue, 17 Dec 2019 23:16:50 +0100 Message-Id: <20191217221708.3730997-10-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:mmtIkLxrwk7IQXXnRkJ8B+2FIyyyAbad/kCKhLBtclkyPF95FPH voKZ435khGb/rtE1AmYopeqLW2Enb6KjMU3aHMym/CCIeJ/134i1nElJvTyehEziysCaITM SGbQa8uXWK/Gqpwle4RlSqWWAEeHhE5oGw3U/w5L4R9Gyz1IQ2GtGKJ+dZ+hCIQ41q9oCmS PrBKnTbrQ5fXsSHRxWF0g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:OkErmRAfum4=:bs5oIeyGgjC4U4aWDbZOh/ DKd6onqIBwE2F0QpDgEetsTHqsV3372e0VrgDPYOum5LGyL+OEpI7a6ZuXY9jRiPihpaADr9T Ompi+2P4wiwfsZB77EX0NaNyyQ3d56ZiAiwwnLIhCLKlQ5FcCdYsIcVHg8IVxcKGbsf7WO3HP yS3YOdMtZO54LDweou2QG+Gww28abxwoFWLKKJT+p21mTw+ed/lStSFmes+A4f/PZ8kV8e5mi t4CLRzsQnWIznOyIq/ACNZ0kowqowqANtKXMTlIPWJD8GFj/VP3xHhx4xIlFxoGV9D8VDGWsH k+H6YDRNpvOGm4tc+9hqGTp8tWHdOD0XrxYq3MPpZOfTbCTlreslmPLaaGZt2gzGZCQNIcjCb U3QsQLRZwxaM00qJ68lUE2OlgcF7GehYglqWw0GKSVz5O/BlJA3t2RLJ6WWU1GsqKAk3P65Xf XGdWsPJzhcMWQLKUDTk7DlJr89QMsW1hJBIKo+gZGval4+f9aS/2h/FdqRd2m2xj9lArCuFZW a8R6Jfno0WOYH7FOvtR/c5ZI/nRrk4qK+McQBCuN/Q8F7cquTJNK10Sx1GaXRLmuA976QnXUz TBNZog8h2P+hz/RwrUI+ZDuPwOkbtQ3kD3qoPl9WoczeSVg4mTxXfCTuSjC4nlnVsIl/QY+Kp 6mRU6liGwyZ/RzBwhFt1f0Twtiiktxc0CDwZKi5SjUZAk96OS5OkeAvMkPBFIND/q7H1gAar7 a6CEbahPDVLIuBSAnCHjXF5/z47fABYF9GMYjz7K36x+ubwf/8zsAJ3tCd7oFQYz8NjQi7Trj ns48wnfWSfwgS5/nU/H0tE/3dADWFoNlPT3nMY/eeAgj3xNboPaUo65ErYe/I4V7im3Bu2IbB Ynnhxam78HYgbnMQvjPQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A lot of block drivers need only a trivial .compat_ioctl callback. Add a helper function that can be set as the callback pointer to only convert the argument using the compat_ptr() conversion and otherwise assume all input and output data is compatible, or handled using in_compat_syscall() checks. This mirrors the compat_ptr_ioctl() helper function used in character devices. Signed-off-by: Arnd Bergmann --- block/ioctl.c | 21 +++++++++++++++++++++ include/linux/blkdev.h | 7 +++++++ 2 files changed, 28 insertions(+) -- 2.20.0 diff --git a/block/ioctl.c b/block/ioctl.c index 5de98b97af2a..e728331d1a5b 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include #include @@ -285,6 +286,26 @@ int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, */ EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl); +#ifdef CONFIG_COMPAT +/* + * This is the equivalent of compat_ptr_ioctl(), to be used by block + * drivers that implement only commands that are completely compatible + * between 32-bit and 64-bit user space + */ +int blkdev_compat_ptr_ioctl(struct block_device *bdev, fmode_t mode, + unsigned cmd, unsigned long arg) +{ + struct gendisk *disk = bdev->bd_disk; + + if (disk->fops->ioctl) + return disk->fops->ioctl(bdev, mode, cmd, + (unsigned long)compat_ptr(arg)); + + return -ENOIOCTLCMD; +} +EXPORT_SYMBOL(blkdev_compat_ptr_ioctl); +#endif + static int blkdev_pr_register(struct block_device *bdev, struct pr_registration __user *arg) { diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 47eb22a3b7f9..3e0408618da7 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1711,6 +1711,13 @@ struct block_device_operations { const struct pr_ops *pr_ops; }; +#ifdef CONFIG_COMPAT +extern int blkdev_compat_ptr_ioctl(struct block_device *, fmode_t, + unsigned int, unsigned long); +#else +#define blkdev_compat_ptr_ioctl NULL +#endif + extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, unsigned long); extern int bdev_read_page(struct block_device *, sector_t, struct page *); From patchwork Tue Dec 17 22:16:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181954 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6387088ile; Tue, 17 Dec 2019 14:22:41 -0800 (PST) X-Google-Smtp-Source: APXvYqzt6jD0dNoiT6DLaXHsrjMu6eAA6TjXhUBhfDXrVUMU31Wd0tPBMLEI+BABX/1PHD0fOh7Z X-Received: by 2002:a9d:65cf:: with SMTP id z15mr41799915oth.238.1576621361811; Tue, 17 Dec 2019 14:22:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621361; cv=none; d=google.com; s=arc-20160816; b=KCHOP5RCBfB3n32/R/Iv4nt34FajDKiYDRN17bDGYlXne6igW0pn/YpJtfzNZpSw55 IEahlnGzgKdbXal+PWe+0VSBv7a4YaRki6VqaUfiYzwDVjizwmXLCuFYKVHj5JdKLFyB qrZDcmAuxIv+naK+iELqOSrr3+u9Ljc3Yac0y/evhF4i6PeQ5CBp52ArXutpwG6FeC4e GGMk35hNL97dhkIMRE4to7FE2ccdTZp3ZAFYHWFJU5MThVzBarnavOZFpOcQOJ/MZZgH e8Ry0AhFmtxBlK7MWrYTzcWdDZrwYJXsWTeGO/EIrkkvmbS3cj3i9aW5Oa7QHI+7w4jh L8Jw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ga96TGRzOIf8fqr+b1GNEYlycVyxH6YjySPwyZnSFeM=; b=Akul0zoKLXR2KKxRpJRxCdtSkDIzHM0sOiQrzzQqiJfvk7W7p+2iaUPbfNcb7ZjTVj MxuXcm6xEWUaYRcgEdeh5Upl4MbNfsMi0bII8CLI0sbOV+K0jfNiXWiicfQmgoOl5Av8 KxJfTPJcLdCUVGIDijII1JD9pK32vMhGcTMonWG/wW3APAk5jWtu/rVPRkIfmXuvpZet SELrCGrrcIjIq+vyPE2iGP5OxD0qaXVa/ZgHOEPPKxBg1KKCSTgSbMAz7zI87FatZoPC wrVObX0/gxkFFlGLp5UfOoi8Wx3BzxQ7X4wFCm5/y3Hs4nOStKvYz9W2eAEGGyh8/h9T XY8A== 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 t7si14139977otl.133.2019.12.17.14.22.41; Tue, 17 Dec 2019 14:22:41 -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 S1726690AbfLQWWk (ORCPT + 27 others); Tue, 17 Dec 2019 17:22:40 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:50303 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725805AbfLQWWj (ORCPT ); Tue, 17 Dec 2019 17:22:39 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MJV5K-1iNTt20bmK-00JtoE; Tue, 17 Dec 2019 23:17:28 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 11/27] compat_ioctl: move CDROM_SEND_PACKET handling into scsi Date: Tue, 17 Dec 2019 23:16:52 +0100 Message-Id: <20191217221708.3730997-12-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:Mp6Rj1N7d53mOvmoxMfJiXqVy8L4vX/KvDXHNCZwCkj5FtqvPqF LmsoqBqoIPLL7AWulDNY/HeW0lyyWQFtfqHhobt64l7pTViW29nW6M1yeERIiviw+HfvW9Q cTGasJcn8hQNeBqcIHZ3tp1szj6SouCBKTs1wZrLmWyroDrgUBg7FdHwEOUDsQvv9ZRTh/V HOPorWfYSm2xUQnMzZwig== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:0YLBBWODoHM=:uDf/SRKlIUIKgACjezHiKS 5nSxSvF9qoF1iaB0ddvSTisSkno8s9Wk2vTRscWdwMFfHcVcv5uL2dLxFru8slEBa0C3U2AzB +qvKfh/fPsmmkm2x/eslA9pOJUnr6wCQU5MLzCM0fwzyVdsAqEXws3ArzSAMGTULxdNwCl4Kw jzcRXYpbhpYUmZ2AzexKsdTrmKLOFZblJ0whfwdLfYqHbovYis78zMBp/3+pm+Au8g/q+7fQj 2Se9G2tsx/xL4Ppv1Dw05sZaBVH4OHfjgNCv1/TjrRGmi6FlCDpcZCHP3tatmDvdwE/nf08EE +ZKkdw2y4IzjO8AR9efNnYOe2aVtS/xcvN97fzsVDM11AhDI7EY3hhRwXKK9EIh3fTE4+Jiy+ DYuSwqJu+Jv4y0in9PHCLvcHUIqeHiKH5xbb8GDpvHfUrRYxxjxWok+wbAf74aoUVLPHq3hrU 76ULf2FBo4wGrUAX/yrB6gmTUjrQlIyk5xh3BcP5Q4fk/1rTsPVo/6GplaCA2WK1LeAecFioU vsxhBfDw1tqC4rPy1DmGUB9QVAUd755Gu6npvnTHp29MURmGGWdFGvRqmVOlD4zfqYDVE3xsb q5YtAiSaxqrlBRGzLCH6XQuxjnugDwQoos7XnSvuzZEV1UeepTyGsrRQafzB3SBgAy74Jannt aTUkELjMbxJFbK5tZCFiXQNjUT2S8HFPeG8MBbqJYflhP+SrQW3Tdse4n4wv91i8VsBoMFA+2 z5N1q1j5Ucs3O+vRyHlAfia0CCIFDkU4p9pLC49Vw6ZJxFVYj/2S4XrzteXWLuLf594skFg3w xHq1mv+oQ5G0a3hH4R8YBcRABnBxssGrqj5MOVJkubu1LIag86jK0XzsRY4IzUOpJJ6gosCeL dLgbzKKx/LBfJPL/h5tQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There is only one implementation of this ioctl, so move the handling out of the common block layer code into the place where it's actually needed. It also gets called indirectly through pktcdvd, which needs to be aware of this change. As I noticed, the old implementation of the compat handler failed to convert the structure on the way out, so the updated fields never got written back to user space. This is either not important, or it has never worked and should be fixed now. Signed-off-by: Arnd Bergmann --- block/compat_ioctl.c | 47 +--------- block/scsi_ioctl.c | 185 ++++++++++++++++++++++++++++------------ drivers/block/pktcdvd.c | 6 +- 3 files changed, 135 insertions(+), 103 deletions(-) -- 2.20.0 diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index f16ae92065d7..578e04f94619 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c @@ -102,18 +102,6 @@ struct compat_cdrom_read_audio { compat_caddr_t buf; }; -struct compat_cdrom_generic_command { - unsigned char cmd[CDROM_PACKET_SIZE]; - compat_caddr_t buffer; - compat_uint_t buflen; - compat_int_t stat; - compat_caddr_t sense; - unsigned char data_direction; - compat_int_t quiet; - compat_int_t timeout; - compat_caddr_t reserved[1]; -}; - static int compat_cdrom_read_audio(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { @@ -141,38 +129,6 @@ static int compat_cdrom_read_audio(struct block_device *bdev, fmode_t mode, (unsigned long)cdread_audio); } -static int compat_cdrom_generic_command(struct block_device *bdev, fmode_t mode, - unsigned int cmd, unsigned long arg) -{ - struct cdrom_generic_command __user *cgc; - struct compat_cdrom_generic_command __user *cgc32; - u32 data; - unsigned char dir; - int itmp; - - cgc = compat_alloc_user_space(sizeof(*cgc)); - cgc32 = compat_ptr(arg); - - if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) || - get_user(data, &cgc32->buffer) || - put_user(compat_ptr(data), &cgc->buffer) || - copy_in_user(&cgc->buflen, &cgc32->buflen, - (sizeof(unsigned int) + sizeof(int))) || - get_user(data, &cgc32->sense) || - put_user(compat_ptr(data), &cgc->sense) || - get_user(dir, &cgc32->data_direction) || - put_user(dir, &cgc->data_direction) || - get_user(itmp, &cgc32->quiet) || - put_user(itmp, &cgc->quiet) || - get_user(itmp, &cgc32->timeout) || - put_user(itmp, &cgc->timeout) || - get_user(data, &cgc32->reserved[0]) || - put_user(compat_ptr(data), &cgc->reserved[0])) - return -EFAULT; - - return __blkdev_driver_ioctl(bdev, mode, cmd, (unsigned long)cgc); -} - struct compat_blkpg_ioctl_arg { compat_int_t op; compat_int_t flags; @@ -224,8 +180,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, return compat_hdio_ioctl(bdev, mode, cmd, arg); case CDROMREADAUDIO: return compat_cdrom_read_audio(bdev, mode, cmd, arg); - case CDROM_SEND_PACKET: - return compat_cdrom_generic_command(bdev, mode, cmd, arg); /* * No handler required for the ones below, we just need to @@ -263,6 +217,7 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, case CDROM_DISC_STATUS: case CDROM_CHANGER_NSLOTS: case CDROM_GET_CAPABILITY: + case CDROM_SEND_PACKET: /* Ignore cdrom.h about these next 5 ioctls, they absolutely do * not take a struct cdrom_read, instead they take a struct cdrom_msf * which is compatible. diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index b61dbf4d8443..b4e73d5dd5c2 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -639,6 +639,136 @@ int get_sg_io_hdr(struct sg_io_hdr *hdr, const void __user *argp) } EXPORT_SYMBOL(get_sg_io_hdr); +#ifdef CONFIG_COMPAT +struct compat_cdrom_generic_command { + unsigned char cmd[CDROM_PACKET_SIZE]; + compat_caddr_t buffer; + compat_uint_t buflen; + compat_int_t stat; + compat_caddr_t sense; + unsigned char data_direction; + compat_int_t quiet; + compat_int_t timeout; + compat_caddr_t reserved[1]; +}; +#endif + +static int scsi_get_cdrom_generic_arg(struct cdrom_generic_command *cgc, + const void __user *arg) +{ +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) { + struct compat_cdrom_generic_command cgc32; + + if (copy_from_user(&cgc32, arg, sizeof(cgc32))) + return -EFAULT; + + *cgc = (struct cdrom_generic_command) { + .buffer = compat_ptr(cgc32.buffer), + .buflen = cgc32.buflen, + .stat = cgc32.stat, + .sense = compat_ptr(cgc32.sense), + .data_direction = cgc32.data_direction, + .quiet = cgc32.quiet, + .timeout = cgc32.timeout, + .reserved[0] = compat_ptr(cgc32.reserved[0]), + }; + memcpy(&cgc->cmd, &cgc32.cmd, CDROM_PACKET_SIZE); + return 0; + } +#endif + if (copy_from_user(cgc, arg, sizeof(*cgc))) + return -EFAULT; + + return 0; +} + +static int scsi_put_cdrom_generic_arg(const struct cdrom_generic_command *cgc, + void __user *arg) +{ +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) { + struct compat_cdrom_generic_command cgc32 = { + .buffer = (uintptr_t)(cgc->buffer), + .buflen = cgc->buflen, + .stat = cgc->stat, + .sense = (uintptr_t)(cgc->sense), + .data_direction = cgc->data_direction, + .quiet = cgc->quiet, + .timeout = cgc->timeout, + .reserved[0] = (uintptr_t)(cgc->reserved[0]), + }; + memcpy(&cgc32.cmd, &cgc->cmd, CDROM_PACKET_SIZE); + + if (copy_to_user(arg, &cgc32, sizeof(cgc32))) + return -EFAULT; + + return 0; + } +#endif + if (copy_to_user(arg, cgc, sizeof(*cgc))) + return -EFAULT; + + return 0; +} + +static int scsi_cdrom_send_packet(struct request_queue *q, + struct gendisk *bd_disk, + fmode_t mode, void __user *arg) +{ + struct cdrom_generic_command cgc; + struct sg_io_hdr hdr; + int err; + + err = scsi_get_cdrom_generic_arg(&cgc, arg); + if (err) + return err; + + cgc.timeout = clock_t_to_jiffies(cgc.timeout); + memset(&hdr, 0, sizeof(hdr)); + hdr.interface_id = 'S'; + hdr.cmd_len = sizeof(cgc.cmd); + hdr.dxfer_len = cgc.buflen; + switch (cgc.data_direction) { + case CGC_DATA_UNKNOWN: + hdr.dxfer_direction = SG_DXFER_UNKNOWN; + break; + case CGC_DATA_WRITE: + hdr.dxfer_direction = SG_DXFER_TO_DEV; + break; + case CGC_DATA_READ: + hdr.dxfer_direction = SG_DXFER_FROM_DEV; + break; + case CGC_DATA_NONE: + hdr.dxfer_direction = SG_DXFER_NONE; + break; + default: + return -EINVAL; + } + + hdr.dxferp = cgc.buffer; + hdr.sbp = cgc.sense; + if (hdr.sbp) + hdr.mx_sb_len = sizeof(struct request_sense); + hdr.timeout = jiffies_to_msecs(cgc.timeout); + hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; + hdr.cmd_len = sizeof(cgc.cmd); + + err = sg_io(q, bd_disk, &hdr, mode); + if (err == -EFAULT) + return -EFAULT; + + if (hdr.status) + return -EIO; + + cgc.stat = err; + cgc.buflen = hdr.resid; + if (scsi_put_cdrom_generic_arg(&cgc, arg)) + return -EFAULT; + + return err; +} + int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mode, unsigned int cmd, void __user *arg) { @@ -689,60 +819,9 @@ int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mod err = -EFAULT; break; } - case CDROM_SEND_PACKET: { - struct cdrom_generic_command cgc; - struct sg_io_hdr hdr; - - err = -EFAULT; - if (copy_from_user(&cgc, arg, sizeof(cgc))) - break; - cgc.timeout = clock_t_to_jiffies(cgc.timeout); - memset(&hdr, 0, sizeof(hdr)); - hdr.interface_id = 'S'; - hdr.cmd_len = sizeof(cgc.cmd); - hdr.dxfer_len = cgc.buflen; - err = 0; - switch (cgc.data_direction) { - case CGC_DATA_UNKNOWN: - hdr.dxfer_direction = SG_DXFER_UNKNOWN; - break; - case CGC_DATA_WRITE: - hdr.dxfer_direction = SG_DXFER_TO_DEV; - break; - case CGC_DATA_READ: - hdr.dxfer_direction = SG_DXFER_FROM_DEV; - break; - case CGC_DATA_NONE: - hdr.dxfer_direction = SG_DXFER_NONE; - break; - default: - err = -EINVAL; - } - if (err) - break; - - hdr.dxferp = cgc.buffer; - hdr.sbp = cgc.sense; - if (hdr.sbp) - hdr.mx_sb_len = sizeof(struct request_sense); - hdr.timeout = jiffies_to_msecs(cgc.timeout); - hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; - hdr.cmd_len = sizeof(cgc.cmd); - - err = sg_io(q, bd_disk, &hdr, mode); - if (err == -EFAULT) - break; - - if (hdr.status) - err = -EIO; - - cgc.stat = err; - cgc.buflen = hdr.resid; - if (copy_to_user(arg, &cgc, sizeof(cgc))) - err = -EFAULT; - + case CDROM_SEND_PACKET: + err = scsi_cdrom_send_packet(q, bd_disk, mode, arg); break; - } /* * old junk scsi send command ioctl diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 861fc65a1b75..ab4d3be4b646 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -2671,15 +2671,13 @@ static int pkt_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned in case CDROMEJECT: case CDROMMULTISESSION: case CDROMREADTOCENTRY: + case CDROM_SEND_PACKET: /* compat mode handled in scsi_cmd_ioctl */ case SCSI_IOCTL_SEND_COMMAND: return pkt_ioctl(bdev, mode, cmd, (unsigned long)compat_ptr(arg)); - /* FIXME: no handler so far */ - case CDROM_LAST_WRITTEN: - /* handled in compat_blkdev_driver_ioctl */ - case CDROM_SEND_PACKET: default: + case CDROM_LAST_WRITTEN: return -ENOIOCTLCMD; } } From patchwork Tue Dec 17 22:16:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181945 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6383249ile; Tue, 17 Dec 2019 14:19:14 -0800 (PST) X-Google-Smtp-Source: APXvYqxKu88AqLPiW6GAQf1wCva2RaJ0USnBWn6i6S0OfL971P/orS617jy3fDewe+SUSW5514Lm X-Received: by 2002:a05:6808:a8e:: with SMTP id q14mr2854310oij.173.1576621154580; Tue, 17 Dec 2019 14:19:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621154; cv=none; d=google.com; s=arc-20160816; b=AWLvY0gEOunBiI7/hQ5j2fUx16ZQghx9TH2QVf1g4CSpRlA8Hx9dDNXbjxwArGFp/7 HSQvEHoh/wTJntWJzHjKCyA8I1sd9w6sMg4XwEUUkCt2mY24WNJepiV2HjWMVImgEOH6 MiAGUhwASn36G4mnUdtttiJKoi54UI344+ZT9TjRGLif4V+aCiNbPEKtjAqKSrVNKJvK UsshL6N0UOPCSYGTtmx7m6YmN9aXJ0fhq2SDrlNdJv3uAnPoEnqbgXGuDLxZTEpC9i8N QH+q80TcQ8+NMbPkOR9p8v4WuiBh5EX4yWMa1zSWJpFTqkzLvgT8Dms1JZAv/z75YkB+ Ya+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=+IyWi71jOz+f1/EpORDZXIhsKPvu7kRnxluBl5Bn2rc=; b=Xv5UulMjaOmqhPMn1DOhPz98Z16tpaJIr13T00TpR6KsEczUF92Q93i3/5i1yGFoh5 BuIIO30qS6vx1TFBdBHVg1/MzixoJvg07JsBvhI1e7ghzW3VZ6OFbV341/6kCyLaI0b9 bVMxVBSAk8m4D/VkLh5l0AZy+t3PK7zoiDQ8J5XLX4aw/Jm7B+BS4BMamVjK1hUgQIwa uww/dOtM2/Ojs8yajoBBV31CR3p+z4wSMHUgWPb/F+NsLqR0Wphfo6UeVbterbhNZ00N X6iqXCMKOuyJyXAHxBEKIyD8RJB5KCj3dJ1XmhX+NIjNtFs8D3l9BmI04FLRibUvYXkb pLMw== 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 l14si452758oii.37.2019.12.17.14.19.14; Tue, 17 Dec 2019 14:19:14 -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 S1726777AbfLQWTM (ORCPT + 27 others); Tue, 17 Dec 2019 17:19:12 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:53763 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726539AbfLQWRm (ORCPT ); Tue, 17 Dec 2019 17:17:42 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1N8GEY-1hdQgS2Y64-014F6s; Tue, 17 Dec 2019 23:17:28 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 12/27] compat_ioctl: move CDROMREADADIO to cdrom.c Date: Tue, 17 Dec 2019 23:16:53 +0100 Message-Id: <20191217221708.3730997-13-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:SEzk2cE2KU/nNwoHfidkX8tSUvACbWH8uSk5lxoIuhKQ5CztWxi bOWwXOzfL6LJLGSTM7iwROz0sna6duXBrCFvKGwnOsrAzq9Tg9pU9s7afIMaCaRpVGbyCN/ XwRKj4yFepn9WVTWTnBK2V3XIX2hZwlo+sFykVTcsN1BtuwMYi2wx4Oohc65URen5wcBFuc kGOwA5NDRqz4uDUVqyHtQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:HlEXxuefKnQ=:q2hK5YnnOvqsUKbyH+4ygI M+1LtTx6gRiGNH5cwDteqBKUew+WRP30dnsjs1CqXSY5tcG2Ji+XYJQ9fg74Lh/YtmFcIiDxi Wd5mr4n7Dob36GOioVZ0rnSOECG1wbZhlMDMr20rDGsI+87xKTZtYTgNG4DHoebf0r++6ZJFx D3cGh07tox4ZvxJp5blgH4rwItQP0lDSge2TLKnrbsF7/Azz4nQHzpzqIvAcOI45ni78YD7Q/ TGeD61+btd80HC99gaucfPqQHmud6suE08GOy/2X/2EzpfSHV2b+FFZHpAVW9n4BYDZY6E/o2 DlvTXTFpcVae8SsQm5vKEwO7KrhOm8iUBoD8hEIHOPuXLmNAMnRjC0z+M6eRZ23vwGbXFthBy SXLwKf4vDWdI1j2I5Hm+RmAuKnEnLqh/CxpZOJL8urWW6jmQD0BCso1Pr42qY6hntHQmClUZe 2uQM56dK/NVQe8Z9OwvO46PA+5OC/sRA2bQu548EgWAO/pLfXGWxOHcED0Wc2he6FlQYVIF1r DM+osZMXSMnLONmXnpSzJYHexkHQwDcD6Ilm4aSR0Bafc4LAqh3U904vhglbnuSXTBy4v28bG k+/bwy8R/clnpebnl0zPoUbXXhF71AMTm5PvJZZ9s1ugzjQwrwmk5VQ9AoKJGWUQSE18oxo0q cEe2qQy9AaufAKJ6c2Fr21LA3uqpwQ2CX1KJDBjvuVzkAhNRXV1iQFElVh1yeR03B+eFTPByi CpcpUkCYw7zZ7MEQQenSPWy/XRHmamdibRDpOvPyV9ZHYarpKVQ/JO/WHS2i2LowlZfjOhW92 9DvUema4JwLbhqhT3zOrL+qYxejCVGAPJhd1tDrKBuLXdyxrDxVziqd7Knxe6ltNa1Gjc+jDU a3jFykHFY1cSFNebaT1Q== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Again, there is only one file that needs this, so move the conversion handler into the native implementation. Signed-off-by: Arnd Bergmann --- block/compat_ioctl.c | 36 ------------------------------------ drivers/cdrom/cdrom.c | 28 +++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 39 deletions(-) -- 2.20.0 diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index 578e04f94619..cf136bc2c9fc 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c @@ -95,40 +95,6 @@ static int compat_hdio_ioctl(struct block_device *bdev, fmode_t mode, return error; } -struct compat_cdrom_read_audio { - union cdrom_addr addr; - u8 addr_format; - compat_int_t nframes; - compat_caddr_t buf; -}; - -static int compat_cdrom_read_audio(struct block_device *bdev, fmode_t mode, - unsigned int cmd, unsigned long arg) -{ - struct cdrom_read_audio __user *cdread_audio; - struct compat_cdrom_read_audio __user *cdread_audio32; - __u32 data; - void __user *datap; - - cdread_audio = compat_alloc_user_space(sizeof(*cdread_audio)); - cdread_audio32 = compat_ptr(arg); - - if (copy_in_user(&cdread_audio->addr, - &cdread_audio32->addr, - (sizeof(*cdread_audio32) - - sizeof(compat_caddr_t)))) - return -EFAULT; - - if (get_user(data, &cdread_audio32->buf)) - return -EFAULT; - datap = compat_ptr(data); - if (put_user(datap, &cdread_audio->buf)) - return -EFAULT; - - return __blkdev_driver_ioctl(bdev, mode, cmd, - (unsigned long)cdread_audio); -} - struct compat_blkpg_ioctl_arg { compat_int_t op; compat_int_t flags; @@ -178,8 +144,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, case HDIO_GET_ADDRESS: case HDIO_GET_BUSSTATE: return compat_hdio_ioctl(bdev, mode, cmd, arg); - case CDROMREADAUDIO: - return compat_cdrom_read_audio(bdev, mode, cmd, arg); /* * No handler required for the ones below, we just need to diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index eebdcbef0578..48095025e588 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -3017,9 +3017,31 @@ static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi, struct cdrom_read_audio ra; int lba; - if (copy_from_user(&ra, (struct cdrom_read_audio __user *)arg, - sizeof(ra))) - return -EFAULT; +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) { + struct compat_cdrom_read_audio { + union cdrom_addr addr; + u8 addr_format; + compat_int_t nframes; + compat_caddr_t buf; + } ra32; + + if (copy_from_user(&ra32, arg, sizeof(ra32))) + return -EFAULT; + + ra = (struct cdrom_read_audio) { + .addr = ra32.addr, + .addr_format = ra32.addr_format, + .nframes = ra32.nframes, + .buf = compat_ptr(ra32.buf), + }; + } else +#endif + { + if (copy_from_user(&ra, (struct cdrom_read_audio __user *)arg, + sizeof(ra))) + return -EFAULT; + } if (ra.addr_format == CDROM_MSF) lba = msf_to_lba(ra.addr.msf.minute, From patchwork Tue Dec 17 22:16:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181934 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6381721ile; Tue, 17 Dec 2019 14:17:58 -0800 (PST) X-Google-Smtp-Source: APXvYqwMp8Owu0TfwdT/1yyMdSGoUGXil6mIq81/88J5LXmJEXrQOH1b2D68oHIjtM968Hc/4JM/ X-Received: by 2002:aca:d4c1:: with SMTP id l184mr3014194oig.172.1576621078212; Tue, 17 Dec 2019 14:17:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621078; cv=none; d=google.com; s=arc-20160816; b=yutOKhEzbQa6Md3iKqxuV9xNN9Xqmy3PNCb2qXVO353goS/dgimwbbfi5Jcvk6BzrE YpXesO0o7aGGSYufRM5h2cn5EdXhbBkj5elYPXEpmycf1IJqvBwwREM0/PSVnrzv0JRF l2pMlMoE8sr7zNPKDqkK+D61XBTwwiGp97Ovo1DzgtS/KKvJpMrIGrOiht1QjlIenX7X qf7kxXLf5C1bA8DdTpNIEK4AWfDBoi7Bl30JRfEdnDTkf9to6/tAboeaYBOSiSbnTrZR xfRIHtusj9VlPsZt5rXqM4gelNoG5uvrpDlGm4KRWKa/d6VMXJbIymsY6oJ6lVQGNC5V BCWg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Mif8f5vWDs6pIY7DqAFacVvOpWmDj2kcNSGfq/mH8mw=; b=MvRQEdfRrt6hv2yFCjHGJHX1kATH+Y6LZlKUaKBc3ZM6x38hMLLOS+nf3nyvcBRU/2 TpCZsqkqiEfIfEq7CR15TdqlUdeQ4sbOeMBfqhFs0+C/NSv5wNImiSA67dO402JQXTvo SniF1g55i+VyHB9Gw/2NEmaQzA0aPgra6BKeZXHiE2YIKvhxCbLxpvEAtzO+5jtgqmFd XT+mUZ13AISljadoAemhRT7vRh69oA/0KzNOTAGT+zs1NjMkO4/eYqCwxD1TLuYxzzYJ xiODnbAk0DgzywSAjj5yBBZWae4PTUIBTTxC/NbTgbJwI4JtgR7ZVxBTNf/CoEN5SxAP WHIw== 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 s139si12996613oih.17.2019.12.17.14.17.57; Tue, 17 Dec 2019 14:17:58 -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 S1726829AbfLQWR4 (ORCPT + 27 others); Tue, 17 Dec 2019 17:17:56 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:52901 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726744AbfLQWRt (ORCPT ); Tue, 17 Dec 2019 17:17:49 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1N63JO-1hbEp725Si-016S2I; Tue, 17 Dec 2019 23:17:29 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 14/27] compat_ioctl: block: handle cdrom compat ioctl in non-cdrom drivers Date: Tue, 17 Dec 2019 23:16:55 +0100 Message-Id: <20191217221708.3730997-15-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:fgECgP85UcsuJjsyAuZL7QHYXHYBEzujC6oqv+TYTA3UFXDQ0+O zy7BYkmbtD/vp8Tk1y4FGXR086ig4FhOi/Rl5dEFBP99TTQ2jhWlrdT8lSSnQknngX1KAB6 I+ogzZX67PGokZ5zfes54eIzqMGogav4wpegt34I+hdR5RPVE6BuP6DYZmUdBpq20dc60rb ROIQeamCDbWQqLST38hUw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:GRelAd88hdg=:yDxJVmxWHvbBFPkEJEmEgE UEJvUfrBcsIZdJ7qfTVCrg1uiVg3njJLZUgTJpKad1/0+ryRGw9lVt3Avgsqio22idIXMjSYk 6zrTwH4axXV4Cl4ve64rU2hWTWiT/olx8jg/SSUSaetzy5RDNf/kR3vv022nW2OozkTrsv2Yv /G/tPFFJ/YBFl9BrRb2jp6K9D5f4ATmf4sld1YkHKSUtY7tHEgC8mVhtoCF92EsLDURoV9VJt rOPjvPYp8I/ZUFiMUOMMlGNUHa6F8+6UvVkrSO1TmPLafk/QSAS4uGvK2jtG4/xE3SPeFk35b FnNQX3FjImzSW8jI1uRA1naRTwsNWeQZWOqgRYbqlziCqvUX/O2q4xWgWF/hso+qX6SFlpKTE gKrZcHUKfFqK//ND+xPaACsxvQ+CNeJ3eLsDDN9dtEZiwd2nVTJ7q695ln4CGsdnBo5b+2fWO qDoIgtssB7L/qaqDin3lV+OxwZKxJCo2TwB8Y8JllsSvRYDjFFCJ1PJbY6hN4DeFWZdoGXHXC dpbdNgG70Q12STFtj0ptYcToUP5JrcHW4zGjaNIEUb9flTkhKGrWUEyYVRgDMFRiJ78qeeGG7 U6OJUSgaYGm37yvkzz1stO8fLt5rQwHkF6HtPm9npdUb53zFh6omU7pXKYtof7ZZi8bTLU06Z EhsMwxi3rstYhU6Jfqyz+YGUlUQIC7EA4tUEB0JowiIEFBwKZH9DDJwFAVchSJ3iJ6bfjciKR 8xWRaCtwhXmQAAbQZiw/69ztEa+l7vwzQQxnVaXo73+DcvjaO2Vr+EYUvfvkw1aQRAZ6QF5bW Tah+sUwg3WYC/0ow8O3EuxAAp19fzZTzbD3gcbp3e2aKDjGK+jphXGvhxn0A7CwGsUys4OFtb zAVZkqDVqwzXkJ9H41qQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Various block drivers implement the CDROMMULTISESSION, CDROM_GET_CAPABILITY, and CDROMEJECT ioctl commands, relying on the block layer to handle compat_ioctl mode for them. Move this into the drivers directly as a preparation for simplifying the block layer later. When only integer arguments or no arguments are passed, the same handler can be used for .ioctl and .compat_ioctl, and when only pointer arguments are passed, the newly added blkdev_compat_ptr_ioctl can be used. Signed-off-by: Arnd Bergmann --- drivers/block/floppy.c | 3 +++ drivers/block/paride/pd.c | 1 + drivers/block/paride/pf.c | 1 + drivers/block/sunvdc.c | 1 + drivers/block/xen-blkfront.c | 1 + 5 files changed, 7 insertions(+) -- 2.20.0 diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 485865fd0412..cd3612e4e2e1 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -3879,6 +3879,9 @@ static int fd_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned int { int drive = (long)bdev->bd_disk->private_data; switch (cmd) { + case CDROMEJECT: /* CD-ROM eject */ + case 0x6470: /* SunOS floppy eject */ + case FDMSGON: case FDMSGOFF: case FDSETEMSGTRESH: diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 6f9ad3fc716f..c0967507d085 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c @@ -874,6 +874,7 @@ static const struct block_device_operations pd_fops = { .open = pd_open, .release = pd_release, .ioctl = pd_ioctl, + .compat_ioctl = pd_ioctl, .getgeo = pd_getgeo, .check_events = pd_check_events, .revalidate_disk= pd_revalidate diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index 6b7d4cab3687..bb09f21ce21a 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c @@ -276,6 +276,7 @@ static const struct block_device_operations pf_fops = { .open = pf_open, .release = pf_release, .ioctl = pf_ioctl, + .compat_ioctl = pf_ioctl, .getgeo = pf_getgeo, .check_events = pf_check_events, }; diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c index 571612e233fe..39aeebc6837d 100644 --- a/drivers/block/sunvdc.c +++ b/drivers/block/sunvdc.c @@ -171,6 +171,7 @@ static const struct block_device_operations vdc_fops = { .owner = THIS_MODULE, .getgeo = vdc_getgeo, .ioctl = vdc_ioctl, + .compat_ioctl = blkdev_compat_ptr_ioctl, }; static void vdc_blk_queue_start(struct vdc_port *port) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index a74d03913822..23c86350a5ab 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -2632,6 +2632,7 @@ static const struct block_device_operations xlvbd_block_fops = .release = blkif_release, .getgeo = blkif_getgeo, .ioctl = blkif_ioctl, + .compat_ioctl = blkdev_compat_ptr_ioctl, }; From patchwork Tue Dec 17 22:16:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181948 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6383488ile; Tue, 17 Dec 2019 14:19:25 -0800 (PST) X-Google-Smtp-Source: APXvYqzvJwlvy91Ak+xduKSlN/yEd4nn60BGwsyKq6PFNs1Ua9l9mPcwItQgN6r+KzXF6zrOqYub X-Received: by 2002:a9d:53c2:: with SMTP id i2mr38100764oth.43.1576621165763; Tue, 17 Dec 2019 14:19:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621165; cv=none; d=google.com; s=arc-20160816; b=rheqiCAMXc9fkV0MOG3cFAtiHCAsTR/ST+lUfuWXNgfC1fYv/4HI0jeqnfLlzVEDUw LeYtj6EWTaS37mtkVwaB4bWUfjDxbN+RdBj28DkseunLbTj2MKeEkNv4rF5W3JzMLaTA olAcMzmvBfp4mrPbQ4vzPCGV2ncS5feYGiK4qz97hOlFLV0pb0LzNEZb051W7YveNJRi 868egUP43peQN8gz5oWqLQOBYsqyaJNhclDLp/R+QJKOF2Yz7fUmJHua7I552KOhpV7b +J06wGO5qEkQywa+sR7Kavn7jVJuDInqtKvNj/7djiNqE/fbnFEqkLAz9ga0vXSrLqoQ MhIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=1AVkuICYuUJ9D3eRwQf8/7qao6yYJFs+YeK6ywV2mhg=; b=hvgpOLshT1Ef65a0YEaNfNckXObZfUqTGrDWT5mgTQqEoHMASHNrQQb+25v0CyrSU+ +FA4y9jfsq6QITj68071O87XmU5MHGMESxQ3x7eqbp+gFUKFW4yZar18Q9sW4l69FUbT to+mx9j20mC9Osj6EftKkPCk63Z9JRE6OzCKZbHDMA7uA+m/1nGtEGnvkqsASSED6Omr 2NsyceHbTQPI/SHnQzRJ9k9JYYFh3KcLo4bICX1j+KyM990sozU13q065ZB0/xLL65A3 tH2JwV29JU8NQ8TPHw9zgYl6j5eSxO5wKUiSZl1Gw3wfNMTvV4nF/kqC2GwsRaiFEFjG O1rg== 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 x9si11972485otk.170.2019.12.17.14.19.25; Tue, 17 Dec 2019 14:19:25 -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 S1727230AbfLQWTY (ORCPT + 27 others); Tue, 17 Dec 2019 17:19:24 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:34075 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727165AbfLQWTV (ORCPT ); Tue, 17 Dec 2019 17:19:21 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1M8QJq-1icvIw1gYq-004PCA; Tue, 17 Dec 2019 23:17:30 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 16/27] compat_ioctl: bsg: add handler Date: Tue, 17 Dec 2019 23:16:57 +0100 Message-Id: <20191217221708.3730997-17-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:CcW0OER95wDXq0YetFdqoTdTEnAWcPISLF3QDQtri9hrxSFvPXG fBdpTLjhv0iKK2rBmn4jyDnjys1/pVoz09rAJLkDNE6wj+fddgYodj6iKfELZj3+/PdHrcO tw2Gy4JzU2ZMgdpd+jxtzid1wBePiv+WmdPlrT6nYzzMvTt7km/aGxMnd97UOOoejnfCoWW 3LytDdHjU3oriRUGkNmhg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:Yj2mPlnFp94=:fKjchY6xasw3iPgAiTTlST y2fJLfy8whAQA/X2JktR72kckWBi+i+GEgdIL1mIGmyUXnZeEfx3jWleiclTjPFTEBCBFDJG1 LoMm7vit2smCIWZGk0nKs7UkMSSPS6mvR65hs5LpSANX+RaU3V7ZeKeA2idWlUnrHmUdvvibW +LQWNNSDTYtRkk/PNlXcEA6YkgeLx1SHpOD+VHOB5cmlFFpYGyeM3RLnFFo619lx1X5D4ussB uqqdu+Nw6bQm+WKgAQewdSLPTnLm4UDHvOeL4FglMwkbnotBzQ5uEclxuKlWcJqgGkCI3Wlsa YlrYI4rnIsbPU1T3/dxGG+MXkafh0q8q/Q3x/aJPHzic/vq6ILaZ5oqEB3Jpjm7qZlXfvjiLC KRicjRF7eptVnI8dEu+/dRlm2wIKp5QbMekshiCZ6dMt5Hu70cie3YtrGyG/l3nsFgAOcgEQD 3I9TUzjmYpQ6XfZYgGk1k5Tyv6UhDeccLVyIDIGneWMxwg/8JRCDHiU3nVKTTX2x9JlepYfYA pn44I3n4hpd2M7d/Mozo5exhR/zqgs/OqS5dv2B5egGWjpFEm0cSNddo4KOjqs1VMhFN9IWci rJnQWp8uhzgSp7R2NGiD+cpQpiJDTzFkNYFo+mUeQdwyqECBf/UxeyIC6fgkRO8AbH1jCnRuq Bdk4xAS8wttqqA5ORCTI+u4uCS6TvUopNrl7ez2lDq2Ytoqn9wweQHdfiSMwxQaroKFRt2JO2 sz7QiNH9ux8S3D0ZAMAZXmZ7xZPAQNAqU4s4Spd0Du7vRE8GYvEvbtl0FQCX8LSuIZukuOnaC eAGqMMEkqmSN+sY8xwVupa0n2qbWj21AbUF4pNA9Bw1h4CY3Utti2W04Du/wCUTADSvQkO5Jz Eo+g0fwG0WoTSGpv4V5w== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org bsg_ioctl() calls into scsi_cmd_ioctl() for a couple of generic commands and relies on fs/compat_ioctl.c to handle it correctly in compat mode. Adding a private compat_ioctl() handler avoids that round-trip and lets us get rid of the generic emulation once this is done. Note that bsg implements an SG_IO command that is different from the other drivers and does not need emulation. Signed-off-by: Arnd Bergmann --- block/bsg.c | 1 + 1 file changed, 1 insertion(+) -- 2.20.0 diff --git a/block/bsg.c b/block/bsg.c index 833c44b3d458..d7bae94b64d9 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -382,6 +382,7 @@ static const struct file_operations bsg_fops = { .open = bsg_open, .release = bsg_release, .unlocked_ioctl = bsg_ioctl, + .compat_ioctl = compat_ptr_ioctl, .owner = THIS_MODULE, .llseek = default_llseek, }; From patchwork Tue Dec 17 22:16:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181937 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6381850ile; Tue, 17 Dec 2019 14:18:05 -0800 (PST) X-Google-Smtp-Source: APXvYqxaUEVBMfI2VGKomJWiOW6FpJHJYnfqwbBSbbhtWtC6SGjSZUdBA39yItvpvajCzVISBbWH X-Received: by 2002:a05:6830:2001:: with SMTP id e1mr38264130otp.97.1576621085662; Tue, 17 Dec 2019 14:18:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621085; cv=none; d=google.com; s=arc-20160816; b=vkto00ZCHHEOShjNDYDNfT9EBtYhvBwJX3CB0oin+eoeBuXtozVwJ4WQnPnhhd4UA3 xqJW+IIRiCAJWBLXUZfIFu3CK8JlOEmOKZyKXKAuNW2BgfcX7OYXcWYr3Vm6XYq/y3PF C25ykEPwNgy/zJHBKO709LDklF3ZfWjHqzGt8DPbr/RVBMDpzT0Qfp66Eg0hEseAF8EK tGunye6wVNnEbDtw4tDU98ROAnTR1RpDsNk57QSG1HN/2G8lfU4yDccNz/GMXoeOAdOz hdbbH3oTxlk2LkCZuSys4IaVn1go3isVJtfiXu0mEWeVJnnAa/Q41tGJseLCKM4K3BMz fcgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=vJ6DAIYEbJkv9DabE3g2Y3jbfkRa/IbLo6jaDEfinnI=; b=OennEfl+/4rURjNWn5wBxoijlFbqYhsMN8lgqhxEI1jKdEe5SPM1HxnXuhReSKBMUj P5bqIvAdJ3/4oAJThBqtP6gRakJj/buaueOZdG1f9B7pIqeCynx4u7AGhlQ/Cby6mobo 85U9DcXg25BA+Hkh/UiCfvxeSGQbfNQdn/UPpFaFESaa2rrYJzya5QD9wXXsCJ7H8UJ5 DSnd+AbNXjlfu6Iw+1CRLa1OTezv9b2Mu4GpztAht91baMcLa/I2exKVCCuyWKqvtDJs Ybxs4jFAKyQzMfEXjIrFTpz2nywEPekay/C/62eADzwLg4/g3rsYSNDqC5HWR+hM+ZE9 vlWQ== 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 o15si12515054otp.314.2019.12.17.14.18.05; Tue, 17 Dec 2019 14:18:05 -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 S1726879AbfLQWSD (ORCPT + 27 others); Tue, 17 Dec 2019 17:18:03 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:42985 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726704AbfLQWRw (ORCPT ); Tue, 17 Dec 2019 17:17:52 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MPGNn-1iJtNn3lVt-00PeZf; Tue, 17 Dec 2019 23:17:31 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 17/27] compat_ioctl: ide: floppy: add handler Date: Tue, 17 Dec 2019 23:16:58 +0100 Message-Id: <20191217221708.3730997-18-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:YnQrSz5O/D2DBGfbF3Cxsk8pwEEUjT589STUMJGh3yzpShzGnbO UtKl0ZGJsAHThUjdm9r51gvC9l545WINo2a5prkFBHzM+9RQY3Arloots1Xrir/7jn058ZY lY3dvFXWkGkgFTV1afb9NJTxv07jjMP3/LZ84ITxMj0bnoBEEePtmNtjq9iMjF1weBFG1TC CVXMzbb5iVF+fqWiS0O2w== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:O/6PR2RnMp8=:5roBt3plMVSEraB1jz2O5h p/M30legg9XR/Y/Kt/C/cwvJgImxkhqYbhnmDZ2jTM2ic2roOHdDCBbJwfOURYUFv0qGwYzWa B2qWZx8aF/jNGciRRonzsvtzrevrh8kgSm8SKRw4Z6HWilgQGzNa0JD2cygphpSkBHxjjTPe0 H6R4AoSx5K3lxdgReJ5SvYGUxJbJUFdmlDojMI8lu4Tix3nugJN5mv6/AeZWrgBiEL+NG06x2 SgnQ2R/DcJgY4NErD0D7vRfFy8nqvisRhkpns9431tOEz0o3rDBPRYcIgj+gshSq2sOxzJo2z h7k/r2KY1WXGuAc75gUQhqPjJKOm2k6nybp1HZs/+ZBZt7R26M699R/3vHkZACKON1XGl+aKr LvnRY6PJsnz4ob7wlAJmOaNdU2cazFj72pim9W9C/KJIazWpDqXAo4BNI11sjQQdRf2fRBuZI NJ/EqqAIZ9wL9g9N0iwnpBrRZy3dHYY4DFnVeu2s3VceoZerOn19nvm43OnFQhc1AkcPHlSmn 5Ba+6ALgh7JeJNL8swznKcGRFu9oSkIixiuTNlJBhb1sr7lI0YaFAkyb2Ut6mRPAOx2Sj2EjE pFuCkh94PX3JIrwC96rcvZOvq400csat6sR/PyNWbUIDzTIjhvN8JQKpi4J8/RmkC1IUh8Htt XXtazTi9tD12OGpO4CotDAU1RxMk7FJ88cSUhUsvMRFvCL4La2Qgh1BiXbZm/PKI53oQA+VqW 2QOEW2x5t7BuvU3oX6EOs0f++xF8S0/BtDzSGXrMNi5xQKnOR6mQVrtiTtrKsGPBvlVOxqZew XHitJ7G+1QtWOXxgkURun9rL+6BVtR84ilhBgmhg/13As5Oka/Y11NCk5RSLTqrNCesFbIn5D Ju2TSq0UrO3DiZI9eDkA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rather than relying on fs/compat_ioctl.c, this adds support for a compat_ioctl() callback in the ide-floppy driver directly, which lets it translate the scsi commands. Signed-off-by: Arnd Bergmann --- drivers/ide/ide-floppy.c | 4 ++++ drivers/ide/ide-floppy.h | 2 ++ drivers/ide/ide-floppy_ioctl.c | 36 ++++++++++++++++++++++++++++++++++ drivers/ide/ide-gd.c | 14 +++++++++++++ include/linux/ide.h | 2 ++ 5 files changed, 58 insertions(+) -- 2.20.0 diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 1ea2f9e82bf8..1fe1f9d37a51 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -546,4 +547,7 @@ const struct ide_disk_ops ide_atapi_disk_ops = { .set_doorlock = ide_set_media_lock, .do_request = ide_floppy_do_request, .ioctl = ide_floppy_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = ide_floppy_compat_ioctl, +#endif }; diff --git a/drivers/ide/ide-floppy.h b/drivers/ide/ide-floppy.h index 13c9b4b6d75e..8505a5f58f4e 100644 --- a/drivers/ide/ide-floppy.h +++ b/drivers/ide/ide-floppy.h @@ -26,6 +26,8 @@ void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *); /* ide-floppy_ioctl.c */ int ide_floppy_ioctl(ide_drive_t *, struct block_device *, fmode_t, unsigned int, unsigned long); +int ide_floppy_compat_ioctl(ide_drive_t *, struct block_device *, fmode_t, + unsigned int, unsigned long); #ifdef CONFIG_IDE_PROC_FS /* ide-floppy_proc.c */ diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c index 40a2ebe34e1d..4fd70f804d6f 100644 --- a/drivers/ide/ide-floppy_ioctl.c +++ b/drivers/ide/ide-floppy_ioctl.c @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -302,3 +303,38 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, mutex_unlock(&ide_floppy_ioctl_mutex); return err; } + +#ifdef CONFIG_COMPAT +int ide_floppy_compat_ioctl(ide_drive_t *drive, struct block_device *bdev, + fmode_t mode, unsigned int cmd, unsigned long arg) +{ + struct ide_atapi_pc pc; + void __user *argp = compat_ptr(arg); + int err; + + mutex_lock(&ide_floppy_ioctl_mutex); + if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) { + err = ide_floppy_lockdoor(drive, &pc, arg, cmd); + goto out; + } + + err = ide_floppy_format_ioctl(drive, &pc, mode, cmd, argp); + if (err != -ENOTTY) + goto out; + + /* + * skip SCSI_IOCTL_SEND_COMMAND (deprecated) + * and CDROM_SEND_PACKET (legacy) ioctls + */ + if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND) + err = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp); + + /* + * there is no generic_ide_compat_ioctl(), that is handled + * through compat_blkdev_ioctl(). + */ +out: + mutex_unlock(&ide_floppy_ioctl_mutex); + return err; +} +#endif diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index dba9ad5c97b3..1b0270efcce2 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c @@ -341,11 +341,25 @@ static int ide_gd_ioctl(struct block_device *bdev, fmode_t mode, return drive->disk_ops->ioctl(drive, bdev, mode, cmd, arg); } +#ifdef CONFIG_COMPAT +static int ide_gd_compat_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, unsigned long arg) +{ + struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj); + ide_drive_t *drive = idkp->drive; + + return drive->disk_ops->compat_ioctl(drive, bdev, mode, cmd, arg); +} +#endif + static const struct block_device_operations ide_gd_ops = { .owner = THIS_MODULE, .open = ide_gd_unlocked_open, .release = ide_gd_release, .ioctl = ide_gd_ioctl, +#ifdef CONFIG_COMPAT + .ioctl = ide_gd_compat_ioctl, +#endif .getgeo = ide_gd_getgeo, .check_events = ide_gd_check_events, .unlock_native_capacity = ide_gd_unlock_native_capacity, diff --git a/include/linux/ide.h b/include/linux/ide.h index 46b771d6999e..06dae6438557 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -413,6 +413,8 @@ struct ide_disk_ops { sector_t); int (*ioctl)(struct ide_drive_s *, struct block_device *, fmode_t, unsigned int, unsigned long); + int (*compat_ioctl)(struct ide_drive_s *, struct block_device *, + fmode_t, unsigned int, unsigned long); }; /* ATAPI device flags */ From patchwork Tue Dec 17 22:16:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181949 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6383693ile; Tue, 17 Dec 2019 14:19:35 -0800 (PST) X-Google-Smtp-Source: APXvYqxDsHHXGcLr2iSr7GPsJRBoObdzeYZT6yWaC2V06944zj5uhF4VYOMD2YdAmz6nhF4M2UVA X-Received: by 2002:aca:e146:: with SMTP id y67mr571914oig.93.1576621175279; Tue, 17 Dec 2019 14:19:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621175; cv=none; d=google.com; s=arc-20160816; b=np6B6bmrQGr/3UP3woj/Sb6c2437K35ZDIl9KYX4lnj/eUdoSSl0XY86jSJOw+qIAZ 9BAOVI00BaelQEqPT2TO0B+j+swl6T4BDOhSeYVDFeyZJs/NW3S1c2UFvpccLi29Klr+ xOu1xVlYsfOufwgHu7g2VD7ijMIFVU/8kkVbnqJO+hO6BB7tq5//1lICQf49/WlrUeoq 5Yky4OEnk8ymN4BU4j2iNKQZVCrlkTP7TkZO8+0NpjtQY/rQHhvwvd5wG1n9C5Un+Jft NdoYyEDf+eJk3SNIJI8OrBD2RqZNw1zy3XS/3DeSVDKbE445BVVpE5kO4CA4vw5NgK5u G5Rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=DOPvmxR8d2gED04jkg1bUr+iq2YLyBWFAcfLcIMFCuA=; b=zrWpzegJMe3fgTU1LD5+0kOf32vuYoURd1orfTrhJBPxDhE/VTggQBa7L5EEosc9gi YpwwR8nR/0Hj5y8xAYZVtJYDDzUPI2BjoWTumNUzsY9ieUfL11Tc7nGI8dd6N527B09I 0+kGZPc2oYtBPd+HBin+fF4MO72RwXP0bg/9nvb/bE2U6jKCVRhH++WRiCE7EadnEp7V sp98MLPx97FwluH1PPKkjTvhemYbqeVILIpk+cS6RNsYCVC9QHnD7702cQFn23q1AzH5 n2YNC2LL5OFIQWZWas/6uNhRs4mix4NrXQxsdbUv8qN/j/pJ24+ZZppYH8EZ6ze1MjyB DqAA== 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 y8si13108646oih.141.2019.12.17.14.19.35; Tue, 17 Dec 2019 14:19:35 -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 S1727278AbfLQWTe (ORCPT + 27 others); Tue, 17 Dec 2019 17:19:34 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:56131 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726881AbfLQWTc (ORCPT ); Tue, 17 Dec 2019 17:19:32 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MtfVx-1hpnQi1UI3-00v9dR; Tue, 17 Dec 2019 23:17:31 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 18/27] compat_ioctl: scsi: move ioctl handling into drivers Date: Tue, 17 Dec 2019 23:16:59 +0100 Message-Id: <20191217221708.3730997-19-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:ACk8mJ6p9pO9XGYZxSQ/tEfqG1zGT1plRpgFkrAt+woRyLkjjDA PdnPnDPYo2/l4TrNF2k2F6g8PbMHStTtQmYhlAA1Bmt1/EFR6jZErQzVWNNtCkbQX9rP/ok 5StFXRjLIf95PnKFPCHXYxPYcOGFSG1KzeQ15ngLplFmpAWRRUTUE/zh2KAihTsKfcsSTVd cL0rT4MiFYVebMALVOB9Q== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:lhFKuqtKylI=:SQj0yQNXIGTjik53OqgUlR RuOBGK3c8w3rpHczLJ082Q8h20U3jYaOqfJ267LzWjDbipCZd3bBH4yh3Tkl/j4b3Qawv7d/2 Q+zpOJsrNehuXMocjuKiqdw1eSGaT1BuacMqb3cFpOqPXFO8l0/xmdPURb0bJM/2xMkCczNQq Iu7Psp6yqcdWQfcvh/VLwGfDIZXU7KvtQGqidLS+AiXC7bphsAJu5F6scR5Ck1Nd1uRMbg/zR dNysKxr5oZWWfac/XnHRZoHSkbFFp1TgTnii6gL2SMFeHdu4FObUVq0Ys99ttc6PMFk/UyQ7i 1iOG23iBP2FVSLcXRGsYJnGWn09S1NXjMQyZ1z0Yjpux75BvkiOvbiKfbUjvM7TUbxp1RO2sA EB1QrMBre+LuIbiPC/lFYwtdvvGL8jwA0kLOkjBxZLWM74Hkht6SBXjBVxe1Sm4wSR6yq9rq6 XHn20+gULJFS+TZdH+93Bf30Mhpqb+xTB9QAJr7S8penGnONShWbBR9+uBzPcyyjcRKY45pTQ KOcHN+ASMJwYc1o6kO8uWcoZcudQ+pgf4bfZuFCuUi3X/Qp7hDlT0Lx3cnsAgbwKgLKohKMg8 P9m1TbMmjJVGIqvH9io4GK1HKEnzgbMgheDYWnYo/2CxfcKRya5w7DfU3SCTQHrkGSLU4/gqf Cg/K/4U3fb8O+UEhnqS4uZFBK7r6GtMEZ3k5Cs0Y5rS3k/I9zklO5WatwSnwK+nFd1oepPo/K GAVhNoLZ7e6bN4ggTS0eqIKIvLk+VwT1VBQ1o0mK818EK37uz1SPpFD3Z9R+mgg7ymIFusaNr +RSoQvZFBl1utv13gQ91OuVpRwGzmtinsPb+Qw9Nvlhf+XSN8wKgZeZhlrdY/y0u2ZMxJ5Td/ hT1VjlFkV1G7E13FztnQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Each driver calling scsi_ioctl() gets an equivalent compat_ioctl() handler that implements the same commands by calling scsi_compat_ioctl(). The scsi_cmd_ioctl() and scsi_cmd_blk_ioctl() functions are compatible at this point, so any driver that calls those can do so for both native and compat mode, with the argument passed through compat_ptr(). With this, we can remove the entries from fs/compat_ioctl.c. The new code is larger, but should be easier to maintain and keep updated with newly added commands. Signed-off-by: Arnd Bergmann --- drivers/block/virtio_blk.c | 3 + drivers/scsi/ch.c | 9 ++- drivers/scsi/sd.c | 50 ++++++-------- drivers/scsi/sg.c | 44 ++++++++----- drivers/scsi/sr.c | 57 ++++++++++++++-- drivers/scsi/st.c | 51 ++++++++------ fs/compat_ioctl.c | 132 +------------------------------------ 7 files changed, 142 insertions(+), 204 deletions(-) -- 2.20.0 diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 7ffd719d89de..fbbf18ac1d5d 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -405,6 +405,9 @@ static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) static const struct block_device_operations virtblk_fops = { .ioctl = virtblk_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = blkdev_compat_ptr_ioctl, +#endif .owner = THIS_MODULE, .getgeo = virtblk_getgeo, }; diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c index 76751d6c7f0d..ed5f4a6ae270 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -872,6 +872,10 @@ static long ch_ioctl_compat(struct file * file, unsigned int cmd, unsigned long arg) { scsi_changer *ch = file->private_data; + int retval = scsi_ioctl_block_when_processing_errors(ch->device, cmd, + file->f_flags & O_NDELAY); + if (retval) + return retval; switch (cmd) { case CHIOGPARAMS: @@ -883,7 +887,7 @@ static long ch_ioctl_compat(struct file * file, case CHIOINITELEM: case CHIOSVOLTAG: /* compatible */ - return ch_ioctl(file, cmd, arg); + return ch_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); case CHIOGSTATUS32: { struct changer_element_status32 ces32; @@ -898,8 +902,7 @@ static long ch_ioctl_compat(struct file * file, return ch_gstatus(ch, ces32.ces_type, data); } default: - // return scsi_ioctl_compat(ch->device, cmd, (void*)arg); - return -ENOIOCTLCMD; + return scsi_compat_ioctl(ch->device, cmd, compat_ptr(arg)); } } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index cea625906440..5afb0046b12a 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1465,13 +1465,12 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) * Note: most ioctls are forward onto the block subsystem or further * down in the scsi subsystem. **/ -static int sd_ioctl(struct block_device *bdev, fmode_t mode, - unsigned int cmd, unsigned long arg) +static int sd_ioctl_common(struct block_device *bdev, fmode_t mode, + unsigned int cmd, void __user *p) { struct gendisk *disk = bdev->bd_disk; struct scsi_disk *sdkp = scsi_disk(disk); struct scsi_device *sdp = sdkp->device; - void __user *p = (void __user *)arg; int error; SCSI_LOG_IOCTL(1, sd_printk(KERN_INFO, sdkp, "sd_ioctl: disk=%s, " @@ -1507,9 +1506,6 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, break; default: error = scsi_cmd_blk_ioctl(bdev, mode, cmd, p); - if (error != -ENOTTY) - break; - error = scsi_ioctl(sdp, cmd, p); break; } out: @@ -1691,39 +1687,31 @@ static void sd_rescan(struct device *dev) revalidate_disk(sdkp->disk); } +static int sd_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, unsigned long arg) +{ + void __user *p = (void __user *)arg; + int ret; + + ret = sd_ioctl_common(bdev, mode, cmd, p); + if (ret != -ENOTTY) + return ret; + + return scsi_ioctl(scsi_disk(bdev->bd_disk)->device, cmd, p); +} #ifdef CONFIG_COMPAT -/* - * This gets directly called from VFS. When the ioctl - * is not recognized we go back to the other translation paths. - */ static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { - struct gendisk *disk = bdev->bd_disk; - struct scsi_disk *sdkp = scsi_disk(disk); - struct scsi_device *sdev = sdkp->device; void __user *p = compat_ptr(arg); - int error; - - error = scsi_verify_blk_ioctl(bdev, cmd); - if (error < 0) - return error; + int ret; - error = scsi_ioctl_block_when_processing_errors(sdev, cmd, - (mode & FMODE_NDELAY) != 0); - if (error) - return error; + ret = sd_ioctl_common(bdev, mode, cmd, p); + if (ret != -ENOTTY) + return ret; - if (is_sed_ioctl(cmd)) - return sed_ioctl(sdkp->opal_dev, cmd, p); - - /* - * Let the static ioctl translation table take care of it. - */ - if (!sdev->host->hostt->compat_ioctl) - return -ENOIOCTLCMD; - return sdev->host->hostt->compat_ioctl(sdev, cmd, p); + return scsi_compat_ioctl(scsi_disk(bdev->bd_disk)->device, cmd, p); } #endif diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index eace8886d95a..bafeaf7b9ad8 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -911,19 +911,14 @@ static int put_compat_request_table(struct compat_sg_req_info __user *o, #endif static long -sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) +sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp, + unsigned int cmd_in, void __user *p) { - void __user *p = (void __user *)arg; int __user *ip = p; int result, val, read_only; - Sg_device *sdp; - Sg_fd *sfp; Sg_request *srp; unsigned long iflags; - if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) - return -ENXIO; - SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, "sg_ioctl: cmd=0x%x\n", (int) cmd_in)); read_only = (O_RDWR != (filp->f_flags & O_ACCMODE)); @@ -1146,29 +1141,44 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) cmd_in, filp->f_flags & O_NDELAY); if (result) return result; + + return -ENOIOCTLCMD; +} + +static long +sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) +{ + void __user *p = (void __user *)arg; + Sg_device *sdp; + Sg_fd *sfp; + int ret; + + if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) + return -ENXIO; + + ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p); + if (ret != -ENOIOCTLCMD) + return ret; + return scsi_ioctl(sdp->device, cmd_in, p); } #ifdef CONFIG_COMPAT static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) { + void __user *p = compat_ptr(arg); Sg_device *sdp; Sg_fd *sfp; - struct scsi_device *sdev; + int ret; if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) return -ENXIO; - sdev = sdp->device; - if (sdev->host->hostt->compat_ioctl) { - int ret; - - ret = sdev->host->hostt->compat_ioctl(sdev, cmd_in, (void __user *)arg); - + ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p); + if (ret != -ENOIOCTLCMD) return ret; - } - - return -ENOIOCTLCMD; + + return scsi_compat_ioctl(sdp->device, cmd_in, p); } #endif diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 4664fdf75c0f..6033a886c42c 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -598,6 +599,55 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, return ret; } +#ifdef CONFIG_COMPAT +static int sr_block_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, + unsigned long arg) +{ + struct scsi_cd *cd = scsi_cd(bdev->bd_disk); + struct scsi_device *sdev = cd->device; + void __user *argp = compat_ptr(arg); + int ret; + + mutex_lock(&sr_mutex); + + ret = scsi_ioctl_block_when_processing_errors(sdev, cmd, + (mode & FMODE_NDELAY) != 0); + if (ret) + goto out; + + scsi_autopm_get_device(sdev); + + /* + * Send SCSI addressing ioctls directly to mid level, send other + * ioctls to cdrom/block level. + */ + switch (cmd) { + case SCSI_IOCTL_GET_IDLUN: + case SCSI_IOCTL_GET_BUS_NUMBER: + ret = scsi_compat_ioctl(sdev, cmd, argp); + goto put; + } + + /* + * CDROM ioctls are handled in the block layer, but + * do the scsi blk ioctls here. + */ + ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp); + if (ret != -ENOTTY) + return ret; + + ret = scsi_compat_ioctl(sdev, cmd, argp); + +put: + scsi_autopm_put_device(sdev); + +out: + mutex_unlock(&sr_mutex); + return ret; + +} +#endif + static unsigned int sr_block_check_events(struct gendisk *disk, unsigned int clearing) { @@ -641,12 +691,11 @@ static const struct block_device_operations sr_bdops = .open = sr_block_open, .release = sr_block_release, .ioctl = sr_block_ioctl, +#ifdef CONFIG_COMPAT + .ioctl = sr_block_compat_ioctl, +#endif .check_events = sr_block_check_events, .revalidate_disk = sr_block_revalidate_disk, - /* - * No compat_ioctl for now because sr_block_ioctl never - * seems to pass arbitrary ioctls down to host drivers. - */ }; static int sr_open(struct cdrom_device_info *cdi, int purpose) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 9e3fff2de83e..393f3019ccac 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -3501,7 +3501,7 @@ static int partition_tape(struct scsi_tape *STp, int size) /* The ioctl command */ -static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) +static long st_ioctl_common(struct file *file, unsigned int cmd_in, void __user *p) { int i, cmd_nr, cmd_type, bt; int retval = 0; @@ -3509,7 +3509,6 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) struct scsi_tape *STp = file->private_data; struct st_modedef *STm; struct st_partstat *STps; - void __user *p = (void __user *)arg; if (mutex_lock_interruptible(&STp->lock)) return -ERESTARTSYS; @@ -3824,9 +3823,19 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) } mutex_unlock(&STp->lock); switch (cmd_in) { + case SCSI_IOCTL_STOP_UNIT: + /* unload */ + retval = scsi_ioctl(STp->device, cmd_in, p); + if (!retval) { + STp->rew_at_close = 0; + STp->ready = ST_NO_TAPE; + } + return retval; + case SCSI_IOCTL_GET_IDLUN: case SCSI_IOCTL_GET_BUS_NUMBER: break; + default: if ((cmd_in == SG_IO || cmd_in == SCSI_IOCTL_SEND_COMMAND || @@ -3840,42 +3849,46 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) return i; break; } - retval = scsi_ioctl(STp->device, cmd_in, p); - if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) { /* unload */ - STp->rew_at_close = 0; - STp->ready = ST_NO_TAPE; - } - return retval; + return -ENOTTY; out: mutex_unlock(&STp->lock); return retval; } +static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) +{ + void __user *p = (void __user *)arg; + struct scsi_tape *STp = file->private_data; + int ret; + + ret = st_ioctl_common(file, cmd_in, p); + if (ret != -ENOTTY) + return ret; + + return scsi_ioctl(STp->device, cmd_in, p); +} + #ifdef CONFIG_COMPAT static long st_compat_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) { void __user *p = compat_ptr(arg); struct scsi_tape *STp = file->private_data; - struct scsi_device *sdev = STp->device; - int ret = -ENOIOCTLCMD; + int ret; /* argument conversion is handled using put_user_mtpos/put_user_mtget */ switch (cmd_in) { - case MTIOCTOP: - return st_ioctl(file, MTIOCTOP, (unsigned long)p); case MTIOCPOS32: - return st_ioctl(file, MTIOCPOS, (unsigned long)p); + return st_ioctl_common(file, MTIOCPOS, p); case MTIOCGET32: - return st_ioctl(file, MTIOCGET, (unsigned long)p); + return st_ioctl_common(file, MTIOCGET, p); } - if (sdev->host->hostt->compat_ioctl) { + ret = st_ioctl_common(file, cmd_in, p); + if (ret != -ENOTTY) + return ret; - ret = sdev->host->hostt->compat_ioctl(sdev, cmd_in, (void __user *)arg); - - } - return ret; + return scsi_compat_ioctl(STp->device, cmd_in, p); } #endif diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 358ea2ecf36b..ab4471f469e6 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c @@ -36,109 +36,11 @@ #include "internal.h" -#ifdef CONFIG_BLOCK -#include -#include -#include -#include -#include -#endif - #include #include #include - -#include - -/* - * simple reversible transform to make our table more evenly - * distributed after sorting. - */ -#define XFORM(i) (((i) ^ ((i) << 27) ^ ((i) << 17)) & 0xffffffff) - -#define COMPATIBLE_IOCTL(cmd) XFORM((u32)cmd), -static unsigned int ioctl_pointer[] = { -#ifdef CONFIG_BLOCK -/* Big S */ -COMPATIBLE_IOCTL(SCSI_IOCTL_GET_IDLUN) -COMPATIBLE_IOCTL(SCSI_IOCTL_DOORLOCK) -COMPATIBLE_IOCTL(SCSI_IOCTL_DOORUNLOCK) -COMPATIBLE_IOCTL(SCSI_IOCTL_TEST_UNIT_READY) -COMPATIBLE_IOCTL(SCSI_IOCTL_GET_BUS_NUMBER) -COMPATIBLE_IOCTL(SCSI_IOCTL_SEND_COMMAND) -COMPATIBLE_IOCTL(SCSI_IOCTL_PROBE_HOST) -COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI) -#endif -#ifdef CONFIG_BLOCK -/* SG stuff */ -COMPATIBLE_IOCTL(SG_IO) -COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE) -COMPATIBLE_IOCTL(SG_SET_TIMEOUT) -COMPATIBLE_IOCTL(SG_GET_TIMEOUT) -COMPATIBLE_IOCTL(SG_EMULATED_HOST) -COMPATIBLE_IOCTL(SG_GET_TRANSFORM) -COMPATIBLE_IOCTL(SG_SET_RESERVED_SIZE) -COMPATIBLE_IOCTL(SG_GET_RESERVED_SIZE) -COMPATIBLE_IOCTL(SG_GET_SCSI_ID) -COMPATIBLE_IOCTL(SG_SET_FORCE_LOW_DMA) -COMPATIBLE_IOCTL(SG_GET_LOW_DMA) -COMPATIBLE_IOCTL(SG_SET_FORCE_PACK_ID) -COMPATIBLE_IOCTL(SG_GET_PACK_ID) -COMPATIBLE_IOCTL(SG_GET_NUM_WAITING) -COMPATIBLE_IOCTL(SG_SET_DEBUG) -COMPATIBLE_IOCTL(SG_GET_SG_TABLESIZE) -COMPATIBLE_IOCTL(SG_GET_COMMAND_Q) -COMPATIBLE_IOCTL(SG_SET_COMMAND_Q) -COMPATIBLE_IOCTL(SG_GET_VERSION_NUM) -COMPATIBLE_IOCTL(SG_NEXT_CMD_LEN) -COMPATIBLE_IOCTL(SG_SCSI_RESET) -COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE) -COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN) -COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN) -#endif -}; - -/* - * Convert common ioctl arguments based on their command number - * - * Please do not add any code in here. Instead, implement - * a compat_ioctl operation in the place that handleѕ the - * ioctl for the native case. - */ -static long do_ioctl_trans(unsigned int cmd, - unsigned long arg, struct file *file) -{ - return -ENOIOCTLCMD; -} - -static int compat_ioctl_check_table(unsigned int xcmd) -{ -#ifdef CONFIG_BLOCK - int i; - const int max = ARRAY_SIZE(ioctl_pointer) - 1; - - BUILD_BUG_ON(max >= (1 << 16)); - - /* guess initial offset into table, assuming a - normalized distribution */ - i = ((xcmd >> 16) * max) >> 16; - - /* do linear search up first, until greater or equal */ - while (ioctl_pointer[i] < xcmd && i < max) - i++; - - /* then do linear search down */ - while (ioctl_pointer[i] > xcmd && i > 0) - i--; - - return ioctl_pointer[i] == xcmd; -#else - return 0; -#endif -} - COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, compat_ulong_t, arg32) { @@ -216,19 +118,9 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, goto out_fput; } - if (!f.file->f_op->unlocked_ioctl) - goto do_ioctl; - break; - } - - if (compat_ioctl_check_table(XFORM(cmd))) - goto found_handler; - - error = do_ioctl_trans(cmd, arg, f.file); - if (error == -ENOIOCTLCMD) error = -ENOTTY; - - goto out_fput; + goto out_fput; + } found_handler: arg = (unsigned long)compat_ptr(arg); @@ -239,23 +131,3 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, out: return error; } - -static int __init init_sys32_ioctl_cmp(const void *p, const void *q) -{ - unsigned int a, b; - a = *(unsigned int *)p; - b = *(unsigned int *)q; - if (a > b) - return 1; - if (a < b) - return -1; - return 0; -} - -static int __init init_sys32_ioctl(void) -{ - sort(ioctl_pointer, ARRAY_SIZE(ioctl_pointer), sizeof(*ioctl_pointer), - init_sys32_ioctl_cmp, NULL); - return 0; -} -__initcall(init_sys32_ioctl); From patchwork Tue Dec 17 22:17:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181943 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6382783ile; Tue, 17 Dec 2019 14:18:51 -0800 (PST) X-Google-Smtp-Source: APXvYqyygOOFH9uJoOCvqyGqN/gJasQLEwdW5atI/tqaqJ8hvdPOvCkqdhRF34CANt1HvB2nXzKk X-Received: by 2002:a9d:4f0f:: with SMTP id d15mr41439004otl.179.1576621131264; Tue, 17 Dec 2019 14:18:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621131; cv=none; d=google.com; s=arc-20160816; b=d637foqmpX0bh2QlWxpqpY/oWCpR0HfpzYXgfYYigQcLtFPNZzcDLp4KxvOvHIJW/x UtpG/FP6kNtqdkDnhlR2v1pd1c67QMiJUinjsnG2JAB6EvjDP++fhMUGpdLdaJFKDMni XYfOATZDc1sBPKM/6DPUC6/EJVHTP7d/Ft/8MhAakNEp7Y8McLsP0p6D6x3M2K3cJpGH wEiepkDsZ8MvyFUcJcXoUTBQTDbNhryj8nX8yUI8EolRBNOPYW471c1DonsqWi4kF7WC 3gpf2GyIQlxJEOdJq2TDhK3MUD+fSE4t8YBqhQakYuykQemOjpru3mkSN36JzPc1KFSb V09A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=MI3gyflPxmaoHDHBEuYF8mxiI/ZyyNhPvRPfin4Zbtk=; b=hk179JkzK4Ixse5O/qWuyb6tN7crrPDYMKApDwdDjO17vwZSOD9bz7u0QLEH4ESkHb IGrTINjljBn7KP+9r4E/B4pl6UVeKuPH5mN1+JlRi9x5N6uKpizNmJDJ6aYOxBtu/co9 t1lMW26nqjJnhtrdNiHUa0YEx9h1J2YHRIF8eJb5muJx9fK3megrRNyigYdq6uJKe2Ax H0hdhZ/l/kssxRK59duoVMaRqrz72WAsuNPeJ5u/9kp7VrOS1GNfUhxPVhuIIAewPCRL PMOUd3meI2DsWitVdGa+8sFuBKDjwGyc30/Y+udUg1ivjPRHo2Il7dimV1bs4bLkDaBc 5QAA== 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 z11si13582679oic.119.2019.12.17.14.18.51; Tue, 17 Dec 2019 14:18:51 -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 S1726454AbfLQWSt (ORCPT + 27 others); Tue, 17 Dec 2019 17:18:49 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:57707 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726656AbfLQWRo (ORCPT ); Tue, 17 Dec 2019 17:17:44 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MZl1l-1iDrlU3PPT-00WpIf; Tue, 17 Dec 2019 23:17:31 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 19/27] compat_ioctl: move sys_compat_ioctl() to ioctl.c Date: Tue, 17 Dec 2019 23:17:00 +0100 Message-Id: <20191217221708.3730997-20-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:uitpeVFCvHeOqyYvOf9VceF0TkY7WDr+aoxiayii8Nsle7oX7c4 tRK0a94PCUH6uhLlvKz+JTH2P5Hn4tAZo7O8EVVZifhaA1VGs0ay1Ld7k3PT6fbHr21oFY3 XfDJX0zycHaRJPsvt1s+0y9gkgyzTrVrCG/aFgHi2jXROje4THWKk8Don6y+d7EWfgZmw+k 4HLFri5/9xxQsbf0VHy4g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:sVRCpX+XGZA=:ZBzw1UJJqSCs3zp91ameci KXBlh9Xa40oyraHgp1AAkgibcSSuAMYnnxdPm59s3JCuj3hQicsBkGRdsYttbK4dpo3xkmhW1 y6wHfgiZVkGHXtPmuWR81JZHd2fXlRbVkVBmX8pSdEEEj5KsOW4mFk0G0yl4Kd7ILhhhniH8C UTQaJl3PdMxI77+Rb3MwaGcTTtuuoTubL18bpBSKIUKj7jtr40dt35GtOpOHuZsm2RQz5AIxi mQInCCSWJIErLmQc3NlhGLp1lyIDMcqLVRUA446pERNbNcp81qvFJjGQ+y/PUpG3zKLsAm26f iKpOiP7sFI4irglSea7jCZzcC1X60oiu5c3IuIAi3N6FcrpHwakYrt8YXVMyV1aW+Zbjw7Tce ounnfsyexFV4e2glN8SsS78BYQRS7IGM78S68cEkPnZJ3C3q9TEahk9DEDYYcf1S7dhR598s+ AoENyPuZROXbicx4qWfLwMdawxzEDJaLYkeusfQEyDJxy99Qz8O8eHBlEWc7Ohji+l9xec88c GaioANanR4VIcTK4vfzhlgRkundMpFpXEN9hyrHPf2PbSCeyhn+34GR/qfnIr1LAqLaOz9nvG 9gRjPimEYwiV+q9DAp68c8njXwRXtR9C7P2b+pJJBNvZ1NxQWOvt4PZqeUEbWDYb2t+K4Pn7N MvPWC2bxrM6OQmCfVkaN22zqQowq1p3T8mtHyTUL+TvX728JEhy6LoTqrpDwrSoqZZ8vaKibu 8c7G/HAnzIsgYRm6qh+aA5rDPmWeDyhSJP8iXJZHKot5g6tkvRwli/79wGGfJ32+PdFJwzxal rVxt1jWN/T2Wa8lAF4xW8xSoNFDs7fdOPINGuBcHz0bJrG4PM8A3RtIbNFDoYnqDw2pxToSVy roQ65vYHMw3pGLUc6BZQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The rest of the fs/compat_ioctl.c file is no longer useful now, so move the actual syscall as planned. Signed-off-by: Arnd Bergmann --- fs/Makefile | 2 +- fs/compat_ioctl.c | 133 ---------------------------------------------- fs/ioctl.c | 90 +++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 134 deletions(-) delete mode 100644 fs/compat_ioctl.c -- 2.20.0 diff --git a/fs/Makefile b/fs/Makefile index 1148c555c4d3..98be354fdb61 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_FS_DAX) += dax.o obj-$(CONFIG_FS_ENCRYPTION) += crypto/ obj-$(CONFIG_FS_VERITY) += verity/ obj-$(CONFIG_FILE_LOCKING) += locks.o -obj-$(CONFIG_COMPAT) += compat.o compat_ioctl.o +obj-$(CONFIG_COMPAT) += compat.o obj-$(CONFIG_BINFMT_AOUT) += binfmt_aout.o obj-$(CONFIG_BINFMT_EM86) += binfmt_em86.o obj-$(CONFIG_BINFMT_MISC) += binfmt_misc.o diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c deleted file mode 100644 index ab4471f469e6..000000000000 --- a/fs/compat_ioctl.c +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * ioctl32.c: Conversion between 32bit and 64bit native ioctls. - * - * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com) - * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) - * Copyright (C) 2001,2002 Andi Kleen, SuSE Labs - * Copyright (C) 2003 Pavel Machek (pavel@ucw.cz) - * - * These routines maintain argument size conversion between 32bit and 64bit - * ioctls. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" - -#include -#include - -#include - -COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, - compat_ulong_t, arg32) -{ - unsigned long arg = arg32; - struct fd f = fdget(fd); - int error = -EBADF; - if (!f.file) - goto out; - - /* RED-PEN how should LSM module know it's handling 32bit? */ - error = security_file_ioctl(f.file, cmd, arg); - if (error) - goto out_fput; - - switch (cmd) { - /* these are never seen by ->ioctl(), no argument or int argument */ - case FIOCLEX: - case FIONCLEX: - case FIFREEZE: - case FITHAW: - case FICLONE: - goto do_ioctl; - /* these are never seen by ->ioctl(), pointer argument */ - case FIONBIO: - case FIOASYNC: - case FIOQSIZE: - case FS_IOC_FIEMAP: - case FIGETBSZ: - case FICLONERANGE: - case FIDEDUPERANGE: - goto found_handler; - /* - * The next group is the stuff handled inside file_ioctl(). - * For regular files these never reach ->ioctl(); for - * devices, sockets, etc. they do and one (FIONREAD) is - * even accepted in some cases. In all those cases - * argument has the same type, so we can handle these - * here, shunting them towards do_vfs_ioctl(). - * ->compat_ioctl() will never see any of those. - */ - /* pointer argument, never actually handled by ->ioctl() */ - case FIBMAP: - goto found_handler; - /* handled by some ->ioctl(); always a pointer to int */ - case FIONREAD: - goto found_handler; - /* these get messy on amd64 due to alignment differences */ -#if defined(CONFIG_X86_64) - case FS_IOC_RESVSP_32: - case FS_IOC_RESVSP64_32: - error = compat_ioctl_preallocate(f.file, 0, compat_ptr(arg)); - goto out_fput; - case FS_IOC_UNRESVSP_32: - case FS_IOC_UNRESVSP64_32: - error = compat_ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE, - compat_ptr(arg)); - goto out_fput; - case FS_IOC_ZERO_RANGE_32: - error = compat_ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE, - compat_ptr(arg)); - goto out_fput; -#else - case FS_IOC_RESVSP: - case FS_IOC_RESVSP64: - case FS_IOC_UNRESVSP: - case FS_IOC_UNRESVSP64: - case FS_IOC_ZERO_RANGE: - goto found_handler; -#endif - - default: - if (f.file->f_op->compat_ioctl) { - error = f.file->f_op->compat_ioctl(f.file, cmd, arg); - if (error != -ENOIOCTLCMD) - goto out_fput; - } - - error = -ENOTTY; - goto out_fput; - } - - found_handler: - arg = (unsigned long)compat_ptr(arg); - do_ioctl: - error = do_vfs_ioctl(f.file, fd, cmd, arg); - out_fput: - fdput(f); - out: - return error; -} diff --git a/fs/ioctl.c b/fs/ioctl.c index 2f5e4e5b97e1..8f22f7817edb 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -788,4 +788,94 @@ long compat_ptr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return file->f_op->unlocked_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); } EXPORT_SYMBOL(compat_ptr_ioctl); + +COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, + compat_ulong_t, arg32) +{ + unsigned long arg = arg32; + struct fd f = fdget(fd); + int error = -EBADF; + if (!f.file) + goto out; + + /* RED-PEN how should LSM module know it's handling 32bit? */ + error = security_file_ioctl(f.file, cmd, arg); + if (error) + goto out_fput; + + switch (cmd) { + /* these are never seen by ->ioctl(), no argument or int argument */ + case FIOCLEX: + case FIONCLEX: + case FIFREEZE: + case FITHAW: + case FICLONE: + goto do_ioctl; + /* these are never seen by ->ioctl(), pointer argument */ + case FIONBIO: + case FIOASYNC: + case FIOQSIZE: + case FS_IOC_FIEMAP: + case FIGETBSZ: + case FICLONERANGE: + case FIDEDUPERANGE: + goto found_handler; + /* + * The next group is the stuff handled inside file_ioctl(). + * For regular files these never reach ->ioctl(); for + * devices, sockets, etc. they do and one (FIONREAD) is + * even accepted in some cases. In all those cases + * argument has the same type, so we can handle these + * here, shunting them towards do_vfs_ioctl(). + * ->compat_ioctl() will never see any of those. + */ + /* pointer argument, never actually handled by ->ioctl() */ + case FIBMAP: + goto found_handler; + /* handled by some ->ioctl(); always a pointer to int */ + case FIONREAD: + goto found_handler; + /* these get messy on amd64 due to alignment differences */ +#if defined(CONFIG_X86_64) + case FS_IOC_RESVSP_32: + case FS_IOC_RESVSP64_32: + error = compat_ioctl_preallocate(f.file, 0, compat_ptr(arg)); + goto out_fput; + case FS_IOC_UNRESVSP_32: + case FS_IOC_UNRESVSP64_32: + error = compat_ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE, + compat_ptr(arg)); + goto out_fput; + case FS_IOC_ZERO_RANGE_32: + error = compat_ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE, + compat_ptr(arg)); + goto out_fput; +#else + case FS_IOC_RESVSP: + case FS_IOC_RESVSP64: + case FS_IOC_UNRESVSP: + case FS_IOC_UNRESVSP64: + case FS_IOC_ZERO_RANGE: + goto found_handler; +#endif + + default: + if (f.file->f_op->compat_ioctl) { + error = f.file->f_op->compat_ioctl(f.file, cmd, arg); + if (error != -ENOIOCTLCMD) + goto out_fput; + } + error = -ENOTTY; + goto out_fput; + } + + found_handler: + arg = (unsigned long)compat_ptr(arg); + do_ioctl: + error = do_vfs_ioctl(f.file, fd, cmd, arg); + out_fput: + fdput(f); + out: + return error; +} #endif From patchwork Tue Dec 17 22:17:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181940 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6382401ile; Tue, 17 Dec 2019 14:18:32 -0800 (PST) X-Google-Smtp-Source: APXvYqw33CNkl4FrlbU47b8ydX3C3J4u4W//mGklxQPIrVky4YiNsp9lm61voR0jzF8bHYbASH4U X-Received: by 2002:a05:6830:451:: with SMTP id d17mr8575268otc.53.1576621112019; Tue, 17 Dec 2019 14:18:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621112; cv=none; d=google.com; s=arc-20160816; b=O3TSI0ptQk1XJWJ3LJYRu9IlpopLh1q9Wjnq/zwLermayU/eI946KW/8hBcS3TA4XG SWn2XhujIuhGiJr8e8HQy+1V6VzimJoS4YjGahvl6XbVhuVibXjkFs4mCiaX0CiI6VwV r3r9lZZYtv9aILdbTw3ErPx/OD8neWrxla2Rs/MIQ0P1aSWJQA8Ptztvd6rVvTS8aB/Q upuW3c9Pq189yr/wOaRpynPKpVoOsxKQFILub7PHHBb7P3ewTCtblEd8c4eWnPM5SWJ3 Yu8x2ccUbFVTxTuAN3NEFSp+e3j0HTSDBXwLZFomRaqyZm42NfYLpuiuWOROwZTkHP2H tV0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=hw1y70F66VZZ+OgbcT+EfkGDrm7zpzPTpXzlCdUtNGE=; b=LJZYVUSxjx7dWno9LAwCL12OmSvdFO+K2sG8UjC7NKbeJOBj+Qh3fRu6yVFcUrOnkV Dx7CMp4TmXM9P8LXjZZ62hDl9EudqsH1UuyjDr4UxJjyoipMU3sJ1B/J/uah0tyIb92E RvVmV/ytWiidtN+FFzJ7yrx8sfiBOio2W8iDoC/hGnle3tWP0n1rpauXn0DPgBZIJnlq jO2EX34JmHm8bF/pYJ8UPwJ1J4L5/9IhHiRY4/0R71FJoHVTVNX7Q0Vi8aKfOvE18EWb D0YdD4Ky/ufXcARZSWqRg5VtvcPjxVHmIwWHPslLE6OT6V7VXjDhUlq39DaUkNamaOwJ KvjA== 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 d6si12933424oic.86.2019.12.17.14.18.31; Tue, 17 Dec 2019 14:18:32 -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 S1727050AbfLQWSa (ORCPT + 27 others); Tue, 17 Dec 2019 17:18:30 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:55579 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726801AbfLQWR5 (ORCPT ); Tue, 17 Dec 2019 17:17:57 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MRCBm-1iMMMC1ATk-00NAX4; Tue, 17 Dec 2019 23:17:32 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 20/27] compat_ioctl: simplify the implementation Date: Tue, 17 Dec 2019 23:17:01 +0100 Message-Id: <20191217221708.3730997-21-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:uK/YvNPT87O8gnoGWXh+F6Kwe06h+iVKNBQ7Vn492sB4NIm5fiO u8phscXPcsvZTLm/r6hUxiXDYINp6z+whQ1Kudg6IF96I27vCuUYSzL5m5paSXGTuUhVM67 783MX/6yKk1S7cJuTYhsnTyaN2T3Gikmuj1K9bzg4mqhdupgj1VF45J8exygF1mRvh7Khau s2UeQsmlK13ufWeKFxOLA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:enayNnzw2bY=:vxJr0zRZN5ttbUOCvy6+qe fo2wmFEaqJxAjt+Uqf3aCl9PpBwrGBXg7NF1bjjsxL3elMwpKU8EXa+6q8gLmkR2OCuv2s1aP 0sJFtYHrnUiGOfWpErlI+70B/6NM9rdPn+aKlGOD9Ob4gIIjIJ0bUVWcta5nut4HWg8QkiGyJ pV5CS1m3ZQMHpiMlNKmuA9Xd/uPT3oICXmtFEJBs7EcAzayCFhZdoXLajzLG+JPBAoYiE0BrA CQjBJ604Z98+aNfysExq3uUQKUu3ALpOzPB4GNTO1FCf3+ZMyGhARyXsjwdkYJr5QY0sPiKPu /3w2ZWx0bI3n30YePES8AesJ2Sk9FQYyMZIyUnI32CxNwJuVnp/ivJB7lTwSPp+7Nxw4ItMWH KGoO4wVkjmOZQAWhNpmcqLTCRKqLi2efjJWM9Lzcj9yPq+rNT31461M/KU/xyXznWJHKC0gs+ lUUH7Xt8xYJVfECf2MU4mwnnGbGDic0LxVXfPFGxtU/OmvxIrHDpqChzmz1Dp3T/FedGvuWda Jv1jAcAdivxNqSvjoqdK7sdvnBivzWvF3axmubM4LbSfAnh/D+bBFI/M4YYdXecwnN4IOCg3g 4dMa6xcR24YDKz4Rx0/qOftVjLb65DIPx79dpf86XSx6fWoOTmrJSE7b+g/2H2MrgVM+5fCj/ vG3V5ALBDGmkFfVrX4z3jRqcRFU/jiE2PytJMv3xVzoSvfiMPBI9mRnHFUTPETM8kk6fkpWJN 7ht0v41VoSm08w9B6Yhlbr0Ngh27Vls0LFT/uzzklooVGg/lnHKwXM6Ik76tiZybo2AdJ1M8H qIkrTFBpyQOjItD1QsZ2/DjmHkmDnSCuVfr7f7seSKSY0+J86+8ugV2f48ieJ00lZxntTu/Tu pQoNPCjuXQatKrHZfnEQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now that both native and compat ioctl syscalls are in the same file, a couple of simplifications can be made, bringing the implementation closer together: - do_vfs_ioctl(), ioctl_preallocate(), and compat_ioctl_preallocate() can become static, allowing the compiler to optimize better - slightly update the coding style for consistency between the functions. - rather than listing each command in two switch statements for the compat case, just call a single function that has all the common commands. As a side-effect, FS_IOC_RESVSP/FS_IOC_RESVSP64 are now available to x86 compat tasks, along with FS_IOC_RESVSP_32/FS_IOC_RESVSP64_32. This is harmless for i386 emulation, and can be considered a bugfix for x32 emulation, which never supported these in the past. Signed-off-by: Arnd Bergmann --- fs/internal.h | 6 -- fs/ioctl.c | 157 +++++++++++++++++------------------------ include/linux/falloc.h | 2 - include/linux/fs.h | 4 -- 4 files changed, 64 insertions(+), 105 deletions(-) -- 2.20.0 diff --git a/fs/internal.h b/fs/internal.h index 4a7da1df573d..d46247850ad7 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -180,11 +180,5 @@ extern void mnt_pin_kill(struct mount *m); */ extern const struct dentry_operations ns_dentry_operations; -/* - * fs/ioctl.c - */ -extern int do_vfs_ioctl(struct file *file, unsigned int fd, unsigned int cmd, - unsigned long arg); - /* direct-io.c: */ int sb_init_dio_done_wq(struct super_block *sb); diff --git a/fs/ioctl.c b/fs/ioctl.c index 8f22f7817edb..7c9a5df5a597 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -467,7 +467,7 @@ EXPORT_SYMBOL(generic_block_fiemap); * Only the l_start, l_len and l_whence fields of the 'struct space_resv' * are used here, rest are ignored. */ -int ioctl_preallocate(struct file *filp, int mode, void __user *argp) +static int ioctl_preallocate(struct file *filp, int mode, void __user *argp) { struct inode *inode = file_inode(filp); struct space_resv sr; @@ -495,8 +495,8 @@ int ioctl_preallocate(struct file *filp, int mode, void __user *argp) /* on ia32 l_start is on a 32-bit boundary */ #if defined CONFIG_COMPAT && defined(CONFIG_X86_64) /* just account for different alignment */ -int compat_ioctl_preallocate(struct file *file, int mode, - struct space_resv_32 __user *argp) +static int compat_ioctl_preallocate(struct file *file, int mode, + struct space_resv_32 __user *argp) { struct inode *inode = file_inode(file); struct space_resv_32 sr; @@ -521,11 +521,9 @@ int compat_ioctl_preallocate(struct file *file, int mode, } #endif -static int file_ioctl(struct file *filp, unsigned int cmd, - unsigned long arg) +static int file_ioctl(struct file *filp, unsigned int cmd, int __user *p) { struct inode *inode = file_inode(filp); - int __user *p = (int __user *)arg; switch (cmd) { case FIBMAP: @@ -542,7 +540,7 @@ static int file_ioctl(struct file *filp, unsigned int cmd, return ioctl_preallocate(filp, FALLOC_FL_ZERO_RANGE, p); } - return vfs_ioctl(filp, cmd, arg); + return -ENOIOCTLCMD; } static int ioctl_fionbio(struct file *filp, int __user *argp) @@ -661,53 +659,48 @@ static int ioctl_file_dedupe_range(struct file *file, } /* - * When you add any new common ioctls to the switches above and below - * please update compat_sys_ioctl() too. - * * do_vfs_ioctl() is not for drivers and not intended to be EXPORT_SYMBOL()'d. * It's just a simple helper for sys_ioctl and compat_sys_ioctl. + * + * When you add any new common ioctls to the switches above and below, + * please ensure they have compatible arguments in compat mode. */ -int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, - unsigned long arg) +static int do_vfs_ioctl(struct file *filp, unsigned int fd, + unsigned int cmd, unsigned long arg) { - int error = 0; void __user *argp = (void __user *)arg; struct inode *inode = file_inode(filp); switch (cmd) { case FIOCLEX: set_close_on_exec(fd, 1); - break; + return 0; case FIONCLEX: set_close_on_exec(fd, 0); - break; + return 0; case FIONBIO: - error = ioctl_fionbio(filp, argp); - break; + return ioctl_fionbio(filp, argp); case FIOASYNC: - error = ioctl_fioasync(fd, filp, argp); - break; + return ioctl_fioasync(fd, filp, argp); case FIOQSIZE: if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) { loff_t res = inode_get_bytes(inode); - error = copy_to_user(argp, &res, sizeof(res)) ? - -EFAULT : 0; - } else - error = -ENOTTY; - break; + return copy_to_user(argp, &res, sizeof(res)) ? + -EFAULT : 0; + } + + return -ENOTTY; case FIFREEZE: - error = ioctl_fsfreeze(filp); - break; + return ioctl_fsfreeze(filp); case FITHAW: - error = ioctl_fsthaw(filp); - break; + return ioctl_fsthaw(filp); case FS_IOC_FIEMAP: return ioctl_fiemap(filp, argp); @@ -716,6 +709,7 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, /* anon_bdev filesystems may not have a block size */ if (!inode->i_sb->s_blocksize) return -EINVAL; + return put_user(inode->i_sb->s_blocksize, (int __user *)argp); case FICLONE: @@ -729,24 +723,30 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, default: if (S_ISREG(inode->i_mode)) - error = file_ioctl(filp, cmd, arg); - else - error = vfs_ioctl(filp, cmd, arg); + return file_ioctl(filp, cmd, argp); break; } - return error; + + return -ENOIOCTLCMD; } int ksys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) { - int error; struct fd f = fdget(fd); + int error; if (!f.file) return -EBADF; + error = security_file_ioctl(f.file, cmd, arg); - if (!error) - error = do_vfs_ioctl(f.file, fd, cmd, arg); + if (error) + goto out; + + error = do_vfs_ioctl(f.file, fd, cmd, arg); + if (error == -ENOIOCTLCMD) + error = vfs_ioctl(f.file, cmd, arg); + +out: fdput(f); return error; } @@ -790,92 +790,63 @@ long compat_ptr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) EXPORT_SYMBOL(compat_ptr_ioctl); COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, - compat_ulong_t, arg32) + compat_ulong_t, arg) { - unsigned long arg = arg32; struct fd f = fdget(fd); - int error = -EBADF; + int error; + if (!f.file) - goto out; + return -EBADF; /* RED-PEN how should LSM module know it's handling 32bit? */ error = security_file_ioctl(f.file, cmd, arg); if (error) - goto out_fput; + goto out; switch (cmd) { - /* these are never seen by ->ioctl(), no argument or int argument */ - case FIOCLEX: - case FIONCLEX: - case FIFREEZE: - case FITHAW: + /* FICLONE takes an int argument, so don't use compat_ptr() */ case FICLONE: - goto do_ioctl; - /* these are never seen by ->ioctl(), pointer argument */ - case FIONBIO: - case FIOASYNC: - case FIOQSIZE: - case FS_IOC_FIEMAP: - case FIGETBSZ: - case FICLONERANGE: - case FIDEDUPERANGE: - goto found_handler; - /* - * The next group is the stuff handled inside file_ioctl(). - * For regular files these never reach ->ioctl(); for - * devices, sockets, etc. they do and one (FIONREAD) is - * even accepted in some cases. In all those cases - * argument has the same type, so we can handle these - * here, shunting them towards do_vfs_ioctl(). - * ->compat_ioctl() will never see any of those. - */ - /* pointer argument, never actually handled by ->ioctl() */ - case FIBMAP: - goto found_handler; - /* handled by some ->ioctl(); always a pointer to int */ - case FIONREAD: - goto found_handler; - /* these get messy on amd64 due to alignment differences */ + error = ioctl_file_clone(f.file, arg, 0, 0, 0); + break; + #if defined(CONFIG_X86_64) + /* these get messy on amd64 due to alignment differences */ case FS_IOC_RESVSP_32: case FS_IOC_RESVSP64_32: error = compat_ioctl_preallocate(f.file, 0, compat_ptr(arg)); - goto out_fput; + break; case FS_IOC_UNRESVSP_32: case FS_IOC_UNRESVSP64_32: error = compat_ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE, compat_ptr(arg)); - goto out_fput; + break; case FS_IOC_ZERO_RANGE_32: error = compat_ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE, compat_ptr(arg)); - goto out_fput; -#else - case FS_IOC_RESVSP: - case FS_IOC_RESVSP64: - case FS_IOC_UNRESVSP: - case FS_IOC_UNRESVSP64: - case FS_IOC_ZERO_RANGE: - goto found_handler; + break; #endif + /* + * everything else in do_vfs_ioctl() takes either a compatible + * pointer argument or no argument -- call it with a modified + * argument. + */ default: - if (f.file->f_op->compat_ioctl) { + error = do_vfs_ioctl(f.file, fd, cmd, + (unsigned long)compat_ptr(arg)); + if (error != -ENOIOCTLCMD) + break; + + if (f.file->f_op->compat_ioctl) error = f.file->f_op->compat_ioctl(f.file, cmd, arg); - if (error != -ENOIOCTLCMD) - goto out_fput; - } - error = -ENOTTY; - goto out_fput; + if (error == -ENOIOCTLCMD) + error = -ENOTTY; + break; } - found_handler: - arg = (unsigned long)compat_ptr(arg); - do_ioctl: - error = do_vfs_ioctl(f.file, fd, cmd, arg); - out_fput: - fdput(f); out: + fdput(f); + return error; } #endif diff --git a/include/linux/falloc.h b/include/linux/falloc.h index 8bf3d79f3e82..f3f0b97b1675 100644 --- a/include/linux/falloc.h +++ b/include/linux/falloc.h @@ -51,8 +51,6 @@ struct space_resv_32 { #define FS_IOC_UNRESVSP64_32 _IOW ('X', 43, struct space_resv_32) #define FS_IOC_ZERO_RANGE_32 _IOW ('X', 57, struct space_resv_32) -int compat_ioctl_preallocate(struct file *, int, struct space_resv_32 __user *); - #endif #endif /* _FALLOC_H_ */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 98e0349adb52..daf570bca42a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2552,10 +2552,6 @@ extern int finish_open(struct file *file, struct dentry *dentry, int (*open)(struct inode *, struct file *)); extern int finish_no_open(struct file *file, struct dentry *dentry); -/* fs/ioctl.c */ - -extern int ioctl_preallocate(struct file *filp, int mode, void __user *argp); - /* fs/dcache.c */ extern void __init vfs_caches_init_early(void); extern void __init vfs_caches_init(void); From patchwork Tue Dec 17 22:17:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181947 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6383391ile; Tue, 17 Dec 2019 14:19:21 -0800 (PST) X-Google-Smtp-Source: APXvYqzsgEZhKX98zuA1iTwTba0xolJqkdGRq2OgD5na6Rt0y3foPn1NG0G5JEFJwFONioJzsjLo X-Received: by 2002:a05:6830:145:: with SMTP id j5mr38689726otp.242.1576621161639; Tue, 17 Dec 2019 14:19:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621161; cv=none; d=google.com; s=arc-20160816; b=NCHpKsAn2TjPX7/RLoziJuhE17P8M99MZ8di6stVtxAqR/W/o4IrxlD+cJbCO0vmqI 3Chgh4QoQ0M4nxtByg6Cp2pioxCnnjrM6Ihh62mo1uVSfk7qVetgkzrD+ZEaOjix5oW3 DEWGQxBL3EgCgD2D5dnoGcLThqLfHyoaA28x7tnssq0WrqTIiOt+yiHE/KvmF4Ao/vrw iAlBPfYWu6cCgv6oohQ57ajgS/PkqsmZP22dWO+4NrQTTtL+RcMZ4qoGLYEbx4N+ItuW fu+VjHsfy6Aj6pNR/edKL3B/M1DuKq0vT7IIufHBB6VEjz8BrSagFMr9Awx1IrpmfJOF nk/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=KNYX6SmnxcHU+EB4bOKJKMFcpH26A767qXp5FzAXjow=; b=aprBS7npqD+7nHiUM2umM7bE+IKgNavcOr8KDxZ7gXzmQf+MPSpa9xep2iA7UBFa+8 K8kOfJZgKhMmCFFG1ZHr/fMqKno9ANq0BB/cFyN+dBz+/a6SS3VZ09R9LpIdyda2ZTTI sFS83wByXq5f07ouA7iyynDChhSN9woqgnLQPSYiQnnsbyg1Lp5Z2hcxdfW/Ite1EKEF mAV5DoD0x1ANve6hDbocneeNUQcdInH/RnU0UK2N+rZRYFvQfcgVJhUWcbJi3JyeAKza riBKADH5NBzAcqu9txI37uy1kgsvON9BBIUmM/XXPEKqIaiYzr+ZXjyduHCmKM4Ljoob I28A== 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 y22si11845750oti.269.2019.12.17.14.19.21; Tue, 17 Dec 2019 14:19:21 -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 S1727201AbfLQWTU (ORCPT + 27 others); Tue, 17 Dec 2019 17:19:20 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:46933 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727165AbfLQWTO (ORCPT ); Tue, 17 Dec 2019 17:19:14 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MKKhF-1iOrCN359b-00Looj; Tue, 17 Dec 2019 23:17:32 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 21/27] compat_ioctl: move cdrom commands into cdrom.c Date: Tue, 17 Dec 2019 23:17:02 +0100 Message-Id: <20191217221708.3730997-22-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:xQtqzDF0k6u89EQieIQzUB9hiVcXtS5mjt2hY+zFGQb8APrgaxJ mBUBNv6HQTyWI67r5klVxNs8hbG34FMJ6V4H1OIknx+iXFwtjM25VsaYwp88i2z0nwoWi1I TnTgZeCsnC1aCMB9hk8IaX2/KgLUhBCJxsDWxtft0DzXyc+PzBt+rt/ZuyVMomqnjviYnh3 YoVR+mpglYKYjo8U/jGGw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:TNPJQbvKd+U=:MpWDPVhy5y+i9LqCtJmTmu 6rkUBZ4gXyXzKxtB/tFOl7A5y+hEU4TED8JWQgJ2isNp9eMh71mKG0ZTXIyBVqnnXnMz6ZzIk cwvQVxdoM+OkoUPEH1AYuTpfGTDFlhX2aT8My3SbrLvONUjOt1Hi+uGLtQLiEWiNwwzBA6y5Y OLncZQuRAq4yIMRZwN4zswmQICGt5DTcjgOVX2OJ0/K7oBUaMb2Y+5HmGwa9AfZ3dum3zZiKW 3MaW8IaqB5h2v6ACeBBi/0QlBlk6qGM0Z2Vg6BrD70OhREPIuMlRysYUqSNl95+7DG1t5u07q VW0nT2wuOQOG7RKpg2DPN21t+mxmPuLYr7s2N5UKormAGysU37nm2O0cy3fFk+MtxdRRmy5hv haQ8FdrRKHA9ki+wiEo9W+axXfVz+bXL9Jy/casciu5wxQ7BpJ+SSwXul3TO3V1GiKV5lmq+6 xtGhudSAjpl3JVNugwDKiMJ49ijrh7OPKH8VWZg+qGoDsgAbzlGz7IjBRi/CO5mjKcFnK1LM6 /XS+6SYCp8MXbznn5MWAXS/5jtS4I9Tx5P/s9iv3UvGtwtS1iHQWBeVaIANpFvAT88NhXM+Yy EzBJWS3cGVKhUfx12Lcn4EmBc+xHaAPxbnHEM/RatnKc5dl86+m/bNfr9hkerJCTuNhoiHqeh laVSWhnadCyCeXocU6Lice+7EZ7oTmJaCG71UKBydjRa3XbXT2sQUXnNE5OH79/SQlPyJFZYd 1F7Y8cf2R3Jhx0GLvVBIsTPJhewRJxdITcP7GijENBG6TY3lfjWdVNgrCqIomX9LjVyS9ki2v M2jchqHAy81dGqM3yECcIr+jfNeu98PEf1uSEeZGzI+CcHemHpYaJ/sGQyc4m1HMNwSTQ8cfR lXW2ZFqZ+z3qFEY+ixDg== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There is no need for the special cases for the cdrom ioctls any more now, so make sure that each cdrom driver has a .compat_ioctl() callback and calls cdrom_compat_ioctl() directly there. Signed-off-by: Arnd Bergmann --- block/compat_ioctl.c | 45 -------------------------------------- drivers/block/paride/pcd.c | 3 +++ drivers/cdrom/gdrom.c | 3 +++ drivers/ide/ide-cd.c | 36 ++++++++++++++++++++++++++++++ drivers/scsi/sr.c | 10 +++------ 5 files changed, 45 insertions(+), 52 deletions(-) -- 2.20.0 diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index cf136bc2c9fc..7cb534d6e767 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c @@ -159,42 +159,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, case HDIO_DRIVE_CMD: /* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */ case 0x330: - /* CDROM stuff */ - case CDROMPAUSE: - case CDROMRESUME: - case CDROMPLAYMSF: - case CDROMPLAYTRKIND: - case CDROMREADTOCHDR: - case CDROMREADTOCENTRY: - case CDROMSTOP: - case CDROMSTART: - case CDROMEJECT: - case CDROMVOLCTRL: - case CDROMSUBCHNL: - case CDROMMULTISESSION: - case CDROM_GET_MCN: - case CDROMRESET: - case CDROMVOLREAD: - case CDROMSEEK: - case CDROMPLAYBLK: - case CDROMCLOSETRAY: - case CDROM_DISC_STATUS: - case CDROM_CHANGER_NSLOTS: - case CDROM_GET_CAPABILITY: - case CDROM_SEND_PACKET: - /* Ignore cdrom.h about these next 5 ioctls, they absolutely do - * not take a struct cdrom_read, instead they take a struct cdrom_msf - * which is compatible. - */ - case CDROMREADMODE2: - case CDROMREADMODE1: - case CDROMREADRAW: - case CDROMREADCOOKED: - case CDROMREADALL: - /* DVD ioctls */ - case DVD_READ_STRUCT: - case DVD_WRITE_STRUCT: - case DVD_AUTH: arg = (unsigned long)compat_ptr(arg); /* These intepret arg as an unsigned long, not as a pointer, * so we must not do compat_ptr() conversion. */ @@ -210,15 +174,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, case HDIO_SET_ACOUSTIC: case HDIO_SET_BUSSTATE: case HDIO_SET_ADDRESS: - case CDROMEJECT_SW: - case CDROM_SET_OPTIONS: - case CDROM_CLEAR_OPTIONS: - case CDROM_SELECT_SPEED: - case CDROM_SELECT_DISC: - case CDROM_MEDIA_CHANGED: - case CDROM_DRIVE_STATUS: - case CDROM_LOCKDOOR: - case CDROM_DEBUG: break; default: /* unknown ioctl number */ diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index 636bfea2de6f..117cfc8cd05a 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c @@ -275,6 +275,9 @@ static const struct block_device_operations pcd_bdops = { .open = pcd_block_open, .release = pcd_block_release, .ioctl = pcd_block_ioctl, +#ifdef CONFIG_COMPAT + .ioctl = blkdev_compat_ptr_ioctl, +#endif .check_events = pcd_block_check_events, }; diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c index 5b21dc421c94..886b2638c730 100644 --- a/drivers/cdrom/gdrom.c +++ b/drivers/cdrom/gdrom.c @@ -518,6 +518,9 @@ static const struct block_device_operations gdrom_bdops = { .release = gdrom_bdops_release, .check_events = gdrom_bdops_check_events, .ioctl = gdrom_bdops_ioctl, +#ifdef CONFIG_COMPAT + .ioctl = blkdev_compat_ptr_ioctl, +#endif }; static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 9d117936bee1..2de6e8ace957 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -25,6 +25,7 @@ #define IDECD_VERSION "5.00" +#include #include #include #include @@ -1710,6 +1711,38 @@ static int idecd_ioctl(struct block_device *bdev, fmode_t mode, return ret; } +#ifdef CONFIG_COMPAT +static int idecd_locked_compat_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, unsigned long arg) +{ + struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); + int err; + + switch (cmd) { + case CDROMSETSPINDOWN: + return idecd_set_spindown(&info->devinfo, arg); + case CDROMGETSPINDOWN: + return idecd_get_spindown(&info->devinfo, arg); + default: + break; + } + + return cdrom_ioctl(&info->devinfo, bdev, mode, cmd, + (unsigned long)compat_ptr(arg)); +} + +static int idecd_compat_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, unsigned long arg) +{ + int ret; + + mutex_lock(&ide_cd_mutex); + ret = idecd_locked_compat_ioctl(bdev, mode, cmd, arg); + mutex_unlock(&ide_cd_mutex); + + return ret; +} +#endif static unsigned int idecd_check_events(struct gendisk *disk, unsigned int clearing) @@ -1732,6 +1765,9 @@ static const struct block_device_operations idecd_ops = { .open = idecd_open, .release = idecd_release, .ioctl = idecd_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = idecd_compat_ioctl, +#endif .check_events = idecd_check_events, .revalidate_disk = idecd_revalidate_disk }; diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 6033a886c42c..0fbb8fe6e521 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -628,13 +628,9 @@ static int sr_block_compat_ioctl(struct block_device *bdev, fmode_t mode, unsign goto put; } - /* - * CDROM ioctls are handled in the block layer, but - * do the scsi blk ioctls here. - */ - ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp); - if (ret != -ENOTTY) - return ret; + ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, (unsigned long)argp); + if (ret != -ENOSYS) + goto put; ret = scsi_compat_ioctl(sdev, cmd, argp); From patchwork Tue Dec 17 22:17:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181950 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6383726ile; Tue, 17 Dec 2019 14:19:37 -0800 (PST) X-Google-Smtp-Source: APXvYqwG8thbVj5p5W/xj5+mTwFDAieCvtGflZL/19+8Yp4uqdoMuU+vJX6EU+CaOfpFWowyF0Oo X-Received: by 2002:a05:6808:1c5:: with SMTP id x5mr3176775oic.57.1576621176917; Tue, 17 Dec 2019 14:19:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621176; cv=none; d=google.com; s=arc-20160816; b=KXiV+Vr2Opwl1wRJW4mI40jJ3aJ6Dxp7cDsWzpL74niupFD7E2wfL3SsU/8DMfMVar w5dfCeyriyXgp04RscppchymdfrLyjaiKl0Vr4ME+SpWsE0L6/Lwj4gsDNA5nY/xW8uW XNohvfeEJahX/GM04wrQl7wS+8DPt7sa1lyqmGMV9Ctbco0tIGlR9ymuSFiD7MM+9KVl KV7RImEbx/UoRKdSC/Kk8zIdgZV6u3YzyTCaioa0E+3jXZyJMFwA4MNvY+Qdomqa2hoM TXc7Mf7dgssM0OaCisVnm0Xf/Qe0RyXjrKn10sYSo+mjsWMOk7OyIAnSbiFAzMbHFdEn JxAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=37ltfNr2UPB6+Zd1w2fyaDMrvlxR/t2vJsCD+poZSBg=; b=dAS9hmqQ/+HC4VzXRcyJj+QD7KggJ9XWICCDT3AQ+qB0VefypuVuxydvBerYSr6TCM M0M24Y1b5fcW2xjMlZ79jM7kG1fewLFgC/HDgMw4wscGsqpVY8qyyuD0YKBAEIwAhXom /CedPoJL6+SYuGE49LIXb6I8ghkGHVQuqgZQYDRJPs4YMrdz2U8kM4i4WJIC41U/xF0z A4u/vu7fCPIctX2RCi/hY7VQcWkhs1fbziSsBw6bIjrn+/+mpUFPxdbviu+Xa1AYy3nk sKMZadyC2eol15XhZFPd6Po4cpgNp/6gHhnYgRC5YnywvsLplu8iWwoijYyTlzKA5Lwj 0ohA== 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 y8si13108646oih.141.2019.12.17.14.19.36; Tue, 17 Dec 2019 14:19:36 -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 S1727297AbfLQWTf (ORCPT + 27 others); Tue, 17 Dec 2019 17:19:35 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:58457 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726808AbfLQWTd (ORCPT ); Tue, 17 Dec 2019 17:19:33 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MHX7f-1iTskR0T7B-00DVzz; Tue, 17 Dec 2019 23:17:34 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 24/27] compat_ioctl: block: move blkdev_compat_ioctl() into ioctl.c Date: Tue, 17 Dec 2019 23:17:05 +0100 Message-Id: <20191217221708.3730997-25-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:PSAD9bl0CFKl/aF5LKUPzusxXoxLYNJ5KzrK6e2MQW/9n3CWnjv YS4eBKkXR1HztidqHI91DDyXR/AQfN87JIhMu94SIu4GxAELbMeRJVmpCa6nOBSmtEasanl AZE7bG2pC1HRVU9ryXnwF5XG5ymueLsxU/kTFX+LrhBBYUcVVHLF2nZI3tqzs9q4fJz9dmN zRS+YuAuqB0r/0v+rTEpA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:gbhqN5RdKj0=:BWK8lhBEG/MD40PIuhTUnG YyDSCscLh9YKImGCbbZipadpWoCh10HeOaNyzo1PaxTLF4rN9pzZYFp2t5ntmeiTZbHfoaCe0 3cotpxM/Eb1shhdcImLbF6GRrJqKUhruGnep5BCSyf/MuVThSQ/DxzWt3EUmiC6cvZ8YBSQJy ZnHHZtrS70kowS/WIyRQCz5g5ypBBZmXHSGE+8V49MJQrGY5kbb1bqG2yXzBrLwovSWJ7M2vy dKtq4nrrHcA7Htra+aDTXJqavU1ul99amdZ81t9xuwOLlTdGKGGgoLtX7dNYOuJ7KVJ5ph2Ko IGFwCNKZH50bZi+DbHiIv6INtG3I8jNzZ0wBwBsvexAcg5kbjDi65qJuTe3dH7jK9gUrwn0cX kumKT2I94RYeeO6mhl+lBdau2ppo8YOslhuObl62S7i861y4voirlm9eDKPMAPPtdTJ7XAjdv fTdeoH+aDVL3CbwAeipSQYE3gUixsRGuKHk425h4PZaJkwF+oCitrM0pdzBl37vnOB1YuVJxc XkEk6OgqxwypuyZCSmMUr3ujKwTRYAo6MbFj7oJEwCT9nezvq+Psdjwngb2/L1/3286e3Hwol 3DBrkgZZHpDeoGEZmkr/KEUKaGF+FTytTvUB3JPeerPi5484jRWVYGD+UYWzfBKsgzZvG4IjE maAvR5WrNc2Vc49PSNk0aTOAj8D4j5F1m8cPzHI69Do/3WHA6hivRG41ihl1/YJmdDT42kkLO FEG24mrkj42RCIc0k7ZJpc6oVx06fi5a8KDd+Oorx655Y5+EeN3NGq2OX0imStKFInD0flEqo WpoBJAHn0Pu3+DST8DW+Ow28tRRW5Q/l6gfIoqa42qGwDHFyprv4yld/kyZop0h+oPHh9pO4c XaD08gxbDhYNk5xezrZg== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Having both in the same file allows a number of simplifications to the compat path, and makes it more likely that changes to the native path get applied to the compat version as well. Signed-off-by: Arnd Bergmann --- block/Makefile | 1 - block/compat_ioctl.c | 225 ------------------------------------------- block/ioctl.c | 219 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 219 insertions(+), 226 deletions(-) delete mode 100644 block/compat_ioctl.c -- 2.20.0 diff --git a/block/Makefile b/block/Makefile index 205a5f2fef17..1f70c73ea83d 100644 --- a/block/Makefile +++ b/block/Makefile @@ -25,7 +25,6 @@ obj-$(CONFIG_MQ_IOSCHED_KYBER) += kyber-iosched.o bfq-y := bfq-iosched.o bfq-wf2q.o bfq-cgroup.o obj-$(CONFIG_IOSCHED_BFQ) += bfq.o -obj-$(CONFIG_BLOCK_COMPAT) += compat_ioctl.o obj-$(CONFIG_BLK_CMDLINE_PARSER) += cmdline-parser.o obj-$(CONFIG_BLK_DEV_INTEGRITY) += bio-integrity.o blk-integrity.o t10-pi.o obj-$(CONFIG_BLK_MQ_PCI) += blk-mq-pci.o diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c deleted file mode 100644 index 765aa5357655..000000000000 --- a/block/compat_ioctl.c +++ /dev/null @@ -1,225 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int compat_put_ushort(unsigned long arg, unsigned short val) -{ - return put_user(val, (unsigned short __user *)compat_ptr(arg)); -} - -static int compat_put_int(unsigned long arg, int val) -{ - return put_user(val, (compat_int_t __user *)compat_ptr(arg)); -} - -static int compat_put_uint(unsigned long arg, unsigned int val) -{ - return put_user(val, (compat_uint_t __user *)compat_ptr(arg)); -} - -static int compat_put_long(unsigned long arg, long val) -{ - return put_user(val, (compat_long_t __user *)compat_ptr(arg)); -} - -static int compat_put_ulong(unsigned long arg, compat_ulong_t val) -{ - return put_user(val, (compat_ulong_t __user *)compat_ptr(arg)); -} - -static int compat_put_u64(unsigned long arg, u64 val) -{ - return put_user(val, (compat_u64 __user *)compat_ptr(arg)); -} - -struct compat_hd_geometry { - unsigned char heads; - unsigned char sectors; - unsigned short cylinders; - u32 start; -}; - -static int compat_hdio_getgeo(struct gendisk *disk, struct block_device *bdev, - struct compat_hd_geometry __user *ugeo) -{ - struct hd_geometry geo; - int ret; - - if (!ugeo) - return -EINVAL; - if (!disk->fops->getgeo) - return -ENOTTY; - - memset(&geo, 0, sizeof(geo)); - /* - * We need to set the startsect first, the driver may - * want to override it. - */ - geo.start = get_start_sect(bdev); - ret = disk->fops->getgeo(bdev, &geo); - if (ret) - return ret; - - ret = copy_to_user(ugeo, &geo, 4); - ret |= put_user(geo.start, &ugeo->start); - if (ret) - ret = -EFAULT; - - return ret; -} - -struct compat_blkpg_ioctl_arg { - compat_int_t op; - compat_int_t flags; - compat_int_t datalen; - compat_caddr_t data; -}; - -static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode, - unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32) -{ - struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a)); - compat_caddr_t udata; - compat_int_t n; - int err; - - err = get_user(n, &ua32->op); - err |= put_user(n, &a->op); - err |= get_user(n, &ua32->flags); - err |= put_user(n, &a->flags); - err |= get_user(n, &ua32->datalen); - err |= put_user(n, &a->datalen); - err |= get_user(udata, &ua32->data); - err |= put_user(compat_ptr(udata), &a->data); - if (err) - return err; - - return blkdev_ioctl(bdev, mode, cmd, (unsigned long)a); -} - -#define BLKBSZGET_32 _IOR(0x12, 112, int) -#define BLKBSZSET_32 _IOW(0x12, 113, int) -#define BLKGETSIZE64_32 _IOR(0x12, 114, int) - -/* Most of the generic ioctls are handled in the normal fallback path. - This assumes the blkdev's low level compat_ioctl always returns - ENOIOCTLCMD for unknown ioctls. */ -long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) -{ - int ret = -ENOIOCTLCMD; - struct inode *inode = file->f_mapping->host; - struct block_device *bdev = inode->i_bdev; - struct gendisk *disk = bdev->bd_disk; - fmode_t mode = file->f_mode; - loff_t size; - unsigned int max_sectors; - - /* - * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have - * to updated it before every ioctl. - */ - if (file->f_flags & O_NDELAY) - mode |= FMODE_NDELAY; - else - mode &= ~FMODE_NDELAY; - - switch (cmd) { - case HDIO_GETGEO: - return compat_hdio_getgeo(disk, bdev, compat_ptr(arg)); - case BLKPBSZGET: - return compat_put_uint(arg, bdev_physical_block_size(bdev)); - case BLKIOMIN: - return compat_put_uint(arg, bdev_io_min(bdev)); - case BLKIOOPT: - return compat_put_uint(arg, bdev_io_opt(bdev)); - case BLKALIGNOFF: - return compat_put_int(arg, bdev_alignment_offset(bdev)); - case BLKDISCARDZEROES: - return compat_put_uint(arg, 0); - case BLKFLSBUF: - case BLKROSET: - case BLKDISCARD: - case BLKSECDISCARD: - case BLKZEROOUT: - /* - * the ones below are implemented in blkdev_locked_ioctl, - * but we call blkdev_ioctl, which gets the lock for us - */ - case BLKRRPART: - case BLKREPORTZONE: - case BLKRESETZONE: - case BLKOPENZONE: - case BLKCLOSEZONE: - case BLKFINISHZONE: - case BLKGETZONESZ: - case BLKGETNRZONES: - return blkdev_ioctl(bdev, mode, cmd, - (unsigned long)compat_ptr(arg)); - case BLKBSZSET_32: - return blkdev_ioctl(bdev, mode, BLKBSZSET, - (unsigned long)compat_ptr(arg)); - case BLKPG: - return compat_blkpg_ioctl(bdev, mode, cmd, compat_ptr(arg)); - case BLKRAGET: - case BLKFRAGET: - if (!arg) - return -EINVAL; - return compat_put_long(arg, - (bdev->bd_bdi->ra_pages * PAGE_SIZE) / 512); - case BLKROGET: /* compatible */ - return compat_put_int(arg, bdev_read_only(bdev) != 0); - case BLKBSZGET_32: /* get the logical block size (cf. BLKSSZGET) */ - return compat_put_int(arg, block_size(bdev)); - case BLKSSZGET: /* get block device hardware sector size */ - return compat_put_int(arg, bdev_logical_block_size(bdev)); - case BLKSECTGET: - max_sectors = min_t(unsigned int, USHRT_MAX, - queue_max_sectors(bdev_get_queue(bdev))); - return compat_put_ushort(arg, max_sectors); - case BLKROTATIONAL: - return compat_put_ushort(arg, - !blk_queue_nonrot(bdev_get_queue(bdev))); - case BLKRASET: /* compatible, but no compat_ptr (!) */ - case BLKFRASET: - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; - bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; - return 0; - case BLKGETSIZE: - size = i_size_read(bdev->bd_inode); - if ((size >> 9) > ~0UL) - return -EFBIG; - return compat_put_ulong(arg, size >> 9); - - case BLKGETSIZE64_32: - return compat_put_u64(arg, i_size_read(bdev->bd_inode)); - - case BLKTRACESETUP32: - case BLKTRACESTART: /* compatible */ - case BLKTRACESTOP: /* compatible */ - case BLKTRACETEARDOWN: /* compatible */ - ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg)); - return ret; - case IOC_PR_REGISTER: - case IOC_PR_RESERVE: - case IOC_PR_RELEASE: - case IOC_PR_PREEMPT: - case IOC_PR_PREEMPT_ABORT: - case IOC_PR_CLEAR: - return blkdev_ioctl(bdev, mode, cmd, - (unsigned long)compat_ptr(arg)); - default: - if (disk->fops->compat_ioctl) - ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); - return ret; - } -} diff --git a/block/ioctl.c b/block/ioctl.c index e728331d1a5b..f8c4e2649335 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -269,6 +269,38 @@ static int put_u64(unsigned long arg, u64 val) return put_user(val, (u64 __user *)arg); } +#ifdef CONFIG_COMPAT +static int compat_put_ushort(unsigned long arg, unsigned short val) +{ + return put_user(val, (unsigned short __user *)compat_ptr(arg)); +} + +static int compat_put_int(unsigned long arg, int val) +{ + return put_user(val, (compat_int_t __user *)compat_ptr(arg)); +} + +static int compat_put_uint(unsigned long arg, unsigned int val) +{ + return put_user(val, (compat_uint_t __user *)compat_ptr(arg)); +} + +static int compat_put_long(unsigned long arg, long val) +{ + return put_user(val, (compat_long_t __user *)compat_ptr(arg)); +} + +static int compat_put_ulong(unsigned long arg, compat_ulong_t val) +{ + return put_user(val, (compat_ulong_t __user *)compat_ptr(arg)); +} + +static int compat_put_u64(unsigned long arg, u64 val) +{ + return put_user(val, (compat_u64 __user *)compat_ptr(arg)); +} +#endif + int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, unsigned long arg) { @@ -476,6 +508,44 @@ static int blkdev_getgeo(struct block_device *bdev, return 0; } +#ifdef CONFIG_COMPAT +struct compat_hd_geometry { + unsigned char heads; + unsigned char sectors; + unsigned short cylinders; + u32 start; +}; + +static int compat_hdio_getgeo(struct gendisk *disk, struct block_device *bdev, + struct compat_hd_geometry __user *ugeo) +{ + struct hd_geometry geo; + int ret; + + if (!ugeo) + return -EINVAL; + if (!disk->fops->getgeo) + return -ENOTTY; + + memset(&geo, 0, sizeof(geo)); + /* + * We need to set the startsect first, the driver may + * want to override it. + */ + geo.start = get_start_sect(bdev); + ret = disk->fops->getgeo(bdev, &geo); + if (ret) + return ret; + + ret = copy_to_user(ugeo, &geo, 4); + ret |= put_user(geo.start, &ugeo->start); + if (ret) + ret = -EFAULT; + + return ret; +} +#endif + /* set the logical block size */ static int blkdev_bszset(struct block_device *bdev, fmode_t mode, int __user *argp) @@ -604,3 +674,152 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, } } EXPORT_SYMBOL_GPL(blkdev_ioctl); + +#ifdef CONFIG_COMPAT +struct compat_blkpg_ioctl_arg { + compat_int_t op; + compat_int_t flags; + compat_int_t datalen; + compat_caddr_t data; +}; + +static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32) +{ + struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a)); + compat_caddr_t udata; + compat_int_t n; + int err; + + err = get_user(n, &ua32->op); + err |= put_user(n, &a->op); + err |= get_user(n, &ua32->flags); + err |= put_user(n, &a->flags); + err |= get_user(n, &ua32->datalen); + err |= put_user(n, &a->datalen); + err |= get_user(udata, &ua32->data); + err |= put_user(compat_ptr(udata), &a->data); + if (err) + return err; + + return blkdev_ioctl(bdev, mode, cmd, (unsigned long)a); +} + +#define BLKBSZGET_32 _IOR(0x12, 112, int) +#define BLKBSZSET_32 _IOW(0x12, 113, int) +#define BLKGETSIZE64_32 _IOR(0x12, 114, int) + +/* Most of the generic ioctls are handled in the normal fallback path. + This assumes the blkdev's low level compat_ioctl always returns + ENOIOCTLCMD for unknown ioctls. */ +long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) +{ + int ret = -ENOIOCTLCMD; + struct inode *inode = file->f_mapping->host; + struct block_device *bdev = inode->i_bdev; + struct gendisk *disk = bdev->bd_disk; + fmode_t mode = file->f_mode; + loff_t size; + unsigned int max_sectors; + + /* + * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have + * to updated it before every ioctl. + */ + if (file->f_flags & O_NDELAY) + mode |= FMODE_NDELAY; + else + mode &= ~FMODE_NDELAY; + + switch (cmd) { + case HDIO_GETGEO: + return compat_hdio_getgeo(disk, bdev, compat_ptr(arg)); + case BLKPBSZGET: + return compat_put_uint(arg, bdev_physical_block_size(bdev)); + case BLKIOMIN: + return compat_put_uint(arg, bdev_io_min(bdev)); + case BLKIOOPT: + return compat_put_uint(arg, bdev_io_opt(bdev)); + case BLKALIGNOFF: + return compat_put_int(arg, bdev_alignment_offset(bdev)); + case BLKDISCARDZEROES: + return compat_put_uint(arg, 0); + case BLKFLSBUF: + case BLKROSET: + case BLKDISCARD: + case BLKSECDISCARD: + case BLKZEROOUT: + /* + * the ones below are implemented in blkdev_locked_ioctl, + * but we call blkdev_ioctl, which gets the lock for us + */ + case BLKRRPART: + case BLKREPORTZONE: + case BLKRESETZONE: + case BLKOPENZONE: + case BLKCLOSEZONE: + case BLKFINISHZONE: + case BLKGETZONESZ: + case BLKGETNRZONES: + return blkdev_ioctl(bdev, mode, cmd, + (unsigned long)compat_ptr(arg)); + case BLKBSZSET_32: + return blkdev_ioctl(bdev, mode, BLKBSZSET, + (unsigned long)compat_ptr(arg)); + case BLKPG: + return compat_blkpg_ioctl(bdev, mode, cmd, compat_ptr(arg)); + case BLKRAGET: + case BLKFRAGET: + if (!arg) + return -EINVAL; + return compat_put_long(arg, + (bdev->bd_bdi->ra_pages * PAGE_SIZE) / 512); + case BLKROGET: /* compatible */ + return compat_put_int(arg, bdev_read_only(bdev) != 0); + case BLKBSZGET_32: /* get the logical block size (cf. BLKSSZGET) */ + return compat_put_int(arg, block_size(bdev)); + case BLKSSZGET: /* get block device hardware sector size */ + return compat_put_int(arg, bdev_logical_block_size(bdev)); + case BLKSECTGET: + max_sectors = min_t(unsigned int, USHRT_MAX, + queue_max_sectors(bdev_get_queue(bdev))); + return compat_put_ushort(arg, max_sectors); + case BLKROTATIONAL: + return compat_put_ushort(arg, + !blk_queue_nonrot(bdev_get_queue(bdev))); + case BLKRASET: /* compatible, but no compat_ptr (!) */ + case BLKFRASET: + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; + return 0; + case BLKGETSIZE: + size = i_size_read(bdev->bd_inode); + if ((size >> 9) > ~0UL) + return -EFBIG; + return compat_put_ulong(arg, size >> 9); + + case BLKGETSIZE64_32: + return compat_put_u64(arg, i_size_read(bdev->bd_inode)); + + case BLKTRACESETUP32: + case BLKTRACESTART: /* compatible */ + case BLKTRACESTOP: /* compatible */ + case BLKTRACETEARDOWN: /* compatible */ + ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg)); + return ret; + case IOC_PR_REGISTER: + case IOC_PR_RESERVE: + case IOC_PR_RELEASE: + case IOC_PR_PREEMPT: + case IOC_PR_PREEMPT_ABORT: + case IOC_PR_CLEAR: + return blkdev_ioctl(bdev, mode, cmd, + (unsigned long)compat_ptr(arg)); + default: + if (disk->fops->compat_ioctl) + ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); + return ret; + } +} +#endif From patchwork Tue Dec 17 22:17:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181941 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6382544ile; Tue, 17 Dec 2019 14:18:39 -0800 (PST) X-Google-Smtp-Source: APXvYqwoFEg/d0VyyR+APIuDEj3clZPTNujlyo+XneeUuMjStMjy0dp8TqmYU666a7XaprDxc0vY X-Received: by 2002:aca:3256:: with SMTP id y83mr1992328oiy.58.1576621119218; Tue, 17 Dec 2019 14:18:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621119; cv=none; d=google.com; s=arc-20160816; b=Lub1kp1RBLimfbtaJLfMFRi7Vs11jmU8YeeA5oEZCqnFUjn2D+K0O+waYFpOPyzywI ptDMcWqzx38daVpzpk2x8CWrhL8lWWDXUk4PoeDUiGX8enc5Rrg3Ua5dbwkCVybzVPp2 GmA5JiwvYdvX2ctNfQO5qjHE2HdB6pyGdRsEW+YkwrO2NF/LL3bOk4GCYNbkPApq/etO CkuuZ+IHkmChSThFeTupYt0eUM+CVlFFMT+j19a+MbGQ4Bg5aioOOyjDtx1iMMYYHsWW B8NnbbzIVZBZK7+7ftHUvXbUTY4Mnz5ASPwHbsUT1I0cj5WK+SI2/h8zUn4ZfURzH480 LOGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=RO+4rLuP3Qtq7ZVXpL08umXRb0uRS8Hf9o+iee3dLgE=; b=os6OEVAidnAcWRRVN46aOGFmdAsa57AWWaqFJVK440iOzgWOREtGIfVL01pqDpjggv Xd+nIjJWO+gLaANeJswce3ltLa5EPYn/XUDdhqmPpM9Cfs+pdryV+BW3ZQlVBGTc2umR Tu6Tp/adzbWOplkAhm+oBTPkh+yLcSdtAlD7cap3dYiWCU0XCANGgDxk8dr02mYcgzv1 PIG06zDeHd0GpD9HauWil9Dw5YULD8iaFcZizinN++YRmaSPho26EminEwber2xzI5GO JBVlKjv9Lzu5I/Fbyp5SQEkyUukCpKE+tywrs6uhEuNnt8MUcFOk/ZBgsfiX2ZjaBteO kccg== 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 s129si7055449oig.177.2019.12.17.14.18.38; Tue, 17 Dec 2019 14:18:39 -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 S1726802AbfLQWRz (ORCPT + 27 others); Tue, 17 Dec 2019 17:17:55 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:42629 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726733AbfLQWRs (ORCPT ); Tue, 17 Dec 2019 17:17:48 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1Mzhf5-1hlv0p2OMj-00vgXP; Tue, 17 Dec 2019 23:17:34 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 25/27] compat_ioctl: block: simplify compat_blkpg_ioctl() Date: Tue, 17 Dec 2019 23:17:06 +0100 Message-Id: <20191217221708.3730997-26-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:u56YlEGvfOa9zyhVPxWeQqyyoHmVfXUnvL4Wd9qSUxbgXqKfNbk iDq+NFs5bgKJDjeu7lGnuYYHi3u/BRMa/UcOlmalAwI2H3P5YhBTDahqHW/DAc+lt0Hhgw4 vLYECIgCJZGl+I7guuXe2oI+wxIscuJl80F0kddfubjLPvNRRB6U0/XdvmrbKjjNezmZ9j2 9+jZtiIYRPvS3t58syV5w== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:BsIoG4Z5w2Y=:A1Ag1+Uyp7HVkUxJlC4qWg rhyX78tMCYlnIGy3LuqwuziiIzcT3YTTOH4OX9r4adRYRTBfULoxLMOyRTwe4mlEM/nSYZt74 zNhRZR0aLBvuasUfLWWwm6CZBaUyCFlSIjhdixhboNw7av3BKYmf0czmbvkn4uQQVi9gwMeuY OoFqlXqocn9lHT7Mv1ozdaVpy3H9Sd9l8Qm3Iu9Nno5pJiwxXDGHf56JqEg+s3NLZfNqA6OZ0 Bn1lWTMLw4GqZmwyBG25tUUwh9JPPF2vONgMwIPwsb30VFL1bHu+azoMlyH1N646Ri5FpMVaD sHiMAC4L8cuxOrI3y6HmNpvnq1zzEauJA9El76OrQ0olKbn9U8Tjot97/cpUT5qeNTT0UasMk SIHAH/9XHerjD5sCDID0BhGaszJXf/toBnQVWzrYW0oA0MH67RWlY4fcp9lw7bFKUFttz+CLB q8VUfzeAqNWTqX0qE0dfDZlH3pL9QavtoP2qL32K7hUEQX6d7CdlpWednik//c9xm3Qye5+eq R3An18Y9fn5EZjy/oseZH5rpfGEW6gn91At2RmvlzAF0ou/9QmIdlwesXBix/D+wQ7J8gqwAV ZDCeSNLRMn+zLi76kfK45CX0rm+BWmG2AldhjSgNCABc3PIQhQqt4XRYSBc8jgf/cKt2KOQIO Djm8Jgi/L/VxcQ8K2eJU88hhhU40z+cS1T8Cd8VT2FVdnetClznvBoWmLmrbQ51yyGc3ITrfQ ug2bg5CRthgohTeHncxRK4/NnXb+TyvDGEdlOaf3rGnz1aheRruKAV1I30N/3aSlk2bQkhEGl 0VmiHbbdZZUE2KUIiovszFRvIWeQSr+Sih1AaBqeWqs2OjM/GyTpU9x9fQm0EB+PFl4lZFvcE XJZWwiN8A8nAoene4fsw== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There is no need to go through a compat_alloc_user_space() copy any more, just wrap the function in a small helper that works the same way for native and compat mode. Signed-off-by: Arnd Bergmann --- block/ioctl.c | 74 ++++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 36 deletions(-) -- 2.20.0 diff --git a/block/ioctl.c b/block/ioctl.c index f8c4e2649335..d6911a1149f5 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -12,12 +12,12 @@ #include #include -static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg) +static int blkpg_do_ioctl(struct block_device *bdev, + struct blkpg_partition __user *upart, int op) { struct block_device *bdevp; struct gendisk *disk; struct hd_struct *part, *lpart; - struct blkpg_ioctl_arg a; struct blkpg_partition p; struct disk_part_iter piter; long long start, length; @@ -25,9 +25,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (copy_from_user(&a, arg, sizeof(struct blkpg_ioctl_arg))) - return -EFAULT; - if (copy_from_user(&p, a.data, sizeof(struct blkpg_partition))) + if (copy_from_user(&p, upart, sizeof(struct blkpg_partition))) return -EFAULT; disk = bdev->bd_disk; if (bdev != bdev->bd_contains) @@ -35,7 +33,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user partno = p.pno; if (partno <= 0) return -EINVAL; - switch (a.op) { + switch (op) { case BLKPG_ADD_PARTITION: start = p.start >> 9; length = p.length >> 9; @@ -156,6 +154,39 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user } } +static int blkpg_ioctl(struct block_device *bdev, + struct blkpg_ioctl_arg __user *arg) +{ + struct blkpg_partition __user *udata; + int op; + + if (get_user(op, &arg->op) || get_user(udata, &arg->data)) + return -EFAULT; + + return blkpg_do_ioctl(bdev, udata, op); +} + +#ifdef CONFIG_COMPAT +struct compat_blkpg_ioctl_arg { + compat_int_t op; + compat_int_t flags; + compat_int_t datalen; + compat_caddr_t data; +}; + +static int compat_blkpg_ioctl(struct block_device *bdev, + struct compat_blkpg_ioctl_arg __user *arg) +{ + compat_caddr_t udata; + int op; + + if (get_user(op, &arg->op) || get_user(udata, &arg->data)) + return -EFAULT; + + return blkpg_do_ioctl(bdev, compat_ptr(udata), op); +} +#endif + static int blkdev_reread_part(struct block_device *bdev) { int ret; @@ -676,35 +707,6 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, EXPORT_SYMBOL_GPL(blkdev_ioctl); #ifdef CONFIG_COMPAT -struct compat_blkpg_ioctl_arg { - compat_int_t op; - compat_int_t flags; - compat_int_t datalen; - compat_caddr_t data; -}; - -static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode, - unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32) -{ - struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a)); - compat_caddr_t udata; - compat_int_t n; - int err; - - err = get_user(n, &ua32->op); - err |= put_user(n, &a->op); - err |= get_user(n, &ua32->flags); - err |= put_user(n, &a->flags); - err |= get_user(n, &ua32->datalen); - err |= put_user(n, &a->datalen); - err |= get_user(udata, &ua32->data); - err |= put_user(compat_ptr(udata), &a->data); - if (err) - return err; - - return blkdev_ioctl(bdev, mode, cmd, (unsigned long)a); -} - #define BLKBSZGET_32 _IOR(0x12, 112, int) #define BLKBSZSET_32 _IOW(0x12, 113, int) #define BLKGETSIZE64_32 _IOR(0x12, 114, int) @@ -767,7 +769,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) return blkdev_ioctl(bdev, mode, BLKBSZSET, (unsigned long)compat_ptr(arg)); case BLKPG: - return compat_blkpg_ioctl(bdev, mode, cmd, compat_ptr(arg)); + return compat_blkpg_ioctl(bdev, compat_ptr(arg)); case BLKRAGET: case BLKFRAGET: if (!arg) From patchwork Tue Dec 17 22:17:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181936 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6381784ile; Tue, 17 Dec 2019 14:18:01 -0800 (PST) X-Google-Smtp-Source: APXvYqzxBdNFN5v9NHmWd2fN3KAOmgxM47LrAfBaTmJsUc29fGgVlQZOc8b8kYUDUC8XNaDZWE8/ X-Received: by 2002:a9d:3cf:: with SMTP id f73mr2508466otf.11.1576621081606; Tue, 17 Dec 2019 14:18:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621081; cv=none; d=google.com; s=arc-20160816; b=OGlEPZSFOJHv1cMxk0s/8AooLpIN1EwwD5LqTnhwhzJmHleunJGKOxWZ5bg/q1NXdu Gu5Abz31g5BJ8uk8ZnB20zYtpRfcIhydEoSnDBDSjEzEI3dB4HigyRD+/gQUSyzlsOoN CnawoiqGUSvWch7+j+xz33bvNLO9FmL0/PYhaWnb3qjPDMIkrN5s17JJ8gSFoazAGMRZ LGgNlhQravPjK27mcQDCYB5qGs803uvoeDokpBGKfvrFn78vAE1muJPtj6vf1ydWKinB peTgj3twqNo1w9RlFCdV2ThUNecmsIuxiTLuzMKcw2sQtAV3UBFeyxxiCKGAL3yvripJ Bxsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=aNYSrTuJvlEyinSN9jUlUxWVGVcGBrdANOGmvyHq0Gg=; b=oBYzcOVZhwyZmmQyxz3GLGU4fx6+f85GaSIYFl+lLc9eVDCrfgsGAAYe1qJ2PRCXkm DooKaCc/fN8bWhJTIrdP+td5TcYfp0n9XQqhprct7XAMPvn4Kq7NKwvf7G45P1/tmeoR 4X/acSXEt3IJnXwitsjpkQ2YFN5vRpgMAWmWCA6SwOOF6BS3Tu0Ch/nm3Xc2++n4+Ovo dICZh0M4FRjzV2eK+ewPZtiu0kg9loUTZSeAJ7uxlNfJEt28asBM377UYSSJkw7KyCFf nh4JjwJoo99za99VwbU73c2lAV956MXEZ05+FLWPE6+nxVn/MxTYW5xzkDTEXq6e82S1 e2ow== 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 o15si12515054otp.314.2019.12.17.14.18.01; Tue, 17 Dec 2019 14:18:01 -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 S1726863AbfLQWSA (ORCPT + 27 others); Tue, 17 Dec 2019 17:18:00 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:44153 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726729AbfLQWRs (ORCPT ); Tue, 17 Dec 2019 17:17:48 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MJV5K-1iNTt905Tk-00JtoE; Tue, 17 Dec 2019 23:17:35 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 26/27] compat_ioctl: simplify up block/ioctl.c Date: Tue, 17 Dec 2019 23:17:07 +0100 Message-Id: <20191217221708.3730997-27-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:PSc7cpxTcwWHoTLJDUDon6vPuqxjQAgXgZKbCrNZoO2KElfQx2l FcINrO/ELAkuOfoyfqWTVT4i4v5sM8sF+KUFa2LjvArRvPR3zjWSQRKEBViXYCp9Qc4zzr1 ysea+zdVUJZM2T9fsMB403F/yO2EQ7KlltB4m2/O8/8tEMGjRUjvlvbOzb2rbnsTWtBCHza A5vXksHicMt2jaaVRI9kg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:/yc9ooJVqPo=:WUDNd8mE+eIpSCOHgfIZNk mEqCkSvWvZRzjTM5MyLgkTuTmBJ/rbk6fkV2LLFwXXW8nO5kcf+jXoyN0OiZ5jK9gDdBEgkR8 NoPIoGtBxVIp+zyqc30bztU2JbA3gPNjyZ0fHAHYs9o2yL6CRgsqVO/otIkLBx9f1qgkwKGxt nH1EVeBNK/970m9LbxdnvGdzn0qoz2Hc+uteoLkHz9orS2FbRtcmZN0v9u4UZTWDqkq0wt/zC nEETluikOUayjSRc4aPltRnBn1VQqFXDEvG0f1SJWoE6IhKJc0Y74ZC3WazKktnccUv/YKfYe H5SzvJnQ5MstqY3aeTtaZRREA+X/IbO3qaYNXYc29nzvoVDoZS6arUBetleMLszj9xhVlD8j5 FJqSubrCY08MgkhReUBFTK3otgK78/TEXeebVNHoMHF1KKzrkRO8JkkoXIiO9vCwe7I4D0gWh D1hZrrpzOORV4oJxjeps2cnDTAM44Td+Ybe63drNBGDC29Xn0DBIHbTZ9O2cd5hY9NTYFt/8f Zl75ZsPKznWCouvfgwXgZaMchV0+BpcF5co62WLlADcpFhmj5mX4ROzGqBZb+S0IXVTqkre7N JrJ2uEGi0j59hHZ9nBKleu1+tfMsLkpZ6/hisbT91ihKNhmiJBuS+heC5yxKO5OTcHB6+PI/K 0RjP9Th5ir5d3mD88fqgvTx0n6f2fvQgbXMkjVw3RoKWRIEufC5OsspTIxvqKGNsXCis/rAfW JVku8g+PC2wz56oGfhHIr+7nmBECBy6WBiJBGtAUAXj1d+9hPJaA+bBXAIp4xRMKGefH7ve1u u8uz4SZo9pfROgRssLrely3RCP/A+dvJ2GaDzMukeRWa7a1SaS/IruR1sr5a4wTMUbL2sbuQC TcCih08baW6RxrNoSHMw== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Having separate implementations of blkdev_ioctl() often leads to these getting out of sync, despite the comment at the top. Since most of the ioctl commands are compatible, and we try very hard not to add any new incompatible ones, move all the common bits into a shared function and leave only the ones that are historically different in separate functions for native/compat mode. To deal with the compat_ptr() conversion, pass both the integer argument and the pointer argument into the new blkdev_common_ioctl() and make sure to always use the correct one of these. blkdev_ioctl() is now only kept as a separate exported interfact for drivers/char/raw.c, which lacks a compat_ioctl variant. We should probably either move raw.c to staging if there are no more users, or export blkdev_compat_ioctl() as well. Signed-off-by: Arnd Bergmann --- block/ioctl.c | 269 ++++++++++++++++++++++---------------------------- 1 file changed, 117 insertions(+), 152 deletions(-) -- 2.20.0 diff --git a/block/ioctl.c b/block/ioctl.c index d6911a1149f5..127194b9f9bd 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -270,65 +270,45 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, BLKDEV_ZERO_NOUNMAP); } -static int put_ushort(unsigned long arg, unsigned short val) +static int put_ushort(unsigned short __user *argp, unsigned short val) { - return put_user(val, (unsigned short __user *)arg); + return put_user(val, argp); } -static int put_int(unsigned long arg, int val) +static int put_int(int __user *argp, int val) { - return put_user(val, (int __user *)arg); + return put_user(val, argp); } -static int put_uint(unsigned long arg, unsigned int val) +static int put_uint(unsigned int __user *argp, unsigned int val) { - return put_user(val, (unsigned int __user *)arg); + return put_user(val, argp); } -static int put_long(unsigned long arg, long val) +static int put_long(long __user *argp, long val) { - return put_user(val, (long __user *)arg); + return put_user(val, argp); } -static int put_ulong(unsigned long arg, unsigned long val) +static int put_ulong(unsigned long __user *argp, unsigned long val) { - return put_user(val, (unsigned long __user *)arg); + return put_user(val, argp); } -static int put_u64(unsigned long arg, u64 val) +static int put_u64(u64 __user *argp, u64 val) { - return put_user(val, (u64 __user *)arg); + return put_user(val, argp); } #ifdef CONFIG_COMPAT -static int compat_put_ushort(unsigned long arg, unsigned short val) +static int compat_put_long(compat_long_t *argp, long val) { - return put_user(val, (unsigned short __user *)compat_ptr(arg)); + return put_user(val, argp); } -static int compat_put_int(unsigned long arg, int val) +static int compat_put_ulong(compat_ulong_t *argp, compat_ulong_t val) { - return put_user(val, (compat_int_t __user *)compat_ptr(arg)); -} - -static int compat_put_uint(unsigned long arg, unsigned int val) -{ - return put_user(val, (compat_uint_t __user *)compat_ptr(arg)); -} - -static int compat_put_long(unsigned long arg, long val) -{ - return put_user(val, (compat_long_t __user *)compat_ptr(arg)); -} - -static int compat_put_ulong(unsigned long arg, compat_ulong_t val) -{ - return put_user(val, (compat_ulong_t __user *)compat_ptr(arg)); -} - -static int compat_put_u64(unsigned long arg, u64 val) -{ - return put_user(val, (compat_u64 __user *)compat_ptr(arg)); + return put_user(val, argp); } #endif @@ -547,9 +527,10 @@ struct compat_hd_geometry { u32 start; }; -static int compat_hdio_getgeo(struct gendisk *disk, struct block_device *bdev, - struct compat_hd_geometry __user *ugeo) +static int compat_hdio_getgeo(struct block_device *bdev, + struct compat_hd_geometry __user *ugeo) { + struct gendisk *disk = bdev->bd_disk; struct hd_geometry geo; int ret; @@ -603,13 +584,13 @@ static int blkdev_bszset(struct block_device *bdev, fmode_t mode, } /* - * always keep this in sync with compat_blkdev_ioctl() + * Common commands that are handled the same way on native and compat + * user space. Note the separate arg/argp parameters that are needed + * to deal with the compat_ptr() conversion. */ -int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, - unsigned long arg) +static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, + unsigned cmd, unsigned long arg, void __user *argp) { - void __user *argp = (void __user *)arg; - loff_t size; unsigned int max_sectors; switch (cmd) { @@ -632,60 +613,39 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, case BLKFINISHZONE: return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); case BLKGETZONESZ: - return put_uint(arg, bdev_zone_sectors(bdev)); + return put_uint(argp, bdev_zone_sectors(bdev)); case BLKGETNRZONES: - return put_uint(arg, blkdev_nr_zones(bdev->bd_disk)); - case HDIO_GETGEO: - return blkdev_getgeo(bdev, argp); - case BLKRAGET: - case BLKFRAGET: - if (!arg) - return -EINVAL; - return put_long(arg, (bdev->bd_bdi->ra_pages*PAGE_SIZE) / 512); + return put_uint(argp, blkdev_nr_zones(bdev->bd_disk)); case BLKROGET: - return put_int(arg, bdev_read_only(bdev) != 0); - case BLKBSZGET: /* get block device soft block size (cf. BLKSSZGET) */ - return put_int(arg, block_size(bdev)); + return put_int(argp, bdev_read_only(bdev) != 0); case BLKSSZGET: /* get block device logical block size */ - return put_int(arg, bdev_logical_block_size(bdev)); + return put_int(argp, bdev_logical_block_size(bdev)); case BLKPBSZGET: /* get block device physical block size */ - return put_uint(arg, bdev_physical_block_size(bdev)); + return put_uint(argp, bdev_physical_block_size(bdev)); case BLKIOMIN: - return put_uint(arg, bdev_io_min(bdev)); + return put_uint(argp, bdev_io_min(bdev)); case BLKIOOPT: - return put_uint(arg, bdev_io_opt(bdev)); + return put_uint(argp, bdev_io_opt(bdev)); case BLKALIGNOFF: - return put_int(arg, bdev_alignment_offset(bdev)); + return put_int(argp, bdev_alignment_offset(bdev)); case BLKDISCARDZEROES: - return put_uint(arg, 0); + return put_uint(argp, 0); case BLKSECTGET: max_sectors = min_t(unsigned int, USHRT_MAX, queue_max_sectors(bdev_get_queue(bdev))); - return put_ushort(arg, max_sectors); + return put_ushort(argp, max_sectors); case BLKROTATIONAL: - return put_ushort(arg, !blk_queue_nonrot(bdev_get_queue(bdev))); + return put_ushort(argp, !blk_queue_nonrot(bdev_get_queue(bdev))); case BLKRASET: case BLKFRASET: if(!capable(CAP_SYS_ADMIN)) return -EACCES; bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; return 0; - case BLKBSZSET: - return blkdev_bszset(bdev, mode, argp); - case BLKPG: - return blkpg_ioctl(bdev, argp); case BLKRRPART: return blkdev_reread_part(bdev); - case BLKGETSIZE: - size = i_size_read(bdev->bd_inode); - if ((size >> 9) > ~0UL) - return -EFBIG; - return put_ulong(arg, size >> 9); - case BLKGETSIZE64: - return put_u64(arg, i_size_read(bdev->bd_inode)); case BLKTRACESTART: case BLKTRACESTOP: - case BLKTRACESETUP: case BLKTRACETEARDOWN: return blk_trace_ioctl(bdev, cmd, argp); case IOC_PR_REGISTER: @@ -701,12 +661,67 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, case IOC_PR_CLEAR: return blkdev_pr_clear(bdev, argp); default: - return __blkdev_driver_ioctl(bdev, mode, cmd, arg); + return -ENOIOCTLCMD; } } -EXPORT_SYMBOL_GPL(blkdev_ioctl); + +/* + * Always keep this in sync with compat_blkdev_ioctl() + * to handle all incompatible commands in both functions. + * + * New commands must be compatible and go into blkdev_common_ioctl + */ +int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, + unsigned long arg) +{ + int ret; + loff_t size; + void __user *argp = (void __user *)arg; + + switch (cmd) { + /* These need separate implementations for the data structure */ + case HDIO_GETGEO: + return blkdev_getgeo(bdev, argp); + case BLKPG: + return blkpg_ioctl(bdev, argp); + + /* Compat mode returns 32-bit data instead of 'long' */ + case BLKRAGET: + case BLKFRAGET: + if (!argp) + return -EINVAL; + return put_long(argp, (bdev->bd_bdi->ra_pages*PAGE_SIZE) / 512); + case BLKGETSIZE: + size = i_size_read(bdev->bd_inode); + if ((size >> 9) > ~0UL) + return -EFBIG; + return put_ulong(argp, size >> 9); + + /* The data is compatible, but the command number is different */ + case BLKBSZGET: /* get block device soft block size (cf. BLKSSZGET) */ + return put_int(argp, block_size(bdev)); + case BLKBSZSET: + return blkdev_bszset(bdev, mode, argp); + case BLKGETSIZE64: + return put_u64(argp, i_size_read(bdev->bd_inode)); + + /* Incompatible alignment on i386 */ + case BLKTRACESETUP: + return blk_trace_ioctl(bdev, cmd, argp); + default: + break; + } + + ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); + if (ret == -ENOIOCTLCMD) + return __blkdev_driver_ioctl(bdev, mode, cmd, arg); + + return ret; +} +EXPORT_SYMBOL_GPL(blkdev_ioctl); /* for /dev/raw */ #ifdef CONFIG_COMPAT + #define BLKBSZGET_32 _IOR(0x12, 112, int) #define BLKBSZSET_32 _IOW(0x12, 113, int) #define BLKGETSIZE64_32 _IOR(0x12, 114, int) @@ -716,13 +731,13 @@ EXPORT_SYMBOL_GPL(blkdev_ioctl); ENOIOCTLCMD for unknown ioctls. */ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) { - int ret = -ENOIOCTLCMD; + int ret; + void __user *argp = compat_ptr(arg); struct inode *inode = file->f_mapping->host; struct block_device *bdev = inode->i_bdev; struct gendisk *disk = bdev->bd_disk; fmode_t mode = file->f_mode; loff_t size; - unsigned int max_sectors; /* * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have @@ -734,94 +749,44 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) mode &= ~FMODE_NDELAY; switch (cmd) { + /* These need separate implementations for the data structure */ case HDIO_GETGEO: - return compat_hdio_getgeo(disk, bdev, compat_ptr(arg)); - case BLKPBSZGET: - return compat_put_uint(arg, bdev_physical_block_size(bdev)); - case BLKIOMIN: - return compat_put_uint(arg, bdev_io_min(bdev)); - case BLKIOOPT: - return compat_put_uint(arg, bdev_io_opt(bdev)); - case BLKALIGNOFF: - return compat_put_int(arg, bdev_alignment_offset(bdev)); - case BLKDISCARDZEROES: - return compat_put_uint(arg, 0); - case BLKFLSBUF: - case BLKROSET: - case BLKDISCARD: - case BLKSECDISCARD: - case BLKZEROOUT: - /* - * the ones below are implemented in blkdev_locked_ioctl, - * but we call blkdev_ioctl, which gets the lock for us - */ - case BLKRRPART: - case BLKREPORTZONE: - case BLKRESETZONE: - case BLKOPENZONE: - case BLKCLOSEZONE: - case BLKFINISHZONE: - case BLKGETZONESZ: - case BLKGETNRZONES: - return blkdev_ioctl(bdev, mode, cmd, - (unsigned long)compat_ptr(arg)); - case BLKBSZSET_32: - return blkdev_ioctl(bdev, mode, BLKBSZSET, - (unsigned long)compat_ptr(arg)); + return compat_hdio_getgeo(bdev, argp); case BLKPG: - return compat_blkpg_ioctl(bdev, compat_ptr(arg)); + return compat_blkpg_ioctl(bdev, argp); + + /* Compat mode returns 32-bit data instead of 'long' */ case BLKRAGET: case BLKFRAGET: - if (!arg) + if (!argp) return -EINVAL; - return compat_put_long(arg, + return compat_put_long(argp, (bdev->bd_bdi->ra_pages * PAGE_SIZE) / 512); - case BLKROGET: /* compatible */ - return compat_put_int(arg, bdev_read_only(bdev) != 0); - case BLKBSZGET_32: /* get the logical block size (cf. BLKSSZGET) */ - return compat_put_int(arg, block_size(bdev)); - case BLKSSZGET: /* get block device hardware sector size */ - return compat_put_int(arg, bdev_logical_block_size(bdev)); - case BLKSECTGET: - max_sectors = min_t(unsigned int, USHRT_MAX, - queue_max_sectors(bdev_get_queue(bdev))); - return compat_put_ushort(arg, max_sectors); - case BLKROTATIONAL: - return compat_put_ushort(arg, - !blk_queue_nonrot(bdev_get_queue(bdev))); - case BLKRASET: /* compatible, but no compat_ptr (!) */ - case BLKFRASET: - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; - bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; - return 0; case BLKGETSIZE: size = i_size_read(bdev->bd_inode); if ((size >> 9) > ~0UL) return -EFBIG; - return compat_put_ulong(arg, size >> 9); + return compat_put_ulong(argp, size >> 9); + /* The data is compatible, but the command number is different */ + case BLKBSZGET_32: /* get the logical block size (cf. BLKSSZGET) */ + return put_int(argp, bdev_logical_block_size(bdev)); + case BLKBSZSET_32: + return blkdev_bszset(bdev, mode, argp); case BLKGETSIZE64_32: - return compat_put_u64(arg, i_size_read(bdev->bd_inode)); + return put_u64(argp, i_size_read(bdev->bd_inode)); + /* Incompatible alignment on i386 */ case BLKTRACESETUP32: - case BLKTRACESTART: /* compatible */ - case BLKTRACESTOP: /* compatible */ - case BLKTRACETEARDOWN: /* compatible */ - ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg)); - return ret; - case IOC_PR_REGISTER: - case IOC_PR_RESERVE: - case IOC_PR_RELEASE: - case IOC_PR_PREEMPT: - case IOC_PR_PREEMPT_ABORT: - case IOC_PR_CLEAR: - return blkdev_ioctl(bdev, mode, cmd, - (unsigned long)compat_ptr(arg)); + return blk_trace_ioctl(bdev, cmd, argp); default: - if (disk->fops->compat_ioctl) - ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); - return ret; + break; } + + ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); + if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) + ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); + + return ret; } #endif From patchwork Tue Dec 17 22:17:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 181946 Delivered-To: patch@linaro.org Received: by 2002:a92:3001:0:0:0:0:0 with SMTP id x1csp6383347ile; Tue, 17 Dec 2019 14:19:19 -0800 (PST) X-Google-Smtp-Source: APXvYqy52DU3L9I7DiEtkU4CKuzjoPFKAFEn+z3uLPNdtphmnFmKKQFxbFL7Uznw3FHp8ox9sC6Z X-Received: by 2002:a9d:20e4:: with SMTP id x91mr1509846ota.335.1576621159497; Tue, 17 Dec 2019 14:19:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576621159; cv=none; d=google.com; s=arc-20160816; b=shbZrcmHtyP13a7eq4xZAD53/NDy6a1uW3msOX9xaon2SKhtD3TOAP0q4MHyRnrMPf Qrx/S3jZ+PvcatUKJCCxfcKDpPMKymK1AYo0XS6EJiQTeca2tABayDoDoHoDQBwC/X5o L8wPDOR7acfSvcZpTBqpNAVEnERKctP0Qlx+eIL5JMS7TdMDjwLSObktZLZEaY4sCWBh jm2csPxRU7MYFd+1/cwQRCGa/j+fGMLph3dykBqpsWjN+sqb/FBDZIbJk14k7gKOpUfA QcZDRWSVrzFpxPi95l91W1/2bwQLZygYWxSQtlKXhXhm7LiNqxFPGiQXIW/BDX53/KG1 mYlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=QOMJFqpQvVo4DFuBcIN6gRdYmgd9pCEvTEmZxPk1E0U=; b=GuqeZNNjPKvpsS2kaBZ2IAiBhMxhe5plKP/Zg+T1E2XXySiuZCcbcUDkZRFU0j9EyI fhwOYqse27RF1Ra4noeVL/0d5wNOgjlUGuBpfy3dEgCruVCNVGUj9qrS2ZXbgUE3ub9P 3/aermaXkZRGX93iSeL8BKIm/CT74fhWdNm/p+lcmN6J2PsdJKqmW/oFZOxZcRflzHgf B74HSeOvFltm+z9RjHSh9uX4vJqaTOaE9yKw/H6Cb9P84LQTXqXfjR0GaRPb1wan1KAI n8yeXrhAyue/EgqSRcn0Vy4YZIhdo/278TOn28q3awDsnbo1TNcAToVnjxMy5IcB1SFr eIww== 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 l14si452758oii.37.2019.12.17.14.19.16; Tue, 17 Dec 2019 14:19:19 -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 S1727177AbfLQWTP (ORCPT + 27 others); Tue, 17 Dec 2019 17:19:15 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:37289 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726638AbfLQWTL (ORCPT ); Tue, 17 Dec 2019 17:19:11 -0500 Received: from threadripper.lan ([149.172.19.189]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.145]) with ESMTPA (Nemesis) id 1MUXh8-1iGuJ51tR2-00QWZS; Tue, 17 Dec 2019 23:17:35 +0100 From: Arnd Bergmann To: Jens Axboe , "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, Christoph Hellwig , Ben Hutchings , linux-doc@vger.kernel.org, corbet@lwn.net, viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, Arnd Bergmann Subject: [PATCH v2 27/27] Documentation: document ioctl interfaces better Date: Tue, 17 Dec 2019 23:17:08 +0100 Message-Id: <20191217221708.3730997-28-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20191217221708.3730997-1-arnd@arndb.de> References: <20191217221708.3730997-1-arnd@arndb.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:8tW/r52hvfNOEZl1WWrXLsD17pNONxauwO7dPhEDVrEw3kNuL7z IXZZg+A7l6N3v5JfsZS7pQF0AUwC/zif6XF4hJTU/aQ5MqAYz7kCbVw177pXy/zticcsE1s QHqIifY6CcVz4kqmZhRoyPK/Viq1pgVoOnN+j9OGkEb07n14JjBLduBFKbBfxQfgwdITv0N HVu3bO762YQn1UILnHPkQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:A4PK+//HA2s=:Cs4X/p8qr+Ea3Qt18U6i+y T5KG1wqBLjS3dSyhUDAVKuYKUplMefw3WfMHMnDX8vn4+bbG7AcdXkoMsRAo6kd7lsN4GV2JL Ic5i1relVarommCWBIleIXuW/JMmtllCvkpWoHm3JsW28YSw3NYVKMSU9q+X+ZiL6BNSG+FTS JtspZY160vZtCwLXUzXQxqMLUbtKfOgV6hpJlOeFFJGAILNFq/97dXR6ziX3oi9rUfAPSDsc0 3Q32Z0yZt+cHN7Acx9nGtEthkMIZt6xcQ3/Ie94HxRJ/HiRc83vVMoHNUAOmQkM7IUxKFFiht X1mTIfYkXAJkWo/8NjXFQkL3l+yVfUnLz5L2/2z6kwvda+ZkGPchTmQ5F1fG0UYuD02Zyj0qi bbVMRgZIqQcSRNzGvTBvXcfLIJLNVchUZmhTg9Bp9lYPtPAc+2wGsgBfFYYwzxNahxZSqgcsG p+ekXyxHOQ/h9CGfMcDwrxadceo2IOQ2Mpad1e/dHjoRRnuXivWuqLqo80Bq9k55Ov8g98Q1a TZM17zSbQwjkLagkCZFks+0wToa8cUNMZXuFB9Ya32glfx9Dkh2u8ssP/LPRqkwzI6PuUifTO JJBN/6etrjwKWK2nU07RKrnmwmC0MX2bJ90vpO6W4DaQn8ww/iY64FVUzaeEJofEEgpO1jCYt jKXZNslKGyq26H4vrlebtPI/pOAH5LXwTdzfUI0igK5LmuaPP9leobbOPD0o1E9GZSFsEVYC1 CWUrJ6D8Hq8HNO4mUVZkdXd6BLlRzHd2RA44zZoaiiUeDDbKkgvtJPG7XcwS1xraiuL3yNmRD em/9nH/tiZjZZEaTGgpeLT84EWe6rcMs+wF9GDeksl5mMwx4TlYQFKKUfhjkfG6gmS7TiRBDH Faiw4UKM+MW4KL0lqcwQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Documentation/process/botching-up-ioctls.rst was orignally written as a blog post for DRM driver writers, so it it misses some points while going into a lot of detail on others. Try to provide a replacement that addresses typical issues across a wider range of subsystems, and follows the style of the core-api documentation better. Signed-off-by: Arnd Bergmann --- Documentation/core-api/index.rst | 1 + Documentation/core-api/ioctl.rst | 248 +++++++++++++++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 Documentation/core-api/ioctl.rst -- 2.20.0 diff --git a/Documentation/core-api/index.rst b/Documentation/core-api/index.rst index ab0eae1c153a..3f28b2f668be 100644 --- a/Documentation/core-api/index.rst +++ b/Documentation/core-api/index.rst @@ -39,6 +39,7 @@ Core utilities ../RCU/index gcc-plugins symbol-namespaces + ioctl Interfaces for kernel debugging diff --git a/Documentation/core-api/ioctl.rst b/Documentation/core-api/ioctl.rst new file mode 100644 index 000000000000..99892f96c5cb --- /dev/null +++ b/Documentation/core-api/ioctl.rst @@ -0,0 +1,248 @@ +====================== +ioctl based interfaces +====================== + +ioctl() is the most common way for applications to interface +with device drivers. It is flexible and easily extended by adding new +commands and can be passed through character devices, block devices as +well as sockets and other special file descriptors. + +However, it is also very easy to get ioctl command definitions wrong, +and hard to fix them later without breaking existing applications, +so this documentation tries to help developers get it right. + +Command number definitions +========================== + +The command number, or request number, is the second argument passed to +the ioctl system call. While this can be any 32-bit number that uniquely +identifies an action for a particular driver, there are a number of +conventions around defining them. + +``include/uapi/asm-generic/ioctl.h`` provides four macros for defining +ioctl commands that follow modern conventions: ``_IO``, ``_IOR``, +``_IOW``, and ``_IORW``. These should be used for all new commands, +with the correct parameters: + +_IO/_IOR/_IOW/_IOWR + The macro name determines whether the argument is used for passing + data into kernel (_IOW), from the kernel (_IOR), both (_IOWR) or is + not a pointer (_IO). It is possible but not recommended to pass an + integer value instead of a pointer with _IO. + +type + An 8-bit number, often a character literal, specific to a subsystem + or driver, and listed in :doc:`../userspace-api/ioctl/ioctl-number` + +nr + An 8-bit number identifying the specific command, unique for a give + value of 'type' + +data_type + The name of the data type pointed to by the argument, the command number + encodes the ``sizeof(data_type)`` value in a 13-bit or 14-bit integer, + leading to a limit of 8191 bytes for the maximum size of the argument. + Note: do not pass sizeof(data_type) type into _IOR/IOW, as that will + lead to encoding sizeof(sizeof(data_type)), i.e. sizeof(size_t). + + +Interface versions +================== + +Some subsystems use version numbers in data structures to overload +commands with different interpretations of the argument. + +This is generally a bad idea, since changes to existing commands tend +to break existing applications. + +A better approach is to add a new ioctl command with a new number. The +old command still needs to be implemented in the kernel for compatibility, +but this can be a wrapper around the new implementation. + +Return code +=========== + +ioctl commands can return negative error codes as documented in errno(3), +these get turned into errno values in user space. On success, the return +code should be zero. It is also possible but not recommended to return +a positive 'long' value. + +When the ioctl callback is called with an unknown command number, the +handler returns either -ENOTTY or -ENOIOCTLCMD, which also results in +-ENOTTY being returned from the system call. Some subsystems return +-ENOSYS or -EINVAL here for historic reasons, but this is wrong. + +Prior to Linux-5.5, compat_ioctl handlers were required to return +-ENOIOCTLCMD in order to use the fallback conversion into native +commands. As all subsystems are now responsible for handling compat +mode themselves, this is no longer needed, but it may be important to +consider when backporting bug fixes to older kernels. + +Timestamps +========== + +Traditionally, timestamps and timeout values are passed as ``struct +timespec`` or ``struct timeval``, but these are problematic because of +incompatible definitions of these structures in user space after the +move to 64-bit time_t. + +The __kernel_timespec type can be used instead to be embedded in other +data structures when separate second/nanosecond values are desired, +or passed to user space directly. This is still not ideal though, +as the structure matches neither the kernel's timespec64 nor the user +space timespec exactly. The get_timespec64() and put_timespec64() helper +functions can be used to ensure that the layout remains compatible with +user space and the padding is treated correctly. + +As it is cheap to convert seconds to nanoseconds, but the opposite +requires an expensive 64-bit division, a simple __u64 nanosecond value +can be simpler and more efficient. + +Timeout values and timestamps should ideally use CLOCK_MONOTONIC time, +as returned by ktime_get_ns() or ktime_get_ts64(). Unlike +CLOCK_REALTIME, this makes the timestamps immune from jumping backwards +or forwards due to leap second adjustments and clock_settime() calls. + +ktime_get_real_ns() can be used for CLOCK_REALTIME timestamps that +need to be persistent across a reboot or between multiple machines. + +32-bit compat mode +================== + +In order to support 32-bit user space running on a 64-bit machine, each +subsystem or driver that implements an ioctl callback handler must also +implement the corresponding compat_ioctl handler. + +As long as all the rules for data structures are followed, this is as +easy as setting the .compat_ioctl pointer to a helper function such as +compat_ptr_ioctl() or blkdev_compat_ptr_ioctl(). + +compat_ptr() +------------ + +On the s/390 architecture, 31-bit user space has ambiguous representations +for data pointers, with the upper bit being ignored. When running such +a process in compat mode, the compat_ptr() helper must be used to +clear the upper bit of a compat_uptr_t and turn it into a valid 64-bit +pointer. On other architectures, this macro only performs a cast to a +``void __user *`` pointer. + +In an compat_ioctl() callback, the last argument is an unsigned long, +which can be interpreted as either a pointer or a scalar depending on +the command. If it is a scalar, then compat_ptr() must not be used, to +ensure that the 64-bit kernel behaves the same way as a 32-bit kernel +for arguments with the upper bit set. + +The compat_ptr_ioctl() helper can be used in place of a custom +compat_ioctl file operation for drivers that only take arguments that +are pointers to compatible data structures. + +Structure layout +---------------- + +Compatible data structures have the same layout on all architectures, +avoiding all problematic members: + +* ``long`` and ``unsigned long`` are the size of a register, so + they can be either 32-bit or 64-bit wide and cannot be used in portable + data structures. Fixed-length replacements are ``__s32``, ``__u32``, + ``__s64`` and ``__u64``. + +* Pointers have the same problem, in addition to requiring the + use of compat_ptr(). The best workaround is to use ``__u64`` + in place of pointers, which requires a cast to ``uintptr_t`` in user + space, and the use of u64_to_user_ptr() in the kernel to convert + it back into a user pointer. + +* On the x86-32 (i386) architecture, the alignment of 64-bit variables + is only 32-bit, but they are naturally aligned on most other + architectures including x86-64. This means a structure like:: + + struct foo { + __u32 a; + __u64 b; + __u32 c; + }; + + has four bytes of padding between a and b on x86-64, plus another four + bytes of padding at the end, but no padding on i386, and it needs a + compat_ioctl conversion handler to translate between the two formats. + + To avoid this problem, all structures should have their members + naturally aligned, or explicit reserved fields added in place of the + implicit padding. + +* On ARM OABI user space, 16-bit member variables have 32-bit + alignment, making them incompatible with modern EABI kernels. + Conversely, on the m68k architecture, struct members are not + guaranteed to have an alignment greater than 16-bit. + These rarely cause problems as neither ARM-OABI nor m68k are + supported by any compat mode, but for consistency, it is best + to completely avoid 16-bit member variables. + + +* Bitfields and enums generally work as one would expect them to, + but some properties of them are implementation-defined, so it is better + to avoid them completely in ioctl interfaces. + +* ``char`` members can be either signed or unsigned, depending on + the architecture, so the __u8 and __s8 types should be used for 8-bit + integer values, though char arrays are clearer for fixed-length strings. + +Information leaks +================= + +Uninitialized data must not be copied back to user space, as this can +cause an information leak, which can be used to defeat kernel address +space layout randomization (KASLR), helping in an attack. + +As explained for the compat mode, it is best to not avoid any implicit +padding in data structures, but if there is already padding in existing +structures, the kernel driver must be careful to zero out the padding +using memset() or similar before copying it to user space. + +Subsystem abstractions +====================== + +While some device drivers implement their own ioctl function, most +subsystems implement the same command for multiple drivers. Ideally the +subsystem has an .ioctl() handler that copies the arguments from and +to user space, passing them into subsystem specific callback functions +through normal kernel pointers. + +This helps in various ways: + +* Applications written for one driver are more likely to work for + another one in the same subsystem if there are no subtle differences + in the user space ABI. + +* The complexity of user space access and data structure layout is done + in one place, reducing the potential for implementation bugs. + +* It is more likely to be reviewed by experienced developers + that can spot problems in the interface when the ioctl is shared + between multiple drivers than when it is only used in a single driver. + +Alternatives to ioctl +===================== + +There are many cases in which ioctl is not the best solution for a +problem. Alternatives include: + +* System calls are a better choice for a system-wide feature that + is not tied to a physical device or constrained by the file system + permissions of a character device node + +* netlink is the preferred way of configuring any network related + objects through sockets. + +* debugfs is used for ad-hoc interfaces for debugging functionality + that does not need to be exposed as a stable interface to applications. + +* sysfs is a good way to expose the state of an in-kernel object + that is not tied to a file descriptor. + +* configfs can be used for more complex configuration than sysfs + +* A custom file system can provide extra flexibility with a simple + user interface but add a lot of complexity to the implementation.