diff mbox series

[v4,2/6] ceph: pass the mdsc to several helpers

Message ID 20230619071438.7000-3-xiubli@redhat.com
State New
Headers show
Series ceph: print the client global id for debug logs | expand

Commit Message

Xiubo Li June 19, 2023, 7:14 a.m. UTC
From: Xiubo Li <xiubli@redhat.com>

We will use the 'mdsc' to get the global_id in the following commits.

URL: https://tracker.ceph.com/issues/61590
Cc: Patrick Donnelly <pdonnell@redhat.com>
Reviewed-by: Patrick Donnelly <pdonnell@redhat.com>
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
 fs/ceph/caps.c              | 15 +++++++++------
 fs/ceph/debugfs.c           |  4 ++--
 fs/ceph/dir.c               |  2 +-
 fs/ceph/file.c              |  2 +-
 fs/ceph/mds_client.c        | 37 +++++++++++++++++++++----------------
 fs/ceph/mds_client.h        |  3 ++-
 fs/ceph/mdsmap.c            |  3 ++-
 fs/ceph/snap.c              |  8 +++++---
 fs/ceph/super.h             |  3 ++-
 include/linux/ceph/mdsmap.h |  5 ++++-
 10 files changed, 49 insertions(+), 33 deletions(-)

Comments

Milind Changire Sept. 4, 2023, 9:28 a.m. UTC | #1
Looks good to me.

Tested-by: Milind Changire <mchangir@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
Reviewed-by: Milind Changire <mchangir@redhat.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>

