#include #include #include #include #include static DEFINE_SPINLOCK(string_tree_lock); static struct rb_root string_tree = RB_ROOT; struct ceph_string *ceph_find_or_create_string(const char* str, size_t len) { struct ceph_string *cs, *exist; struct rb_node **p, *parent; int ret; exist = NULL; spin_lock(&string_tree_lock); p = &string_tree.rb_node; while (*p) { exist = rb_entry(*p, struct ceph_string, node); ret = ceph_compare_string(exist, str, len); if (ret > 0) p = &(*p)->rb_left; else if (ret < 0) p = &(*p)->rb_right; else break; exist = NULL; } if (exist && !kref_get_unless_zero(&exist->kref)) { rb_erase(&exist->node, &string_tree); RB_CLEAR_NODE(&exist->node); exist = NULL; } spin_unlock(&string_tree_lock); if (exist) return exist; cs = kmalloc(sizeof(*cs) + len + 1, GFP_NOFS); if (!cs) return NULL; kref_init(&cs->kref); cs->len = len; memcpy(cs->str, str, len); cs->str[len] = 0; retry: exist = NULL; parent = NULL; p = &string_tree.rb_node; spin_lock(&string_tree_lock); while (*p) { parent = *p; exist = rb_entry(*p, struct ceph_string, node); ret = ceph_compare_string(exist, str, len); if (ret > 0) p = &(*p)->rb_left; else if (ret < 0) p = &(*p)->rb_right; else break; exist = NULL; } ret = 0; if (!exist) { rb_link_node(&cs->node, parent, p); rb_insert_color(&cs->node, &string_tree); } else if (!kref_get_unless_zero(&exist->kref)) { rb_erase(&exist->node, &string_tree); RB_CLEAR_NODE(&exist->node); ret = -EAGAIN; } spin_unlock(&string_tree_lock); if (ret == -EAGAIN) goto retry; if (exist) { kfree(cs); cs = exist; } return cs; } EXPORT_SYMBOL(ceph_find_or_create_string); void ceph_release_string(struct kref *ref) { struct ceph_string *cs = container_of(ref, struct ceph_string, kref); spin_lock(&string_tree_lock); if (!RB_EMPTY_NODE(&cs->node)) { rb_erase(&cs->node, &string_tree); RB_CLEAR_NODE(&cs->node); } spin_unlock(&string_tree_lock); kfree_rcu(cs, rcu); } EXPORT_SYMBOL(ceph_release_string); bool ceph_strings_empty(void) { return RB_EMPTY_ROOT(&string_tree); } 'author'>author
path: root/net
AgeCommit message (Expand)AuthorFilesLines
2017-02-07net: dsa: Add support for platform dataFlorian Fainelli1-18/+84
2017-02-07net: dsa: Rename and export dev_to_net_device()Florian Fainelli1-2/+3
2017-02-06bridge: fdb: write to used and updated at most once per jiffyNikolay Aleksandrov2-2/+4
2017-02-06bridge: move write-heavy fdb members in their own cache lineNikolay Aleksandrov1-4/+6
2017-02-06bridge: move to workqueue gcNikolay Aleksandrov10-23/+29
2017-02-06bridge: modify bridge and port to have often accessed fields in one cache lineNikolay Aleksandrov1-23/+20
2017-02-06net: dsa: introduce bridge notifierVivien Didelot2-11/+61
2017-02-06net: dsa: add switch notifierVivien Didelot5-0/+70
2017-02-06net: dsa: change state setter scopeVivien Didelot1-6/+9
2017-02-06net: dsa: rollback bridging on errorVivien Didelot1-1/+13
2017-02-06net: dsa: simplify netdevice events handlingVivien Didelot1-28/+16
2017-02-06net: dsa: move netdevice notifier registrationVivien Didelot3-10/+26
2017-02-06net-next: treewide use is_vlan_dev() helper function.Parav Pandit1-1/+2
2017-02-06sctp: process fwd tsn chunk only when prsctp is enabledXin Long1-0/+6
2017-02-06net: remove ndo_neigh_{construct, destroy} from stacked devicesIdo Schimmel3-48/+0
2017-02-05net: remove __napi_complete()Eric Dumazet1-21/+3
2017-02-04net: ipv6: Use compressed IPv6 addresses showing route replace errorDavid Ahern1-1/+1
2017-02-04net: ipv6: Change notifications for multipath delete to RTA_MULTIPATHDavid Ahern2-1/+28
2017-02-04net: ipv6: Change notifications for multipath add to RTA_MULTIPATHDavid Ahern2-3/+53
2017-02-04net: ipv6: Add support to dump multipath routes via RTA_MULTIPATH attributeDavid Ahern2-17/+105
2017-02-04net: ipv6: Allow shorthand delete of all nexthops in multipath routeDavid Ahern1-2/+36
2017-02-03net: skb_needs_check() accepts CHECKSUM_NONE for txEric Dumazet1-3/+4
2017-02-03net: remove support for per driver ndo_busy_poll()Eric Dumazet2-16/+0
2017-02-03Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-nextDavid S. Miller53-640/+576
2017-02-03sched: cls_flower: expose priority to offloading netdeviceJiri Pirko1-0/+3
2017-02-03tcp: clear pfmemalloc on outgoing skbEric Dumazet1-0/+7
2017-02-03net: ipv6: Set protocol to kernel for local routesDavid Ahern1-0/+1
2017-02-03bridge: vlan dst_metadata hooks in ingress and egress pathsRoopa Prabhu6-2/+82
2017-02-03bridge: per vlan dst_metadata netlink supportRoopa Prabhu7-48/+641
2017-02-03net/sched: act_ife: Change to use ife moduleYotam Gigi2-78/+33
2017-02-03net: Introduce ife encapsulation moduleYotam Gigi5-0/+165
2017-02-03net/sched: act_ife: Unexport ife_tlv_meta_encodeYotam Gigi1-2/+2
2017-02-03tcp: add tcp_mss_clamp() helperEric Dumazet