@@ -835,6 +835,83 @@ int ceph_monc_get_version_async(struct ceph_mon_client *monc, const char *what,
835
835
}
836
836
EXPORT_SYMBOL (ceph_monc_get_version_async );
837
837
838
+ static void handle_command_ack (struct ceph_mon_client * monc ,
839
+ struct ceph_msg * msg )
840
+ {
841
+ struct ceph_mon_generic_request * req ;
842
+ void * p = msg -> front .iov_base ;
843
+ void * const end = p + msg -> front_alloc_len ;
844
+ u64 tid = le64_to_cpu (msg -> hdr .tid );
845
+
846
+ dout ("%s msg %p tid %llu\n" , __func__ , msg , tid );
847
+
848
+ ceph_decode_need (& p , end , sizeof (struct ceph_mon_request_header ) +
849
+ sizeof (u32 ), bad );
850
+ p += sizeof (struct ceph_mon_request_header );
851
+
852
+ mutex_lock (& monc -> mutex );
853
+ req = lookup_generic_request (& monc -> generic_request_tree , tid );
854
+ if (!req ) {
855
+ mutex_unlock (& monc -> mutex );
856
+ return ;
857
+ }
858
+
859
+ req -> result = ceph_decode_32 (& p );
860
+ __finish_generic_request (req );
861
+ mutex_unlock (& monc -> mutex );
862
+
863
+ complete_generic_request (req );
864
+ return ;
865
+
866
+ bad :
867
+ pr_err ("corrupt mon_command ack, tid %llu\n" , tid );
868
+ ceph_msg_dump (msg );
869
+ }
870
+
871
+ int ceph_monc_blacklist_add (struct ceph_mon_client * monc ,
872
+ struct ceph_entity_addr * client_addr )
873
+ {
874
+ struct ceph_mon_generic_request * req ;
875
+ struct ceph_mon_command * h ;
876
+ int ret = - ENOMEM ;
877
+ int len ;
878
+
879
+ req = alloc_generic_request (monc , GFP_NOIO );
880
+ if (!req )
881
+ goto out ;
882
+
883
+ req -> request = ceph_msg_new (CEPH_MSG_MON_COMMAND , 256 , GFP_NOIO , true);
884
+ if (!req -> request )
885
+ goto out ;
886
+
887
+ req -> reply = ceph_msg_new (CEPH_MSG_MON_COMMAND_ACK , 512 , GFP_NOIO ,
888
+ true);
889
+ if (!req -> reply )
890
+ goto out ;
891
+
892
+ mutex_lock (& monc -> mutex );
893
+ register_generic_request (req );
894
+ h = req -> request -> front .iov_base ;
895
+ h -> monhdr .have_version = 0 ;
896
+ h -> monhdr .session_mon = cpu_to_le16 (-1 );
897
+ h -> monhdr .session_mon_tid = 0 ;
898
+ h -> fsid = monc -> monmap -> fsid ;
899
+ h -> num_strs = cpu_to_le32 (1 );
900
+ len = sprintf (h -> str , "{ \"prefix\": \"osd blacklist\", \
901
+ \"blacklistop\": \"add\", \
902
+ \"addr\": \"%pISpc/%u\" }" ,
903
+ & client_addr -> in_addr , le32_to_cpu (client_addr -> nonce ));
904
+ h -> str_len = cpu_to_le32 (len );
905
+ send_generic_request (monc , req );
906
+ mutex_unlock (& monc -> mutex );
907
+
908
+ ret = wait_generic_request (req );
909
+ out :
910
+ put_generic_request (req );
911
+ return ret ;
912
+ }
913
+ EXPORT_SYMBOL (ceph_monc_blacklist_add );
914
+
838
915
/*
839
916
* Resend pending generic requests.
840
917
*/
@@ -1139,6 +1216,10 @@ static void dispatch(struct ceph_connection *con, struct ceph_msg *msg)
1139
1216
handle_get_version_reply (monc , msg );
1140
1217
break ;
1141
1218
1219
+ case CEPH_MSG_MON_COMMAND_ACK :
1220
+ handle_command_ack (monc , msg );
1221
+ break ;
1222
+
1142
1223
case CEPH_MSG_MON_MAP :
1143
1224
ceph_monc_handle_map (monc , msg );
1144
1225
break ;
@@ -1178,6 +1259,7 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
1178
1259
m = ceph_msg_get (monc -> m_subscribe_ack );
1179
1260
break ;
1180
1261
case CEPH_MSG_STATFS_REPLY :
1262
+ case CEPH_MSG_MON_COMMAND_ACK :
1181
1263
return get_generic_reply (con , hdr , skip );
1182
1264
case CEPH_MSG_AUTH_REPLY :
1183
1265
m = ceph_msg_get (monc -> m_auth_reply );
0 commit comments