From nobody Mon Jun 8 08:28:41 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7DFA379996 for ; Sat, 30 May 2026 22:20:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780179610; cv=none; b=U+O0fzRBtkDA8W08JvsKs8P9uFt/BGm/VBXFyrzG/30PtngJgefjsf8wxHe38WO59V9kKD5LMz7cxzEUAsIYmJq/EHrznl9nBfCpmCUOAKq2sltj+hDrRUjJJEpeQ3iQIgRdvYmXfuybuFoI9y0eZUVCNDTs/leLINrMx7cBf80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780179610; c=relaxed/simple; bh=fXiH8h7PEvwaHD4dyUu+ol+a5g1XNap+MJztQQxaw6g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZwxLCRxRi11uWXZsXJS/9Enq8+5Xl55kE9GGURDQW8RuGEAW0HhUjyqO6cdlVvnd9rf7McsX/JmyHbWKmH7b7kCytlEJJBAxOqAe0Mqp3nk/EoJOnC8/yoEpHHWDtw6j9CLrFcRr3NA8E03TQ3JxXOoRCeGKSQveSWTNoRkpmvw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GPq5gxhV; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GPq5gxhV" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-45f3cf907ceso213942f8f.2 for ; Sat, 30 May 2026 15:20:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780179607; x=1780784407; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gRFbpWDbRDz2hKuWATKrH2KKYigHlPqpASSyCuCCDYY=; b=GPq5gxhVlm9YIJHjdmYhTzupiSsKiq8J8wNYnMPM4Py9PoeUPb0StlZZ/JwWOBU/VN Q6TzuNtyS7uvm6ilHSQdKgvADYYKejGJzNl/m3GKKa93halpCta6rhwUsZ+pAkpMU4Sd cI7w4yfCArHTj6sJhvvUiil44eH1iSzqLdz73RcTR7+k6is/I8iiLuT2h6ma2L6cF1YR 7F9z1Xi4spd2AnLTRi7GxICXBs1Ert6BIbrLPlc/945a/Dghch+NWtlWNnlge7OHXqoU DzusABHQHDJgdJgjZKELQM43vhx5rxQlmOZmThFujpuZOlEmHnukZtWB349t3vTq+HIR ZomQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780179607; x=1780784407; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gRFbpWDbRDz2hKuWATKrH2KKYigHlPqpASSyCuCCDYY=; b=c8RtcrgK9OS16V8okZygvoYKRlzTBtfT6rmVQlg6+5tS90h/Nhpj1abvkpxHe6OVIT vrTiFIXuJlCzjjAywtpP5pBcUhBJAWE7/p+zSBDKQiLbGweJ7dDYaipcn5Td56aI+GoY zA2qELUl9ws5rRoEmImlIZFfQLdb+5OHWt4vssiFiNNfv5enrBV9nimYCnYVktrCbrOJ FCQ2Faiil8MFIPiiYPtiTsfbZYqoDwnQqDYbT9yfcdzTn79oJLZpFVDNbl8/pmLdVxYU +GZTIjN4P/Ti6cMo8V3HMZLLdlK7Z+riYa/zhI6C7vA/ZI7/wJlLmH2mA8L3aakuzsO9 E/9A== X-Forwarded-Encrypted: i=1; AFNElJ+bP6oD8IISgEKQLOYL1uDJXWNjiWohsNwbR4HaFTt0WZUohyv4qe1nv/WIkW4LB2EFwm2JH47ehvW7vh4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8vgXL1+LmVCYGAjVTlj5yW4PA8y8zoSGEWpvgiW/ZJzK4SAC4 KGJypch0gnQU6VSc7WSa8zLEtntoJRbgWnRdaCUhqP5S9vsgDBY3Xe8C X-Gm-Gg: Acq92OH3Ttu5eM6j67N+76kRqQHEt5rN86C5l5PduMiRxhXK1qvxfsgbgmUR/i1+ZZb lGuGQecygFDo67+ur7Zo3H8OsJwy+wBLaKGQTAm+4NEmJs6xDRmpz+096ttHoxc+2vn2BtHdGQp 4H2DEgD2kgcVqR1k+Y/K5pp95chZeWpXxaFpLuGAu0tbP9LUHTXa+3+cOm7DOBQYmsDmQSZundZ ulG0ui2ejjvcuTWkoSuqey8VZAlJMR23Vw+Aonlz3ARFxobWXcNOaZ8SSNm5c5nL5//yZjwRGQx v5qaIQ8VzWBbk7Hy7yVBQ/HD5lnFKxB/gAdOcKBP6UyKClPD+iLCQQa4iMv9Y1NN5GLIgojZ+OM IyAbxz4JdPFf56Ku2mUcFUqYof8kU3jM/XMPgk46Cv5bWt7CpcQnv4JKOV9VAG8tdXXFVmkp7tN ikygzdfxdvqRbeXf5BAnuxGXA2kRG84hvb+/dLpV+ONv+A2BGYIufT X-Received: by 2002:a5d:4b04:0:b0:43c:fa96:d939 with SMTP id ffacd0b85a97d-45ef6b5b49dmr6538243f8f.22.1780179607132; Sat, 30 May 2026 15:20:07 -0700 (PDT) Received: from puck (234.243.199.146.dyn.plus.net. [146.199.243.234]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45ef354cd7csm13443784f8f.18.2026.05.30.15.20.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 May 2026 15:20:06 -0700 (PDT) From: Dylan Yudaken To: trondmy@kernel.org, anna@kernel.org, linux-nfs@vger.kernel.org Cc: axboe@kernel.dk, io-uring@vger.kernel.org, linux-kernel@vger.kernel.org, Dylan Yudaken Subject: [PATCH 1/2] nfs: add nowait version of nfs_start_io_direct Date: Sat, 30 May 2026 23:19:46 +0100 Message-ID: <20260530221947.49518-2-dyudaken@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260530221947.49518-1-dyudaken@gmail.com> References: <20260530221947.49518-1-dyudaken@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" nfs_start_io_direct might block on existing operations to the same inode. In order to support NOWAIT O_DIRECT reads, add a non-blocking version of this nfs_start_io_direct that just returns -EAGAIN if locks could not be taken. Signed-off-by: Dylan Yudaken --- fs/nfs/internal.h | 1 + fs/nfs/io.c | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 18d46b0e71dd..0c9aca624353 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -532,6 +532,7 @@ extern void nfs_end_io_read(struct inode *inode); extern __must_check int nfs_start_io_write(struct inode *inode); extern void nfs_end_io_write(struct inode *inode); extern __must_check int nfs_start_io_direct(struct inode *inode); +extern __must_check int nfs_start_io_direct_nowait(struct inode *inode); extern void nfs_end_io_direct(struct inode *inode); =20 static inline bool nfs_file_io_is_buffered(struct nfs_inode *nfsi) diff --git a/fs/nfs/io.c b/fs/nfs/io.c index 8337f0ae852d..f359a19f7879 100644 --- a/fs/nfs/io.c +++ b/fs/nfs/io.c @@ -101,12 +101,15 @@ nfs_end_io_write(struct inode *inode) EXPORT_SYMBOL_GPL(nfs_end_io_write); =20 /* Call with exclusively locked inode->i_rwsem */ -static void nfs_block_buffered(struct nfs_inode *nfsi, struct inode *inode) +static int nfs_block_buffered(struct nfs_inode *nfsi, struct inode *inode,= bool nowait) { if (!test_bit(NFS_INO_ODIRECT, &nfsi->flags)) { + if (nowait && !mapping_empty(inode->i_mapping)) + return 1; set_bit(NFS_INO_ODIRECT, &nfsi->flags); nfs_sync_mapping(inode->i_mapping); } + return 0; } =20 /** @@ -143,12 +146,43 @@ nfs_start_io_direct(struct inode *inode) err =3D down_write_killable(&inode->i_rwsem); if (err) return err; - nfs_block_buffered(nfsi, inode); + nfs_block_buffered(nfsi, inode, false); downgrade_write(&inode->i_rwsem); =20 return 0; } =20 +/** + * nfs_start_io_direct_nowait - non-blocking variant of nfs_start_io_direc= t() + * @inode: file inode + * + * Try to declare that a direct I/O operation is about to start without + * blocking. + * Ensure all buffered I/O is blocked. + * If this could not be done without blocking then returns -EAGAIN. + */ +int +nfs_start_io_direct_nowait(struct inode *inode) +{ + struct nfs_inode *nfsi =3D NFS_I(inode); + + if (!down_read_trylock(&inode->i_rwsem)) + return -EAGAIN; + if (test_bit(NFS_INO_ODIRECT, &nfsi->flags)) + return 0; + up_read(&inode->i_rwsem); + + /* Slow path: try to flip NFS_INO_ODIRECT without blocking. */ + if (!down_write_trylock(&inode->i_rwsem)) + return -EAGAIN; + if (nfs_block_buffered(nfsi, inode, true)) { + up_write(&inode->i_rwsem); + return -EAGAIN; + } + downgrade_write(&inode->i_rwsem); + return 0; +} + /** * nfs_end_io_direct - declare that the direct i/o operation is done * @inode: file inode --=20 2.50.1 From nobody Mon Jun 8 08:28:41 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 598E237C0E1 for ; Sat, 30 May 2026 22:20:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780179612; cv=none; b=c7bylLJnWXm5zQPE2wFV6lDAIYDSkT/GL5OzRmF7iQbvuVra/E3jCplUGzOsbEH8wie0FUoPNis56I9Z7R1PkGvFaeyThtj5SpaPlp81MHnFMTto/4xeBHE8R1rfa6RCf9jvNbXpejwTWovx6B1XJU3pCQ5x5UNEDBlLNblzhHo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780179612; c=relaxed/simple; bh=KUklTCUYJp1BJPLfkblwKXuxVsFK8XGxI5dwHrsx8X0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kPj98q7wvFMta48x9FDrYpENshv6rqBrf6dbQVBrnvR6Vwdy1firRmx9kK8GYPAH+5lN7drJuc91CXe58zkvKzk/dcTR4/VC50awYZ95QcFKkfRRUfMPAPa6emgCpNDpKZLtIj9su/Pr+30QJfr4/GzFUvMjBZA9V9o5PjC2v80= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PpJSh87t; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PpJSh87t" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-45eecb8bf67so2067032f8f.2 for ; Sat, 30 May 2026 15:20:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780179609; x=1780784409; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZDT9fVob8Oysx5eRe3qdB0UmTNnWot9MWKxTp6EWmjg=; b=PpJSh87t8gD1KAmrvyf9Je9zYE7HS5sM15KI5x9ORgYWPFgrvseDBL7HRX/b5jWRXA KljLLiUJbFsSYx/DNOTb+StCpAHGDvo4VR1BiicXJJCtMf+IVrIj8QOZoarquit+ENfa J4bvUrBCLVhzGrv8BxwdHwW50fEp5cIUedlAMmL/VX5q5ZTN7wqTKZY7tU+lLTmV1OfC mX2DEZp7Jj9cJP6Pbf0A/KrbYFuGAZAV+c5M5WHiiZV+2vXYSnibqubhKm1HY47YGp4M 7gHlUlnh023gxekMnoGetvL5bp5riIuWR58VwK+MREPqibB/kniNzgUhXVD/90zA+65u XgFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780179609; x=1780784409; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZDT9fVob8Oysx5eRe3qdB0UmTNnWot9MWKxTp6EWmjg=; b=KKXcJcWMTgW9pLfii01YrKZ1jp0Qw+o3Evl7deIZfkQTd1PvMd7Y66Pe8zrNgiyz63 qrm9WBkZCwXTRBtkSropuLujL1PDlReICUgRIAWOctXPna38ISNOr/UqKo74k/Vz7wC1 l1dEU4ib22VFe4y6w+qnKz6GwYe76KHofuIVXwcN0YHpsznfQclr6eHSkcpDnhLZOQnz R0+LbYWR1s+nQ4VP2v9b5WPIOXRg3jK6ebkn8sGKHhifYT+3HwEa7IkTIgWreFgYz8vl uh9tCjSBAzRxPP3DOrH4ugBMfV26z//nWSdhM2UBq1cEKKW5fPjJJJWGK5naDDzRgAJk rTKg== X-Forwarded-Encrypted: i=1; AFNElJ/mg+5JAan+kPM9ol28q0LqMkbUahm0WmZ4202e92R0hqk1+Azq57zFzq98mTHz3uKolwNXqPsDAHdSnbk=@vger.kernel.org X-Gm-Message-State: AOJu0YwkOGVuCEFV1EQ4obxv2ocRntKVFrlxSZsgvm188oi1ZbiXUziq +v97q2Csa1IFisP/xDviHUCu7dnYqfzdNMfC9sTbb4etLN8wSCHXdXUh X-Gm-Gg: Acq92OEjv10vzo1EyrwBDGGhr6qB/H2VGCZ/fhfDvYSP7qaNh6nC3poCJQRja87iXKb WXfE1HltDKe3X/ky80nmJPFMP+Uzmjekyv30YTf8kZRTuecpKlRlSjR95WsDicJNfypBvjJuG3T dhtjMb5mTRGXxfkmUQAB3hIYDwdphJJ6cOyZj4unQEHEMZWRlHAN/nxopohv1IMtn9eoxeE8i7L nwsyEKO+XffPrKVmcGrle8C82Z00kcOhgv+kesqnm0dpB/3pv8Auzce6taXaOaeYUDXSqFknZ6X HIEwT7FOJhAAtj/AB38d7XiPDTU+MSIhBQBH2RZnJj1PjnVqhPlpAmdeumUOXS7yaLjtpEVicTx DtGbjI5FRV9EQsBV+iMagu/WRmT8DjRnWaUpRJnCjggk8OY6hvQCDcBxFfAn8zylcB1qXYXLOve +cmPDavoYoyckc0v26ioEPZfGi4aJZm6GnOSBsCm6/21AHLCfw3DAG X-Received: by 2002:adf:e510:0:b0:441:1e41:19c with SMTP id ffacd0b85a97d-45ef6b5a7femr6668438f8f.20.1780179608629; Sat, 30 May 2026 15:20:08 -0700 (PDT) Received: from puck (234.243.199.146.dyn.plus.net. [146.199.243.234]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45ef354cd7csm13443784f8f.18.2026.05.30.15.20.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 May 2026 15:20:07 -0700 (PDT) From: Dylan Yudaken To: trondmy@kernel.org, anna@kernel.org, linux-nfs@vger.kernel.org Cc: axboe@kernel.dk, io-uring@vger.kernel.org, linux-kernel@vger.kernel.org, Dylan Yudaken Subject: [PATCH 2/2] nfs: expose FMODE_NOWAIT for O_DIRECT read files Date: Sat, 30 May 2026 23:19:47 +0100 Message-ID: <20260530221947.49518-3-dyudaken@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260530221947.49518-1-dyudaken@gmail.com> References: <20260530221947.49518-1-dyudaken@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" O_DIRECT reads already (mostly) handle async requests, with the exception of locking the inode for direct. Handle async requests properly by using nfs_start_io_direct_nowait, and then expose FMODE_NOWAIT since it's now properly supported. Signed-off-by: Dylan Yudaken --- fs/nfs/direct.c | 5 ++++- fs/nfs/file.c | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 48d89716193a..bf0bad971d22 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -473,7 +473,10 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struc= t iov_iter *iter, dreq->flags =3D NFS_ODIRECT_SHOULD_DIRTY; =20 if (!swap) { - result =3D nfs_start_io_direct(inode); + if (iocb->ki_flags & IOCB_NOWAIT) + result =3D nfs_start_io_direct_nowait(inode); + else + result =3D nfs_start_io_direct(inode); if (result) { /* release the reference that would usually be * consumed by nfs_direct_read_schedule_iovec() diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 25048a3c2364..c5eb22036e71 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -72,8 +72,13 @@ nfs_file_open(struct inode *inode, struct file *filp) return res; =20 res =3D nfs_open(inode, filp); - if (res =3D=3D 0) + if (res =3D=3D 0) { filp->f_mode |=3D FMODE_CAN_ODIRECT; + /* flag NOWAIT on read-only O_DIRECT files only */ + if ((filp->f_flags & O_DIRECT) && + !(filp->f_mode & FMODE_WRITE)) + filp->f_mode |=3D FMODE_NOWAIT; + } return res; } =20 @@ -705,6 +710,12 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_= iter *from) =20 trace_nfs_file_write(iocb, from); =20 + /* + * FMODE_NOWAIT is not set for writable files + */ + if (WARN_ON_ONCE(iocb->ki_flags & IOCB_NOWAIT)) + return -EAGAIN; + result =3D nfs_key_timeout_notify(file, inode); if (result) return result; --=20 2.50.1