Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  net: Remove CONFIG_KMOD from net/ (towards removing CONFIG_KMOD entirely)
  ipv4: Add a missing rcu_assign_pointer() in routing cache.
  [netdrvr] ibmtr: PCMCIA IBMTR is ok on 64bit
  xen-netfront: Avoid unaligned accesses to IP header
  lmc: copy_*_user under spinlock
  [netdrvr] myri10ge, ixgbe: remove broken select INTEL_IOATDMA
This commit is contained in:
Linus Torvalds 2008-10-17 08:58:52 -07:00
commit b225ee5bed
28 changed files with 96 additions and 89 deletions

View File

@ -2410,7 +2410,6 @@ config IXGBE
tristate "Intel(R) 10GbE PCI Express adapters support" tristate "Intel(R) 10GbE PCI Express adapters support"
depends on PCI && INET depends on PCI && INET
select INET_LRO select INET_LRO
select INTEL_IOATDMA
---help--- ---help---
This driver supports Intel(R) 10GbE PCI Express family of This driver supports Intel(R) 10GbE PCI Express family of
adapters. For more information on how to identify your adapter, go adapters. For more information on how to identify your adapter, go
@ -2426,6 +2425,11 @@ config IXGBE
To compile this driver as a module, choose M here. The module To compile this driver as a module, choose M here. The module
will be called ixgbe. will be called ixgbe.
config IXGBE_DCA
bool
default y
depends on IXGBE && DCA && !(IXGBE=y && DCA=m)
config IXGB config IXGB
tristate "Intel(R) PRO/10GbE support" tristate "Intel(R) PRO/10GbE support"
depends on PCI depends on PCI
@ -2462,7 +2466,6 @@ config MYRI10GE
select FW_LOADER select FW_LOADER
select CRC32 select CRC32
select INET_LRO select INET_LRO
select INTEL_IOATDMA
---help--- ---help---
This driver supports Myricom Myri-10G Dual Protocol interface in This driver supports Myricom Myri-10G Dual Protocol interface in
Ethernet mode. If the eeprom on your board is not recent enough, Ethernet mode. If the eeprom on your board is not recent enough,
@ -2474,6 +2477,11 @@ config MYRI10GE
To compile this driver as a module, choose M here. The module To compile this driver as a module, choose M here. The module
will be called myri10ge. will be called myri10ge.
config MYRI10GE_DCA
bool
default y
depends on MYRI10GE && DCA && !(MYRI10GE=y && DCA=m)
config NETXEN_NIC config NETXEN_NIC
tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC" tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC"
depends on PCI depends on PCI

View File

