Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2341092ybl; Sat, 1 Feb 2020 19:39:16 -0800 (PST) X-Google-Smtp-Source: APXvYqzfeTUCpxTljXKZeg6h+fThUHyHViug+PQcamDrlonT7neavMuBj7k1NMhFnDATqan8pDJH X-Received: by 2002:a9d:d06:: with SMTP id 6mr13455540oti.176.1580614756732; Sat, 01 Feb 2020 19:39:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580614756; cv=none; d=google.com; s=arc-20160816; b=y3Gi/JE6Cbk4DxQMPyhZCAV3emonHvPN2KSps7aGTezESNDnt3CBjSr96frda/GpGl R0ZlAnEFkqy3AwfrImeGveDhnBOLkiYeGTU+rwl1sRY2NMK8nqf23ueagbo+cVj5cH0u sf3CHvRa+0oQsnTUoCWGTMBHfEuWFBUrj0oCN3cindFA+YzxXx6x/gU7eptlzqeRWJFF XEAbNOx1BZTf6IGaNwrUglLVfZiwckcnfkdEBmdZPpJoAO7sh/v6lycnyDAPi5m4h94P hKf/kNQOiPhOUAHaimlBN4eKpAeDD3274qFrmF2u7mlpJcZ3YbK3XLU81jQXg3JSaHhQ /QMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=Un97QVjjkKz5RYqKD+8syS/5qdIxvzeivXj5BxZyhxA=; b=FH62lOfNWRCDbJ326a0q2sgoFh+9sZAU0EO4pT09ix8jICBk7dcyaUb4TR93Ca8r/S 66lVoha+v/qNabv8bJ3Ev1SIATK5zxXJE45488lqHoCE1y1Tfg/2W62mubl9/BbGHcH5 9fJ4JEU4yogxuXwhxqIlQESP2i8RiPF/Cml+w+P5jrwOP0cNB6JpL2yPIEWMQ3AkRyxG zAofEXgMavvaD3vbLlqAZ2rzhkZ27CiFso3SwG3nmB6VQnaY7mryqKDMgvA5YS6rU2U6 yEVkVUCY/ER/BIj8AOL16fGVpRqj3wgJm3DObZz3kvFiaV3AQPCvq35/3k/TdPufn74Q r1WQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=njCjYDWl; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q131si5966385oig.203.2020.02.01.19.38.30; Sat, 01 Feb 2020 19:39:16 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=njCjYDWl; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726837AbgBBDey (ORCPT + 99 others); Sat, 1 Feb 2020 22:34:54 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:39663 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726793AbgBBDey (ORCPT ); Sat, 1 Feb 2020 22:34:54 -0500 Received: by mail-pg1-f195.google.com with SMTP id 4so5842261pgd.6; Sat, 01 Feb 2020 19:34:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Un97QVjjkKz5RYqKD+8syS/5qdIxvzeivXj5BxZyhxA=; b=njCjYDWlLN/2aDGYbXpl8lEiyKRxphgrBmGsspXsHoqtvbaXvdFsCfAGYrNU5jBbvg ZvGshXAKB/eqXXXq/7YHcN/DWsAMWew1KxQSQG7nM1hD4zHW7AY+W7AR5exkx+k8BES1 /402oeBlTjh/7vEHsCyOCY9lSSxwZNt5Rtp38y9Id/lChQ6ZNDZZ1r2FTHYbMGK/O1av 5regFILDlPNqt0i7YNOt8tm7Xk5QGb+dmkx5GOCkT0izlsY0i/qbjo8si4zafuYJgNBJ ujPWFqqiMQWHCBoIGclEA9L3TzoHeSGJp5LQgmsCvTJcO8WX4A/XPFj9mH9absOqXXnO y0Tw== 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; bh=Un97QVjjkKz5RYqKD+8syS/5qdIxvzeivXj5BxZyhxA=; b=qhVXQfSQjMwf6vEHYEwxshE6LDU/HAXnAWvIeSvvI/PhzK7wx5oRLTITHEJD5GU0Wl Ix/985kPEGmfVIyX+kWyk3yKxBxLzH7F7hFpWMZHpzkbjfBeJfNwSKDHPeFAzSFz0tSW 3K9jeG1rwhMsguCaVmD8HPwsQiBYAfnzl/2LOsaBwJMTnmPxE3tYjcoEsLG56AHzJeGK h7xQ4KMy+lPeSTmAiVb5SIfq/XoH1gEyNW4TLRw+xRKUFBIAvCrfCW4wi9DWcDuCFq+f DUwwx2LoX92nuaIap2/RjVn6JozXQ1UHhoZV1iM0cONOv3ZrnYOwPMs81H4xPmf5iFWR 2nTw== X-Gm-Message-State: APjAAAXGT+R+tYPgRF7lpeQklVMBUK3erZcVFCZoaHlxcu4CR3w02Hhz al1eLfdHgvW+N5NxO8hUDKI= X-Received: by 2002:a63:3154:: with SMTP id x81mr7536795pgx.32.1580614493415; Sat, 01 Feb 2020 19:34:53 -0800 (PST) Received: from localhost ([43.224.245.179]) by smtp.gmail.com with ESMTPSA id f43sm15572800pje.23.2020.02.01.19.34.52 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sat, 01 Feb 2020 19:34:52 -0800 (PST) From: qiwuchen55@gmail.com To: miklos@szeredi.hu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, chenqiwu Subject: [PATCH] fuse: Allow parallel DIO reads and check NOWAIT case for DIO writes Date: Sun, 2 Feb 2020 11:34:47 +0800 Message-Id: <1580614487-1341-1-git-send-email-qiwuchen55@gmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: chenqiwu Earlier there was no shared lock in DIO read path. But this patch (16c54688592ce: ext4: Allow parallel DIO reads) simplified some of the locking mechanism while still allowing for parallel DIO reads by adding shared lock in inode DIO read path. Add NOWAIT check at the start of cache writes, because an aio request with IOCB_NOWAIT could block when we call inode_lock(), which is not allowed. Change current rwsem code of direct write to do the trylock for the IOCB_NOWAIT case, otherwise lock for real scheme. Signed-off-by: chenqiwu --- fs/fuse/file.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index ce71538..4fcf492 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1263,6 +1263,9 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from) ssize_t err; loff_t endbyte = 0; + if (iocb->ki_flags & IOCB_NOWAIT) + return -EOPNOTSUPP; + if (get_fuse_conn(inode)->writeback_cache) { /* Update size (EOF optimization) and mode (SUID clearing) */ err = fuse_update_attributes(mapping->host, file); @@ -1432,11 +1435,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, ia->io = io; if (!cuse && fuse_range_is_writeback(inode, idx_from, idx_to)) { - if (!write) - inode_lock(inode); fuse_sync_writes(inode); - if (!write) - inode_unlock(inode); } io->should_dirty = !write && iter_is_iovec(iter); @@ -1510,6 +1509,14 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io, static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) { ssize_t res; + struct inode *inode = file_inode(iocb->ki_filp); + + if (iocb->ki_flags & IOCB_NOWAIT) { + if (!inode_trylock_shared(inode)) + return -EAGAIN; + } else { + inode_lock_shared(inode); + } if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { res = fuse_direct_IO(iocb, to); @@ -1518,6 +1525,9 @@ static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) res = __fuse_direct_read(&io, to, &iocb->ki_pos); } + inode_unlock_shared(inode); + + file_accessed(iocb->ki_filp); return res; } @@ -1529,7 +1539,13 @@ static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) ssize_t res; /* Don't allow parallel writes to the same file */ - inode_lock(inode); + if (iocb->ki_flags & IOCB_NOWAIT) { + if (!inode_trylock(inode)) + return -EAGAIN; + } else { + inode_lock(inode); + } + res = generic_write_checks(iocb, from); if (res > 0) { if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) { -- 1.9.1