Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 21 May 2010 14:19:18 +0000 (07:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 21 May 2010 14:19:18 +0000 (07:19 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (182 commits)
  [SCSI] aacraid: add an ifdef'd device delete case instead of taking the device offline
  [SCSI] aacraid: prohibit access to array container space
  [SCSI] aacraid: add support for handling ATA pass-through commands.
  [SCSI] aacraid: expose physical devices for models with newer firmware
  [SCSI] aacraid: respond automatically to volumes added by config tool
  [SCSI] fcoe: fix fcoe module ref counting
  [SCSI] libfcoe: FIP Keep-Alive messages for VPorts are sent with incorrect port_id and wwn
  [SCSI] libfcoe: Fix incorrect MAC address clearing
  [SCSI] fcoe: fix a circular locking issue with rtnl and sysfs mutex
  [SCSI] libfc: Move the port_id into lport
  [SCSI] fcoe: move link speed checking into its own routine
  [SCSI] libfc: Remove extra pointer check
  [SCSI] libfc: Remove unused fc_get_host_port_type
  [SCSI] fcoe: fixes wrong error exit in fcoe_create
  [SCSI] libfc: set seq_id for incoming sequence
  [SCSI] qla2xxx: Updates to ISP82xx support.
  [SCSI] qla2xxx: Optionally disable target reset.
  [SCSI] qla2xxx: ensure flash operation and host reset via sg_reset are mutually exclusive
  [SCSI] qla2xxx: Silence bogus warning by gcc for wrap and did.
  [SCSI] qla2xxx: T10 DIF support added.
  ...

1  2 
MAINTAINERS
drivers/scsi/fcoe/fcoe.c
drivers/scsi/iscsi_tcp.c
drivers/scsi/libsas/sas_scsi_host.c
include/linux/ftrace_event.h
include/trace/ftrace.h
kernel/trace/trace_output.c

diff --combined MAINTAINERS
@@@ -131,19 -131,12 +131,12 @@@ L:      netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/typhoon*
  
- 3W-9XXX SATA-RAID CONTROLLER DRIVER
- M:    Adam Radford <linuxraid@amcc.com>
+ 3WARE SAS/SATA-RAID SCSI DRIVERS (3W-XXXX, 3W-9XXX, 3W-SAS)
+ M:    Adam Radford <linuxraid@lsi.com>
  L:    linux-scsi@vger.kernel.org
- W:    http://www.amcc.com
+ W:    http://www.lsi.com
  S:    Supported
- F:    drivers/scsi/3w-9xxx*
- 3W-XXXX ATA-RAID CONTROLLER DRIVER
- M:    Adam Radford <linuxraid@amcc.com>
- L:    linux-scsi@vger.kernel.org
- W:    http://www.amcc.com
- S:    Supported
- F:    drivers/scsi/3w-xxxx*
+ F:    drivers/scsi/3w-*
  
  53C700 AND 53C700-66 SCSI DRIVER
  M:    "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
@@@ -586,12 -579,6 +579,12 @@@ F:       drivers/mtd/nand/bcm_umi_bch.
  F:    drivers/mtd/nand/bcm_umi_hamming.c
  F:    drivers/mtd/nand/nand_bcm_umi.h
  
 +ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT
 +M:    Anton Vorontsov <avorontsov@mvista.com>
 +S:    Maintained
 +F:    arch/arm/mach-cns3xxx/
 +T:    git git://git.infradead.org/users/cbou/linux-cns3xxx.git
 +
  ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
  M:    Hartley Sweeten <hsweeten@visionengravers.com>
  M:    Ryan Mallon <ryan@bluewatersys.com>
@@@ -781,10 -768,11 +774,10 @@@ M:      Philipp Zabel <philipp.zabel@gmail.c
  S:    Maintained
  
  ARM/Marvell Loki/Kirkwood/MV78xx0/Orion SOC support
 -M:    Lennert Buytenhek <buytenh@marvell.com>
 -M:    Nicolas Pitre <nico@marvell.com>
 +M:    Lennert Buytenhek <kernel@wantstofly.org>
 +M:    Nicolas Pitre <nico@fluxnic.net>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.marvell.com/orion
 -S:    Maintained
 +S:    Odd Fixes
  F:    arch/arm/mach-loki/
  F:    arch/arm/mach-kirkwood/
  F:    arch/arm/mach-mv78xx0/
@@@ -819,7 -807,6 +812,7 @@@ ARM/QUALCOMM MSM MACHINE SUPPOR
  M:    David Brown <davidb@codeaurora.org>
  M:    Daniel Walker <dwalker@codeaurora.org>
  M:    Bryan Huntsman <bryanh@codeaurora.org>
 +L:    linux-arm-msm@vger.kernel.org
  F:    arch/arm/mach-msm/
  F:    drivers/video/msm/
  F:    drivers/mmc/host/msm_sdcc.c
@@@ -1000,20 -987,6 +993,20 @@@ W:      http://www.arm.linux.org.uk
  S:    Maintained
  F:    arch/arm/vfp/
  
 +ARM/VOIPAC PXA270 SUPPORT
 +M:    Marek Vasut <marek.vasut@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/mach-pxa/vpac270.c
 +F:    arch/arm/mach-pxa/include/mach-pxa/vpac270.h
 +
 +ARM/ZIPIT Z2 SUPPORT
 +M:    Marek Vasut <marek.vasut@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/mach-pxa/z2.c
 +F:    arch/arm/mach-pxa/include/mach-pxa/z2.h
 +
  ASC7621 HARDWARE MONITOR DRIVER
  M:    George Joseph <george.joseph@fairview5.com>
  L:    lm-sensors@lm-sensors.org
@@@ -1521,10 -1494,9 +1514,10 @@@ M:    Andy Whitcroft <apw@canonical.com
  S:    Supported
  F:    scripts/checkpatch.pl
  
 -CISCO 10G ETHERNET DRIVER
 +CISCO VIC ETHERNET NIC DRIVER
  M:    Scott Feldman <scofeldm@cisco.com>
 -M:    Joe Eykholt <jeykholt@cisco.com>
 +M:    Vasanthy Kolluri <vkolluri@cisco.com>
 +M:    Roopa Prabhu <roprabhu@cisco.com>
  S:    Supported
  F:    drivers/net/enic/
  
@@@ -1750,20 -1722,6 +1743,20 @@@ W:    http://www.openfabrics.or
  S:    Supported
  F:    drivers/infiniband/hw/cxgb3/
  
 +CXGB4 ETHERNET DRIVER (CXGB4)
 +M:    Dimitris Michailidis <dm@chelsio.com>
 +L:    netdev@vger.kernel.org
 +W:    http://www.chelsio.com
 +S:    Supported
 +F:    drivers/net/cxgb4/
 +
 +CXGB4 IWARP RNIC DRIVER (IW_CXGB4)
 +M:    Steve Wise <swise@chelsio.com>
 +L:    linux-rdma@vger.kernel.org
 +W:    http://www.openfabrics.org
 +S:    Supported
 +F:    drivers/infiniband/hw/cxgb4/
 +
  CYBERPRO FB DRIVER
  M:    Russell King <linux@arm.linux.org.uk>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2702,12 -2660,16 +2695,12 @@@ F:   Documentation/timers/hpet.tx
  F:    drivers/char/hpet.c
  F:    include/linux/hpet.h
  
 -HPET: i386
 -M:    "Venkatesh Pallipadi (Venki)" <venkatesh.pallipadi@intel.com>
 +HPET: x86
 +M:    "Venkatesh Pallipadi (Venki)" <venki@google.com>
  S:    Maintained
  F:    arch/x86/kernel/hpet.c
  F:    arch/x86/include/asm/hpet.h
  
 -HPET: x86_64
 -M:    Vojtech Pavlik <vojtech@suse.cz>
 -S:    Maintained
 -
  HPET: ACPI
  M:    Bob Picco <bob.picco@hp.com>
  S:    Maintained
@@@ -2748,7 -2710,6 +2741,7 @@@ M:      "Ben Dooks (embedded platforms)" <be
  L:    linux-i2c@vger.kernel.org
  W:    http://i2c.wiki.kernel.org/
  T:    quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/
 +T:    git git://git.fluff.org/bjdooks/linux.git
  S:    Maintained
  F:    Documentation/i2c/
  F:    drivers/i2c/
@@@ -2985,17 -2946,6 +2978,17 @@@ S:    Odd Fixe
  F:    Documentation/networking/README.ipw2200
  F:    drivers/net/wireless/ipw2x00/ipw2200.*
  
 +INTEL(R) TRUSTED EXECUTION TECHNOLOGY (TXT)
 +M:    Joseph Cihula <joseph.cihula@intel.com>
 +M:    Shane Wang <shane.wang@intel.com>
 +L:    tboot-devel@lists.sourceforge.net
 +W:    http://tboot.sourceforge.net
 +T:    Mercurial http://www.bughost.org/repos.hg/tboot.hg
 +S:    Supported
 +F:    Documentation/intel_txt.txt
 +F:    include/linux/tboot.h
 +F:    arch/x86/kernel/tboot.c
 +
  INTEL WIRELESS WIMAX CONNECTION 2400
  M:    Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
  M:    linux-wimax@intel.com
@@@ -3045,9 -2995,10 +3038,9 @@@ F:     net/ipv4/netfilter/ipt_MASQUERADE.
  IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
  M:    Sorbica Shieh <sorbica@icplus.com.tw>
 -M:    Jesse Huang <jesse@icplus.com.tw>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ipg.c
 +F:    drivers/net/ipg.*
  
  IPATH DRIVER
  M:    Ralph Campbell <infinipath@qlogic.com>
@@@ -3666,8 -3617,7 +3659,8 @@@ F:      drivers/net/wireless/mwl8k.
  
  MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER
  M:    Nicolas Pitre <nico@fluxnic.net>
 -S:    Maintained
 +S:    Odd Fixes
 +F: drivers/mmc/host/mvsdio.*
  
  MARVELL YUKON / SYSKONNECT DRIVER
  M:    Mirko Lindner <mlindner@syskonnect.de>
@@@ -3895,6 -3845,7 +3888,6 @@@ M:      Ramkrishna Vepa <ram.vepa@neterion.c
  M:    Rastapur Santosh <santosh.rastapur@neterion.com>
  M:    Sivakumar Subramani <sivakumar.subramani@neterion.com>
  M:    Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
 -M:    Anil Murthy <anil.murthy@neterion.com>
  L:    netdev@vger.kernel.org
  W:    http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous
  W:    http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
@@@ -3999,7 -3950,6 +3992,7 @@@ F:      net/rfkill
  F:    net/wireless/
  F:    include/net/ieee80211*
  F:    include/linux/wireless.h
 +F:    include/linux/iw_handler.h
  F:    drivers/net/wireless/
  
  NETWORKING DRIVERS
@@@ -4208,7 -4158,6 +4201,7 @@@ OPROFIL
  M:    Robert Richter <robert.richter@amd.com>
  L:    oprofile-list@lists.sf.net
  S:    Maintained
 +F:    arch/*/include/asm/oprofile*.h
  F:    arch/*/oprofile/
  F:    drivers/oprofile/
  F:    include/linux/oprofile.h
@@@ -4397,13 -4346,13 +4390,13 @@@ M:   Paul Mackerras <paulus@samba.org
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Arnaldo Carvalho de Melo <acme@redhat.com>
  S:    Supported
 -F:    kernel/perf_event.c
 +F:    kernel/perf_event*.c
  F:    include/linux/perf_event.h
 -F:    arch/*/kernel/perf_event.c
 -F:    arch/*/kernel/*/perf_event.c
 -F:    arch/*/kernel/*/*/perf_event.c
 +F:    arch/*/kernel/perf_event*.c
 +F:    arch/*/kernel/*/perf_event*.c
 +F:    arch/*/kernel/*/*/perf_event*.c
  F:    arch/*/include/asm/perf_event.h
 -F:    arch/*/lib/perf_event.c
 +F:    arch/*/lib/perf_event*.c
  F:    arch/*/kernel/perf_callchain.c
  F:    tools/perf/
  
@@@ -4621,6 -4570,14 +4614,14 @@@ S:    Supporte
  F:    Documentation/scsi/LICENSE.qla2xxx
  F:    drivers/scsi/qla2xxx/
  
+ QLOGIC QLA4XXX iSCSI DRIVER
+ M:    Ravi Anand <ravi.anand@qlogic.com>
+ M:    Vikas Chaudhary <vikas.chaudhary@qlogic.com>
+ M:    iscsi-driver@qlogic.com
+ L:    linux-scsi@vger.kernel.org
+ S:    Supported
+ F:    drivers/scsi/qla4xxx/
  QLOGIC QLA3XXX NETWORK DRIVER
  M:    Ron Mercer <ron.mercer@qlogic.com>
  M:    linux-driver@qlogic.com
@@@ -4631,7 -4588,6 +4632,7 @@@ F:      drivers/net/qla3xxx.
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
  M:    Amit Kumar Salecha <amit.salecha@qlogic.com>
 +M:    Anirban Chakraborty <anirban.chakraborty@qlogic.com>
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -5166,7 -5122,7 +5167,7 @@@ F:      mm/sl?b.
  
  SMC91x ETHERNET DRIVER
  M:    Nicolas Pitre <nico@fluxnic.net>
 -S:    Maintained
 +S:    Odd Fixes
  F:    drivers/net/smc91x.*
  
  SMSC47B397 HARDWARE MONITOR DRIVER
@@@ -5297,46 -5253,6 +5298,46 @@@ F:    drivers/serial/sunsu.
  F:    drivers/serial/sunzilog.c
  F:    drivers/serial/sunzilog.h
  
 +SPEAR PLATFORM SUPPORT
 +M:    Viresh Kumar <viresh.kumar@st.com>
 +W:    http://www.st.com/spear
 +S:    Maintained
 +F:    arch/arm/plat-spear/
 +
 +SPEAR3XX MACHINE SUPPORT
 +M:    Viresh Kumar <viresh.kumar@st.com>
 +W:    http://www.st.com/spear
 +S:    Maintained
 +F:    arch/arm/mach-spear3xx/
 +
 +SPEAR6XX MACHINE SUPPORT
 +M:    Rajeev Kumar <rajeev-dlh.kumar@st.com>
 +W:    http://www.st.com/spear
 +S:    Maintained
 +F:    arch/arm/mach-spear6xx/
 +
 +SPEAR CLOCK FRAMEWORK SUPPORT
 +M:    Viresh Kumar <viresh.kumar@st.com>
 +W:    http://www.st.com/spear
 +S:    Maintained
 +F:    arch/arm/mach-spear*/clock.c
 +F:    arch/arm/mach-spear*/include/mach/clkdev.h
 +F:    arch/arm/plat-spear/clock.c
 +F:    arch/arm/plat-spear/include/plat/clock.h and clkdev.h
 +
 +SPEAR PAD MULTIPLEXING SUPPORT
 +M:    Viresh Kumar <viresh.kumar@st.com>
 +W:    http://www.st.com/spear
 +S:    Maintained
 +F:    arch/arm/plat-spear/include/plat/padmux.h
 +F:    arch/arm/plat-spear/padmux.c
 +F:    arch/arm/mach-spear*/spear*xx.c
 +F:    arch/arm/mach-spear*/include/mach/generic.h
 +F:    arch/arm/mach-spear3xx/spear3*0.c
 +F:    arch/arm/mach-spear3xx/spear3*0_evb.c
 +F:    arch/arm/mach-spear6xx/spear600.c
 +F:    arch/arm/mach-spear6xx/spear600_evb.c
 +
  SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
  M:    Roger Wolff <R.E.Wolff@BitWizard.nl>
  S:    Supported
@@@ -5965,7 -5881,7 +5966,7 @@@ M:      Laurent Pinchart <laurent.pinchart@s
  L:    linux-uvc-devel@lists.berlios.de (subscribers-only)
  L:    linux-media@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
 -W:    http://linux-uvc.berlios.de
 +W:    http://www.ideasonboard.org/uvc/
  S:    Maintained
  F:    drivers/media/video/uvc/
  
diff --combined drivers/scsi/fcoe/fcoe.c
@@@ -74,6 -74,7 +74,7 @@@ static int fcoe_rcv(struct sk_buff *, s
  static int fcoe_percpu_receive_thread(void *);
  static void fcoe_clean_pending_queue(struct fc_lport *);
  static void fcoe_percpu_clean(struct fc_lport *);
+ static int fcoe_link_speed_update(struct fc_lport *);
  static int fcoe_link_ok(struct fc_lport *);
  
  static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *);
@@@ -146,6 -147,7 +147,7 @@@ static int fcoe_vport_destroy(struct fc
  static int fcoe_vport_create(struct fc_vport *, bool disabled);
  static int fcoe_vport_disable(struct fc_vport *, bool disable);
  static void fcoe_set_vport_symbolic_name(struct fc_vport *);
+ static void fcoe_set_port_id(struct fc_lport *, u32, struct fc_frame *);
  
  static struct libfc_function_template fcoe_libfc_fcn_templ = {
        .frame_send = fcoe_xmit,
        .ddp_done = fcoe_ddp_done,
        .elsct_send = fcoe_elsct_send,
        .get_lesb = fcoe_get_lesb,
+       .lport_set_port_id = fcoe_set_port_id,
  };
  
  struct fc_function_template fcoe_transport_function = {
@@@ -309,10 -312,10 +312,10 @@@ static int fcoe_interface_setup(struct 
         * for multiple unicast MACs.
         */
        memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
 -      dev_unicast_add(netdev, flogi_maddr);
 +      dev_uc_add(netdev, flogi_maddr);
        if (fip->spma)
 -              dev_unicast_add(netdev, fip->ctl_src_addr);
 -      dev_mc_add(netdev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
 +              dev_uc_add(netdev, fip->ctl_src_addr);
 +      dev_mc_add(netdev, FIP_ALL_ENODE_MACS);
  
        /*
         * setup the receive function from ethernet driver
@@@ -395,10 -398,10 +398,10 @@@ void fcoe_interface_cleanup(struct fcoe
  
        /* Delete secondary MAC addresses */
        memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
 -      dev_unicast_delete(netdev, flogi_maddr);
 +      dev_uc_del(netdev, flogi_maddr);
        if (fip->spma)
 -              dev_unicast_delete(netdev, fip->ctl_src_addr);
 -      dev_mc_delete(netdev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
 +              dev_uc_del(netdev, fip->ctl_src_addr);
 +      dev_mc_del(netdev, FIP_ALL_ENODE_MACS);
  
        /* Tell the LLD we are done w/ FCoE */
        ops = netdev->netdev_ops;
@@@ -491,9 -494,9 +494,9 @@@ static void fcoe_update_src_mac(struct 
  
        rtnl_lock();
        if (!is_zero_ether_addr(port->data_src_addr))
 -              dev_unicast_delete(fcoe->netdev, port->data_src_addr);
 +              dev_uc_del(fcoe->netdev, port->data_src_addr);
        if (!is_zero_ether_addr(addr))
 -              dev_unicast_add(fcoe->netdev, addr);
 +              dev_uc_add(fcoe->netdev, addr);
        memcpy(port->data_src_addr, addr, ETH_ALEN);
        rtnl_unlock();
  }
@@@ -629,6 -632,8 +632,8 @@@ static int fcoe_netdev_config(struct fc
        port->fcoe_pending_queue_active = 0;
        setup_timer(&port->timer, fcoe_queue_timer, (unsigned long)lport);
  
+       fcoe_link_speed_update(lport);
        if (!lport->vport) {
                /*
                 * Use NAA 1&2 (FC-FS Rev. 2.0, Sec. 15) to generate WWNN/WWPN:
  /**
   * fcoe_shost_config() - Set up the SCSI host associated with a local port
   * @lport: The local port
-  * @shost: The SCSI host to associate with the local port
   * @dev:   The device associated with the SCSI host
   *
   * Must be called after fcoe_lport_config() and fcoe_netdev_config()
   *
   * Returns: 0 for success
   */
- static int fcoe_shost_config(struct fc_lport *lport, struct Scsi_Host *shost,
-                            struct device *dev)
+ static int fcoe_shost_config(struct fc_lport *lport, struct device *dev)
  {
        int rc = 0;
  
        lport->host->max_lun = FCOE_MAX_LUN;
        lport->host->max_id = FCOE_MAX_FCP_TARGET;
        lport->host->max_channel = 0;
+       lport->host->max_cmd_len = FCOE_MAX_CMD_LEN;
        if (lport->vport)
                lport->host->transportt = fcoe_vport_transport_template;
        else
@@@ -796,6 -801,12 +801,12 @@@ skip_oem
  /**
   * fcoe_if_destroy() - Tear down a SW FCoE instance
   * @lport: The local port to be destroyed
+  *
+  * Locking: must be called with the RTNL mutex held and RTNL mutex
+  * needed to be dropped by this function since not dropping RTNL
+  * would cause circular locking warning on synchronous fip worker
+  * cancelling thru fcoe_interface_put invoked by this function.
+  *
   */
  static void fcoe_if_destroy(struct fc_lport *lport)
  {
        /* Free existing transmit skbs */
        fcoe_clean_pending_queue(lport);
  
-       rtnl_lock();
        if (!is_zero_ether_addr(port->data_src_addr))
 -              dev_unicast_delete(netdev, port->data_src_addr);
 +              dev_uc_del(netdev, port->data_src_addr);
        rtnl_unlock();
  
        /* receives may not be stopped until after this */
  
        /* Release the Scsi_Host */
        scsi_host_put(lport->host);
+       module_put(THIS_MODULE);
  }
  
  /**
@@@ -897,7 -908,6 +908,6 @@@ static struct fc_lport *fcoe_if_create(
        struct net_device *netdev = fcoe->netdev;
        struct fc_lport *lport = NULL;
        struct fcoe_port *port;
-       struct Scsi_Host *shost;
        int rc;
        /*
         * parent is only a vport if npiv is 1,
                rc = -ENOMEM;
                goto out;
        }
-       shost = lport->host;
        port = lport_priv(lport);
        port->lport = lport;
        port->fcoe = fcoe;
        }
  
        if (npiv) {
-               FCOE_NETDEV_DBG(netdev, "Setting vport names, 0x%llX 0x%llX\n",
+               FCOE_NETDEV_DBG(netdev, "Setting vport names, "
+                               "%16.16llx %16.16llx\n",
                                vport->node_name, vport->port_name);
                fc_set_wwnn(lport, vport->node_name);
                fc_set_wwpn(lport, vport->port_name);
        }
  
        /* configure lport scsi host properties */
-       rc = fcoe_shost_config(lport, shost, parent);
+       rc = fcoe_shost_config(lport, parent);
        if (rc) {
                FCOE_NETDEV_DBG(netdev, "Could not configure shost for the "
                                "interface\n");
@@@ -1073,7 -1083,7 +1083,7 @@@ static void fcoe_percpu_thread_destroy(
        struct sk_buff *skb;
  #ifdef CONFIG_SMP
        struct fcoe_percpu_s *p0;
-       unsigned targ_cpu = smp_processor_id();
+       unsigned targ_cpu = get_cpu();
  #endif /* CONFIG_SMP */
  
        FCOE_DBG("Destroying receive thread for CPU %d\n", cpu);
                        kfree_skb(skb);
                spin_unlock_bh(&p->fcoe_rx_list.lock);
        }
+       put_cpu();
  #else
        /*
         * This a non-SMP scenario where the singular Rx thread is
@@@ -1297,8 -1308,8 +1308,8 @@@ int fcoe_rcv(struct sk_buff *skb, struc
  
        return 0;
  err:
-       fc_lport_get_stats(lport)->ErrorFrames++;
+       per_cpu_ptr(lport->dev_stats, get_cpu())->ErrorFrames++;
+       put_cpu();
  err2:
        kfree_skb(skb);
        return -1;
@@@ -1444,7 -1455,7 +1455,7 @@@ int fcoe_xmit(struct fc_lport *lport, s
                return 0;
        }
  
-       if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ) &&
+       if (unlikely(fh->fh_type == FC_TYPE_ELS) &&
            fcoe_ctlr_els_send(&fcoe->ctlr, lport, skb))
                return 0;
  
                skb_shinfo(skb)->gso_size = 0;
        }
        /* update tx stats: regardless if LLD fails */
-       stats = fc_lport_get_stats(lport);
+       stats = per_cpu_ptr(lport->dev_stats, get_cpu());
        stats->TxFrames++;
        stats->TxWords += wlen;
+       put_cpu();
  
        /* send down to lld */
        fr_dev(fp) = lport;
@@@ -1563,7 -1575,6 +1575,6 @@@ static void fcoe_recv_frame(struct sk_b
        struct fc_frame_header *fh;
        struct fcoe_crc_eof crc_eof;
        struct fc_frame *fp;
-       u8 *mac = NULL;
        struct fcoe_port *port;
        struct fcoe_hdr *hp;
  
                        skb_end_pointer(skb), skb->csum,
                        skb->dev ? skb->dev->name : "<NULL>");
  
-       /*
-        * Save source MAC address before discarding header.
-        */
        port = lport_priv(lport);
        if (skb_is_nonlinear(skb))
                skb_linearize(skb);     /* not ideal */
-       mac = eth_hdr(skb)->h_source;
  
        /*
         * Frame length checks and setting up the header pointers
        hp = (struct fcoe_hdr *) skb_network_header(skb);
        fh = (struct fc_frame_header *) skb_transport_header(skb);
  
-       stats = fc_lport_get_stats(lport);
+       stats = per_cpu_ptr(lport->dev_stats, get_cpu());
        if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
                if (stats->ErrorFrames < 5)
                        printk(KERN_WARNING "fcoe: FCoE version "
                               "initiator supports version "
                               "%x\n", FC_FCOE_DECAPS_VER(hp),
                               FC_FCOE_VER);
-               stats->ErrorFrames++;
-               kfree_skb(skb);
-               return;
+               goto drop;
        }
  
        skb_pull(skb, sizeof(struct fcoe_hdr));
        fr_sof(fp) = hp->fcoe_sof;
  
        /* Copy out the CRC and EOF trailer for access */
-       if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
-               kfree_skb(skb);
-               return;
-       }
+       if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof)))
+               goto drop;
        fr_eof(fp) = crc_eof.fcoe_eof;
        fr_crc(fp) = crc_eof.fcoe_crc32;
-       if (pskb_trim(skb, fr_len)) {
-               kfree_skb(skb);
-               return;
-       }
+       if (pskb_trim(skb, fr_len))
+               goto drop;
  
        /*
         * We only check CRC if no offload is available and if it is
                fr_flags(fp) |= FCPHF_CRC_UNCHECKED;
  
        fh = fc_frame_header_get(fp);
-       if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
-           fh->fh_type == FC_TYPE_FCP) {
-               fc_exch_recv(lport, fp);
-               return;
-       }
-       if (fr_flags(fp) & FCPHF_CRC_UNCHECKED) {
+       if ((fh->fh_r_ctl != FC_RCTL_DD_SOL_DATA ||
+           fh->fh_type != FC_TYPE_FCP) &&
+           (fr_flags(fp) & FCPHF_CRC_UNCHECKED)) {
                if (le32_to_cpu(fr_crc(fp)) !=
                    ~crc32(~0, skb->data, fr_len)) {
                        if (stats->InvalidCRCCount < 5)
                                printk(KERN_WARNING "fcoe: dropping "
                                       "frame with CRC error\n");
                        stats->InvalidCRCCount++;
-                       stats->ErrorFrames++;
-                       fc_frame_free(fp);
-                       return;
+                       goto drop;
                }
                fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
        }
+       put_cpu();
        fc_exch_recv(lport, fp);
+       return;
+ drop:
+       stats->ErrorFrames++;
+       put_cpu();
+       kfree_skb(skb);
  }
  
  /**
@@@ -1835,11 -1838,15 +1838,15 @@@ static int fcoe_device_notification(str
                FCOE_NETDEV_DBG(netdev, "Unknown event %ld "
                                "from netdev netlink\n", event);
        }
+       fcoe_link_speed_update(lport);
        if (link_possible && !fcoe_link_ok(lport))
                fcoe_ctlr_link_up(&fcoe->ctlr);
        else if (fcoe_ctlr_link_down(&fcoe->ctlr)) {
-               stats = fc_lport_get_stats(lport);
+               stats = per_cpu_ptr(lport->dev_stats, get_cpu());
                stats->LinkFailureCount++;
+               put_cpu();
                fcoe_clean_pending_queue(lport);
        }
  out:
@@@ -1901,13 -1908,19 +1908,19 @@@ static int fcoe_disable(const char *buf
                goto out_nodev;
        }
  
-       rtnl_lock();
+       if (!rtnl_trylock()) {
+               dev_put(netdev);
+               mutex_unlock(&fcoe_config_mutex);
+               return restart_syscall();
+       }
        fcoe = fcoe_hostlist_lookup_port(netdev);
        rtnl_unlock();
  
-       if (fcoe)
+       if (fcoe) {
                fc_fabric_logoff(fcoe->ctlr.lp);
-       else
+               fcoe_ctlr_link_down(&fcoe->ctlr);
+       } else
                rc = -ENODEV;
  
        dev_put(netdev);
@@@ -1950,13 -1963,20 +1963,20 @@@ static int fcoe_enable(const char *buff
                goto out_nodev;
        }
  
-       rtnl_lock();
+       if (!rtnl_trylock()) {
+               dev_put(netdev);
+               mutex_unlock(&fcoe_config_mutex);
+               return restart_syscall();
+       }
        fcoe = fcoe_hostlist_lookup_port(netdev);
        rtnl_unlock();
  
-       if (fcoe)
+       if (fcoe) {
+               if (!fcoe_link_ok(fcoe->ctlr.lp))
+                       fcoe_ctlr_link_up(&fcoe->ctlr);
                rc = fc_fabric_login(fcoe->ctlr.lp);
-       else
+       else
                rc = -ENODEV;
  
        dev_put(netdev);
@@@ -1999,7 -2019,12 +2019,12 @@@ static int fcoe_destroy(const char *buf
                goto out_nodev;
        }
  
-       rtnl_lock();
+       if (!rtnl_trylock()) {
+               dev_put(netdev);
+               mutex_unlock(&fcoe_config_mutex);
+               return restart_syscall();
+       }
        fcoe = fcoe_hostlist_lookup_port(netdev);
        if (!fcoe) {
                rtnl_unlock();
        }
        list_del(&fcoe->list);
        fcoe_interface_cleanup(fcoe);
-       rtnl_unlock();
+       /* RTNL mutex is dropped by fcoe_if_destroy */
        fcoe_if_destroy(fcoe->ctlr.lp);
-       module_put(THIS_MODULE);
  
  out_putdev:
        dev_put(netdev);
@@@ -2029,6 -2053,8 +2053,8 @@@ static void fcoe_destroy_work(struct wo
  
        port = container_of(work, struct fcoe_port, destroy_work);
        mutex_lock(&fcoe_config_mutex);
+       rtnl_lock();
+       /* RTNL mutex is dropped by fcoe_if_destroy */
        fcoe_if_destroy(port->lport);
        mutex_unlock(&fcoe_config_mutex);
  }
@@@ -2050,6 -2076,12 +2076,12 @@@ static int fcoe_create(const char *buff
        struct net_device *netdev;
  
        mutex_lock(&fcoe_config_mutex);
+       if (!rtnl_trylock()) {
+               mutex_unlock(&fcoe_config_mutex);
+               return restart_syscall();
+       }
  #ifdef CONFIG_FCOE_MODULE
        /*
         * Make sure the module has been initialized, and is not about to be
         */
        if (THIS_MODULE->state != MODULE_STATE_LIVE) {
                rc = -ENODEV;
-               goto out_nodev;
+               goto out_nomod;
        }
  #endif
  
                goto out_nomod;
        }
  
-       rtnl_lock();
        netdev = fcoe_if_to_netdev(buffer);
        if (!netdev) {
                rc = -ENODEV;
@@@ -2122,35 -2153,27 +2153,27 @@@ out_free
  out_putdev:
        dev_put(netdev);
  out_nodev:
-       rtnl_unlock();
        module_put(THIS_MODULE);
  out_nomod:
+       rtnl_unlock();
        mutex_unlock(&fcoe_config_mutex);
        return rc;
  }
  
  /**
-  * fcoe_link_ok() - Check if the link is OK for a local port
-  * @lport: The local port to check link on
-  *
-  * Any permanently-disqualifying conditions have been previously checked.
-  * This also updates the speed setting, which may change with link for 100/1000.
-  *
-  * This function should probably be checking for PAUSE support at some point
-  * in the future. Currently Per-priority-pause is not determinable using
-  * ethtool, so we shouldn't be restrictive until that problem is resolved.
-  *
-  * Returns: 0 if link is OK for use by FCoE.
+  * fcoe_link_speed_update() - Update the supported and actual link speeds
+  * @lport: The local port to update speeds for
   *
+  * Returns: 0 if the ethtool query was successful
+  *          -1 if the ethtool query failed
   */
- int fcoe_link_ok(struct fc_lport *lport)
+ int fcoe_link_speed_update(struct fc_lport *lport)
  {
        struct fcoe_port *port = lport_priv(lport);
        struct net_device *netdev = port->fcoe->netdev;
        struct ethtool_cmd ecmd = { ETHTOOL_GSET };
  
-       if ((netdev->flags & IFF_UP) && netif_carrier_ok(netdev) &&
-           (!dev_ethtool_get_settings(netdev, &ecmd))) {
+       if (!dev_ethtool_get_settings(netdev, &ecmd)) {
                lport->link_supported_speeds &=
                        ~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
                if (ecmd.supported & (SUPPORTED_1000baseT_Half |
        return -1;
  }
  
+ /**
+  * fcoe_link_ok() - Check if the link is OK for a local port
+  * @lport: The local port to check link on
+  *
+  * Returns: 0 if link is UP and OK, -1 if not
+  *
+  */
+ int fcoe_link_ok(struct fc_lport *lport)
+ {
+       struct fcoe_port *port = lport_priv(lport);
+       struct net_device *netdev = port->fcoe->netdev;
+       if (netif_oper_up(netdev))
+               return 0;
+       return -1;
+ }
  /**
   * fcoe_percpu_clean() - Clear all pending skbs for an local port
   * @lport: The local port whose skbs are to be cleared
@@@ -2631,3 -2671,25 +2671,25 @@@ static void fcoe_get_lesb(struct fc_lpo
        lesb->lesb_miss_fka = htonl(mdac);
        lesb->lesb_fcs_error = htonl(dev_get_stats(netdev)->rx_crc_errors);
  }
+ /**
+  * fcoe_set_port_id() - Callback from libfc when Port_ID is set.
+  * @lport: the local port
+  * @port_id: the port ID
+  * @fp: the received frame, if any, that caused the port_id to be set.
+  *
+  * This routine handles the case where we received a FLOGI and are
+  * entering point-to-point mode.  We need to call fcoe_ctlr_recv_flogi()
+  * so it can set the non-mapped mode and gateway address.
+  *
+  * The FLOGI LS_ACC is handled by fcoe_flogi_resp().
+  */
+ static void fcoe_set_port_id(struct fc_lport *lport,
+                            u32 port_id, struct fc_frame *fp)
+ {
+       struct fcoe_port *port = lport_priv(lport);
+       struct fcoe_interface *fcoe = port->fcoe;
+       if (fp && fc_frame_payload_op(fp) == ELS_FLOGI)
+               fcoe_ctlr_recv_flogi(&fcoe->ctlr, lport, fp);
+ }
diff --combined drivers/scsi/iscsi_tcp.c
@@@ -206,8 -206,10 +206,10 @@@ static void iscsi_sw_tcp_conn_set_callb
  }
  
  static void
- iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_sw_tcp_conn *tcp_sw_conn)
+ iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)
  {
+       struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
+       struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
        struct sock *sk = tcp_sw_conn->sock->sk;
  
        /* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
@@@ -555,7 -557,7 +557,7 @@@ static void iscsi_sw_tcp_release_conn(s
                return;
  
        sock_hold(sock->sk);
-       iscsi_sw_tcp_conn_restore_callbacks(tcp_sw_conn);
+       iscsi_sw_tcp_conn_restore_callbacks(conn);
        sock_put(sock->sk);
  
        spin_lock_bh(&session->lock);
@@@ -599,9 -601,9 +601,9 @@@ static void iscsi_sw_tcp_conn_stop(stru
        set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
        write_unlock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock);
  
 -      if (sock->sk->sk_sleep) {
 +      if (sk_sleep(sock->sk) && waitqueue_active(sk_sleep(sock->sk))) {
                sock->sk->sk_err = EIO;
 -              wake_up_interruptible(sock->sk->sk_sleep);
 +              wake_up_interruptible(sk_sleep(sock->sk));
        }
  
        iscsi_conn_stop(cls_conn, flag);
@@@ -818,7 -818,7 +818,7 @@@ void sas_slave_destroy(struct scsi_devi
        struct domain_device *dev = sdev_to_domain_dev(scsi_dev);
  
        if (dev_is_sata(dev))
 -              ata_port_disable(dev->sata_dev.ap);
 +              dev->sata_dev.ap->link.device[0].class = ATA_DEV_NONE;
  }
  
  int sas_change_queue_depth(struct scsi_device *scsi_dev, int new_depth,
@@@ -1030,8 -1030,6 +1030,6 @@@ int __sas_task_abort(struct sas_task *t
  void sas_task_abort(struct sas_task *task)
  {
        struct scsi_cmnd *sc = task->uldd_task;
-       struct request_queue *q = sc->device->request_queue;
-       unsigned long flags;
  
        /* Escape for libsas internal commands */
        if (!sc) {
  
        if (dev_is_sata(task->dev)) {
                sas_ata_task_abort(task);
-               return;
-       }
+       } else {
+               struct request_queue *q = sc->device->request_queue;
+               unsigned long flags;
  
-       spin_lock_irqsave(q->queue_lock, flags);
-       blk_abort_request(sc->request);
-       spin_unlock_irqrestore(q->queue_lock, flags);
-       scsi_schedule_eh(sc->device->host);
+               spin_lock_irqsave(q->queue_lock, flags);
+               blk_abort_request(sc->request);
+               spin_unlock_irqrestore(q->queue_lock, flags);
+               scsi_schedule_eh(sc->device->host);
+       }
  }
  
  int sas_slave_alloc(struct scsi_device *scsi_dev)
@@@ -25,6 -25,9 +25,9 @@@ const char *ftrace_print_flags_seq(stru
  const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val,
                                     const struct trace_print_flags *symbol_array);
  
+ const char *ftrace_print_hex_seq(struct trace_seq *p,
+                                const unsigned char *buf, int len);
  /*
   * The trace entry - the most basic unit of tracing. This is what
   * is printed in the end as a single line in the trace output, such as:
@@@ -58,7 -61,6 +61,7 @@@ struct trace_iterator 
        /* The below is zeroed out in pipe_read */
        struct trace_seq        seq;
        struct trace_entry      *ent;
 +      unsigned long           lost_events;
        int                     leftover;
        int                     cpu;
        u64                     ts;
diff --combined include/trace/ftrace.h
   *
   *    field = (typeof(field))entry;
   *
 - *    p = get_cpu_var(ftrace_event_seq);
 + *    p = &get_cpu_var(ftrace_event_seq);
   *    trace_seq_init(p);
 - *    ret = trace_seq_printf(s, <TP_printk> "\n");
 + *    ret = trace_seq_printf(s, "%s: ", <call>);
 + *    if (ret)
 + *            ret = trace_seq_printf(s, <TP_printk> "\n");
   *    put_cpu();
   *    if (!ret)
   *            return TRACE_TYPE_PARTIAL_LINE;
                ftrace_print_symbols_seq(p, value, symbols);            \
        })
  
+ #undef __print_hex
+ #define __print_hex(buf, buf_len) ftrace_print_hex_seq(p, buf, buf_len)
  #undef DECLARE_EVENT_CLASS
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)        \
  static notrace enum print_line_t                                      \
@@@ -452,38 -453,38 +455,38 @@@ perf_trace_disable_##name(struct ftrace
   *
   * static void ftrace_raw_event_<call>(proto)
   * {
 + *    struct ftrace_data_offsets_<call> __maybe_unused __data_offsets;
   *    struct ring_buffer_event *event;
   *    struct ftrace_raw_<call> *entry; <-- defined in stage 1
   *    struct ring_buffer *buffer;
   *    unsigned long irq_flags;
 + *    int __data_size;
   *    int pc;
   *
   *    local_save_flags(irq_flags);
   *    pc = preempt_count();
   *
 + *    __data_size = ftrace_get_offsets_<call>(&__data_offsets, args);
 + *
   *    event = trace_current_buffer_lock_reserve(&buffer,
   *                              event_<call>.id,
 - *                              sizeof(struct ftrace_raw_<call>),
 + *                              sizeof(*entry) + __data_size,
   *                              irq_flags, pc);
   *    if (!event)
   *            return;
   *    entry   = ring_buffer_event_data(event);
   *
 - *    <assign>;  <-- Here we assign the entries by the __field and
 - *                    __array macros.
 + *    { <assign>; }  <-- Here we assign the entries by the __field and
 + *                       __array macros.
   *
 - *    trace_current_buffer_unlock_commit(buffer, event, irq_flags, pc);
 + *    if (!filter_current_check_discard(buffer, event_call, entry, event))
 + *            trace_current_buffer_unlock_commit(buffer,
 + *                                               event, irq_flags, pc);
   * }
   *
   * static int ftrace_raw_reg_event_<call>(struct ftrace_event_call *unused)
   * {
 - *    int ret;
 - *
 - *    ret = register_trace_<call>(ftrace_raw_event_<call>);
 - *    if (!ret)
 - *            pr_info("event trace: Could not activate trace point "
 - *                    "probe to <call>");
 - *    return ret;
 + *    return register_trace_<call>(ftrace_raw_event_<call>);
   * }
   *
   * static void ftrace_unreg_event_<call>(struct ftrace_event_call *unused)
   *    .trace                  = ftrace_raw_output_<call>, <-- stage 2
   * };
   *
 + * static const char print_fmt_<call>[] = <TP_printk>;
 + *
   * static struct ftrace_event_call __used
   * __attribute__((__aligned__(4)))
   * __attribute__((section("_ftrace_events"))) event_<call> = {
   *    .raw_init               = trace_event_raw_init,
   *    .regfunc                = ftrace_reg_event_<call>,
   *    .unregfunc              = ftrace_unreg_event_<call>,
 + *    .print_fmt              = print_fmt_<call>,
 + *    .define_fields          = ftrace_define_fields_<call>,
   * }
   *
   */
@@@ -575,6 -572,7 +578,6 @@@ ftrace_raw_event_id_##call(struct ftrac
                return;                                                 \
        entry   = ring_buffer_event_data(event);                        \
                                                                        \
 -                                                                      \
        tstruct                                                         \
                                                                        \
        { assign; }                                                     \
@@@ -763,12 -761,13 +766,12 @@@ __attribute__((section("_ftrace_events"
  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)        \
  static notrace void                                                   \
  perf_trace_templ_##call(struct ftrace_event_call *event_call,         \
 -                          proto)                                      \
 +                      struct pt_regs *__regs, proto)                  \
  {                                                                     \
        struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\
        struct ftrace_raw_##call *entry;                                \
        u64 __addr = 0, __count = 1;                                    \
        unsigned long irq_flags;                                        \
 -      struct pt_regs *__regs;                                         \
        int __entry_size;                                               \
        int __data_size;                                                \
        int rctx;                                                       \
                                                                        \
        { assign; }                                                     \
                                                                        \
 -      __regs = &__get_cpu_var(perf_trace_regs);                       \
 -      perf_fetch_caller_regs(__regs, 2);                              \
 -                                                                      \
        perf_trace_buf_submit(entry, __entry_size, rctx, __addr,        \
                               __count, irq_flags, __regs);             \
  }
  
  #undef DEFINE_EVENT
 -#define DEFINE_EVENT(template, call, proto, args)             \
 -static notrace void perf_trace_##call(proto)                  \
 -{                                                             \
 -      struct ftrace_event_call *event_call = &event_##call;   \
 -                                                              \
 -      perf_trace_templ_##template(event_call, args);          \
 +#define DEFINE_EVENT(template, call, proto, args)                     \
 +static notrace void perf_trace_##call(proto)                          \
 +{                                                                     \
 +      struct ftrace_event_call *event_call = &event_##call;           \
 +      struct pt_regs *__regs = &get_cpu_var(perf_trace_regs);         \
 +                                                                      \
 +      perf_fetch_caller_regs(__regs, 1);                              \
 +                                                                      \
 +      perf_trace_templ_##template(event_call, __regs, args);          \
 +                                                                      \
 +      put_cpu_var(perf_trace_regs);                                   \
  }
  
  #undef DEFINE_EVENT_PRINT
@@@ -209,6 -209,7 +209,7 @@@ int trace_seq_putc(struct trace_seq *s
  
        return 1;
  }
+ EXPORT_SYMBOL(trace_seq_putc);
  
  int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len)
  {
@@@ -253,7 -254,7 +254,7 @@@ void *trace_seq_reserve(struct trace_se
        void *ret;
  
        if (s->full)
 -              return 0;
 +              return NULL;
  
        if (len > ((PAGE_SIZE - 1) - s->len)) {
                s->full = 1;
@@@ -355,6 -356,21 +356,21 @@@ ftrace_print_symbols_seq(struct trace_s
  }
  EXPORT_SYMBOL(ftrace_print_symbols_seq);
  
+ const char *
+ ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len)
+ {
+       int i;
+       const char *ret = p->buffer + p->len;
+       for (i = 0; i < buf_len; i++)
+               trace_seq_printf(p, "%s%2.2x", i == 0 ? "" : " ", buf[i]);
+       trace_seq_putc(p, 0);
+       return ret;
+ }
+ EXPORT_SYMBOL(ftrace_print_hex_seq);
  #ifdef CONFIG_KRETPROBES
  static inline const char *kretprobed(const char *name)
  {