Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://github.com/NewDreamNetwork/ceph-client

* 'for-linus' of git://github.com/NewDreamNetwork/ceph-client:
libceph: fix pg_temp mapping update
libceph: fix pg_temp mapping calculation
libceph: fix linger request requeuing
libceph: fix parse options memory leak
libceph: initialize ack_stamp to avoid unnecessary connection reset

+48 -42
+1
net/ceph/ceph_common.c
··· 232 232 ceph_crypto_key_destroy(opt->key); 233 233 kfree(opt->key); 234 234 } 235 + kfree(opt->mon_addr); 235 236 kfree(opt); 236 237 } 237 238 EXPORT_SYMBOL(ceph_destroy_options);
+1
net/ceph/messenger.c
··· 2307 2307 m->front_max = front_len; 2308 2308 m->front_is_vmalloc = false; 2309 2309 m->more_to_follow = false; 2310 + m->ack_stamp = 0; 2310 2311 m->pool = NULL; 2311 2312 2312 2313 /* middle */
+1 -3
net/ceph/osd_client.c
··· 217 217 INIT_LIST_HEAD(&req->r_unsafe_item); 218 218 INIT_LIST_HEAD(&req->r_linger_item); 219 219 INIT_LIST_HEAD(&req->r_linger_osd); 220 + INIT_LIST_HEAD(&req->r_req_lru_item); 220 221 req->r_flags = flags; 221 222 222 223 WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0); ··· 817 816 { 818 817 req->r_tid = ++osdc->last_tid; 819 818 req->r_request->hdr.tid = cpu_to_le64(req->r_tid); 820 - INIT_LIST_HEAD(&req->r_req_lru_item); 821 - 822 819 dout("__register_request %p tid %lld\n", req, req->r_tid); 823 820 __insert_request(osdc, req); 824 821 ceph_osdc_get_request(req); 825 822 osdc->num_requests++; 826 - 827 823 if (osdc->num_requests == 1) { 828 824 dout(" first request, scheduling timeout\n"); 829 825 __schedule_osd_timeout(osdc);
+45 -39
net/ceph/osdmap.c
··· 339 339 struct ceph_pg_mapping *pg = NULL; 340 340 int c; 341 341 342 + dout("__insert_pg_mapping %llx %p\n", *(u64 *)&new->pgid, new); 342 343 while (*p) { 343 344 parent = *p; 344 345 pg = rb_entry(parent, struct ceph_pg_mapping, node); ··· 367 366 while (n) { 368 367 pg = rb_entry(n, struct ceph_pg_mapping, node); 369 368 c = pgid_cmp(pgid, pg->pgid); 370 - if (c < 0) 369 + if (c < 0) { 371 370 n = n->rb_left; 372 - else if (c > 0) 371 + } else if (c > 0) { 373 372 n = n->rb_right; 374 - else 373 + } else { 374 + dout("__lookup_pg_mapping %llx got %p\n", 375 + *(u64 *)&pgid, pg); 375 376 return pg; 377 + } 376 378 } 377 379 return NULL; 380 + } 381 + 382 + static int __remove_pg_mapping(struct rb_root *root, struct ceph_pg pgid) 383 + { 384 + struct ceph_pg_mapping *pg = __lookup_pg_mapping(root, pgid); 385 + 386 + if (pg) { 387 + dout("__remove_pg_mapping %llx %p\n", *(u64 *)&pgid, pg); 388 + rb_erase(&pg->node, root); 389 + kfree(pg); 390 + return 0; 391 + } 392 + dout("__remove_pg_mapping %llx dne\n", *(u64 *)&pgid); 393 + return -ENOENT; 378 394 } 379 395 380 396 /* ··· 729 711 void *start = *p; 730 712 int err = -EINVAL; 731 713 u16 version; 732 - struct rb_node *rbp; 733 714 734 715 ceph_decode_16_safe(p, end, version, bad); 735 716 if (version > CEPH_OSDMAP_INC_VERSION) { ··· 878 861 } 879 862 880 863 /* new_pg_temp */ 881 - rbp = rb_first(&map->pg_temp); 882 864 ceph_decode_32_safe(p, end, len, bad); 883 865 while (len--) { 884 866 struct ceph_pg_mapping *pg; ··· 887 871 ceph_decode_need(p, end, sizeof(u64) + sizeof(u32), bad); 888 872 ceph_decode_copy(p, &pgid, sizeof(pgid)); 889 873 pglen = ceph_decode_32(p); 890 - 891 - /* remove any? */ 892 - while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, 893 - node)->pgid, pgid) <= 0) { 894 - struct ceph_pg_mapping *cur = 895 - rb_entry(rbp, struct ceph_pg_mapping, node); 896 - 897 - rbp = rb_next(rbp); 898 - dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); 899 - rb_erase(&cur->node, &map->pg_temp); 900 - kfree(cur); 901 - } 902 874 903 875 if (pglen) { 904 876 /* insert */ ··· 907 903 } 908 904 dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, 909 905 pglen); 906 + } else { 907 + /* remove */ 908 + __remove_pg_mapping(&map->pg_temp, pgid); 910 909 } 911 - } 912 - while (rbp) { 913 - struct ceph_pg_mapping *cur = 914 - rb_entry(rbp, struct ceph_pg_mapping, node); 915 - 916 - rbp = rb_next(rbp); 917 - dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); 918 - rb_erase(&cur->node, &map->pg_temp); 919 - kfree(cur); 920 910 } 921 911 922 912 /* ignore the rest */ ··· 1044 1046 struct ceph_pg_mapping *pg; 1045 1047 struct ceph_pg_pool_info *pool; 1046 1048 int ruleno; 1047 - unsigned poolid, ps, pps; 1049 + unsigned poolid, ps, pps, t; 1048 1050 int preferred; 1049 1051 1052 + poolid = le32_to_cpu(pgid.pool); 1053 + ps = le16_to_cpu(pgid.ps); 1054 + preferred = (s16)le16_to_cpu(pgid.preferred); 1055 + 1056 + pool = __lookup_pg_pool(&osdmap->pg_pools, poolid); 1057 + if (!pool) 1058 + return NULL; 1059 + 1050 1060 /* pg_temp? */ 1061 + if (preferred >= 0) 1062 + t = ceph_stable_mod(ps, le32_to_cpu(pool->v.lpg_num), 1063 + pool->lpgp_num_mask); 1064 + else 1065 + t = ceph_stable_mod(ps, le32_to_cpu(pool->v.pg_num), 1066 + pool->pgp_num_mask); 1067 + pgid.ps = cpu_to_le16(t); 1051 1068 pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid); 1052 1069 if (pg) { 1053 1070 *num = pg->len; ··· 1070 1057 } 1071 1058 1072 1059 /* crush */ 1073 - poolid = le32_to_cpu(pgid.pool); 1074 - ps = le16_to_cpu(pgid.ps); 1075 - preferred = (s16)le16_to_cpu(pgid.preferred); 1076 - 1077 - /* don't forcefeed bad device ids to crush */ 1078 - if (preferred >= osdmap->max_osd || 1079 - preferred >= osdmap->crush->max_devices) 1080 - preferred = -1; 1081 - 1082 - pool = __lookup_pg_pool(&osdmap->pg_pools, poolid); 1083 - if (!pool) 1084 - return NULL; 1085 1060 ruleno = crush_find_rule(osdmap->crush, pool->v.crush_ruleset, 1086 1061 pool->v.type, pool->v.size); 1087 1062 if (ruleno < 0) { ··· 1078 1077 pool->v.size); 1079 1078 return NULL; 1080 1079 } 1080 + 1081 + /* don't forcefeed bad device ids to crush */ 1082 + if (preferred >= osdmap->max_osd || 1083 + preferred >= osdmap->crush->max_devices) 1084 + preferred = -1; 1081 1085 1082 1086 if (preferred >= 0) 1083 1087 pps = ceph_stable_mod(ps,