diff options
author | Jeff Layton <jlayton@kernel.org> | 2020-01-02 07:11:38 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2020-03-30 12:42:42 +0200 |
commit | 785892fe88f693028a996d1cb363d60609848e5e (patch) | |
tree | 9980dd1896567844b173d03d528b811e515a57b1 /fs/ceph/mds_client.c | |
parent | 6deb8008a8e64eec3b1e06cc4286905ee6b14e42 (diff) | |
download | lwn-785892fe88f693028a996d1cb363d60609848e5e.tar.gz lwn-785892fe88f693028a996d1cb363d60609848e5e.zip |
ceph: cache layout in parent dir on first sync create
If a create is done, then typically we'll end up writing to the file
soon afterward. We don't want to wait for the reply before doing that
when doing an async create, so that means we need the layout for the
new file before we've gotten the response from the MDS.
All files created in a directory will initially inherit the same layout,
so copy off the requisite info from the first synchronous create in the
directory, and save it in a new i_cached_layout field. Zero out the
layout when we lose Dc caps in the dir.
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/mds_client.c')
-rw-r--r-- | fs/ceph/mds_client.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index a0ad9bd56b7f..177acb9f456b 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -3535,8 +3535,13 @@ static int reconnect_caps_cb(struct inode *inode, struct ceph_cap *cap, cap->cap_gen = cap->session->s_cap_gen; /* These are lost when the session goes away */ - if (S_ISDIR(inode->i_mode)) + if (S_ISDIR(inode->i_mode)) { + if (cap->issued & CEPH_CAP_DIR_CREATE) { + ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns)); + memset(&ci->i_cached_layout, 0, sizeof(ci->i_cached_layout)); + } cap->issued &= ~CEPH_CAP_ANY_DIR_OPS; + } if (recon_state->msg_version >= 2) { rec.v2.cap_id = cpu_to_le64(cap->cap_id); |