libsas fixes for 3.1-rc
Subsystems (2)
The following changes since commit 96067723e46b0dd24ae7b934085ab4eff4d26a1b:
[SCSI] 3w-9xxx: fix iommu_iova leak (2011-09-26 09:28:58 -0500)
are available in the git repository at:
git://github.com/djbw/linux.git libsas-fixes
If there are going to be anymore scsi pulls for 3.1-rc here are some collected candidates. All of these have been on the list previously.
Dan Williams (2):
libsas: fix warnings when checking sata/stp protocol
libsas: fix port->dev_list locking
Jack Wang (1):
libsas: set rphy sas_address and device type correctly
Luben Tuikov (1):
libsas: Allow expander T-T attachments
drivers/scsi/libsas/sas_discover.c | 13 +++++++---- drivers/scsi/libsas/sas_expander.c | 37 ++++++++++++++++++++++++----------- include/scsi/libsas.h | 5 +++- include/scsi/sas.h | 15 ++++++++++++- 4 files changed, 50 insertions(+), 20 deletions(-)
commit 339484f5e5a726a26188ca6cb10dca864d0c4b2f
Author: Jack Wang <[email protected]> Date: Sat Sep 24 09:47:23 2011 +0000
libsas: set rphy sas_address and device type correctly
Before:
# cat /sys/class/sas_phy/phy-6\:0\:6/device_type
none
# cat /sys/class/sas_phy/phy-6\:0\:6/sas_address
0x0000000000000000
After:
# cat /sys/class/sas_phy/phy-6\:0\:6/device_type
end device
# cat /sys/class/sas_phy/phy-6\:0\:6/sas_address
0x500000e0191ce732
Signed-off-by: Jack Wang <[email protected]>
Tested-by: Crystal Yu <[email protected]>
Signed-off-by: Dan Williams <[email protected]>commit 0051c3753833995b4e26be70033d9ba8e2e89de9
Author: Dan Williams <[email protected]> Date: Wed Sep 21 07:47:16 2011 +0000
libsas: fix port->dev_list locking
port->dev_list maintains a list of devices attached to a given sas root port. It needs to be mutated under a lock as contexts outside of the single-threaded-libsas-workqueue access the list via sas_find_dev_by_rphy(). Fixup locations where the list was being mutated without a lock.
This is a follow-up to commit 5911e963 "[SCSI] libsas: remove expander from dev list on error", where Luben noted [1]:
> 2/ We have unlocked list manipulations in sas_ex_discover_end_dev(), > sas_unregister_common_dev(), and sas_ex_discover_end_dev()
Yes, I can see that and that is very unfortunate.
[1]: http://marc.info/?l=linux-scsi&m=131480962006471&w=2
commit 3c6006693b1e5e4a8c7f19623092dee95a377916
Author: Dan Williams <[email protected]> Date: Sat Sep 24 09:07:38 2011 +0000
libsas: fix warnings when checking sata/stp protocol
Several sas drivers legitimately check the protocol against the union of SAS_PROTOCOL_SATA and SAS_PROTOCOL_STP. Provide a SAS_PROTOCOL_STP_ALL to silence warnings like:
drivers/scsi/pm8001/pm8001_sas.c:438:3: warning: case value ‘5’ not in enumerated type ‘enum sas_protocol’ [-Wswitch] drivers/scsi/mvsas/mv_sas.c:798:2: warning: case value ‘5’ not in enumerated type ‘enum sas_protocol’ [-Wswitch] drivers/scsi/mvsas/mv_sas.c:1783:2: warning: case value ‘5’ not in enumerated type ‘enum sas_protocol’ [-Wswitch] drivers/scsi/mvsas/mv_sas.c:1886:2: warning: case value ‘5’ not in enumerated type ‘enum sas_protocol’ [-Wswitch] drivers/scsi/isci/request.c:3565:2: warning: case value ‘5’ not in enumerated type ‘enum sas_protocol’ [-Wswitch]
commit ef6be00f9fc3351beb3ceb9e7117f6f036f0f64e
Author: Luben Tuikov <[email protected]> Date: Sat Sep 24 09:02:13 2011 +0000
libsas: Allow expander T-T attachments
Allow expander table-to-table attachments for
expanders that support it.
drivers/scsi/libsas/sas_discover.c +8 -5
@@ -219,17 +219,20 @@ out_err2:/* ---------- Device registration and unregistration ---------- */ -static inline void sas_unregister_common_dev (struct domain_device *dev) +static void sas_unregister_common_dev (struct asd_sas_port *port,struct domain_device *dev) {sas_notify_lldd_dev_gone (dev);if (!dev->parent) dev->port->port_dev =NULL ;else list_del_init (&dev->siblings); + +spin_lock_irq (&port->dev_list_lock);list_del_init (&dev->dev_list_node); +spin_unlock_irq (&port->dev_list_lock); } -void sas_unregister_dev (struct domain_device *dev) +void sas_unregister_dev (struct asd_sas_port *port,struct domain_device *dev) {if (dev->rphy) {sas_remove_children (&dev->rphy->dev);
@@ -241,15 +244,15 @@ void sas_unregister_dev(struct domain_device *dev)kfree (dev->ex_dev.ex_phy); dev->ex_dev.ex_phy =NULL ; } -sas_unregister_common_dev (dev); +sas_unregister_common_dev (port, dev); }void sas_unregister_domain_devices (struct asd_sas_port *port) {struct domain_device *dev, *n; -list_for_each_entry_safe_reverse (dev,n,&port->dev_list,dev_list_node) -sas_unregister_dev (dev); +list_for_each_entry_safe_reverse (dev, n, &port->dev_list, dev_list_node) +sas_unregister_dev (port, dev); port->port->rphy =NULL ;
drivers/scsi/libsas/sas_expander.c +25 -12
@@ -199,6 +199,8 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, phy->virtual = dr->virtual; phy->last_da_index =-1 ; + phy->phy->identify.sas_address =SAS_ADDR (phy->attached_sas_addr); + phy->phy->identify.device_type = phy->attached_dev_type; phy->phy->identify.initiator_port_protocols = phy->attached_iproto; phy->phy->identify.target_port_protocols = phy->attached_tproto; phy->phy->identify.phy_identifier = phy_id;
@@ -329,6 +331,7 @@ static void ex_assign_report_general(struct domain_device *dev, dev->ex_dev.ex_change_count =be16_to_cpu (rg->change_count); dev->ex_dev.max_route_indexes =be16_to_cpu (rg->route_indexes); dev->ex_dev.num_phys =min (rg->num_phys, (u8 )MAX_EXPANDER_PHYS ); + dev->ex_dev.t2t_supp = rg->t2t_supp; dev->ex_dev.conf_route_table = rg->conf_route_table; dev->ex_dev.configuring = rg->configuring;memcpy (dev->ex_dev.enclosure_logical_id, rg->enclosure_logical_id,8 );
@@ -751,7 +754,10 @@ static struct domain_device *sas_ex_discover_end_dev( out_list_del:sas_rphy_free (child->rphy); child->rphy =NULL ; + +spin_lock_irq (&parent->port->dev_list_lock);list_del (&child->dev_list_node); +spin_unlock_irq (&parent->port->dev_list_lock); out_free:sas_port_delete (phy->port); out_err:
@@ -1133,15 +1139,17 @@ static void sas_print_parent_topology_bug(struct domain_device *child, };struct domain_device *parent = child->parent; - sas_printk("%s ex %016llx phy 0x%x <--> %s ex %016llx phy 0x%x " - "has %c:%c routing link!\n", + sas_printk("%s ex %016llx (T2T supp:%d) phy 0x%x <--> %s ex %016llx " + "(T2T supp:%d) phy 0x%x has %c:%c routing link!\n", ex_type[parent->dev_type], SAS_ADDR(parent->sas_addr), + parent->ex_dev.t2t_supp, parent_phy->phy_id, ex_type[child->dev_type], SAS_ADDR(child->sas_addr), + child->ex_dev.t2t_supp, child_phy->phy_id, ra_char[parent_phy->routing_attr],
@@ -1238,10 +1246,15 @@ static int sas_check_parent_topology(struct domain_device *child)sas_print_parent_topology_bug (child, parent_phy, child_phy); res = -ENODEV ; } - }else if (parent_phy->routing_attr ==TABLE_ROUTING && - child_phy->routing_attr !=SUBTRACTIVE_ROUTING ) { -sas_print_parent_topology_bug (child, parent_phy, child_phy); - res = -ENODEV ; + }else if (parent_phy->routing_attr ==TABLE_ROUTING ) { +if (child_phy->routing_attr ==SUBTRACTIVE_ROUTING || + (child_phy->routing_attr ==TABLE_ROUTING && + child_ex->t2t_supp && parent_ex->t2t_supp)) { +/* All good */ ; + }else { +sas_print_parent_topology_bug (child, parent_phy, child_phy); + res = -ENODEV ; + } }break ;case FANOUT_DEV :
@@ -1729,7 +1742,7 @@ out:return res; } -static void sas_unregister_ex_tree (struct domain_device *dev) +static void sas_unregister_ex_tree (struct asd_sas_port *port,struct domain_device *dev) {struct expander_device *ex = &dev->ex_dev;struct domain_device *child, *n;
@@ -1738,11 +1751,11 @@ static void sas_unregister_ex_tree(struct domain_device *dev) child->gone =1 ;if (child->dev_type ==EDGE_DEV || child->dev_type ==FANOUT_DEV ) -sas_unregister_ex_tree (child); +sas_unregister_ex_tree (port, child);else -sas_unregister_dev (child); +sas_unregister_dev (port, child); } -sas_unregister_dev (dev); +sas_unregister_dev (port, dev); } static void sas_unregister_devs_sas_addr(struct domain_device *parent,
@@ -1759,9 +1772,9 @@ static void sas_unregister_devs_sas_addr(struct domain_device *parent, child->gone =1 ;if (child->dev_type ==EDGE_DEV || child->dev_type ==FANOUT_DEV ) -sas_unregister_ex_tree (child); +sas_unregister_ex_tree (parent->port, child);else -sas_unregister_dev (child); +sas_unregister_dev (parent->port, child);break ; } }
include/scsi/libsas.h +4 -1
@@ -142,8 +142,11 @@ struct expander_device {u16 ex_change_count;u16 max_route_indexes;u8 num_phys; + + u8 t2t_supp:1; u8 configuring:1; u8 conf_route_table:1; +u8 enclosure_logical_id[8 ];struct ex_phy *ex_phy;
@@ -652,7 +655,7 @@ int sas_discover_event(struct asd_sas_port *, enum discover_event ev);int sas_discover_sata (struct domain_device *);int sas_discover_end_dev (struct domain_device *); -void sas_unregister_dev (struct domain_device *); +void sas_unregister_dev (struct asd_sas_port *port,struct domain_device *);void sas_init_dev (struct domain_device *);
include/scsi/sas.h +13 -2
@@ -108,6 +108,7 @@ enum sas_protocol {SAS_PROTOCOL_STP =0x04 ,SAS_PROTOCOL_SSP =0x08 ,SAS_PROTOCOL_ALL =0x0E , + SAS_PROTOCOL_STP_ALL = SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA, };/* From the spec; local phys only */
@@ -341,7 +342,12 @@ struct report_general_resp { u8 conf_route_table:1; u8 configuring:1; - u8 _r_b:6; + u8 config_others:1; + u8 orej_retry_supp:1; + u8 stp_cont_awt:1; + u8 self_config:1; + u8 zone_config:1; + u8 t2t_supp:1;u8 _r_c;
@@ -528,7 +534,12 @@ struct report_general_resp {u8 _r_a;u8 num_phys; - u8 _r_b:6; + u8 t2t_supp:1; + u8 zone_config:1; + u8 self_config:1; + u8 stp_cont_awt:1; + u8 orej_retry_supp:1; + u8 config_others:1; u8 configuring:1; u8 conf_route_table:1;
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html