ceph: pass the mdsc to several helpers
authorXiubo Li <xiubli@redhat.com>
Fri, 9 Jun 2023 07:15:47 +0000 (15:15 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 3 Nov 2023 22:28:33 +0000 (23:28 +0100)
We will use the 'mdsc' to get the global_id in the following commits.

Link: https://tracker.ceph.com/issues/61590
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Patrick Donnelly <pdonnell@redhat.com>
Reviewed-by: Milind Changire <mchangir@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c
fs/ceph/debugfs.c
fs/ceph/dir.c
fs/ceph/file.c
fs/ceph/mds_client.c
fs/ceph/mds_client.h
fs/ceph/mdsmap.c
fs/ceph/snap.c
fs/ceph/super.h
include/linux/ceph/mdsmap.h

index 14215ec646f7ae6bd9a6ee0fdc6878351850ab49..c00f15b773f0bcc868906c3483108ffce4c844b4 100644 (file)
@@ -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;
@@ -1342,6 +1343,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)
@@ -1351,7 +1354,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);
 }
@@ -3999,7 +4002,7 @@ retry:
                goto out_unlock;
 
        if (target < 0) {
-               ceph_remove_cap(cap, false);
+               ceph_remove_cap(mdsc, cap, false);
                goto out_unlock;
        }
 
@@ -4034,7 +4037,7 @@ retry:
                                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 */
@@ -4051,7 +4054,7 @@ retry:
                        spin_unlock(&mdsc->cap_dirty_lock);
                }
 
-               ceph_remove_cap(cap, false);
+               ceph_remove_cap(mdsc, cap, false);
                goto out_unlock;
        }
 
@@ -4164,7 +4167,7 @@ retry:
                                        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;
index 3904333fa6c38b80f4a99db72d354709dbba1d8e..2f1e7498cd7451704b9a1bc62e808279d0d3129a 100644 (file)
@@ -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;
index 854cbdd666619aeef65f1ecca063112a68e2ac7e..fff5cb2df9a8964f1a1e6b75faa6c8d443438abe 100644 (file)
@@ -1226,7 +1226,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 */
index b5f8038065d7c1f952ef1cbeef569ad88ac9e0f9..7c4d79a23506d31e0519db7035d869f756658ed5 100644 (file)
@@ -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",
index 293b93182955d017536e9628d9db1c2220b9b07f..284ba087c5074e1fbbbf2b298d89cc895c74e532 100644 (file)
@@ -2126,6 +2126,7 @@ out:
  */
 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;
@@ -2173,7 +2174,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;
@@ -2588,6 +2589,7 @@ static u8 *get_fscrypt_altname(const struct ceph_mds_request *req, u32 *plen)
 
 /**
  * ceph_mdsc_build_path - build a path string to a given dentry
+ * @mdsc: mds client
  * @dentry: dentry to which path should be built
  * @plen: returned length of string
  * @pbase: returned base inode number
@@ -2607,8 +2609,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;
@@ -2726,9 +2728,9 @@ retry:
        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;
 
@@ -2744,7 +2746,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;
@@ -2756,6 +2758,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;
 
@@ -2765,7 +2768,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);
@@ -2778,10 +2781,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;
 
@@ -2790,7 +2794,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);
@@ -2877,7 +2881,7 @@ static struct ceph_msg *create_request_message(struct ceph_mds_session *session,
        bool old_version = !test_bit(CEPHFS_FEATURE_32BITS_RETRY_FWD,
                                     &session->s_features);
 
-       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,
@@ -2891,7 +2895,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);
@@ -4290,6 +4294,7 @@ out_unlock:
  */
 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;
@@ -4307,7 +4312,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)) {
@@ -5662,7 +5667,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;
index 5a3714bdd64a8e163077f4baba72b47b6087c564..d930eb79dc380f3b37c27a65f3930bce234b08b2 100644 (file)
@@ -581,7 +581,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 for_wire);
 
 extern void __ceph_mdsc_drop_dentry_lease(struct dentry *dentry);
index 7dac21ee6ce7682a22b82d36debef62931a5b58b..6cbec7aed5a0bacc4cf26326bd62c6e74eff501d 100644 (file)
@@ -114,7 +114,8 @@ bad:
  * 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;
index 813f21add992c144678de60faae62b341dff4d38..55090e6c99672fe93af096704a8cfc45a06161af 100644 (file)
@@ -329,7 +329,8 @@ static int cmpu64_rev(const void *a, const void *b)
 /*
  * build the snap context for a given realm.
  */
-static int build_snap_context(struct ceph_snap_realm *realm,
+static int build_snap_context(struct ceph_mds_client *mdsc,
+                             struct ceph_snap_realm *realm,
                              struct list_head *realm_queue,
                              struct list_head *dirty_realms)
 {
@@ -425,7 +426,8 @@ fail:
 /*
  * rebuild snap context for the given realm and all of its children.
  */
-static void rebuild_snap_realms(struct ceph_snap_realm *realm,
+static void rebuild_snap_realms(struct ceph_mds_client *mdsc,
+                               struct ceph_snap_realm *realm,
                                struct list_head *dirty_realms)
 {
        LIST_HEAD(realm_queue);
@@ -451,7 +453,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");
 
@@ -708,7 +711,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;
@@ -855,7 +859,7 @@ more:
 
        /* rebuild_snapcs when we reach the _end_ (root) of the trace */
        if (realm_to_rebuild && p >= e)
-               rebuild_snap_realms(realm_to_rebuild, &dirty_realms);
+               rebuild_snap_realms(mdsc, realm_to_rebuild, &dirty_realms);
 
        if (!first_realm)
                first_realm = realm;
@@ -873,7 +877,7 @@ more:
                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)
index 51c7f2b14f6f870f72f9b12dfee211f30b8a9185..09c262dd5bd361a397748146a1f05215852c0802 100644 (file)
@@ -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);
index 4c3e0648dc2775b0b7bfb38e4e7695e445d6bfd4..89f1931f1ba6c9643a4098b1255c240e00f0c38e 100644 (file)
@@ -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);