From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B277C4332F for ; Sun, 18 Dec 2022 23:23:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230419AbiLRXXM (ORCPT ); Sun, 18 Dec 2022 18:23:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230470AbiLRXW7 (ORCPT ); Sun, 18 Dec 2022 18:22:59 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70DACBCA0 for ; Sun, 18 Dec 2022 15:22:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405776; bh=rgdJQ00HlDR3n1V78o02Qz8Qw2vR4vsNwWkDiooEv3U=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=0IC6x3I7tC2dhIsfNw+doBy2YcsYehrUaei/sIqDeCjO0aY1eSPUCVdQHTqklamq3 EaAWOhfBDjtgxE8MlZahSA1x6LmQ6gDZlirhMxcJlaCWBOGgFG27ZFYfK8M2y4Fjfr S81VQRwtjuP6kSdI2jqP4u5l/uSiQPUqg/J3gqo6kzLbL+BuWfr29zfmvVAjLW11+h w2patQyiwA61qJUhyIS1x9I+3zSQWzXgRxAsc4O8qYMsgl9xSAa8lM4F3NbRNnxIhA n3SPbShWko1bv/MXvOKQlJmjru5Hf5mehxM3ZSEihwt1BG2VQYMITdOniQxOpQ9q1V a3CzYHs9QthFg== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id C5C46CC036F; Sun, 18 Dec 2022 23:22:55 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 01/10] Adjust maximum MSIZE to account for p9 header Date: Sun, 18 Dec 2022 23:22:09 +0000 Message-Id: <20221218232217.1713283-2-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: Mws2nVIwpl5zapwvrA8abhdMpb2AhyYp X-Proofpoint-GUID: Mws2nVIwpl5zapwvrA8abhdMpb2AhyYp X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=610 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add maximum p9 header size to MSIZE to make sure we can have page aligned data. Signed-off-by: Eric Van Hensbergen --- net/9p/client.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/net/9p/client.c b/net/9p/client.c index fef6516a0639..f982d36b55b8 100644 --- a/net/9p/client.c +++ b/net/9p/client.c @@ -28,7 +28,11 @@ #define CREATE_TRACE_POINTS #include =20 -#define DEFAULT_MSIZE (128 * 1024) +/* DEFAULT MSIZE =3D 32 pages worth of payload + P9_HDRSZ + + * room for write (16 extra) or read (11 extra) operands. + */ + +#define DEFAULT_MSIZE ((128 * 1024) + P9_IOHDRSZ) =20 /* Client Option Parsing (code inspired by NFS code) * - a little lazy - parse all client options base-commit: b7b275e60bcd5f89771e865a8239325f86d9927d prerequisite-patch-id: 031bd397a760838e416ddba75243269ce906c368 prerequisite-patch-id: cf70b974aff8376ea1bbb41d2606ec93609eecf0 prerequisite-patch-id: 91046bd699f2be9a4c9c9bf317693039a4374fbe prerequisite-patch-id: 28c9dc76bc302670a661fef2c4807d77038ca054 prerequisite-patch-id: 9e6a0ffb4d37f179b3ef3b920d883a464c5c3083 prerequisite-patch-id: f1ef66e1bee57cf76948e8d7d6eca9ef5c335b0e prerequisite-patch-id: a8342a621d33c26f9347d46c52f076d41d61a946 prerequisite-patch-id: 9117d73d5265a507d68acce493d7f7e623f7a6b0 --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AF53C4332F for ; Sun, 18 Dec 2022 23:23:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230341AbiLRXXW (ORCPT ); Sun, 18 Dec 2022 18:23:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50668 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230421AbiLRXXJ (ORCPT ); Sun, 18 Dec 2022 18:23:09 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C9E5BCB2 for ; Sun, 18 Dec 2022 15:23:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405788; bh=22z3hM7ajo6v6alaXwjTYA9bNfBA2cVdMH1XeN/HN8w=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=AhGZ/gRlKJAbhBYe///aGRqU841GDi1pufsqrw6cVmXhXmUPVV+3+uk2I0j6IrHRZ fhaedWs2TR66dOh0LovO9dj3XdUFtGNqgIcsjAvM/M/m0GeuCXyTnAcQyjyBcaKYgd ZZLfXDFkGoYgigim7B0g4yKjPH62psyHkGM4xipNOP8+ZSADqElhDwEoPhoakPbQfa ucttCjquqOMb/DJ7+NnGOQ2pGcQj0lLI8GVvn4H/nyRhAdsvEUOsXYDoxsrLDoggOo tJBYeoTFstoFuEGiZQxV3mf3uJzHC47fVkz6WHKijAaJ295vZ2zfPwVm9ihI/wfGr+ vO5pqYbx2Ao2g== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id 277F4CC0239; Sun, 18 Dec 2022 23:23:07 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 02/10] Expand setup of writeback cache to all levels Date: Sun, 18 Dec 2022 23:22:11 +0000 Message-Id: <20221218232217.1713283-3-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: OhTYzBw9FLrxmjW8PVOHBYnxPTuVCWbs X-Proofpoint-GUID: OhTYzBw9FLrxmjW8PVOHBYnxPTuVCWbs X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=838 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" If cache is enabled, make sure we are putting the right things in place (mainly impacts mmap). This also sets us up for more cache levels. Signed-off-by: Eric Van Hensbergen --- fs/9p/v9fs.c | 2 +- fs/9p/vfs_addr.c | 2 -- fs/9p/vfs_file.c | 7 ++++--- fs/9p/vfs_inode.c | 3 +-- fs/9p/vfs_inode_dotl.c | 7 ++++--- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 3a9c4517265f..61a51b90600d 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -468,7 +468,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_in= fo *v9ses, =20 #ifdef CONFIG_9P_FSCACHE /* register the session for caching */ - if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE)= { + if (v9ses->cache =3D=3D CACHE_FSCACHE) { rc =3D v9fs_cache_session_get_cookie(v9ses, dev_name); if (rc < 0) goto err_clnt; diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 93373486ab04..9da47465e568 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -279,8 +279,6 @@ static int v9fs_write_begin(struct file *filp, struct a= ddress_space *mapping, =20 p9_debug(P9_DEBUG_VFS, "filp %p, mapping %p\n", filp, mapping); =20 - BUG_ON(!v9inode->writeback_fid); - /* Prefetch area to be written into the cache if we're caching this * file. We need to do this before we get a lock on the page in case * there's more than one writer competing for the same cache block. diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index b740017634ef..3b6458846a0b 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -73,8 +73,7 @@ int v9fs_file_open(struct inode *inode, struct file *file) } =20 mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE= ) && - !v9inode->writeback_fid && + if ((v9ses->cache) && !v9inode->writeback_fid && ((file->f_flags & O_ACCMODE) !=3D O_RDONLY)) { /* * clone a fid and add it to writeback_fid @@ -92,9 +91,11 @@ int v9fs_file_open(struct inode *inode, struct file *fil= e) v9inode->writeback_fid =3D (void *) writeback_fid; } mutex_unlock(&v9inode->v_mutex); - if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE) +#ifdef CONFIG_9P_FSCACHE + if (v9ses->cache =3D=3D CACHE_FSCACHE) fscache_use_cookie(v9fs_inode_cookie(v9inode), file->f_mode & FMODE_WRITE); +#endif v9fs_open_fid_add(inode, &fid); return 0; out_error: diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 27a04a226d97..33e521c60e2c 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -843,8 +843,7 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *= dentry, inode =3D d_inode(dentry); v9inode =3D V9FS_I(inode); mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE= ) && - !v9inode->writeback_fid && + if ((v9ses->cache) && !v9inode->writeback_fid && ((flags & O_ACCMODE) !=3D O_RDONLY)) { /* * clone a fid and add it to writeback_fid diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 8696e8899c27..9fde73ffadaa 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -316,8 +316,7 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct den= try *dentry, =20 v9inode =3D V9FS_I(inode); mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE= ) && - !v9inode->writeback_fid && + if ((v9ses->cache) && !v9inode->writeback_fid && ((flags & O_ACCMODE) !=3D O_RDONLY)) { /* * clone a fid and add it to writeback_fid @@ -340,9 +339,11 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct de= ntry *dentry, if (err) goto out; file->private_data =3D ofid; - if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE) +#ifdef CONFIG_9P_FSCACHE + if (v9ses->cache =3D=3D CACHE_FSCACHE) fscache_use_cookie(v9fs_inode_cookie(v9inode), file->f_mode & FMODE_WRITE); +#endif v9fs_open_fid_add(inode, &ofid); file->f_mode |=3D FMODE_CREATED; out: --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A436AC10F1E for ; Sun, 18 Dec 2022 23:23:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231190AbiLRXXk (ORCPT ); Sun, 18 Dec 2022 18:23:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50942 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230421AbiLRXXc (ORCPT ); Sun, 18 Dec 2022 18:23:32 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CF25CBCB4 for ; Sun, 18 Dec 2022 15:23:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405799; bh=k5xEsC9bbLliC242NQEVzqarHkvCyJP7Mja6h33mAVI=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=NCN4eZrcO82xF8JjKkW1YNvHfn9HbhpTa5I+FD+pLjx29Ie56YiEsVY1kCa2rSgCq Sjwdw4jJM1TGEdxVWbWcuPUSwbr4NtOmQGNyhnFa7nSaSmjnCMXvVw0CGbRU0f2JqJ 0zKr0E9pjigm6JjhouB1Zhw0C7Qpl0RLKFzdCidPXNg/G74iH9rz4tc2u7GvI/4DSl 1S5fy49coBzy2RRXMlgyZ4fDfxoYu64tFBTWnJeL7h1af8tudTpRT/usMH1XMyuJCU dFZb/JCGQj5mB+YOVSt8UE6q1/w8BCLU4oTy1JZB9qTVT9AvRA5zZCrX9ePn1C8PDq gwC+cWcnY4G6g== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id 54191CC0441; Sun, 18 Dec 2022 23:23:18 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 03/10] Consolidate file operations and add readahead and writeback Date: Sun, 18 Dec 2022 23:22:13 +0000 Message-Id: <20221218232217.1713283-4-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: 4D25i2vmzYum538Zap6nU5FdVjj6Ysjz X-Proofpoint-GUID: 4D25i2vmzYum538Zap6nU5FdVjj6Ysjz X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" We had 3 different sets of file operations across 2 different protocol variants differentiated by cache which really only changed 3 functions. But the real problem is that certain file modes, mount options, and other factors weren't being considered when we decided whether or not to use caches. This consolidates all the operations and switches to conditionals within a common set to decide whether or not to do different aspects of caching. Signed-off-by: Eric Van Hensbergen --- fs/9p/v9fs.c | 30 ++++------ fs/9p/v9fs.h | 2 + fs/9p/v9fs_vfs.h | 4 -- fs/9p/vfs_dir.c | 9 +++ fs/9p/vfs_file.c | 123 +++++++---------------------------------- fs/9p/vfs_inode.c | 31 ++++------- fs/9p/vfs_inode_dotl.c | 19 ++++++- 7 files changed, 71 insertions(+), 147 deletions(-) diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 61a51b90600d..a46bf9121f11 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -39,8 +39,6 @@ enum { Opt_uname, Opt_remotename, Opt_cache, Opt_cachetag, /* Options that take no arguments */ Opt_nodevmap, - /* Cache options */ - Opt_cache_loose, Opt_fscache, Opt_mmap, /* Access options */ Opt_access, Opt_posixacl, /* Lock timeout option */ @@ -58,9 +56,6 @@ static const match_table_t tokens =3D { {Opt_remotename, "aname=3D%s"}, {Opt_nodevmap, "nodevmap"}, {Opt_cache, "cache=3D%s"}, - {Opt_cache_loose, "loose"}, - {Opt_fscache, "fscache"}, - {Opt_mmap, "mmap"}, {Opt_cachetag, "cachetag=3D%s"}, {Opt_access, "access=3D%s"}, {Opt_posixacl, "posixacl"}, @@ -69,10 +64,12 @@ static const match_table_t tokens =3D { }; =20 static const char *const v9fs_cache_modes[nr__p9_cache_modes] =3D { - [CACHE_NONE] =3D "none", - [CACHE_MMAP] =3D "mmap", - [CACHE_LOOSE] =3D "loose", - [CACHE_FSCACHE] =3D "fscache", + [CACHE_NONE] =3D "none", + [CACHE_READAHEAD] =3D "readahead", + [CACHE_WRITEBACK] =3D "writeback", + [CACHE_MMAP] =3D "mmap", + [CACHE_LOOSE] =3D "loose", + [CACHE_FSCACHE] =3D "fscache", }; =20 /* Interpret mount options for cache mode */ @@ -89,6 +86,12 @@ static int get_cache_mode(char *s) } else if (!strcmp(s, "mmap")) { version =3D CACHE_MMAP; p9_debug(P9_DEBUG_9P, "Cache mode: mmap\n"); + } else if (!strcmp(s, "writeback")) { + version =3D CACHE_WRITEBACK; + p9_debug(P9_DEBUG_9P, "Cache mode: writeback\n"); + } else if (!strcmp(s, "readahead")) { + version =3D CACHE_READAHEAD; + p9_debug(P9_DEBUG_9P, "Cache mode: readahead\n"); } else if (!strcmp(s, "none")) { version =3D CACHE_NONE; p9_debug(P9_DEBUG_9P, "Cache mode: none\n"); @@ -266,15 +269,6 @@ static int v9fs_parse_options(struct v9fs_session_info= *v9ses, char *opts) case Opt_nodevmap: v9ses->nodev =3D 1; break; - case Opt_cache_loose: - v9ses->cache =3D CACHE_LOOSE; - break; - case Opt_fscache: - v9ses->cache =3D CACHE_FSCACHE; - break; - case Opt_mmap: - v9ses->cache =3D CACHE_MMAP; - break; case Opt_cachetag: #ifdef CONFIG_9P_FSCACHE kfree(v9ses->cachetag); diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index 6acabc2e7dc9..5813967ecdf0 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h @@ -51,6 +51,8 @@ enum p9_session_flags { enum p9_cache_modes { CACHE_NONE, CACHE_MMAP, + CACHE_READAHEAD, + CACHE_WRITEBACK, CACHE_LOOSE, CACHE_FSCACHE, nr__p9_cache_modes diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index bc417da7e9c1..cce87c9bdd8b 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h @@ -36,10 +36,6 @@ extern const struct file_operations v9fs_dir_operations; extern const struct file_operations v9fs_dir_operations_dotl; extern const struct dentry_operations v9fs_dentry_operations; extern const struct dentry_operations v9fs_cached_dentry_operations; -extern const struct file_operations v9fs_cached_file_operations; -extern const struct file_operations v9fs_cached_file_operations_dotl; -extern const struct file_operations v9fs_mmap_file_operations; -extern const struct file_operations v9fs_mmap_file_operations_dotl; extern struct kmem_cache *v9fs_inode_cache; =20 struct inode *v9fs_alloc_inode(struct super_block *sb); diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index 1675a196c2ba..536769cdf7c8 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c @@ -214,6 +214,15 @@ int v9fs_dir_release(struct inode *inode, struct file = *filp) p9_debug(P9_DEBUG_VFS, "inode: %p filp: %p fid: %d\n", inode, filp, fid ? fid->fid : -1); if (fid) { + if ((fid->qid.type =3D=3D P9_QTFILE) && (filp->f_mode & FMODE_WRITE)) { + int retval =3D file_write_and_wait_range(filp, 0, -1); + + if (retval !=3D 0) { + p9_debug(P9_DEBUG_ERROR, + "trying to flush filp %p failed with error code %d\n", + filp, retval); + } + } spin_lock(&inode->i_lock); hlist_del(&fid->ilist); spin_unlock(&inode->i_lock); diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 3b6458846a0b..64158664dcb4 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -73,7 +73,7 @@ int v9fs_file_open(struct inode *inode, struct file *file) } =20 mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache) && !v9inode->writeback_fid && + if ((v9ses->cache >=3D CACHE_WRITEBACK) && !v9inode->writeback_fid && ((file->f_flags & O_ACCMODE) !=3D O_RDONLY)) { /* * clone a fid and add it to writeback_fid @@ -367,10 +367,15 @@ v9fs_file_read_iter(struct kiocb *iocb, struct iov_it= er *to) { struct p9_fid *fid =3D iocb->ki_filp->private_data; int ret, err =3D 0; + struct inode *inode =3D file_inode(iocb->ki_filp); + struct v9fs_session_info *v9ses =3D v9fs_inode2v9ses(inode); =20 p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", iov_iter_count(to), iocb->ki_pos); =20 + if (v9ses->cache > CACHE_MMAP) + return generic_file_read_iter(iocb, to); + if (iocb->ki_filp->f_flags & O_NONBLOCK) ret =3D p9_client_read_once(fid, iocb->ki_pos, to, &err); else @@ -395,6 +400,11 @@ v9fs_file_write_iter(struct kiocb *iocb, struct iov_it= er *from) ssize_t retval; loff_t origin; int err =3D 0; + struct inode *inode =3D file_inode(iocb->ki_filp); + struct v9fs_session_info *v9ses =3D v9fs_inode2v9ses(inode); + + if (v9ses->cache >=3D CACHE_WRITEBACK) + return generic_file_write_iter(iocb, from); =20 retval =3D generic_write_checks(iocb, from); if (retval <=3D 0) @@ -477,25 +487,16 @@ static int v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma) { int retval; - - - retval =3D generic_file_mmap(filp, vma); - if (!retval) - vma->vm_ops =3D &v9fs_file_vm_ops; - - return retval; -} - -static int -v9fs_mmap_file_mmap(struct file *filp, struct vm_area_struct *vma) -{ - int retval; - struct inode *inode; - struct v9fs_inode *v9inode; + struct inode *inode =3D file_inode(filp); + struct v9fs_inode *v9inode =3D V9FS_I(inode); + struct v9fs_session_info *v9ses =3D v9fs_inode2v9ses(inode); struct p9_fid *fid; =20 - inode =3D file_inode(filp); - v9inode =3D V9FS_I(inode); + if (v9ses->cache < CACHE_MMAP) { + invalidate_inode_pages2(filp->f_mapping); + return generic_file_readonly_mmap(filp, vma); + } + mutex_lock(&v9inode->v_mutex); if (!v9inode->writeback_fid && (vma->vm_flags & VM_SHARED) && @@ -563,35 +564,6 @@ v9fs_vm_page_mkwrite(struct vm_fault *vmf) return VM_FAULT_NOPAGE; } =20 -/** - * v9fs_mmap_file_read_iter - read from a file - * @iocb: The operation parameters - * @to: The buffer to read into - * - */ -static ssize_t -v9fs_mmap_file_read_iter(struct kiocb *iocb, struct iov_iter *to) -{ - /* TODO: Check if there are dirty pages */ - return v9fs_file_read_iter(iocb, to); -} - -/** - * v9fs_mmap_file_write_iter - write to a file - * @iocb: The operation parameters - * @from: The data to write - * - */ -static ssize_t -v9fs_mmap_file_write_iter(struct kiocb *iocb, struct iov_iter *from) -{ - /* - * TODO: invalidate mmaps on filp's inode between - * offset and offset+count - */ - return v9fs_file_write_iter(iocb, from); -} - static void v9fs_mmap_vm_close(struct vm_area_struct *vma) { struct inode *inode; @@ -628,34 +600,6 @@ static const struct vm_operations_struct v9fs_mmap_fil= e_vm_ops =3D { .page_mkwrite =3D v9fs_vm_page_mkwrite, }; =20 - -const struct file_operations v9fs_cached_file_operations =3D { - .llseek =3D generic_file_llseek, - .read_iter =3D generic_file_read_iter, - .write_iter =3D generic_file_write_iter, - .open =3D v9fs_file_open, - .release =3D v9fs_dir_release, - .lock =3D v9fs_file_lock, - .mmap =3D v9fs_file_mmap, - .splice_read =3D generic_file_splice_read, - .splice_write =3D iter_file_splice_write, - .fsync =3D v9fs_file_fsync, -}; - -const struct file_operations v9fs_cached_file_operations_dotl =3D { - .llseek =3D generic_file_llseek, - .read_iter =3D generic_file_read_iter, - .write_iter =3D generic_file_write_iter, - .open =3D v9fs_file_open, - .release =3D v9fs_dir_release, - .lock =3D v9fs_file_lock_dotl, - .flock =3D v9fs_file_flock_dotl, - .mmap =3D v9fs_file_mmap, - .splice_read =3D generic_file_splice_read, - .splice_write =3D iter_file_splice_write, - .fsync =3D v9fs_file_fsync_dotl, -}; - const struct file_operations v9fs_file_operations =3D { .llseek =3D generic_file_llseek, .read_iter =3D v9fs_file_read_iter, @@ -677,34 +621,7 @@ const struct file_operations v9fs_file_operations_dotl= =3D { .release =3D v9fs_dir_release, .lock =3D v9fs_file_lock_dotl, .flock =3D v9fs_file_flock_dotl, - .mmap =3D generic_file_readonly_mmap, - .splice_read =3D generic_file_splice_read, - .splice_write =3D iter_file_splice_write, - .fsync =3D v9fs_file_fsync_dotl, -}; - -const struct file_operations v9fs_mmap_file_operations =3D { - .llseek =3D generic_file_llseek, - .read_iter =3D v9fs_mmap_file_read_iter, - .write_iter =3D v9fs_mmap_file_write_iter, - .open =3D v9fs_file_open, - .release =3D v9fs_dir_release, - .lock =3D v9fs_file_lock, - .mmap =3D v9fs_mmap_file_mmap, - .splice_read =3D generic_file_splice_read, - .splice_write =3D iter_file_splice_write, - .fsync =3D v9fs_file_fsync, -}; - -const struct file_operations v9fs_mmap_file_operations_dotl =3D { - .llseek =3D generic_file_llseek, - .read_iter =3D v9fs_mmap_file_read_iter, - .write_iter =3D v9fs_mmap_file_write_iter, - .open =3D v9fs_file_open, - .release =3D v9fs_dir_release, - .lock =3D v9fs_file_lock_dotl, - .flock =3D v9fs_file_flock_dotl, - .mmap =3D v9fs_mmap_file_mmap, + .mmap =3D v9fs_file_mmap, .splice_read =3D generic_file_splice_read, .splice_write =3D iter_file_splice_write, .fsync =3D v9fs_file_fsync_dotl, diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 33e521c60e2c..de99f9275a94 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -287,24 +287,10 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses, case S_IFREG: if (v9fs_proto_dotl(v9ses)) { inode->i_op =3D &v9fs_file_inode_operations_dotl; - if (v9ses->cache =3D=3D CACHE_LOOSE || - v9ses->cache =3D=3D CACHE_FSCACHE) - inode->i_fop =3D - &v9fs_cached_file_operations_dotl; - else if (v9ses->cache =3D=3D CACHE_MMAP) - inode->i_fop =3D &v9fs_mmap_file_operations_dotl; - else - inode->i_fop =3D &v9fs_file_operations_dotl; + inode->i_fop =3D &v9fs_file_operations_dotl; } else { inode->i_op =3D &v9fs_file_inode_operations; - if (v9ses->cache =3D=3D CACHE_LOOSE || - v9ses->cache =3D=3D CACHE_FSCACHE) - inode->i_fop =3D - &v9fs_cached_file_operations; - else if (v9ses->cache =3D=3D CACHE_MMAP) - inode->i_fop =3D &v9fs_mmap_file_operations; - else - inode->i_fop =3D &v9fs_file_operations; + inode->i_fop =3D &v9fs_file_operations; } =20 break; @@ -843,7 +829,7 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *= dentry, inode =3D d_inode(dentry); v9inode =3D V9FS_I(inode); mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache) && !v9inode->writeback_fid && + if ((v9ses->cache >=3D CACHE_WRITEBACK) && !v9inode->writeback_fid && ((flags & O_ACCMODE) !=3D O_RDONLY)) { /* * clone a fid and add it to writeback_fid @@ -1030,6 +1016,7 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, c= onst struct path *path, struct kstat *stat, u32 request_mask, unsigned int flags) { struct dentry *dentry =3D path->dentry; + struct inode *inode =3D d_inode(dentry); struct v9fs_session_info *v9ses; struct p9_fid *fid; struct p9_wstat *st; @@ -1039,6 +1026,9 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, c= onst struct path *path, if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE)= { generic_fillattr(&init_user_ns, d_inode(dentry), stat); return 0; + } else if (v9ses->cache >=3D CACHE_WRITEBACK) { + if (S_ISREG(inode->i_mode)) + filemap_write_and_wait(inode->i_mapping); } fid =3D v9fs_fid_lookup(dentry); if (IS_ERR(fid)) @@ -1127,9 +1117,12 @@ static int v9fs_vfs_setattr(struct user_namespace *m= nt_userns, return retval; =20 if ((iattr->ia_valid & ATTR_SIZE) && - iattr->ia_size !=3D i_size_read(inode)) { + iattr->ia_size !=3D i_size_read(inode)) { truncate_setsize(inode, iattr->ia_size); - fscache_resize_cookie(v9fs_inode_cookie(v9inode), iattr->ia_size); + if (v9ses->cache =3D=3D CACHE_FSCACHE) + fscache_resize_cookie(v9fs_inode_cookie(v9inode), iattr->ia_size); + else + invalidate_mapping_pages(&inode->i_data, 0, -1); } =20 v9fs_invalidate_inode_attr(inode); diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 9fde73ffadaa..708cd728cc70 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -458,6 +458,7 @@ v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns, struct dentry *dentry =3D path->dentry; struct v9fs_session_info *v9ses; struct p9_fid *fid; + struct inode *inode =3D d_inode(dentry); struct p9_stat_dotl *st; =20 p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry); @@ -465,6 +466,9 @@ v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns, if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE)= { generic_fillattr(&init_user_ns, d_inode(dentry), stat); return 0; + } else if (v9ses->cache >=3D CACHE_WRITEBACK) { + if (S_ISREG(inode->i_mode)) + filemap_write_and_wait(inode->i_mapping); } fid =3D v9fs_fid_lookup(dentry); if (IS_ERR(fid)) @@ -540,12 +544,14 @@ int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_= userns, struct dentry *dentry, struct iattr *iattr) { int retval, use_dentry =3D 0; + struct inode *inode =3D d_inode(dentry); + struct v9fs_inode *v9inode =3D V9FS_I(inode); + struct v9fs_session_info *v9ses; struct p9_fid *fid =3D NULL; struct p9_iattr_dotl p9attr =3D { .uid =3D INVALID_UID, .gid =3D INVALID_GID, }; - struct inode *inode =3D d_inode(dentry); =20 p9_debug(P9_DEBUG_VFS, "\n"); =20 @@ -553,6 +559,8 @@ int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_us= erns, if (retval) return retval; =20 + v9ses =3D v9fs_dentry2v9ses(dentry); + p9attr.valid =3D v9fs_mapped_iattr_valid(iattr->ia_valid); if (iattr->ia_valid & ATTR_MODE) p9attr.mode =3D iattr->ia_mode; @@ -593,9 +601,14 @@ int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_u= serns, return retval; } =20 - if ((iattr->ia_valid & ATTR_SIZE) && - iattr->ia_size !=3D i_size_read(inode)) + if ((iattr->ia_valid & ATTR_SIZE) && iattr->ia_size !=3D + i_size_read(inode)) { truncate_setsize(inode, iattr->ia_size); + if (v9ses->cache =3D=3D CACHE_FSCACHE) + fscache_resize_cookie(v9fs_inode_cookie(v9inode), iattr->ia_size); + else + invalidate_mapping_pages(&inode->i_data, 0, -1); + } =20 v9fs_invalidate_inode_attr(inode); setattr_copy(&init_user_ns, inode, iattr); --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6ABAC4332F for ; Sun, 18 Dec 2022 23:24:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231264AbiLRXYC (ORCPT ); Sun, 18 Dec 2022 18:24:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230463AbiLRXXj (ORCPT ); Sun, 18 Dec 2022 18:23:39 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0D1EFBCB2 for ; Sun, 18 Dec 2022 15:23:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405812; bh=tv8Rf5ihdxdQfuJc2Vv4j++4j0iFH7YIU+fu3T81ngo=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=C7X037N4cwx+DvGSoNyqz7QLRx54rrfsS1EOHzLgaisYXtqvxkxYAXAX4KaXetvYE oQGiturQ/YLy1Sa/2UcE49SzJsbMURzcvRXk/M7rxBDiJed+iVFBxr7oKucVh/6YoO TJhmGsTWeHj0coYN/dwWPImceld7aW2J2Npsx9xQwvj7ts/pqB6AO7eXqYxkK0S4gT Yp1XnswpIY1twAc2iNWkzkBDwsyWsD55HhSDbc1z1/0q+CF8Cs9VqI87E9aQ5sH33h gE3diBA3lX5MxCj8MV6j9/VLhNSp0cAAjJUNqi1HZrLtjt7aWG+De9L57Qs8R+C9Jm FNhjBz6a8cIYA== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id C3555CC036F; Sun, 18 Dec 2022 23:23:31 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 04/10] Remove unnecessary superblock flags Date: Sun, 18 Dec 2022 23:22:15 +0000 Message-Id: <20221218232217.1713283-5-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: lNZgeoIIXyB6IsnYJRUa4owkNnYAVGuH X-Proofpoint-GUID: lNZgeoIIXyB6IsnYJRUa4owkNnYAVGuH X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" These flags just add unnecessary extra operations. When 9p is run without cache, it inherently implements these options so we don't need them in the superblock (which ends up sending extraneous fsyncs, etc.). User can still request these options on mount, but we don't need to set them as default. Signed-off-by: Eric Van Hensbergen --- fs/9p/vfs_super.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 266c4693e20c..65d96fa94ba2 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -84,9 +84,7 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_sessi= on_info *v9ses, sb->s_bdi->io_pages =3D v9ses->maxdata >> PAGE_SHIFT; } =20 - sb->s_flags |=3D SB_ACTIVE | SB_DIRSYNC; - if (!v9ses->cache) - sb->s_flags |=3D SB_SYNCHRONOUS; + sb->s_flags |=3D SB_ACTIVE; =20 #ifdef CONFIG_9P_FS_POSIX_ACL if ((v9ses->flags & V9FS_ACL_MASK) =3D=3D V9FS_POSIX_ACL) --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 31166C4332F for ; Sun, 18 Dec 2022 23:24:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231194AbiLRXYL (ORCPT ); Sun, 18 Dec 2022 18:24:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51266 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231193AbiLRXXx (ORCPT ); Sun, 18 Dec 2022 18:23:53 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 45439BE08 for ; Sun, 18 Dec 2022 15:23:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405822; bh=LTQeSnHB9tsXZcputSEm3mn8KgKyBhPbKH6Ub3wWTBY=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=gwyLEZPZR4SZt0tBotTT6SrR1b3XiW+pb3OCjvtP8UY25PsZVgNM1zx7fkR3CC9G+ 61tkvo0PNEoHyQNUktMw0B4tv6twq2CNDu0A0mjE6G2YmsXD698yzVOrZ5tHMwscMU op7vnh9O3+m9Rnq1wyVk4a3ebXhVmBCWgc4j5ExlOZe2uqIt9ydx8nL4CTwpCP5jEI 2CGmE8kmmk8fwaEZFVq+EhXbpzDkAyLNXG9ZoWnX12/uIAuQwA1U/giM/q9j6gI99D ZvGGozsjIRoyL/cpTDv0Pr/RVI5bQ/Senf/Wqwom7R6Sk35AV3S6/EI9cHsM3CQ7rI TMcfTglqFgs+g== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id 1E3D1CC041B; Sun, 18 Dec 2022 23:23:41 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 05/10] allow disable of xattr support on mount Date: Sun, 18 Dec 2022 23:22:17 +0000 Message-Id: <20221218232217.1713283-6-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: SWVjh7ha5_I54cqlvRaU2BHa_lZcinxc X-Proofpoint-GUID: SWVjh7ha5_I54cqlvRaU2BHa_lZcinxc X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=917 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" xattr creates a lot of additional messages for 9p in the current implementation. This allows users to conditionalize xattr support on 9p mount if they are on a connection with bad latency. Using this flag is also useful when debugging other aspects of 9p as it reduces the noise in the trace files. Signed-off-by: Eric Van Hensbergen --- Documentation/filesystems/9p.rst | 2 ++ fs/9p/v9fs.c | 9 ++++++++- fs/9p/v9fs.h | 3 ++- fs/9p/vfs_super.c | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Documentation/filesystems/9p.rst b/Documentation/filesystems/9= p.rst index 7b5964bc8865..0e800b8f73cc 100644 --- a/Documentation/filesystems/9p.rst +++ b/Documentation/filesystems/9p.rst @@ -137,6 +137,8 @@ Options This can be used to share devices/named pipes/sockets between hosts. This functionality will be expanded in later versions. =20 + noxattr do not offer xattr functions on this mount. + access there are four access modes. user if a user tries to access a file on v9fs diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index a46bf9121f11..f8e952c013f9 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -38,7 +38,7 @@ enum { /* String options */ Opt_uname, Opt_remotename, Opt_cache, Opt_cachetag, /* Options that take no arguments */ - Opt_nodevmap, + Opt_nodevmap, Opt_noxattr, /* Access options */ Opt_access, Opt_posixacl, /* Lock timeout option */ @@ -55,6 +55,7 @@ static const match_table_t tokens =3D { {Opt_uname, "uname=3D%s"}, {Opt_remotename, "aname=3D%s"}, {Opt_nodevmap, "nodevmap"}, + {Opt_noxattr, "noxattr"}, {Opt_cache, "cache=3D%s"}, {Opt_cachetag, "cachetag=3D%s"}, {Opt_access, "access=3D%s"}, @@ -149,6 +150,9 @@ int v9fs_show_options(struct seq_file *m, struct dentry= *root) if (v9ses->flags & V9FS_POSIX_ACL) seq_puts(m, ",posixacl"); =20 + if (v9ses->flags & V9FS_NO_XATTR) + seq_puts(m, ",noxattr"); + return p9_show_client_options(m, v9ses->clnt); } =20 @@ -269,6 +273,9 @@ static int v9fs_parse_options(struct v9fs_session_info = *v9ses, char *opts) case Opt_nodevmap: v9ses->nodev =3D 1; break; + case Opt_noxattr: + v9ses->flags |=3D V9FS_NO_XATTR; + break; case Opt_cachetag: #ifdef CONFIG_9P_FSCACHE kfree(v9ses->cachetag); diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index 5813967ecdf0..a08cf6618c86 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h @@ -36,7 +36,8 @@ enum p9_session_flags { V9FS_ACCESS_SINGLE =3D 0x04, V9FS_ACCESS_USER =3D 0x08, V9FS_ACCESS_CLIENT =3D 0x10, - V9FS_POSIX_ACL =3D 0x20 + V9FS_POSIX_ACL =3D 0x20, + V9FS_NO_XATTR =3D 0x40 }; =20 /* possible values of ->cache */ diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 65d96fa94ba2..5fc6a945bfff 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -64,7 +64,8 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_sessi= on_info *v9ses, sb->s_magic =3D V9FS_MAGIC; if (v9fs_proto_dotl(v9ses)) { sb->s_op =3D &v9fs_super_ops_dotl; - sb->s_xattr =3D v9fs_xattr_handlers; + if (!(v9ses->flags & V9FS_NO_XATTR)) + sb->s_xattr =3D v9fs_xattr_handlers; } else { sb->s_op =3D &v9fs_super_ops; sb->s_time_max =3D U32_MAX; --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 646CFC4332F for ; Sun, 18 Dec 2022 23:24:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230521AbiLRXYn (ORCPT ); Sun, 18 Dec 2022 18:24:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51412 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231263AbiLRXYC (ORCPT ); Sun, 18 Dec 2022 18:24:02 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E0323BE00 for ; Sun, 18 Dec 2022 15:24:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405840; bh=htdq/XZc8I8eF96377CKikxWMYv077FZxvjw+oX9C5o=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=QFyNE1SpFQWkKKFDDGJNghkxnVWgX6HuriKkhGY1KmS3buUES5/SwrAmnepbmKSha HO6vQC2pvXZCobvdd+eW0q+x9AnOJUWiiiv2RO2zfgjDEIe9LWH+iX+RCb5Lnqtyyl yqD4e9g5ZKk0RPUbQ9zYhlou6px5yYAo61LgUd0o0l4u+3DjDOAy0/PwWmRC4WtYS4 D6Q+QBldepIkkJ0tyVaAd/TvYhxsddzfulWfmbiUWRHgb5GiY5cX0QNwWeqYGydED7 ybV102N5jM5S9VyAvKzs90Al7PAgA9ZkfeYt3pqntFFfMUkDCnGF/ZKrRg5gF8rWiW G7FkXxTmHGJtA== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id 52D46CC03C2; Sun, 18 Dec 2022 23:23:59 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 06/10] fix bug in client create for .L Date: Sun, 18 Dec 2022 23:22:19 +0000 Message-Id: <20221218232217.1713283-7-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: xzxg9YkojhbJV7qxgyxoK48b60sdlYsq X-Proofpoint-GUID: xzxg9YkojhbJV7qxgyxoK48b60sdlYsq X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=739 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" We are supposed to set fid->mode to reflect the flags that were used to open the file. We were actually setting it to the creation mode which is the default perms of the file not the flags the file was opened with. Signed-off-by: Eric Van Hensbergen --- net/9p/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/9p/client.c b/net/9p/client.c index f982d36b55b8..4ae41f8f7286 100644 --- a/net/9p/client.c +++ b/net/9p/client.c @@ -1293,7 +1293,7 @@ int p9_client_create_dotl(struct p9_fid *ofid, const = char *name, u32 flags, qid->type, qid->path, qid->version, iounit); =20 memmove(&ofid->qid, qid, sizeof(struct p9_qid)); - ofid->mode =3D mode; + ofid->mode =3D flags; ofid->iounit =3D iounit; =20 free_and_error: --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0ACA9C4332F for ; Sun, 18 Dec 2022 23:25:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231171AbiLRXY6 (ORCPT ); Sun, 18 Dec 2022 18:24:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51564 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231290AbiLRXYP (ORCPT ); Sun, 18 Dec 2022 18:24:15 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 10BE1BF43 for ; Sun, 18 Dec 2022 15:24:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405854; bh=oDXYKkCov4vc1fbNoQpiyUCSmJFNPo7qTEDD6t0cO18=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=QToQWNFbYsWTWFfxE5Wy351p/X9UwtN+orRm+H0ebOqVlA5vJ0RRWN6qB4ifVfTMr xWsrmhy43epqryCarcl6OhCuTtjdXAAq5lAqg6QYxIPsWGtuHDF8GoySlqyIHL5OM7 yYE81TCiU0o4BHlJd0/fBTtVnFUftT4WoK1Y9xsXiPTQFwBOOMjWTkQKxFCEbW07WS OPzMmYT20smEJeE7Do6WjgOstd/FLkLM9xb3egbQCRLUHmX7uPSB4Z3UrPcl+VB78v uPgGLUJOUubWfP15la5DJ4c6pHp/6GD9aF4XIq8BefI5NON7d/qER9XGxTjyywAXQ6 r9vRhjnMRWVBw== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id DB3EBCC036F; Sun, 18 Dec 2022 23:24:13 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 07/10] Add additional debug flags and open modes Date: Sun, 18 Dec 2022 23:22:21 +0000 Message-Id: <20221218232217.1713283-8-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: dzmLWAsZB3CFFZNJGNkOrzDsXxIHhK7j X-Proofpoint-GUID: dzmLWAsZB3CFFZNJGNkOrzDsXxIHhK7j X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=595 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add some additional debug flags to assist with debugging cache changes. Also add some additional open modes so we can track cache state in fids more directly. Signed-off-by: Eric Van Hensbergen --- include/net/9p/9p.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h index 429adf6be29c..61c20b89becd 100644 --- a/include/net/9p/9p.h +++ b/include/net/9p/9p.h @@ -42,6 +42,8 @@ enum p9_debug_flags { P9_DEBUG_PKT =3D (1<<10), P9_DEBUG_FSC =3D (1<<11), P9_DEBUG_VPKT =3D (1<<12), + P9_DEBUG_CACHE =3D (1<<13), + P9_DEBUG_MMAP =3D (1<<14), }; =20 #ifdef CONFIG_NET_9P_DEBUG @@ -213,6 +215,9 @@ enum p9_open_mode_t { P9_ORCLOSE =3D 0x40, P9_OAPPEND =3D 0x80, P9_OEXCL =3D 0x1000, + P9L_DIRECT =3D 0x2000, /* cache disabled */ + P9L_NOWRITECACHE =3D 0x4000, /* no write caching */ + P9L_LOOSE =3D 0x8000, /* loose cache */ }; =20 /** --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B4E1C4332F for ; Sun, 18 Dec 2022 23:25:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231332AbiLRXZP (ORCPT ); Sun, 18 Dec 2022 18:25:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50818 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231301AbiLRXYb (ORCPT ); Sun, 18 Dec 2022 18:24:31 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E24C3BF41 for ; Sun, 18 Dec 2022 15:24:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405867; bh=v+jzIl87dUoe95Agy9D7U8yZIxMn7NM1PIcIYD/J044=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=0SDetpPh6gsvgVh5fPfHcFgdx8+4mpb2OVQq71isvMmbgVGi3B6/4ZeNiGqHySz6W SJc1QKqpKEg4XktEWctZaK7Nnqp+bUzorWVL65KHUm+M08EoU7eI14VYie/43MkOru V32SlIg2lBv7R16fUiOVECLOxQYwwe3TSkD39996F60Dltw600bBLmFaNen9jrZxor j3Nt3W5330JV3rZouStavQrXABi5Fp/f5m24N5WcW/tnu1Jt8kYXF+JUzjX7hiWKOT cSMD+Glf4Eys1GC+ompx0clnWGZE3R+S8vztJ/B5YxsbXaQs35YgK82EdQEE124TnX s0+mQqoTJ3VEQ== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id 79DE4CC038B; Sun, 18 Dec 2022 23:24:26 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 08/10] Add new mount modes Date: Sun, 18 Dec 2022 23:22:23 +0000 Message-Id: <20221218232217.1713283-9-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: a50t9E4pmabKJ_W7baQHBp4N-A3esUcN X-Proofpoint-GUID: a50t9E4pmabKJ_W7baQHBp4N-A3esUcN X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180222 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add some additional mount modes for cache management including specifying directio as a mount option and an option for ignore qid.version for determining whether or not a file is cacheable. Signed-off-by: Eric Van Hensbergen --- fs/9p/v9fs.c | 16 ++++++++++++++-- fs/9p/v9fs.h | 5 ++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index f8e952c013f9..43d3806150a9 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -38,7 +38,7 @@ enum { /* String options */ Opt_uname, Opt_remotename, Opt_cache, Opt_cachetag, /* Options that take no arguments */ - Opt_nodevmap, Opt_noxattr, + Opt_nodevmap, Opt_noxattr, Opt_directio, Opt_ignoreqv, /* Access options */ Opt_access, Opt_posixacl, /* Lock timeout option */ @@ -56,6 +56,8 @@ static const match_table_t tokens =3D { {Opt_remotename, "aname=3D%s"}, {Opt_nodevmap, "nodevmap"}, {Opt_noxattr, "noxattr"}, + {Opt_directio, "directio"}, + {Opt_ignoreqv, "ignoreqv"}, {Opt_cache, "cache=3D%s"}, {Opt_cachetag, "cachetag=3D%s"}, {Opt_access, "access=3D%s"}, @@ -125,7 +127,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry= *root) if (v9ses->nodev) seq_puts(m, ",nodevmap"); if (v9ses->cache) - seq_printf(m, ",%s", v9fs_cache_modes[v9ses->cache]); + seq_printf(m, ",cache=3D%s", v9fs_cache_modes[v9ses->cache]); #ifdef CONFIG_9P_FSCACHE if (v9ses->cachetag && v9ses->cache =3D=3D CACHE_FSCACHE) seq_printf(m, ",cachetag=3D%s", v9ses->cachetag); @@ -147,6 +149,10 @@ int v9fs_show_options(struct seq_file *m, struct dentr= y *root) break; } =20 + if (v9ses->flags & V9FS_IGNORE_QV) + seq_puts(m, ",ignoreqv"); + if (v9ses->flags & V9FS_DIRECT_IO) + seq_puts(m, ",directio"); if (v9ses->flags & V9FS_POSIX_ACL) seq_puts(m, ",posixacl"); =20 @@ -276,6 +282,12 @@ static int v9fs_parse_options(struct v9fs_session_info= *v9ses, char *opts) case Opt_noxattr: v9ses->flags |=3D V9FS_NO_XATTR; break; + case Opt_directio: + v9ses->flags |=3D V9FS_DIRECT_IO; + break; + case Opt_ignoreqv: + v9ses->flags |=3D V9FS_IGNORE_QV; + break; case Opt_cachetag: #ifdef CONFIG_9P_FSCACHE kfree(v9ses->cachetag); diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index a08cf6618c86..c80c318ff31c 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h @@ -37,7 +37,10 @@ enum p9_session_flags { V9FS_ACCESS_USER =3D 0x08, V9FS_ACCESS_CLIENT =3D 0x10, V9FS_POSIX_ACL =3D 0x20, - V9FS_NO_XATTR =3D 0x40 + V9FS_NO_XATTR =3D 0x40, + V9FS_IGNORE_QV =3D 0x80, + V9FS_DIRECT_IO =3D 0x100, + V9FS_SYNC =3D 0x200 }; =20 /* possible values of ->cache */ --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 961D7C10F1E for ; Sun, 18 Dec 2022 23:25:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231293AbiLRXZM (ORCPT ); Sun, 18 Dec 2022 18:25:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231150AbiLRXYh (ORCPT ); Sun, 18 Dec 2022 18:24:37 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 07B67BCA7 for ; Sun, 18 Dec 2022 15:24:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405876; bh=fJAS5WOiNl8OGefvohv8GYDvU+ypBa5SutnfaYNBIeg=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=ooTWSiESAAaoZzIyWMvNN2mrZXKHRgEwEpqMnaAnUUiqysa1CeIHeMcvbODl149/p ZxHlZ3IcItkSdA6YGRWkUuUR5eR0jlVHQgR2Jb7/YgPP59flaSbp/NkZujydYhIvMf wVSeQwFtjKiPGjdk0czrveal/82z7/M2Ht0oBBvd3UVVun1vC9R81gUiqglOlywgFb 0D9mu2fvC1XA+t4QRAzlU/Iixv9fE5h++JGiKNb3rgYwWHPHAjeI4xM9wO3HXJomqh b3Um0KRkpBeZJw/wiNVZscm2DxdTuUtyb1MzPkrAtTTBFW285lGzD4q2D1UZkXsuYY MiipNpcYtD0fQ== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id E0CDECC005D; Sun, 18 Dec 2022 23:24:35 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 09/10] fix error reporting in v9fs_dir_release Date: Sun, 18 Dec 2022 23:22:25 +0000 Message-Id: <20221218232217.1713283-10-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: a4izFcqvh2i1fGWRw_aPPq9hpnGkzlSU X-Proofpoint-GUID: a4izFcqvh2i1fGWRw_aPPq9hpnGkzlSU X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=804 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180223 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Checking the p9_fid_put value allows us to pass back errors involved if we end up clunking the fid as part of dir_release. This can help with more graceful response to errors in writeback among other things. Signed-off-by: Eric Van Hensbergen --- fs/9p/vfs_dir.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index 536769cdf7c8..b5495d6d0eff 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c @@ -197,7 +197,7 @@ static int v9fs_dir_readdir_dotl(struct file *file, str= uct dir_context *ctx) =20 =20 /** - * v9fs_dir_release - close a directory + * v9fs_dir_release - called on a close of a file or directory * @inode: inode of the directory * @filp: file pointer to a directory * @@ -209,6 +209,7 @@ int v9fs_dir_release(struct inode *inode, struct file *= filp) struct p9_fid *fid; __le32 version; loff_t i_size; + int retval =3D 0; =20 fid =3D filp->private_data; p9_debug(P9_DEBUG_VFS, "inode: %p filp: %p fid: %d\n", @@ -226,7 +227,7 @@ int v9fs_dir_release(struct inode *inode, struct file *= filp) spin_lock(&inode->i_lock); hlist_del(&fid->ilist); spin_unlock(&inode->i_lock); - p9_fid_put(fid); + retval =3D p9_fid_put(fid); } =20 if ((filp->f_mode & FMODE_WRITE)) { @@ -237,7 +238,7 @@ int v9fs_dir_release(struct inode *inode, struct file *= filp) } else { fscache_unuse_cookie(v9fs_inode_cookie(v9inode), NULL, NULL); } - return 0; + return retval; } =20 const struct file_operations v9fs_dir_operations =3D { --=20 2.37.2 From nobody Wed Sep 17 13:55:37 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 60173C4332F for ; Sun, 18 Dec 2022 23:25:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231364AbiLRXZS (ORCPT ); Sun, 18 Dec 2022 18:25:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230216AbiLRXYu (ORCPT ); Sun, 18 Dec 2022 18:24:50 -0500 Received: from ms11p00im-qufo17281301.me.com (ms11p00im-qufo17281301.me.com [17.58.38.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1928BC9E for ; Sun, 18 Dec 2022 15:24:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1671405888; bh=UKXPxnOVOmFmz8taPT0O6GjmM2XIDmBokAiQGyxCAWk=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=lPHb4MmZoHG0yDUP+wlBFkJltAoQYTHtoRcMewMMsFWzBOkd9tgiEoy286AOm3mqn jsQSoIikT4gAKKjkI74VIHN2qc7NtNO7IUA7C0YNKvuYlyNMQHTjJAl85uCrATAn+6 wMP2xcxA1V817y/oTAQ0kTxB8GC4HqtjqpGNmRxUHmbdAlKirujvNp1RGQ5swj1Owu 9dOFrKwScxzeboKsJCU8Wb6fVndslanyF/pRKOs2yyN1p+8iRMtYWVQsTZpY/8Rkgk xsvoCp2dfjfIJ6mPI6bgJ3CR036fTYIefhzh1gioaqs0Ia+jGfCY+kCifmZmcrcXcV b9e4SSkDz3iag== Received: from thundercleese.localdomain (ms11p00im-dlb-asmtpmailmevip.me.com [17.57.154.19]) by ms11p00im-qufo17281301.me.com (Postfix) with ESMTPSA id 97EC2CC02ED; Sun, 18 Dec 2022 23:24:47 +0000 (UTC) From: Eric Van Hensbergen To: v9fs-developer@lists.sourceforge.net, asmadeus@codewreck.org, rminnich@gmail.com, lucho@ionkov.net Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux_oss@crudebyte.com, Eric Van Hensbergen Subject: [PATCH v2 10/10] writeback mode fixes Date: Sun, 18 Dec 2022 23:22:27 +0000 Message-Id: <20221218232217.1713283-11-evanhensbergen@icloud.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20221218232217.1713283-1-evanhensbergen@icloud.com> References: <20221217183142.1425132-1-evanhensbergen@icloud.com> <20221218232217.1713283-1-evanhensbergen@icloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: GKnfkdih05XKypaoSRUIO65gd0hMiUMZ X-Proofpoint-GUID: GKnfkdih05XKypaoSRUIO65gd0hMiUMZ X-Proofpoint-Virus-Version: =?UTF-8?Q?vendor=3Dfsecure_engine=3D1.1.170-22c6f66c430a71ce266a39bfe25bc?= =?UTF-8?Q?2903e8d5c8f:6.0.425,18.0.572,17.11.62.513.0000000_definitions?= =?UTF-8?Q?=3D2022-01-14=5F01:2022-01-14=5F01,2020-02-14=5F11,2021-12-02?= =?UTF-8?Q?=5F01_signatures=3D0?= X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1015 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2212180223 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This fixes several detected problems from preivous patches when running with writeback mode. In particular this fixes issues with files which are opened as write only and getattr on files which dirty caches. This patch makes sure that cache behavior for an open file is stored in the client copy of fid->mode. This allows us to reflect cache behavior from mount flags, open mode, and information from the server to inform readahead and writeback behavior. This includes adding support for a 9p semantic that qid.version=3D=3D0 is used to mark a file as non-cachable which is important for synthetic files. This may have a side-effect of not supporting caching on certain legacy file servers that do not properly set qid.version. There is also now a mount flag which can disable the qid.version behavior. Signed-off-by: Eric Van Hensbergen --- Documentation/filesystems/9p.rst | 24 ++++----- fs/9p/fid.c | 23 +++++++-- fs/9p/fid.h | 32 ++++++++++++ fs/9p/v9fs.h | 1 - fs/9p/vfs_addr.c | 22 ++++---- fs/9p/vfs_file.c | 88 +++++++++++--------------------- fs/9p/vfs_inode.c | 45 ++++++---------- fs/9p/vfs_inode_dotl.c | 44 ++++++---------- fs/9p/vfs_super.c | 21 +++++--- 9 files changed, 150 insertions(+), 150 deletions(-) diff --git a/Documentation/filesystems/9p.rst b/Documentation/filesystems/9= p.rst index 0e800b8f73cc..0c2c7a181d85 100644 --- a/Documentation/filesystems/9p.rst +++ b/Documentation/filesystems/9p.rst @@ -79,18 +79,14 @@ Options =20 cache=3Dmode specifies a caching policy. By default, no caches are used. =20 - none - default no cache policy, metadata and data - alike are synchronous. - loose - no attempts are made at consistency, - intended for exclusive, read-only mounts - fscache - use FS-Cache for a persistent, read-only - cache backend. - mmap - minimal cache that is only used for read-write - mmap. Northing else is cached, like cache= =3Dnone + =3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D + none no cache of file or metadata + readahead readahead caching of files + writeback delayed writeback of files + mmap support mmap operations read/write with cache + loose meta-data and file cache with no coherency + fscache use FS-Cache for a persistent cache backend + =3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D =20 debug=3Dn specifies debug level. The debug level is a bitmask. =20 @@ -137,6 +133,10 @@ Options This can be used to share devices/named pipes/sockets between hosts. This functionality will be expanded in later versions. =20 + directio bypass page cache on all read/write operations + + ignoreqv ignore qid.version=3D=3D0 as a marker to ignore cache + noxattr do not offer xattr functions on this mount. =20 access there are four access modes. diff --git a/fs/9p/fid.c b/fs/9p/fid.c index 805151114e96..4f326a7019d3 100644 --- a/fs/9p/fid.c +++ b/fs/9p/fid.c @@ -41,14 +41,24 @@ void v9fs_fid_add(struct dentry *dentry, struct p9_fid = **pfid) *pfid =3D NULL; } =20 +static bool v9fs_is_writeable(int mode) +{ + if ((mode & P9_OWRITE) || (mode & P9_ORDWR)) + return true; + else + return false; +} + /** * v9fs_fid_find_inode - search for an open fid off of the inode list * @inode: return a fid pointing to a specific inode + * @writeable: only consider fids which are writeable * @uid: return a fid belonging to the specified user + * @any: ignore uid as a selection criteria * */ - -static struct p9_fid *v9fs_fid_find_inode(struct inode *inode, kuid_t uid) +struct p9_fid *v9fs_fid_find_inode(struct inode *inode, bool want_writeabl= e, + kuid_t uid, bool any) { struct hlist_head *h; struct p9_fid *fid, *ret =3D NULL; @@ -58,7 +68,12 @@ static struct p9_fid *v9fs_fid_find_inode(struct inode *= inode, kuid_t uid) spin_lock(&inode->i_lock); h =3D (struct hlist_head *)&inode->i_private; hlist_for_each_entry(fid, h, ilist) { - if (uid_eq(fid->uid, uid)) { + if (any || uid_eq(fid->uid, uid)) { + if (want_writeable && !v9fs_is_writeable(fid->mode)) { + p9_debug(P9_DEBUG_VFS, " mode: %x not writeable?\n", + fid->mode); + continue; + } p9_fid_get(fid); ret =3D fid; break; @@ -118,7 +133,7 @@ static struct p9_fid *v9fs_fid_find(struct dentry *dent= ry, kuid_t uid, int any) spin_unlock(&dentry->d_lock); } else { if (dentry->d_inode) - ret =3D v9fs_fid_find_inode(dentry->d_inode, uid); + ret =3D v9fs_fid_find_inode(dentry->d_inode, false, uid, any); } =20 return ret; diff --git a/fs/9p/fid.h b/fs/9p/fid.h index 8a4e8cd12ca2..b248221e7906 100644 --- a/fs/9p/fid.h +++ b/fs/9p/fid.h @@ -7,7 +7,10 @@ #ifndef FS_9P_FID_H #define FS_9P_FID_H #include +#include "v9fs.h" =20 +struct p9_fid *v9fs_fid_find_inode(struct inode *inode, bool want_writeabl= e, + kuid_t uid, bool any); struct p9_fid *v9fs_fid_lookup(struct dentry *dentry); static inline struct p9_fid *v9fs_parent_fid(struct dentry *dentry) { @@ -32,4 +35,33 @@ static inline struct p9_fid *v9fs_fid_clone(struct dentr= y *dentry) p9_fid_put(fid); return nfid; } +/** + * v9fs_fid_addmodes - add cache flags to fid mode (for client use only) + * @fid: fid to augment + * @s_flags: session info mount flags + * @s_cache: session info cache flags + * @f_flags: unix open flags + * + * make sure mode reflects flags of underlying mounts + * also qid.version =3D=3D 0 reflects a synthetic or legacy file system + * NOTE: these are set after open so only reflect 9p client not + * underlying file system on server. + */ +static inline void v9fs_fid_add_modes(struct p9_fid *fid, int s_flags, + int s_cache, unsigned int f_flags) +{ + if (fid->qid.type !=3D P9_QTFILE) + return; + + if ((!s_cache) || + ((fid->qid.version =3D=3D 0) && !(s_flags & V9FS_IGNORE_QV)) || + (s_flags & V9FS_DIRECT_IO) || (f_flags & O_DIRECT)) { + fid->mode |=3D P9L_DIRECT; /* no read or write cache */ + } else if ((s_cache < CACHE_WRITEBACK) || + (f_flags & O_DSYNC) | (s_flags & V9FS_SYNC)) { + fid->mode |=3D P9L_NOWRITECACHE; + } else if (s_cache =3D=3D CACHE_LOOSE) { + fid->mode |=3D P9L_LOOSE; /* noncoherent cache */ + } +} #endif diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index c80c318ff31c..9c6bc57512bf 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h @@ -118,7 +118,6 @@ struct v9fs_inode { struct netfs_inode netfs; /* Netfslib context and vfs inode */ struct p9_qid qid; unsigned int cache_validity; - struct p9_fid *writeback_fid; struct mutex v_mutex; }; =20 diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 9da47465e568..b9f857f15757 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -57,8 +57,6 @@ static void v9fs_issue_read(struct netfs_io_subrequest *s= ubreq) */ static int v9fs_init_request(struct netfs_io_request *rreq, struct file *f= ile) { - struct inode *inode =3D file_inode(file); - struct v9fs_inode *v9inode =3D V9FS_I(inode); struct p9_fid *fid =3D file->private_data; =20 BUG_ON(!fid); @@ -66,11 +64,8 @@ static int v9fs_init_request(struct netfs_io_request *rr= eq, struct file *file) /* we might need to read from a fid that was opened write-only * for read-modify-write of page cache, use the writeback fid * for that */ - if (rreq->origin =3D=3D NETFS_READ_FOR_WRITE && - (fid->mode & O_ACCMODE) =3D=3D O_WRONLY) { - fid =3D v9inode->writeback_fid; - BUG_ON(!fid); - } + WARN_ON(rreq->origin =3D=3D NETFS_READ_FOR_WRITE && + !(fid->mode & P9_ORDWR)); =20 p9_fid_get(fid); rreq->netfs_priv =3D fid; @@ -164,6 +159,7 @@ static int v9fs_vfs_write_folio_locked(struct folio *fo= lio) loff_t i_size =3D i_size_read(inode); struct iov_iter from; size_t len =3D folio_size(folio); + struct p9_fid *writeback_fid; int err; =20 if (start >=3D i_size) @@ -173,13 +169,17 @@ static int v9fs_vfs_write_folio_locked(struct folio *= folio) =20 iov_iter_xarray(&from, WRITE, &folio_mapping(folio)->i_pages, start, len); =20 - /* We should have writeback_fid always set */ - BUG_ON(!v9inode->writeback_fid); + writeback_fid =3D v9fs_fid_find_inode(inode, true, INVALID_UID, true); + if (!writeback_fid) { + WARN_ONCE(1, "folio expected an open fid inode->i_private=3D%p\n", + inode->i_private); + return -EINVAL; + } =20 folio_wait_fscache(folio); folio_start_writeback(folio); =20 - p9_client_write(v9inode->writeback_fid, start, &from, &err); + p9_client_write(writeback_fid, start, &from, &err); =20 if (err =3D=3D 0 && fscache_cookie_enabled(cookie) && @@ -192,6 +192,8 @@ static int v9fs_vfs_write_folio_locked(struct folio *fo= lio) } =20 folio_end_writeback(folio); + p9_fid_put(writeback_fid); + return err; } =20 diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 64158664dcb4..b9873e81215e 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -43,7 +43,7 @@ int v9fs_file_open(struct inode *inode, struct file *file) int err; struct v9fs_inode *v9inode; struct v9fs_session_info *v9ses; - struct p9_fid *fid, *writeback_fid; + struct p9_fid *fid; int omode; =20 p9_debug(P9_DEBUG_VFS, "inode: %p file: %p\n", inode, file); @@ -60,7 +60,19 @@ int v9fs_file_open(struct inode *inode, struct file *fil= e) if (IS_ERR(fid)) return PTR_ERR(fid); =20 - err =3D p9_client_open(fid, omode); + if ((v9ses->cache >=3D CACHE_WRITEBACK) && (omode & P9_OWRITE)) { + int writeback_omode =3D (omode & !P9_OWRITE) | P9_ORDWR; + + p9_debug(P9_DEBUG_CACHE, "write-only file with writeback enabled, try o= pening O_RDWR\n"); + err =3D p9_client_open(fid, writeback_omode); + if (err < 0) { + p9_debug(P9_DEBUG_CACHE, "could not open O_RDWR, disabling caches\n"); + err =3D p9_client_open(fid, omode); + fid->mode |=3D P9L_DIRECT; + } + } else { + err =3D p9_client_open(fid, omode); + } if (err < 0) { p9_fid_put(fid); return err; @@ -72,36 +84,14 @@ int v9fs_file_open(struct inode *inode, struct file *fi= le) file->private_data =3D fid; } =20 - mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache >=3D CACHE_WRITEBACK) && !v9inode->writeback_fid && - ((file->f_flags & O_ACCMODE) !=3D O_RDONLY)) { - /* - * clone a fid and add it to writeback_fid - * we do it during open time instead of - * page dirty time via write_begin/page_mkwrite - * because we want write after unlink usecase - * to work. - */ - writeback_fid =3D v9fs_writeback_fid(file_dentry(file)); - if (IS_ERR(writeback_fid)) { - err =3D PTR_ERR(writeback_fid); - mutex_unlock(&v9inode->v_mutex); - goto out_error; - } - v9inode->writeback_fid =3D (void *) writeback_fid; - } - mutex_unlock(&v9inode->v_mutex); #ifdef CONFIG_9P_FSCACHE if (v9ses->cache =3D=3D CACHE_FSCACHE) fscache_use_cookie(v9fs_inode_cookie(v9inode), file->f_mode & FMODE_WRITE); #endif + v9fs_fid_add_modes(fid, v9ses->flags, v9ses->cache, file->f_flags); v9fs_open_fid_add(inode, &fid); return 0; -out_error: - p9_fid_put(file->private_data); - file->private_data =3D NULL; - return err; } =20 /** @@ -367,14 +357,14 @@ v9fs_file_read_iter(struct kiocb *iocb, struct iov_it= er *to) { struct p9_fid *fid =3D iocb->ki_filp->private_data; int ret, err =3D 0; - struct inode *inode =3D file_inode(iocb->ki_filp); - struct v9fs_session_info *v9ses =3D v9fs_inode2v9ses(inode); =20 - p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", - iov_iter_count(to), iocb->ki_pos); + p9_debug(P9_DEBUG_VFS, "fid %d count %zu offset %lld\n", + fid->fid, iov_iter_count(to), iocb->ki_pos); =20 - if (v9ses->cache > CACHE_MMAP) + if (!(fid->mode & P9L_DIRECT)) { + p9_debug(P9_DEBUG_VFS, "(cached)\n"); return generic_file_read_iter(iocb, to); + } =20 if (iocb->ki_filp->f_flags & O_NONBLOCK) ret =3D p9_client_read_once(fid, iocb->ki_pos, to, &err); @@ -397,14 +387,17 @@ static ssize_t v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) { struct file *file =3D iocb->ki_filp; + struct p9_fid *fid =3D file->private_data; ssize_t retval; loff_t origin; int err =3D 0; - struct inode *inode =3D file_inode(iocb->ki_filp); - struct v9fs_session_info *v9ses =3D v9fs_inode2v9ses(inode); =20 - if (v9ses->cache >=3D CACHE_WRITEBACK) + p9_debug(P9_DEBUG_VFS, "fid %d\n", fid->fid); + + if (!(fid->mode & (P9L_DIRECT | P9L_NOWRITECACHE))) { + p9_debug(P9_DEBUG_CACHE, "(cached)\n"); return generic_file_write_iter(iocb, from); + } =20 retval =3D generic_write_checks(iocb, from); if (retval <=3D 0) @@ -488,36 +481,18 @@ v9fs_file_mmap(struct file *filp, struct vm_area_stru= ct *vma) { int retval; struct inode *inode =3D file_inode(filp); - struct v9fs_inode *v9inode =3D V9FS_I(inode); struct v9fs_session_info *v9ses =3D v9fs_inode2v9ses(inode); - struct p9_fid *fid; + + p9_debug(P9_DEBUG_MMAP, "filp :%p\n", filp); =20 if (v9ses->cache < CACHE_MMAP) { + p9_debug(P9_DEBUG_CACHE, "(no mmap mode)"); + if (vma->vm_flags & VM_MAYSHARE) + return -ENODEV; invalidate_inode_pages2(filp->f_mapping); return generic_file_readonly_mmap(filp, vma); } =20 - mutex_lock(&v9inode->v_mutex); - if (!v9inode->writeback_fid && - (vma->vm_flags & VM_SHARED) && - (vma->vm_flags & VM_WRITE)) { - /* - * clone a fid and add it to writeback_fid - * we do it during mmap instead of - * page dirty time via write_begin/page_mkwrite - * because we want write after unlink usecase - * to work. - */ - fid =3D v9fs_writeback_fid(file_dentry(filp)); - if (IS_ERR(fid)) { - retval =3D PTR_ERR(fid); - mutex_unlock(&v9inode->v_mutex); - return retval; - } - v9inode->writeback_fid =3D (void *) fid; - } - mutex_unlock(&v9inode->v_mutex); - retval =3D generic_file_mmap(filp, vma); if (!retval) vma->vm_ops =3D &v9fs_mmap_file_vm_ops; @@ -551,7 +526,6 @@ v9fs_vm_page_mkwrite(struct vm_fault *vmf) /* Update file times before taking page lock */ file_update_time(filp); =20 - BUG_ON(!v9inode->writeback_fid); if (folio_lock_killable(folio) < 0) return VM_FAULT_RETRY; if (folio_mapping(folio) !=3D inode->i_mapping) diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index de99f9275a94..c61709d98934 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -230,7 +230,6 @@ struct inode *v9fs_alloc_inode(struct super_block *sb) v9inode =3D alloc_inode_sb(sb, v9fs_inode_cache, GFP_KERNEL); if (!v9inode) return NULL; - v9inode->writeback_fid =3D NULL; v9inode->cache_validity =3D 0; mutex_init(&v9inode->v_mutex); return &v9inode->netfs.inode; @@ -383,9 +382,6 @@ void v9fs_evict_inode(struct inode *inode) filemap_fdatawrite(&inode->i_data); =20 fscache_relinquish_cookie(v9fs_inode_cookie(v9inode), false); - /* clunk the fid stashed in writeback_fid */ - p9_fid_put(v9inode->writeback_fid); - v9inode->writeback_fid =3D NULL; } =20 static int v9fs_test_inode(struct inode *inode, void *data) @@ -796,9 +792,10 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry = *dentry, u32 perm; struct v9fs_inode *v9inode; struct v9fs_session_info *v9ses; - struct p9_fid *fid, *inode_fid; + struct p9_fid *fid; struct dentry *res =3D NULL; struct inode *inode; + int p9_omode; =20 if (d_in_lookup(dentry)) { res =3D v9fs_vfs_lookup(dir, dentry, 0); @@ -817,9 +814,14 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry = *dentry, =20 v9ses =3D v9fs_inode2v9ses(dir); perm =3D unixmode2p9mode(v9ses, mode); - fid =3D v9fs_create(v9ses, dir, dentry, NULL, perm, - v9fs_uflags2omode(flags, - v9fs_proto_dotu(v9ses))); + p9_omode =3D v9fs_uflags2omode(flags, v9fs_proto_dotu(v9ses)); + + if ((v9ses->cache >=3D CACHE_WRITEBACK) && (p9_omode & P9_OWRITE)) { + p9_omode =3D (p9_omode & !P9_OWRITE) | P9_ORDWR; + p9_debug(P9_DEBUG_CACHE, + "write-only file with writeback enabled, creating w/ O_RDWR\n"); + } + fid =3D v9fs_create(v9ses, dir, dentry, NULL, perm, p9_omode); if (IS_ERR(fid)) { err =3D PTR_ERR(fid); goto error; @@ -828,25 +830,6 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry = *dentry, v9fs_invalidate_inode_attr(dir); inode =3D d_inode(dentry); v9inode =3D V9FS_I(inode); - mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache >=3D CACHE_WRITEBACK) && !v9inode->writeback_fid && - ((flags & O_ACCMODE) !=3D O_RDONLY)) { - /* - * clone a fid and add it to writeback_fid - * we do it during open time instead of - * page dirty time via write_begin/page_mkwrite - * because we want write after unlink usecase - * to work. - */ - inode_fid =3D v9fs_writeback_fid(dentry); - if (IS_ERR(inode_fid)) { - err =3D PTR_ERR(inode_fid); - mutex_unlock(&v9inode->v_mutex); - goto error; - } - v9inode->writeback_fid =3D (void *) inode_fid; - } - mutex_unlock(&v9inode->v_mutex); err =3D finish_open(file, dentry, generic_file_open); if (err) goto error; @@ -855,6 +838,8 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *= dentry, if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE) fscache_use_cookie(v9fs_inode_cookie(v9inode), file->f_mode & FMODE_WRITE); + + v9fs_fid_add_modes(fid, v9ses->flags, v9ses->cache, file->f_flags); v9fs_open_fid_add(inode, &fid); =20 file->f_mode |=3D FMODE_CREATED; @@ -1024,7 +1009,7 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, c= onst struct path *path, p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry); v9ses =3D v9fs_dentry2v9ses(dentry); if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE)= { - generic_fillattr(&init_user_ns, d_inode(dentry), stat); + generic_fillattr(&init_user_ns, inode, stat); return 0; } else if (v9ses->cache >=3D CACHE_WRITEBACK) { if (S_ISREG(inode->i_mode)) @@ -1119,10 +1104,10 @@ static int v9fs_vfs_setattr(struct user_namespace *= mnt_userns, if ((iattr->ia_valid & ATTR_SIZE) && iattr->ia_size !=3D i_size_read(inode)) { truncate_setsize(inode, iattr->ia_size); + truncate_pagecache(inode, iattr->ia_size); + if (v9ses->cache =3D=3D CACHE_FSCACHE) fscache_resize_cookie(v9fs_inode_cookie(v9inode), iattr->ia_size); - else - invalidate_mapping_pages(&inode->i_data, 0, -1); } =20 v9fs_invalidate_inode_attr(inode); diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 708cd728cc70..36e7ccdf11df 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -232,12 +232,13 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct d= entry *dentry, int err =3D 0; kgid_t gid; umode_t mode; + int p9_omode =3D v9fs_open_to_dotl_flags(flags); const unsigned char *name =3D NULL; struct p9_qid qid; struct inode *inode; struct p9_fid *fid =3D NULL; struct v9fs_inode *v9inode; - struct p9_fid *dfid =3D NULL, *ofid =3D NULL, *inode_fid =3D NULL; + struct p9_fid *dfid =3D NULL, *ofid =3D NULL; struct v9fs_session_info *v9ses; struct posix_acl *pacl =3D NULL, *dacl =3D NULL; struct dentry *res =3D NULL; @@ -282,14 +283,19 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct d= entry *dentry, /* Update mode based on ACL value */ err =3D v9fs_acl_mode(dir, &mode, &dacl, &pacl); if (err) { - p9_debug(P9_DEBUG_VFS, "Failed to get acl values in creat %d\n", + p9_debug(P9_DEBUG_VFS, "Failed to get acl values in create %d\n", err); goto out; } - err =3D p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags), - mode, gid, &qid); + + if ((v9ses->cache >=3D CACHE_WRITEBACK) && (p9_omode & P9_OWRITE)) { + p9_omode =3D (p9_omode & !P9_OWRITE) | P9_ORDWR; + p9_debug(P9_DEBUG_CACHE, + "write-only file with writeback enabled, creating w/ O_RDWR\n"); + } + err =3D p9_client_create_dotl(ofid, name, p9_omode, mode, gid, &qid); if (err < 0) { - p9_debug(P9_DEBUG_VFS, "p9_client_open_dotl failed in creat %d\n", + p9_debug(P9_DEBUG_VFS, "p9_client_open_dotl failed in create %d\n", err); goto out; } @@ -315,25 +321,6 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct de= ntry *dentry, d_instantiate(dentry, inode); =20 v9inode =3D V9FS_I(inode); - mutex_lock(&v9inode->v_mutex); - if ((v9ses->cache) && !v9inode->writeback_fid && - ((flags & O_ACCMODE) !=3D O_RDONLY)) { - /* - * clone a fid and add it to writeback_fid - * we do it during open time instead of - * page dirty time via write_begin/page_mkwrite - * because we want write after unlink usecase - * to work. - */ - inode_fid =3D v9fs_writeback_fid(dentry); - if (IS_ERR(inode_fid)) { - err =3D PTR_ERR(inode_fid); - mutex_unlock(&v9inode->v_mutex); - goto out; - } - v9inode->writeback_fid =3D (void *) inode_fid; - } - mutex_unlock(&v9inode->v_mutex); /* Since we are opening a file, assign the open fid to the file */ err =3D finish_open(file, dentry, generic_file_open); if (err) @@ -344,6 +331,7 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct den= try *dentry, fscache_use_cookie(v9fs_inode_cookie(v9inode), file->f_mode & FMODE_WRITE); #endif + v9fs_fid_add_modes(ofid, v9ses->flags, v9ses->cache, flags); v9fs_open_fid_add(inode, &ofid); file->f_mode |=3D FMODE_CREATED; out: @@ -464,9 +452,9 @@ v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns, p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry); v9ses =3D v9fs_dentry2v9ses(dentry); if (v9ses->cache =3D=3D CACHE_LOOSE || v9ses->cache =3D=3D CACHE_FSCACHE)= { - generic_fillattr(&init_user_ns, d_inode(dentry), stat); + generic_fillattr(&init_user_ns, inode, stat); return 0; - } else if (v9ses->cache >=3D CACHE_WRITEBACK) { + } else if (v9ses->cache) { if (S_ISREG(inode->i_mode)) filemap_write_and_wait(inode->i_mapping); } @@ -604,10 +592,10 @@ int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_= userns, if ((iattr->ia_valid & ATTR_SIZE) && iattr->ia_size !=3D i_size_read(inode)) { truncate_setsize(inode, iattr->ia_size); + truncate_pagecache(inode, iattr->ia_size); + if (v9ses->cache =3D=3D CACHE_FSCACHE) fscache_resize_cookie(v9fs_inode_cookie(v9inode), iattr->ia_size); - else - invalidate_mapping_pages(&inode->i_data, 0, -1); } =20 v9fs_invalidate_inode_attr(inode); diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 5fc6a945bfff..797f717e1a91 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -292,23 +292,26 @@ static int v9fs_write_inode(struct inode *inode, { int ret; struct p9_wstat wstat; + struct p9_fid *fid =3D v9fs_fid_find_inode(inode, false, INVALID_UID, tru= e); struct v9fs_inode *v9inode; + /* * send an fsync request to server irrespective of * wbc->sync_mode. */ - p9_debug(P9_DEBUG_VFS, "%s: inode %p\n", __func__, inode); + p9_debug(P9_DEBUG_VFS, "%s: inode %p writeback_fid: %p\n", __func__, inod= e, fid); v9inode =3D V9FS_I(inode); - if (!v9inode->writeback_fid) - return 0; + if (!fid) + return -EINVAL; v9fs_blank_wstat(&wstat); =20 - ret =3D p9_client_wstat(v9inode->writeback_fid, &wstat); + ret =3D p9_client_wstat(fid, &wstat); if (ret < 0) { __mark_inode_dirty(inode, I_DIRTY_DATASYNC); return ret; } fscache_unpin_writeback(wbc, v9fs_inode_cookie(v9inode)); + p9_fid_put(fid); return 0; } =20 @@ -316,6 +319,7 @@ static int v9fs_write_inode_dotl(struct inode *inode, struct writeback_control *wbc) { int ret; + struct p9_fid *fid =3D v9fs_fid_find_inode(inode, FMODE_WRITE, INVALID_UI= D, 1); struct v9fs_inode *v9inode; /* * send an fsync request to server irrespective of @@ -323,16 +327,17 @@ static int v9fs_write_inode_dotl(struct inode *inode, */ v9inode =3D V9FS_I(inode); p9_debug(P9_DEBUG_VFS, "%s: inode %p, writeback_fid %p\n", - __func__, inode, v9inode->writeback_fid); - if (!v9inode->writeback_fid) - return 0; + __func__, inode, fid); + if (!fid) + return -EINVAL; =20 - ret =3D p9_client_fsync(v9inode->writeback_fid, 0); + ret =3D p9_client_fsync(fid, 0); if (ret < 0) { __mark_inode_dirty(inode, I_DIRTY_DATASYNC); return ret; } fscache_unpin_writeback(wbc, v9fs_inode_cookie(v9inode)); + p9_fid_put(fid); return 0; } =20 --=20 2.37.2