diff options
| author | Yan, Zheng <zyan@redhat.com> | 2018-12-13 03:34:11 -0500 |
|---|---|---|
| committer | Ilya Dryomov <idryomov@gmail.com> | 2018-12-26 10:08:36 -0500 |
| commit | 5ccedf1ccd710ba32f36986b49eeb764e53e7ef1 (patch) | |
| tree | 3f37ffdcdcb936903c5bbb12e95f397b5d8f3cd7 | |
| parent | d2f8bb27c87945ab696bdaea25b0465dee94fb6d (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.c | 94 |
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++; |
| 3107 | out_free: | 3114 | out_err: |
| 3108 | kfree(path); | ||
| 3109 | out_dput: | ||
| 3110 | dput(dentry); | ||
| 3111 | return err; | 3115 | return err; |
| 3112 | } | 3116 | } |
| 3113 | 3117 | ||
