From: Luis Henriques <lhenriques@suse.de>
To: Jeff Layton <jlayton@kernel.org>
Cc: ceph-devel@vger.kernel.org, idryomov@gmail.com
Subject: Re: [PATCH] ceph: new helper - ceph_change_snap_realm
Date: Tue, 03 Aug 2021 11:21:03 +0100 [thread overview]
Message-ID: <87mtpyg774.fsf@suse.de> (raw)
In-Reply-To: 20210802185130.94783-1-jlayton@kernel.org
Jeff Layton <jlayton@kernel.org> writes:
> Consolidate some fiddly code for changing an inode's snap_realm
> into a new helper function, and change the callers to use it.
>
> While we're in here, nothing uses the i_snap_realm_counter field, so
> remove that from the inode.
Ah, nice! I remember _long_ time ago I had seen that field and thought:
"I'll need to send out a patch to remove this thing!". But in the
meantime I completely forgot.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/ceph/caps.c | 36 +++---------------------------
> fs/ceph/inode.c | 11 ++-------
> fs/ceph/snap.c | 59 ++++++++++++++++++++++++++++++++-----------------
> fs/ceph/super.h | 2 +-
> 4 files changed, 45 insertions(+), 63 deletions(-)
>
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index cb551c9e5867..cecd4f66a60d 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -704,23 +704,7 @@ void ceph_add_cap(struct inode *inode,
> struct ceph_snap_realm *realm = ceph_lookup_snap_realm(mdsc,
> realmino);
> if (realm) {
> - struct ceph_snap_realm *oldrealm = ci->i_snap_realm;
> - if (oldrealm) {
> - spin_lock(&oldrealm->inodes_with_caps_lock);
> - list_del_init(&ci->i_snap_realm_item);
> - spin_unlock(&oldrealm->inodes_with_caps_lock);
> - }
> -
> - spin_lock(&realm->inodes_with_caps_lock);
> - list_add(&ci->i_snap_realm_item,
> - &realm->inodes_with_caps);
> - ci->i_snap_realm = realm;
> - if (realm->ino == ci->i_vino.ino)
> - realm->inode = inode;
> - spin_unlock(&realm->inodes_with_caps_lock);
> -
> - if (oldrealm)
> - ceph_put_snap_realm(mdsc, oldrealm);
> + ceph_change_snap_realm(inode, realm);
> } else {
> pr_err("ceph_add_cap: couldn't find snap realm %llx\n",
> realmino);
> @@ -1112,20 +1096,6 @@ int ceph_is_any_caps(struct inode *inode)
> return ret;
> }
>
> -static void drop_inode_snap_realm(struct ceph_inode_info *ci)
> -{
> - struct ceph_snap_realm *realm = ci->i_snap_realm;
> - spin_lock(&realm->inodes_with_caps_lock);
> - list_del_init(&ci->i_snap_realm_item);
> - ci->i_snap_realm_counter++;
> - ci->i_snap_realm = NULL;
> - if (realm->ino == ci->i_vino.ino)
> - realm->inode = NULL;
> - spin_unlock(&realm->inodes_with_caps_lock);
> - ceph_put_snap_realm(ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc,
> - realm);
> -}
> -
> /*
> * Remove a cap. Take steps to deal with a racing iterate_session_caps.
> *
> @@ -1201,7 +1171,7 @@ void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
> * keep i_snap_realm.
> */
> if (ci->i_wr_ref == 0 && ci->i_snap_realm)
> - drop_inode_snap_realm(ci);
> + ceph_change_snap_realm(&ci->vfs_inode, NULL);
>
> __cap_delay_cancel(mdsc, ci);
> }
> @@ -3083,7 +3053,7 @@ static void __ceph_put_cap_refs(struct ceph_inode_info *ci, int had,
> }
> /* see comment in __ceph_remove_cap() */
> if (!__ceph_is_any_real_caps(ci) && ci->i_snap_realm)
> - drop_inode_snap_realm(ci);
> + ceph_change_snap_realm(inode, NULL);
> }
> }
> if (check_flushsnaps && __ceph_have_pending_cap_snap(ci)) {
> diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
> index 84e4f112fc45..61ecf81ed875 100644
> --- a/fs/ceph/inode.c
> +++ b/fs/ceph/inode.c
> @@ -582,16 +582,9 @@ void ceph_evict_inode(struct inode *inode)
> */
> if (ci->i_snap_realm) {
> if (ceph_snap(inode) == CEPH_NOSNAP) {
> - struct ceph_snap_realm *realm = ci->i_snap_realm;
> dout(" dropping residual ref to snap realm %p\n",
> - realm);
> - spin_lock(&realm->inodes_with_caps_lock);
> - list_del_init(&ci->i_snap_realm_item);
> - ci->i_snap_realm = NULL;
> - if (realm->ino == ci->i_vino.ino)
> - realm->inode = NULL;
> - spin_unlock(&realm->inodes_with_caps_lock);
> - ceph_put_snap_realm(mdsc, realm);
> + ci->i_snap_realm);
> + ceph_change_snap_realm(inode, NULL);
> } else {
> ceph_put_snapid_map(mdsc, ci->i_snapid_map);
> ci->i_snap_realm = NULL;
> diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
> index 4ac0606dcbd4..9dbc92cfda38 100644
> --- a/fs/ceph/snap.c
> +++ b/fs/ceph/snap.c
> @@ -846,6 +846,43 @@ static void flush_snaps(struct ceph_mds_client *mdsc)
> dout("flush_snaps done\n");
> }
>
> +/**
> + * ceph_change_snap_realm - change the snap_realm for an inode
> + * @inode: inode to move to new snap realm
> + * @realm: new realm to move inode into (may be NULL)
> + *
> + * Detach an inode from its old snaprealm (if any) and attach it to
> + * the new snaprealm (if any). The old snap realm reference held by
> + * the inode is put. If realm is non-NULL, then the caller's reference
> + * to it is taken over by the inode.
> + */
> +void ceph_change_snap_realm(struct inode *inode, struct ceph_snap_realm *realm)
> +{
> + struct ceph_inode_info *ci = ceph_inode(inode);
Just a suggestion: this function could received the struct
ceph_inode_info instead of the inode. Other than that, LGTM. Nice
cleanup! Feel free to add my
Reviewed-by: Luis Henriques <lhenriques@suse.de>
(The other 2 patches ("print more information when..." and "remove
redundant initializations...") also look good BTW.)
Cheers
--
Luis
> + struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
> + struct ceph_snap_realm *oldrealm = ci->i_snap_realm;
> +
> + lockdep_assert_held(&ci->i_ceph_lock);
> +
> + if (oldrealm) {
> + spin_lock(&oldrealm->inodes_with_caps_lock);
> + list_del_init(&ci->i_snap_realm_item);
> + if (oldrealm->ino == ci->i_vino.ino)
> + oldrealm->inode = NULL;
> + spin_unlock(&oldrealm->inodes_with_caps_lock);
> + ceph_put_snap_realm(mdsc, oldrealm);
> + }
> +
> + ci->i_snap_realm = realm;
> +
> + if (realm) {
> + spin_lock(&realm->inodes_with_caps_lock);
> + list_add(&ci->i_snap_realm_item, &realm->inodes_with_caps);
> + if (realm->ino == ci->i_vino.ino)
> + realm->inode = inode;
> + spin_unlock(&realm->inodes_with_caps_lock);
> + }
> +}
>
> /*
> * Handle a snap notification from the MDS.
> @@ -932,7 +969,6 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc,
> };
> struct inode *inode = ceph_find_inode(sb, vino);
> struct ceph_inode_info *ci;
> - struct ceph_snap_realm *oldrealm;
>
> if (!inode)
> continue;
> @@ -957,27 +993,10 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc,
> }
> dout(" will move %p to split realm %llx %p\n",
> inode, realm->ino, realm);
> - /*
> - * Move the inode to the new realm
> - */
> - oldrealm = ci->i_snap_realm;
> - spin_lock(&oldrealm->inodes_with_caps_lock);
> - list_del_init(&ci->i_snap_realm_item);
> - spin_unlock(&oldrealm->inodes_with_caps_lock);
> -
> - spin_lock(&realm->inodes_with_caps_lock);
> - list_add(&ci->i_snap_realm_item,
> - &realm->inodes_with_caps);
> - ci->i_snap_realm = realm;
> - if (realm->ino == ci->i_vino.ino)
> - realm->inode = inode;
> - spin_unlock(&realm->inodes_with_caps_lock);
> -
> - spin_unlock(&ci->i_ceph_lock);
>
> ceph_get_snap_realm(mdsc, realm);
> - ceph_put_snap_realm(mdsc, oldrealm);
> -
> + ceph_change_snap_realm(inode, realm);
> + spin_unlock(&ci->i_ceph_lock);
> iput(inode);
> continue;
>
> diff --git a/fs/ceph/super.h b/fs/ceph/super.h
> index d51d42a00f33..389b45ac291b 100644
> --- a/fs/ceph/super.h
> +++ b/fs/ceph/super.h
> @@ -422,7 +422,6 @@ struct ceph_inode_info {
> struct ceph_snap_realm *i_snap_realm; /* snap realm (if caps) */
> struct ceph_snapid_map *i_snapid_map; /* snapid -> dev_t */
> };
> - int i_snap_realm_counter; /* snap realm (if caps) */
> struct list_head i_snap_realm_item;
> struct list_head i_snap_flush_item;
> struct timespec64 i_btime;
> @@ -933,6 +932,7 @@ extern void ceph_put_snap_realm(struct ceph_mds_client *mdsc,
> extern int ceph_update_snap_trace(struct ceph_mds_client *m,
> void *p, void *e, bool deletion,
> struct ceph_snap_realm **realm_ret);
> +void ceph_change_snap_realm(struct inode *inode, struct ceph_snap_realm *realm);
> extern void ceph_handle_snap(struct ceph_mds_client *mdsc,
> struct ceph_mds_session *session,
> struct ceph_msg *msg);
> --
>
> 2.31.1
>
next prev parent reply other threads:[~2021-08-03 10:21 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-02 18:51 [PATCH] ceph: new helper - ceph_change_snap_realm Jeff Layton
2021-08-03 10:21 ` Luis Henriques [this message]
2021-08-03 19:43 ` Jeff Layton
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=87mtpyg774.fsf@suse.de \
--to=lhenriques@suse.de \
--cc=ceph-devel@vger.kernel.org \
--cc=idryomov@gmail.com \
--cc=jlayton@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.