On Mon, Jun 19, 2023 at 12:47 PM <xiubli@redhat.com> wrote:
>
> From: Xiubo Li <xiubli@redhat.com>
>
> We will use the 'mdsc' to get the global_id in the following commits.
>
> URL: https://tracker.ceph.com/issues/61590
> Cc: Patrick Donnelly <pdonnell@redhat.com>
> Reviewed-by: Patrick Donnelly <pdonnell@redhat.com>
> Signed-off-by: Xiubo Li <xiubli@redhat.com>
> ---
>  fs/ceph/caps.c              | 15 +++++++++------
>  fs/ceph/debugfs.c           |  4 ++--
>  fs/ceph/dir.c               |  2 +-
>  fs/ceph/file.c              |  2 +-
>  fs/ceph/mds_client.c        | 37 +++++++++++++++++++++----------------
>  fs/ceph/mds_client.h        |  3 ++-
>  fs/ceph/mdsmap.c            |  3 ++-
>  fs/ceph/snap.c              |  8 +++++---
>  fs/ceph/super.h             |  3 ++-
>  include/linux/ceph/mdsmap.h |  5 ++++-
>  10 files changed, 49 insertions(+), 33 deletions(-)
>
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index 59ab5d905ac4..99e805144935 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -1178,7 +1178,8 @@ void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
>         }
>  }
>
> -void ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
> +void ceph_remove_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
> +                    bool queue_release)
>  {
>         struct ceph_inode_info *ci = cap->ci;
>         struct ceph_fs_client *fsc;
> @@ -1341,6 +1342,8 @@ static void encode_cap_msg(struct ceph_msg *msg, struct cap_msg_args *arg)
>   */
>  void __ceph_remove_caps(struct ceph_inode_info *ci)
>  {
> +       struct inode *inode = &ci->netfs.inode;
> +       struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
>         struct rb_node *p;
>
>         /* lock i_ceph_lock, because ceph_d_revalidate(..., LOOKUP_RCU)
> @@ -1350,7 +1353,7 @@ void __ceph_remove_caps(struct ceph_inode_info *ci)
>         while (p) {
>                 struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node);
>                 p = rb_next(p);
> -               ceph_remove_cap(cap, true);
> +               ceph_remove_cap(mdsc, cap, true);
>         }
>         spin_unlock(&ci->i_ceph_lock);
>  }
> @@ -3991,7 +3994,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
>                 goto out_unlock;
>
>         if (target < 0) {
> -               ceph_remove_cap(cap, false);
> +               ceph_remove_cap(mdsc, cap, false);
>                 goto out_unlock;
>         }
>
> @@ -4026,7 +4029,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
>                                 change_auth_cap_ses(ci, tcap->session);
>                         }
>                 }
> -               ceph_remove_cap(cap, false);
> +               ceph_remove_cap(mdsc, cap, false);
>                 goto out_unlock;
>         } else if (tsession) {
>                 /* add placeholder for the export tagert */
> @@ -4043,7 +4046,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
>                         spin_unlock(&mdsc->cap_dirty_lock);
>                 }
>
> -               ceph_remove_cap(cap, false);
> +               ceph_remove_cap(mdsc, cap, false);
>                 goto out_unlock;
>         }
>
> @@ -4156,7 +4159,7 @@ static void handle_cap_import(struct ceph_mds_client *mdsc,
>                                         ocap->mseq, mds, le32_to_cpu(ph->seq),
>                                         le32_to_cpu(ph->mseq));
>                 }
> -               ceph_remove_cap(ocap, (ph->flags & CEPH_CAP_FLAG_RELEASE));
> +               ceph_remove_cap(mdsc, ocap, (ph->flags & CEPH_CAP_FLAG_RELEASE));
>         }
>
>         *old_issued = issued;
> diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
> index 3904333fa6c3..2f1e7498cd74 100644
> --- a/fs/ceph/debugfs.c
> +++ b/fs/ceph/debugfs.c
> @@ -81,7 +81,7 @@ static int mdsc_show(struct seq_file *s, void *p)
>                 if (req->r_inode) {
>                         seq_printf(s, " #%llx", ceph_ino(req->r_inode));
>                 } else if (req->r_dentry) {
> -                       path = ceph_mdsc_build_path(req->r_dentry, &pathlen,
> +                       path = ceph_mdsc_build_path(mdsc, req->r_dentry, &pathlen,
>                                                     &pathbase, 0);
>                         if (IS_ERR(path))
>                                 path = NULL;
> @@ -100,7 +100,7 @@ static int mdsc_show(struct seq_file *s, void *p)
>                 }
>
>                 if (req->r_old_dentry) {
> -                       path = ceph_mdsc_build_path(req->r_old_dentry, &pathlen,
> +                       path = ceph_mdsc_build_path(mdsc, req->r_old_dentry, &pathlen,
>                                                     &pathbase, 0);
>                         if (IS_ERR(path))
>                                 path = NULL;
> diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
> index 1b46f2b998c3..5fbcd0d5e5ec 100644
> --- a/fs/ceph/dir.c
> +++ b/fs/ceph/dir.c
> @@ -1219,7 +1219,7 @@ static void ceph_async_unlink_cb(struct ceph_mds_client *mdsc,
>         if (result) {
>                 int pathlen = 0;
>                 u64 base = 0;
> -               char *path = ceph_mdsc_build_path(dentry, &pathlen,
> +               char *path = ceph_mdsc_build_path(mdsc, dentry, &pathlen,
>                                                   &base, 0);
>
>                 /* mark error on parent + clear complete */
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index e878a462c7c3..04bc4cc8ad9b 100644
> --- a/fs/ceph/file.c
> +++ b/fs/ceph/file.c
> @@ -574,7 +574,7 @@ static void ceph_async_create_cb(struct ceph_mds_client *mdsc,
>         if (result) {
>                 int pathlen = 0;
>                 u64 base = 0;
> -               char *path = ceph_mdsc_build_path(req->r_dentry, &pathlen,
> +               char *path = ceph_mdsc_build_path(mdsc, req->r_dentry, &pathlen,
>                                                   &base, 0);
>
>                 pr_warn("async create failure path=(%llx)%s result=%d!\n",
> diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> index 0a70a2438cb2..b9c7b6c60357 100644
> --- a/fs/ceph/mds_client.c
> +++ b/fs/ceph/mds_client.c
> @@ -2125,6 +2125,7 @@ static bool drop_negative_children(struct dentry *dentry)
>   */
>  static int trim_caps_cb(struct inode *inode, int mds, void *arg)
>  {
> +       struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
>         int *remaining = arg;
>         struct ceph_inode_info *ci = ceph_inode(inode);
>         int used, wanted, oissued, mine;
> @@ -2172,7 +2173,7 @@ static int trim_caps_cb(struct inode *inode, int mds, void *arg)
>
>         if (oissued) {
>                 /* we aren't the only cap.. just remove us */
> -               ceph_remove_cap(cap, true);
> +               ceph_remove_cap(mdsc, cap, true);
>                 (*remaining)--;
>         } else {
>                 struct dentry *dentry;
> @@ -2633,7 +2634,8 @@ static u8 *get_fscrypt_altname(const struct ceph_mds_request *req, u32 *plen)
>   * Encode hidden .snap dirs as a double /, i.e.
>   *   foo/.snap/bar -> foo//bar
>   */
> -char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *pbase, int for_wire)
> +char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc, struct dentry *dentry,
> +                          int *plen, u64 *pbase, int for_wire)
>  {
>         struct dentry *cur;
>         struct inode *inode;
> @@ -2748,9 +2750,9 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *pbase, int for
>         return path + pos;
>  }
>
> -static int build_dentry_path(struct dentry *dentry, struct inode *dir,
> -                            const char **ppath, int *ppathlen, u64 *pino,
> -                            bool *pfreepath, bool parent_locked)
> +static int build_dentry_path(struct ceph_mds_client *mdsc, struct dentry *dentry,
> +                            struct inode *dir, const char **ppath, int *ppathlen,
> +                            u64 *pino, bool *pfreepath, bool parent_locked)
>  {
>         char *path;
>
> @@ -2765,7 +2767,7 @@ static int build_dentry_path(struct dentry *dentry, struct inode *dir,
>                 return 0;
>         }
>         rcu_read_unlock();
> -       path = ceph_mdsc_build_path(dentry, ppathlen, pino, 1);
> +       path = ceph_mdsc_build_path(mdsc, dentry, ppathlen, pino, 1);
>         if (IS_ERR(path))
>                 return PTR_ERR(path);
>         *ppath = path;
> @@ -2777,6 +2779,7 @@ static int build_inode_path(struct inode *inode,
>                             const char **ppath, int *ppathlen, u64 *pino,
>                             bool *pfreepath)
>  {
> +       struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
>         struct dentry *dentry;
>         char *path;
>
> @@ -2786,7 +2789,7 @@ static int build_inode_path(struct inode *inode,
>                 return 0;
>         }
>         dentry = d_find_alias(inode);
> -       path = ceph_mdsc_build_path(dentry, ppathlen, pino, 1);
> +       path = ceph_mdsc_build_path(mdsc, dentry, ppathlen, pino, 1);
>         dput(dentry);
>         if (IS_ERR(path))
>                 return PTR_ERR(path);
> @@ -2799,10 +2802,11 @@ static int build_inode_path(struct inode *inode,
>   * request arguments may be specified via an inode *, a dentry *, or
>   * an explicit ino+path.
>   */
> -static int set_request_path_attr(struct inode *rinode, struct dentry *rdentry,
> -                                 struct inode *rdiri, const char *rpath,
> -                                 u64 rino, const char **ppath, int *pathlen,
> -                                 u64 *ino, bool *freepath, bool parent_locked)
> +static int set_request_path_attr(struct ceph_mds_client *mdsc, struct inode *rinode,
> +                                struct dentry *rdentry, struct inode *rdiri,
> +                                const char *rpath, u64 rino, const char **ppath,
> +                                int *pathlen, u64 *ino, bool *freepath,
> +                                bool parent_locked)
>  {
>         int r = 0;
>
> @@ -2811,7 +2815,7 @@ static int set_request_path_attr(struct inode *rinode, struct dentry *rdentry,
>                 dout(" inode %p %llx.%llx\n", rinode, ceph_ino(rinode),
>                      ceph_snap(rinode));
>         } else if (rdentry) {
> -               r = build_dentry_path(rdentry, rdiri, ppath, pathlen, ino,
> +               r = build_dentry_path(mdsc, rdentry, rdiri, ppath, pathlen, ino,
>                                         freepath, parent_locked);
>                 dout(" dentry %p %llx/%.*s\n", rdentry, *ino, *pathlen,
>                      *ppath);
> @@ -2883,7 +2887,7 @@ static struct ceph_msg *create_request_message(struct ceph_mds_session *session,
>         int ret;
>         bool legacy = !(session->s_con.peer_features & CEPH_FEATURE_FS_BTIME);
>
> -       ret = set_request_path_attr(req->r_inode, req->r_dentry,
> +       ret = set_request_path_attr(mdsc, req->r_inode, req->r_dentry,
>                               req->r_parent, req->r_path1, req->r_ino1.ino,
>                               &path1, &pathlen1, &ino1, &freepath1,
>                               test_bit(CEPH_MDS_R_PARENT_LOCKED,
> @@ -2897,7 +2901,7 @@ static struct ceph_msg *create_request_message(struct ceph_mds_session *session,
>         if (req->r_old_dentry &&
>             !(req->r_old_dentry->d_flags & DCACHE_DISCONNECTED))
>                 old_dentry = req->r_old_dentry;
> -       ret = set_request_path_attr(NULL, old_dentry,
> +       ret = set_request_path_attr(mdsc, NULL, old_dentry,
>                               req->r_old_dentry_dir,
>                               req->r_path2, req->r_ino2.ino,
>                               &path2, &pathlen2, &ino2, &freepath2, true);
> @@ -4288,6 +4292,7 @@ static struct dentry* d_find_primary(struct inode *inode)
>   */
>  static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)
>  {
> +       struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
>         union {
>                 struct ceph_mds_cap_reconnect v2;
>                 struct ceph_mds_cap_reconnect_v1 v1;
> @@ -4305,7 +4310,7 @@ static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)
>         dentry = d_find_primary(inode);
>         if (dentry) {
>                 /* set pathbase to parent dir when msg_version >= 2 */
> -               path = ceph_mdsc_build_path(dentry, &pathlen, &pathbase,
> +               path = ceph_mdsc_build_path(mdsc, dentry, &pathlen, &pathbase,
>                                             recon_state->msg_version >= 2);
>                 dput(dentry);
>                 if (IS_ERR(path)) {
> @@ -5660,7 +5665,7 @@ void ceph_mdsc_handle_mdsmap(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
>                 return;
>         }
>
> -       newmap = ceph_mdsmap_decode(&p, end, ceph_msgr2(mdsc->fsc->client));
> +       newmap = ceph_mdsmap_decode(mdsc, &p, end, ceph_msgr2(mdsc->fsc->client));
>         if (IS_ERR(newmap)) {
>                 err = PTR_ERR(newmap);
>                 goto bad_unlock;
> diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
> index 351d92f7fc4f..20bcf8d5322e 100644
> --- a/fs/ceph/mds_client.h
> +++ b/fs/ceph/mds_client.h
> @@ -578,7 +578,8 @@ static inline void ceph_mdsc_free_path(char *path, int len)
>                 __putname(path - (PATH_MAX - 1 - len));
>  }
>
> -extern char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
> +extern char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc,
> +                                 struct dentry *dentry, int *plen, u64 *base,
>                                   int stop_on_nosnap);
>
>  extern void __ceph_mdsc_drop_dentry_lease(struct dentry *dentry);
> diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
> index 7dac21ee6ce7..6cbec7aed5a0 100644
> --- a/fs/ceph/mdsmap.c
> +++ b/fs/ceph/mdsmap.c
> @@ -114,7 +114,8 @@ static int __decode_and_drop_compat_set(void **p, void* end)
>   * Ignore any fields we don't care about (there are quite a few of
>   * them).
>   */
> -struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end, bool msgr2)
> +struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p,
> +                                      void *end, bool msgr2)
>  {
>         struct ceph_mdsmap *m;
>         const void *start = *p;
> diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
> index abd52f5b3b0a..5bd47829a005 100644
> --- a/fs/ceph/snap.c
> +++ b/fs/ceph/snap.c
> @@ -451,7 +451,8 @@ static void rebuild_snap_realms(struct ceph_snap_realm *realm,
>                         continue;
>                 }
>
> -               last = build_snap_context(_realm, &realm_queue, dirty_realms);
> +               last = build_snap_context(mdsc, _realm, &realm_queue,
> +                                         dirty_realms);
>                 dout("%s %llx %p, %s\n", __func__, _realm->ino, _realm,
>                      last > 0 ? "is deferred" : !last ? "succeeded" : "failed");
>
> @@ -709,7 +710,8 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
>   * Queue cap_snaps for snap writeback for this realm and its children.
>   * Called under snap_rwsem, so realm topology won't change.
>   */
> -static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
> +static void queue_realm_cap_snaps(struct ceph_mds_client *mdsc,
> +                                 struct ceph_snap_realm *realm)
>  {
>         struct ceph_inode_info *ci;
>         struct inode *lastinode = NULL;
> @@ -874,7 +876,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
>                 realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
>                                          dirty_item);
>                 list_del_init(&realm->dirty_item);
> -               queue_realm_cap_snaps(realm);
> +               queue_realm_cap_snaps(mdsc, realm);
>         }
>
>         if (realm_ret)
> diff --git a/fs/ceph/super.h b/fs/ceph/super.h
> index 107a9d16a4e8..ab5c0c703eae 100644
> --- a/fs/ceph/super.h
> +++ b/fs/ceph/super.h
> @@ -1223,7 +1223,8 @@ extern void ceph_add_cap(struct inode *inode,
>                          unsigned cap, unsigned seq, u64 realmino, int flags,
>                          struct ceph_cap **new_cap);
>  extern void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release);
> -extern void ceph_remove_cap(struct ceph_cap *cap, bool queue_release);
> +extern void ceph_remove_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
> +                           bool queue_release);
>  extern void __ceph_remove_caps(struct ceph_inode_info *ci);
>  extern void ceph_put_cap(struct ceph_mds_client *mdsc,
>                          struct ceph_cap *cap);
> diff --git a/include/linux/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h
> index 4c3e0648dc27..89f1931f1ba6 100644
> --- a/include/linux/ceph/mdsmap.h
> +++ b/include/linux/ceph/mdsmap.h
> @@ -5,6 +5,8 @@
>  #include <linux/bug.h>
>  #include <linux/ceph/types.h>
>
> +struct ceph_mds_client;
> +
>  /*
>   * mds map - describe servers in the mds cluster.
>   *
> @@ -65,7 +67,8 @@ static inline bool ceph_mdsmap_is_laggy(struct ceph_mdsmap *m, int w)
>  }
>
>  extern int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m);
> -struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end, bool msgr2);
> +struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p,
> +                                      void *end, bool msgr2);
>  extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m);
>  extern bool ceph_mdsmap_is_cluster_available(struct ceph_mdsmap *m);
>
> --
> 2.40.1
>
diff mbox series

Patch

diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 59ab5d905ac4..99e805144935 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1178,7 +1178,8 @@  void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
 	}
 }
 
-void ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
+void ceph_remove_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
+		     bool queue_release)
 {
 	struct ceph_inode_info *ci = cap->ci;
 	struct ceph_fs_client *fsc;
@@ -1341,6 +1342,8 @@  static void encode_cap_msg(struct ceph_msg *msg, struct cap_msg_args *arg)
  */
 void __ceph_remove_caps(struct ceph_inode_info *ci)
 {
+	struct inode *inode = &ci->netfs.inode;
+	struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
 	struct rb_node *p;
 
 	/* lock i_ceph_lock, because ceph_d_revalidate(..., LOOKUP_RCU)
@@ -1350,7 +1353,7 @@  void __ceph_remove_caps(struct ceph_inode_info *ci)
 	while (p) {
 		struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node);
 		p = rb_next(p);
-		ceph_remove_cap(cap, true);
+		ceph_remove_cap(mdsc, cap, true);
 	}
 	spin_unlock(&ci->i_ceph_lock);
 }
@@ -3991,7 +3994,7 @@  static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
 		goto out_unlock;
 
 	if (target < 0) {
-		ceph_remove_cap(cap, false);
+		ceph_remove_cap(mdsc, cap, false);
 		goto out_unlock;
 	}
 
@@ -4026,7 +4029,7 @@  static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
 				change_auth_cap_ses(ci, tcap->session);
 			}
 		}
-		ceph_remove_cap(cap, false);
+		ceph_remove_cap(mdsc, cap, false);
 		goto out_unlock;
 	} else if (tsession) {
 		/* add placeholder for the export tagert */
@@ -4043,7 +4046,7 @@  static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
 			spin_unlock(&mdsc->cap_dirty_lock);
 		}
 
-		ceph_remove_cap(cap, false);
+		ceph_remove_cap(mdsc, cap, false);
 		goto out_unlock;
 	}
 
@@ -4156,7 +4159,7 @@  static void handle_cap_import(struct ceph_mds_client *mdsc,
 					ocap->mseq, mds, le32_to_cpu(ph->seq),
 					le32_to_cpu(ph->mseq));
 		}
-		ceph_remove_cap(ocap, (ph->flags & CEPH_CAP_FLAG_RELEASE));
+		ceph_remove_cap(mdsc, ocap, (ph->flags & CEPH_CAP_FLAG_RELEASE));
 	}
 
 	*old_issued = issued;
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 3904333fa6c3..2f1e7498cd74 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -81,7 +81,7 @@  static int mdsc_show(struct seq_file *s, void *p)
 		if (req->r_inode) {
 			seq_printf(s, " #%llx", ceph_ino(req->r_inode));
 		} else if (req->r_dentry) {
-			path = ceph_mdsc_build_path(req->r_dentry, &pathlen,
+			path = ceph_mdsc_build_path(mdsc, req->r_dentry, &pathlen,
 						    &pathbase, 0);
 			if (IS_ERR(path))
 				path = NULL;
@@ -100,7 +100,7 @@  static int mdsc_show(struct seq_file *s, void *p)
 		}
 
 		if (req->r_old_dentry) {
-			path = ceph_mdsc_build_path(req->r_old_dentry, &pathlen,
+			path = ceph_mdsc_build_path(mdsc, req->r_old_dentry, &pathlen,
 						    &pathbase, 0);
 			if (IS_ERR(path))
 				path = NULL;
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index 1b46f2b998c3..5fbcd0d5e5ec 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -1219,7 +1219,7 @@  static void ceph_async_unlink_cb(struct ceph_mds_client *mdsc,
 	if (result) {
 		int pathlen = 0;
 		u64 base = 0;
-		char *path = ceph_mdsc_build_path(dentry, &pathlen,
+		char *path = ceph_mdsc_build_path(mdsc, dentry, &pathlen,
 						  &base, 0);
 
 		/* mark error on parent + clear complete */
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index e878a462c7c3..04bc4cc8ad9b 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -574,7 +574,7 @@  static void ceph_async_create_cb(struct ceph_mds_client *mdsc,
 	if (result) {
 		int pathlen = 0;
 		u64 base = 0;
-		char *path = ceph_mdsc_build_path(req->r_dentry, &pathlen,
+		char *path = ceph_mdsc_build_path(mdsc, req->r_dentry, &pathlen,
 						  &base, 0);
 
 		pr_warn("async create failure path=(%llx)%s result=%d!\n",
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 0a70a2438cb2..b9c7b6c60357 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -2125,6 +2125,7 @@  static bool drop_negative_children(struct dentry *dentry)
  */
 static int trim_caps_cb(struct inode *inode, int mds, void *arg)
 {
+	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
 	int *remaining = arg;
 	struct ceph_inode_info *ci = ceph_inode(inode);
 	int used, wanted, oissued, mine;
@@ -2172,7 +2173,7 @@  static int trim_caps_cb(struct inode *inode, int mds, void *arg)
 
 	if (oissued) {
 		/* we aren't the only cap.. just remove us */
-		ceph_remove_cap(cap, true);
+		ceph_remove_cap(mdsc, cap, true);
 		(*remaining)--;
 	} else {
 		struct dentry *dentry;
@@ -2633,7 +2634,8 @@  static u8 *get_fscrypt_altname(const struct ceph_mds_request *req, u32 *plen)
  * Encode hidden .snap dirs as a double /, i.e.
  *   foo/.snap/bar -> foo//bar
  */
-char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *pbase, int for_wire)
+char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc, struct dentry *dentry,
+			   int *plen, u64 *pbase, int for_wire)
 {
 	struct dentry *cur;
 	struct inode *inode;
@@ -2748,9 +2750,9 @@  char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *pbase, int for
 	return path + pos;
 }
 
-static int build_dentry_path(struct dentry *dentry, struct inode *dir,
-			     const char **ppath, int *ppathlen, u64 *pino,
-			     bool *pfreepath, bool parent_locked)
+static int build_dentry_path(struct ceph_mds_client *mdsc, struct dentry *dentry,
+			     struct inode *dir, const char **ppath, int *ppathlen,
+			     u64 *pino, bool *pfreepath, bool parent_locked)
 {
 	char *path;
 
@@ -2765,7 +2767,7 @@  static int build_dentry_path(struct dentry *dentry, struct inode *dir,
 		return 0;
 	}
 	rcu_read_unlock();
-	path = ceph_mdsc_build_path(dentry, ppathlen, pino, 1);
+	path = ceph_mdsc_build_path(mdsc, dentry, ppathlen, pino, 1);
 	if (IS_ERR(path))
 		return PTR_ERR(path);
 	*ppath = path;
@@ -2777,6 +2779,7 @@  static int build_inode_path(struct inode *inode,
 			    const char **ppath, int *ppathlen, u64 *pino,
 			    bool *pfreepath)
 {
+	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
 	struct dentry *dentry;
 	char *path;
 
@@ -2786,7 +2789,7 @@  static int build_inode_path(struct inode *inode,
 		return 0;
 	}
 	dentry = d_find_alias(inode);
-	path = ceph_mdsc_build_path(dentry, ppathlen, pino, 1);
+	path = ceph_mdsc_build_path(mdsc, dentry, ppathlen, pino, 1);
 	dput(dentry);
 	if (IS_ERR(path))
 		return PTR_ERR(path);
@@ -2799,10 +2802,11 @@  static int build_inode_path(struct inode *inode,
  * request arguments may be specified via an inode *, a dentry *, or
  * an explicit ino+path.
  */
-static int set_request_path_attr(struct inode *rinode, struct dentry *rdentry,
-				  struct inode *rdiri, const char *rpath,
-				  u64 rino, const char **ppath, int *pathlen,
-				  u64 *ino, bool *freepath, bool parent_locked)
+static int set_request_path_attr(struct ceph_mds_client *mdsc, struct inode *rinode,
+				 struct dentry *rdentry, struct inode *rdiri,
+				 const char *rpath, u64 rino, const char **ppath,
+				 int *pathlen, u64 *ino, bool *freepath,
+				 bool parent_locked)
 {
 	int r = 0;
 
@@ -2811,7 +2815,7 @@  static int set_request_path_attr(struct inode *rinode, struct dentry *rdentry,
 		dout(" inode %p %llx.%llx\n", rinode, ceph_ino(rinode),
 		     ceph_snap(rinode));
 	} else if (rdentry) {
-		r = build_dentry_path(rdentry, rdiri, ppath, pathlen, ino,
+		r = build_dentry_path(mdsc, rdentry, rdiri, ppath, pathlen, ino,
 					freepath, parent_locked);
 		dout(" dentry %p %llx/%.*s\n", rdentry, *ino, *pathlen,
 		     *ppath);
@@ -2883,7 +2887,7 @@  static struct ceph_msg *create_request_message(struct ceph_mds_session *session,
 	int ret;
 	bool legacy = !(session->s_con.peer_features & CEPH_FEATURE_FS_BTIME);
 
-	ret = set_request_path_attr(req->r_inode, req->r_dentry,
+	ret = set_request_path_attr(mdsc, req->r_inode, req->r_dentry,
 			      req->r_parent, req->r_path1, req->r_ino1.ino,
 			      &path1, &pathlen1, &ino1, &freepath1,
 			      test_bit(CEPH_MDS_R_PARENT_LOCKED,
@@ -2897,7 +2901,7 @@  static struct ceph_msg *create_request_message(struct ceph_mds_session *session,
 	if (req->r_old_dentry &&
 	    !(req->r_old_dentry->d_flags & DCACHE_DISCONNECTED))
 		old_dentry = req->r_old_dentry;
-	ret = set_request_path_attr(NULL, old_dentry,
+	ret = set_request_path_attr(mdsc, NULL, old_dentry,
 			      req->r_old_dentry_dir,
 			      req->r_path2, req->r_ino2.ino,
 			      &path2, &pathlen2, &ino2, &freepath2, true);
@@ -4288,6 +4292,7 @@  static struct dentry* d_find_primary(struct inode *inode)
  */
 static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)
 {
+	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
 	union {
 		struct ceph_mds_cap_reconnect v2;
 		struct ceph_mds_cap_reconnect_v1 v1;
@@ -4305,7 +4310,7 @@  static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)
 	dentry = d_find_primary(inode);
 	if (dentry) {
 		/* set pathbase to parent dir when msg_version >= 2 */
-		path = ceph_mdsc_build_path(dentry, &pathlen, &pathbase,
+		path = ceph_mdsc_build_path(mdsc, dentry, &pathlen, &pathbase,
 					    recon_state->msg_version >= 2);
 		dput(dentry);
 		if (IS_ERR(path)) {
@@ -5660,7 +5665,7 @@  void ceph_mdsc_handle_mdsmap(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
 		return;
 	}
 
-	newmap = ceph_mdsmap_decode(&p, end, ceph_msgr2(mdsc->fsc->client));
+	newmap = ceph_mdsmap_decode(mdsc, &p, end, ceph_msgr2(mdsc->fsc->client));
 	if (IS_ERR(newmap)) {
 		err = PTR_ERR(newmap);
 		goto bad_unlock;
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index 351d92f7fc4f..20bcf8d5322e 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -578,7 +578,8 @@  static inline void ceph_mdsc_free_path(char *path, int len)
 		__putname(path - (PATH_MAX - 1 - len));
 }
 
-extern char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
+extern char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc,
+				  struct dentry *dentry, int *plen, u64 *base,
 				  int stop_on_nosnap);
 
 extern void __ceph_mdsc_drop_dentry_lease(struct dentry *dentry);
diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index 7dac21ee6ce7..6cbec7aed5a0 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -114,7 +114,8 @@  static int __decode_and_drop_compat_set(void **p, void* end)
  * Ignore any fields we don't care about (there are quite a few of
  * them).
  */
-struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end, bool msgr2)
+struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p,
+				       void *end, bool msgr2)
 {
 	struct ceph_mdsmap *m;
 	const void *start = *p;
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index abd52f5b3b0a..5bd47829a005 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -451,7 +451,8 @@  static void rebuild_snap_realms(struct ceph_snap_realm *realm,
 			continue;
 		}
 
-		last = build_snap_context(_realm, &realm_queue, dirty_realms);
+		last = build_snap_context(mdsc, _realm, &realm_queue,
+					  dirty_realms);
 		dout("%s %llx %p, %s\n", __func__, _realm->ino, _realm,
 		     last > 0 ? "is deferred" : !last ? "succeeded" : "failed");
 
@@ -709,7 +710,8 @@  int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
  * Queue cap_snaps for snap writeback for this realm and its children.
  * Called under snap_rwsem, so realm topology won't change.
  */
-static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
+static void queue_realm_cap_snaps(struct ceph_mds_client *mdsc,
+				  struct ceph_snap_realm *realm)
 {
 	struct ceph_inode_info *ci;
 	struct inode *lastinode = NULL;
@@ -874,7 +876,7 @@  int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
 		realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
 					 dirty_item);
 		list_del_init(&realm->dirty_item);
-		queue_realm_cap_snaps(realm);
+		queue_realm_cap_snaps(mdsc, realm);
 	}
 
 	if (realm_ret)
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 107a9d16a4e8..ab5c0c703eae 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -1223,7 +1223,8 @@  extern void ceph_add_cap(struct inode *inode,
 			 unsigned cap, unsigned seq, u64 realmino, int flags,
 			 struct ceph_cap **new_cap);
 extern void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release);
-extern void ceph_remove_cap(struct ceph_cap *cap, bool queue_release);
+extern void ceph_remove_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
+			    bool queue_release);
 extern void __ceph_remove_caps(struct ceph_inode_info *ci);
 extern void ceph_put_cap(struct ceph_mds_client *mdsc,
 			 struct ceph_cap *cap);
diff --git a/include/linux/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h
index 4c3e0648dc27..89f1931f1ba6 100644
--- a/include/linux/ceph/mdsmap.h
+++ b/include/linux/ceph/mdsmap.h
@@ -5,6 +5,8 @@ 
 #include <linux/bug.h>
 #include <linux/ceph/types.h>
 
+struct ceph_mds_client;
+
 /*
  * mds map - describe servers in the mds cluster.
  *
@@ -65,7 +67,8 @@  static inline bool ceph_mdsmap_is_laggy(struct ceph_mdsmap *m, int w)
 }
 
 extern int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m);
-struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end, bool msgr2);
+struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p,
+				       void *end, bool msgr2);
 extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m);
 extern bool ceph_mdsmap_is_cluster_available(struct ceph_mdsmap *m);