diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-17 15:32:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-17 15:32:40 -0400 |
commit | 8e64a7331702b7888ccf84b2b9ff46ab8e167c7f (patch) | |
tree | be794f8219470e0e982d935f3e21a6012a685451 | |
parent | 2e5735f4c377377cb738270024083f74ee058877 (diff) | |
parent | 335c25858218e76ef47f92ecb9d22e919d36140d (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
Pull Ceph fixes from Sage Weil:
"These are both fixes to the new and improved keepalive2 behavior"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
libceph: advertise support for keepalive2
libceph: don't access invalid memory in keepalive2 path
-rw-r--r-- | include/linux/ceph/ceph_features.h | 1 | ||||
-rw-r--r-- | include/linux/ceph/messenger.h | 4 | ||||
-rw-r--r-- | net/ceph/messenger.c | 9 |
3 files changed, 9 insertions, 5 deletions
diff --git a/include/linux/ceph/ceph_features.h b/include/linux/ceph/ceph_features.h index 4763ad64e832..f89b31d45cc8 100644 --- a/include/linux/ceph/ceph_features.h +++ b/include/linux/ceph/ceph_features.h | |||
@@ -107,6 +107,7 @@ static inline u64 ceph_sanitize_features(u64 features) | |||
107 | CEPH_FEATURE_OSDMAP_ENC | \ | 107 | CEPH_FEATURE_OSDMAP_ENC | \ |
108 | CEPH_FEATURE_CRUSH_TUNABLES3 | \ | 108 | CEPH_FEATURE_CRUSH_TUNABLES3 | \ |
109 | CEPH_FEATURE_OSD_PRIMARY_AFFINITY | \ | 109 | CEPH_FEATURE_OSD_PRIMARY_AFFINITY | \ |
110 | CEPH_FEATURE_MSGR_KEEPALIVE2 | \ | ||
110 | CEPH_FEATURE_CRUSH_V4) | 111 | CEPH_FEATURE_CRUSH_V4) |
111 | 112 | ||
112 | #define CEPH_FEATURES_REQUIRED_DEFAULT \ | 113 | #define CEPH_FEATURES_REQUIRED_DEFAULT \ |
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index 7e1252e97a30..b2371d9b51fa 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h | |||
@@ -238,6 +238,8 @@ struct ceph_connection { | |||
238 | bool out_kvec_is_msg; /* kvec refers to out_msg */ | 238 | bool out_kvec_is_msg; /* kvec refers to out_msg */ |
239 | int out_more; /* there is more data after the kvecs */ | 239 | int out_more; /* there is more data after the kvecs */ |
240 | __le64 out_temp_ack; /* for writing an ack */ | 240 | __le64 out_temp_ack; /* for writing an ack */ |
241 | struct ceph_timespec out_temp_keepalive2; /* for writing keepalive2 | ||
242 | stamp */ | ||
241 | 243 | ||
242 | /* message in temps */ | 244 | /* message in temps */ |
243 | struct ceph_msg_header in_hdr; | 245 | struct ceph_msg_header in_hdr; |
@@ -248,7 +250,7 @@ struct ceph_connection { | |||
248 | int in_base_pos; /* bytes read */ | 250 | int in_base_pos; /* bytes read */ |
249 | __le64 in_temp_ack; /* for reading an ack */ | 251 | __le64 in_temp_ack; /* for reading an ack */ |
250 | 252 | ||
251 | struct timespec last_keepalive_ack; | 253 | struct timespec last_keepalive_ack; /* keepalive2 ack stamp */ |
252 | 254 | ||
253 | struct delayed_work work; /* send|recv work */ | 255 | struct delayed_work work; /* send|recv work */ |
254 | unsigned long delay; /* current delay interval */ | 256 | unsigned long delay; /* current delay interval */ |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 525f454f7531..b9b0e3b5da49 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -1353,11 +1353,12 @@ static void prepare_write_keepalive(struct ceph_connection *con) | |||
1353 | dout("prepare_write_keepalive %p\n", con); | 1353 | dout("prepare_write_keepalive %p\n", con); |
1354 | con_out_kvec_reset(con); | 1354 | con_out_kvec_reset(con); |
1355 | if (con->peer_features & CEPH_FEATURE_MSGR_KEEPALIVE2) { | 1355 | if (con->peer_features & CEPH_FEATURE_MSGR_KEEPALIVE2) { |
1356 | struct timespec ts = CURRENT_TIME; | 1356 | struct timespec now = CURRENT_TIME; |
1357 | struct ceph_timespec ceph_ts; | 1357 | |
1358 | ceph_encode_timespec(&ceph_ts, &ts); | ||
1359 | con_out_kvec_add(con, sizeof(tag_keepalive2), &tag_keepalive2); | 1358 | con_out_kvec_add(con, sizeof(tag_keepalive2), &tag_keepalive2); |
1360 | con_out_kvec_add(con, sizeof(ceph_ts), &ceph_ts); | 1359 | ceph_encode_timespec(&con->out_temp_keepalive2, &now); |
1360 | con_out_kvec_add(con, sizeof(con->out_temp_keepalive2), | ||
1361 | &con->out_temp_keepalive2); | ||
1361 | } else { | 1362 | } else { |
1362 | con_out_kvec_add(con, sizeof(tag_keepalive), &tag_keepalive); | 1363 | con_out_kvec_add(con, sizeof(tag_keepalive), &tag_keepalive); |
1363 | } | 1364 | } |