From patchwork Fri Oct 25 20:39:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 13851757 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3ECA3D149F0 for ; Fri, 25 Oct 2024 20:43:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CCC088D0002; Fri, 25 Oct 2024 16:43:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C7AD98D0001; Fri, 25 Oct 2024 16:43:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B1C1A8D0002; Fri, 25 Oct 2024 16:43:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 38A808D0001 for ; Fri, 25 Oct 2024 16:43:38 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 27E981C6F12 for ; Fri, 25 Oct 2024 20:43:15 +0000 (UTC) X-FDA: 82713299886.10.2F6908D Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf25.hostedemail.com (Postfix) with ESMTP id F35D9A000C for ; Fri, 25 Oct 2024 20:43:21 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LtMZdrrU; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf25.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1729888902; a=rsa-sha256; cv=none; b=vT4sVMGqAgqIvRyJ+rXrtfyG7lU5FDVJhOUkeq49zdB8Oyxo7OcH/+GebPaBhk7Sha9ack 5Ky4+o54rvAENFp6qiWHwTc9Lv4f3i9a1IeeCZTI04sETNaRYaJkXD2IDbW+SBq10Rnp0/ zxyBEJ1wZ4GMz7iHMF/6V5xm3yUvZ8c= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LtMZdrrU; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf25.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1729888902; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=wFqMqWoetmDgJohUIxNDxB+jf1Dpav+HZ2SxzPixQNI=; b=5xwp3dqrTSuRXhoGPzw6C51gkmMnbjcwrm9UKFOyVLcotjuZI1K0araV2Cs3qOMa5OcQ0F FOuOXsEAjB2PP2czvRD7zkA21ymVJc5rZGYGdSJ9nzHsDDvO3FnHFatvHijyrXRc5aoCFF sW85kJUxky9rR+7tv2RuBAHR4KBrj0M= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1729889015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wFqMqWoetmDgJohUIxNDxB+jf1Dpav+HZ2SxzPixQNI=; b=LtMZdrrUXzK90vcKZ/p7x9sacpv6xd77Ww0fQj4XUIDJINdrI8zFQ6DaUm9VjcfwUV3GWc wMHtgb2nYXNGnQW2LFFHusi9vfxwd1DEWWjvQE+GOTgt9xRpP3eL1vRCa1Ip+EiLBnVU0V NW4TyJDaIdULOxgvhTBg1EkOB5gzlYc= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-60-pn1yqeasMsy-bKAE7IAH9g-1; Fri, 25 Oct 2024 16:43:32 -0400 X-MC-Unique: pn1yqeasMsy-bKAE7IAH9g-1 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 6A20D1955EA9; Fri, 25 Oct 2024 20:43:29 +0000 (UTC) Received: from warthog.procyon.org.uk.com (unknown [10.42.28.231]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7BAD2196BB7D; Fri, 25 Oct 2024 20:43:24 +0000 (UTC) From: David Howells To: Christian Brauner , Steve French , Matthew Wilcox Cc: David Howells , Jeff Layton , Gao Xiang , Dominique Martinet , Marc Dionne , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Eric Van Hensbergen , Ilya Dryomov , netfs@lists.linux.dev, linux-afs@lists.infradead.org, linux-cifs@vger.kernel.org, linux-nfs@vger.kernel.org, ceph-devel@vger.kernel.org, v9fs@lists.linux.dev, linux-erofs@lists.ozlabs.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 29/31] afs: Locally initialise the contents of a new symlink on creation Date: Fri, 25 Oct 2024 21:39:56 +0100 Message-ID: <20241025204008.4076565-30-dhowells@redhat.com> In-Reply-To: <20241025204008.4076565-1-dhowells@redhat.com> References: <20241025204008.4076565-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Rspamd-Queue-Id: F35D9A000C X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: n6xf3ozmhu56m9h4f5k51xyhum6pggtc X-HE-Tag: 1729889001-288277 X-HE-Meta: U2FsdGVkX18e7erZubasOp9sWA3v/LWCReFFA2gHEwjpdnr7FJvdagkv0VC2vIaGLnNc6nPZInftPXFLr4qxbRACHB6/n8IlPOLGIrRPx/U9fCsWhxki4nCZfR8BtXx6rtj/xGAQBHqYIR1VN1UUDLVR7MUlhz4bWYyF3LW6eu92d59b6ZFS63zUOsezSDeyYO+HxaGm1r7acSosVTZn2S0v0e1zydb3HRYkyoQLfSOIQDjNS2hTNCPbA7qdsW3mLADf/LHVi2+20l5IQeorYIKzdsW7afEccOXRsgVRPuffJuwWufVht+cWLbR3KTasQFARP27q63dUaxy4Jm9KqANDbISfO/zx5C3kCS2E0I/dxoKY8IkR6e+8lDizbV007QmhJNBMZ8N3lgYsCZZYRUYaHMPr4jn+N42uZA7bMdbbvSlkirhOVHLi3c7b/JQnEMz62hs9t78NR9aD/wuKUm0LSEkVtSu/uoBPPG3b5OCwdoy1LKU6QI8um5riv2vXndR+seCS1n8yNlrahqcszQ2B67FofWyqEQ6s/eSNIYYC3stkzAdbaULj7cAOq/r2P2TGN2ziAX8Fnpil13AY6N174bXmldm4+GS9czUuzFOv/GCNL7e+j2kojdd88hGogFfqfxWw6MNedBZSK/+JlTT2d68XENVvjdq3hxNP8PSwOgNiY/fpXUQr9EJexQv91jPq6Qx22Rp0BX3A1+1An9xEL96kT/iPHBl8P0iSjdT31yDZTYck/DpBf5XPDClW1C4eAX9xzmc1ueEw81mC1KLd6S0pDkrcOPBMzQSYmCCo8AHmC7IuB4Z8VJzuSEU1z7otnhSADgzlNHKKNAIy9JwTIfyBZHcv6HFPPWCQXUR8XCRvfVGaT/pn6AF6uh5UqMkHwPQJ/62fpNWK+lJh7DsbmHqa6252u30XvQvUiD0MBT1X/rHgZY8d+h+DNjDkiz+IWT+kyRkLsadFUl7 p3DvB1cA zRfDJ4lpukyH5IuKBuKa2yk3lOqu7OP+abDWhZMefk7GhjG9mUwaShM8ejxL1Ky29oPX3shYwETaAdiavaJcM+PFd+vVSpX1FCBzRZ3aI13W49FMPJjTIFoty1Gbpoasb0Ohr3sKmO1n4xwvkosbKg2PV8vAHKm941pKnZYuMipFfFxDy6g9fiX82fgVqmb3rSFg48QqOFs0Tbmb9IEXE/aYUT2NCyuAlxLdIg394XRbr7OGt2Q65i1xZAmf+zjDqmG0+FwnnJDTKYFsvsXXVvfCzd6U/tOurZ8hh57WDqIN4IxJO5Xe0HuIG3888aTgJYjvWyZKTaKmn5xAE1ESxEYOE9HrXJZDoXbLf1474Tb1S8TsfRiGwYmIgrOBEFSvJ2BWOhpkEc3pyA+u9x3tPSKTzmWht/dKI6LBJ2p5g692TE+R4pfXns3EHMWq+nHmDAwb1 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Since we know what the contents of a symlink will be when we create it on the server, initialise its contents locally too to avoid the need to download it. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- fs/afs/dir.c | 2 ++ fs/afs/inode.c | 44 ++++++++++++++++++++++++++++++++++------ fs/afs/internal.h | 1 + fs/netfs/buffered_read.c | 2 +- fs/netfs/read_single.c | 2 +- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/fs/afs/dir.c b/fs/afs/dir.c index 6a4fc1cffb7e..663a212964d8 100644 --- a/fs/afs/dir.c +++ b/fs/afs/dir.c @@ -1270,6 +1270,8 @@ static void afs_vnode_new_inode(struct afs_operation *op) set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags); if (S_ISDIR(inode->i_mode)) afs_mkdir_init_dir(vnode, dvp->vnode); + else if (S_ISLNK(inode->i_mode)) + afs_init_new_symlink(vnode, op); if (!afs_op_error(op)) afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb); d_instantiate(op->dentry, inode); diff --git a/fs/afs/inode.c b/fs/afs/inode.c index c3b720fda525..f5618564b3fc 100644 --- a/fs/afs/inode.c +++ b/fs/afs/inode.c @@ -25,6 +25,23 @@ #include "internal.h" #include "afs_fs.h" +void afs_init_new_symlink(struct afs_vnode *vnode, struct afs_operation *op) +{ + size_t size = strlen(op->create.symlink) + 1; + size_t dsize = 0; + char *p; + + if (netfs_alloc_folioq_buffer(NULL, &vnode->directory, &dsize, size, + mapping_gfp_mask(vnode->netfs.inode.i_mapping)) < 0) + return; + + vnode->directory_size = dsize; + p = kmap_local_folio(folioq_folio(vnode->directory, 0), 0); + memcpy(p, op->create.symlink, size); + kunmap_local(p); + netfs_single_mark_inode_dirty(&vnode->netfs.inode); +} + static void afs_put_link(void *arg) { struct folio *folio = virt_to_folio(arg); @@ -41,15 +58,30 @@ const char *afs_get_link(struct dentry *dentry, struct inode *inode, char *content; ssize_t ret; - if (atomic64_read(&vnode->cb_expires_at) == AFS_NO_CB_PROMISE || - !vnode->directory) { - if (!dentry) + if (!dentry) { + /* RCU pathwalk. */ + if (!vnode->directory || !afs_check_validity(vnode)) return ERR_PTR(-ECHILD); - ret = afs_read_single(vnode, NULL); - if (ret < 0) - return ERR_PTR(ret); + goto good; } + if (!vnode->directory) + goto fetch; + + ret = afs_validate(vnode, NULL); + if (ret < 0) + return ERR_PTR(ret); + + if (!test_and_clear_bit(AFS_VNODE_ZAP_DATA, &vnode->flags) && + vnode->directory) + goto good; + +fetch: + ret = afs_read_single(vnode, NULL); + if (ret < 0) + return ERR_PTR(ret); + +good: folio = folioq_folio(vnode->directory, 0); folio_get(folio); content = kmap_local_folio(folio, 0); diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 0737d729f4e6..b11b2dfb8380 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1216,6 +1216,7 @@ extern void afs_fs_probe_cleanup(struct afs_net *); */ extern const struct afs_operation_ops afs_fetch_status_operation; +void afs_init_new_symlink(struct afs_vnode *vnode, struct afs_operation *op); const char *afs_get_link(struct dentry *dentry, struct inode *inode, struct delayed_call *callback); int afs_readlink(struct dentry *dentry, char __user *buffer, int buflen); diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c index 7036e9f12b07..65d9dd71f65d 100644 --- a/fs/netfs/buffered_read.c +++ b/fs/netfs/buffered_read.c @@ -210,7 +210,7 @@ static void netfs_read_to_pagecache(struct netfs_io_request *rreq) do { struct netfs_io_subrequest *subreq; - enum netfs_io_source source = NETFS_DOWNLOAD_FROM_SERVER; + enum netfs_io_source source = NETFS_SOURCE_UNKNOWN; ssize_t slice; subreq = netfs_alloc_subrequest(rreq); diff --git a/fs/netfs/read_single.c b/fs/netfs/read_single.c index 14bc61107182..fea0ecdecc53 100644 --- a/fs/netfs/read_single.c +++ b/fs/netfs/read_single.c @@ -97,7 +97,7 @@ static int netfs_single_dispatch_read(struct netfs_io_request *rreq) if (!subreq) return -ENOMEM; - subreq->source = NETFS_DOWNLOAD_FROM_SERVER; + subreq->source = NETFS_SOURCE_UNKNOWN; subreq->start = 0; subreq->len = rreq->len; subreq->io_iter = rreq->buffer.iter;