aboutsummaryrefslogtreecommitdiffstats
path: root/block
Commit message (Expand)AuthorAge
* [PATCH] helper function for retrieving scsi_cmd given host based block layer tagDavid C Somayajulu2006-10-04
* [PATCH] dm: export blkdev_driver_ioctlAlasdair G Kergon2006-10-03
* [PATCH] completions: lockdep annotate on stack completionsPeter Zijlstra2006-10-01
* [PATCH] Only enable CONFIG_BLOCK option for embeddedJens Axboe2006-09-30
* [PATCH] blk_queue_start_tag() shared map race fixJens Axboe2006-09-30
* [PATCH] Update axboe@suse.de email addressJens Axboe2006-09-30
* [PATCH] BLOCK: Make it possible to disable the block layer [try #6]David Howells2006-09-30
* [PATCH] blktrace: cleanup using on_each_cpuMartin Peschke2006-09-30
* [PATCH] exit_io_context: don't disable irqsOleg Nesterov2006-09-30
* [PATCH] blktrace: support for logging metadata readsJens Axboe2006-09-30
* [PATCH] cfq-iosched: use metadata read flagJens Axboe2006-09-30
* [PATCH] Allow file systems to differentiate between data and meta readsJens Axboe2006-09-30
* [PATCH] ll_rw_blk: allow more flexibility for read_ahead_kb storeJens Axboe2006-09-30
* [PATCH] cfq-iosched: improve queue preemptionJens Axboe2006-09-30
* [PATCH] Add blk_start_queueing() helperJens Axboe2006-09-30
* [PATCH] cfq-iosched: kill the empty_listJens Axboe2006-09-30
* [PATCH] cfq-iosched: Kill O(N) runtime of cfq_resort_rr_list()Jens Axboe2006-09-30
* [PATCH] Make sure all block/io scheduler setups are node awareJens Axboe2006-09-30
* [PATCH] Audit block layer inlinesJens Axboe2006-09-30
* [PATCH] cfq-iosched: use new io context counting mechanismJens Axboe2006-09-30
* [PATCH] as-iosched: use new io context counting mechanismJens Axboe2006-09-30
* [PATCH] cfq-iosched: kill cfq_exit_lockJens Axboe2006-09-30
* [PATCH] cfq-iosched: cleanups, fixes, dead code removalJens Axboe2006-09-30
* [PATCH] ll_rw_blk: cleanup __make_request()Jens Axboe2006-09-30
* [PATCH] Drop useless bio passing in may_queue/set_request APIJens Axboe2006-09-30
* [PATCH] Remove ->rq_status from struct requestJens Axboe2006-09-30
* [PATCH] Remove struct request_list from struct requestJens Axboe2006-09-30
* [PATCH] Remove ->waiting member from struct requestJens Axboe2006-09-30
* [PATCH] as-iosched: kill arqJens Axboe2006-09-30
* [PATCH] cfq-iosched: kill crqJens Axboe2006-09-30
* [PATCH] cfq-iosched: remove the crq flag functions/variableJens Axboe2006-09-30
* [PATCH] deadline-iosched: remove elevator private drq request typeJens Axboe2006-09-30
* [PATCH] as-iosched: remove arq->is_sync memberJens Axboe2006-09-30
* [PATCH] as-iosched: reuse rq for fifoJens Axboe2006-09-30
* [PATCH] cfq-iosched: convert to using the FIFO elevator definesJens Axboe2006-09-30
* [PATCH] deadline-iosched: migrate to using the elevator rb functionsJens Axboe2006-09-30
* [PATCH] cfq-iosched: migrate to using the elevator rb functionsJens Axboe2006-09-30
* [PATCH] as-iosched: migrate to using the elevator rb functionsJens Axboe2006-09-30
* [PATCH] elevator: abstract out the rbtree sort handlingJens Axboe2006-09-30
* [PATCH] rbtree: fixed reversed RB_EMPTY_NODE and rb_next/prevJens Axboe2006-09-30
* [PATCH] elevator: move the backmerging logic into the elevator coreJens Axboe2006-09-30
* [PATCH] Split struct request ->flags into two partsJens Axboe2006-09-30
* [PATCH] ifdef blktrace debugging fieldsAlexey Dobriyan2006-09-29
* [PATCH] block: handle subsystem_register() init errorsRandy Dunlap2006-09-29
* [PATCH] inode_diet: Replace inode.u.generic_ip with inode.i_privateTheodore Ts'o2006-09-27
* Merge mulgrave-w:git/linux-2.6James Bottomley2006-09-23
|\
| * Add a real API for dealing with blk_congestion_wait()Trond Myklebust2006-09-22
* | [SCSI] block: add support for shared tag mapsJames Bottomley2006-08-31
|/
* elv_unregister: fix possible crash on module unloadOleg Nesterov2006-08-22
* [PATCH] cfq_cic_link: fix usage of wrong cfq_io_contextOleg Nesterov2006-08-21
">&& should_deliver(to, skb)) { __br_deliver(to, skb); return; } kfree_skb(skb); } /* called with rcu_read_lock */ void br_forward(const struct net_bridge_port *to, struct sk_buff *skb, struct sk_buff *skb0) { if (should_deliver(to, skb)) { if (skb0) deliver_clone(to, skb, __br_forward); else __br_forward(to, skb); return; } if (!skb0) kfree_skb(skb); } static int deliver_clone(const struct net_bridge_port *prev, struct sk_buff *skb, void (*__packet_hook)(const struct net_bridge_port *p, struct sk_buff *skb)) { struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; skb = skb_clone(skb, GFP_ATOMIC); if (!skb) { dev->stats.tx_dropped++; return -ENOMEM; } __packet_hook(prev, skb); return 0; } static struct net_bridge_port *maybe_deliver( struct net_bridge_port *prev, struct net_bridge_port *p, struct sk_buff *skb, void (*__packet_hook)(const struct net_bridge_port *p, struct sk_buff *skb)) { int err; if (!should_deliver(p, skb)) return prev; if (!prev) goto out; err = deliver_clone(prev, skb, __packet_hook); if (err) return ERR_PTR(err); out: return p; } /* called under bridge lock */ static void br_flood(struct net_bridge *br, struct sk_buff *skb, struct sk_buff *skb0, void (*__packet_hook)(const struct net_bridge_port *p, struct sk_buff *skb), bool unicast) { struct net_bridge_port *p; struct net_bridge_port *prev; prev = NULL; list_for_each_entry_rcu(p, &br->port_list, list) { /* Do not flood unicast traffic to ports that turn it off */ if (unicast && !(p->flags & BR_FLOOD)) continue; prev = maybe_deliver(prev, p, skb, __packet_hook); if (IS_ERR(prev)) goto out; } if (!prev) goto out; if (skb0) deliver_clone(prev, skb, __packet_hook); else __packet_hook(prev, skb); return; out: if (!skb0) kfree_skb(skb); } /* called with rcu_read_lock */ void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb, bool unicast) { br_flood(br, skb, NULL, __br_deliver, unicast); } /* called under bridge lock */ void br_flood_forward(struct net_bridge *br, struct sk_buff *skb, struct sk_buff *skb2, bool unicast) { br_flood(br, skb, skb2, __br_forward, unicast); } #ifdef CONFIG_BRIDGE_IGMP_SNOOPING /* called with rcu_read_lock */ static void br_multicast_flood(struct net_bridge_mdb_entry *mdst, struct sk_buff *skb, struct sk_buff *skb0, void (*__packet_hook)( const struct net_bridge_port *p, struct sk_buff *skb)) { struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; struct net_bridge *br = netdev_priv(dev); struct net_bridge_port *prev = NULL; struct net_bridge_port_group *p; struct hlist_node *rp; rp = rcu_dereference(hlist_first_rcu(&br->router_list)); p = mdst ? rcu_dereference(mdst->ports) : NULL; while (p || rp) { struct net_bridge_port *port, *lport, *rport; lport = p ? p->port : NULL; rport = rp ? hlist_entry(rp, struct net_bridge_port, rlist) : NULL; port = (unsigned long)lport > (unsigned long)rport ? lport : rport; prev = maybe_deliver(prev, port, skb, __packet_hook); if (IS_ERR(prev)) goto out; if ((unsigned long)lport >= (unsigned long)port) p = rcu_dereference(p->next); if ((unsigned long)rport >= (unsigned long)port) rp = rcu_dereference(hlist_next_rcu(rp)); } if (!prev) goto out; if (skb0) deliver_clone(prev, skb, __packet_hook); else __packet_hook(prev, skb); return; out: if (!skb0) kfree_skb(skb); } /* called with rcu_read_lock */ void br_multicast_deliver(struct net_bridge_mdb_entry *mdst, struct sk_buff *skb) { br_multicast_flood(mdst, skb, NULL, __br_deliver); } /* called with rcu_read_lock */ void br_multicast_forward(struct net_bridge_mdb_entry *mdst, struct sk_buff *skb, struct sk_buff *skb2) { br_multicast_flood(mdst, skb, skb2, __br_forward); } #endif