@ -36,7 +36,7 @@
#include "ixgbe_type.h" #include "ixgbe_type.h"
#include "ixgbe_common.h" #include "ixgbe_common.h"
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
#include <linux/dca.h> #include <linux/dca.h>
#endif #endif
@ -136,7 +136,7 @@ struct ixgbe_ring {
* offset associated with this ring, which is different * offset associated with this ring, which is different
* for DCE and RSS modes */ * for DCE and RSS modes */
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
/* cpu for tx queue */ /* cpu for tx queue */
int cpu; int cpu;
#endif #endif

View File

@ -80,7 +80,7 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
}; };
MODULE_DEVICE_TABLE(pci, ixgbe_pci_tbl); MODULE_DEVICE_TABLE(pci, ixgbe_pci_tbl);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
static int ixgbe_notify_dca(struct notifier_block *, unsigned long event, static int ixgbe_notify_dca(struct notifier_block *, unsigned long event,
void *p); void *p);
static struct notifier_block dca_notifier = { static struct notifier_block dca_notifier = {
@ -296,7 +296,7 @@ done_cleaning:
return (total_packets ? true : false); return (total_packets ? true : false);
} }
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
static void ixgbe_update_rx_dca(struct ixgbe_adapter *adapter, static void ixgbe_update_rx_dca(struct ixgbe_adapter *adapter,
struct ixgbe_ring *rx_ring) struct ixgbe_ring *rx_ring)
{ {
@ -383,7 +383,7 @@ static int __ixgbe_notify_dca(struct device *dev, void *data)
return 0; return 0;
} }
#endif /* CONFIG_DCA or CONFIG_DCA_MODULE */ #endif /* CONFIG_IXGBE_DCA */
/** /**
* ixgbe_receive_skb - Send a completed packet up the stack * ixgbe_receive_skb - Send a completed packet up the stack
* @adapter: board private structure * @adapter: board private structure
@ -947,7 +947,7 @@ static irqreturn_t ixgbe_msix_clean_tx(int irq, void *data)
r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues);
for (i = 0; i < q_vector->txr_count; i++) { for (i = 0; i < q_vector->txr_count; i++) {
tx_ring = &(adapter->tx_ring[r_idx]); tx_ring = &(adapter->tx_ring[r_idx]);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) if (adapter->flags & IXGBE_FLAG_DCA_ENABLED)
ixgbe_update_tx_dca(adapter, tx_ring); ixgbe_update_tx_dca(adapter, tx_ring);
#endif #endif
@ -1022,7 +1022,7 @@ static int ixgbe_clean_rxonly(struct napi_struct *napi, int budget)
r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
rx_ring = &(adapter->rx_ring[r_idx]); rx_ring = &(adapter->rx_ring[r_idx]);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) if (adapter->flags & IXGBE_FLAG_DCA_ENABLED)
ixgbe_update_rx_dca(adapter, rx_ring); ixgbe_update_rx_dca(adapter, rx_ring);
#endif #endif
@ -1066,7 +1066,7 @@ static int ixgbe_clean_rxonly_many(struct napi_struct *napi, int budget)
r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
for (i = 0; i < q_vector->rxr_count; i++) { for (i = 0; i < q_vector->rxr_count; i++) {
rx_ring = &(adapter->rx_ring[r_idx]); rx_ring = &(adapter->rx_ring[r_idx]);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) if (adapter->flags & IXGBE_FLAG_DCA_ENABLED)
ixgbe_update_rx_dca(adapter, rx_ring); ixgbe_update_rx_dca(adapter, rx_ring);
#endif #endif
@ -2155,7 +2155,7 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
netif_carrier_off(netdev); netif_carrier_off(netdev);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) { if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) {
adapter->flags &= ~IXGBE_FLAG_DCA_ENABLED; adapter->flags &= ~IXGBE_FLAG_DCA_ENABLED;
dca_remove_requester(&adapter->pdev->dev); dca_remove_requester(&adapter->pdev->dev);
@ -2167,7 +2167,7 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
ixgbe_clean_all_tx_rings(adapter); ixgbe_clean_all_tx_rings(adapter);
ixgbe_clean_all_rx_rings(adapter); ixgbe_clean_all_rx_rings(adapter);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
/* since we reset the hardware DCA settings were cleared */ /* since we reset the hardware DCA settings were cleared */
if (dca_add_requester(&adapter->pdev->dev) == 0) { if (dca_add_requester(&adapter->pdev->dev) == 0) {
adapter->flags |= IXGBE_FLAG_DCA_ENABLED; adapter->flags |= IXGBE_FLAG_DCA_ENABLED;
@ -2193,7 +2193,7 @@ static int ixgbe_poll(struct napi_struct *napi, int budget)
struct ixgbe_adapter *adapter = q_vector->adapter; struct ixgbe_adapter *adapter = q_vector->adapter;
int tx_cleaned, work_done = 0; int tx_cleaned, work_done = 0;
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) { if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) {
ixgbe_update_tx_dca(adapter, adapter->tx_ring); ixgbe_update_tx_dca(adapter, adapter->tx_ring);
ixgbe_update_rx_dca(adapter, adapter->rx_ring); ixgbe_update_rx_dca(adapter, adapter->rx_ring);
@ -3922,7 +3922,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
if (err) if (err)
goto err_register; goto err_register;
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (dca_add_requester(&pdev->dev) == 0) { if (dca_add_requester(&pdev->dev) == 0) {
adapter->flags |= IXGBE_FLAG_DCA_ENABLED; adapter->flags |= IXGBE_FLAG_DCA_ENABLED;
/* always use CB2 mode, difference is masked /* always use CB2 mode, difference is masked
@ -3972,7 +3972,7 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)
flush_scheduled_work(); flush_scheduled_work();
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) { if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) {
adapter->flags &= ~IXGBE_FLAG_DCA_ENABLED; adapter->flags &= ~IXGBE_FLAG_DCA_ENABLED;
dca_remove_requester(&pdev->dev); dca_remove_requester(&pdev->dev);
@ -4105,10 +4105,10 @@ static int __init ixgbe_init_module(void)
printk(KERN_INFO "%s: %s\n", ixgbe_driver_name, ixgbe_copyright); printk(KERN_INFO "%s: %s\n", ixgbe_driver_name, ixgbe_copyright);
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
dca_register_notify(&dca_notifier); dca_register_notify(&dca_notifier);
#endif #endif
ret = pci_register_driver(&ixgbe_driver); ret = pci_register_driver(&ixgbe_driver);
return ret; return ret;
} }
@ -4123,13 +4123,13 @@ module_init(ixgbe_init_module);
**/ **/
static void __exit ixgbe_exit_module(void) static void __exit ixgbe_exit_module(void)
{ {
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
dca_unregister_notify(&dca_notifier); dca_unregister_notify(&dca_notifier);
#endif #endif
pci_unregister_driver(&ixgbe_driver); pci_unregister_driver(&ixgbe_driver);
} }
#if defined(CONFIG_DCA) || defined(CONFIG_DCA_MODULE) #ifdef CONFIG_IXGBE_DCA
static int ixgbe_notify_dca(struct notifier_block *nb, unsigned long event, static int ixgbe_notify_dca(struct notifier_block *nb, unsigned long event,
void *p) void *p)
{ {
@ -4140,7 +4140,7 @@ static int ixgbe_notify_dca(struct notifier_block *nb, unsigned long event,
return ret_val ? NOTIFY_BAD : NOTIFY_DONE; return ret_val ? NOTIFY_BAD : NOTIFY_DONE;
} }
#endif /* CONFIG_DCA or CONFIG_DCA_MODULE */ #endif /* CONFIG_IXGBE_DCA */
module_exit(ixgbe_exit_module); module_exit(ixgbe_exit_module);

View File

@ -188,7 +188,7 @@ struct myri10ge_slice_state {
dma_addr_t fw_stats_bus; dma_addr_t fw_stats_bus;
int watchdog_tx_done; int watchdog_tx_done;
int watchdog_tx_req; int watchdog_tx_req;
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
int cached_dca_tag; int cached_dca_tag;
int cpu; int cpu;
__be32 __iomem *dca_tag; __be32 __iomem *dca_tag;
@ -220,7 +220,7 @@ struct myri10ge_priv {
int msi_enabled; int msi_enabled;
int msix_enabled; int msix_enabled;
struct msix_entry *msix_vectors; struct msix_entry *msix_vectors;
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
int dca_enabled; int dca_enabled;
#endif #endif
u32 link_state; u32 link_state;
@ -902,7 +902,7 @@ static int myri10ge_reset(struct myri10ge_priv *mgp)
struct myri10ge_slice_state *ss; struct myri10ge_slice_state *ss;
int i, status; int i, status;
size_t bytes; size_t bytes;
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
unsigned long dca_tag_off; unsigned long dca_tag_off;
#endif #endif
@ -1012,7 +1012,7 @@ static int myri10ge_reset(struct myri10ge_priv *mgp)
} }
put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr);
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_DCA_OFFSET, &cmd, 0); status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_DCA_OFFSET, &cmd, 0);
dca_tag_off = cmd.data0; dca_tag_off = cmd.data0;
for (i = 0; i < mgp->num_slices; i++) { for (i = 0; i < mgp->num_slices; i++) {
@ -1051,7 +1051,7 @@ static int myri10ge_reset(struct myri10ge_priv *mgp)
return status; return status;
} }
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
static void static void
myri10ge_write_dca(struct myri10ge_slice_state *ss, int cpu, int tag) myri10ge_write_dca(struct myri10ge_slice_state *ss, int cpu, int tag)
{ {
@ -1505,7 +1505,7 @@ static int myri10ge_poll(struct napi_struct *napi, int budget)
struct net_device *netdev = ss->mgp->dev; struct net_device *netdev = ss->mgp->dev;
int work_done; int work_done;
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
if (ss->mgp->dca_enabled) if (ss->mgp->dca_enabled)
myri10ge_update_dca(ss); myri10ge_update_dca(ss);
#endif #endif
@ -1736,7 +1736,7 @@ static const char myri10ge_gstrings_main_stats[][ETH_GSTRING_LEN] = {
"tx_boundary", "WC", "irq", "MSI", "MSIX", "tx_boundary", "WC", "irq", "MSI", "MSIX",
"read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs",
"serial_number", "watchdog_resets", "serial_number", "watchdog_resets",
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
"dca_capable_firmware", "dca_device_present", "dca_capable_firmware", "dca_device_present",
#endif #endif
"link_changes", "link_up", "dropped_link_overflow", "link_changes", "link_up", "dropped_link_overflow",
@ -1815,7 +1815,7 @@ myri10ge_get_ethtool_stats(struct net_device *netdev,
data[i++] = (unsigned int)mgp->read_write_dma; data[i++] = (unsigned int)mgp->read_write_dma;
data[i++] = (unsigned int)mgp->serial_number; data[i++] = (unsigned int)mgp->serial_number;
data[i++] = (unsigned int)mgp->watchdog_resets; data[i++] = (unsigned int)mgp->watchdog_resets;
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
data[i++] = (unsigned int)(mgp->ss[0].dca_tag != NULL); data[i++] = (unsigned int)(mgp->ss[0].dca_tag != NULL);
data[i++] = (unsigned int)(mgp->dca_enabled); data[i++] = (unsigned int)(mgp->dca_enabled);
#endif #endif
@ -3844,7 +3844,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
dev_err(&pdev->dev, "failed reset\n"); dev_err(&pdev->dev, "failed reset\n");
goto abort_with_slices; goto abort_with_slices;
} }
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
myri10ge_setup_dca(mgp); myri10ge_setup_dca(mgp);
#endif #endif
pci_set_drvdata(pdev, mgp); pci_set_drvdata(pdev, mgp);
@ -3948,7 +3948,7 @@ static void myri10ge_remove(struct pci_dev *pdev)
netdev = mgp->dev; netdev = mgp->dev;
unregister_netdev(netdev); unregister_netdev(netdev);
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
myri10ge_teardown_dca(mgp); myri10ge_teardown_dca(mgp);
#endif #endif
myri10ge_dummy_rdma(mgp, 0); myri10ge_dummy_rdma(mgp, 0);
@ -3993,7 +3993,7 @@ static struct pci_driver myri10ge_driver = {
#endif #endif
}; };
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
static int static int
myri10ge_notify_dca(struct notifier_block *nb, unsigned long event, void *p) myri10ge_notify_dca(struct notifier_block *nb, unsigned long event, void *p)
{ {
@ -4024,7 +4024,7 @@ static __init int myri10ge_init_module(void)
myri10ge_driver.name, myri10ge_rss_hash); myri10ge_driver.name, myri10ge_rss_hash);
myri10ge_rss_hash = MXGEFW_RSS_HASH_TYPE_SRC_PORT; myri10ge_rss_hash = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
} }
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
dca_register_notify(&myri10ge_dca_notifier); dca_register_notify(&myri10ge_dca_notifier);
#endif #endif
if (myri10ge_max_slices > MYRI10GE_MAX_SLICES) if (myri10ge_max_slices > MYRI10GE_MAX_SLICES)
@ -4037,7 +4037,7 @@ module_init(myri10ge_init_module);
static __exit void myri10ge_cleanup_module(void) static __exit void myri10ge_cleanup_module(void)
{ {
#if (defined CONFIG_DCA) || (defined CONFIG_DCA_MODULE) #ifdef CONFIG_MYRI10GE_DCA
dca_unregister_notify(&myri10ge_dca_notifier); dca_unregister_notify(&myri10ge_dca_notifier);
#endif #endif
pci_unregister_driver(&myri10ge_driver); pci_unregister_driver(&myri10ge_driver);

View File

@ -111,7 +111,7 @@ config ARCNET_COM20020_CS
config PCMCIA_IBMTR config PCMCIA_IBMTR
tristate "IBM PCMCIA tokenring adapter support" tristate "IBM PCMCIA tokenring adapter support"
depends on IBMTR!=y && TR && !64BIT depends on IBMTR!=y && TR
help help
Say Y here if you intend to attach this type of Token Ring PCMCIA Say Y here if you intend to attach this type of Token Ring PCMCIA
card to your computer. You then also need to say Y to "Token Ring card to your computer. You then also need to say Y to "Token Ring

View File

@ -122,7 +122,6 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
* Most functions mess with the structure * Most functions mess with the structure
* Disable interrupts while we do the polling * Disable interrupts while we do the polling
*/ */
spin_lock_irqsave(&sc->lmc_lock, flags);
switch (cmd) { switch (cmd) {
/* /*
@ -152,6 +151,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
break; break;
} }
spin_lock_irqsave(&sc->lmc_lock, flags);
sc->lmc_media->set_status (sc, &ctl); sc->lmc_media->set_status (sc, &ctl);
if(ctl.crc_length != sc->ictl.crc_length) { if(ctl.crc_length != sc->ictl.crc_length) {
@ -161,6 +161,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
else else
sc->TxDescriptControlInit &= ~LMC_TDES_ADD_CRC_DISABLE; sc->TxDescriptControlInit &= ~LMC_TDES_ADD_CRC_DISABLE;
} }
spin_unlock_irqrestore(&sc->lmc_lock, flags);
ret = 0; ret = 0;
break; break;
@ -187,15 +188,18 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
break; /* no change */ break; /* no change */
} }
spin_lock_irqsave(&sc->lmc_lock, flags);
lmc_proto_close(sc); lmc_proto_close(sc);
sc->if_type = new_type; sc->if_type = new_type;
lmc_proto_attach(sc); lmc_proto_attach(sc);
ret = lmc_proto_open(sc); ret = lmc_proto_open(sc);
spin_unlock_irqrestore(&sc->lmc_lock, flags);
break; break;
} }
case LMCIOCGETXINFO: /*fold01*/ case LMCIOCGETXINFO: /*fold01*/
spin_lock_irqsave(&sc->lmc_lock, flags);
sc->lmc_xinfo.Magic0 = 0xBEEFCAFE; sc->lmc_xinfo.Magic0 = 0xBEEFCAFE;
sc->lmc_xinfo.PciCardType = sc->lmc_cardtype; sc->lmc_xinfo.PciCardType = sc->lmc_cardtype;
@ -208,6 +212,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
sc->lmc_xinfo.MaxFrameSize = LMC_PKT_BUF_SZ; sc->lmc_xinfo.MaxFrameSize = LMC_PKT_BUF_SZ;
sc->lmc_xinfo.link_status = sc->lmc_media->get_link_status (sc); sc->lmc_xinfo.link_status = sc->lmc_media->get_link_status (sc);
sc->lmc_xinfo.mii_reg16 = lmc_mii_readreg (sc, 0, 16); sc->lmc_xinfo.mii_reg16 = lmc_mii_readreg (sc, 0, 16);
spin_unlock_irqrestore(&sc->lmc_lock, flags);
sc->lmc_xinfo.Magic1 = 0xDEADBEEF; sc->lmc_xinfo.Magic1 = 0xDEADBEEF;
@ -220,6 +225,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
break; break;
case LMCIOCGETLMCSTATS: case LMCIOCGETLMCSTATS:
spin_lock_irqsave(&sc->lmc_lock, flags);
if (sc->lmc_cardtype == LMC_CARDTYPE_T1) { if (sc->lmc_cardtype == LMC_CARDTYPE_T1) {
lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_LSB); lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_LSB);
sc->extra_stats.framingBitErrorCount += sc->extra_stats.framingBitErrorCount +=
@ -243,6 +249,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
sc->extra_stats.severelyErroredFrameCount += sc->extra_stats.severelyErroredFrameCount +=
regVal & T1FRAMER_SEF_MASK; regVal & T1FRAMER_SEF_MASK;
} }
spin_unlock_irqrestore(&sc->lmc_lock, flags);
if (copy_to_user(ifr->ifr_data, &sc->lmc_device->stats, if (copy_to_user(ifr->ifr_data, &sc->lmc_device->stats,
sizeof(sc->lmc_device->stats)) || sizeof(sc->lmc_device->stats)) ||
copy_to_user(ifr->ifr_data + sizeof(sc->lmc_device->stats), copy_to_user(ifr->ifr_data + sizeof(sc->lmc_device->stats),
@ -258,12 +265,14 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
break; break;
} }
spin_lock_irqsave(&sc->lmc_lock, flags);
memset(&sc->lmc_device->stats, 0, sizeof(sc->lmc_device->stats)); memset(&sc->lmc_device->stats, 0, sizeof(sc->lmc_device->stats));
memset(&sc->extra_stats, 0, sizeof(sc->extra_stats)); memset(&sc->extra_stats, 0, sizeof(sc->extra_stats));
sc->extra_stats.check = STATCHECK; sc->extra_stats.check = STATCHECK;
sc->extra_stats.version_size = (DRIVER_VERSION << 16) + sc->extra_stats.version_size = (DRIVER_VERSION << 16) +
sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats); sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);
sc->extra_stats.lmc_cardtype = sc->lmc_cardtype; sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;
spin_unlock_irqrestore(&sc->lmc_lock, flags);
ret = 0; ret = 0;
break; break;
@ -282,8 +291,10 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
ret = -EFAULT; ret = -EFAULT;
break; break;
} }
spin_lock_irqsave(&sc->lmc_lock, flags);
sc->lmc_media->set_circuit_type(sc, ctl.circuit_type); sc->lmc_media->set_circuit_type(sc, ctl.circuit_type);
sc->ictl.circuit_type = ctl.circuit_type; sc->ictl.circuit_type = ctl.circuit_type;
spin_unlock_irqrestore(&sc->lmc_lock, flags);
ret = 0; ret = 0;
break; break;
@ -294,12 +305,14 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
break; break;
} }
spin_lock_irqsave(&sc->lmc_lock, flags);
/* Reset driver and bring back to current state */ /* Reset driver and bring back to current state */
printk (" REG16 before reset +%04x\n", lmc_mii_readreg (sc, 0, 16)); printk (" REG16 before reset +%04x\n", lmc_mii_readreg (sc, 0, 16));
lmc_running_reset (dev); lmc_running_reset (dev);
printk (" REG16 after reset +%04x\n", lmc_mii_readreg (sc, 0, 16)); printk (" REG16 after reset +%04x\n", lmc_mii_readreg (sc, 0, 16));
LMC_EVENT_LOG(LMC_EVENT_FORCEDRESET, LMC_CSR_READ (sc, csr_status), lmc_mii_readreg (sc, 0, 16)); LMC_EVENT_LOG(LMC_EVENT_FORCEDRESET, LMC_CSR_READ (sc, csr_status), lmc_mii_readreg (sc, 0, 16));
spin_unlock_irqrestore(&sc->lmc_lock, flags);
ret = 0; ret = 0;
break; break;
@ -338,14 +351,15 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
*/ */
netif_stop_queue(dev); netif_stop_queue(dev);
if (copy_from_user(&xc, ifr->ifr_data, sizeof(struct lmc_xilinx_control))) { if (copy_from_user(&xc, ifr->ifr_data, sizeof(struct lmc_xilinx_control))) {
ret = -EFAULT; ret = -EFAULT;
break; break;
} }
switch(xc.command){ switch(xc.command){
case lmc_xilinx_reset: /*fold02*/ case lmc_xilinx_reset: /*fold02*/
{ {
u16 mii; u16 mii;
spin_lock_irqsave(&sc->lmc_lock, flags);
mii = lmc_mii_readreg (sc, 0, 16); mii = lmc_mii_readreg (sc, 0, 16);
/* /*
@ -404,6 +418,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
lmc_led_off(sc, LMC_DS3_LED2); lmc_led_off(sc, LMC_DS3_LED2);
} }
} }
spin_unlock_irqrestore(&sc->lmc_lock, flags);
@ -416,6 +431,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
{ {
u16 mii; u16 mii;
int timeout = 500000; int timeout = 500000;
spin_lock_irqsave(&sc->lmc_lock, flags);
mii = lmc_mii_readreg (sc, 0, 16); mii = lmc_mii_readreg (sc, 0, 16);
/* /*
@ -451,13 +467,14 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
*/ */
while( (LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 && while( (LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 &&
(timeout-- > 0)) (timeout-- > 0))
; cpu_relax();
/* /*
* stop driving Xilinx-related signals * stop driving Xilinx-related signals
*/ */
lmc_gpio_mkinput(sc, 0xff); lmc_gpio_mkinput(sc, 0xff);
spin_unlock_irqrestore(&sc->lmc_lock, flags);
ret = 0x0; ret = 0x0;
@ -493,6 +510,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
printk("%s: Starting load of data Len: %d at 0x%p == 0x%p\n", dev->name, xc.len, xc.data, data); printk("%s: Starting load of data Len: %d at 0x%p == 0x%p\n", dev->name, xc.len, xc.data, data);
spin_lock_irqsave(&sc->lmc_lock, flags);
lmc_gpio_mkinput(sc, 0xff); lmc_gpio_mkinput(sc, 0xff);
/* /*
@ -545,7 +563,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
*/ */
while( (LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 && while( (LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 &&
(timeout-- > 0)) (timeout-- > 0))
; cpu_relax();
printk(KERN_DEBUG "%s: Waited %d for the Xilinx to clear it's memory\n", dev->name, 500000-timeout); printk(KERN_DEBUG "%s: Waited %d for the Xilinx to clear it's memory\n", dev->name, 500000-timeout);
@ -588,6 +606,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET; sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET;
lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16); lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
spin_unlock_irqrestore(&sc->lmc_lock, flags);
kfree(data); kfree(data);
@ -611,8 +630,6 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
break; break;
} }
spin_unlock_irqrestore(&sc->lmc_lock, flags); /*fold01*/
lmc_trace(dev, "lmc_ioctl out"); lmc_trace(dev, "lmc_ioctl out");
return ret; return ret;

View File

@ -239,11 +239,14 @@ static void xennet_alloc_rx_buffers(struct net_device *dev)
*/ */
batch_target = np->rx_target - (req_prod - np->rx.rsp_cons); batch_target = np->rx_target - (req_prod - np->rx.rsp_cons);
for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) { for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) {
skb = __netdev_alloc_skb(dev, RX_COPY_THRESHOLD, skb = __netdev_alloc_skb(dev, RX_COPY_THRESHOLD + NET_IP_ALIGN,
GFP_ATOMIC | __GFP_NOWARN); GFP_ATOMIC | __GFP_NOWARN);
if (unlikely(!skb)) if (unlikely(!skb))
goto no_skb; goto no_skb;
/* Align ip header to a 16 bytes boundary */
skb_reserve(skb, NET_IP_ALIGN);
page = alloc_page(GFP_ATOMIC | __GFP_NOWARN); page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
if (!page) { if (!page) {
kfree_skb(skb); kfree_skb(skb);

View File

@ -37,10 +37,7 @@
#include <linux/poll.h> #include <linux/poll.h>
#include <net/sock.h> #include <net/sock.h>
#include <asm/ioctls.h> #include <asm/ioctls.h>
#if defined(CONFIG_KMOD)
#include <linux/kmod.h> #include <linux/kmod.h>
#endif
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
@ -145,11 +142,8 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto)
if (proto < 0 || proto >= BT_MAX_PROTO) if (proto < 0 || proto >= BT_MAX_PROTO)
return -EINVAL; return -EINVAL;
#if defined(CONFIG_KMOD) if (!bt_proto[proto])
if (!bt_proto[proto]) {
request_module("bt-proto-%d", proto); request_module("bt-proto-%d", proto);
}
#endif
err = -EPROTONOSUPPORT; err = -EPROTONOSUPPORT;

View File

@ -305,23 +305,14 @@ find_inlist_lock_noload(struct list_head *head, const char *name, int *error,
return NULL; return NULL;
} }
#ifndef CONFIG_KMOD
#define find_inlist_lock(h,n,p,e,m) find_inlist_lock_noload((h),(n),(e),(m))
#else
static void * static void *
find_inlist_lock(struct list_head *head, const char *name, const char *prefix, find_inlist_lock(struct list_head *head, const char *name, const char *prefix,
int *error, struct mutex *mutex) int *error, struct mutex *mutex)
{ {
void *ret; return try_then_request_module(
find_inlist_lock_noload(head, name, error, mutex),
ret = find_inlist_lock_noload(head, name, error, mutex); "%s%s", prefix, name);
if (!ret) {
request_module("%s%s", prefix, name);
ret = find_inlist_lock_noload(head, name, error, mutex);
}
return ret;
} }
#endif
static inline struct ebt_table * static inline struct ebt_table *
find_table_lock(const char *name, int *error, struct mutex *mutex) find_table_lock(const char *name, int *error, struct mutex *mutex)

View File

@ -128,8 +128,8 @@ static int can_create(struct net *net, struct socket *sock, int protocol)
if (net != &init_net) if (net != &init_net)
return -EAFNOSUPPORT; return -EAFNOSUPPORT;
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
/* try to load protocol module, when CONFIG_KMOD is defined */ /* try to load protocol module kernel is modular */
if (!proto_tab[protocol]) { if (!proto_tab[protocol]) {
err = request_module("can-proto-%d", protocol); err = request_module("can-proto-%d", protocol);

View File

@ -4956,8 +4956,6 @@ EXPORT_SYMBOL(br_fdb_get_hook);
EXPORT_SYMBOL(br_fdb_put_hook); EXPORT_SYMBOL(br_fdb_put_hook);
#endif #endif
#ifdef CONFIG_KMOD
EXPORT_SYMBOL(dev_load); EXPORT_SYMBOL(dev_load);
#endif
EXPORT_PER_CPU_SYMBOL(softnet_data); EXPORT_PER_CPU_SYMBOL(softnet_data);

View File

@ -1040,7 +1040,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
struct nlattr *linkinfo[IFLA_INFO_MAX+1]; struct nlattr *linkinfo[IFLA_INFO_MAX+1];
int err; int err;
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
replay: replay:
#endif #endif
err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy); err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy);
@ -1129,7 +1129,7 @@ replay:
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (!ops) { if (!ops) {
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
if (kind[0]) { if (kind[0]) {
__rtnl_unlock(); __rtnl_unlock();
request_module("rtnl-link-%s", kind); request_module("rtnl-link-%s", kind);

View File

@ -154,7 +154,7 @@ struct ccid *ccid_new(unsigned char id, struct sock *sk, int rx, gfp_t gfp)
struct ccid *ccid = NULL; struct ccid *ccid = NULL;
ccids_read_lock(); ccids_read_lock();
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
if (ccids[id] == NULL) { if (ccids[id] == NULL) {
/* We only try to load if in process context */ /* We only try to load if in process context */
ccids_read_unlock(); ccids_read_unlock();

View File

@ -490,9 +490,7 @@ int dn_dev_ioctl(unsigned int cmd, void __user *arg)
return -EFAULT; return -EFAULT;
ifr->ifr_name[IFNAMSIZ-1] = 0; ifr->ifr_name[IFNAMSIZ-1] = 0;
#ifdef CONFIG_KMOD
dev_load(&init_net, ifr->ifr_name); dev_load(&init_net, ifr->ifr_name);
#endif
switch(cmd) { switch(cmd) {
case SIOCGIFADDR: case SIOCGIFADDR:

View File

@ -613,9 +613,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
if (colon) if (colon)
*colon = 0; *colon = 0;
#ifdef CONFIG_KMOD
dev_load(net, ifr.ifr_name); dev_load(net, ifr.ifr_name);
#endif
switch (cmd) { switch (cmd) {
case SIOCGIFADDR: /* Get interface address */ case SIOCGIFADDR: /* Get interface address */

View File

@ -53,11 +53,9 @@ static DEFINE_MUTEX(inet_diag_table_mutex);
static const struct inet_diag_handler *inet_diag_lock_handler(int type) static const struct inet_diag_handler *inet_diag_lock_handler(int type)
{ {
#ifdef CONFIG_KMOD
if (!inet_diag_table[type]) if (!inet_diag_table[type])
request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK, request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK,
NETLINK_INET_DIAG, type); NETLINK_INET_DIAG, type);
#endif
mutex_lock(&inet_diag_table_mutex); mutex_lock(&inet_diag_table_mutex);
if (!inet_diag_table[type]) if (!inet_diag_table[type])

View File

@ -1109,7 +1109,12 @@ restart:
printk("\n"); printk("\n");
} }
#endif #endif
rt_hash_table[hash].chain = rt; /*
* Since lookup is lockfree, we must make sure
* previous writes to rt are comitted to memory
* before making rt visible to other CPUS.
*/
rcu_assign_pointer(rt_hash_table[hash].chain, rt);
spin_unlock_bh(rt_hash_lock_addr(hash)); spin_unlock_bh(rt_hash_lock_addr(hash));
*rp = rt; *rp = rt;
return 0; return 0;

View File

@ -115,7 +115,7 @@ int tcp_set_default_congestion_control(const char *name)
spin_lock(&tcp_cong_list_lock); spin_lock(&tcp_cong_list_lock);
ca = tcp_ca_find(name); ca = tcp_ca_find(name);
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
if (!ca && capable(CAP_SYS_MODULE)) { if (!ca && capable(CAP_SYS_MODULE)) {
spin_unlock(&tcp_cong_list_lock); spin_unlock(&tcp_cong_list_lock);
@ -244,7 +244,7 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)
if (ca == icsk->icsk_ca_ops) if (ca == icsk->icsk_ca_ops)
goto out; goto out;
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
/* not found attempt to autoload module */ /* not found attempt to autoload module */
if (!ca && capable(CAP_SYS_MODULE)) { if (!ca && capable(CAP_SYS_MODULE)) {
rcu_read_unlock(); rcu_read_unlock();

View File

@ -822,7 +822,7 @@ ctnetlink_parse_nat_setup(struct nf_conn *ct,
parse_nat_setup = rcu_dereference(nfnetlink_parse_nat_setup_hook); parse_nat_setup = rcu_dereference(nfnetlink_parse_nat_setup_hook);
if (!parse_nat_setup) { if (!parse_nat_setup) {
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
rcu_read_unlock(); rcu_read_unlock();
nfnl_unlock(); nfnl_unlock();
if (request_module("nf-nat-ipv4") < 0) { if (request_module("nf-nat-ipv4") < 0) {

View File

@ -137,7 +137,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
replay: replay:
ss = nfnetlink_get_subsys(type); ss = nfnetlink_get_subsys(type);
if (!ss) { if (!ss) {
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
nfnl_unlock(); nfnl_unlock();
request_module("nfnetlink-subsys-%d", NFNL_SUBSYS_ID(type)); request_module("nfnetlink-subsys-%d", NFNL_SUBSYS_ID(type));
nfnl_lock(); nfnl_lock();

View File

@ -435,7 +435,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol)
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
netlink_lock_table(); netlink_lock_table();
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
if (!nl_table[protocol].registered) { if (!nl_table[protocol].registered) {
netlink_unlock_table(); netlink_unlock_table();
request_module("net-pf-%d-proto-%d", PF_NETLINK, protocol); request_module("net-pf-%d-proto-%d", PF_NETLINK, protocol);

View File

@ -67,11 +67,10 @@ static int pn_socket_create(struct net *net, struct socket *sock, int protocol)
} }
pnp = phonet_proto_get(protocol); pnp = phonet_proto_get(protocol);
#ifdef CONFIG_KMOD
if (pnp == NULL && if (pnp == NULL &&
request_module("net-pf-%d-proto-%d", PF_PHONET, protocol) == 0) request_module("net-pf-%d-proto-%d", PF_PHONET, protocol) == 0)
pnp = phonet_proto_get(protocol); pnp = phonet_proto_get(protocol);
#endif
if (pnp == NULL) if (pnp == NULL)
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
if (sock->type != pnp->sock_type) { if (sock->type != pnp->sock_type) {

View File

@ -494,7 +494,7 @@ struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est,
a_o = tc_lookup_action_n(act_name); a_o = tc_lookup_action_n(act_name);
if (a_o == NULL) { if (a_o == NULL) {
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
rtnl_unlock(); rtnl_unlock();
request_module("act_%s", act_name); request_module("act_%s", act_name);
rtnl_lock(); rtnl_lock();

View File

@ -227,7 +227,7 @@ replay:
err = -ENOENT; err = -ENOENT;
tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]); tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]);
if (tp_ops == NULL) { if (tp_ops == NULL) {
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
struct nlattr *kind = tca[TCA_KIND]; struct nlattr *kind = tca[TCA_KIND];
char name[IFNAMSIZ]; char name[IFNAMSIZ];

View File

@ -224,7 +224,7 @@ static int tcf_em_validate(struct tcf_proto *tp,
if (em->ops == NULL) { if (em->ops == NULL) {
err = -ENOENT; err = -ENOENT;
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
__rtnl_unlock(); __rtnl_unlock();
request_module("ematch-kind-%u", em_hdr->kind); request_module("ematch-kind-%u", em_hdr->kind);
rtnl_lock(); rtnl_lock();

View File

@ -764,7 +764,7 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue,
struct qdisc_size_table *stab; struct qdisc_size_table *stab;
ops = qdisc_lookup_ops(kind); ops = qdisc_lookup_ops(kind);
#ifdef CONFIG_KMOD #ifdef CONFIG_MODULES
if (ops == NULL && kind != NULL) { if (ops == NULL && kind != NULL) {
char name[IFNAMSIZ]; char name[IFNAMSIZ];
if (nla_strlcpy(name, kind, IFNAMSIZ) < IFNAMSIZ) { if (nla_strlcpy(name, kind, IFNAMSIZ) < IFNAMSIZ) {

View File

@ -1142,7 +1142,7 @@ static int __sock_create(struct net *net, int family, int type, int protocol,
sock->type = type; sock->type = type;
#if defined(CONFIG_KMOD) #ifdef CONFIG_MODULES
/* Attempt to load a protocol module if the find failed. /* Attempt to load a protocol module if the find failed.
* *
* 12/09/1996 Marcin: But! this makes REALLY only sense, if the user * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user

View File

@ -83,10 +83,8 @@ rpcauth_create(rpc_authflavor_t pseudoflavor, struct rpc_clnt *clnt)
if (flavor >= RPC_AUTH_MAXFLAVOR) if (flavor >= RPC_AUTH_MAXFLAVOR)
goto out; goto out;
#ifdef CONFIG_KMOD
if ((ops = auth_flavors[flavor]) == NULL) if ((ops = auth_flavors[flavor]) == NULL)
request_module("rpc-auth-%u", flavor); request_module("rpc-auth-%u", flavor);
#endif
spin_lock(&rpc_authflavor_lock); spin_lock(&rpc_authflavor_lock);
ops = auth_flavors[flavor]; ops = auth_flavors[flavor];
if (ops == NULL || !try_module_get(ops->owner)) { if (ops == NULL || !try_module_get(ops->owner)) {