From: David Howells <dhowells@redhat.com>
To: Christian Brauner <christian@brauner.io>,
Steve French <smfrench@gmail.com>,
Matthew Wilcox <willy@infradead.org>
Cc: David Howells <dhowells@redhat.com>,
Jeff Layton <jlayton@kernel.org>,
Gao Xiang <hsiangkao@linux.alibaba.com>,
Dominique Martinet <asmadeus@codewreck.org>,
Marc Dionne <marc.dionne@auristor.com>,
Paulo Alcantara <pc@manguebit.com>,
Shyam Prasad N <sprasad@microsoft.com>,
Tom Talpey <tom@talpey.com>,
Eric Van Hensbergen <ericvh@kernel.org>,
Ilya Dryomov <idryomov@gmail.com>,
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 27/31] afs: Make afs_mkdir() locally initialise a new directory's content
Date: Fri, 25 Oct 2024 21:39:54 +0100 [thread overview]
Message-ID: <20241025204008.4076565-28-dhowells@redhat.com> (raw)
In-Reply-To: <20241025204008.4076565-1-dhowells@redhat.com>
Initialise a new directory's content when it is created by mkdir locally
rather than downloading the content from the server as we can predict what
it's going to look like.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/dir.c | 3 +++
fs/afs/dir_edit.c | 48 ++++++++++++++++++++++++++++++++++++++
fs/afs/internal.h | 1 +
include/trace/events/afs.h | 2 ++
4 files changed, 54 insertions(+)
diff --git a/fs/afs/dir.c b/fs/afs/dir.c
index 4b1b25015573..aa589f0d55bf 100644
--- a/fs/afs/dir.c
+++ b/fs/afs/dir.c
@@ -1258,6 +1258,7 @@ void afs_check_for_remote_deletion(struct afs_operation *op)
*/
static void afs_vnode_new_inode(struct afs_operation *op)
{
+ struct afs_vnode_param *dvp = &op->file[0];
struct afs_vnode_param *vp = &op->file[1];
struct afs_vnode *vnode;
struct inode *inode;
@@ -1277,6 +1278,8 @@ static void afs_vnode_new_inode(struct afs_operation *op)
vnode = AFS_FS_I(inode);
set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
+ if (S_ISDIR(inode->i_mode))
+ afs_mkdir_init_dir(vnode, dvp->vnode);
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/dir_edit.c b/fs/afs/dir_edit.c
index 71cce884e434..f4037973416e 100644
--- a/fs/afs/dir_edit.c
+++ b/fs/afs/dir_edit.c
@@ -556,3 +556,51 @@ void afs_edit_dir_update_dotdot(struct afs_vnode *vnode, struct afs_vnode *new_d
0, 0, 0, 0, "..");
goto out;
}
+
+/*
+ * Initialise a new directory. We need to fill in the "." and ".." entries.
+ */
+void afs_mkdir_init_dir(struct afs_vnode *dvnode, struct afs_vnode *parent_dvnode)
+{
+ union afs_xdr_dir_block *meta;
+ struct afs_dir_iter iter = { .dvnode = dvnode };
+ union afs_xdr_dirent *de;
+ unsigned int slot = AFS_DIR_RESV_BLOCKS0;
+ loff_t i_size;
+
+ i_size = i_size_read(&dvnode->netfs.inode);
+ if (i_size != AFS_DIR_BLOCK_SIZE) {
+ afs_invalidate_dir(dvnode, afs_dir_invalid_edit_add_bad_size);
+ return;
+ }
+
+ meta = afs_dir_get_block(&iter, 0);
+ if (!meta)
+ return;
+
+ afs_edit_init_block(meta, meta, 0);
+
+ de = &meta->dirents[slot];
+ de->u.valid = 1;
+ de->u.vnode = htonl(dvnode->fid.vnode);
+ de->u.unique = htonl(dvnode->fid.unique);
+ memcpy(de->u.name, ".", 2);
+ trace_afs_edit_dir(dvnode, afs_edit_dir_for_mkdir, afs_edit_dir_mkdir, 0, slot,
+ dvnode->fid.vnode, dvnode->fid.unique, ".");
+ slot++;
+
+ de = &meta->dirents[slot];
+ de->u.valid = 1;
+ de->u.vnode = htonl(parent_dvnode->fid.vnode);
+ de->u.unique = htonl(parent_dvnode->fid.unique);
+ memcpy(de->u.name, "..", 3);
+ trace_afs_edit_dir(dvnode, afs_edit_dir_for_mkdir, afs_edit_dir_mkdir, 0, slot,
+ parent_dvnode->fid.vnode, parent_dvnode->fid.unique, "..");
+
+ afs_set_contig_bits(meta, AFS_DIR_RESV_BLOCKS0, 2);
+ meta->meta.alloc_ctrs[0] -= 2;
+ kunmap_local(meta);
+
+ netfs_single_mark_inode_dirty(&dvnode->netfs.inode);
+ set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags);
+}
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index c7f0d75eab7f..3acf1445e444 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -1074,6 +1074,7 @@ extern void afs_edit_dir_add(struct afs_vnode *, struct qstr *, struct afs_fid *
extern void afs_edit_dir_remove(struct afs_vnode *, struct qstr *, enum afs_edit_dir_reason);
void afs_edit_dir_update_dotdot(struct afs_vnode *vnode, struct afs_vnode *new_dvnode,
enum afs_edit_dir_reason why);
+void afs_mkdir_init_dir(struct afs_vnode *dvnode, struct afs_vnode *parent_vnode);
/*
* dir_silly.c
diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h
index 49a749672e38..020ab7302a6b 100644
--- a/include/trace/events/afs.h
+++ b/include/trace/events/afs.h
@@ -348,6 +348,7 @@ enum yfs_cm_operation {
EM(afs_dir_invalid_edit_add_no_slots, "edit-add-no-slots") \
EM(afs_dir_invalid_edit_add_too_many_blocks, "edit-add-too-many-blocks") \
EM(afs_dir_invalid_edit_get_block, "edit-get-block") \
+ EM(afs_dir_invalid_edit_mkdir, "edit-mkdir") \
EM(afs_dir_invalid_edit_rem_bad_size, "edit-rem-bad-size") \
EM(afs_dir_invalid_edit_rem_wrong_name, "edit-rem-wrong_name") \
EM(afs_dir_invalid_edit_upd_bad_size, "edit-upd-bad-size") \
@@ -369,6 +370,7 @@ enum yfs_cm_operation {
EM(afs_edit_dir_delete_error, "d_err ") \
EM(afs_edit_dir_delete_inval, "d_invl") \
EM(afs_edit_dir_delete_noent, "d_nent") \
+ EM(afs_edit_dir_mkdir, "mk_ent") \
EM(afs_edit_dir_update_dd, "u_ddot") \
EM(afs_edit_dir_update_error, "u_fail") \
EM(afs_edit_dir_update_inval, "u_invl") \
next prev parent reply other threads:[~2024-10-25 20:43 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-25 20:39 [PATCH v2 00/31] netfs: Read performance improvements and "single-blob" support David Howells
2024-10-25 20:39 ` [PATCH v2 01/31] netfs: Remove call to folio_index() David Howells
2024-10-25 20:39 ` [PATCH v2 02/31] netfs: Fix a few minor bugs in netfs_page_mkwrite() David Howells
2024-10-25 20:39 ` [PATCH v2 03/31] netfs: Remove unnecessary references to pages David Howells
2024-10-25 20:39 ` [PATCH v2 04/31] netfs: Use a folio_queue allocation and free functions David Howells
2024-10-25 20:39 ` [PATCH v2 05/31] netfs: Add a tracepoint to log the lifespan of folio_queue structs David Howells
2024-10-25 20:39 ` [PATCH v2 06/31] netfs: Abstract out a rolling folio buffer implementation David Howells
2024-10-25 20:39 ` [PATCH v2 07/31] netfs: Make netfs_advance_write() return size_t David Howells
2024-10-25 20:39 ` [PATCH v2 08/31] netfs: Split retry code out of fs/netfs/write_collect.c David Howells
2024-10-25 20:39 ` [PATCH v2 09/31] netfs: Drop the error arg from netfs_read_subreq_terminated() David Howells
2024-10-25 20:39 ` [PATCH v2 10/31] netfs: Drop the was_async " David Howells
2024-10-25 20:39 ` [PATCH v2 11/31] netfs: Don't use bh spinlock David Howells
2024-10-25 20:39 ` [PATCH v2 12/31] afs: Don't use mutex for I/O operation lock David Howells
2024-10-25 20:39 ` [PATCH v2 13/31] afs: Fix EEXIST error returned from afs_rmdir() to be ENOTEMPTY David Howells
2024-10-25 20:39 ` [PATCH v2 14/31] afs: Fix directory format encoding struct David Howells
2024-10-25 20:39 ` [PATCH v2 15/31] netfs: Remove some extraneous directory invalidations David Howells
2024-10-25 20:39 ` [PATCH v2 16/31] cachefiles: Add some subrequest tracepoints David Howells
2024-10-25 20:39 ` [PATCH v2 17/31] cachefiles: Add auxiliary data trace David Howells
2024-10-25 20:39 ` [PATCH v2 18/31] afs: Add more tracepoints to do with tracking validity David Howells
2024-10-25 20:39 ` [PATCH v2 19/31] netfs: Add functions to build/clean a buffer in a folio_queue David Howells
2024-10-25 20:39 ` [PATCH v2 20/31] netfs: Add support for caching single monolithic objects such as AFS dirs David Howells
2024-10-25 20:39 ` [PATCH v2 21/31] afs: Make afs_init_request() get a key if not given a file David Howells
2024-10-25 20:39 ` [PATCH v2 22/31] afs: Use netfslib for directories David Howells
2024-10-25 20:39 ` [PATCH v2 23/31] afs: Use netfslib for symlinks, allowing them to be cached David Howells
2024-10-25 20:39 ` [PATCH v2 24/31] afs: Eliminate afs_read David Howells
2024-10-25 20:39 ` [PATCH v2 25/31] afs: Make {Y,}FS.FetchData an asynchronous operation David Howells
2024-10-25 20:39 ` [PATCH v2 26/31] netfs: Change the read result collector to only use one work item David Howells
2024-10-25 20:39 ` David Howells [this message]
2024-10-25 20:39 ` [PATCH v2 28/31] afs: Use the contained hashtable to search a directory David Howells
2024-10-25 20:39 ` [PATCH v2 29/31] afs: Locally initialise the contents of a new symlink on creation David Howells
2024-10-25 20:39 ` [PATCH v2 30/31] afs: Add a tracepoint for afs_read_receive() David Howells
2024-10-25 20:39 ` [PATCH v2 31/31] netfs: Report on NULL folioq in netfs_writeback_unlock_folios() David Howells
2024-10-31 12:58 ` [PATCH v2 25/31] afs: Make {Y,}FS.FetchData an asynchronous operation David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241025204008.4076565-28-dhowells@redhat.com \
--to=dhowells@redhat.com \
--cc=asmadeus@codewreck.org \
--cc=ceph-devel@vger.kernel.org \
--cc=christian@brauner.io \
--cc=ericvh@kernel.org \
--cc=hsiangkao@linux.alibaba.com \
--cc=idryomov@gmail.com \
--cc=jlayton@kernel.org \
--cc=linux-afs@lists.infradead.org \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-erofs@lists.ozlabs.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nfs@vger.kernel.org \
--cc=marc.dionne@auristor.com \
--cc=netdev@vger.kernel.org \
--cc=netfs@lists.linux.dev \
--cc=pc@manguebit.com \
--cc=smfrench@gmail.com \
--cc=sprasad@microsoft.com \
--cc=tom@talpey.com \
--cc=v9fs@lists.linux.dev \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox