aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2018-12-13 03:34:11 -0500
committerIlya Dryomov <idryomov@gmail.com>2018-12-26 10:08:36 -0500
commit5ccedf1ccd710ba32f36986b49eeb764e53e7ef1 (patch)
tree3f37ffdcdcb936903c5bbb12e95f397b5d8f3cd7
parentd2f8bb27c87945ab696bdaea25b0465dee94fb6d (diff)
ceph: don't encode inode pathes into reconnect message
mds hasn't used inode pathes since introducing inode backtrace. Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r--fs/ceph/mds_client.c94
1 files changed, 49 insertions, 45 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 977e38f58806..163fc74bf221 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -2960,11 +2960,8 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
2960 struct ceph_inode_info *ci = cap->ci; 2960 struct ceph_inode_info *ci = cap->ci;
2961 struct ceph_reconnect_state *recon_state = arg; 2961 struct ceph_reconnect_state *recon_state = arg;
2962 struct ceph_pagelist *pagelist = recon_state->pagelist; 2962 struct ceph_pagelist *pagelist = recon_state->pagelist;
2963 char *path; 2963 int err;
2964 int pathlen, err;
2965 u64 pathbase;
2966 u64 snap_follows; 2964 u64 snap_follows;
2967 struct dentry *dentry;
2968 2965
2969 dout(" adding %p ino %llx.%llx cap %p %lld %s\n", 2966 dout(" adding %p ino %llx.%llx cap %p %lld %s\n",
2970 inode, ceph_vinop(inode), cap, cap->cap_id, 2967 inode, ceph_vinop(inode), cap, cap->cap_id,
@@ -2973,19 +2970,6 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
2973 if (err) 2970 if (err)
2974 return err; 2971 return err;
2975 2972
2976 dentry = d_find_alias(inode);
2977 if (dentry) {
2978 path = ceph_mdsc_build_path(dentry, &pathlen, &pathbase, 0);
2979 if (IS_ERR(path)) {
2980 err = PTR_ERR(path);
2981 goto out_dput;
2982 }
2983 } else {
2984 path = NULL;
2985 pathlen = 0;
2986 pathbase = 0;
2987 }
2988
2989 spin_lock(&ci->i_ceph_lock); 2973 spin_lock(&ci->i_ceph_lock);
2990 cap->seq = 0; /* reset cap seq */ 2974 cap->seq = 0; /* reset cap seq */
2991 cap->issue_seq = 0; /* and issue_seq */ 2975 cap->issue_seq = 0; /* and issue_seq */
@@ -2997,7 +2981,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
2997 rec.v2.wanted = cpu_to_le32(__ceph_caps_wanted(ci)); 2981 rec.v2.wanted = cpu_to_le32(__ceph_caps_wanted(ci));
2998 rec.v2.issued = cpu_to_le32(cap->issued); 2982 rec.v2.issued = cpu_to_le32(cap->issued);
2999 rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); 2983 rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
3000 rec.v2.pathbase = cpu_to_le64(pathbase); 2984 rec.v2.pathbase = 0;
3001 rec.v2.flock_len = (__force __le32) 2985 rec.v2.flock_len = (__force __le32)
3002 ((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1); 2986 ((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1);
3003 } else { 2987 } else {
@@ -3008,7 +2992,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
3008 ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime); 2992 ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime);
3009 ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime); 2993 ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime);
3010 rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino); 2994 rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
3011 rec.v1.pathbase = cpu_to_le64(pathbase); 2995 rec.v1.pathbase = 0;
3012 } 2996 }
3013 2997
3014 if (list_empty(&ci->i_cap_snaps)) { 2998 if (list_empty(&ci->i_cap_snaps)) {
@@ -3040,7 +3024,7 @@ encode_again:
3040 GFP_NOFS); 3024 GFP_NOFS);
3041 if (!flocks) { 3025 if (!flocks) {
3042 err = -ENOMEM; 3026 err = -ENOMEM;
3043 goto out_free; 3027 goto out_err;
3044 } 3028 }
3045 err = ceph_encode_locks_to_buffer(inode, flocks, 3029 err = ceph_encode_locks_to_buffer(inode, flocks,
3046 num_fcntl_locks, 3030 num_fcntl_locks,
@@ -3050,7 +3034,7 @@ encode_again:
3050 flocks = NULL; 3034 flocks = NULL;
3051 if (err == -ENOSPC) 3035 if (err == -ENOSPC)
3052 goto encode_again; 3036 goto encode_again;
3053 goto out_free; 3037 goto out_err;
3054 } 3038 }
3055 } else { 3039 } else {
3056 kfree(flocks); 3040 kfree(flocks);
@@ -3070,44 +3054,64 @@ encode_again:
3070 sizeof(struct ceph_filelock); 3054 sizeof(struct ceph_filelock);
3071 rec.v2.flock_len = cpu_to_le32(struct_len); 3055 rec.v2.flock_len = cpu_to_le32(struct_len);
3072 3056
3073 struct_len += sizeof(rec.v2); 3057 struct_len += sizeof(u32) + sizeof(rec.v2);
3074 struct_len += sizeof(u32) + pathlen;
3075 3058
3076 if (struct_v >= 2) 3059 if (struct_v >= 2)
3077 struct_len += sizeof(u64); /* snap_follows */ 3060 struct_len += sizeof(u64); /* snap_follows */
3078 3061
3079 total_len += struct_len; 3062 total_len += struct_len;
3080 err = ceph_pagelist_reserve(pagelist, total_len); 3063 err = ceph_pagelist_reserve(pagelist, total_len);
3064 if (err) {
3065 kfree(flocks);
3066 goto out_err;
3067 }
3081 3068
3082 if (!err) { 3069 if (recon_state->msg_version >= 3) {
3083 if (recon_state->msg_version >= 3) { 3070 ceph_pagelist_encode_8(pagelist, struct_v);
3084 ceph_pagelist_encode_8(pagelist, struct_v); 3071 ceph_pagelist_encode_8(pagelist, 1);
3085 ceph_pagelist_encode_8(pagelist, 1); 3072 ceph_pagelist_encode_32(pagelist, struct_len);
3086 ceph_pagelist_encode_32(pagelist, struct_len);
3087 }
3088 ceph_pagelist_encode_string(pagelist, path, pathlen);
3089 ceph_pagelist_append(pagelist, &rec, sizeof(rec.v2));
3090 ceph_locks_to_pagelist(flocks, pagelist,
3091 num_fcntl_locks,
3092 num_flock_locks);
3093 if (struct_v >= 2)
3094 ceph_pagelist_encode_64(pagelist, snap_follows);
3095 } 3073 }
3074 ceph_pagelist_encode_string(pagelist, NULL, 0);
3075 ceph_pagelist_append(pagelist, &rec, sizeof(rec.v2));
3076 ceph_locks_to_pagelist(flocks, pagelist,
3077 num_fcntl_locks, num_flock_locks);
3078 if (struct_v >= 2)
3079 ceph_pagelist_encode_64(pagelist, snap_follows);
3080
3096 kfree(flocks); 3081 kfree(flocks);
3097 } else { 3082 } else {
3098 size_t size = sizeof(u32) + pathlen + sizeof(rec.v1); 3083 u64 pathbase = 0;
3099 err = ceph_pagelist_reserve(pagelist, size); 3084 int pathlen = 0;
3100 if (!err) { 3085 char *path = NULL;
3101 ceph_pagelist_encode_string(pagelist, path, pathlen); 3086 struct dentry *dentry;
3102 ceph_pagelist_append(pagelist, &rec, sizeof(rec.v1)); 3087
3088 dentry = d_find_alias(inode);
3089 if (dentry) {
3090 path = ceph_mdsc_build_path(dentry,
3091 &pathlen, &pathbase, 0);
3092 dput(dentry);
3093 if (IS_ERR(path)) {
3094 err = PTR_ERR(path);
3095 goto out_err;
3096 }
3097 rec.v1.pathbase = cpu_to_le64(pathbase);
3103 } 3098 }
3099
3100 err = ceph_pagelist_reserve(pagelist,
3101 pathlen + sizeof(u32) + sizeof(rec.v1));
3102 if (err) {
3103 kfree(path);
3104 goto out_err;
3105 }
3106
3107 ceph_pagelist_encode_string(pagelist, path, pathlen);
3108 ceph_pagelist_append(pagelist, &rec, sizeof(rec.v1));
3109
3110 kfree(path);
3104 } 3111 }
3105 3112
3106 recon_state->nr_caps++; 3113 recon_state->nr_caps++;
3107out_free: 3114out_err:
3108 kfree(path);
3109out_dput:
3110 dput(dentry);
3111 return err; 3115 return err;
3112} 3116}
3113 3117