Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp3980327ybe; Mon, 9 Sep 2019 02:10:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqyBfZ40bCaancgxTr5veXjsZpEeS9jkzKGVy+1UV5AGdtRkgq7reZrv1S/Mdbs5I/8vD0Ih X-Received: by 2002:a17:906:5299:: with SMTP id c25mr1750888ejm.64.1568020249945; Mon, 09 Sep 2019 02:10:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568020249; cv=none; d=google.com; s=arc-20160816; b=LwyzlIZpUa0loVOEGYUhQWZcLfFQZGQR+dmE2WCChjjKTa84rdDuGTbvV3S4GK/TEV Zp9eGugc7bFeIBx+GT/s5/e0aGrZuU13TSZ7/fbPGLsJ3oCJZiMnHqqOIR0+RQYYiG7G Kair9EuPr2wPwSAagutJoajhuDcVd9IGWQ12Ae/qYcUtfz7sjEXFnNoAwlj25BepcAI7 hJEGvUBt0Ec9ngvUMEacNoSCDeYrfumF6i4afS72cu7bu5VdpZm3UJLuDSjHwX9TCs5z YlNFA4+CvWkZ7GTStKtEoaTH/0yGGQCRpq7xJJ6xO4NU08iG/06k47fSA6j/nzu+p0Oe GuCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:message-id :in-reply-to:date:references:subject:cc:to:from; bh=iVObUfFc3dFbFVUlmMjKijgfnl3hZFqQekwHhwmzH4I=; b=WoJLq+Y302vokvYOw15lS73GguK4TC0ntjdAkyHbvW13R/R9tnLx9cfDBOKhJK1X8I dp2gOtaUI/ADTqppTLET9vFGfe7xbRxeH7PgqbG9dVxjP+ObBuuy9vGJcuFfS0Z5jPFb 0qmATJNY1oWR/yLRLGcwLOGAhQy5XaZ8fdaBson13mAAI3ZzLealYAYGlGW0prkYRhGD 0EhINMcg+pv8Et6LSX4tKzXaKhoKx829d2ejm5WKU0rG4IqOs08rS0FeFb32B5XhqdCb IsxFFOtLd8fKsBsbXF9TftIabuC5PvsuS3hUC2TbNoisLt/jwL2rsMgVI67A4HPvGPha rArA== 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 n2si6769482ejy.35.2019.09.09.02.10.24; Mon, 09 Sep 2019 02:10:49 -0700 (PDT) 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 S1728145AbfIHKUy (ORCPT + 99 others); Sun, 8 Sep 2019 06:20:54 -0400 Received: from mail.parknet.co.jp ([210.171.160.6]:41980 "EHLO mail.parknet.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726186AbfIHKUx (ORCPT ); Sun, 8 Sep 2019 06:20:53 -0400 Received: from ibmpc.myhome.or.jp (server.parknet.ne.jp [210.171.168.39]) by mail.parknet.co.jp (Postfix) with ESMTPSA id 09FB615CBF0; Sun, 8 Sep 2019 19:20:52 +0900 (JST) Received: from devron.myhome.or.jp (foobar@devron.myhome.or.jp [192.168.0.3]) by ibmpc.myhome.or.jp (8.15.2/8.15.2/Debian-14) with ESMTPS id x88AKoOj022349 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Sun, 8 Sep 2019 19:20:51 +0900 Received: from devron.myhome.or.jp (foobar@localhost [127.0.0.1]) by devron.myhome.or.jp (8.15.2/8.15.2/Debian-14) with ESMTPS id x88AKoLY011844 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Sun, 8 Sep 2019 19:20:50 +0900 Received: (from hirofumi@localhost) by devron.myhome.or.jp (8.15.2/8.15.2/Submit) id x88AKnVe011843; Sun, 8 Sep 2019 19:20:49 +0900 From: OGAWA Hirofumi To: Jan Stancek Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH] fat: fix corruption in fat_alloc_new_dir() References: Date: Sun, 08 Sep 2019 19:20:49 +0900 In-Reply-To: (Jan Stancek's message of "Tue, 3 Sep 2019 01:59:36 +0200") Message-ID: <87v9u3xf5q.fsf@mail.parknet.co.jp> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Jan Stancek writes: > sb_getblk does not guarantee that buffer_head is uptodate. If there is > async read running in parallel for same buffer_head, it can overwrite > just initialized msdos_dir_entry, leading to corruption: > FAT-fs (loop0): error, corrupted directory (invalid entries) > FAT-fs (loop0): Filesystem has been set read-only > > This can happen for example during LTP statx04, which creates loop > device, formats it (mkfs.vfat), mounts it and immediately creates > a new directory. In parallel, systemd-udevd is probing new block > device, which leads to async read. > > do_mkdirat ksys_read > vfs_mkdir vfs_read > vfat_mkdir __vfs_read > fat_alloc_new_dir new_sync_read > /* init de[0], de[1] */ blkdev_read_iter > generic_file_read_iter > generic_file_buffered_read > blkdev_readpage > block_read_full_page > > Faster reproducer (based on LTP statx04): > > int main(void) > { > int i, j, ret, fd, loop_fd, ctrl_fd; > int loop_num; > char loopdev[256], tmp[256], testfile[256]; > > mkdir("/tmp/mntpoint", 0777); > for (i = 0; ; i++) { > printf("Iteration: %d\n", i); > sprintf(testfile, "/tmp/test.img.%d", getpid()); > > ctrl_fd = open("/dev/loop-control", O_RDWR); > loop_num = ioctl(ctrl_fd, LOOP_CTL_GET_FREE); > close(ctrl_fd); > sprintf(loopdev, "/dev/loop%d", loop_num); > > fd = open(testfile, O_WRONLY|O_CREAT|O_TRUNC, 0600); > fallocate(fd, 0, 0, 256*1024*1024); > close(fd); > > fd = open(testfile, O_RDWR); > loop_fd = open(loopdev, O_RDWR); > ioctl(loop_fd, LOOP_SET_FD, fd); > close(loop_fd); > close(fd); > > sprintf(tmp, "mkfs.vfat %s", loopdev); > system(tmp); > mount(loopdev, "/tmp/mntpoint", "vfat", 0, NULL); > > for (j = 0; j < 200; j++) { > sprintf(tmp, "/tmp/mntpoint/testdir%d", j); > ret = mkdir(tmp, 0777); > if (ret) { > perror("mkdir"); > break; > } > } > > umount("/tmp/mntpoint"); > loop_fd = open(loopdev, O_RDWR); > ioctl(loop_fd, LOOP_CLR_FD, fd); > close(loop_fd); > unlink(testfile); > > if (ret) > break; > } > > return 0; > } > > Issue triggers within minute on HPE Apollo 70 (arm64, 64GB RAM, 224 CPUs). Using the device while mounting same device doesn't work reliably like this race. (getblk() is intentionally used to get the buffer to write new data.) mount(2) internally opens the device by EXCL mode, so I guess udev opens without EXCL (I dont know if it is intent or not). Thanks. -- OGAWA Hirofumi