diff options
38 files changed, 466 insertions, 209 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 421bcfff6ad2..43ab119963d5 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -57,6 +57,15 @@ Who: Jody McIntyre <scjody@steamballoon.com> | |||
| 57 | 57 | ||
| 58 | --------------------------- | 58 | --------------------------- |
| 59 | 59 | ||
| 60 | What: sbp2: module parameter "force_inquiry_hack" | ||
| 61 | When: July 2006 | ||
| 62 | Why: Superceded by parameter "workarounds". Both parameters are meant to be | ||
| 63 | used ad-hoc and for single devices only, i.e. not in modprobe.conf, | ||
| 64 | therefore the impact of this feature replacement should be low. | ||
| 65 | Who: Stefan Richter <stefanr@s5r6.in-berlin.de> | ||
| 66 | |||
| 67 | --------------------------- | ||
| 68 | |||
| 60 | What: Video4Linux API 1 ioctls and video_decoder.h from Video devices. | 69 | What: Video4Linux API 1 ioctls and video_decoder.h from Video devices. |
| 61 | When: July 2006 | 70 | When: July 2006 |
| 62 | Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6 | 71 | Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6 |
diff --git a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt index c5beb548cfc4..21ed51173662 100644 --- a/Documentation/watchdog/watchdog-api.txt +++ b/Documentation/watchdog/watchdog-api.txt | |||
| @@ -36,6 +36,9 @@ timeout or margin. The simplest way to ping the watchdog is to write | |||
| 36 | some data to the device. So a very simple watchdog daemon would look | 36 | some data to the device. So a very simple watchdog daemon would look |
| 37 | like this: | 37 | like this: |
| 38 | 38 | ||
| 39 | #include <stdlib.h> | ||
| 40 | #include <fcntl.h> | ||
| 41 | |||
| 39 | int main(int argc, const char *argv[]) { | 42 | int main(int argc, const char *argv[]) { |
| 40 | int fd=open("/dev/watchdog",O_WRONLY); | 43 | int fd=open("/dev/watchdog",O_WRONLY); |
| 41 | if (fd==-1) { | 44 | if (fd==-1) { |
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig index f6a8853cd1b4..9ea35398e10d 100644 --- a/arch/ia64/configs/sn2_defconfig +++ b/arch/ia64/configs/sn2_defconfig | |||
| @@ -134,7 +134,7 @@ CONFIG_ARCH_FLATMEM_ENABLE=y | |||
| 134 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | 134 | CONFIG_ARCH_SPARSEMEM_ENABLE=y |
| 135 | CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y | 135 | CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y |
| 136 | CONFIG_NUMA=y | 136 | CONFIG_NUMA=y |
| 137 | CONFIG_NODES_SHIFT=8 | 137 | CONFIG_NODES_SHIFT=10 |
| 138 | CONFIG_VIRTUAL_MEM_MAP=y | 138 | CONFIG_VIRTUAL_MEM_MAP=y |
| 139 | CONFIG_HOLES_IN_ZONE=y | 139 | CONFIG_HOLES_IN_ZONE=y |
| 140 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | 140 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y |
| @@ -1159,7 +1159,7 @@ CONFIG_DETECT_SOFTLOCKUP=y | |||
| 1159 | # CONFIG_SCHEDSTATS is not set | 1159 | # CONFIG_SCHEDSTATS is not set |
| 1160 | # CONFIG_DEBUG_SLAB is not set | 1160 | # CONFIG_DEBUG_SLAB is not set |
| 1161 | CONFIG_DEBUG_PREEMPT=y | 1161 | CONFIG_DEBUG_PREEMPT=y |
| 1162 | CONFIG_DEBUG_MUTEXES=y | 1162 | # CONFIG_DEBUG_MUTEXES is not set |
| 1163 | # CONFIG_DEBUG_SPINLOCK is not set | 1163 | # CONFIG_DEBUG_SPINLOCK is not set |
| 1164 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1164 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
| 1165 | # CONFIG_DEBUG_KOBJECT is not set | 1165 | # CONFIG_DEBUG_KOBJECT is not set |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 7956eb9058fc..d58c1c5c903a 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -416,7 +416,7 @@ iosapic_end_level_irq (unsigned int irq) | |||
| 416 | ia64_vector vec = irq_to_vector(irq); | 416 | ia64_vector vec = irq_to_vector(irq); |
| 417 | struct iosapic_rte_info *rte; | 417 | struct iosapic_rte_info *rte; |
| 418 | 418 | ||
| 419 | move_irq(irq); | 419 | move_native_irq(irq); |
| 420 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) | 420 | list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) |
| 421 | iosapic_eoi(rte->addr, vec); | 421 | iosapic_eoi(rte->addr, vec); |
| 422 | } | 422 | } |
| @@ -458,7 +458,7 @@ iosapic_ack_edge_irq (unsigned int irq) | |||
| 458 | { | 458 | { |
| 459 | irq_desc_t *idesc = irq_descp(irq); | 459 | irq_desc_t *idesc = irq_descp(irq); |
| 460 | 460 | ||
| 461 | move_irq(irq); | 461 | move_native_irq(irq); |
| 462 | /* | 462 | /* |
| 463 | * Once we have recorded IRQ_PENDING already, we can mask the | 463 | * Once we have recorded IRQ_PENDING already, we can mask the |
| 464 | * interrupt for real. This prevents IRQ storms from unhandled | 464 | * interrupt for real. This prevents IRQ storms from unhandled |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 5ce908ef9c95..9c72ea3f6432 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
| @@ -101,7 +101,6 @@ void set_irq_affinity_info (unsigned int irq, int hwid, int redir) | |||
| 101 | 101 | ||
| 102 | if (irq < NR_IRQS) { | 102 | if (irq < NR_IRQS) { |
| 103 | irq_affinity[irq] = mask; | 103 | irq_affinity[irq] = mask; |
| 104 | set_irq_info(irq, mask); | ||
| 105 | irq_redir[irq] = (char) (redir & 0xff); | 104 | irq_redir[irq] = (char) (redir & 0xff); |
| 106 | } | 105 | } |
| 107 | } | 106 | } |
diff --git a/drivers/char/watchdog/i8xx_tco.c b/drivers/char/watchdog/i8xx_tco.c index a13395e2c372..fa2ba9ebe42a 100644 --- a/drivers/char/watchdog/i8xx_tco.c +++ b/drivers/char/watchdog/i8xx_tco.c | |||
| @@ -33,11 +33,6 @@ | |||
| 33 | * 82801E (C-ICH) : document number 273599-001, 273645-002, | 33 | * 82801E (C-ICH) : document number 273599-001, 273645-002, |
| 34 | * 82801EB (ICH5) : document number 252516-001, 252517-003, | 34 | * 82801EB (ICH5) : document number 252516-001, 252517-003, |
| 35 | * 82801ER (ICH5R) : document number 252516-001, 252517-003, | 35 | * 82801ER (ICH5R) : document number 252516-001, 252517-003, |
| 36 | * 82801FB (ICH6) : document number 301473-002, 301474-007, | ||
| 37 | * 82801FR (ICH6R) : document number 301473-002, 301474-007, | ||
| 38 | * 82801FBM (ICH6-M) : document number 301473-002, 301474-007, | ||
| 39 | * 82801FW (ICH6W) : document number 301473-001, 301474-007, | ||
| 40 | * 82801FRW (ICH6RW) : document number 301473-001, 301474-007 | ||
| 41 | * | 36 | * |
| 42 | * 20000710 Nils Faerber | 37 | * 20000710 Nils Faerber |
| 43 | * Initial Version 0.01 | 38 | * Initial Version 0.01 |
| @@ -66,6 +61,10 @@ | |||
| 66 | * 20050807 Wim Van Sebroeck <wim@iguana.be> | 61 | * 20050807 Wim Van Sebroeck <wim@iguana.be> |
| 67 | * 0.08 Make sure that the watchdog is only "armed" when started. | 62 | * 0.08 Make sure that the watchdog is only "armed" when started. |
| 68 | * (Kernel Bug 4251) | 63 | * (Kernel Bug 4251) |
| 64 | * 20060416 Wim Van Sebroeck <wim@iguana.be> | ||
| 65 | * 0.09 Remove support for the ICH6, ICH6R, ICH6-M, ICH6W and ICH6RW and | ||
| 66 | * ICH7 chipsets. (See Kernel Bug 6031 - other code will support these | ||
| 67 | * chipsets) | ||
| 69 | */ | 68 | */ |
| 70 | 69 | ||
| 71 | /* | 70 | /* |
| @@ -90,7 +89,7 @@ | |||
| 90 | #include "i8xx_tco.h" | 89 | #include "i8xx_tco.h" |
| 91 | 90 | ||
| 92 | /* Module and version information */ | 91 | /* Module and version information */ |
| 93 | #define TCO_VERSION "0.08" | 92 | #define TCO_VERSION "0.09" |
| 94 | #define TCO_MODULE_NAME "i8xx TCO timer" | 93 | #define TCO_MODULE_NAME "i8xx TCO timer" |
| 95 | #define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION | 94 | #define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION |
| 96 | #define PFX TCO_MODULE_NAME ": " | 95 | #define PFX TCO_MODULE_NAME ": " |
| @@ -391,11 +390,6 @@ static struct pci_device_id i8xx_tco_pci_tbl[] = { | |||
| 391 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, }, | 390 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, }, |
| 392 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, PCI_ANY_ID, PCI_ANY_ID, }, | 391 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, PCI_ANY_ID, PCI_ANY_ID, }, |
| 393 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, PCI_ANY_ID, PCI_ANY_ID, }, | 392 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, PCI_ANY_ID, PCI_ANY_ID, }, |
| 394 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, PCI_ANY_ID, PCI_ANY_ID, }, | ||
| 395 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, PCI_ANY_ID, PCI_ANY_ID, }, | ||
| 396 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2, PCI_ANY_ID, PCI_ANY_ID, }, | ||
| 397 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, PCI_ANY_ID, PCI_ANY_ID, }, | ||
| 398 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, PCI_ANY_ID, PCI_ANY_ID, }, | ||
| 399 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, PCI_ANY_ID, PCI_ANY_ID, }, | 393 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, PCI_ANY_ID, PCI_ANY_ID, }, |
| 400 | { 0, }, /* End of list */ | 394 | { 0, }, /* End of list */ |
| 401 | }; | 395 | }; |
diff --git a/drivers/char/watchdog/s3c2410_wdt.c b/drivers/char/watchdog/s3c2410_wdt.c index 9dc54736e4eb..1ea04e9b2b0b 100644 --- a/drivers/char/watchdog/s3c2410_wdt.c +++ b/drivers/char/watchdog/s3c2410_wdt.c | |||
| @@ -423,6 +423,12 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
| 423 | if (tmr_atboot && started == 0) { | 423 | if (tmr_atboot && started == 0) { |
| 424 | printk(KERN_INFO PFX "Starting Watchdog Timer\n"); | 424 | printk(KERN_INFO PFX "Starting Watchdog Timer\n"); |
| 425 | s3c2410wdt_start(); | 425 | s3c2410wdt_start(); |
| 426 | } else if (!tmr_atboot) { | ||
| 427 | /* if we're not enabling the watchdog, then ensure it is | ||
| 428 | * disabled if it has been left running from the bootloader | ||
| 429 | * or other source */ | ||
| 430 | |||
| 431 | s3c2410wdt_stop(); | ||
| 426 | } | 432 | } |
| 427 | 433 | ||
| 428 | return 0; | 434 | return 0; |
diff --git a/drivers/char/watchdog/sc1200wdt.c b/drivers/char/watchdog/sc1200wdt.c index 515ce7572049..20b88f9b7be2 100644 --- a/drivers/char/watchdog/sc1200wdt.c +++ b/drivers/char/watchdog/sc1200wdt.c | |||
| @@ -377,7 +377,7 @@ static int __init sc1200wdt_init(void) | |||
| 377 | { | 377 | { |
| 378 | int ret; | 378 | int ret; |
| 379 | 379 | ||
| 380 | printk(banner); | 380 | printk("%s\n", banner); |
| 381 | 381 | ||
| 382 | spin_lock_init(&sc1200wdt_lock); | 382 | spin_lock_init(&sc1200wdt_lock); |
| 383 | sema_init(&open_sem, 1); | 383 | sema_init(&open_sem, 1); |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 19222878aae9..11f13778f139 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
| @@ -553,7 +553,7 @@ static void ohci_initialize(struct ti_ohci *ohci) | |||
| 553 | * register content. | 553 | * register content. |
| 554 | * To actually enable physical responses is the job of our interrupt | 554 | * To actually enable physical responses is the job of our interrupt |
| 555 | * handler which programs the physical request filter. */ | 555 | * handler which programs the physical request filter. */ |
| 556 | reg_write(ohci, OHCI1394_PhyUpperBound, 0xffff0000); | 556 | reg_write(ohci, OHCI1394_PhyUpperBound, 0x01000000); |
| 557 | 557 | ||
| 558 | DBGMSG("physUpperBoundOffset=%08x", | 558 | DBGMSG("physUpperBoundOffset=%08x", |
| 559 | reg_read(ohci, OHCI1394_PhyUpperBound)); | 559 | reg_read(ohci, OHCI1394_PhyUpperBound)); |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index f4206604db03..8a23fb54c693 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/kernel.h> | 42 | #include <linux/kernel.h> |
| 43 | #include <linux/list.h> | 43 | #include <linux/list.h> |
| 44 | #include <linux/string.h> | 44 | #include <linux/string.h> |
| 45 | #include <linux/stringify.h> | ||
| 45 | #include <linux/slab.h> | 46 | #include <linux/slab.h> |
| 46 | #include <linux/interrupt.h> | 47 | #include <linux/interrupt.h> |
| 47 | #include <linux/fs.h> | 48 | #include <linux/fs.h> |
| @@ -117,7 +118,8 @@ MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers (default | |||
| 117 | */ | 118 | */ |
| 118 | static int max_sectors = SBP2_MAX_SECTORS; | 119 | static int max_sectors = SBP2_MAX_SECTORS; |
| 119 | module_param(max_sectors, int, 0444); | 120 | module_param(max_sectors, int, 0444); |
| 120 | MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = 255)"); | 121 | MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = " |
| 122 | __stringify(SBP2_MAX_SECTORS) ")"); | ||
| 121 | 123 | ||
| 122 | /* | 124 | /* |
| 123 | * Exclusive login to sbp2 device? In most cases, the sbp2 driver should | 125 | * Exclusive login to sbp2 device? In most cases, the sbp2 driver should |
| @@ -135,18 +137,45 @@ module_param(exclusive_login, int, 0644); | |||
| 135 | MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device (default = 1)"); | 137 | MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device (default = 1)"); |
| 136 | 138 | ||
| 137 | /* | 139 | /* |
| 138 | * SCSI inquiry hack for really badly behaved sbp2 devices. Turn this on | 140 | * If any of the following workarounds is required for your device to work, |
| 139 | * if your sbp2 device is not properly handling the SCSI inquiry command. | 141 | * please submit the kernel messages logged by sbp2 to the linux1394-devel |
| 140 | * This hack makes the inquiry look more like a typical MS Windows inquiry | 142 | * mailing list. |
| 141 | * by enforcing 36 byte inquiry and avoiding access to mode_sense page 8. | ||
| 142 | * | 143 | * |
| 143 | * If force_inquiry_hack=1 is required for your device to work, | 144 | * - 128kB max transfer |
| 144 | * please submit the logged sbp2_firmware_revision value of this device to | 145 | * Limit transfer size. Necessary for some old bridges. |
| 145 | * the linux1394-devel mailing list. | 146 | * |
| 147 | * - 36 byte inquiry | ||
| 148 | * When scsi_mod probes the device, let the inquiry command look like that | ||
| 149 | * from MS Windows. | ||
| 150 | * | ||
| 151 | * - skip mode page 8 | ||
| 152 | * Suppress sending of mode_sense for mode page 8 if the device pretends to | ||
| 153 | * support the SCSI Primary Block commands instead of Reduced Block Commands. | ||
| 154 | * | ||
| 155 | * - fix capacity | ||
| 156 | * Tell sd_mod to correct the last sector number reported by read_capacity. | ||
| 157 | * Avoids access beyond actual disk limits on devices with an off-by-one bug. | ||
| 158 | * Don't use this with devices which don't have this bug. | ||
| 159 | * | ||
| 160 | * - override internal blacklist | ||
| 161 | * Instead of adding to the built-in blacklist, use only the workarounds | ||
| 162 | * specified in the module load parameter. | ||
| 163 | * Useful if a blacklist entry interfered with a non-broken device. | ||
| 146 | */ | 164 | */ |
| 165 | static int sbp2_default_workarounds; | ||
| 166 | module_param_named(workarounds, sbp2_default_workarounds, int, 0644); | ||
| 167 | MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" | ||
| 168 | ", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS) | ||
| 169 | ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36) | ||
| 170 | ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8) | ||
| 171 | ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY) | ||
| 172 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) | ||
| 173 | ", or a combination)"); | ||
| 174 | |||
| 175 | /* legacy parameter */ | ||
| 147 | static int force_inquiry_hack; | 176 | static int force_inquiry_hack; |
| 148 | module_param(force_inquiry_hack, int, 0644); | 177 | module_param(force_inquiry_hack, int, 0644); |
| 149 | MODULE_PARM_DESC(force_inquiry_hack, "Force SCSI inquiry hack (default = 0)"); | 178 | MODULE_PARM_DESC(force_inquiry_hack, "Deprecated, use 'workarounds'"); |
| 150 | 179 | ||
| 151 | /* | 180 | /* |
| 152 | * Export information about protocols/devices supported by this driver. | 181 | * Export information about protocols/devices supported by this driver. |
| @@ -266,14 +295,55 @@ static struct hpsb_protocol_driver sbp2_driver = { | |||
| 266 | }; | 295 | }; |
| 267 | 296 | ||
| 268 | /* | 297 | /* |
| 269 | * List of device firmwares that require the inquiry hack. | 298 | * List of devices with known bugs. |
| 270 | * Yields a few false positives but did not break other devices so far. | 299 | * |
| 300 | * The firmware_revision field, masked with 0xffff00, is the best indicator | ||
| 301 | * for the type of bridge chip of a device. It yields a few false positives | ||
| 302 | * but this did not break correctly behaving devices so far. | ||
| 271 | */ | 303 | */ |
| 272 | static u32 sbp2_broken_inquiry_list[] = { | 304 | static const struct { |
| 273 | 0x00002800, /* Stefan Richter <stefanr@s5r6.in-berlin.de> */ | 305 | u32 firmware_revision; |
| 274 | /* DViCO Momobay CX-1 */ | 306 | u32 model_id; |
| 275 | 0x00000200 /* Andreas Plesch <plesch@fas.harvard.edu> */ | 307 | unsigned workarounds; |
| 276 | /* QPS Fire DVDBurner */ | 308 | } sbp2_workarounds_table[] = { |
| 309 | /* TSB42AA9 */ { | ||
| 310 | .firmware_revision = 0x002800, | ||
| 311 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | | ||
| 312 | SBP2_WORKAROUND_MODE_SENSE_8, | ||
| 313 | }, | ||
| 314 | /* Initio bridges, actually only needed for some older ones */ { | ||
| 315 | .firmware_revision = 0x000200, | ||
| 316 | .workarounds = SBP2_WORKAROUND_INQUIRY_36, | ||
| 317 | }, | ||
| 318 | /* Symbios bridge */ { | ||
| 319 | .firmware_revision = 0xa0b800, | ||
| 320 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | ||
| 321 | }, | ||
| 322 | /* | ||
| 323 | * Note about the following Apple iPod blacklist entries: | ||
| 324 | * | ||
| 325 | * There are iPods (2nd gen, 3rd gen) with model_id==0. Since our | ||
| 326 | * matching logic treats 0 as a wildcard, we cannot match this ID | ||
| 327 | * without rewriting the matching routine. Fortunately these iPods | ||
| 328 | * do not feature the read_capacity bug according to one report. | ||
| 329 | * Read_capacity behaviour as well as model_id could change due to | ||
| 330 | * Apple-supplied firmware updates though. | ||
| 331 | */ | ||
| 332 | /* iPod 4th generation */ { | ||
| 333 | .firmware_revision = 0x0a2700, | ||
| 334 | .model_id = 0x000021, | ||
| 335 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
| 336 | }, | ||
| 337 | /* iPod mini */ { | ||
| 338 | .firmware_revision = 0x0a2700, | ||
| 339 | .model_id = 0x000023, | ||
| 340 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
| 341 | }, | ||
| 342 | /* iPod Photo */ { | ||
| 343 | .firmware_revision = 0x0a2700, | ||
| 344 | .model_id = 0x00007e, | ||
| 345 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
| 346 | } | ||
| 277 | }; | 347 | }; |
| 278 | 348 | ||
| 279 | /************************************** | 349 | /************************************** |
| @@ -765,11 +835,16 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud | |||
| 765 | 835 | ||
| 766 | /* Register the status FIFO address range. We could use the same FIFO | 836 | /* Register the status FIFO address range. We could use the same FIFO |
| 767 | * for targets at different nodes. However we need different FIFOs per | 837 | * for targets at different nodes. However we need different FIFOs per |
| 768 | * target in order to support multi-unit devices. */ | 838 | * target in order to support multi-unit devices. |
| 839 | * The FIFO is located out of the local host controller's physical range | ||
| 840 | * but, if possible, within the posted write area. Status writes will | ||
| 841 | * then be performed as unified transactions. This slightly reduces | ||
| 842 | * bandwidth usage, and some Prolific based devices seem to require it. | ||
| 843 | */ | ||
| 769 | scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace( | 844 | scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace( |
| 770 | &sbp2_highlevel, ud->ne->host, &sbp2_ops, | 845 | &sbp2_highlevel, ud->ne->host, &sbp2_ops, |
| 771 | sizeof(struct sbp2_status_block), sizeof(quadlet_t), | 846 | sizeof(struct sbp2_status_block), sizeof(quadlet_t), |
| 772 | ~0ULL, ~0ULL); | 847 | 0x010000000000ULL, CSR1212_ALL_SPACE_END); |
| 773 | if (!scsi_id->status_fifo_addr) { | 848 | if (!scsi_id->status_fifo_addr) { |
| 774 | SBP2_ERR("failed to allocate status FIFO address range"); | 849 | SBP2_ERR("failed to allocate status FIFO address range"); |
| 775 | goto failed_alloc; | 850 | goto failed_alloc; |
| @@ -1450,7 +1525,8 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, | |||
| 1450 | struct csr1212_dentry *dentry; | 1525 | struct csr1212_dentry *dentry; |
| 1451 | u64 management_agent_addr; | 1526 | u64 management_agent_addr; |
| 1452 | u32 command_set_spec_id, command_set, unit_characteristics, | 1527 | u32 command_set_spec_id, command_set, unit_characteristics, |
| 1453 | firmware_revision, workarounds; | 1528 | firmware_revision; |
| 1529 | unsigned workarounds; | ||
| 1454 | int i; | 1530 | int i; |
| 1455 | 1531 | ||
| 1456 | SBP2_DEBUG_ENTER(); | 1532 | SBP2_DEBUG_ENTER(); |
| @@ -1506,12 +1582,8 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, | |||
| 1506 | case SBP2_FIRMWARE_REVISION_KEY: | 1582 | case SBP2_FIRMWARE_REVISION_KEY: |
| 1507 | /* Firmware revision */ | 1583 | /* Firmware revision */ |
| 1508 | firmware_revision = kv->value.immediate; | 1584 | firmware_revision = kv->value.immediate; |
| 1509 | if (force_inquiry_hack) | 1585 | SBP2_DEBUG("sbp2_firmware_revision = %x", |
| 1510 | SBP2_INFO("sbp2_firmware_revision = %x", | 1586 | (unsigned int)firmware_revision); |
| 1511 | (unsigned int)firmware_revision); | ||
| 1512 | else | ||
| 1513 | SBP2_DEBUG("sbp2_firmware_revision = %x", | ||
| 1514 | (unsigned int)firmware_revision); | ||
| 1515 | break; | 1587 | break; |
| 1516 | 1588 | ||
| 1517 | default: | 1589 | default: |
| @@ -1519,41 +1591,44 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, | |||
| 1519 | } | 1591 | } |
| 1520 | } | 1592 | } |
| 1521 | 1593 | ||
| 1522 | /* This is the start of our broken device checking. We try to hack | 1594 | workarounds = sbp2_default_workarounds; |
| 1523 | * around oddities and known defects. */ | 1595 | if (force_inquiry_hack) { |
| 1524 | workarounds = 0x0; | 1596 | SBP2_WARN("force_inquiry_hack is deprecated. " |
| 1597 | "Use parameter 'workarounds' instead."); | ||
| 1598 | workarounds |= SBP2_WORKAROUND_INQUIRY_36; | ||
| 1599 | } | ||
| 1525 | 1600 | ||
| 1526 | /* If the vendor id is 0xa0b8 (Symbios vendor id), then we have a | 1601 | if (!(workarounds & SBP2_WORKAROUND_OVERRIDE)) |
| 1527 | * bridge with 128KB max transfer size limitation. For sanity, we | 1602 | for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) { |
| 1528 | * only voice this when the current max_sectors setting | 1603 | if (sbp2_workarounds_table[i].firmware_revision && |
| 1529 | * exceeds the 128k limit. By default, that is not the case. | 1604 | sbp2_workarounds_table[i].firmware_revision != |
| 1530 | * | 1605 | (firmware_revision & 0xffff00)) |
| 1531 | * It would be really nice if we could detect this before the scsi | 1606 | continue; |
| 1532 | * host gets initialized. That way we can down-force the | 1607 | if (sbp2_workarounds_table[i].model_id && |
| 1533 | * max_sectors to account for it. That is not currently | 1608 | sbp2_workarounds_table[i].model_id != ud->model_id) |
| 1534 | * possible. */ | 1609 | continue; |
| 1535 | if ((firmware_revision & 0xffff00) == | 1610 | workarounds |= sbp2_workarounds_table[i].workarounds; |
| 1536 | SBP2_128KB_BROKEN_FIRMWARE && | 1611 | break; |
| 1537 | (max_sectors * 512) > (128*1024)) { | ||
| 1538 | SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB max transfer size.", | ||
| 1539 | NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid)); | ||
| 1540 | SBP2_WARN("WARNING: Current max_sectors setting is larger than 128KB (%d sectors)!", | ||
| 1541 | max_sectors); | ||
| 1542 | workarounds |= SBP2_BREAKAGE_128K_MAX_TRANSFER; | ||
| 1543 | } | ||
| 1544 | |||
| 1545 | /* Check for a blacklisted set of devices that require us to force | ||
| 1546 | * a 36 byte host inquiry. This can be overriden as a module param | ||
| 1547 | * (to force all hosts). */ | ||
| 1548 | for (i = 0; i < ARRAY_SIZE(sbp2_broken_inquiry_list); i++) { | ||
| 1549 | if ((firmware_revision & 0xffff00) == | ||
| 1550 | sbp2_broken_inquiry_list[i]) { | ||
| 1551 | SBP2_WARN("Node " NODE_BUS_FMT ": Using 36byte inquiry workaround", | ||
| 1552 | NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid)); | ||
| 1553 | workarounds |= SBP2_BREAKAGE_INQUIRY_HACK; | ||
| 1554 | break; /* No need to continue. */ | ||
| 1555 | } | 1612 | } |
| 1556 | } | 1613 | |
| 1614 | if (workarounds) | ||
| 1615 | SBP2_INFO("Workarounds for node " NODE_BUS_FMT ": 0x%x " | ||
| 1616 | "(firmware_revision 0x%06x, vendor_id 0x%06x," | ||
| 1617 | " model_id 0x%06x)", | ||
| 1618 | NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid), | ||
| 1619 | workarounds, firmware_revision, | ||
| 1620 | ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id, | ||
| 1621 | ud->model_id); | ||
| 1622 | |||
| 1623 | /* We would need one SCSI host template for each target to adjust | ||
| 1624 | * max_sectors on the fly, therefore warn only. */ | ||
| 1625 | if (workarounds & SBP2_WORKAROUND_128K_MAX_TRANS && | ||
| 1626 | (max_sectors * 512) > (128 * 1024)) | ||
| 1627 | SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB " | ||
| 1628 | "max transfer size. WARNING: Current max_sectors " | ||
| 1629 | "setting is larger than 128KB (%d sectors)", | ||
| 1630 | NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid), | ||
| 1631 | max_sectors); | ||
| 1557 | 1632 | ||
| 1558 | /* If this is a logical unit directory entry, process the parent | 1633 | /* If this is a logical unit directory entry, process the parent |
| 1559 | * to get the values. */ | 1634 | * to get the values. */ |
| @@ -2447,19 +2522,25 @@ static int sbp2scsi_slave_alloc(struct scsi_device *sdev) | |||
| 2447 | 2522 | ||
| 2448 | scsi_id->sdev = sdev; | 2523 | scsi_id->sdev = sdev; |
| 2449 | 2524 | ||
| 2450 | if (force_inquiry_hack || | 2525 | if (scsi_id->workarounds & SBP2_WORKAROUND_INQUIRY_36) |
| 2451 | scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK) { | ||
| 2452 | sdev->inquiry_len = 36; | 2526 | sdev->inquiry_len = 36; |
| 2453 | sdev->skip_ms_page_8 = 1; | ||
| 2454 | } | ||
| 2455 | return 0; | 2527 | return 0; |
| 2456 | } | 2528 | } |
| 2457 | 2529 | ||
| 2458 | static int sbp2scsi_slave_configure(struct scsi_device *sdev) | 2530 | static int sbp2scsi_slave_configure(struct scsi_device *sdev) |
| 2459 | { | 2531 | { |
| 2532 | struct scsi_id_instance_data *scsi_id = | ||
| 2533 | (struct scsi_id_instance_data *)sdev->host->hostdata[0]; | ||
| 2534 | |||
| 2460 | blk_queue_dma_alignment(sdev->request_queue, (512 - 1)); | 2535 | blk_queue_dma_alignment(sdev->request_queue, (512 - 1)); |
| 2461 | sdev->use_10_for_rw = 1; | 2536 | sdev->use_10_for_rw = 1; |
| 2462 | sdev->use_10_for_ms = 1; | 2537 | sdev->use_10_for_ms = 1; |
| 2538 | |||
| 2539 | if (sdev->type == TYPE_DISK && | ||
| 2540 | scsi_id->workarounds & SBP2_WORKAROUND_MODE_SENSE_8) | ||
| 2541 | sdev->skip_ms_page_8 = 1; | ||
| 2542 | if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) | ||
| 2543 | sdev->fix_capacity = 1; | ||
| 2463 | return 0; | 2544 | return 0; |
| 2464 | } | 2545 | } |
| 2465 | 2546 | ||
| @@ -2603,7 +2684,9 @@ static int sbp2_module_init(void) | |||
| 2603 | scsi_driver_template.cmd_per_lun = 1; | 2684 | scsi_driver_template.cmd_per_lun = 1; |
| 2604 | } | 2685 | } |
| 2605 | 2686 | ||
| 2606 | /* Set max sectors (module load option). Default is 255 sectors. */ | 2687 | if (sbp2_default_workarounds & SBP2_WORKAROUND_128K_MAX_TRANS && |
| 2688 | (max_sectors * 512) > (128 * 1024)) | ||
| 2689 | max_sectors = 128 * 1024 / 512; | ||
| 2607 | scsi_driver_template.max_sectors = max_sectors; | 2690 | scsi_driver_template.max_sectors = max_sectors; |
| 2608 | 2691 | ||
| 2609 | /* Register our high level driver with 1394 stack */ | 2692 | /* Register our high level driver with 1394 stack */ |
diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index e2d357a9ea3a..f4ccc9d0fba4 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h | |||
| @@ -227,11 +227,6 @@ struct sbp2_status_block { | |||
| 227 | #define SBP2_SW_VERSION_ENTRY 0x00010483 | 227 | #define SBP2_SW_VERSION_ENTRY 0x00010483 |
| 228 | 228 | ||
| 229 | /* | 229 | /* |
| 230 | * Other misc defines | ||
| 231 | */ | ||
| 232 | #define SBP2_128KB_BROKEN_FIRMWARE 0xa0b800 | ||
| 233 | |||
| 234 | /* | ||
| 235 | * SCSI specific stuff | 230 | * SCSI specific stuff |
| 236 | */ | 231 | */ |
| 237 | 232 | ||
| @@ -239,6 +234,13 @@ struct sbp2_status_block { | |||
| 239 | #define SBP2_MAX_SECTORS 255 /* Max sectors supported */ | 234 | #define SBP2_MAX_SECTORS 255 /* Max sectors supported */ |
| 240 | #define SBP2_MAX_CMDS 8 /* This should be safe */ | 235 | #define SBP2_MAX_CMDS 8 /* This should be safe */ |
| 241 | 236 | ||
| 237 | /* Flags for detected oddities and brokeness */ | ||
| 238 | #define SBP2_WORKAROUND_128K_MAX_TRANS 0x1 | ||
| 239 | #define SBP2_WORKAROUND_INQUIRY_36 0x2 | ||
| 240 | #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 | ||
| 241 | #define SBP2_WORKAROUND_FIX_CAPACITY 0x8 | ||
| 242 | #define SBP2_WORKAROUND_OVERRIDE 0x100 | ||
| 243 | |||
| 242 | /* This is the two dma types we use for cmd_dma below */ | 244 | /* This is the two dma types we use for cmd_dma below */ |
| 243 | enum cmd_dma_types { | 245 | enum cmd_dma_types { |
| 244 | CMD_DMA_NONE, | 246 | CMD_DMA_NONE, |
| @@ -268,10 +270,6 @@ struct sbp2_command_info { | |||
| 268 | 270 | ||
| 269 | }; | 271 | }; |
| 270 | 272 | ||
| 271 | /* A list of flags for detected oddities and brokeness. */ | ||
| 272 | #define SBP2_BREAKAGE_128K_MAX_TRANSFER 0x1 | ||
| 273 | #define SBP2_BREAKAGE_INQUIRY_HACK 0x2 | ||
| 274 | |||
| 275 | struct sbp2scsi_host_info; | 273 | struct sbp2scsi_host_info; |
| 276 | 274 | ||
| 277 | /* | 275 | /* |
| @@ -345,7 +343,7 @@ struct scsi_id_instance_data { | |||
| 345 | struct Scsi_Host *scsi_host; | 343 | struct Scsi_Host *scsi_host; |
| 346 | 344 | ||
| 347 | /* Device specific workarounds/brokeness */ | 345 | /* Device specific workarounds/brokeness */ |
| 348 | u32 workarounds; | 346 | unsigned workarounds; |
| 349 | }; | 347 | }; |
| 350 | 348 | ||
| 351 | /* Sbp2 host data structure (one per IEEE1394 host) */ | 349 | /* Sbp2 host data structure (one per IEEE1394 host) */ |
diff --git a/drivers/net/ixp2000/enp2611.c b/drivers/net/ixp2000/enp2611.c index 6f7dce8eba51..b67f586d7392 100644 --- a/drivers/net/ixp2000/enp2611.c +++ b/drivers/net/ixp2000/enp2611.c | |||
| @@ -149,6 +149,8 @@ static void enp2611_check_link_status(unsigned long __dummy) | |||
| 149 | int status; | 149 | int status; |
| 150 | 150 | ||
| 151 | dev = nds[i]; | 151 | dev = nds[i]; |
| 152 | if (dev == NULL) | ||
| 153 | continue; | ||
| 152 | 154 | ||
| 153 | status = pm3386_is_link_up(i); | 155 | status = pm3386_is_link_up(i); |
| 154 | if (status && !netif_carrier_ok(dev)) { | 156 | if (status && !netif_carrier_ok(dev)) { |
| @@ -191,6 +193,7 @@ static void enp2611_set_port_admin_status(int port, int up) | |||
| 191 | 193 | ||
| 192 | static int __init enp2611_init_module(void) | 194 | static int __init enp2611_init_module(void) |
| 193 | { | 195 | { |
| 196 | int ports; | ||
| 194 | int i; | 197 | int i; |
| 195 | 198 | ||
| 196 | if (!machine_is_enp2611()) | 199 | if (!machine_is_enp2611()) |
| @@ -199,7 +202,8 @@ static int __init enp2611_init_module(void) | |||
| 199 | caleb_reset(); | 202 | caleb_reset(); |
| 200 | pm3386_reset(); | 203 | pm3386_reset(); |
| 201 | 204 | ||
| 202 | for (i = 0; i < 3; i++) { | 205 | ports = pm3386_port_count(); |
| 206 | for (i = 0; i < ports; i++) { | ||
| 203 | nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv)); | 207 | nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv)); |
| 204 | if (nds[i] == NULL) { | 208 | if (nds[i] == NULL) { |
| 205 | while (--i >= 0) | 209 | while (--i >= 0) |
| @@ -215,9 +219,10 @@ static int __init enp2611_init_module(void) | |||
| 215 | 219 | ||
| 216 | ixp2400_msf_init(&enp2611_msf_parameters); | 220 | ixp2400_msf_init(&enp2611_msf_parameters); |
| 217 | 221 | ||
| 218 | if (ixpdev_init(3, nds, enp2611_set_port_admin_status)) { | 222 | if (ixpdev_init(ports, nds, enp2611_set_port_admin_status)) { |
| 219 | for (i = 0; i < 3; i++) | 223 | for (i = 0; i < ports; i++) |
| 220 | free_netdev(nds[i]); | 224 | if (nds[i]) |
| 225 | free_netdev(nds[i]); | ||
| 221 | return -EINVAL; | 226 | return -EINVAL; |
| 222 | } | 227 | } |
| 223 | 228 | ||
diff --git a/drivers/net/ixp2000/pm3386.c b/drivers/net/ixp2000/pm3386.c index 5c7ab7564053..5224651c9aac 100644 --- a/drivers/net/ixp2000/pm3386.c +++ b/drivers/net/ixp2000/pm3386.c | |||
| @@ -86,40 +86,53 @@ static void pm3386_port_reg_write(int port, int _reg, int spacing, u16 value) | |||
| 86 | pm3386_reg_write(port >> 1, reg, value); | 86 | pm3386_reg_write(port >> 1, reg, value); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | int pm3386_secondary_present(void) | ||
| 90 | { | ||
| 91 | return pm3386_reg_read(1, 0) == 0x3386; | ||
| 92 | } | ||
| 89 | 93 | ||
| 90 | void pm3386_reset(void) | 94 | void pm3386_reset(void) |
| 91 | { | 95 | { |
| 92 | u8 mac[3][6]; | 96 | u8 mac[3][6]; |
| 97 | int secondary; | ||
| 98 | |||
| 99 | secondary = pm3386_secondary_present(); | ||
| 93 | 100 | ||
| 94 | /* Save programmed MAC addresses. */ | 101 | /* Save programmed MAC addresses. */ |
| 95 | pm3386_get_mac(0, mac[0]); | 102 | pm3386_get_mac(0, mac[0]); |
| 96 | pm3386_get_mac(1, mac[1]); | 103 | pm3386_get_mac(1, mac[1]); |
| 97 | pm3386_get_mac(2, mac[2]); | 104 | if (secondary) |
| 105 | pm3386_get_mac(2, mac[2]); | ||
| 98 | 106 | ||
| 99 | /* Assert analog and digital reset. */ | 107 | /* Assert analog and digital reset. */ |
| 100 | pm3386_reg_write(0, 0x002, 0x0060); | 108 | pm3386_reg_write(0, 0x002, 0x0060); |
| 101 | pm3386_reg_write(1, 0x002, 0x0060); | 109 | if (secondary) |
| 110 | pm3386_reg_write(1, 0x002, 0x0060); | ||
| 102 | mdelay(1); | 111 | mdelay(1); |
| 103 | 112 | ||
| 104 | /* Deassert analog reset. */ | 113 | /* Deassert analog reset. */ |
| 105 | pm3386_reg_write(0, 0x002, 0x0062); | 114 | pm3386_reg_write(0, 0x002, 0x0062); |
| 106 | pm3386_reg_write(1, 0x002, 0x0062); | 115 | if (secondary) |
| 116 | pm3386_reg_write(1, 0x002, 0x0062); | ||
| 107 | mdelay(10); | 117 | mdelay(10); |
| 108 | 118 | ||
| 109 | /* Deassert digital reset. */ | 119 | /* Deassert digital reset. */ |
| 110 | pm3386_reg_write(0, 0x002, 0x0063); | 120 | pm3386_reg_write(0, 0x002, 0x0063); |
| 111 | pm3386_reg_write(1, 0x002, 0x0063); | 121 | if (secondary) |
| 122 | pm3386_reg_write(1, 0x002, 0x0063); | ||
| 112 | mdelay(10); | 123 | mdelay(10); |
| 113 | 124 | ||
| 114 | /* Restore programmed MAC addresses. */ | 125 | /* Restore programmed MAC addresses. */ |
| 115 | pm3386_set_mac(0, mac[0]); | 126 | pm3386_set_mac(0, mac[0]); |
| 116 | pm3386_set_mac(1, mac[1]); | 127 | pm3386_set_mac(1, mac[1]); |
| 117 | pm3386_set_mac(2, mac[2]); | 128 | if (secondary) |
| 129 | pm3386_set_mac(2, mac[2]); | ||
| 118 | 130 | ||
| 119 | /* Disable carrier on all ports. */ | 131 | /* Disable carrier on all ports. */ |
| 120 | pm3386_set_carrier(0, 0); | 132 | pm3386_set_carrier(0, 0); |
| 121 | pm3386_set_carrier(1, 0); | 133 | pm3386_set_carrier(1, 0); |
| 122 | pm3386_set_carrier(2, 0); | 134 | if (secondary) |
| 135 | pm3386_set_carrier(2, 0); | ||
| 123 | } | 136 | } |
| 124 | 137 | ||
| 125 | static u16 swaph(u16 x) | 138 | static u16 swaph(u16 x) |
| @@ -127,6 +140,11 @@ static u16 swaph(u16 x) | |||
| 127 | return ((x << 8) | (x >> 8)) & 0xffff; | 140 | return ((x << 8) | (x >> 8)) & 0xffff; |
| 128 | } | 141 | } |
| 129 | 142 | ||
| 143 | int pm3386_port_count(void) | ||
| 144 | { | ||
| 145 | return 2 + pm3386_secondary_present(); | ||
| 146 | } | ||
| 147 | |||
| 130 | void pm3386_init_port(int port) | 148 | void pm3386_init_port(int port) |
| 131 | { | 149 | { |
| 132 | int pm = port >> 1; | 150 | int pm = port >> 1; |
diff --git a/drivers/net/ixp2000/pm3386.h b/drivers/net/ixp2000/pm3386.h index fe92bb056ac4..cc4183dca911 100644 --- a/drivers/net/ixp2000/pm3386.h +++ b/drivers/net/ixp2000/pm3386.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #define __PM3386_H | 13 | #define __PM3386_H |
| 14 | 14 | ||
| 15 | void pm3386_reset(void); | 15 | void pm3386_reset(void); |
| 16 | int pm3386_port_count(void); | ||
| 16 | void pm3386_init_port(int port); | 17 | void pm3386_init_port(int port); |
| 17 | void pm3386_get_mac(int port, u8 *mac); | 18 | void pm3386_get_mac(int port, u8 *mac); |
| 18 | void pm3386_set_mac(int port, u8 *mac); | 19 | void pm3386_set_mac(int port, u8 *mac); |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index ffd267fab21d..62be6d99d05c 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -1020,8 +1020,19 @@ static int sky2_up(struct net_device *dev) | |||
| 1020 | struct sky2_hw *hw = sky2->hw; | 1020 | struct sky2_hw *hw = sky2->hw; |
| 1021 | unsigned port = sky2->port; | 1021 | unsigned port = sky2->port; |
| 1022 | u32 ramsize, rxspace, imask; | 1022 | u32 ramsize, rxspace, imask; |
| 1023 | int err = -ENOMEM; | 1023 | int err; |
| 1024 | struct net_device *otherdev = hw->dev[sky2->port^1]; | ||
| 1024 | 1025 | ||
| 1026 | /* Block bringing up both ports at the same time on a dual port card. | ||
| 1027 | * There is an unfixed bug where receiver gets confused and picks up | ||
| 1028 | * packets out of order. Until this is fixed, prevent data corruption. | ||
| 1029 | */ | ||
| 1030 | if (otherdev && netif_running(otherdev)) { | ||
| 1031 | printk(KERN_INFO PFX "dual port support is disabled.\n"); | ||
| 1032 | return -EBUSY; | ||
| 1033 | } | ||
| 1034 | |||
| 1035 | err = -ENOMEM; | ||
| 1025 | if (netif_msg_ifup(sky2)) | 1036 | if (netif_msg_ifup(sky2)) |
| 1026 | printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); | 1037 | printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); |
| 1027 | 1038 | ||
diff --git a/fs/Makefile b/fs/Makefile index 83bf478e786b..078d3d1191a5 100644 --- a/fs/Makefile +++ b/fs/Makefile | |||
| @@ -45,6 +45,7 @@ obj-$(CONFIG_DNOTIFY) += dnotify.o | |||
| 45 | obj-$(CONFIG_PROC_FS) += proc/ | 45 | obj-$(CONFIG_PROC_FS) += proc/ |
| 46 | obj-y += partitions/ | 46 | obj-y += partitions/ |
| 47 | obj-$(CONFIG_SYSFS) += sysfs/ | 47 | obj-$(CONFIG_SYSFS) += sysfs/ |
| 48 | obj-$(CONFIG_CONFIGFS_FS) += configfs/ | ||
| 48 | obj-y += devpts/ | 49 | obj-y += devpts/ |
| 49 | 50 | ||
| 50 | obj-$(CONFIG_PROFILING) += dcookies.o | 51 | obj-$(CONFIG_PROFILING) += dcookies.o |
| @@ -100,5 +101,4 @@ obj-$(CONFIG_BEFS_FS) += befs/ | |||
| 100 | obj-$(CONFIG_HOSTFS) += hostfs/ | 101 | obj-$(CONFIG_HOSTFS) += hostfs/ |
| 101 | obj-$(CONFIG_HPPFS) += hppfs/ | 102 | obj-$(CONFIG_HPPFS) += hppfs/ |
| 102 | obj-$(CONFIG_DEBUG_FS) += debugfs/ | 103 | obj-$(CONFIG_DEBUG_FS) += debugfs/ |
| 103 | obj-$(CONFIG_CONFIGFS_FS) += configfs/ | ||
| 104 | obj-$(CONFIG_OCFS2_FS) += ocfs2/ | 104 | obj-$(CONFIG_OCFS2_FS) += ocfs2/ |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 5638c8f9362f..5f952187fc53 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
| @@ -505,13 +505,15 @@ static int populate_groups(struct config_group *group) | |||
| 505 | int i; | 505 | int i; |
| 506 | 506 | ||
| 507 | if (group->default_groups) { | 507 | if (group->default_groups) { |
| 508 | /* FYI, we're faking mkdir here | 508 | /* |
| 509 | * FYI, we're faking mkdir here | ||
| 509 | * I'm not sure we need this semaphore, as we're called | 510 | * I'm not sure we need this semaphore, as we're called |
| 510 | * from our parent's mkdir. That holds our parent's | 511 | * from our parent's mkdir. That holds our parent's |
| 511 | * i_mutex, so afaik lookup cannot continue through our | 512 | * i_mutex, so afaik lookup cannot continue through our |
| 512 | * parent to find us, let alone mess with our tree. | 513 | * parent to find us, let alone mess with our tree. |
| 513 | * That said, taking our i_mutex is closer to mkdir | 514 | * That said, taking our i_mutex is closer to mkdir |
| 514 | * emulation, and shouldn't hurt. */ | 515 | * emulation, and shouldn't hurt. |
| 516 | */ | ||
| 515 | mutex_lock(&dentry->d_inode->i_mutex); | 517 | mutex_lock(&dentry->d_inode->i_mutex); |
| 516 | 518 | ||
| 517 | for (i = 0; group->default_groups[i]; i++) { | 519 | for (i = 0; group->default_groups[i]; i++) { |
| @@ -546,20 +548,34 @@ static void unlink_obj(struct config_item *item) | |||
| 546 | 548 | ||
| 547 | item->ci_group = NULL; | 549 | item->ci_group = NULL; |
| 548 | item->ci_parent = NULL; | 550 | item->ci_parent = NULL; |
| 551 | |||
| 552 | /* Drop the reference for ci_entry */ | ||
| 549 | config_item_put(item); | 553 | config_item_put(item); |
| 550 | 554 | ||
| 555 | /* Drop the reference for ci_parent */ | ||
| 551 | config_group_put(group); | 556 | config_group_put(group); |
| 552 | } | 557 | } |
| 553 | } | 558 | } |
| 554 | 559 | ||
| 555 | static void link_obj(struct config_item *parent_item, struct config_item *item) | 560 | static void link_obj(struct config_item *parent_item, struct config_item *item) |
| 556 | { | 561 | { |
| 557 | /* Parent seems redundant with group, but it makes certain | 562 | /* |
| 558 | * traversals much nicer. */ | 563 | * Parent seems redundant with group, but it makes certain |
| 564 | * traversals much nicer. | ||
| 565 | */ | ||
| 559 | item->ci_parent = parent_item; | 566 | item->ci_parent = parent_item; |
| 567 | |||
| 568 | /* | ||
| 569 | * We hold a reference on the parent for the child's ci_parent | ||
| 570 | * link. | ||
| 571 | */ | ||
| 560 | item->ci_group = config_group_get(to_config_group(parent_item)); | 572 | item->ci_group = config_group_get(to_config_group(parent_item)); |
| 561 | list_add_tail(&item->ci_entry, &item->ci_group->cg_children); | 573 | list_add_tail(&item->ci_entry, &item->ci_group->cg_children); |
| 562 | 574 | ||
| 575 | /* | ||
| 576 | * We hold a reference on the child for ci_entry on the parent's | ||
| 577 | * cg_children | ||
| 578 | */ | ||
| 563 | config_item_get(item); | 579 | config_item_get(item); |
| 564 | } | 580 | } |
| 565 | 581 | ||
| @@ -684,6 +700,10 @@ static void client_drop_item(struct config_item *parent_item, | |||
| 684 | type = parent_item->ci_type; | 700 | type = parent_item->ci_type; |
| 685 | BUG_ON(!type); | 701 | BUG_ON(!type); |
| 686 | 702 | ||
| 703 | /* | ||
| 704 | * If ->drop_item() exists, it is responsible for the | ||
| 705 | * config_item_put(). | ||
| 706 | */ | ||
| 687 | if (type->ct_group_ops && type->ct_group_ops->drop_item) | 707 | if (type->ct_group_ops && type->ct_group_ops->drop_item) |
| 688 | type->ct_group_ops->drop_item(to_config_group(parent_item), | 708 | type->ct_group_ops->drop_item(to_config_group(parent_item), |
| 689 | item); | 709 | item); |
| @@ -694,23 +714,28 @@ static void client_drop_item(struct config_item *parent_item, | |||
| 694 | 714 | ||
| 695 | static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | 715 | static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) |
| 696 | { | 716 | { |
| 697 | int ret; | 717 | int ret, module_got = 0; |
| 698 | struct config_group *group; | 718 | struct config_group *group; |
| 699 | struct config_item *item; | 719 | struct config_item *item; |
| 700 | struct config_item *parent_item; | 720 | struct config_item *parent_item; |
| 701 | struct configfs_subsystem *subsys; | 721 | struct configfs_subsystem *subsys; |
| 702 | struct configfs_dirent *sd; | 722 | struct configfs_dirent *sd; |
| 703 | struct config_item_type *type; | 723 | struct config_item_type *type; |
| 704 | struct module *owner; | 724 | struct module *owner = NULL; |
| 705 | char *name; | 725 | char *name; |
| 706 | 726 | ||
| 707 | if (dentry->d_parent == configfs_sb->s_root) | 727 | if (dentry->d_parent == configfs_sb->s_root) { |
| 708 | return -EPERM; | 728 | ret = -EPERM; |
| 729 | goto out; | ||
| 730 | } | ||
| 709 | 731 | ||
| 710 | sd = dentry->d_parent->d_fsdata; | 732 | sd = dentry->d_parent->d_fsdata; |
| 711 | if (!(sd->s_type & CONFIGFS_USET_DIR)) | 733 | if (!(sd->s_type & CONFIGFS_USET_DIR)) { |
| 712 | return -EPERM; | 734 | ret = -EPERM; |
| 735 | goto out; | ||
| 736 | } | ||
| 713 | 737 | ||
| 738 | /* Get a working ref for the duration of this function */ | ||
| 714 | parent_item = configfs_get_config_item(dentry->d_parent); | 739 | parent_item = configfs_get_config_item(dentry->d_parent); |
| 715 | type = parent_item->ci_type; | 740 | type = parent_item->ci_type; |
| 716 | subsys = to_config_group(parent_item)->cg_subsys; | 741 | subsys = to_config_group(parent_item)->cg_subsys; |
| @@ -719,15 +744,16 @@ static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 719 | if (!type || !type->ct_group_ops || | 744 | if (!type || !type->ct_group_ops || |
| 720 | (!type->ct_group_ops->make_group && | 745 | (!type->ct_group_ops->make_group && |
| 721 | !type->ct_group_ops->make_item)) { | 746 | !type->ct_group_ops->make_item)) { |
| 722 | config_item_put(parent_item); | 747 | ret = -EPERM; /* Lack-of-mkdir returns -EPERM */ |
| 723 | return -EPERM; /* What lack-of-mkdir returns */ | 748 | goto out_put; |
| 724 | } | 749 | } |
| 725 | 750 | ||
| 726 | name = kmalloc(dentry->d_name.len + 1, GFP_KERNEL); | 751 | name = kmalloc(dentry->d_name.len + 1, GFP_KERNEL); |
| 727 | if (!name) { | 752 | if (!name) { |
| 728 | config_item_put(parent_item); | 753 | ret = -ENOMEM; |
| 729 | return -ENOMEM; | 754 | goto out_put; |
| 730 | } | 755 | } |
| 756 | |||
| 731 | snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name); | 757 | snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name); |
| 732 | 758 | ||
| 733 | down(&subsys->su_sem); | 759 | down(&subsys->su_sem); |
| @@ -748,40 +774,67 @@ static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 748 | 774 | ||
| 749 | kfree(name); | 775 | kfree(name); |
| 750 | if (!item) { | 776 | if (!item) { |
| 751 | config_item_put(parent_item); | 777 | /* |
| 752 | return -ENOMEM; | 778 | * If item == NULL, then link_obj() was never called. |
| 779 | * There are no extra references to clean up. | ||
| 780 | */ | ||
| 781 | ret = -ENOMEM; | ||
| 782 | goto out_put; | ||
| 753 | } | 783 | } |
| 754 | 784 | ||
| 755 | ret = -EINVAL; | 785 | /* |
| 786 | * link_obj() has been called (via link_group() for groups). | ||
| 787 | * From here on out, errors must clean that up. | ||
| 788 | */ | ||
| 789 | |||
| 756 | type = item->ci_type; | 790 | type = item->ci_type; |
| 757 | if (type) { | 791 | if (!type) { |
| 758 | owner = type->ct_owner; | 792 | ret = -EINVAL; |
| 759 | if (try_module_get(owner)) { | 793 | goto out_unlink; |
| 760 | if (group) { | 794 | } |
| 761 | ret = configfs_attach_group(parent_item, | ||
| 762 | item, | ||
| 763 | dentry); | ||
| 764 | } else { | ||
| 765 | ret = configfs_attach_item(parent_item, | ||
| 766 | item, | ||
| 767 | dentry); | ||
| 768 | } | ||
| 769 | 795 | ||
| 770 | if (ret) { | 796 | owner = type->ct_owner; |
| 771 | down(&subsys->su_sem); | 797 | if (!try_module_get(owner)) { |
| 772 | if (group) | 798 | ret = -EINVAL; |
| 773 | unlink_group(group); | 799 | goto out_unlink; |
| 774 | else | 800 | } |
| 775 | unlink_obj(item); | ||
| 776 | client_drop_item(parent_item, item); | ||
| 777 | up(&subsys->su_sem); | ||
| 778 | 801 | ||
| 779 | config_item_put(parent_item); | 802 | /* |
| 780 | module_put(owner); | 803 | * I hate doing it this way, but if there is |
| 781 | } | 804 | * an error, module_put() probably should |
| 782 | } | 805 | * happen after any cleanup. |
| 806 | */ | ||
| 807 | module_got = 1; | ||
| 808 | |||
| 809 | if (group) | ||
| 810 | ret = configfs_attach_group(parent_item, item, dentry); | ||
| 811 | else | ||
| 812 | ret = configfs_attach_item(parent_item, item, dentry); | ||
| 813 | |||
| 814 | out_unlink: | ||
| 815 | if (ret) { | ||
| 816 | /* Tear down everything we built up */ | ||
| 817 | down(&subsys->su_sem); | ||
| 818 | if (group) | ||
| 819 | unlink_group(group); | ||
| 820 | else | ||
| 821 | unlink_obj(item); | ||
| 822 | client_drop_item(parent_item, item); | ||
| 823 | up(&subsys->su_sem); | ||
| 824 | |||
| 825 | if (module_got) | ||
| 826 | module_put(owner); | ||
| 783 | } | 827 | } |
| 784 | 828 | ||
| 829 | out_put: | ||
| 830 | /* | ||
| 831 | * link_obj()/link_group() took a reference from child->parent, | ||
| 832 | * so the parent is safely pinned. We can drop our working | ||
| 833 | * reference. | ||
| 834 | */ | ||
| 835 | config_item_put(parent_item); | ||
| 836 | |||
| 837 | out: | ||
| 785 | return ret; | 838 | return ret; |
| 786 | } | 839 | } |
| 787 | 840 | ||
| @@ -801,6 +854,7 @@ static int configfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 801 | if (sd->s_type & CONFIGFS_USET_DEFAULT) | 854 | if (sd->s_type & CONFIGFS_USET_DEFAULT) |
| 802 | return -EPERM; | 855 | return -EPERM; |
| 803 | 856 | ||
| 857 | /* Get a working ref until we have the child */ | ||
| 804 | parent_item = configfs_get_config_item(dentry->d_parent); | 858 | parent_item = configfs_get_config_item(dentry->d_parent); |
| 805 | subsys = to_config_group(parent_item)->cg_subsys; | 859 | subsys = to_config_group(parent_item)->cg_subsys; |
| 806 | BUG_ON(!subsys); | 860 | BUG_ON(!subsys); |
| @@ -817,6 +871,7 @@ static int configfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 817 | return ret; | 871 | return ret; |
| 818 | } | 872 | } |
| 819 | 873 | ||
| 874 | /* Get a working ref for the duration of this function */ | ||
| 820 | item = configfs_get_config_item(dentry); | 875 | item = configfs_get_config_item(dentry); |
| 821 | 876 | ||
| 822 | /* Drop reference from above, item already holds one. */ | 877 | /* Drop reference from above, item already holds one. */ |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 0d858d0b25be..47152bf9a7f2 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -276,13 +276,29 @@ static int ocfs2_writepage(struct page *page, struct writeback_control *wbc) | |||
| 276 | return ret; | 276 | return ret; |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | /* This can also be called from ocfs2_write_zero_page() which has done | ||
| 280 | * it's own cluster locking. */ | ||
| 281 | int ocfs2_prepare_write_nolock(struct inode *inode, struct page *page, | ||
| 282 | unsigned from, unsigned to) | ||
| 283 | { | ||
| 284 | int ret; | ||
| 285 | |||
| 286 | down_read(&OCFS2_I(inode)->ip_alloc_sem); | ||
| 287 | |||
| 288 | ret = block_prepare_write(page, from, to, ocfs2_get_block); | ||
| 289 | |||
| 290 | up_read(&OCFS2_I(inode)->ip_alloc_sem); | ||
| 291 | |||
| 292 | return ret; | ||
| 293 | } | ||
| 294 | |||
| 279 | /* | 295 | /* |
| 280 | * ocfs2_prepare_write() can be an outer-most ocfs2 call when it is called | 296 | * ocfs2_prepare_write() can be an outer-most ocfs2 call when it is called |
| 281 | * from loopback. It must be able to perform its own locking around | 297 | * from loopback. It must be able to perform its own locking around |
| 282 | * ocfs2_get_block(). | 298 | * ocfs2_get_block(). |
| 283 | */ | 299 | */ |
| 284 | int ocfs2_prepare_write(struct file *file, struct page *page, | 300 | static int ocfs2_prepare_write(struct file *file, struct page *page, |
| 285 | unsigned from, unsigned to) | 301 | unsigned from, unsigned to) |
| 286 | { | 302 | { |
| 287 | struct inode *inode = page->mapping->host; | 303 | struct inode *inode = page->mapping->host; |
| 288 | int ret; | 304 | int ret; |
| @@ -295,11 +311,7 @@ int ocfs2_prepare_write(struct file *file, struct page *page, | |||
| 295 | goto out; | 311 | goto out; |
| 296 | } | 312 | } |
| 297 | 313 | ||
| 298 | down_read(&OCFS2_I(inode)->ip_alloc_sem); | 314 | ret = ocfs2_prepare_write_nolock(inode, page, from, to); |
| 299 | |||
| 300 | ret = block_prepare_write(page, from, to, ocfs2_get_block); | ||
| 301 | |||
| 302 | up_read(&OCFS2_I(inode)->ip_alloc_sem); | ||
| 303 | 315 | ||
| 304 | ocfs2_meta_unlock(inode, 0); | 316 | ocfs2_meta_unlock(inode, 0); |
| 305 | out: | 317 | out: |
| @@ -625,11 +637,31 @@ static ssize_t ocfs2_direct_IO(int rw, | |||
| 625 | int ret; | 637 | int ret; |
| 626 | 638 | ||
| 627 | mlog_entry_void(); | 639 | mlog_entry_void(); |
| 640 | |||
| 641 | /* | ||
| 642 | * We get PR data locks even for O_DIRECT. This allows | ||
| 643 | * concurrent O_DIRECT I/O but doesn't let O_DIRECT with | ||
| 644 | * extending and buffered zeroing writes race. If they did | ||
| 645 | * race then the buffered zeroing could be written back after | ||
| 646 | * the O_DIRECT I/O. It's one thing to tell people not to mix | ||
| 647 | * buffered and O_DIRECT writes, but expecting them to | ||
| 648 | * understand that file extension is also an implicit buffered | ||
| 649 | * write is too much. By getting the PR we force writeback of | ||
| 650 | * the buffered zeroing before proceeding. | ||
| 651 | */ | ||
| 652 | ret = ocfs2_data_lock(inode, 0); | ||
| 653 | if (ret < 0) { | ||
| 654 | mlog_errno(ret); | ||
| 655 | goto out; | ||
| 656 | } | ||
| 657 | ocfs2_data_unlock(inode, 0); | ||
| 658 | |||
| 628 | ret = blockdev_direct_IO_no_locking(rw, iocb, inode, | 659 | ret = blockdev_direct_IO_no_locking(rw, iocb, inode, |
| 629 | inode->i_sb->s_bdev, iov, offset, | 660 | inode->i_sb->s_bdev, iov, offset, |
| 630 | nr_segs, | 661 | nr_segs, |
| 631 | ocfs2_direct_IO_get_blocks, | 662 | ocfs2_direct_IO_get_blocks, |
| 632 | ocfs2_dio_end_io); | 663 | ocfs2_dio_end_io); |
| 664 | out: | ||
| 633 | mlog_exit(ret); | 665 | mlog_exit(ret); |
| 634 | return ret; | 666 | return ret; |
| 635 | } | 667 | } |
diff --git a/fs/ocfs2/aops.h b/fs/ocfs2/aops.h index d40456d509a0..e88c3f0b8fa9 100644 --- a/fs/ocfs2/aops.h +++ b/fs/ocfs2/aops.h | |||
| @@ -22,8 +22,8 @@ | |||
| 22 | #ifndef OCFS2_AOPS_H | 22 | #ifndef OCFS2_AOPS_H |
| 23 | #define OCFS2_AOPS_H | 23 | #define OCFS2_AOPS_H |
| 24 | 24 | ||
| 25 | int ocfs2_prepare_write(struct file *file, struct page *page, | 25 | int ocfs2_prepare_write_nolock(struct inode *inode, struct page *page, |
| 26 | unsigned from, unsigned to); | 26 | unsigned from, unsigned to); |
| 27 | 27 | ||
| 28 | struct ocfs2_journal_handle *ocfs2_start_walk_page_trans(struct inode *inode, | 28 | struct ocfs2_journal_handle *ocfs2_start_walk_page_trans(struct inode *inode, |
| 29 | struct page *page, | 29 | struct page *page, |
diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c index 4601fc256f11..1a5c69071df6 100644 --- a/fs/ocfs2/extent_map.c +++ b/fs/ocfs2/extent_map.c | |||
| @@ -569,7 +569,7 @@ static int ocfs2_extent_map_insert(struct inode *inode, | |||
| 569 | 569 | ||
| 570 | ret = -ENOMEM; | 570 | ret = -ENOMEM; |
| 571 | ctxt.new_ent = kmem_cache_alloc(ocfs2_em_ent_cachep, | 571 | ctxt.new_ent = kmem_cache_alloc(ocfs2_em_ent_cachep, |
| 572 | GFP_KERNEL); | 572 | GFP_NOFS); |
| 573 | if (!ctxt.new_ent) { | 573 | if (!ctxt.new_ent) { |
| 574 | mlog_errno(ret); | 574 | mlog_errno(ret); |
| 575 | return ret; | 575 | return ret; |
| @@ -583,14 +583,14 @@ static int ocfs2_extent_map_insert(struct inode *inode, | |||
| 583 | if (ctxt.need_left && !ctxt.left_ent) { | 583 | if (ctxt.need_left && !ctxt.left_ent) { |
| 584 | ctxt.left_ent = | 584 | ctxt.left_ent = |
| 585 | kmem_cache_alloc(ocfs2_em_ent_cachep, | 585 | kmem_cache_alloc(ocfs2_em_ent_cachep, |
| 586 | GFP_KERNEL); | 586 | GFP_NOFS); |
| 587 | if (!ctxt.left_ent) | 587 | if (!ctxt.left_ent) |
| 588 | break; | 588 | break; |
| 589 | } | 589 | } |
| 590 | if (ctxt.need_right && !ctxt.right_ent) { | 590 | if (ctxt.need_right && !ctxt.right_ent) { |
| 591 | ctxt.right_ent = | 591 | ctxt.right_ent = |
| 592 | kmem_cache_alloc(ocfs2_em_ent_cachep, | 592 | kmem_cache_alloc(ocfs2_em_ent_cachep, |
| 593 | GFP_KERNEL); | 593 | GFP_NOFS); |
| 594 | if (!ctxt.right_ent) | 594 | if (!ctxt.right_ent) |
| 595 | break; | 595 | break; |
| 596 | } | 596 | } |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 581eb451a41a..a9559c874530 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -613,7 +613,8 @@ leave: | |||
| 613 | 613 | ||
| 614 | /* Some parts of this taken from generic_cont_expand, which turned out | 614 | /* Some parts of this taken from generic_cont_expand, which turned out |
| 615 | * to be too fragile to do exactly what we need without us having to | 615 | * to be too fragile to do exactly what we need without us having to |
| 616 | * worry about recursive locking in ->commit_write(). */ | 616 | * worry about recursive locking in ->prepare_write() and |
| 617 | * ->commit_write(). */ | ||
| 617 | static int ocfs2_write_zero_page(struct inode *inode, | 618 | static int ocfs2_write_zero_page(struct inode *inode, |
| 618 | u64 size) | 619 | u64 size) |
| 619 | { | 620 | { |
| @@ -641,7 +642,7 @@ static int ocfs2_write_zero_page(struct inode *inode, | |||
| 641 | goto out; | 642 | goto out; |
| 642 | } | 643 | } |
| 643 | 644 | ||
| 644 | ret = ocfs2_prepare_write(NULL, page, offset, offset); | 645 | ret = ocfs2_prepare_write_nolock(inode, page, offset, offset); |
| 645 | if (ret < 0) { | 646 | if (ret < 0) { |
| 646 | mlog_errno(ret); | 647 | mlog_errno(ret); |
| 647 | goto out_unlock; | 648 | goto out_unlock; |
| @@ -695,13 +696,26 @@ out: | |||
| 695 | return ret; | 696 | return ret; |
| 696 | } | 697 | } |
| 697 | 698 | ||
| 699 | /* | ||
| 700 | * A tail_to_skip value > 0 indicates that we're being called from | ||
| 701 | * ocfs2_file_aio_write(). This has the following implications: | ||
| 702 | * | ||
| 703 | * - we don't want to update i_size | ||
| 704 | * - di_bh will be NULL, which is fine because it's only used in the | ||
| 705 | * case where we want to update i_size. | ||
| 706 | * - ocfs2_zero_extend() will then only be filling the hole created | ||
| 707 | * between i_size and the start of the write. | ||
| 708 | */ | ||
| 698 | static int ocfs2_extend_file(struct inode *inode, | 709 | static int ocfs2_extend_file(struct inode *inode, |
| 699 | struct buffer_head *di_bh, | 710 | struct buffer_head *di_bh, |
| 700 | u64 new_i_size) | 711 | u64 new_i_size, |
| 712 | size_t tail_to_skip) | ||
| 701 | { | 713 | { |
| 702 | int ret = 0; | 714 | int ret = 0; |
| 703 | u32 clusters_to_add; | 715 | u32 clusters_to_add; |
| 704 | 716 | ||
| 717 | BUG_ON(!tail_to_skip && !di_bh); | ||
| 718 | |||
| 705 | /* setattr sometimes calls us like this. */ | 719 | /* setattr sometimes calls us like this. */ |
| 706 | if (new_i_size == 0) | 720 | if (new_i_size == 0) |
| 707 | goto out; | 721 | goto out; |
| @@ -714,27 +728,44 @@ static int ocfs2_extend_file(struct inode *inode, | |||
| 714 | OCFS2_I(inode)->ip_clusters; | 728 | OCFS2_I(inode)->ip_clusters; |
| 715 | 729 | ||
| 716 | if (clusters_to_add) { | 730 | if (clusters_to_add) { |
| 717 | ret = ocfs2_extend_allocation(inode, clusters_to_add); | 731 | /* |
| 732 | * protect the pages that ocfs2_zero_extend is going to | ||
| 733 | * be pulling into the page cache.. we do this before the | ||
| 734 | * metadata extend so that we don't get into the situation | ||
| 735 | * where we've extended the metadata but can't get the data | ||
| 736 | * lock to zero. | ||
| 737 | */ | ||
| 738 | ret = ocfs2_data_lock(inode, 1); | ||
| 718 | if (ret < 0) { | 739 | if (ret < 0) { |
| 719 | mlog_errno(ret); | 740 | mlog_errno(ret); |
| 720 | goto out; | 741 | goto out; |
| 721 | } | 742 | } |
| 722 | 743 | ||
| 723 | ret = ocfs2_zero_extend(inode, new_i_size); | 744 | ret = ocfs2_extend_allocation(inode, clusters_to_add); |
| 724 | if (ret < 0) { | 745 | if (ret < 0) { |
| 725 | mlog_errno(ret); | 746 | mlog_errno(ret); |
| 726 | goto out; | 747 | goto out_unlock; |
| 727 | } | 748 | } |
| 728 | } | ||
| 729 | 749 | ||
| 730 | /* No allocation required, we just use this helper to | 750 | ret = ocfs2_zero_extend(inode, (u64)new_i_size - tail_to_skip); |
| 731 | * do a trivial update of i_size. */ | 751 | if (ret < 0) { |
| 732 | ret = ocfs2_simple_size_update(inode, di_bh, new_i_size); | 752 | mlog_errno(ret); |
| 733 | if (ret < 0) { | 753 | goto out_unlock; |
| 734 | mlog_errno(ret); | 754 | } |
| 735 | goto out; | 755 | } |
| 756 | |||
| 757 | if (!tail_to_skip) { | ||
| 758 | /* We're being called from ocfs2_setattr() which wants | ||
| 759 | * us to update i_size */ | ||
| 760 | ret = ocfs2_simple_size_update(inode, di_bh, new_i_size); | ||
| 761 | if (ret < 0) | ||
| 762 | mlog_errno(ret); | ||
| 736 | } | 763 | } |
| 737 | 764 | ||
| 765 | out_unlock: | ||
| 766 | if (clusters_to_add) /* this is the only case in which we lock */ | ||
| 767 | ocfs2_data_unlock(inode, 1); | ||
| 768 | |||
| 738 | out: | 769 | out: |
| 739 | return ret; | 770 | return ret; |
| 740 | } | 771 | } |
| @@ -793,7 +824,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 793 | if (i_size_read(inode) > attr->ia_size) | 824 | if (i_size_read(inode) > attr->ia_size) |
| 794 | status = ocfs2_truncate_file(inode, bh, attr->ia_size); | 825 | status = ocfs2_truncate_file(inode, bh, attr->ia_size); |
| 795 | else | 826 | else |
| 796 | status = ocfs2_extend_file(inode, bh, attr->ia_size); | 827 | status = ocfs2_extend_file(inode, bh, attr->ia_size, 0); |
| 797 | if (status < 0) { | 828 | if (status < 0) { |
| 798 | if (status != -ENOSPC) | 829 | if (status != -ENOSPC) |
| 799 | mlog_errno(status); | 830 | mlog_errno(status); |
| @@ -1049,21 +1080,12 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
| 1049 | if (!clusters) | 1080 | if (!clusters) |
| 1050 | break; | 1081 | break; |
| 1051 | 1082 | ||
| 1052 | ret = ocfs2_extend_allocation(inode, clusters); | 1083 | ret = ocfs2_extend_file(inode, NULL, newsize, count); |
| 1053 | if (ret < 0) { | 1084 | if (ret < 0) { |
| 1054 | if (ret != -ENOSPC) | 1085 | if (ret != -ENOSPC) |
| 1055 | mlog_errno(ret); | 1086 | mlog_errno(ret); |
| 1056 | goto out; | 1087 | goto out; |
| 1057 | } | 1088 | } |
| 1058 | |||
| 1059 | /* Fill any holes which would've been created by this | ||
| 1060 | * write. If we're O_APPEND, this will wind up | ||
| 1061 | * (correctly) being a noop. */ | ||
| 1062 | ret = ocfs2_zero_extend(inode, (u64) newsize - count); | ||
| 1063 | if (ret < 0) { | ||
| 1064 | mlog_errno(ret); | ||
| 1065 | goto out; | ||
| 1066 | } | ||
| 1067 | break; | 1089 | break; |
| 1068 | } | 1090 | } |
| 1069 | 1091 | ||
| @@ -1146,6 +1168,22 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
| 1146 | ocfs2_iocb_set_rw_locked(iocb); | 1168 | ocfs2_iocb_set_rw_locked(iocb); |
| 1147 | } | 1169 | } |
| 1148 | 1170 | ||
| 1171 | /* | ||
| 1172 | * We're fine letting folks race truncates and extending | ||
| 1173 | * writes with read across the cluster, just like they can | ||
| 1174 | * locally. Hence no rw_lock during read. | ||
| 1175 | * | ||
| 1176 | * Take and drop the meta data lock to update inode fields | ||
| 1177 | * like i_size. This allows the checks down below | ||
| 1178 | * generic_file_aio_read() a chance of actually working. | ||
| 1179 | */ | ||
| 1180 | ret = ocfs2_meta_lock(inode, NULL, NULL, 0); | ||
| 1181 | if (ret < 0) { | ||
| 1182 | mlog_errno(ret); | ||
| 1183 | goto bail; | ||
| 1184 | } | ||
| 1185 | ocfs2_meta_unlock(inode, 0); | ||
| 1186 | |||
| 1149 | ret = generic_file_aio_read(iocb, buf, count, iocb->ki_pos); | 1187 | ret = generic_file_aio_read(iocb, buf, count, iocb->ki_pos); |
| 1150 | if (ret == -EINVAL) | 1188 | if (ret == -EINVAL) |
| 1151 | mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n"); | 1189 | mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n"); |
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index 6a610ae53583..eebc3cfa6be8 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c | |||
| @@ -117,7 +117,7 @@ struct ocfs2_journal_handle *ocfs2_alloc_handle(struct ocfs2_super *osb) | |||
| 117 | { | 117 | { |
| 118 | struct ocfs2_journal_handle *retval = NULL; | 118 | struct ocfs2_journal_handle *retval = NULL; |
| 119 | 119 | ||
| 120 | retval = kcalloc(1, sizeof(*retval), GFP_KERNEL); | 120 | retval = kcalloc(1, sizeof(*retval), GFP_NOFS); |
| 121 | if (!retval) { | 121 | if (!retval) { |
| 122 | mlog(ML_ERROR, "Failed to allocate memory for journal " | 122 | mlog(ML_ERROR, "Failed to allocate memory for journal " |
| 123 | "handle!\n"); | 123 | "handle!\n"); |
| @@ -870,9 +870,11 @@ static int ocfs2_force_read_journal(struct inode *inode) | |||
| 870 | if (p_blocks > CONCURRENT_JOURNAL_FILL) | 870 | if (p_blocks > CONCURRENT_JOURNAL_FILL) |
| 871 | p_blocks = CONCURRENT_JOURNAL_FILL; | 871 | p_blocks = CONCURRENT_JOURNAL_FILL; |
| 872 | 872 | ||
| 873 | /* We are reading journal data which should not | ||
| 874 | * be put in the uptodate cache */ | ||
| 873 | status = ocfs2_read_blocks(OCFS2_SB(inode->i_sb), | 875 | status = ocfs2_read_blocks(OCFS2_SB(inode->i_sb), |
| 874 | p_blkno, p_blocks, bhs, 0, | 876 | p_blkno, p_blocks, bhs, 0, |
| 875 | inode); | 877 | NULL); |
| 876 | if (status < 0) { | 878 | if (status < 0) { |
| 877 | mlog_errno(status); | 879 | mlog_errno(status); |
| 878 | goto bail; | 880 | goto bail; |
| @@ -982,7 +984,7 @@ static void ocfs2_queue_recovery_completion(struct ocfs2_journal *journal, | |||
| 982 | { | 984 | { |
| 983 | struct ocfs2_la_recovery_item *item; | 985 | struct ocfs2_la_recovery_item *item; |
| 984 | 986 | ||
| 985 | item = kmalloc(sizeof(struct ocfs2_la_recovery_item), GFP_KERNEL); | 987 | item = kmalloc(sizeof(struct ocfs2_la_recovery_item), GFP_NOFS); |
| 986 | if (!item) { | 988 | if (!item) { |
| 987 | /* Though we wish to avoid it, we are in fact safe in | 989 | /* Though we wish to avoid it, we are in fact safe in |
| 988 | * skipping local alloc cleanup as fsck.ocfs2 is more | 990 | * skipping local alloc cleanup as fsck.ocfs2 is more |
diff --git a/fs/ocfs2/uptodate.c b/fs/ocfs2/uptodate.c index 04a684dfdd96..b8a00a793326 100644 --- a/fs/ocfs2/uptodate.c +++ b/fs/ocfs2/uptodate.c | |||
| @@ -337,7 +337,7 @@ static void __ocfs2_set_buffer_uptodate(struct ocfs2_inode_info *oi, | |||
| 337 | (unsigned long long)oi->ip_blkno, | 337 | (unsigned long long)oi->ip_blkno, |
| 338 | (unsigned long long)block, expand_tree); | 338 | (unsigned long long)block, expand_tree); |
| 339 | 339 | ||
| 340 | new = kmem_cache_alloc(ocfs2_uptodate_cachep, GFP_KERNEL); | 340 | new = kmem_cache_alloc(ocfs2_uptodate_cachep, GFP_NOFS); |
| 341 | if (!new) { | 341 | if (!new) { |
| 342 | mlog_errno(-ENOMEM); | 342 | mlog_errno(-ENOMEM); |
| 343 | return; | 343 | return; |
| @@ -349,7 +349,7 @@ static void __ocfs2_set_buffer_uptodate(struct ocfs2_inode_info *oi, | |||
| 349 | * has no way of tracking that. */ | 349 | * has no way of tracking that. */ |
| 350 | for(i = 0; i < OCFS2_INODE_MAX_CACHE_ARRAY; i++) { | 350 | for(i = 0; i < OCFS2_INODE_MAX_CACHE_ARRAY; i++) { |
| 351 | tree[i] = kmem_cache_alloc(ocfs2_uptodate_cachep, | 351 | tree[i] = kmem_cache_alloc(ocfs2_uptodate_cachep, |
| 352 | GFP_KERNEL); | 352 | GFP_NOFS); |
| 353 | if (!tree[i]) { | 353 | if (!tree[i]) { |
| 354 | mlog_errno(-ENOMEM); | 354 | mlog_errno(-ENOMEM); |
| 355 | goto out_free; | 355 | goto out_free; |
diff --git a/fs/ocfs2/vote.c b/fs/ocfs2/vote.c index 53049a204197..ee42765a8553 100644 --- a/fs/ocfs2/vote.c +++ b/fs/ocfs2/vote.c | |||
| @@ -586,7 +586,7 @@ static struct ocfs2_net_wait_ctxt *ocfs2_new_net_wait_ctxt(unsigned int response | |||
| 586 | { | 586 | { |
| 587 | struct ocfs2_net_wait_ctxt *w; | 587 | struct ocfs2_net_wait_ctxt *w; |
| 588 | 588 | ||
| 589 | w = kcalloc(1, sizeof(*w), GFP_KERNEL); | 589 | w = kcalloc(1, sizeof(*w), GFP_NOFS); |
| 590 | if (!w) { | 590 | if (!w) { |
| 591 | mlog_errno(-ENOMEM); | 591 | mlog_errno(-ENOMEM); |
| 592 | goto bail; | 592 | goto bail; |
| @@ -749,7 +749,7 @@ static struct ocfs2_vote_msg * ocfs2_new_vote_request(struct ocfs2_super *osb, | |||
| 749 | 749 | ||
| 750 | BUG_ON(!ocfs2_is_valid_vote_request(type)); | 750 | BUG_ON(!ocfs2_is_valid_vote_request(type)); |
| 751 | 751 | ||
| 752 | request = kcalloc(1, sizeof(*request), GFP_KERNEL); | 752 | request = kcalloc(1, sizeof(*request), GFP_NOFS); |
| 753 | if (!request) { | 753 | if (!request) { |
| 754 | mlog_errno(-ENOMEM); | 754 | mlog_errno(-ENOMEM); |
| 755 | } else { | 755 | } else { |
| @@ -1129,7 +1129,7 @@ static int ocfs2_handle_vote_message(struct o2net_msg *msg, | |||
| 1129 | struct ocfs2_super *osb = data; | 1129 | struct ocfs2_super *osb = data; |
| 1130 | struct ocfs2_vote_work *work; | 1130 | struct ocfs2_vote_work *work; |
| 1131 | 1131 | ||
| 1132 | work = kmalloc(sizeof(struct ocfs2_vote_work), GFP_KERNEL); | 1132 | work = kmalloc(sizeof(struct ocfs2_vote_work), GFP_NOFS); |
| 1133 | if (!work) { | 1133 | if (!work) { |
| 1134 | status = -ENOMEM; | 1134 | status = -ENOMEM; |
| 1135 | mlog_errno(status); | 1135 | mlog_errno(status); |
diff --git a/net/802/tr.c b/net/802/tr.c index afd8385c0c9c..e9dc803f2fe0 100644 --- a/net/802/tr.c +++ b/net/802/tr.c | |||
| @@ -643,6 +643,5 @@ static int __init rif_init(void) | |||
| 643 | 643 | ||
| 644 | module_init(rif_init); | 644 | module_init(rif_init); |
| 645 | 645 | ||
| 646 | EXPORT_SYMBOL(tr_source_route); | ||
| 647 | EXPORT_SYMBOL(tr_type_trans); | 646 | EXPORT_SYMBOL(tr_type_trans); |
| 648 | EXPORT_SYMBOL(alloc_trdev); | 647 | EXPORT_SYMBOL(alloc_trdev); |
diff --git a/net/bridge/netfilter/ebt_log.c b/net/bridge/netfilter/ebt_log.c index d159c92cca84..466ed3440b74 100644 --- a/net/bridge/netfilter/ebt_log.c +++ b/net/bridge/netfilter/ebt_log.c | |||
| @@ -168,7 +168,7 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr, | |||
| 168 | 168 | ||
| 169 | if (info->bitmask & EBT_LOG_NFLOG) | 169 | if (info->bitmask & EBT_LOG_NFLOG) |
| 170 | nf_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li, | 170 | nf_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li, |
| 171 | info->prefix); | 171 | "%s", info->prefix); |
| 172 | else | 172 | else |
| 173 | ebt_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li, | 173 | ebt_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li, |
| 174 | info->prefix); | 174 | info->prefix); |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index c2d92f99a2b8..d0d19192026d 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
| @@ -948,7 +948,7 @@ static int do_add_counters(void __user *user, unsigned int len) | |||
| 948 | 948 | ||
| 949 | write_lock_bh(&t->lock); | 949 | write_lock_bh(&t->lock); |
| 950 | private = t->private; | 950 | private = t->private; |
| 951 | if (private->number != paddc->num_counters) { | 951 | if (private->number != tmp.num_counters) { |
| 952 | ret = -EINVAL; | 952 | ret = -EINVAL; |
| 953 | goto unlock_up_free; | 953 | goto unlock_up_free; |
| 954 | } | 954 | } |
diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c index 6c4899d8046a..96ceabaec402 100644 --- a/net/ipv4/netfilter/ip_nat_proto_gre.c +++ b/net/ipv4/netfilter/ip_nat_proto_gre.c | |||
| @@ -49,15 +49,15 @@ gre_in_range(const struct ip_conntrack_tuple *tuple, | |||
| 49 | const union ip_conntrack_manip_proto *min, | 49 | const union ip_conntrack_manip_proto *min, |
| 50 | const union ip_conntrack_manip_proto *max) | 50 | const union ip_conntrack_manip_proto *max) |
| 51 | { | 51 | { |
| 52 | u_int32_t key; | 52 | __be16 key; |
| 53 | 53 | ||
| 54 | if (maniptype == IP_NAT_MANIP_SRC) | 54 | if (maniptype == IP_NAT_MANIP_SRC) |
| 55 | key = tuple->src.u.gre.key; | 55 | key = tuple->src.u.gre.key; |
| 56 | else | 56 | else |
| 57 | key = tuple->dst.u.gre.key; | 57 | key = tuple->dst.u.gre.key; |
| 58 | 58 | ||
| 59 | return ntohl(key) >= ntohl(min->gre.key) | 59 | return ntohs(key) >= ntohs(min->gre.key) |
| 60 | && ntohl(key) <= ntohl(max->gre.key); | 60 | && ntohs(key) <= ntohs(max->gre.key); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | /* generate unique tuple ... */ | 63 | /* generate unique tuple ... */ |
| @@ -81,14 +81,14 @@ gre_unique_tuple(struct ip_conntrack_tuple *tuple, | |||
| 81 | min = 1; | 81 | min = 1; |
| 82 | range_size = 0xffff; | 82 | range_size = 0xffff; |
| 83 | } else { | 83 | } else { |
| 84 | min = ntohl(range->min.gre.key); | 84 | min = ntohs(range->min.gre.key); |
| 85 | range_size = ntohl(range->max.gre.key) - min + 1; | 85 | range_size = ntohs(range->max.gre.key) - min + 1; |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | DEBUGP("min = %u, range_size = %u\n", min, range_size); | 88 | DEBUGP("min = %u, range_size = %u\n", min, range_size); |
| 89 | 89 | ||
| 90 | for (i = 0; i < range_size; i++, key++) { | 90 | for (i = 0; i < range_size; i++, key++) { |
| 91 | *keyptr = htonl(min + key % range_size); | 91 | *keyptr = htons(min + key % range_size); |
| 92 | if (!ip_nat_used_tuple(tuple, conntrack)) | 92 | if (!ip_nat_used_tuple(tuple, conntrack)) |
| 93 | return 1; | 93 | return 1; |
| 94 | } | 94 | } |
diff --git a/net/ipv4/netfilter/ipt_LOG.c b/net/ipv4/netfilter/ipt_LOG.c index 39fd4c2a2386..b98f7b08b084 100644 --- a/net/ipv4/netfilter/ipt_LOG.c +++ b/net/ipv4/netfilter/ipt_LOG.c | |||
| @@ -428,7 +428,7 @@ ipt_log_target(struct sk_buff **pskb, | |||
| 428 | 428 | ||
| 429 | if (loginfo->logflags & IPT_LOG_NFLOG) | 429 | if (loginfo->logflags & IPT_LOG_NFLOG) |
| 430 | nf_log_packet(PF_INET, hooknum, *pskb, in, out, &li, | 430 | nf_log_packet(PF_INET, hooknum, *pskb, in, out, &li, |
| 431 | loginfo->prefix); | 431 | "%s", loginfo->prefix); |
| 432 | else | 432 | else |
| 433 | ipt_log_packet(PF_INET, hooknum, *pskb, in, out, &li, | 433 | ipt_log_packet(PF_INET, hooknum, *pskb, in, out, &li, |
| 434 | loginfo->prefix); | 434 | loginfo->prefix); |
diff --git a/net/ipv4/netfilter/ipt_recent.c b/net/ipv4/netfilter/ipt_recent.c index 143843285702..b847ee409efb 100644 --- a/net/ipv4/netfilter/ipt_recent.c +++ b/net/ipv4/netfilter/ipt_recent.c | |||
| @@ -821,6 +821,7 @@ checkentry(const char *tablename, | |||
| 821 | /* Create our proc 'status' entry. */ | 821 | /* Create our proc 'status' entry. */ |
| 822 | curr_table->status_proc = create_proc_entry(curr_table->name, ip_list_perms, proc_net_ipt_recent); | 822 | curr_table->status_proc = create_proc_entry(curr_table->name, ip_list_perms, proc_net_ipt_recent); |
| 823 | if (!curr_table->status_proc) { | 823 | if (!curr_table->status_proc) { |
| 824 | vfree(hold); | ||
| 824 | printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for /proc entry.\n"); | 825 | printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for /proc entry.\n"); |
| 825 | /* Destroy the created table */ | 826 | /* Destroy the created table */ |
| 826 | spin_lock_bh(&recent_lock); | 827 | spin_lock_bh(&recent_lock); |
| @@ -845,7 +846,6 @@ checkentry(const char *tablename, | |||
| 845 | spin_unlock_bh(&recent_lock); | 846 | spin_unlock_bh(&recent_lock); |
| 846 | vfree(curr_table->time_info); | 847 | vfree(curr_table->time_info); |
| 847 | vfree(curr_table->hash_table); | 848 | vfree(curr_table->hash_table); |
| 848 | vfree(hold); | ||
| 849 | vfree(curr_table->table); | 849 | vfree(curr_table->table); |
| 850 | vfree(curr_table); | 850 | vfree(curr_table); |
| 851 | return 0; | 851 | return 0; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9f0cca4c4fae..4a538bc1683d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1662,6 +1662,8 @@ static void tcp_update_scoreboard(struct sock *sk, struct tcp_sock *tp) | |||
| 1662 | if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) { | 1662 | if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) { |
| 1663 | TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; | 1663 | TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; |
| 1664 | tp->lost_out += tcp_skb_pcount(skb); | 1664 | tp->lost_out += tcp_skb_pcount(skb); |
| 1665 | if (IsReno(tp)) | ||
| 1666 | tcp_remove_reno_sacks(sk, tp, tcp_skb_pcount(skb) + 1); | ||
| 1665 | 1667 | ||
| 1666 | /* clear xmit_retrans hint */ | 1668 | /* clear xmit_retrans hint */ |
| 1667 | if (tp->retransmit_skb_hint && | 1669 | if (tp->retransmit_skb_hint && |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 0a673038344f..2e72f89a7019 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
| @@ -1103,7 +1103,7 @@ do_add_counters(void __user *user, unsigned int len) | |||
| 1103 | 1103 | ||
| 1104 | write_lock_bh(&t->lock); | 1104 | write_lock_bh(&t->lock); |
| 1105 | private = t->private; | 1105 | private = t->private; |
| 1106 | if (private->number != paddc->num_counters) { | 1106 | if (private->number != tmp.num_counters) { |
| 1107 | ret = -EINVAL; | 1107 | ret = -EINVAL; |
| 1108 | goto unlock_up_free; | 1108 | goto unlock_up_free; |
| 1109 | } | 1109 | } |
diff --git a/net/ipv6/netfilter/ip6t_LOG.c b/net/ipv6/netfilter/ip6t_LOG.c index a96c0de14b00..73c6300109d6 100644 --- a/net/ipv6/netfilter/ip6t_LOG.c +++ b/net/ipv6/netfilter/ip6t_LOG.c | |||
| @@ -439,7 +439,7 @@ ip6t_log_target(struct sk_buff **pskb, | |||
| 439 | 439 | ||
| 440 | if (loginfo->logflags & IP6T_LOG_NFLOG) | 440 | if (loginfo->logflags & IP6T_LOG_NFLOG) |
| 441 | nf_log_packet(PF_INET6, hooknum, *pskb, in, out, &li, | 441 | nf_log_packet(PF_INET6, hooknum, *pskb, in, out, &li, |
| 442 | loginfo->prefix); | 442 | "%s", loginfo->prefix); |
| 443 | else | 443 | else |
| 444 | ip6t_log_packet(PF_INET6, hooknum, *pskb, in, out, &li, | 444 | ip6t_log_packet(PF_INET6, hooknum, *pskb, in, out, &li, |
| 445 | loginfo->prefix); | 445 | loginfo->prefix); |
diff --git a/net/ipv6/netfilter/ip6t_eui64.c b/net/ipv6/netfilter/ip6t_eui64.c index 94dbdb8b458d..4f6b84c8f4ab 100644 --- a/net/ipv6/netfilter/ip6t_eui64.c +++ b/net/ipv6/netfilter/ip6t_eui64.c | |||
| @@ -40,7 +40,7 @@ match(const struct sk_buff *skb, | |||
| 40 | 40 | ||
| 41 | memset(eui64, 0, sizeof(eui64)); | 41 | memset(eui64, 0, sizeof(eui64)); |
| 42 | 42 | ||
| 43 | if (eth_hdr(skb)->h_proto == ntohs(ETH_P_IPV6)) { | 43 | if (eth_hdr(skb)->h_proto == htons(ETH_P_IPV6)) { |
| 44 | if (skb->nh.ipv6h->version == 0x6) { | 44 | if (skb->nh.ipv6h->version == 0x6) { |
| 45 | memcpy(eui64, eth_hdr(skb)->h_source, 3); | 45 | memcpy(eui64, eth_hdr(skb)->h_source, 3); |
| 46 | memcpy(eui64 + 5, eth_hdr(skb)->h_source + 3, 3); | 46 | memcpy(eui64 + 5, eth_hdr(skb)->h_source + 3, 3); |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 2dbf134d5266..811d998725bc 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
| @@ -944,9 +944,9 @@ out: | |||
| 944 | return rc; | 944 | return rc; |
| 945 | } | 945 | } |
| 946 | 946 | ||
| 947 | static int ipx_map_frame_type(unsigned char type) | 947 | static __be16 ipx_map_frame_type(unsigned char type) |
| 948 | { | 948 | { |
| 949 | int rc = 0; | 949 | __be16 rc = 0; |
| 950 | 950 | ||
| 951 | switch (type) { | 951 | switch (type) { |
| 952 | case IPX_FRAME_ETHERII: rc = htons(ETH_P_IPX); break; | 952 | case IPX_FRAME_ETHERII: rc = htons(ETH_P_IPX); break; |
diff --git a/net/ipx/ipx_route.c b/net/ipx/ipx_route.c index 67774448efd9..a394c6fe19a2 100644 --- a/net/ipx/ipx_route.c +++ b/net/ipx/ipx_route.c | |||
| @@ -119,7 +119,7 @@ out: | |||
| 119 | return rc; | 119 | return rc; |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | static int ipxrtr_delete(long net) | 122 | static int ipxrtr_delete(__u32 net) |
| 123 | { | 123 | { |
| 124 | struct ipx_route *r, *tmp; | 124 | struct ipx_route *r, *tmp; |
| 125 | int rc; | 125 | int rc; |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index c60273cad778..61cdda4e5d3b 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
| @@ -321,7 +321,7 @@ static int | |||
| 321 | nfulnl_set_flags(struct nfulnl_instance *inst, u_int16_t flags) | 321 | nfulnl_set_flags(struct nfulnl_instance *inst, u_int16_t flags) |
| 322 | { | 322 | { |
| 323 | spin_lock_bh(&inst->lock); | 323 | spin_lock_bh(&inst->lock); |
| 324 | inst->flags = ntohs(flags); | 324 | inst->flags = flags; |
| 325 | spin_unlock_bh(&inst->lock); | 325 | spin_unlock_bh(&inst->lock); |
| 326 | 326 | ||
| 327 | return 0; | 327 | return 0; |
| @@ -902,7 +902,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, | |||
| 902 | if (nfula[NFULA_CFG_FLAGS-1]) { | 902 | if (nfula[NFULA_CFG_FLAGS-1]) { |
| 903 | u_int16_t flags = | 903 | u_int16_t flags = |
| 904 | *(u_int16_t *)NFA_DATA(nfula[NFULA_CFG_FLAGS-1]); | 904 | *(u_int16_t *)NFA_DATA(nfula[NFULA_CFG_FLAGS-1]); |
| 905 | nfulnl_set_flags(inst, ntohl(flags)); | 905 | nfulnl_set_flags(inst, ntohs(flags)); |
| 906 | } | 906 | } |
| 907 | 907 | ||
| 908 | out_put: | 908 | out_put: |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 31eb83717c26..138ea92ed268 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -193,8 +193,10 @@ static void dev_watchdog(unsigned long arg) | |||
| 193 | netif_running(dev) && | 193 | netif_running(dev) && |
| 194 | netif_carrier_ok(dev)) { | 194 | netif_carrier_ok(dev)) { |
| 195 | if (netif_queue_stopped(dev) && | 195 | if (netif_queue_stopped(dev) && |
| 196 | (jiffies - dev->trans_start) > dev->watchdog_timeo) { | 196 | time_after(jiffies, dev->trans_start + dev->watchdog_timeo)) { |
| 197 | printk(KERN_INFO "NETDEV WATCHDOG: %s: transmit timed out\n", dev->name); | 197 | |
| 198 | printk(KERN_INFO "NETDEV WATCHDOG: %s: transmit timed out\n", | ||
| 199 | dev->name); | ||
| 198 | dev->tx_timeout(dev); | 200 | dev->tx_timeout(dev); |
| 199 | } | 201 | } |
| 200 | if (!mod_timer(&dev->watchdog_timer, jiffies + dev->watchdog_timeo)) | 202 | if (!mod_timer(&dev->watchdog_timer, jiffies + dev->watchdog_timeo)) |
