Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp3672388ybh; Tue, 17 Mar 2020 04:32:21 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtsLqNX/8lmmcBtaidDZUKS2toShk71803Z3Z6lmdSXceB0Wqe94kqE4mrIZxCmS1MVKjqq X-Received: by 2002:a05:6830:1581:: with SMTP id i1mr3033922otr.349.1584444741071; Tue, 17 Mar 2020 04:32:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1584444741; cv=none; d=google.com; s=arc-20160816; b=BdoY/bi98xMAAg9AvksbTEUGr/b2332FDf3URMIuhHxebqsLAQeWPi77y9c6U4paSo DlQh5RsVYSnDIE7dmpNTKtfP6h810HYWEF9TZNeFMGCc3ubPvYa6/4jfuh9qEyLP/zNl XHYXSdIVBf19hkeRwNJz4tb28bZm7HusZXE2tJt917BweqqSeN1HGYGjeG1YHLNG+D4h Fxi7eikzqpPmcsUbZqo+Qu0ZycTPC10eLo2jkbXt9j2H8IUrLv8RRwI7HtVWdU/EnnD/ k1ZWraIoVe6HySBJo9GtLZ1EC4vZuFJhoB+Wq5w/L4Fmdxs74BxZ9Hr3wZ5UXC12oDeI MhWw== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=WmJlBqTMa5CmdiFIToGjODDNiC8IWRj11NilEIEtQyE=; b=h/kbOZiF6vh+jIdUX5qMkemEFK9wlRzvVIL9jRmYURPE9uDWsaE4Mocgo3U8i8f1Jw /OnVOvbZzvZm8OswS0a4vEHhpxLM38IMDZL+1mhXdv7vzjBBMVPItBtYdnV8AXY3o6aE 2WkU4ONYYO8D691AZRf8O8Ci6/ILB5BLfKCiwJXOUpm24fK2aQOAnBETYXn8syJWHy1J Ah8S4LIrBYHx2V7QElht31gu3MZLQdJdf6yRX0batAPOq13VmYSnNwM3YqP8anHIw+ul DjabMjaBnMi/oTgUfd5krRGnT0A67P2HAKKVlqfciP8Y46Gqp59YA1cC6/pbLpVM6/Q4 68iA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=F+QLlWXH; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s21si1643515otp.225.2020.03.17.04.32.02; Tue, 17 Mar 2020 04:32:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=F+QLlWXH; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726132AbgCQLb7 (ORCPT + 99 others); Tue, 17 Mar 2020 07:31:59 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:45164 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725794AbgCQLb7 (ORCPT ); Tue, 17 Mar 2020 07:31:59 -0400 Received: by mail-lj1-f194.google.com with SMTP id y17so1153852ljk.12 for ; Tue, 17 Mar 2020 04:31:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=WmJlBqTMa5CmdiFIToGjODDNiC8IWRj11NilEIEtQyE=; b=F+QLlWXHueXk9FIie+nFx5HGLWeGdYJkP1o+weY4/OE7tGYvjaycevNwN888rlgn8/ nTLBUXpuzAe/IDou25ef/q2vc4WvRwwug6YUdLnhfXfZVDS8027fcl7ELowhrgXoSEtY KB/HU3ypUqaJZR6sLIjBk22EL59kT6FsLYCgoS79hCVnV/7uXK3bACbOAImWiQ5zfDmV OlqVjFhQ0dUs97Wu5f1FzjrVVB4iciokJnoUKu5vXptLshhJeBCg7P7kDhQ349KTiC7w /97l8ecM3Q9N+M80A4VduEj/zPXxW7kDiUmHHsoK/FaHIwVXsqo7l7hu1VHHRoZeT6xI r3Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=WmJlBqTMa5CmdiFIToGjODDNiC8IWRj11NilEIEtQyE=; b=kFy0Y+uqCGLHfx7HLvEuC7qdMkGI92Pd+1yk0e+0mhKWdmue0YP6xx+dkDKh+yVef+ iryNrGplFbcPZhpSZb/AgMG0lGi4KlgMcdjYTGlmKYM11nRhZwyTzewqFmMBBccvZmn9 ucpCwAAM8YeUD7G7K+6K32bkS7grvIPW9XCnCYfRMFs6STm8MZgPKrdgmYIcIIiURYhJ 3HgA8NqxqDna+rqFK6/YedkA+sZzE6Key9Y8/GicpxJzOlbJOZxVqYCltVOCn2lxBAIC JfIWgSptfNIEea74sHMfkj4tOfCg4P2A2YHWUPJpwUSMIKyrrtfEkXda7AEWqV+T+eWB fmTw== X-Gm-Message-State: ANhLgQ3MwTQH87sdoZZMSkv4nkyTcEbxB/lfAfX0fpxrFoNRyGVR+Dzb HcJu6SvHAVqC4KOeqa9Shisd/w== X-Received: by 2002:a2e:9804:: with SMTP id a4mr500667ljj.180.1584444717157; Tue, 17 Mar 2020 04:31:57 -0700 (PDT) Received: from genomnajs.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id a18sm2105691ljn.85.2020.03.17.04.31.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2020 04:31:56 -0700 (PDT) From: Linus Walleij To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, qemu-devel@nongnu.org, Linus Walleij , Florian Weimer , Peter Maydell , Andy Lutomirski , stable@vger.kernel.org Subject: [PATCH] ext4: Give 32bit personalities 32bit hashes Date: Tue, 17 Mar 2020 12:31:53 +0100 Message-Id: <20200317113153.7945-1-linus.walleij@linaro.org> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org It was brought to my attention that this bug from 2018 was still unresolved: 32 bit emulators like QEMU were given 64 bit hashes when running 32 bit emulation on 64 bit systems. The personality(2) system call supports to let processes indicate that they are 32 bit Linux to the kernel. This was suggested by Teo in the original thread, so I just wired it up and it solves the problem. Programs that need the 32 bit hash only need to issue the personality(PER_LINUX32) call and things start working. I made a test program like this: #include #include #include #include #include #include int main(int argc, char** argv) { DIR* dir; personality(PER_LINUX32); dir = opendir("/boot"); printf("dir=%p\n", dir); printf("readdir(dir)=%p\n", readdir(dir)); printf("errno=%d: %s\n", errno, strerror(errno)); return 0; } This was compiled with an ARM32 toolchain from Bootlin using glibc 2.28 and thus suffering from the bug. Before the patch: $ ./readdir-bug dir=0x86000 readdir(dir)=(nil) errno=75: Value too large for defined data type After the patch: $ ./readdir-bug dir=0x86000 readdir(dir)=0x86020 errno=0: Success Problem solved. Cc: Florian Weimer Cc: Peter Maydell Cc: Andy Lutomirski Cc: stable@vger.kernel.org Suggested-by: Theodore Ts'o Link: https://bugs.launchpad.net/qemu/+bug/1805913 Link: https://lore.kernel.org/lkml/87bm56vqg4.fsf@mid.deneb.enyo.de/ Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=205957 Signed-off-by: Linus Walleij --- fs/ext4/dir.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 9aa1f75409b0..3faf9edf3e92 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "ext4.h" #include "xattr.h" @@ -618,6 +619,14 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx) static int ext4_dir_open(struct inode * inode, struct file * filp) { + /* + * If we are currently running e.g. a 32 bit emulator on + * a 64 bit machine, the emulator will indicate that it needs + * a 32 bit personality and thus 32 bit hashes from the file + * system. + */ + if (personality(current->personality) == PER_LINUX32) + filp->f_mode |= FMODE_32BITHASH; if (IS_ENCRYPTED(inode)) return fscrypt_get_encryption_info(inode) ? -EACCES : 0; return 0; -- 2.24.1