diff options
88 files changed, 717 insertions, 334 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index dd1a6d4bb747..7936b801fe6a 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -1115,6 +1115,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1115 | libata.dma=4 Compact Flash DMA only | 1115 | libata.dma=4 Compact Flash DMA only |
| 1116 | Combinations also work, so libata.dma=3 enables DMA | 1116 | Combinations also work, so libata.dma=3 enables DMA |
| 1117 | for disks and CDROMs, but not CFs. | 1117 | for disks and CDROMs, but not CFs. |
| 1118 | |||
| 1119 | libata.ignore_hpa= [LIBATA] Ignore HPA limit | ||
| 1120 | libata.ignore_hpa=0 keep BIOS limits (default) | ||
| 1121 | libata.ignore_hpa=1 ignore limits, using full disk | ||
| 1118 | 1122 | ||
| 1119 | libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume | 1123 | libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume |
| 1120 | when set. | 1124 | when set. |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index 58a7e46affda..e7cbaa02cd0b 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
| @@ -41,11 +41,6 @@ $(error Sorry, you need a newer version of the assember, one that is built from | |||
| 41 | ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz) | 41 | ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz) |
| 42 | endif | 42 | endif |
| 43 | 43 | ||
| 44 | ifeq ($(call cc-version),0304) | ||
| 45 | cflags-$(CONFIG_ITANIUM) += -mtune=merced | ||
| 46 | cflags-$(CONFIG_MCKINLEY) += -mtune=mckinley | ||
| 47 | endif | ||
| 48 | |||
| 49 | KBUILD_CFLAGS += $(cflags-y) | 44 | KBUILD_CFLAGS += $(cflags-y) |
| 50 | head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o | 45 | head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o |
| 51 | 46 | ||
diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h index e2ca80037335..57a2787bc9fb 100644 --- a/arch/ia64/include/asm/bitops.h +++ b/arch/ia64/include/asm/bitops.h | |||
| @@ -286,7 +286,7 @@ __test_and_clear_bit(int nr, volatile void * addr) | |||
| 286 | { | 286 | { |
| 287 | __u32 *p = (__u32 *) addr + (nr >> 5); | 287 | __u32 *p = (__u32 *) addr + (nr >> 5); |
| 288 | __u32 m = 1 << (nr & 31); | 288 | __u32 m = 1 << (nr & 31); |
| 289 | int oldbitset = *p & m; | 289 | int oldbitset = (*p & m) != 0; |
| 290 | 290 | ||
| 291 | *p &= ~m; | 291 | *p &= ~m; |
| 292 | return oldbitset; | 292 | return oldbitset; |
diff --git a/arch/ia64/include/asm/pgtable.h b/arch/ia64/include/asm/pgtable.h index 0a9cc73d35c7..8840a690d1e7 100644 --- a/arch/ia64/include/asm/pgtable.h +++ b/arch/ia64/include/asm/pgtable.h | |||
| @@ -155,7 +155,6 @@ | |||
| 155 | #include <linux/bitops.h> | 155 | #include <linux/bitops.h> |
| 156 | #include <asm/cacheflush.h> | 156 | #include <asm/cacheflush.h> |
| 157 | #include <asm/mmu_context.h> | 157 | #include <asm/mmu_context.h> |
| 158 | #include <asm/processor.h> | ||
| 159 | 158 | ||
| 160 | /* | 159 | /* |
| 161 | * Next come the mappings that determine how mmap() protection bits | 160 | * Next come the mappings that determine how mmap() protection bits |
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c index 2d311864e359..8ebccb589e1c 100644 --- a/arch/ia64/kernel/ia64_ksyms.c +++ b/arch/ia64/kernel/ia64_ksyms.c | |||
| @@ -21,6 +21,7 @@ EXPORT_SYMBOL(csum_ipv6_magic); | |||
| 21 | 21 | ||
| 22 | #include <asm/page.h> | 22 | #include <asm/page.h> |
| 23 | EXPORT_SYMBOL(clear_page); | 23 | EXPORT_SYMBOL(clear_page); |
| 24 | EXPORT_SYMBOL(copy_page); | ||
| 24 | 25 | ||
| 25 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 26 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
| 26 | #include <linux/bootmem.h> | 27 | #include <linux/bootmem.h> |
| @@ -60,9 +61,6 @@ EXPORT_SYMBOL(__udivdi3); | |||
| 60 | EXPORT_SYMBOL(__moddi3); | 61 | EXPORT_SYMBOL(__moddi3); |
| 61 | EXPORT_SYMBOL(__umoddi3); | 62 | EXPORT_SYMBOL(__umoddi3); |
| 62 | 63 | ||
| 63 | #include <asm/page.h> | ||
| 64 | EXPORT_SYMBOL(copy_page); | ||
| 65 | |||
| 66 | #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) | 64 | #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) |
| 67 | extern void xor_ia64_2(void); | 65 | extern void xor_ia64_2(void); |
| 68 | extern void xor_ia64_3(void); | 66 | extern void xor_ia64_3(void); |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index c48b03f2b61d..dab4d393908c 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -1072,6 +1072,10 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base) | |||
| 1072 | } | 1072 | } |
| 1073 | 1073 | ||
| 1074 | addr = ioremap(phys_addr, 0); | 1074 | addr = ioremap(phys_addr, 0); |
| 1075 | if (addr == NULL) { | ||
| 1076 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
| 1077 | return -ENOMEM; | ||
| 1078 | } | ||
| 1075 | ver = iosapic_version(addr); | 1079 | ver = iosapic_version(addr); |
| 1076 | if ((err = iosapic_check_gsi_range(gsi_base, ver))) { | 1080 | if ((err = iosapic_check_gsi_range(gsi_base, ver))) { |
| 1077 | iounmap(addr); | 1081 | iounmap(addr); |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index 05695962fe44..f6b1ff0aea76 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
| @@ -69,11 +69,6 @@ iommu_dma_init(void) | |||
| 69 | 69 | ||
| 70 | int iommu_dma_supported(struct device *dev, u64 mask) | 70 | int iommu_dma_supported(struct device *dev, u64 mask) |
| 71 | { | 71 | { |
| 72 | struct dma_map_ops *ops = platform_dma_get_ops(dev); | ||
| 73 | |||
| 74 | if (ops->dma_supported) | ||
| 75 | return ops->dma_supported(dev, mask); | ||
| 76 | |||
| 77 | /* Copied from i386. Doesn't make much sense, because it will | 72 | /* Copied from i386. Doesn't make much sense, because it will |
| 78 | only work for pci_alloc_coherent. | 73 | only work for pci_alloc_coherent. |
| 79 | The caller just has to use GFP_DMA in this case. */ | 74 | The caller just has to use GFP_DMA in this case. */ |
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index bc80dff1df7a..8f060352e129 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c | |||
| @@ -372,6 +372,10 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | |||
| 372 | retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj, | 372 | retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj, |
| 373 | &cache_ktype_percpu_entry, &sys_dev->kobj, | 373 | &cache_ktype_percpu_entry, &sys_dev->kobj, |
| 374 | "%s", "cache"); | 374 | "%s", "cache"); |
| 375 | if (unlikely(retval < 0)) { | ||
| 376 | cpu_cache_sysfs_exit(cpu); | ||
| 377 | return retval; | ||
| 378 | } | ||
| 375 | 379 | ||
| 376 | for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) { | 380 | for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) { |
| 377 | this_object = LEAF_KOBJECT_PTR(cpu,i); | 381 | this_object = LEAF_KOBJECT_PTR(cpu,i); |
| @@ -385,7 +389,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | |||
| 385 | } | 389 | } |
| 386 | kobject_put(&all_cpu_cache_info[cpu].kobj); | 390 | kobject_put(&all_cpu_cache_info[cpu].kobj); |
| 387 | cpu_cache_sysfs_exit(cpu); | 391 | cpu_cache_sysfs_exit(cpu); |
| 388 | break; | 392 | return retval; |
| 389 | } | 393 | } |
| 390 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); | 394 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); |
| 391 | } | 395 | } |
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 7ffd1b4315bd..b9c88cc519e2 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
| @@ -547,7 +547,7 @@ static int __init ap325rxa_devices_setup(void) | |||
| 547 | return platform_add_devices(ap325rxa_devices, | 547 | return platform_add_devices(ap325rxa_devices, |
| 548 | ARRAY_SIZE(ap325rxa_devices)); | 548 | ARRAY_SIZE(ap325rxa_devices)); |
| 549 | } | 549 | } |
| 550 | device_initcall(ap325rxa_devices_setup); | 550 | arch_initcall(ap325rxa_devices_setup); |
| 551 | 551 | ||
| 552 | /* Return the board specific boot mode pin configuration */ | 552 | /* Return the board specific boot mode pin configuration */ |
| 553 | static int ap325rxa_mode_pins(void) | 553 | static int ap325rxa_mode_pins(void) |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index f70f4644deb4..f9b2e4df35b9 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
| @@ -608,7 +608,7 @@ static int __init migor_devices_setup(void) | |||
| 608 | 608 | ||
| 609 | return platform_add_devices(migor_devices, ARRAY_SIZE(migor_devices)); | 609 | return platform_add_devices(migor_devices, ARRAY_SIZE(migor_devices)); |
| 610 | } | 610 | } |
| 611 | __initcall(migor_devices_setup); | 611 | arch_initcall(migor_devices_setup); |
| 612 | 612 | ||
| 613 | /* Return the board specific boot mode pin configuration */ | 613 | /* Return the board specific boot mode pin configuration */ |
| 614 | static int migor_mode_pins(void) | 614 | static int migor_mode_pins(void) |
diff --git a/arch/sh/kernel/cpu/sh2/setup-sh7619.c b/arch/sh/kernel/cpu/sh2/setup-sh7619.c index 13798733f2db..8555c05e8667 100644 --- a/arch/sh/kernel/cpu/sh2/setup-sh7619.c +++ b/arch/sh/kernel/cpu/sh2/setup-sh7619.c | |||
| @@ -187,7 +187,7 @@ static int __init sh7619_devices_setup(void) | |||
| 187 | return platform_add_devices(sh7619_devices, | 187 | return platform_add_devices(sh7619_devices, |
| 188 | ARRAY_SIZE(sh7619_devices)); | 188 | ARRAY_SIZE(sh7619_devices)); |
| 189 | } | 189 | } |
| 190 | __initcall(sh7619_devices_setup); | 190 | arch_initcall(sh7619_devices_setup); |
| 191 | 191 | ||
| 192 | void __init plat_irq_setup(void) | 192 | void __init plat_irq_setup(void) |
| 193 | { | 193 | { |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-mxg.c b/arch/sh/kernel/cpu/sh2a/setup-mxg.c index 869c2da4820b..b67376445315 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-mxg.c +++ b/arch/sh/kernel/cpu/sh2a/setup-mxg.c | |||
| @@ -238,7 +238,7 @@ static int __init mxg_devices_setup(void) | |||
| 238 | return platform_add_devices(mxg_devices, | 238 | return platform_add_devices(mxg_devices, |
| 239 | ARRAY_SIZE(mxg_devices)); | 239 | ARRAY_SIZE(mxg_devices)); |
| 240 | } | 240 | } |
| 241 | __initcall(mxg_devices_setup); | 241 | arch_initcall(mxg_devices_setup); |
| 242 | 242 | ||
| 243 | void __init plat_irq_setup(void) | 243 | void __init plat_irq_setup(void) |
| 244 | { | 244 | { |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7201.c b/arch/sh/kernel/cpu/sh2a/setup-sh7201.c index d8febe128066..fbde5b75deb9 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7201.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7201.c | |||
| @@ -357,7 +357,7 @@ static int __init sh7201_devices_setup(void) | |||
| 357 | return platform_add_devices(sh7201_devices, | 357 | return platform_add_devices(sh7201_devices, |
| 358 | ARRAY_SIZE(sh7201_devices)); | 358 | ARRAY_SIZE(sh7201_devices)); |
| 359 | } | 359 | } |
| 360 | __initcall(sh7201_devices_setup); | 360 | arch_initcall(sh7201_devices_setup); |
| 361 | 361 | ||
| 362 | void __init plat_irq_setup(void) | 362 | void __init plat_irq_setup(void) |
| 363 | { | 363 | { |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c index 62e3039d2398..d3fd536c9a84 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c | |||
| @@ -367,7 +367,7 @@ static int __init sh7203_devices_setup(void) | |||
| 367 | return platform_add_devices(sh7203_devices, | 367 | return platform_add_devices(sh7203_devices, |
| 368 | ARRAY_SIZE(sh7203_devices)); | 368 | ARRAY_SIZE(sh7203_devices)); |
| 369 | } | 369 | } |
| 370 | __initcall(sh7203_devices_setup); | 370 | arch_initcall(sh7203_devices_setup); |
| 371 | 371 | ||
| 372 | void __init plat_irq_setup(void) | 372 | void __init plat_irq_setup(void) |
| 373 | { | 373 | { |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c index 3e6f3d7a58be..a9ccc5e8d9e9 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c | |||
| @@ -338,7 +338,7 @@ static int __init sh7206_devices_setup(void) | |||
| 338 | return platform_add_devices(sh7206_devices, | 338 | return platform_add_devices(sh7206_devices, |
| 339 | ARRAY_SIZE(sh7206_devices)); | 339 | ARRAY_SIZE(sh7206_devices)); |
| 340 | } | 340 | } |
| 341 | __initcall(sh7206_devices_setup); | 341 | arch_initcall(sh7206_devices_setup); |
| 342 | 342 | ||
| 343 | void __init plat_irq_setup(void) | 343 | void __init plat_irq_setup(void) |
| 344 | { | 344 | { |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7705.c b/arch/sh/kernel/cpu/sh3/setup-sh7705.c index 88f742fed9ed..c23105983878 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7705.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7705.c | |||
| @@ -222,7 +222,7 @@ static int __init sh7705_devices_setup(void) | |||
| 222 | return platform_add_devices(sh7705_devices, | 222 | return platform_add_devices(sh7705_devices, |
| 223 | ARRAY_SIZE(sh7705_devices)); | 223 | ARRAY_SIZE(sh7705_devices)); |
| 224 | } | 224 | } |
| 225 | __initcall(sh7705_devices_setup); | 225 | arch_initcall(sh7705_devices_setup); |
| 226 | 226 | ||
| 227 | static struct platform_device *sh7705_early_devices[] __initdata = { | 227 | static struct platform_device *sh7705_early_devices[] __initdata = { |
| 228 | &tmu0_device, | 228 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh770x.c b/arch/sh/kernel/cpu/sh3/setup-sh770x.c index c56306798584..347ab35d0697 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh770x.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh770x.c | |||
| @@ -250,7 +250,7 @@ static int __init sh770x_devices_setup(void) | |||
| 250 | return platform_add_devices(sh770x_devices, | 250 | return platform_add_devices(sh770x_devices, |
| 251 | ARRAY_SIZE(sh770x_devices)); | 251 | ARRAY_SIZE(sh770x_devices)); |
| 252 | } | 252 | } |
| 253 | __initcall(sh770x_devices_setup); | 253 | arch_initcall(sh770x_devices_setup); |
| 254 | 254 | ||
| 255 | static struct platform_device *sh770x_early_devices[] __initdata = { | 255 | static struct platform_device *sh770x_early_devices[] __initdata = { |
| 256 | &tmu0_device, | 256 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7710.c b/arch/sh/kernel/cpu/sh3/setup-sh7710.c index efa76c8148f4..717e90ae1097 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7710.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7710.c | |||
| @@ -226,7 +226,7 @@ static int __init sh7710_devices_setup(void) | |||
| 226 | return platform_add_devices(sh7710_devices, | 226 | return platform_add_devices(sh7710_devices, |
| 227 | ARRAY_SIZE(sh7710_devices)); | 227 | ARRAY_SIZE(sh7710_devices)); |
| 228 | } | 228 | } |
| 229 | __initcall(sh7710_devices_setup); | 229 | arch_initcall(sh7710_devices_setup); |
| 230 | 230 | ||
| 231 | static struct platform_device *sh7710_early_devices[] __initdata = { | 231 | static struct platform_device *sh7710_early_devices[] __initdata = { |
| 232 | &tmu0_device, | 232 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7720.c b/arch/sh/kernel/cpu/sh3/setup-sh7720.c index 5b2107798edb..74d8baaf8e96 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7720.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7720.c | |||
| @@ -388,7 +388,7 @@ static int __init sh7720_devices_setup(void) | |||
| 388 | return platform_add_devices(sh7720_devices, | 388 | return platform_add_devices(sh7720_devices, |
| 389 | ARRAY_SIZE(sh7720_devices)); | 389 | ARRAY_SIZE(sh7720_devices)); |
| 390 | } | 390 | } |
| 391 | __initcall(sh7720_devices_setup); | 391 | arch_initcall(sh7720_devices_setup); |
| 392 | 392 | ||
| 393 | static struct platform_device *sh7720_early_devices[] __initdata = { | 393 | static struct platform_device *sh7720_early_devices[] __initdata = { |
| 394 | &cmt0_device, | 394 | &cmt0_device, |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c index 6d088d123591..de4827df19aa 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c | |||
| @@ -138,7 +138,7 @@ static int __init sh4202_devices_setup(void) | |||
| 138 | return platform_add_devices(sh4202_devices, | 138 | return platform_add_devices(sh4202_devices, |
| 139 | ARRAY_SIZE(sh4202_devices)); | 139 | ARRAY_SIZE(sh4202_devices)); |
| 140 | } | 140 | } |
| 141 | __initcall(sh4202_devices_setup); | 141 | arch_initcall(sh4202_devices_setup); |
| 142 | 142 | ||
| 143 | static struct platform_device *sh4202_early_devices[] __initdata = { | 143 | static struct platform_device *sh4202_early_devices[] __initdata = { |
| 144 | &tmu0_device, | 144 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index 851672d15cf4..1b8b122e8f3d 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
| @@ -239,7 +239,7 @@ static int __init sh7750_devices_setup(void) | |||
| 239 | return platform_add_devices(sh7750_devices, | 239 | return platform_add_devices(sh7750_devices, |
| 240 | ARRAY_SIZE(sh7750_devices)); | 240 | ARRAY_SIZE(sh7750_devices)); |
| 241 | } | 241 | } |
| 242 | __initcall(sh7750_devices_setup); | 242 | arch_initcall(sh7750_devices_setup); |
| 243 | 243 | ||
| 244 | static struct platform_device *sh7750_early_devices[] __initdata = { | 244 | static struct platform_device *sh7750_early_devices[] __initdata = { |
| 245 | &tmu0_device, | 245 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7760.c b/arch/sh/kernel/cpu/sh4/setup-sh7760.c index 5b822519bd90..7fbb7be9284c 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7760.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7760.c | |||
| @@ -265,7 +265,7 @@ static int __init sh7760_devices_setup(void) | |||
| 265 | return platform_add_devices(sh7760_devices, | 265 | return platform_add_devices(sh7760_devices, |
| 266 | ARRAY_SIZE(sh7760_devices)); | 266 | ARRAY_SIZE(sh7760_devices)); |
| 267 | } | 267 | } |
| 268 | __initcall(sh7760_devices_setup); | 268 | arch_initcall(sh7760_devices_setup); |
| 269 | 269 | ||
| 270 | static struct platform_device *sh7760_early_devices[] __initdata = { | 270 | static struct platform_device *sh7760_early_devices[] __initdata = { |
| 271 | &tmu0_device, | 271 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7343.c b/arch/sh/kernel/cpu/sh4a/setup-sh7343.c index 6307e087c864..ac4d5672ec1a 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7343.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7343.c | |||
| @@ -325,7 +325,7 @@ static int __init sh7343_devices_setup(void) | |||
| 325 | return platform_add_devices(sh7343_devices, | 325 | return platform_add_devices(sh7343_devices, |
| 326 | ARRAY_SIZE(sh7343_devices)); | 326 | ARRAY_SIZE(sh7343_devices)); |
| 327 | } | 327 | } |
| 328 | __initcall(sh7343_devices_setup); | 328 | arch_initcall(sh7343_devices_setup); |
| 329 | 329 | ||
| 330 | static struct platform_device *sh7343_early_devices[] __initdata = { | 330 | static struct platform_device *sh7343_early_devices[] __initdata = { |
| 331 | &cmt_device, | 331 | &cmt_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c index c18f7d09281b..1a956b1beccc 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c | |||
| @@ -318,7 +318,7 @@ static int __init sh7366_devices_setup(void) | |||
| 318 | return platform_add_devices(sh7366_devices, | 318 | return platform_add_devices(sh7366_devices, |
| 319 | ARRAY_SIZE(sh7366_devices)); | 319 | ARRAY_SIZE(sh7366_devices)); |
| 320 | } | 320 | } |
| 321 | __initcall(sh7366_devices_setup); | 321 | arch_initcall(sh7366_devices_setup); |
| 322 | 322 | ||
| 323 | static struct platform_device *sh7366_early_devices[] __initdata = { | 323 | static struct platform_device *sh7366_early_devices[] __initdata = { |
| 324 | &cmt_device, | 324 | &cmt_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c index ea524a2da3e4..cda76ebf87c3 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c | |||
| @@ -359,7 +359,7 @@ static int __init sh7722_devices_setup(void) | |||
| 359 | return platform_add_devices(sh7722_devices, | 359 | return platform_add_devices(sh7722_devices, |
| 360 | ARRAY_SIZE(sh7722_devices)); | 360 | ARRAY_SIZE(sh7722_devices)); |
| 361 | } | 361 | } |
| 362 | __initcall(sh7722_devices_setup); | 362 | arch_initcall(sh7722_devices_setup); |
| 363 | 363 | ||
| 364 | static struct platform_device *sh7722_early_devices[] __initdata = { | 364 | static struct platform_device *sh7722_early_devices[] __initdata = { |
| 365 | &cmt_device, | 365 | &cmt_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index e1bb80b2a27b..b45dace9539f 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
| @@ -473,7 +473,7 @@ static int __init sh7723_devices_setup(void) | |||
| 473 | return platform_add_devices(sh7723_devices, | 473 | return platform_add_devices(sh7723_devices, |
| 474 | ARRAY_SIZE(sh7723_devices)); | 474 | ARRAY_SIZE(sh7723_devices)); |
| 475 | } | 475 | } |
| 476 | __initcall(sh7723_devices_setup); | 476 | arch_initcall(sh7723_devices_setup); |
| 477 | 477 | ||
| 478 | static struct platform_device *sh7723_early_devices[] __initdata = { | 478 | static struct platform_device *sh7723_early_devices[] __initdata = { |
| 479 | &cmt_device, | 479 | &cmt_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c index e5ac9eb11c63..a04edaab9a29 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7724.c | |||
| @@ -508,7 +508,7 @@ static int __init sh7724_devices_setup(void) | |||
| 508 | return platform_add_devices(sh7724_devices, | 508 | return platform_add_devices(sh7724_devices, |
| 509 | ARRAY_SIZE(sh7724_devices)); | 509 | ARRAY_SIZE(sh7724_devices)); |
| 510 | } | 510 | } |
| 511 | device_initcall(sh7724_devices_setup); | 511 | arch_initcall(sh7724_devices_setup); |
| 512 | 512 | ||
| 513 | static struct platform_device *sh7724_early_devices[] __initdata = { | 513 | static struct platform_device *sh7724_early_devices[] __initdata = { |
| 514 | &cmt_device, | 514 | &cmt_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index f1e0c0d36da7..4659fff6b842 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
| @@ -314,7 +314,7 @@ static int __init sh7763_devices_setup(void) | |||
| 314 | return platform_add_devices(sh7763_devices, | 314 | return platform_add_devices(sh7763_devices, |
| 315 | ARRAY_SIZE(sh7763_devices)); | 315 | ARRAY_SIZE(sh7763_devices)); |
| 316 | } | 316 | } |
| 317 | __initcall(sh7763_devices_setup); | 317 | arch_initcall(sh7763_devices_setup); |
| 318 | 318 | ||
| 319 | static struct platform_device *sh7763_early_devices[] __initdata = { | 319 | static struct platform_device *sh7763_early_devices[] __initdata = { |
| 320 | &tmu0_device, | 320 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7770.c b/arch/sh/kernel/cpu/sh4a/setup-sh7770.c index 1e86209db284..eead08d89d32 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7770.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7770.c | |||
| @@ -368,7 +368,7 @@ static int __init sh7770_devices_setup(void) | |||
| 368 | return platform_add_devices(sh7770_devices, | 368 | return platform_add_devices(sh7770_devices, |
| 369 | ARRAY_SIZE(sh7770_devices)); | 369 | ARRAY_SIZE(sh7770_devices)); |
| 370 | } | 370 | } |
| 371 | __initcall(sh7770_devices_setup); | 371 | arch_initcall(sh7770_devices_setup); |
| 372 | 372 | ||
| 373 | static struct platform_device *sh7770_early_devices[] __initdata = { | 373 | static struct platform_device *sh7770_early_devices[] __initdata = { |
| 374 | &tmu0_device, | 374 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c index 715e05b431e5..2c901f446959 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c | |||
| @@ -256,7 +256,7 @@ static int __init sh7780_devices_setup(void) | |||
| 256 | return platform_add_devices(sh7780_devices, | 256 | return platform_add_devices(sh7780_devices, |
| 257 | ARRAY_SIZE(sh7780_devices)); | 257 | ARRAY_SIZE(sh7780_devices)); |
| 258 | } | 258 | } |
| 259 | __initcall(sh7780_devices_setup); | 259 | arch_initcall(sh7780_devices_setup); |
| 260 | 260 | ||
| 261 | static struct platform_device *sh7780_early_devices[] __initdata = { | 261 | static struct platform_device *sh7780_early_devices[] __initdata = { |
| 262 | &tmu0_device, | 262 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c index af561402570b..7f6c718b6c36 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c | |||
| @@ -263,7 +263,7 @@ static int __init sh7785_devices_setup(void) | |||
| 263 | return platform_add_devices(sh7785_devices, | 263 | return platform_add_devices(sh7785_devices, |
| 264 | ARRAY_SIZE(sh7785_devices)); | 264 | ARRAY_SIZE(sh7785_devices)); |
| 265 | } | 265 | } |
| 266 | __initcall(sh7785_devices_setup); | 266 | arch_initcall(sh7785_devices_setup); |
| 267 | 267 | ||
| 268 | static struct platform_device *sh7785_early_devices[] __initdata = { | 268 | static struct platform_device *sh7785_early_devices[] __initdata = { |
| 269 | &tmu0_device, | 269 | &tmu0_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index b70049470a0b..0104a8ec5369 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
| @@ -547,7 +547,7 @@ static int __init sh7786_devices_setup(void) | |||
| 547 | return platform_add_devices(sh7786_devices, | 547 | return platform_add_devices(sh7786_devices, |
| 548 | ARRAY_SIZE(sh7786_devices)); | 548 | ARRAY_SIZE(sh7786_devices)); |
| 549 | } | 549 | } |
| 550 | device_initcall(sh7786_devices_setup); | 550 | arch_initcall(sh7786_devices_setup); |
| 551 | 551 | ||
| 552 | void __init plat_early_device_setup(void) | 552 | void __init plat_early_device_setup(void) |
| 553 | { | 553 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-shx3.c b/arch/sh/kernel/cpu/sh4a/setup-shx3.c index 53c65fd9ccef..07f078961c71 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/setup-shx3.c | |||
| @@ -256,7 +256,7 @@ static int __init shx3_devices_setup(void) | |||
| 256 | return platform_add_devices(shx3_devices, | 256 | return platform_add_devices(shx3_devices, |
| 257 | ARRAY_SIZE(shx3_devices)); | 257 | ARRAY_SIZE(shx3_devices)); |
| 258 | } | 258 | } |
| 259 | __initcall(shx3_devices_setup); | 259 | arch_initcall(shx3_devices_setup); |
| 260 | 260 | ||
| 261 | void __init plat_early_device_setup(void) | 261 | void __init plat_early_device_setup(void) |
| 262 | { | 262 | { |
diff --git a/arch/sh/kernel/cpu/sh5/setup-sh5.c b/arch/sh/kernel/cpu/sh5/setup-sh5.c index f5ff1ac57fc2..6a0f82f70032 100644 --- a/arch/sh/kernel/cpu/sh5/setup-sh5.c +++ b/arch/sh/kernel/cpu/sh5/setup-sh5.c | |||
| @@ -186,7 +186,7 @@ static int __init sh5_devices_setup(void) | |||
| 186 | return platform_add_devices(sh5_devices, | 186 | return platform_add_devices(sh5_devices, |
| 187 | ARRAY_SIZE(sh5_devices)); | 187 | ARRAY_SIZE(sh5_devices)); |
| 188 | } | 188 | } |
| 189 | __initcall(sh5_devices_setup); | 189 | arch_initcall(sh5_devices_setup); |
| 190 | 190 | ||
| 191 | void __init plat_early_device_setup(void) | 191 | void __init plat_early_device_setup(void) |
| 192 | { | 192 | { |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index e2485b03f1cf..63fddcd082cd 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -400,6 +400,13 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
| 400 | level = cpuid_eax(1); | 400 | level = cpuid_eax(1); |
| 401 | if((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58) | 401 | if((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58) |
| 402 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); | 402 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); |
| 403 | |||
| 404 | /* | ||
| 405 | * Some BIOSes incorrectly force this feature, but only K8 | ||
| 406 | * revision D (model = 0x14) and later actually support it. | ||
| 407 | */ | ||
| 408 | if (c->x86_model < 0x14) | ||
| 409 | clear_cpu_cap(c, X86_FEATURE_LAHF_LM); | ||
| 403 | } | 410 | } |
| 404 | if (c->x86 == 0x10 || c->x86 == 0x11) | 411 | if (c->x86 == 0x10 || c->x86 == 0x11) |
| 405 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); | 412 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index f1961c07af9a..5ce60a88027b 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -59,7 +59,30 @@ void __init setup_cpu_local_masks(void) | |||
| 59 | alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask); | 59 | alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static const struct cpu_dev *this_cpu __cpuinitdata; | 62 | static void __cpuinit default_init(struct cpuinfo_x86 *c) |
| 63 | { | ||
| 64 | #ifdef CONFIG_X86_64 | ||
| 65 | display_cacheinfo(c); | ||
| 66 | #else | ||
| 67 | /* Not much we can do here... */ | ||
| 68 | /* Check if at least it has cpuid */ | ||
| 69 | if (c->cpuid_level == -1) { | ||
| 70 | /* No cpuid. It must be an ancient CPU */ | ||
| 71 | if (c->x86 == 4) | ||
| 72 | strcpy(c->x86_model_id, "486"); | ||
| 73 | else if (c->x86 == 3) | ||
| 74 | strcpy(c->x86_model_id, "386"); | ||
| 75 | } | ||
| 76 | #endif | ||
| 77 | } | ||
| 78 | |||
| 79 | static const struct cpu_dev __cpuinitconst default_cpu = { | ||
| 80 | .c_init = default_init, | ||
| 81 | .c_vendor = "Unknown", | ||
| 82 | .c_x86_vendor = X86_VENDOR_UNKNOWN, | ||
| 83 | }; | ||
| 84 | |||
| 85 | static const struct cpu_dev *this_cpu __cpuinitdata = &default_cpu; | ||
| 63 | 86 | ||
| 64 | DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { | 87 | DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { |
| 65 | #ifdef CONFIG_X86_64 | 88 | #ifdef CONFIG_X86_64 |
| @@ -332,29 +355,6 @@ void switch_to_new_gdt(int cpu) | |||
| 332 | 355 | ||
| 333 | static const struct cpu_dev *__cpuinitdata cpu_devs[X86_VENDOR_NUM] = {}; | 356 | static const struct cpu_dev *__cpuinitdata cpu_devs[X86_VENDOR_NUM] = {}; |
| 334 | 357 | ||
| 335 | static void __cpuinit default_init(struct cpuinfo_x86 *c) | ||
| 336 | { | ||
| 337 | #ifdef CONFIG_X86_64 | ||
| 338 | display_cacheinfo(c); | ||
| 339 | #else | ||
| 340 | /* Not much we can do here... */ | ||
| 341 | /* Check if at least it has cpuid */ | ||
| 342 | if (c->cpuid_level == -1) { | ||
| 343 | /* No cpuid. It must be an ancient CPU */ | ||
| 344 | if (c->x86 == 4) | ||
| 345 | strcpy(c->x86_model_id, "486"); | ||
| 346 | else if (c->x86 == 3) | ||
| 347 | strcpy(c->x86_model_id, "386"); | ||
| 348 | } | ||
| 349 | #endif | ||
| 350 | } | ||
| 351 | |||
| 352 | static const struct cpu_dev __cpuinitconst default_cpu = { | ||
| 353 | .c_init = default_init, | ||
| 354 | .c_vendor = "Unknown", | ||
| 355 | .c_x86_vendor = X86_VENDOR_UNKNOWN, | ||
| 356 | }; | ||
| 357 | |||
| 358 | static void __cpuinit get_model_name(struct cpuinfo_x86 *c) | 358 | static void __cpuinit get_model_name(struct cpuinfo_x86 *c) |
| 359 | { | 359 | { |
| 360 | unsigned int *v; | 360 | unsigned int *v; |
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c index bff8dd191dd5..8bc64cfbe936 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | 36 | ||
| 37 | static DEFINE_PER_CPU(__u64, next_check) = INITIAL_JIFFIES; | 37 | static DEFINE_PER_CPU(__u64, next_check) = INITIAL_JIFFIES; |
| 38 | static DEFINE_PER_CPU(unsigned long, thermal_throttle_count); | 38 | static DEFINE_PER_CPU(unsigned long, thermal_throttle_count); |
| 39 | static DEFINE_PER_CPU(bool, thermal_throttle_active); | ||
| 39 | 40 | ||
| 40 | static atomic_t therm_throt_en = ATOMIC_INIT(0); | 41 | static atomic_t therm_throt_en = ATOMIC_INIT(0); |
| 41 | 42 | ||
| @@ -96,24 +97,27 @@ static int therm_throt_process(int curr) | |||
| 96 | { | 97 | { |
| 97 | unsigned int cpu = smp_processor_id(); | 98 | unsigned int cpu = smp_processor_id(); |
| 98 | __u64 tmp_jiffs = get_jiffies_64(); | 99 | __u64 tmp_jiffs = get_jiffies_64(); |
| 100 | bool was_throttled = __get_cpu_var(thermal_throttle_active); | ||
| 101 | bool is_throttled = __get_cpu_var(thermal_throttle_active) = curr; | ||
| 99 | 102 | ||
| 100 | if (curr) | 103 | if (is_throttled) |
| 101 | __get_cpu_var(thermal_throttle_count)++; | 104 | __get_cpu_var(thermal_throttle_count)++; |
| 102 | 105 | ||
| 103 | if (time_before64(tmp_jiffs, __get_cpu_var(next_check))) | 106 | if (!(was_throttled ^ is_throttled) && |
| 107 | time_before64(tmp_jiffs, __get_cpu_var(next_check))) | ||
| 104 | return 0; | 108 | return 0; |
| 105 | 109 | ||
| 106 | __get_cpu_var(next_check) = tmp_jiffs + CHECK_INTERVAL; | 110 | __get_cpu_var(next_check) = tmp_jiffs + CHECK_INTERVAL; |
| 107 | 111 | ||
| 108 | /* if we just entered the thermal event */ | 112 | /* if we just entered the thermal event */ |
| 109 | if (curr) { | 113 | if (is_throttled) { |
| 110 | printk(KERN_CRIT "CPU%d: Temperature above threshold, " | 114 | printk(KERN_CRIT "CPU%d: Temperature above threshold, " |
| 111 | "cpu clock throttled (total events = %lu)\n", cpu, | 115 | "cpu clock throttled (total events = %lu)\n", |
| 112 | __get_cpu_var(thermal_throttle_count)); | 116 | cpu, __get_cpu_var(thermal_throttle_count)); |
| 113 | 117 | ||
| 114 | add_taint(TAINT_MACHINE_CHECK); | 118 | add_taint(TAINT_MACHINE_CHECK); |
| 115 | } else { | 119 | } else if (was_throttled) { |
| 116 | printk(KERN_CRIT "CPU%d: Temperature/speed normal\n", cpu); | 120 | printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu); |
| 117 | } | 121 | } |
| 118 | 122 | ||
| 119 | return 1; | 123 | return 1; |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 9eb897603705..a06e8d101844 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -418,20 +418,20 @@ static int __init set_pci_reboot(const struct dmi_system_id *d) | |||
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { | 420 | static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { |
| 421 | { /* Handle problems with rebooting on Apple MacBook5,2 */ | 421 | { /* Handle problems with rebooting on Apple MacBook5 */ |
| 422 | .callback = set_pci_reboot, | 422 | .callback = set_pci_reboot, |
| 423 | .ident = "Apple MacBook", | 423 | .ident = "Apple MacBook5", |
| 424 | .matches = { | 424 | .matches = { |
| 425 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | 425 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), |
| 426 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"), | 426 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"), |
| 427 | }, | 427 | }, |
| 428 | }, | 428 | }, |
| 429 | { /* Handle problems with rebooting on Apple MacBookPro5,1 */ | 429 | { /* Handle problems with rebooting on Apple MacBookPro5 */ |
| 430 | .callback = set_pci_reboot, | 430 | .callback = set_pci_reboot, |
| 431 | .ident = "Apple MacBookPro5,1", | 431 | .ident = "Apple MacBookPro5", |
| 432 | .matches = { | 432 | .matches = { |
| 433 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | 433 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), |
| 434 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"), | 434 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"), |
| 435 | }, | 435 | }, |
| 436 | }, | 436 | }, |
| 437 | { } | 437 | { } |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 958c1fa41900..fe3eba5d6b3e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -219,6 +219,8 @@ enum { | |||
| 219 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ | 219 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ |
| 220 | AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */ | 220 | AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */ |
| 221 | AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */ | 221 | AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */ |
| 222 | AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as | ||
| 223 | link offline */ | ||
| 222 | 224 | ||
| 223 | /* ap->flags bits */ | 225 | /* ap->flags bits */ |
| 224 | 226 | ||
| @@ -1663,6 +1665,7 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1663 | int (*check_ready)(struct ata_link *link)) | 1665 | int (*check_ready)(struct ata_link *link)) |
| 1664 | { | 1666 | { |
| 1665 | struct ata_port *ap = link->ap; | 1667 | struct ata_port *ap = link->ap; |
| 1668 | struct ahci_host_priv *hpriv = ap->host->private_data; | ||
| 1666 | const char *reason = NULL; | 1669 | const char *reason = NULL; |
| 1667 | unsigned long now, msecs; | 1670 | unsigned long now, msecs; |
| 1668 | struct ata_taskfile tf; | 1671 | struct ata_taskfile tf; |
| @@ -1701,12 +1704,21 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1701 | 1704 | ||
| 1702 | /* wait for link to become ready */ | 1705 | /* wait for link to become ready */ |
| 1703 | rc = ata_wait_after_reset(link, deadline, check_ready); | 1706 | rc = ata_wait_after_reset(link, deadline, check_ready); |
| 1704 | /* link occupied, -ENODEV too is an error */ | 1707 | if (rc == -EBUSY && hpriv->flags & AHCI_HFLAG_SRST_TOUT_IS_OFFLINE) { |
| 1705 | if (rc) { | 1708 | /* |
| 1709 | * Workaround for cases where link online status can't | ||
| 1710 | * be trusted. Treat device readiness timeout as link | ||
| 1711 | * offline. | ||
| 1712 | */ | ||
| 1713 | ata_link_printk(link, KERN_INFO, | ||
| 1714 | "device not ready, treating as offline\n"); | ||
| 1715 | *class = ATA_DEV_NONE; | ||
| 1716 | } else if (rc) { | ||
| 1717 | /* link occupied, -ENODEV too is an error */ | ||
| 1706 | reason = "device not ready"; | 1718 | reason = "device not ready"; |
| 1707 | goto fail; | 1719 | goto fail; |
| 1708 | } | 1720 | } else |
| 1709 | *class = ahci_dev_classify(ap); | 1721 | *class = ahci_dev_classify(ap); |
| 1710 | 1722 | ||
| 1711 | DPRINTK("EXIT, class=%u\n", *class); | 1723 | DPRINTK("EXIT, class=%u\n", *class); |
| 1712 | return 0; | 1724 | return 0; |
| @@ -1773,7 +1785,8 @@ static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class, | |||
| 1773 | irq_sts = readl(port_mmio + PORT_IRQ_STAT); | 1785 | irq_sts = readl(port_mmio + PORT_IRQ_STAT); |
| 1774 | if (irq_sts & PORT_IRQ_BAD_PMP) { | 1786 | if (irq_sts & PORT_IRQ_BAD_PMP) { |
| 1775 | ata_link_printk(link, KERN_WARNING, | 1787 | ata_link_printk(link, KERN_WARNING, |
| 1776 | "failed due to HW bug, retry pmp=0\n"); | 1788 | "applying SB600 PMP SRST workaround " |
| 1789 | "and retrying\n"); | ||
| 1777 | rc = ahci_do_softreset(link, class, 0, deadline, | 1790 | rc = ahci_do_softreset(link, class, 0, deadline, |
| 1778 | ahci_check_ready); | 1791 | ahci_check_ready); |
| 1779 | } | 1792 | } |
| @@ -2726,6 +2739,56 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
| 2726 | return !ver || strcmp(ver, dmi->driver_data) < 0; | 2739 | return !ver || strcmp(ver, dmi->driver_data) < 0; |
| 2727 | } | 2740 | } |
| 2728 | 2741 | ||
| 2742 | static bool ahci_broken_online(struct pci_dev *pdev) | ||
| 2743 | { | ||
| 2744 | #define ENCODE_BUSDEVFN(bus, slot, func) \ | ||
| 2745 | (void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func))) | ||
| 2746 | static const struct dmi_system_id sysids[] = { | ||
| 2747 | /* | ||
| 2748 | * There are several gigabyte boards which use | ||
| 2749 | * SIMG5723s configured as hardware RAID. Certain | ||
| 2750 | * 5723 firmware revisions shipped there keep the link | ||
| 2751 | * online but fail to answer properly to SRST or | ||
| 2752 | * IDENTIFY when no device is attached downstream | ||
| 2753 | * causing libata to retry quite a few times leading | ||
| 2754 | * to excessive detection delay. | ||
| 2755 | * | ||
| 2756 | * As these firmwares respond to the second reset try | ||
| 2757 | * with invalid device signature, considering unknown | ||
| 2758 | * sig as offline works around the problem acceptably. | ||
| 2759 | */ | ||
| 2760 | { | ||
| 2761 | .ident = "EP45-DQ6", | ||
| 2762 | .matches = { | ||
| 2763 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
| 2764 | "Gigabyte Technology Co., Ltd."), | ||
| 2765 | DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"), | ||
| 2766 | }, | ||
| 2767 | .driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0), | ||
| 2768 | }, | ||
| 2769 | { | ||
| 2770 | .ident = "EP45-DS5", | ||
| 2771 | .matches = { | ||
| 2772 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
| 2773 | "Gigabyte Technology Co., Ltd."), | ||
| 2774 | DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"), | ||
| 2775 | }, | ||
| 2776 | .driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0), | ||
| 2777 | }, | ||
| 2778 | { } /* terminate list */ | ||
| 2779 | }; | ||
| 2780 | #undef ENCODE_BUSDEVFN | ||
| 2781 | const struct dmi_system_id *dmi = dmi_first_match(sysids); | ||
| 2782 | unsigned int val; | ||
| 2783 | |||
| 2784 | if (!dmi) | ||
| 2785 | return false; | ||
| 2786 | |||
| 2787 | val = (unsigned long)dmi->driver_data; | ||
| 2788 | |||
| 2789 | return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff); | ||
| 2790 | } | ||
| 2791 | |||
| 2729 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 2792 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 2730 | { | 2793 | { |
| 2731 | static int printed_version; | 2794 | static int printed_version; |
| @@ -2841,6 +2904,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2841 | "BIOS update required for suspend/resume\n"); | 2904 | "BIOS update required for suspend/resume\n"); |
| 2842 | } | 2905 | } |
| 2843 | 2906 | ||
| 2907 | if (ahci_broken_online(pdev)) { | ||
| 2908 | hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE; | ||
| 2909 | dev_info(&pdev->dev, | ||
| 2910 | "online status unreliable, applying workaround\n"); | ||
| 2911 | } | ||
| 2912 | |||
| 2844 | /* CAP.NP sometimes indicate the index of the last enabled | 2913 | /* CAP.NP sometimes indicate the index of the last enabled |
| 2845 | * port, at other times, that of the last possible port, so | 2914 | * port, at other times, that of the last possible port, so |
| 2846 | * determining the maximum port number requires looking at | 2915 | * determining the maximum port number requires looking at |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 8ac98ff16d7d..072ba5ea138f 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4302,6 +4302,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4302 | { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, | 4302 | { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, |
| 4303 | { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, | 4303 | { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, |
| 4304 | 4304 | ||
| 4305 | /* this one allows HPA unlocking but fails IOs on the area */ | ||
| 4306 | { "OCZ-VERTEX", "1.30", ATA_HORKAGE_BROKEN_HPA }, | ||
| 4307 | |||
| 4305 | /* Devices which report 1 sector over size HPA */ | 4308 | /* Devices which report 1 sector over size HPA */ |
| 4306 | { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, }, | 4309 | { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, }, |
| 4307 | { "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, }, | 4310 | { "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, }, |
diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c index 5702affcb325..41c94b1ae493 100644 --- a/drivers/ata/pata_at91.c +++ b/drivers/ata/pata_at91.c | |||
| @@ -250,7 +250,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 250 | ata_port_desc(ap, "no IRQ, using PIO polling"); | 250 | ata_port_desc(ap, "no IRQ, using PIO polling"); |
| 251 | } | 251 | } |
| 252 | 252 | ||
| 253 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 253 | info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); |
| 254 | 254 | ||
| 255 | if (!info) { | 255 | if (!info) { |
| 256 | dev_err(dev, "failed to allocate memory for private data\n"); | 256 | dev_err(dev, "failed to allocate memory for private data\n"); |
| @@ -275,7 +275,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 275 | if (!info->ide_addr) { | 275 | if (!info->ide_addr) { |
| 276 | dev_err(dev, "failed to map IO base\n"); | 276 | dev_err(dev, "failed to map IO base\n"); |
| 277 | ret = -ENOMEM; | 277 | ret = -ENOMEM; |
| 278 | goto err_ide_ioremap; | 278 | goto err_put; |
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | info->alt_addr = devm_ioremap(dev, | 281 | info->alt_addr = devm_ioremap(dev, |
| @@ -284,7 +284,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 284 | if (!info->alt_addr) { | 284 | if (!info->alt_addr) { |
| 285 | dev_err(dev, "failed to map CTL base\n"); | 285 | dev_err(dev, "failed to map CTL base\n"); |
| 286 | ret = -ENOMEM; | 286 | ret = -ENOMEM; |
| 287 | goto err_alt_ioremap; | 287 | goto err_put; |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | ap->ioaddr.cmd_addr = info->ide_addr; | 290 | ap->ioaddr.cmd_addr = info->ide_addr; |
| @@ -303,13 +303,8 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) | |||
| 303 | irq ? ata_sff_interrupt : NULL, | 303 | irq ? ata_sff_interrupt : NULL, |
| 304 | irq_flags, &pata_at91_sht); | 304 | irq_flags, &pata_at91_sht); |
| 305 | 305 | ||
| 306 | err_alt_ioremap: | 306 | err_put: |
| 307 | devm_iounmap(dev, info->ide_addr); | ||
| 308 | |||
| 309 | err_ide_ioremap: | ||
| 310 | clk_put(info->mck); | 307 | clk_put(info->mck); |
| 311 | kfree(info); | ||
| 312 | |||
| 313 | return ret; | 308 | return ret; |
| 314 | } | 309 | } |
| 315 | 310 | ||
| @@ -317,7 +312,6 @@ static int __devexit pata_at91_remove(struct platform_device *pdev) | |||
| 317 | { | 312 | { |
| 318 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | 313 | struct ata_host *host = dev_get_drvdata(&pdev->dev); |
| 319 | struct at91_ide_info *info; | 314 | struct at91_ide_info *info; |
| 320 | struct device *dev = &pdev->dev; | ||
| 321 | 315 | ||
| 322 | if (!host) | 316 | if (!host) |
| 323 | return 0; | 317 | return 0; |
| @@ -328,11 +322,8 @@ static int __devexit pata_at91_remove(struct platform_device *pdev) | |||
| 328 | if (!info) | 322 | if (!info) |
| 329 | return 0; | 323 | return 0; |
| 330 | 324 | ||
| 331 | devm_iounmap(dev, info->ide_addr); | ||
| 332 | devm_iounmap(dev, info->alt_addr); | ||
| 333 | clk_put(info->mck); | 325 | clk_put(info->mck); |
| 334 | 326 | ||
| 335 | kfree(info); | ||
| 336 | return 0; | 327 | return 0; |
| 337 | } | 328 | } |
| 338 | 329 | ||
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index bec0b8ade66d..45915566e4e9 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_atiixp.c - ATI PATA for new ATA layer | 2 | * pata_atiixp.c - ATI PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * (C) 2009 Bartlomiej Zolnierkiewicz | ||
| 4 | * | 5 | * |
| 5 | * Based on | 6 | * Based on |
| 6 | * | 7 | * |
| @@ -61,20 +62,19 @@ static void atiixp_set_pio_timing(struct ata_port *ap, struct ata_device *adev, | |||
| 61 | 62 | ||
| 62 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 63 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 63 | int dn = 2 * ap->port_no + adev->devno; | 64 | int dn = 2 * ap->port_no + adev->devno; |
| 64 | |||
| 65 | /* Check this is correct - the order is odd in both drivers */ | ||
| 66 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); | 65 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); |
| 67 | u16 pio_mode_data, pio_timing_data; | 66 | u32 pio_timing_data; |
| 67 | u16 pio_mode_data; | ||
| 68 | 68 | ||
| 69 | pci_read_config_word(pdev, ATIIXP_IDE_PIO_MODE, &pio_mode_data); | 69 | pci_read_config_word(pdev, ATIIXP_IDE_PIO_MODE, &pio_mode_data); |
| 70 | pio_mode_data &= ~(0x7 << (4 * dn)); | 70 | pio_mode_data &= ~(0x7 << (4 * dn)); |
| 71 | pio_mode_data |= pio << (4 * dn); | 71 | pio_mode_data |= pio << (4 * dn); |
| 72 | pci_write_config_word(pdev, ATIIXP_IDE_PIO_MODE, pio_mode_data); | 72 | pci_write_config_word(pdev, ATIIXP_IDE_PIO_MODE, pio_mode_data); |
| 73 | 73 | ||
| 74 | pci_read_config_word(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data); | 74 | pci_read_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data); |
| 75 | pio_timing_data &= ~(0xFF << timing_shift); | 75 | pio_timing_data &= ~(0xFF << timing_shift); |
| 76 | pio_timing_data |= (pio_timings[pio] << timing_shift); | 76 | pio_timing_data |= (pio_timings[pio] << timing_shift); |
| 77 | pci_write_config_word(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data); | 77 | pci_write_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | /** | 80 | /** |
| @@ -119,16 +119,17 @@ static void atiixp_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
| 119 | udma_mode_data |= dma << (4 * dn); | 119 | udma_mode_data |= dma << (4 * dn); |
| 120 | pci_write_config_word(pdev, ATIIXP_IDE_UDMA_MODE, udma_mode_data); | 120 | pci_write_config_word(pdev, ATIIXP_IDE_UDMA_MODE, udma_mode_data); |
| 121 | } else { | 121 | } else { |
| 122 | u16 mwdma_timing_data; | ||
| 123 | /* Check this is correct - the order is odd in both drivers */ | ||
| 124 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); | 122 | int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1); |
| 123 | u32 mwdma_timing_data; | ||
| 125 | 124 | ||
| 126 | dma -= XFER_MW_DMA_0; | 125 | dma -= XFER_MW_DMA_0; |
| 127 | 126 | ||
| 128 | pci_read_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, &mwdma_timing_data); | 127 | pci_read_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING, |
| 128 | &mwdma_timing_data); | ||
| 129 | mwdma_timing_data &= ~(0xFF << timing_shift); | 129 | mwdma_timing_data &= ~(0xFF << timing_shift); |
| 130 | mwdma_timing_data |= (mwdma_timings[dma] << timing_shift); | 130 | mwdma_timing_data |= (mwdma_timings[dma] << timing_shift); |
| 131 | pci_write_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, mwdma_timing_data); | 131 | pci_write_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING, |
| 132 | mwdma_timing_data); | ||
| 132 | } | 133 | } |
| 133 | /* | 134 | /* |
| 134 | * We must now look at the PIO mode situation. We may need to | 135 | * We must now look at the PIO mode situation. We may need to |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index b2d11f300c39..86a40582999c 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
| @@ -602,6 +602,7 @@ MODULE_VERSION(DRV_VERSION); | |||
| 602 | 602 | ||
| 603 | static int adma_enabled; | 603 | static int adma_enabled; |
| 604 | static int swncq_enabled = 1; | 604 | static int swncq_enabled = 1; |
| 605 | static int msi_enabled; | ||
| 605 | 606 | ||
| 606 | static void nv_adma_register_mode(struct ata_port *ap) | 607 | static void nv_adma_register_mode(struct ata_port *ap) |
| 607 | { | 608 | { |
| @@ -2459,6 +2460,11 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2459 | } else if (type == SWNCQ) | 2460 | } else if (type == SWNCQ) |
| 2460 | nv_swncq_host_init(host); | 2461 | nv_swncq_host_init(host); |
| 2461 | 2462 | ||
| 2463 | if (msi_enabled) { | ||
| 2464 | dev_printk(KERN_NOTICE, &pdev->dev, "Using MSI\n"); | ||
| 2465 | pci_enable_msi(pdev); | ||
| 2466 | } | ||
| 2467 | |||
| 2462 | pci_set_master(pdev); | 2468 | pci_set_master(pdev); |
| 2463 | return ata_host_activate(host, pdev->irq, ipriv->irq_handler, | 2469 | return ata_host_activate(host, pdev->irq, ipriv->irq_handler, |
| 2464 | IRQF_SHARED, ipriv->sht); | 2470 | IRQF_SHARED, ipriv->sht); |
| @@ -2558,4 +2564,6 @@ module_param_named(adma, adma_enabled, bool, 0444); | |||
| 2558 | MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)"); | 2564 | MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)"); |
| 2559 | module_param_named(swncq, swncq_enabled, bool, 0444); | 2565 | module_param_named(swncq, swncq_enabled, bool, 0444); |
| 2560 | MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)"); | 2566 | MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)"); |
| 2567 | module_param_named(msi, msi_enabled, bool, 0444); | ||
| 2568 | MODULE_PARM_DESC(msi, "Enable use of MSI (Default: false)"); | ||
| 2561 | 2569 | ||
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 81cb01bfc356..456594bd97bc 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -483,9 +483,6 @@ int platform_driver_register(struct platform_driver *drv) | |||
| 483 | drv->driver.remove = platform_drv_remove; | 483 | drv->driver.remove = platform_drv_remove; |
| 484 | if (drv->shutdown) | 484 | if (drv->shutdown) |
| 485 | drv->driver.shutdown = platform_drv_shutdown; | 485 | drv->driver.shutdown = platform_drv_shutdown; |
| 486 | if (drv->suspend || drv->resume) | ||
| 487 | pr_warning("Platform driver '%s' needs updating - please use " | ||
| 488 | "dev_pm_ops\n", drv->driver.name); | ||
| 489 | 486 | ||
| 490 | return driver_register(&drv->driver); | 487 | return driver_register(&drv->driver); |
| 491 | } | 488 | } |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 5b98bea4ff9b..103f2d33fa89 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -359,6 +359,7 @@ static mddev_t * mddev_find(dev_t unit) | |||
| 359 | else | 359 | else |
| 360 | new->md_minor = MINOR(unit) >> MdpMinorShift; | 360 | new->md_minor = MINOR(unit) >> MdpMinorShift; |
| 361 | 361 | ||
| 362 | mutex_init(&new->open_mutex); | ||
| 362 | mutex_init(&new->reconfig_mutex); | 363 | mutex_init(&new->reconfig_mutex); |
| 363 | INIT_LIST_HEAD(&new->disks); | 364 | INIT_LIST_HEAD(&new->disks); |
| 364 | INIT_LIST_HEAD(&new->all_mddevs); | 365 | INIT_LIST_HEAD(&new->all_mddevs); |
| @@ -1974,17 +1975,14 @@ repeat: | |||
| 1974 | /* otherwise we have to go forward and ... */ | 1975 | /* otherwise we have to go forward and ... */ |
| 1975 | mddev->events ++; | 1976 | mddev->events ++; |
| 1976 | if (!mddev->in_sync || mddev->recovery_cp != MaxSector) { /* not clean */ | 1977 | if (!mddev->in_sync || mddev->recovery_cp != MaxSector) { /* not clean */ |
| 1977 | /* .. if the array isn't clean, insist on an odd 'events' */ | 1978 | /* .. if the array isn't clean, an 'even' event must also go |
| 1978 | if ((mddev->events&1)==0) { | 1979 | * to spares. */ |
| 1979 | mddev->events++; | 1980 | if ((mddev->events&1)==0) |
| 1980 | nospares = 0; | 1981 | nospares = 0; |
| 1981 | } | ||
| 1982 | } else { | 1982 | } else { |
| 1983 | /* otherwise insist on an even 'events' (for clean states) */ | 1983 | /* otherwise an 'odd' event must go to spares */ |
| 1984 | if ((mddev->events&1)) { | 1984 | if ((mddev->events&1)) |
| 1985 | mddev->events++; | ||
| 1986 | nospares = 0; | 1985 | nospares = 0; |
| 1987 | } | ||
| 1988 | } | 1986 | } |
| 1989 | } | 1987 | } |
| 1990 | 1988 | ||
| @@ -3601,6 +3599,7 @@ max_sync_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3601 | if (max < mddev->resync_min) | 3599 | if (max < mddev->resync_min) |
| 3602 | return -EINVAL; | 3600 | return -EINVAL; |
| 3603 | if (max < mddev->resync_max && | 3601 | if (max < mddev->resync_max && |
| 3602 | mddev->ro == 0 && | ||
| 3604 | test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) | 3603 | test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) |
| 3605 | return -EBUSY; | 3604 | return -EBUSY; |
| 3606 | 3605 | ||
| @@ -4304,12 +4303,11 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4304 | struct gendisk *disk = mddev->gendisk; | 4303 | struct gendisk *disk = mddev->gendisk; |
| 4305 | mdk_rdev_t *rdev; | 4304 | mdk_rdev_t *rdev; |
| 4306 | 4305 | ||
| 4306 | mutex_lock(&mddev->open_mutex); | ||
| 4307 | if (atomic_read(&mddev->openers) > is_open) { | 4307 | if (atomic_read(&mddev->openers) > is_open) { |
| 4308 | printk("md: %s still in use.\n",mdname(mddev)); | 4308 | printk("md: %s still in use.\n",mdname(mddev)); |
| 4309 | return -EBUSY; | 4309 | err = -EBUSY; |
| 4310 | } | 4310 | } else if (mddev->pers) { |
| 4311 | |||
| 4312 | if (mddev->pers) { | ||
| 4313 | 4311 | ||
| 4314 | if (mddev->sync_thread) { | 4312 | if (mddev->sync_thread) { |
| 4315 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 4313 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| @@ -4367,7 +4365,10 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4367 | set_disk_ro(disk, 1); | 4365 | set_disk_ro(disk, 1); |
| 4368 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 4366 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 4369 | } | 4367 | } |
| 4370 | 4368 | out: | |
| 4369 | mutex_unlock(&mddev->open_mutex); | ||
| 4370 | if (err) | ||
| 4371 | return err; | ||
| 4371 | /* | 4372 | /* |
| 4372 | * Free resources if final stop | 4373 | * Free resources if final stop |
| 4373 | */ | 4374 | */ |
| @@ -4433,7 +4434,6 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4433 | blk_integrity_unregister(disk); | 4434 | blk_integrity_unregister(disk); |
| 4434 | md_new_event(mddev); | 4435 | md_new_event(mddev); |
| 4435 | sysfs_notify_dirent(mddev->sysfs_state); | 4436 | sysfs_notify_dirent(mddev->sysfs_state); |
| 4436 | out: | ||
| 4437 | return err; | 4437 | return err; |
| 4438 | } | 4438 | } |
| 4439 | 4439 | ||
| @@ -5518,12 +5518,12 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
| 5518 | } | 5518 | } |
| 5519 | BUG_ON(mddev != bdev->bd_disk->private_data); | 5519 | BUG_ON(mddev != bdev->bd_disk->private_data); |
| 5520 | 5520 | ||
| 5521 | if ((err = mutex_lock_interruptible_nested(&mddev->reconfig_mutex, 1))) | 5521 | if ((err = mutex_lock_interruptible(&mddev->open_mutex))) |
| 5522 | goto out; | 5522 | goto out; |
| 5523 | 5523 | ||
| 5524 | err = 0; | 5524 | err = 0; |
| 5525 | atomic_inc(&mddev->openers); | 5525 | atomic_inc(&mddev->openers); |
| 5526 | mddev_unlock(mddev); | 5526 | mutex_unlock(&mddev->open_mutex); |
| 5527 | 5527 | ||
| 5528 | check_disk_change(bdev); | 5528 | check_disk_change(bdev); |
| 5529 | out: | 5529 | out: |
diff --git a/drivers/md/md.h b/drivers/md/md.h index 78f03168baf9..f8fc188bc762 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
| @@ -223,6 +223,16 @@ struct mddev_s | |||
| 223 | * so we don't loop trying */ | 223 | * so we don't loop trying */ |
| 224 | 224 | ||
| 225 | int in_sync; /* know to not need resync */ | 225 | int in_sync; /* know to not need resync */ |
| 226 | /* 'open_mutex' avoids races between 'md_open' and 'do_md_stop', so | ||
| 227 | * that we are never stopping an array while it is open. | ||
| 228 | * 'reconfig_mutex' protects all other reconfiguration. | ||
| 229 | * These locks are separate due to conflicting interactions | ||
| 230 | * with bdev->bd_mutex. | ||
| 231 | * Lock ordering is: | ||
| 232 | * reconfig_mutex -> bd_mutex : e.g. do_md_run -> revalidate_disk | ||
| 233 | * bd_mutex -> open_mutex: e.g. __blkdev_get -> md_open | ||
| 234 | */ | ||
| 235 | struct mutex open_mutex; | ||
| 226 | struct mutex reconfig_mutex; | 236 | struct mutex reconfig_mutex; |
| 227 | atomic_t active; /* general refcount */ | 237 | atomic_t active; /* general refcount */ |
| 228 | atomic_t openers; /* number of active opens */ | 238 | atomic_t openers; /* number of active opens */ |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 2b521ee67dfa..b8a2c5dc67ba 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -3785,7 +3785,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped | |||
| 3785 | conf->reshape_progress < raid5_size(mddev, 0, 0)) { | 3785 | conf->reshape_progress < raid5_size(mddev, 0, 0)) { |
| 3786 | sector_nr = raid5_size(mddev, 0, 0) | 3786 | sector_nr = raid5_size(mddev, 0, 0) |
| 3787 | - conf->reshape_progress; | 3787 | - conf->reshape_progress; |
| 3788 | } else if (mddev->delta_disks > 0 && | 3788 | } else if (mddev->delta_disks >= 0 && |
| 3789 | conf->reshape_progress > 0) | 3789 | conf->reshape_progress > 0) |
| 3790 | sector_nr = conf->reshape_progress; | 3790 | sector_nr = conf->reshape_progress; |
| 3791 | sector_div(sector_nr, new_data_disks); | 3791 | sector_div(sector_nr, new_data_disks); |
| @@ -4509,7 +4509,26 @@ static int run(mddev_t *mddev) | |||
| 4509 | (old_disks-max_degraded)); | 4509 | (old_disks-max_degraded)); |
| 4510 | /* here_old is the first stripe that we might need to read | 4510 | /* here_old is the first stripe that we might need to read |
| 4511 | * from */ | 4511 | * from */ |
| 4512 | if (here_new >= here_old) { | 4512 | if (mddev->delta_disks == 0) { |
| 4513 | /* We cannot be sure it is safe to start an in-place | ||
| 4514 | * reshape. It is only safe if user-space if monitoring | ||
| 4515 | * and taking constant backups. | ||
| 4516 | * mdadm always starts a situation like this in | ||
| 4517 | * readonly mode so it can take control before | ||
| 4518 | * allowing any writes. So just check for that. | ||
| 4519 | */ | ||
| 4520 | if ((here_new * mddev->new_chunk_sectors != | ||
| 4521 | here_old * mddev->chunk_sectors) || | ||
| 4522 | mddev->ro == 0) { | ||
| 4523 | printk(KERN_ERR "raid5: in-place reshape must be started" | ||
| 4524 | " in read-only mode - aborting\n"); | ||
| 4525 | return -EINVAL; | ||
| 4526 | } | ||
| 4527 | } else if (mddev->delta_disks < 0 | ||
| 4528 | ? (here_new * mddev->new_chunk_sectors <= | ||
| 4529 | here_old * mddev->chunk_sectors) | ||
| 4530 | : (here_new * mddev->new_chunk_sectors >= | ||
| 4531 | here_old * mddev->chunk_sectors)) { | ||
| 4513 | /* Reading from the same stripe as writing to - bad */ | 4532 | /* Reading from the same stripe as writing to - bad */ |
| 4514 | printk(KERN_ERR "raid5: reshape_position too early for " | 4533 | printk(KERN_ERR "raid5: reshape_position too early for " |
| 4515 | "auto-recovery - aborting.\n"); | 4534 | "auto-recovery - aborting.\n"); |
| @@ -5078,8 +5097,15 @@ static void raid5_finish_reshape(mddev_t *mddev) | |||
| 5078 | mddev->degraded--; | 5097 | mddev->degraded--; |
| 5079 | for (d = conf->raid_disks ; | 5098 | for (d = conf->raid_disks ; |
| 5080 | d < conf->raid_disks - mddev->delta_disks; | 5099 | d < conf->raid_disks - mddev->delta_disks; |
| 5081 | d++) | 5100 | d++) { |
| 5082 | raid5_remove_disk(mddev, d); | 5101 | mdk_rdev_t *rdev = conf->disks[d].rdev; |
| 5102 | if (rdev && raid5_remove_disk(mddev, d) == 0) { | ||
| 5103 | char nm[20]; | ||
| 5104 | sprintf(nm, "rd%d", rdev->raid_disk); | ||
| 5105 | sysfs_remove_link(&mddev->kobj, nm); | ||
| 5106 | rdev->raid_disk = -1; | ||
| 5107 | } | ||
| 5108 | } | ||
| 5083 | } | 5109 | } |
| 5084 | mddev->layout = conf->algorithm; | 5110 | mddev->layout = conf->algorithm; |
| 5085 | mddev->chunk_sectors = conf->chunk_sectors; | 5111 | mddev->chunk_sectors = conf->chunk_sectors; |
diff --git a/drivers/mtd/maps/sbc8240.c b/drivers/mtd/maps/sbc8240.c deleted file mode 100644 index e69de29bb2d1..000000000000 --- a/drivers/mtd/maps/sbc8240.c +++ /dev/null | |||
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 489fc01a3204..e4e089a8f294 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -255,7 +255,7 @@ static void nfs_direct_read_release(void *calldata) | |||
| 255 | 255 | ||
| 256 | if (put_dreq(dreq)) | 256 | if (put_dreq(dreq)) |
| 257 | nfs_direct_complete(dreq); | 257 | nfs_direct_complete(dreq); |
| 258 | nfs_readdata_release(calldata); | 258 | nfs_readdata_free(data); |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | static const struct rpc_call_ops nfs_read_direct_ops = { | 261 | static const struct rpc_call_ops nfs_read_direct_ops = { |
| @@ -314,14 +314,14 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, | |||
| 314 | data->npages, 1, 0, data->pagevec, NULL); | 314 | data->npages, 1, 0, data->pagevec, NULL); |
| 315 | up_read(¤t->mm->mmap_sem); | 315 | up_read(¤t->mm->mmap_sem); |
| 316 | if (result < 0) { | 316 | if (result < 0) { |
| 317 | nfs_readdata_release(data); | 317 | nfs_readdata_free(data); |
| 318 | break; | 318 | break; |
| 319 | } | 319 | } |
| 320 | if ((unsigned)result < data->npages) { | 320 | if ((unsigned)result < data->npages) { |
| 321 | bytes = result * PAGE_SIZE; | 321 | bytes = result * PAGE_SIZE; |
| 322 | if (bytes <= pgbase) { | 322 | if (bytes <= pgbase) { |
| 323 | nfs_direct_release_pages(data->pagevec, result); | 323 | nfs_direct_release_pages(data->pagevec, result); |
| 324 | nfs_readdata_release(data); | 324 | nfs_readdata_free(data); |
| 325 | break; | 325 | break; |
| 326 | } | 326 | } |
| 327 | bytes -= pgbase; | 327 | bytes -= pgbase; |
| @@ -334,7 +334,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, | |||
| 334 | data->inode = inode; | 334 | data->inode = inode; |
| 335 | data->cred = msg.rpc_cred; | 335 | data->cred = msg.rpc_cred; |
| 336 | data->args.fh = NFS_FH(inode); | 336 | data->args.fh = NFS_FH(inode); |
| 337 | data->args.context = get_nfs_open_context(ctx); | 337 | data->args.context = ctx; |
| 338 | data->args.offset = pos; | 338 | data->args.offset = pos; |
| 339 | data->args.pgbase = pgbase; | 339 | data->args.pgbase = pgbase; |
| 340 | data->args.pages = data->pagevec; | 340 | data->args.pages = data->pagevec; |
| @@ -441,7 +441,7 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) | |||
| 441 | struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); | 441 | struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); |
| 442 | list_del(&data->pages); | 442 | list_del(&data->pages); |
| 443 | nfs_direct_release_pages(data->pagevec, data->npages); | 443 | nfs_direct_release_pages(data->pagevec, data->npages); |
| 444 | nfs_writedata_release(data); | 444 | nfs_writedata_free(data); |
| 445 | } | 445 | } |
| 446 | } | 446 | } |
| 447 | 447 | ||
| @@ -534,7 +534,7 @@ static void nfs_direct_commit_release(void *calldata) | |||
| 534 | 534 | ||
| 535 | dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status); | 535 | dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status); |
| 536 | nfs_direct_write_complete(dreq, data->inode); | 536 | nfs_direct_write_complete(dreq, data->inode); |
| 537 | nfs_commitdata_release(calldata); | 537 | nfs_commit_free(data); |
| 538 | } | 538 | } |
| 539 | 539 | ||
| 540 | static const struct rpc_call_ops nfs_commit_direct_ops = { | 540 | static const struct rpc_call_ops nfs_commit_direct_ops = { |
| @@ -570,7 +570,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq) | |||
| 570 | data->args.fh = NFS_FH(data->inode); | 570 | data->args.fh = NFS_FH(data->inode); |
| 571 | data->args.offset = 0; | 571 | data->args.offset = 0; |
| 572 | data->args.count = 0; | 572 | data->args.count = 0; |
| 573 | data->args.context = get_nfs_open_context(dreq->ctx); | 573 | data->args.context = dreq->ctx; |
| 574 | data->res.count = 0; | 574 | data->res.count = 0; |
| 575 | data->res.fattr = &data->fattr; | 575 | data->res.fattr = &data->fattr; |
| 576 | data->res.verf = &data->verf; | 576 | data->res.verf = &data->verf; |
| @@ -734,14 +734,14 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, | |||
| 734 | data->npages, 0, 0, data->pagevec, NULL); | 734 | data->npages, 0, 0, data->pagevec, NULL); |
| 735 | up_read(¤t->mm->mmap_sem); | 735 | up_read(¤t->mm->mmap_sem); |
| 736 | if (result < 0) { | 736 | if (result < 0) { |
| 737 | nfs_writedata_release(data); | 737 | nfs_writedata_free(data); |
| 738 | break; | 738 | break; |
| 739 | } | 739 | } |
| 740 | if ((unsigned)result < data->npages) { | 740 | if ((unsigned)result < data->npages) { |
| 741 | bytes = result * PAGE_SIZE; | 741 | bytes = result * PAGE_SIZE; |
| 742 | if (bytes <= pgbase) { | 742 | if (bytes <= pgbase) { |
| 743 | nfs_direct_release_pages(data->pagevec, result); | 743 | nfs_direct_release_pages(data->pagevec, result); |
| 744 | nfs_writedata_release(data); | 744 | nfs_writedata_free(data); |
| 745 | break; | 745 | break; |
| 746 | } | 746 | } |
| 747 | bytes -= pgbase; | 747 | bytes -= pgbase; |
| @@ -756,7 +756,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, | |||
| 756 | data->inode = inode; | 756 | data->inode = inode; |
| 757 | data->cred = msg.rpc_cred; | 757 | data->cred = msg.rpc_cred; |
| 758 | data->args.fh = NFS_FH(inode); | 758 | data->args.fh = NFS_FH(inode); |
| 759 | data->args.context = get_nfs_open_context(ctx); | 759 | data->args.context = ctx; |
| 760 | data->args.offset = pos; | 760 | data->args.offset = pos; |
| 761 | data->args.pgbase = pgbase; | 761 | data->args.pgbase = pgbase; |
| 762 | data->args.pages = data->pagevec; | 762 | data->args.pages = data->pagevec; |
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 73ea5e8d66ce..12c9e66d3f1d 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c | |||
| @@ -60,17 +60,15 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) | |||
| 60 | return p; | 60 | return p; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | static void nfs_readdata_free(struct nfs_read_data *p) | 63 | void nfs_readdata_free(struct nfs_read_data *p) |
| 64 | { | 64 | { |
| 65 | if (p && (p->pagevec != &p->page_array[0])) | 65 | if (p && (p->pagevec != &p->page_array[0])) |
| 66 | kfree(p->pagevec); | 66 | kfree(p->pagevec); |
| 67 | mempool_free(p, nfs_rdata_mempool); | 67 | mempool_free(p, nfs_rdata_mempool); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | void nfs_readdata_release(void *data) | 70 | static void nfs_readdata_release(struct nfs_read_data *rdata) |
| 71 | { | 71 | { |
| 72 | struct nfs_read_data *rdata = data; | ||
| 73 | |||
| 74 | put_nfs_open_context(rdata->args.context); | 72 | put_nfs_open_context(rdata->args.context); |
| 75 | nfs_readdata_free(rdata); | 73 | nfs_readdata_free(rdata); |
| 76 | } | 74 | } |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 0a0a2ff767c3..a34fae21fe10 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -87,17 +87,15 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) | |||
| 87 | return p; | 87 | return p; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | static void nfs_writedata_free(struct nfs_write_data *p) | 90 | void nfs_writedata_free(struct nfs_write_data *p) |
| 91 | { | 91 | { |
| 92 | if (p && (p->pagevec != &p->page_array[0])) | 92 | if (p && (p->pagevec != &p->page_array[0])) |
| 93 | kfree(p->pagevec); | 93 | kfree(p->pagevec); |
| 94 | mempool_free(p, nfs_wdata_mempool); | 94 | mempool_free(p, nfs_wdata_mempool); |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | void nfs_writedata_release(void *data) | 97 | static void nfs_writedata_release(struct nfs_write_data *wdata) |
| 98 | { | 98 | { |
| 99 | struct nfs_write_data *wdata = data; | ||
| 100 | |||
| 101 | put_nfs_open_context(wdata->args.context); | 99 | put_nfs_open_context(wdata->args.context); |
| 102 | nfs_writedata_free(wdata); | 100 | nfs_writedata_free(wdata); |
| 103 | } | 101 | } |
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 9edcde4974aa..f9a3e8942669 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
| @@ -1914,7 +1914,8 @@ static void ocfs2_adjust_adjacent_records(struct ocfs2_extent_rec *left_rec, | |||
| 1914 | * immediately to their right. | 1914 | * immediately to their right. |
| 1915 | */ | 1915 | */ |
| 1916 | left_clusters = le32_to_cpu(right_child_el->l_recs[0].e_cpos); | 1916 | left_clusters = le32_to_cpu(right_child_el->l_recs[0].e_cpos); |
| 1917 | if (ocfs2_is_empty_extent(&right_child_el->l_recs[0])) { | 1917 | if (!ocfs2_rec_clusters(right_child_el, &right_child_el->l_recs[0])) { |
| 1918 | BUG_ON(right_child_el->l_tree_depth); | ||
| 1918 | BUG_ON(le16_to_cpu(right_child_el->l_next_free_rec) <= 1); | 1919 | BUG_ON(le16_to_cpu(right_child_el->l_next_free_rec) <= 1); |
| 1919 | left_clusters = le32_to_cpu(right_child_el->l_recs[1].e_cpos); | 1920 | left_clusters = le32_to_cpu(right_child_el->l_recs[1].e_cpos); |
| 1920 | } | 1921 | } |
| @@ -2476,15 +2477,37 @@ out_ret_path: | |||
| 2476 | return ret; | 2477 | return ret; |
| 2477 | } | 2478 | } |
| 2478 | 2479 | ||
| 2479 | static void ocfs2_update_edge_lengths(struct inode *inode, handle_t *handle, | 2480 | static int ocfs2_update_edge_lengths(struct inode *inode, handle_t *handle, |
| 2480 | struct ocfs2_path *path) | 2481 | int subtree_index, struct ocfs2_path *path) |
| 2481 | { | 2482 | { |
| 2482 | int i, idx; | 2483 | int i, idx, ret; |
| 2483 | struct ocfs2_extent_rec *rec; | 2484 | struct ocfs2_extent_rec *rec; |
| 2484 | struct ocfs2_extent_list *el; | 2485 | struct ocfs2_extent_list *el; |
| 2485 | struct ocfs2_extent_block *eb; | 2486 | struct ocfs2_extent_block *eb; |
| 2486 | u32 range; | 2487 | u32 range; |
| 2487 | 2488 | ||
| 2489 | /* | ||
| 2490 | * In normal tree rotation process, we will never touch the | ||
| 2491 | * tree branch above subtree_index and ocfs2_extend_rotate_transaction | ||
| 2492 | * doesn't reserve the credits for them either. | ||
| 2493 | * | ||
| 2494 | * But we do have a special case here which will update the rightmost | ||
| 2495 | * records for all the bh in the path. | ||
| 2496 | * So we have to allocate extra credits and access them. | ||
| 2497 | */ | ||
| 2498 | ret = ocfs2_extend_trans(handle, | ||
| 2499 | handle->h_buffer_credits + subtree_index); | ||
| 2500 | if (ret) { | ||
| 2501 | mlog_errno(ret); | ||
| 2502 | goto out; | ||
| 2503 | } | ||
| 2504 | |||
| 2505 | ret = ocfs2_journal_access_path(inode, handle, path); | ||
| 2506 | if (ret) { | ||
| 2507 | mlog_errno(ret); | ||
| 2508 | goto out; | ||
| 2509 | } | ||
| 2510 | |||
| 2488 | /* Path should always be rightmost. */ | 2511 | /* Path should always be rightmost. */ |
| 2489 | eb = (struct ocfs2_extent_block *)path_leaf_bh(path)->b_data; | 2512 | eb = (struct ocfs2_extent_block *)path_leaf_bh(path)->b_data; |
| 2490 | BUG_ON(eb->h_next_leaf_blk != 0ULL); | 2513 | BUG_ON(eb->h_next_leaf_blk != 0ULL); |
| @@ -2505,6 +2528,8 @@ static void ocfs2_update_edge_lengths(struct inode *inode, handle_t *handle, | |||
| 2505 | 2528 | ||
| 2506 | ocfs2_journal_dirty(handle, path->p_node[i].bh); | 2529 | ocfs2_journal_dirty(handle, path->p_node[i].bh); |
| 2507 | } | 2530 | } |
| 2531 | out: | ||
| 2532 | return ret; | ||
| 2508 | } | 2533 | } |
| 2509 | 2534 | ||
| 2510 | static void ocfs2_unlink_path(struct inode *inode, handle_t *handle, | 2535 | static void ocfs2_unlink_path(struct inode *inode, handle_t *handle, |
| @@ -2717,7 +2742,12 @@ static int ocfs2_rotate_subtree_left(struct inode *inode, handle_t *handle, | |||
| 2717 | if (del_right_subtree) { | 2742 | if (del_right_subtree) { |
| 2718 | ocfs2_unlink_subtree(inode, handle, left_path, right_path, | 2743 | ocfs2_unlink_subtree(inode, handle, left_path, right_path, |
| 2719 | subtree_index, dealloc); | 2744 | subtree_index, dealloc); |
| 2720 | ocfs2_update_edge_lengths(inode, handle, left_path); | 2745 | ret = ocfs2_update_edge_lengths(inode, handle, subtree_index, |
| 2746 | left_path); | ||
| 2747 | if (ret) { | ||
| 2748 | mlog_errno(ret); | ||
| 2749 | goto out; | ||
| 2750 | } | ||
| 2721 | 2751 | ||
| 2722 | eb = (struct ocfs2_extent_block *)path_leaf_bh(left_path)->b_data; | 2752 | eb = (struct ocfs2_extent_block *)path_leaf_bh(left_path)->b_data; |
| 2723 | ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno)); | 2753 | ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno)); |
| @@ -3034,7 +3064,12 @@ static int ocfs2_remove_rightmost_path(struct inode *inode, handle_t *handle, | |||
| 3034 | 3064 | ||
| 3035 | ocfs2_unlink_subtree(inode, handle, left_path, path, | 3065 | ocfs2_unlink_subtree(inode, handle, left_path, path, |
| 3036 | subtree_index, dealloc); | 3066 | subtree_index, dealloc); |
| 3037 | ocfs2_update_edge_lengths(inode, handle, left_path); | 3067 | ret = ocfs2_update_edge_lengths(inode, handle, subtree_index, |
| 3068 | left_path); | ||
| 3069 | if (ret) { | ||
| 3070 | mlog_errno(ret); | ||
| 3071 | goto out; | ||
| 3072 | } | ||
| 3038 | 3073 | ||
| 3039 | eb = (struct ocfs2_extent_block *)path_leaf_bh(left_path)->b_data; | 3074 | eb = (struct ocfs2_extent_block *)path_leaf_bh(left_path)->b_data; |
| 3040 | ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno)); | 3075 | ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno)); |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index b2c52b3a1484..b401654011a2 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -193,6 +193,7 @@ static int ocfs2_get_block(struct inode *inode, sector_t iblock, | |||
| 193 | (unsigned long long)OCFS2_I(inode)->ip_blkno); | 193 | (unsigned long long)OCFS2_I(inode)->ip_blkno); |
| 194 | mlog(ML_ERROR, "Size %llu, clusters %u\n", (unsigned long long)i_size_read(inode), OCFS2_I(inode)->ip_clusters); | 194 | mlog(ML_ERROR, "Size %llu, clusters %u\n", (unsigned long long)i_size_read(inode), OCFS2_I(inode)->ip_clusters); |
| 195 | dump_stack(); | 195 | dump_stack(); |
| 196 | goto bail; | ||
| 196 | } | 197 | } |
| 197 | 198 | ||
| 198 | past_eof = ocfs2_blocks_for_bytes(inode->i_sb, i_size_read(inode)); | 199 | past_eof = ocfs2_blocks_for_bytes(inode->i_sb, i_size_read(inode)); |
| @@ -894,18 +895,17 @@ struct ocfs2_write_cluster_desc { | |||
| 894 | */ | 895 | */ |
| 895 | unsigned c_new; | 896 | unsigned c_new; |
| 896 | unsigned c_unwritten; | 897 | unsigned c_unwritten; |
| 898 | unsigned c_needs_zero; | ||
| 897 | }; | 899 | }; |
| 898 | 900 | ||
| 899 | static inline int ocfs2_should_zero_cluster(struct ocfs2_write_cluster_desc *d) | ||
| 900 | { | ||
| 901 | return d->c_new || d->c_unwritten; | ||
| 902 | } | ||
| 903 | |||
| 904 | struct ocfs2_write_ctxt { | 901 | struct ocfs2_write_ctxt { |
| 905 | /* Logical cluster position / len of write */ | 902 | /* Logical cluster position / len of write */ |
| 906 | u32 w_cpos; | 903 | u32 w_cpos; |
| 907 | u32 w_clen; | 904 | u32 w_clen; |
| 908 | 905 | ||
| 906 | /* First cluster allocated in a nonsparse extend */ | ||
| 907 | u32 w_first_new_cpos; | ||
| 908 | |||
| 909 | struct ocfs2_write_cluster_desc w_desc[OCFS2_MAX_CLUSTERS_PER_PAGE]; | 909 | struct ocfs2_write_cluster_desc w_desc[OCFS2_MAX_CLUSTERS_PER_PAGE]; |
| 910 | 910 | ||
| 911 | /* | 911 | /* |
| @@ -983,6 +983,7 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp, | |||
| 983 | return -ENOMEM; | 983 | return -ENOMEM; |
| 984 | 984 | ||
| 985 | wc->w_cpos = pos >> osb->s_clustersize_bits; | 985 | wc->w_cpos = pos >> osb->s_clustersize_bits; |
| 986 | wc->w_first_new_cpos = UINT_MAX; | ||
| 986 | cend = (pos + len - 1) >> osb->s_clustersize_bits; | 987 | cend = (pos + len - 1) >> osb->s_clustersize_bits; |
| 987 | wc->w_clen = cend - wc->w_cpos + 1; | 988 | wc->w_clen = cend - wc->w_cpos + 1; |
| 988 | get_bh(di_bh); | 989 | get_bh(di_bh); |
| @@ -1217,20 +1218,18 @@ out: | |||
| 1217 | */ | 1218 | */ |
| 1218 | static int ocfs2_write_cluster(struct address_space *mapping, | 1219 | static int ocfs2_write_cluster(struct address_space *mapping, |
| 1219 | u32 phys, unsigned int unwritten, | 1220 | u32 phys, unsigned int unwritten, |
| 1221 | unsigned int should_zero, | ||
| 1220 | struct ocfs2_alloc_context *data_ac, | 1222 | struct ocfs2_alloc_context *data_ac, |
| 1221 | struct ocfs2_alloc_context *meta_ac, | 1223 | struct ocfs2_alloc_context *meta_ac, |
| 1222 | struct ocfs2_write_ctxt *wc, u32 cpos, | 1224 | struct ocfs2_write_ctxt *wc, u32 cpos, |
| 1223 | loff_t user_pos, unsigned user_len) | 1225 | loff_t user_pos, unsigned user_len) |
| 1224 | { | 1226 | { |
| 1225 | int ret, i, new, should_zero = 0; | 1227 | int ret, i, new; |
| 1226 | u64 v_blkno, p_blkno; | 1228 | u64 v_blkno, p_blkno; |
| 1227 | struct inode *inode = mapping->host; | 1229 | struct inode *inode = mapping->host; |
| 1228 | struct ocfs2_extent_tree et; | 1230 | struct ocfs2_extent_tree et; |
| 1229 | 1231 | ||
| 1230 | new = phys == 0 ? 1 : 0; | 1232 | new = phys == 0 ? 1 : 0; |
| 1231 | if (new || unwritten) | ||
| 1232 | should_zero = 1; | ||
| 1233 | |||
| 1234 | if (new) { | 1233 | if (new) { |
| 1235 | u32 tmp_pos; | 1234 | u32 tmp_pos; |
| 1236 | 1235 | ||
| @@ -1301,7 +1300,7 @@ static int ocfs2_write_cluster(struct address_space *mapping, | |||
| 1301 | if (tmpret) { | 1300 | if (tmpret) { |
| 1302 | mlog_errno(tmpret); | 1301 | mlog_errno(tmpret); |
| 1303 | if (ret == 0) | 1302 | if (ret == 0) |
| 1304 | tmpret = ret; | 1303 | ret = tmpret; |
| 1305 | } | 1304 | } |
| 1306 | } | 1305 | } |
| 1307 | 1306 | ||
| @@ -1341,7 +1340,9 @@ static int ocfs2_write_cluster_by_desc(struct address_space *mapping, | |||
| 1341 | local_len = osb->s_clustersize - cluster_off; | 1340 | local_len = osb->s_clustersize - cluster_off; |
| 1342 | 1341 | ||
| 1343 | ret = ocfs2_write_cluster(mapping, desc->c_phys, | 1342 | ret = ocfs2_write_cluster(mapping, desc->c_phys, |
| 1344 | desc->c_unwritten, data_ac, meta_ac, | 1343 | desc->c_unwritten, |
| 1344 | desc->c_needs_zero, | ||
| 1345 | data_ac, meta_ac, | ||
| 1345 | wc, desc->c_cpos, pos, local_len); | 1346 | wc, desc->c_cpos, pos, local_len); |
| 1346 | if (ret) { | 1347 | if (ret) { |
| 1347 | mlog_errno(ret); | 1348 | mlog_errno(ret); |
| @@ -1391,14 +1392,14 @@ static void ocfs2_set_target_boundaries(struct ocfs2_super *osb, | |||
| 1391 | * newly allocated cluster. | 1392 | * newly allocated cluster. |
| 1392 | */ | 1393 | */ |
| 1393 | desc = &wc->w_desc[0]; | 1394 | desc = &wc->w_desc[0]; |
| 1394 | if (ocfs2_should_zero_cluster(desc)) | 1395 | if (desc->c_needs_zero) |
| 1395 | ocfs2_figure_cluster_boundaries(osb, | 1396 | ocfs2_figure_cluster_boundaries(osb, |
| 1396 | desc->c_cpos, | 1397 | desc->c_cpos, |
| 1397 | &wc->w_target_from, | 1398 | &wc->w_target_from, |
| 1398 | NULL); | 1399 | NULL); |
| 1399 | 1400 | ||
| 1400 | desc = &wc->w_desc[wc->w_clen - 1]; | 1401 | desc = &wc->w_desc[wc->w_clen - 1]; |
| 1401 | if (ocfs2_should_zero_cluster(desc)) | 1402 | if (desc->c_needs_zero) |
| 1402 | ocfs2_figure_cluster_boundaries(osb, | 1403 | ocfs2_figure_cluster_boundaries(osb, |
| 1403 | desc->c_cpos, | 1404 | desc->c_cpos, |
| 1404 | NULL, | 1405 | NULL, |
| @@ -1466,13 +1467,28 @@ static int ocfs2_populate_write_desc(struct inode *inode, | |||
| 1466 | phys++; | 1467 | phys++; |
| 1467 | } | 1468 | } |
| 1468 | 1469 | ||
| 1470 | /* | ||
| 1471 | * If w_first_new_cpos is < UINT_MAX, we have a non-sparse | ||
| 1472 | * file that got extended. w_first_new_cpos tells us | ||
| 1473 | * where the newly allocated clusters are so we can | ||
| 1474 | * zero them. | ||
| 1475 | */ | ||
| 1476 | if (desc->c_cpos >= wc->w_first_new_cpos) { | ||
| 1477 | BUG_ON(phys == 0); | ||
| 1478 | desc->c_needs_zero = 1; | ||
| 1479 | } | ||
| 1480 | |||
| 1469 | desc->c_phys = phys; | 1481 | desc->c_phys = phys; |
| 1470 | if (phys == 0) { | 1482 | if (phys == 0) { |
| 1471 | desc->c_new = 1; | 1483 | desc->c_new = 1; |
| 1484 | desc->c_needs_zero = 1; | ||
| 1472 | *clusters_to_alloc = *clusters_to_alloc + 1; | 1485 | *clusters_to_alloc = *clusters_to_alloc + 1; |
| 1473 | } | 1486 | } |
| 1474 | if (ext_flags & OCFS2_EXT_UNWRITTEN) | 1487 | |
| 1488 | if (ext_flags & OCFS2_EXT_UNWRITTEN) { | ||
| 1475 | desc->c_unwritten = 1; | 1489 | desc->c_unwritten = 1; |
| 1490 | desc->c_needs_zero = 1; | ||
| 1491 | } | ||
| 1476 | 1492 | ||
| 1477 | num_clusters--; | 1493 | num_clusters--; |
| 1478 | } | 1494 | } |
| @@ -1632,10 +1648,13 @@ static int ocfs2_expand_nonsparse_inode(struct inode *inode, loff_t pos, | |||
| 1632 | if (newsize <= i_size_read(inode)) | 1648 | if (newsize <= i_size_read(inode)) |
| 1633 | return 0; | 1649 | return 0; |
| 1634 | 1650 | ||
| 1635 | ret = ocfs2_extend_no_holes(inode, newsize, newsize - len); | 1651 | ret = ocfs2_extend_no_holes(inode, newsize, pos); |
| 1636 | if (ret) | 1652 | if (ret) |
| 1637 | mlog_errno(ret); | 1653 | mlog_errno(ret); |
| 1638 | 1654 | ||
| 1655 | wc->w_first_new_cpos = | ||
| 1656 | ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode)); | ||
| 1657 | |||
| 1639 | return ret; | 1658 | return ret; |
| 1640 | } | 1659 | } |
| 1641 | 1660 | ||
| @@ -1644,7 +1663,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
| 1644 | struct page **pagep, void **fsdata, | 1663 | struct page **pagep, void **fsdata, |
| 1645 | struct buffer_head *di_bh, struct page *mmap_page) | 1664 | struct buffer_head *di_bh, struct page *mmap_page) |
| 1646 | { | 1665 | { |
| 1647 | int ret, credits = OCFS2_INODE_UPDATE_CREDITS; | 1666 | int ret, cluster_of_pages, credits = OCFS2_INODE_UPDATE_CREDITS; |
| 1648 | unsigned int clusters_to_alloc, extents_to_split; | 1667 | unsigned int clusters_to_alloc, extents_to_split; |
| 1649 | struct ocfs2_write_ctxt *wc; | 1668 | struct ocfs2_write_ctxt *wc; |
| 1650 | struct inode *inode = mapping->host; | 1669 | struct inode *inode = mapping->host; |
| @@ -1722,8 +1741,19 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
| 1722 | 1741 | ||
| 1723 | } | 1742 | } |
| 1724 | 1743 | ||
| 1725 | ocfs2_set_target_boundaries(osb, wc, pos, len, | 1744 | /* |
| 1726 | clusters_to_alloc + extents_to_split); | 1745 | * We have to zero sparse allocated clusters, unwritten extent clusters, |
| 1746 | * and non-sparse clusters we just extended. For non-sparse writes, | ||
| 1747 | * we know zeros will only be needed in the first and/or last cluster. | ||
| 1748 | */ | ||
| 1749 | if (clusters_to_alloc || extents_to_split || | ||
| 1750 | wc->w_desc[0].c_needs_zero || | ||
| 1751 | wc->w_desc[wc->w_clen - 1].c_needs_zero) | ||
| 1752 | cluster_of_pages = 1; | ||
| 1753 | else | ||
| 1754 | cluster_of_pages = 0; | ||
| 1755 | |||
| 1756 | ocfs2_set_target_boundaries(osb, wc, pos, len, cluster_of_pages); | ||
| 1727 | 1757 | ||
| 1728 | handle = ocfs2_start_trans(osb, credits); | 1758 | handle = ocfs2_start_trans(osb, credits); |
| 1729 | if (IS_ERR(handle)) { | 1759 | if (IS_ERR(handle)) { |
| @@ -1756,8 +1786,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
| 1756 | * extent. | 1786 | * extent. |
| 1757 | */ | 1787 | */ |
| 1758 | ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos, | 1788 | ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos, |
| 1759 | clusters_to_alloc + extents_to_split, | 1789 | cluster_of_pages, mmap_page); |
| 1760 | mmap_page); | ||
| 1761 | if (ret) { | 1790 | if (ret) { |
| 1762 | mlog_errno(ret); | 1791 | mlog_errno(ret); |
| 1763 | goto out_quota; | 1792 | goto out_quota; |
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index b574431a031d..2f28b7de2c8d 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c | |||
| @@ -310,22 +310,19 @@ out_attach: | |||
| 310 | return ret; | 310 | return ret; |
| 311 | } | 311 | } |
| 312 | 312 | ||
| 313 | static DEFINE_SPINLOCK(dentry_list_lock); | 313 | DEFINE_SPINLOCK(dentry_list_lock); |
| 314 | 314 | ||
| 315 | /* We limit the number of dentry locks to drop in one go. We have | 315 | /* We limit the number of dentry locks to drop in one go. We have |
| 316 | * this limit so that we don't starve other users of ocfs2_wq. */ | 316 | * this limit so that we don't starve other users of ocfs2_wq. */ |
| 317 | #define DL_INODE_DROP_COUNT 64 | 317 | #define DL_INODE_DROP_COUNT 64 |
| 318 | 318 | ||
| 319 | /* Drop inode references from dentry locks */ | 319 | /* Drop inode references from dentry locks */ |
| 320 | void ocfs2_drop_dl_inodes(struct work_struct *work) | 320 | static void __ocfs2_drop_dl_inodes(struct ocfs2_super *osb, int drop_count) |
| 321 | { | 321 | { |
| 322 | struct ocfs2_super *osb = container_of(work, struct ocfs2_super, | ||
| 323 | dentry_lock_work); | ||
| 324 | struct ocfs2_dentry_lock *dl; | 322 | struct ocfs2_dentry_lock *dl; |
| 325 | int drop_count = DL_INODE_DROP_COUNT; | ||
| 326 | 323 | ||
| 327 | spin_lock(&dentry_list_lock); | 324 | spin_lock(&dentry_list_lock); |
| 328 | while (osb->dentry_lock_list && drop_count--) { | 325 | while (osb->dentry_lock_list && (drop_count < 0 || drop_count--)) { |
| 329 | dl = osb->dentry_lock_list; | 326 | dl = osb->dentry_lock_list; |
| 330 | osb->dentry_lock_list = dl->dl_next; | 327 | osb->dentry_lock_list = dl->dl_next; |
| 331 | spin_unlock(&dentry_list_lock); | 328 | spin_unlock(&dentry_list_lock); |
| @@ -333,11 +330,32 @@ void ocfs2_drop_dl_inodes(struct work_struct *work) | |||
| 333 | kfree(dl); | 330 | kfree(dl); |
| 334 | spin_lock(&dentry_list_lock); | 331 | spin_lock(&dentry_list_lock); |
| 335 | } | 332 | } |
| 336 | if (osb->dentry_lock_list) | 333 | spin_unlock(&dentry_list_lock); |
| 334 | } | ||
| 335 | |||
| 336 | void ocfs2_drop_dl_inodes(struct work_struct *work) | ||
| 337 | { | ||
| 338 | struct ocfs2_super *osb = container_of(work, struct ocfs2_super, | ||
| 339 | dentry_lock_work); | ||
| 340 | |||
| 341 | __ocfs2_drop_dl_inodes(osb, DL_INODE_DROP_COUNT); | ||
| 342 | /* | ||
| 343 | * Don't queue dropping if umount is in progress. We flush the | ||
| 344 | * list in ocfs2_dismount_volume | ||
| 345 | */ | ||
| 346 | spin_lock(&dentry_list_lock); | ||
| 347 | if (osb->dentry_lock_list && | ||
| 348 | !ocfs2_test_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED)) | ||
| 337 | queue_work(ocfs2_wq, &osb->dentry_lock_work); | 349 | queue_work(ocfs2_wq, &osb->dentry_lock_work); |
| 338 | spin_unlock(&dentry_list_lock); | 350 | spin_unlock(&dentry_list_lock); |
| 339 | } | 351 | } |
| 340 | 352 | ||
| 353 | /* Flush the whole work queue */ | ||
| 354 | void ocfs2_drop_all_dl_inodes(struct ocfs2_super *osb) | ||
| 355 | { | ||
| 356 | __ocfs2_drop_dl_inodes(osb, -1); | ||
| 357 | } | ||
| 358 | |||
| 341 | /* | 359 | /* |
| 342 | * ocfs2_dentry_iput() and friends. | 360 | * ocfs2_dentry_iput() and friends. |
| 343 | * | 361 | * |
| @@ -368,7 +386,8 @@ static void ocfs2_drop_dentry_lock(struct ocfs2_super *osb, | |||
| 368 | /* We leave dropping of inode reference to ocfs2_wq as that can | 386 | /* We leave dropping of inode reference to ocfs2_wq as that can |
| 369 | * possibly lead to inode deletion which gets tricky */ | 387 | * possibly lead to inode deletion which gets tricky */ |
| 370 | spin_lock(&dentry_list_lock); | 388 | spin_lock(&dentry_list_lock); |
| 371 | if (!osb->dentry_lock_list) | 389 | if (!osb->dentry_lock_list && |
| 390 | !ocfs2_test_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED)) | ||
| 372 | queue_work(ocfs2_wq, &osb->dentry_lock_work); | 391 | queue_work(ocfs2_wq, &osb->dentry_lock_work); |
| 373 | dl->dl_next = osb->dentry_lock_list; | 392 | dl->dl_next = osb->dentry_lock_list; |
| 374 | osb->dentry_lock_list = dl; | 393 | osb->dentry_lock_list = dl; |
diff --git a/fs/ocfs2/dcache.h b/fs/ocfs2/dcache.h index faa12e75f98d..f5dd1789acf1 100644 --- a/fs/ocfs2/dcache.h +++ b/fs/ocfs2/dcache.h | |||
| @@ -49,10 +49,13 @@ struct ocfs2_dentry_lock { | |||
| 49 | int ocfs2_dentry_attach_lock(struct dentry *dentry, struct inode *inode, | 49 | int ocfs2_dentry_attach_lock(struct dentry *dentry, struct inode *inode, |
| 50 | u64 parent_blkno); | 50 | u64 parent_blkno); |
| 51 | 51 | ||
| 52 | extern spinlock_t dentry_list_lock; | ||
| 53 | |||
| 52 | void ocfs2_dentry_lock_put(struct ocfs2_super *osb, | 54 | void ocfs2_dentry_lock_put(struct ocfs2_super *osb, |
| 53 | struct ocfs2_dentry_lock *dl); | 55 | struct ocfs2_dentry_lock *dl); |
| 54 | 56 | ||
| 55 | void ocfs2_drop_dl_inodes(struct work_struct *work); | 57 | void ocfs2_drop_dl_inodes(struct work_struct *work); |
| 58 | void ocfs2_drop_all_dl_inodes(struct ocfs2_super *osb); | ||
| 56 | 59 | ||
| 57 | struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno, | 60 | struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno, |
| 58 | int skip_unhashed); | 61 | int skip_unhashed); |
diff --git a/fs/ocfs2/dlm/dlmast.c b/fs/ocfs2/dlm/dlmast.c index d07ddbe4b283..81eff8e58322 100644 --- a/fs/ocfs2/dlm/dlmast.c +++ b/fs/ocfs2/dlm/dlmast.c | |||
| @@ -103,7 +103,6 @@ static void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) | |||
| 103 | lock->ast_pending, lock->ml.type); | 103 | lock->ast_pending, lock->ml.type); |
| 104 | BUG(); | 104 | BUG(); |
| 105 | } | 105 | } |
| 106 | BUG_ON(!list_empty(&lock->ast_list)); | ||
| 107 | if (lock->ast_pending) | 106 | if (lock->ast_pending) |
| 108 | mlog(0, "lock has an ast getting flushed right now\n"); | 107 | mlog(0, "lock has an ast getting flushed right now\n"); |
| 109 | 108 | ||
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index bcb9260c3735..43e6e3280569 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
| @@ -1118,7 +1118,7 @@ static int dlm_send_mig_lockres_msg(struct dlm_ctxt *dlm, | |||
| 1118 | 1118 | ||
| 1119 | mlog(0, "%s:%.*s: sending mig lockres (%s) to %u\n", | 1119 | mlog(0, "%s:%.*s: sending mig lockres (%s) to %u\n", |
| 1120 | dlm->name, res->lockname.len, res->lockname.name, | 1120 | dlm->name, res->lockname.len, res->lockname.name, |
| 1121 | orig_flags & DLM_MRES_MIGRATION ? "migrate" : "recovery", | 1121 | orig_flags & DLM_MRES_MIGRATION ? "migration" : "recovery", |
| 1122 | send_to); | 1122 | send_to); |
| 1123 | 1123 | ||
| 1124 | /* send it */ | 1124 | /* send it */ |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 62442e413a00..aa501d3f93f1 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -1851,6 +1851,7 @@ relock: | |||
| 1851 | if (ret) | 1851 | if (ret) |
| 1852 | goto out_dio; | 1852 | goto out_dio; |
| 1853 | 1853 | ||
| 1854 | count = ocount; | ||
| 1854 | ret = generic_write_checks(file, ppos, &count, | 1855 | ret = generic_write_checks(file, ppos, &count, |
| 1855 | S_ISBLK(inode->i_mode)); | 1856 | S_ISBLK(inode->i_mode)); |
| 1856 | if (ret) | 1857 | if (ret) |
| @@ -1918,8 +1919,10 @@ out_sems: | |||
| 1918 | 1919 | ||
| 1919 | mutex_unlock(&inode->i_mutex); | 1920 | mutex_unlock(&inode->i_mutex); |
| 1920 | 1921 | ||
| 1922 | if (written) | ||
| 1923 | ret = written; | ||
| 1921 | mlog_exit(ret); | 1924 | mlog_exit(ret); |
| 1922 | return written ? written : ret; | 1925 | return ret; |
| 1923 | } | 1926 | } |
| 1924 | 1927 | ||
| 1925 | static int ocfs2_splice_to_file(struct pipe_inode_info *pipe, | 1928 | static int ocfs2_splice_to_file(struct pipe_inode_info *pipe, |
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index f033760ecbea..c48b93ac6b65 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c | |||
| @@ -1954,10 +1954,16 @@ void ocfs2_orphan_scan_init(struct ocfs2_super *osb) | |||
| 1954 | os->os_osb = osb; | 1954 | os->os_osb = osb; |
| 1955 | os->os_count = 0; | 1955 | os->os_count = 0; |
| 1956 | os->os_seqno = 0; | 1956 | os->os_seqno = 0; |
| 1957 | os->os_scantime = CURRENT_TIME; | ||
| 1958 | mutex_init(&os->os_lock); | 1957 | mutex_init(&os->os_lock); |
| 1959 | INIT_DELAYED_WORK(&os->os_orphan_scan_work, ocfs2_orphan_scan_work); | 1958 | INIT_DELAYED_WORK(&os->os_orphan_scan_work, ocfs2_orphan_scan_work); |
| 1959 | } | ||
| 1960 | 1960 | ||
| 1961 | void ocfs2_orphan_scan_start(struct ocfs2_super *osb) | ||
| 1962 | { | ||
| 1963 | struct ocfs2_orphan_scan *os; | ||
| 1964 | |||
| 1965 | os = &osb->osb_orphan_scan; | ||
| 1966 | os->os_scantime = CURRENT_TIME; | ||
| 1961 | if (ocfs2_is_hard_readonly(osb) || ocfs2_mount_local(osb)) | 1967 | if (ocfs2_is_hard_readonly(osb) || ocfs2_mount_local(osb)) |
| 1962 | atomic_set(&os->os_state, ORPHAN_SCAN_INACTIVE); | 1968 | atomic_set(&os->os_state, ORPHAN_SCAN_INACTIVE); |
| 1963 | else { | 1969 | else { |
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index 5432c7f79cc6..2c3222aec622 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h | |||
| @@ -145,6 +145,7 @@ static inline void ocfs2_inode_set_new(struct ocfs2_super *osb, | |||
| 145 | 145 | ||
| 146 | /* Exported only for the journal struct init code in super.c. Do not call. */ | 146 | /* Exported only for the journal struct init code in super.c. Do not call. */ |
| 147 | void ocfs2_orphan_scan_init(struct ocfs2_super *osb); | 147 | void ocfs2_orphan_scan_init(struct ocfs2_super *osb); |
| 148 | void ocfs2_orphan_scan_start(struct ocfs2_super *osb); | ||
| 148 | void ocfs2_orphan_scan_stop(struct ocfs2_super *osb); | 149 | void ocfs2_orphan_scan_stop(struct ocfs2_super *osb); |
| 149 | void ocfs2_orphan_scan_exit(struct ocfs2_super *osb); | 150 | void ocfs2_orphan_scan_exit(struct ocfs2_super *osb); |
| 150 | 151 | ||
| @@ -329,20 +330,27 @@ int ocfs2_journal_dirty(handle_t *handle, | |||
| 329 | /* extended attribute block update */ | 330 | /* extended attribute block update */ |
| 330 | #define OCFS2_XATTR_BLOCK_UPDATE_CREDITS 1 | 331 | #define OCFS2_XATTR_BLOCK_UPDATE_CREDITS 1 |
| 331 | 332 | ||
| 333 | /* Update of a single quota block */ | ||
| 334 | #define OCFS2_QUOTA_BLOCK_UPDATE_CREDITS 1 | ||
| 335 | |||
| 332 | /* global quotafile inode update, data block */ | 336 | /* global quotafile inode update, data block */ |
| 333 | #define OCFS2_QINFO_WRITE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1) | 337 | #define OCFS2_QINFO_WRITE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + \ |
| 338 | OCFS2_QUOTA_BLOCK_UPDATE_CREDITS) | ||
| 334 | 339 | ||
| 340 | #define OCFS2_LOCAL_QINFO_WRITE_CREDITS OCFS2_QUOTA_BLOCK_UPDATE_CREDITS | ||
| 335 | /* | 341 | /* |
| 336 | * The two writes below can accidentally see global info dirty due | 342 | * The two writes below can accidentally see global info dirty due |
| 337 | * to set_info() quotactl so make them prepared for the writes. | 343 | * to set_info() quotactl so make them prepared for the writes. |
| 338 | */ | 344 | */ |
| 339 | /* quota data block, global info */ | 345 | /* quota data block, global info */ |
| 340 | /* Write to local quota file */ | 346 | /* Write to local quota file */ |
| 341 | #define OCFS2_QWRITE_CREDITS (OCFS2_QINFO_WRITE_CREDITS + 1) | 347 | #define OCFS2_QWRITE_CREDITS (OCFS2_QINFO_WRITE_CREDITS + \ |
| 348 | OCFS2_QUOTA_BLOCK_UPDATE_CREDITS) | ||
| 342 | 349 | ||
| 343 | /* global quota data block, local quota data block, global quota inode, | 350 | /* global quota data block, local quota data block, global quota inode, |
| 344 | * global quota info */ | 351 | * global quota info */ |
| 345 | #define OCFS2_QSYNC_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 3) | 352 | #define OCFS2_QSYNC_CREDITS (OCFS2_QINFO_WRITE_CREDITS + \ |
| 353 | 2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS) | ||
| 346 | 354 | ||
| 347 | static inline int ocfs2_quota_trans_credits(struct super_block *sb) | 355 | static inline int ocfs2_quota_trans_credits(struct super_block *sb) |
| 348 | { | 356 | { |
| @@ -355,11 +363,6 @@ static inline int ocfs2_quota_trans_credits(struct super_block *sb) | |||
| 355 | return credits; | 363 | return credits; |
| 356 | } | 364 | } |
| 357 | 365 | ||
| 358 | /* Number of credits needed for removing quota structure from file */ | ||
| 359 | int ocfs2_calc_qdel_credits(struct super_block *sb, int type); | ||
| 360 | /* Number of credits needed for initialization of new quota structure */ | ||
| 361 | int ocfs2_calc_qinit_credits(struct super_block *sb, int type); | ||
| 362 | |||
| 363 | /* group extend. inode update and last group update. */ | 366 | /* group extend. inode update and last group update. */ |
| 364 | #define OCFS2_GROUP_EXTEND_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1) | 367 | #define OCFS2_GROUP_EXTEND_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1) |
| 365 | 368 | ||
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index c9345ebb8493..39e1d5a39505 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
| @@ -224,10 +224,12 @@ enum ocfs2_mount_options | |||
| 224 | OCFS2_MOUNT_GRPQUOTA = 1 << 10, /* We support group quotas */ | 224 | OCFS2_MOUNT_GRPQUOTA = 1 << 10, /* We support group quotas */ |
| 225 | }; | 225 | }; |
| 226 | 226 | ||
| 227 | #define OCFS2_OSB_SOFT_RO 0x0001 | 227 | #define OCFS2_OSB_SOFT_RO 0x0001 |
| 228 | #define OCFS2_OSB_HARD_RO 0x0002 | 228 | #define OCFS2_OSB_HARD_RO 0x0002 |
| 229 | #define OCFS2_OSB_ERROR_FS 0x0004 | 229 | #define OCFS2_OSB_ERROR_FS 0x0004 |
| 230 | #define OCFS2_DEFAULT_ATIME_QUANTUM 60 | 230 | #define OCFS2_OSB_DROP_DENTRY_LOCK_IMMED 0x0008 |
| 231 | |||
| 232 | #define OCFS2_DEFAULT_ATIME_QUANTUM 60 | ||
| 231 | 233 | ||
| 232 | struct ocfs2_journal; | 234 | struct ocfs2_journal; |
| 233 | struct ocfs2_slot_info; | 235 | struct ocfs2_slot_info; |
| @@ -490,6 +492,18 @@ static inline void ocfs2_set_osb_flag(struct ocfs2_super *osb, | |||
| 490 | spin_unlock(&osb->osb_lock); | 492 | spin_unlock(&osb->osb_lock); |
| 491 | } | 493 | } |
| 492 | 494 | ||
| 495 | |||
| 496 | static inline unsigned long ocfs2_test_osb_flag(struct ocfs2_super *osb, | ||
| 497 | unsigned long flag) | ||
| 498 | { | ||
| 499 | unsigned long ret; | ||
| 500 | |||
| 501 | spin_lock(&osb->osb_lock); | ||
| 502 | ret = osb->osb_flags & flag; | ||
| 503 | spin_unlock(&osb->osb_lock); | ||
| 504 | return ret; | ||
| 505 | } | ||
| 506 | |||
| 493 | static inline void ocfs2_set_ro_flag(struct ocfs2_super *osb, | 507 | static inline void ocfs2_set_ro_flag(struct ocfs2_super *osb, |
| 494 | int hard) | 508 | int hard) |
| 495 | { | 509 | { |
diff --git a/fs/ocfs2/quota.h b/fs/ocfs2/quota.h index 7365e2e08706..3fb96fcd4c81 100644 --- a/fs/ocfs2/quota.h +++ b/fs/ocfs2/quota.h | |||
| @@ -50,7 +50,6 @@ struct ocfs2_mem_dqinfo { | |||
| 50 | unsigned int dqi_chunks; /* Number of chunks in local quota file */ | 50 | unsigned int dqi_chunks; /* Number of chunks in local quota file */ |
| 51 | unsigned int dqi_blocks; /* Number of blocks allocated for local quota file */ | 51 | unsigned int dqi_blocks; /* Number of blocks allocated for local quota file */ |
| 52 | unsigned int dqi_syncms; /* How often should we sync with other nodes */ | 52 | unsigned int dqi_syncms; /* How often should we sync with other nodes */ |
| 53 | unsigned int dqi_syncjiff; /* Precomputed dqi_syncms in jiffies */ | ||
| 54 | struct list_head dqi_chunk; /* List of chunks */ | 53 | struct list_head dqi_chunk; /* List of chunks */ |
| 55 | struct inode *dqi_gqinode; /* Global quota file inode */ | 54 | struct inode *dqi_gqinode; /* Global quota file inode */ |
| 56 | struct ocfs2_lock_res dqi_gqlock; /* Lock protecting quota information structure */ | 55 | struct ocfs2_lock_res dqi_gqlock; /* Lock protecting quota information structure */ |
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index edfa60cd155c..bf7742d0ee3b 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c | |||
| @@ -69,6 +69,7 @@ static void ocfs2_global_mem2diskdqb(void *dp, struct dquot *dquot) | |||
| 69 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); | 69 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); |
| 70 | d->dqb_btime = cpu_to_le64(m->dqb_btime); | 70 | d->dqb_btime = cpu_to_le64(m->dqb_btime); |
| 71 | d->dqb_itime = cpu_to_le64(m->dqb_itime); | 71 | d->dqb_itime = cpu_to_le64(m->dqb_itime); |
| 72 | d->dqb_pad1 = d->dqb_pad2 = 0; | ||
| 72 | } | 73 | } |
| 73 | 74 | ||
| 74 | static int ocfs2_global_is_id(void *dp, struct dquot *dquot) | 75 | static int ocfs2_global_is_id(void *dp, struct dquot *dquot) |
| @@ -211,14 +212,13 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, | |||
| 211 | 212 | ||
| 212 | mutex_lock_nested(&gqinode->i_mutex, I_MUTEX_QUOTA); | 213 | mutex_lock_nested(&gqinode->i_mutex, I_MUTEX_QUOTA); |
| 213 | if (gqinode->i_size < off + len) { | 214 | if (gqinode->i_size < off + len) { |
| 214 | down_write(&OCFS2_I(gqinode)->ip_alloc_sem); | 215 | loff_t rounded_end = |
| 215 | err = ocfs2_extend_no_holes(gqinode, off + len, off); | 216 | ocfs2_align_bytes_to_blocks(sb, off + len); |
| 216 | up_write(&OCFS2_I(gqinode)->ip_alloc_sem); | 217 | |
| 217 | if (err < 0) | 218 | /* Space is already allocated in ocfs2_global_read_dquot() */ |
| 218 | goto out; | ||
| 219 | err = ocfs2_simple_size_update(gqinode, | 219 | err = ocfs2_simple_size_update(gqinode, |
| 220 | oinfo->dqi_gqi_bh, | 220 | oinfo->dqi_gqi_bh, |
| 221 | off + len); | 221 | rounded_end); |
| 222 | if (err < 0) | 222 | if (err < 0) |
| 223 | goto out; | 223 | goto out; |
| 224 | new = 1; | 224 | new = 1; |
| @@ -234,7 +234,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, | |||
| 234 | } | 234 | } |
| 235 | if (err) { | 235 | if (err) { |
| 236 | mlog_errno(err); | 236 | mlog_errno(err); |
| 237 | return err; | 237 | goto out; |
| 238 | } | 238 | } |
| 239 | lock_buffer(bh); | 239 | lock_buffer(bh); |
| 240 | if (new) | 240 | if (new) |
| @@ -342,7 +342,6 @@ int ocfs2_global_read_info(struct super_block *sb, int type) | |||
| 342 | info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); | 342 | info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); |
| 343 | info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); | 343 | info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); |
| 344 | oinfo->dqi_syncms = le32_to_cpu(dinfo.dqi_syncms); | 344 | oinfo->dqi_syncms = le32_to_cpu(dinfo.dqi_syncms); |
| 345 | oinfo->dqi_syncjiff = msecs_to_jiffies(oinfo->dqi_syncms); | ||
| 346 | oinfo->dqi_gi.dqi_blocks = le32_to_cpu(dinfo.dqi_blocks); | 345 | oinfo->dqi_gi.dqi_blocks = le32_to_cpu(dinfo.dqi_blocks); |
| 347 | oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk); | 346 | oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk); |
| 348 | oinfo->dqi_gi.dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry); | 347 | oinfo->dqi_gi.dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry); |
| @@ -352,7 +351,7 @@ int ocfs2_global_read_info(struct super_block *sb, int type) | |||
| 352 | oinfo->dqi_gi.dqi_qtree_depth = qtree_depth(&oinfo->dqi_gi); | 351 | oinfo->dqi_gi.dqi_qtree_depth = qtree_depth(&oinfo->dqi_gi); |
| 353 | INIT_DELAYED_WORK(&oinfo->dqi_sync_work, qsync_work_fn); | 352 | INIT_DELAYED_WORK(&oinfo->dqi_sync_work, qsync_work_fn); |
| 354 | queue_delayed_work(ocfs2_quota_wq, &oinfo->dqi_sync_work, | 353 | queue_delayed_work(ocfs2_quota_wq, &oinfo->dqi_sync_work, |
| 355 | oinfo->dqi_syncjiff); | 354 | msecs_to_jiffies(oinfo->dqi_syncms)); |
| 356 | 355 | ||
| 357 | out_err: | 356 | out_err: |
| 358 | mlog_exit(status); | 357 | mlog_exit(status); |
| @@ -402,13 +401,36 @@ int ocfs2_global_write_info(struct super_block *sb, int type) | |||
| 402 | return err; | 401 | return err; |
| 403 | } | 402 | } |
| 404 | 403 | ||
| 404 | static int ocfs2_global_qinit_alloc(struct super_block *sb, int type) | ||
| 405 | { | ||
| 406 | struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv; | ||
| 407 | |||
| 408 | /* | ||
| 409 | * We may need to allocate tree blocks and a leaf block but not the | ||
| 410 | * root block | ||
| 411 | */ | ||
| 412 | return oinfo->dqi_gi.dqi_qtree_depth; | ||
| 413 | } | ||
| 414 | |||
| 415 | static int ocfs2_calc_global_qinit_credits(struct super_block *sb, int type) | ||
| 416 | { | ||
| 417 | /* We modify all the allocated blocks, tree root, and info block */ | ||
| 418 | return (ocfs2_global_qinit_alloc(sb, type) + 2) * | ||
| 419 | OCFS2_QUOTA_BLOCK_UPDATE_CREDITS; | ||
| 420 | } | ||
| 421 | |||
| 405 | /* Read in information from global quota file and acquire a reference to it. | 422 | /* Read in information from global quota file and acquire a reference to it. |
| 406 | * dquot_acquire() has already started the transaction and locked quota file */ | 423 | * dquot_acquire() has already started the transaction and locked quota file */ |
| 407 | int ocfs2_global_read_dquot(struct dquot *dquot) | 424 | int ocfs2_global_read_dquot(struct dquot *dquot) |
| 408 | { | 425 | { |
| 409 | int err, err2, ex = 0; | 426 | int err, err2, ex = 0; |
| 410 | struct ocfs2_mem_dqinfo *info = | 427 | struct super_block *sb = dquot->dq_sb; |
| 411 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; | 428 | int type = dquot->dq_type; |
| 429 | struct ocfs2_mem_dqinfo *info = sb_dqinfo(sb, type)->dqi_priv; | ||
| 430 | struct ocfs2_super *osb = OCFS2_SB(sb); | ||
| 431 | struct inode *gqinode = info->dqi_gqinode; | ||
| 432 | int need_alloc = ocfs2_global_qinit_alloc(sb, type); | ||
| 433 | handle_t *handle = NULL; | ||
| 412 | 434 | ||
| 413 | err = ocfs2_qinfo_lock(info, 0); | 435 | err = ocfs2_qinfo_lock(info, 0); |
| 414 | if (err < 0) | 436 | if (err < 0) |
| @@ -419,14 +441,33 @@ int ocfs2_global_read_dquot(struct dquot *dquot) | |||
| 419 | OCFS2_DQUOT(dquot)->dq_use_count++; | 441 | OCFS2_DQUOT(dquot)->dq_use_count++; |
| 420 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; | 442 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; |
| 421 | OCFS2_DQUOT(dquot)->dq_originodes = dquot->dq_dqb.dqb_curinodes; | 443 | OCFS2_DQUOT(dquot)->dq_originodes = dquot->dq_dqb.dqb_curinodes; |
| 444 | ocfs2_qinfo_unlock(info, 0); | ||
| 445 | |||
| 422 | if (!dquot->dq_off) { /* No real quota entry? */ | 446 | if (!dquot->dq_off) { /* No real quota entry? */ |
| 423 | /* Upgrade to exclusive lock for allocation */ | ||
| 424 | ocfs2_qinfo_unlock(info, 0); | ||
| 425 | err = ocfs2_qinfo_lock(info, 1); | ||
| 426 | if (err < 0) | ||
| 427 | goto out_qlock; | ||
| 428 | ex = 1; | 447 | ex = 1; |
| 448 | /* | ||
| 449 | * Add blocks to quota file before we start a transaction since | ||
| 450 | * locking allocators ranks above a transaction start | ||
| 451 | */ | ||
| 452 | WARN_ON(journal_current_handle()); | ||
| 453 | down_write(&OCFS2_I(gqinode)->ip_alloc_sem); | ||
| 454 | err = ocfs2_extend_no_holes(gqinode, | ||
| 455 | gqinode->i_size + (need_alloc << sb->s_blocksize_bits), | ||
| 456 | gqinode->i_size); | ||
| 457 | up_write(&OCFS2_I(gqinode)->ip_alloc_sem); | ||
| 458 | if (err < 0) | ||
| 459 | goto out; | ||
| 429 | } | 460 | } |
| 461 | |||
| 462 | handle = ocfs2_start_trans(osb, | ||
| 463 | ocfs2_calc_global_qinit_credits(sb, type)); | ||
| 464 | if (IS_ERR(handle)) { | ||
| 465 | err = PTR_ERR(handle); | ||
| 466 | goto out; | ||
| 467 | } | ||
| 468 | err = ocfs2_qinfo_lock(info, ex); | ||
| 469 | if (err < 0) | ||
| 470 | goto out_trans; | ||
| 430 | err = qtree_write_dquot(&info->dqi_gi, dquot); | 471 | err = qtree_write_dquot(&info->dqi_gi, dquot); |
| 431 | if (ex && info_dirty(sb_dqinfo(dquot->dq_sb, dquot->dq_type))) { | 472 | if (ex && info_dirty(sb_dqinfo(dquot->dq_sb, dquot->dq_type))) { |
| 432 | err2 = __ocfs2_global_write_info(dquot->dq_sb, dquot->dq_type); | 473 | err2 = __ocfs2_global_write_info(dquot->dq_sb, dquot->dq_type); |
| @@ -438,6 +479,9 @@ out_qlock: | |||
| 438 | ocfs2_qinfo_unlock(info, 1); | 479 | ocfs2_qinfo_unlock(info, 1); |
| 439 | else | 480 | else |
| 440 | ocfs2_qinfo_unlock(info, 0); | 481 | ocfs2_qinfo_unlock(info, 0); |
| 482 | out_trans: | ||
| 483 | if (handle) | ||
| 484 | ocfs2_commit_trans(osb, handle); | ||
| 441 | out: | 485 | out: |
| 442 | if (err < 0) | 486 | if (err < 0) |
| 443 | mlog_errno(err); | 487 | mlog_errno(err); |
| @@ -607,7 +651,7 @@ static void qsync_work_fn(struct work_struct *work) | |||
| 607 | 651 | ||
| 608 | dquot_scan_active(sb, ocfs2_sync_dquot_helper, oinfo->dqi_type); | 652 | dquot_scan_active(sb, ocfs2_sync_dquot_helper, oinfo->dqi_type); |
| 609 | queue_delayed_work(ocfs2_quota_wq, &oinfo->dqi_sync_work, | 653 | queue_delayed_work(ocfs2_quota_wq, &oinfo->dqi_sync_work, |
| 610 | oinfo->dqi_syncjiff); | 654 | msecs_to_jiffies(oinfo->dqi_syncms)); |
| 611 | } | 655 | } |
| 612 | 656 | ||
| 613 | /* | 657 | /* |
| @@ -635,20 +679,18 @@ out: | |||
| 635 | return status; | 679 | return status; |
| 636 | } | 680 | } |
| 637 | 681 | ||
| 638 | int ocfs2_calc_qdel_credits(struct super_block *sb, int type) | 682 | static int ocfs2_calc_qdel_credits(struct super_block *sb, int type) |
| 639 | { | 683 | { |
| 640 | struct ocfs2_mem_dqinfo *oinfo; | 684 | struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv; |
| 641 | int features[MAXQUOTAS] = { OCFS2_FEATURE_RO_COMPAT_USRQUOTA, | 685 | /* |
| 642 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA }; | 686 | * We modify tree, leaf block, global info, local chunk header, |
| 643 | 687 | * global and local inode; OCFS2_QINFO_WRITE_CREDITS already | |
| 644 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, features[type])) | 688 | * accounts for inode update |
| 645 | return 0; | 689 | */ |
| 646 | 690 | return (oinfo->dqi_gi.dqi_qtree_depth + 2) * | |
| 647 | oinfo = sb_dqinfo(sb, type)->dqi_priv; | 691 | OCFS2_QUOTA_BLOCK_UPDATE_CREDITS + |
| 648 | /* We modify tree, leaf block, global info, local chunk header, | 692 | OCFS2_QINFO_WRITE_CREDITS + |
| 649 | * global and local inode */ | 693 | OCFS2_INODE_UPDATE_CREDITS; |
| 650 | return oinfo->dqi_gi.dqi_qtree_depth + 2 + 1 + | ||
| 651 | 2 * OCFS2_INODE_UPDATE_CREDITS; | ||
| 652 | } | 694 | } |
| 653 | 695 | ||
| 654 | static int ocfs2_release_dquot(struct dquot *dquot) | 696 | static int ocfs2_release_dquot(struct dquot *dquot) |
| @@ -680,33 +722,10 @@ out: | |||
| 680 | return status; | 722 | return status; |
| 681 | } | 723 | } |
| 682 | 724 | ||
| 683 | int ocfs2_calc_qinit_credits(struct super_block *sb, int type) | ||
| 684 | { | ||
| 685 | struct ocfs2_mem_dqinfo *oinfo; | ||
| 686 | int features[MAXQUOTAS] = { OCFS2_FEATURE_RO_COMPAT_USRQUOTA, | ||
| 687 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA }; | ||
| 688 | struct ocfs2_dinode *lfe, *gfe; | ||
| 689 | |||
| 690 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, features[type])) | ||
| 691 | return 0; | ||
| 692 | |||
| 693 | oinfo = sb_dqinfo(sb, type)->dqi_priv; | ||
| 694 | gfe = (struct ocfs2_dinode *)oinfo->dqi_gqi_bh->b_data; | ||
| 695 | lfe = (struct ocfs2_dinode *)oinfo->dqi_lqi_bh->b_data; | ||
| 696 | /* We can extend local file + global file. In local file we | ||
| 697 | * can modify info, chunk header block and dquot block. In | ||
| 698 | * global file we can modify info, tree and leaf block */ | ||
| 699 | return ocfs2_calc_extend_credits(sb, &lfe->id2.i_list, 0) + | ||
| 700 | ocfs2_calc_extend_credits(sb, &gfe->id2.i_list, 0) + | ||
| 701 | 3 + oinfo->dqi_gi.dqi_qtree_depth + 2; | ||
| 702 | } | ||
| 703 | |||
| 704 | static int ocfs2_acquire_dquot(struct dquot *dquot) | 725 | static int ocfs2_acquire_dquot(struct dquot *dquot) |
| 705 | { | 726 | { |
| 706 | handle_t *handle; | ||
| 707 | struct ocfs2_mem_dqinfo *oinfo = | 727 | struct ocfs2_mem_dqinfo *oinfo = |
| 708 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; | 728 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; |
| 709 | struct ocfs2_super *osb = OCFS2_SB(dquot->dq_sb); | ||
| 710 | int status = 0; | 729 | int status = 0; |
| 711 | 730 | ||
| 712 | mlog_entry("id=%u, type=%d", dquot->dq_id, dquot->dq_type); | 731 | mlog_entry("id=%u, type=%d", dquot->dq_id, dquot->dq_type); |
| @@ -715,16 +734,7 @@ static int ocfs2_acquire_dquot(struct dquot *dquot) | |||
| 715 | status = ocfs2_lock_global_qf(oinfo, 1); | 734 | status = ocfs2_lock_global_qf(oinfo, 1); |
| 716 | if (status < 0) | 735 | if (status < 0) |
| 717 | goto out; | 736 | goto out; |
| 718 | handle = ocfs2_start_trans(osb, | ||
| 719 | ocfs2_calc_qinit_credits(dquot->dq_sb, dquot->dq_type)); | ||
| 720 | if (IS_ERR(handle)) { | ||
| 721 | status = PTR_ERR(handle); | ||
| 722 | mlog_errno(status); | ||
| 723 | goto out_ilock; | ||
| 724 | } | ||
| 725 | status = dquot_acquire(dquot); | 737 | status = dquot_acquire(dquot); |
| 726 | ocfs2_commit_trans(osb, handle); | ||
| 727 | out_ilock: | ||
| 728 | ocfs2_unlock_global_qf(oinfo, 1); | 738 | ocfs2_unlock_global_qf(oinfo, 1); |
| 729 | out: | 739 | out: |
| 730 | mlog_exit(status); | 740 | mlog_exit(status); |
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index 5a460fa82553..bdb09cb6e1fe 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include "sysfile.h" | 20 | #include "sysfile.h" |
| 21 | #include "dlmglue.h" | 21 | #include "dlmglue.h" |
| 22 | #include "quota.h" | 22 | #include "quota.h" |
| 23 | #include "uptodate.h" | ||
| 23 | 24 | ||
| 24 | /* Number of local quota structures per block */ | 25 | /* Number of local quota structures per block */ |
| 25 | static inline unsigned int ol_quota_entries_per_block(struct super_block *sb) | 26 | static inline unsigned int ol_quota_entries_per_block(struct super_block *sb) |
| @@ -100,7 +101,8 @@ static int ocfs2_modify_bh(struct inode *inode, struct buffer_head *bh, | |||
| 100 | handle_t *handle; | 101 | handle_t *handle; |
| 101 | int status; | 102 | int status; |
| 102 | 103 | ||
| 103 | handle = ocfs2_start_trans(OCFS2_SB(sb), 1); | 104 | handle = ocfs2_start_trans(OCFS2_SB(sb), |
| 105 | OCFS2_QUOTA_BLOCK_UPDATE_CREDITS); | ||
| 104 | if (IS_ERR(handle)) { | 106 | if (IS_ERR(handle)) { |
| 105 | status = PTR_ERR(handle); | 107 | status = PTR_ERR(handle); |
| 106 | mlog_errno(status); | 108 | mlog_errno(status); |
| @@ -610,7 +612,8 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb, | |||
| 610 | goto out_bh; | 612 | goto out_bh; |
| 611 | /* Mark quota file as clean if we are recovering quota file of | 613 | /* Mark quota file as clean if we are recovering quota file of |
| 612 | * some other node. */ | 614 | * some other node. */ |
| 613 | handle = ocfs2_start_trans(osb, 1); | 615 | handle = ocfs2_start_trans(osb, |
| 616 | OCFS2_LOCAL_QINFO_WRITE_CREDITS); | ||
| 614 | if (IS_ERR(handle)) { | 617 | if (IS_ERR(handle)) { |
| 615 | status = PTR_ERR(handle); | 618 | status = PTR_ERR(handle); |
| 616 | mlog_errno(status); | 619 | mlog_errno(status); |
| @@ -940,7 +943,7 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk( | |||
| 940 | struct ocfs2_local_disk_chunk *dchunk; | 943 | struct ocfs2_local_disk_chunk *dchunk; |
| 941 | int status; | 944 | int status; |
| 942 | handle_t *handle; | 945 | handle_t *handle; |
| 943 | struct buffer_head *bh = NULL; | 946 | struct buffer_head *bh = NULL, *dbh = NULL; |
| 944 | u64 p_blkno; | 947 | u64 p_blkno; |
| 945 | 948 | ||
| 946 | /* We are protected by dqio_sem so no locking needed */ | 949 | /* We are protected by dqio_sem so no locking needed */ |
| @@ -964,32 +967,35 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk( | |||
| 964 | mlog_errno(status); | 967 | mlog_errno(status); |
| 965 | goto out; | 968 | goto out; |
| 966 | } | 969 | } |
| 970 | /* Local quota info and two new blocks we initialize */ | ||
| 971 | handle = ocfs2_start_trans(OCFS2_SB(sb), | ||
| 972 | OCFS2_LOCAL_QINFO_WRITE_CREDITS + | ||
| 973 | 2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS); | ||
| 974 | if (IS_ERR(handle)) { | ||
| 975 | status = PTR_ERR(handle); | ||
| 976 | mlog_errno(status); | ||
| 977 | goto out; | ||
| 978 | } | ||
| 967 | 979 | ||
| 980 | /* Initialize chunk header */ | ||
| 968 | down_read(&OCFS2_I(lqinode)->ip_alloc_sem); | 981 | down_read(&OCFS2_I(lqinode)->ip_alloc_sem); |
| 969 | status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks, | 982 | status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks, |
| 970 | &p_blkno, NULL, NULL); | 983 | &p_blkno, NULL, NULL); |
| 971 | up_read(&OCFS2_I(lqinode)->ip_alloc_sem); | 984 | up_read(&OCFS2_I(lqinode)->ip_alloc_sem); |
| 972 | if (status < 0) { | 985 | if (status < 0) { |
| 973 | mlog_errno(status); | 986 | mlog_errno(status); |
| 974 | goto out; | 987 | goto out_trans; |
| 975 | } | 988 | } |
| 976 | bh = sb_getblk(sb, p_blkno); | 989 | bh = sb_getblk(sb, p_blkno); |
| 977 | if (!bh) { | 990 | if (!bh) { |
| 978 | status = -ENOMEM; | 991 | status = -ENOMEM; |
| 979 | mlog_errno(status); | 992 | mlog_errno(status); |
| 980 | goto out; | 993 | goto out_trans; |
| 981 | } | 994 | } |
| 982 | dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data; | 995 | dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data; |
| 983 | 996 | ocfs2_set_new_buffer_uptodate(lqinode, bh); | |
| 984 | handle = ocfs2_start_trans(OCFS2_SB(sb), 2); | ||
| 985 | if (IS_ERR(handle)) { | ||
| 986 | status = PTR_ERR(handle); | ||
| 987 | mlog_errno(status); | ||
| 988 | goto out; | ||
| 989 | } | ||
| 990 | |||
| 991 | status = ocfs2_journal_access_dq(handle, lqinode, bh, | 997 | status = ocfs2_journal_access_dq(handle, lqinode, bh, |
| 992 | OCFS2_JOURNAL_ACCESS_WRITE); | 998 | OCFS2_JOURNAL_ACCESS_CREATE); |
| 993 | if (status < 0) { | 999 | if (status < 0) { |
| 994 | mlog_errno(status); | 1000 | mlog_errno(status); |
| 995 | goto out_trans; | 1001 | goto out_trans; |
| @@ -999,7 +1005,6 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk( | |||
| 999 | memset(dchunk->dqc_bitmap, 0, | 1005 | memset(dchunk->dqc_bitmap, 0, |
| 1000 | sb->s_blocksize - sizeof(struct ocfs2_local_disk_chunk) - | 1006 | sb->s_blocksize - sizeof(struct ocfs2_local_disk_chunk) - |
| 1001 | OCFS2_QBLK_RESERVED_SPACE); | 1007 | OCFS2_QBLK_RESERVED_SPACE); |
| 1002 | set_buffer_uptodate(bh); | ||
| 1003 | unlock_buffer(bh); | 1008 | unlock_buffer(bh); |
| 1004 | status = ocfs2_journal_dirty(handle, bh); | 1009 | status = ocfs2_journal_dirty(handle, bh); |
| 1005 | if (status < 0) { | 1010 | if (status < 0) { |
| @@ -1007,6 +1012,38 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk( | |||
| 1007 | goto out_trans; | 1012 | goto out_trans; |
| 1008 | } | 1013 | } |
| 1009 | 1014 | ||
| 1015 | /* Initialize new block with structures */ | ||
| 1016 | down_read(&OCFS2_I(lqinode)->ip_alloc_sem); | ||
| 1017 | status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks + 1, | ||
| 1018 | &p_blkno, NULL, NULL); | ||
| 1019 | up_read(&OCFS2_I(lqinode)->ip_alloc_sem); | ||
| 1020 | if (status < 0) { | ||
| 1021 | mlog_errno(status); | ||
| 1022 | goto out_trans; | ||
| 1023 | } | ||
| 1024 | dbh = sb_getblk(sb, p_blkno); | ||
| 1025 | if (!dbh) { | ||
| 1026 | status = -ENOMEM; | ||
| 1027 | mlog_errno(status); | ||
| 1028 | goto out_trans; | ||
| 1029 | } | ||
| 1030 | ocfs2_set_new_buffer_uptodate(lqinode, dbh); | ||
| 1031 | status = ocfs2_journal_access_dq(handle, lqinode, dbh, | ||
| 1032 | OCFS2_JOURNAL_ACCESS_CREATE); | ||
| 1033 | if (status < 0) { | ||
| 1034 | mlog_errno(status); | ||
| 1035 | goto out_trans; | ||
| 1036 | } | ||
| 1037 | lock_buffer(dbh); | ||
| 1038 | memset(dbh->b_data, 0, sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE); | ||
| 1039 | unlock_buffer(dbh); | ||
| 1040 | status = ocfs2_journal_dirty(handle, dbh); | ||
| 1041 | if (status < 0) { | ||
| 1042 | mlog_errno(status); | ||
| 1043 | goto out_trans; | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | /* Update local quotafile info */ | ||
| 1010 | oinfo->dqi_blocks += 2; | 1047 | oinfo->dqi_blocks += 2; |
| 1011 | oinfo->dqi_chunks++; | 1048 | oinfo->dqi_chunks++; |
| 1012 | status = ocfs2_local_write_info(sb, type); | 1049 | status = ocfs2_local_write_info(sb, type); |
| @@ -1031,6 +1068,7 @@ out_trans: | |||
| 1031 | ocfs2_commit_trans(OCFS2_SB(sb), handle); | 1068 | ocfs2_commit_trans(OCFS2_SB(sb), handle); |
| 1032 | out: | 1069 | out: |
| 1033 | brelse(bh); | 1070 | brelse(bh); |
| 1071 | brelse(dbh); | ||
| 1034 | kmem_cache_free(ocfs2_qf_chunk_cachep, chunk); | 1072 | kmem_cache_free(ocfs2_qf_chunk_cachep, chunk); |
| 1035 | return ERR_PTR(status); | 1073 | return ERR_PTR(status); |
| 1036 | } | 1074 | } |
| @@ -1048,6 +1086,8 @@ static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file( | |||
| 1048 | struct ocfs2_local_disk_chunk *dchunk; | 1086 | struct ocfs2_local_disk_chunk *dchunk; |
| 1049 | int epb = ol_quota_entries_per_block(sb); | 1087 | int epb = ol_quota_entries_per_block(sb); |
| 1050 | unsigned int chunk_blocks; | 1088 | unsigned int chunk_blocks; |
| 1089 | struct buffer_head *bh; | ||
| 1090 | u64 p_blkno; | ||
| 1051 | int status; | 1091 | int status; |
| 1052 | handle_t *handle; | 1092 | handle_t *handle; |
| 1053 | 1093 | ||
| @@ -1075,12 +1115,49 @@ static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file( | |||
| 1075 | mlog_errno(status); | 1115 | mlog_errno(status); |
| 1076 | goto out; | 1116 | goto out; |
| 1077 | } | 1117 | } |
| 1078 | handle = ocfs2_start_trans(OCFS2_SB(sb), 2); | 1118 | |
| 1119 | /* Get buffer from the just added block */ | ||
| 1120 | down_read(&OCFS2_I(lqinode)->ip_alloc_sem); | ||
| 1121 | status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks, | ||
| 1122 | &p_blkno, NULL, NULL); | ||
| 1123 | up_read(&OCFS2_I(lqinode)->ip_alloc_sem); | ||
| 1124 | if (status < 0) { | ||
| 1125 | mlog_errno(status); | ||
| 1126 | goto out; | ||
| 1127 | } | ||
| 1128 | bh = sb_getblk(sb, p_blkno); | ||
| 1129 | if (!bh) { | ||
| 1130 | status = -ENOMEM; | ||
| 1131 | mlog_errno(status); | ||
| 1132 | goto out; | ||
| 1133 | } | ||
| 1134 | ocfs2_set_new_buffer_uptodate(lqinode, bh); | ||
| 1135 | |||
| 1136 | /* Local quota info, chunk header and the new block we initialize */ | ||
| 1137 | handle = ocfs2_start_trans(OCFS2_SB(sb), | ||
| 1138 | OCFS2_LOCAL_QINFO_WRITE_CREDITS + | ||
| 1139 | 2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS); | ||
| 1079 | if (IS_ERR(handle)) { | 1140 | if (IS_ERR(handle)) { |
| 1080 | status = PTR_ERR(handle); | 1141 | status = PTR_ERR(handle); |
| 1081 | mlog_errno(status); | 1142 | mlog_errno(status); |
| 1082 | goto out; | 1143 | goto out; |
| 1083 | } | 1144 | } |
| 1145 | /* Zero created block */ | ||
| 1146 | status = ocfs2_journal_access_dq(handle, lqinode, bh, | ||
| 1147 | OCFS2_JOURNAL_ACCESS_CREATE); | ||
| 1148 | if (status < 0) { | ||
| 1149 | mlog_errno(status); | ||
| 1150 | goto out_trans; | ||
| 1151 | } | ||
| 1152 | lock_buffer(bh); | ||
| 1153 | memset(bh->b_data, 0, sb->s_blocksize); | ||
| 1154 | unlock_buffer(bh); | ||
| 1155 | status = ocfs2_journal_dirty(handle, bh); | ||
| 1156 | if (status < 0) { | ||
| 1157 | mlog_errno(status); | ||
| 1158 | goto out_trans; | ||
| 1159 | } | ||
| 1160 | /* Update chunk header */ | ||
| 1084 | status = ocfs2_journal_access_dq(handle, lqinode, chunk->qc_headerbh, | 1161 | status = ocfs2_journal_access_dq(handle, lqinode, chunk->qc_headerbh, |
| 1085 | OCFS2_JOURNAL_ACCESS_WRITE); | 1162 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 1086 | if (status < 0) { | 1163 | if (status < 0) { |
| @@ -1097,6 +1174,7 @@ static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file( | |||
| 1097 | mlog_errno(status); | 1174 | mlog_errno(status); |
| 1098 | goto out_trans; | 1175 | goto out_trans; |
| 1099 | } | 1176 | } |
| 1177 | /* Update file header */ | ||
| 1100 | oinfo->dqi_blocks++; | 1178 | oinfo->dqi_blocks++; |
| 1101 | status = ocfs2_local_write_info(sb, type); | 1179 | status = ocfs2_local_write_info(sb, type); |
| 1102 | if (status < 0) { | 1180 | if (status < 0) { |
diff --git a/fs/ocfs2/stack_o2cb.c b/fs/ocfs2/stack_o2cb.c index 3f661376a2de..e49c41050264 100644 --- a/fs/ocfs2/stack_o2cb.c +++ b/fs/ocfs2/stack_o2cb.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | * General Public License for more details. | 17 | * General Public License for more details. |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <linux/kernel.h> | ||
| 20 | #include <linux/crc32.h> | 21 | #include <linux/crc32.h> |
| 21 | #include <linux/module.h> | 22 | #include <linux/module.h> |
| 22 | 23 | ||
| @@ -153,7 +154,7 @@ static int status_map[] = { | |||
| 153 | 154 | ||
| 154 | static int dlm_status_to_errno(enum dlm_status status) | 155 | static int dlm_status_to_errno(enum dlm_status status) |
| 155 | { | 156 | { |
| 156 | BUG_ON(status > (sizeof(status_map) / sizeof(status_map[0]))); | 157 | BUG_ON(status < 0 || status >= ARRAY_SIZE(status_map)); |
| 157 | 158 | ||
| 158 | return status_map[status]; | 159 | return status_map[status]; |
| 159 | } | 160 | } |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 7efb349fb9bd..b0ee0fdf799a 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -777,6 +777,7 @@ static int ocfs2_sb_probe(struct super_block *sb, | |||
| 777 | } | 777 | } |
| 778 | di = (struct ocfs2_dinode *) (*bh)->b_data; | 778 | di = (struct ocfs2_dinode *) (*bh)->b_data; |
| 779 | memset(stats, 0, sizeof(struct ocfs2_blockcheck_stats)); | 779 | memset(stats, 0, sizeof(struct ocfs2_blockcheck_stats)); |
| 780 | spin_lock_init(&stats->b_lock); | ||
| 780 | status = ocfs2_verify_volume(di, *bh, blksize, stats); | 781 | status = ocfs2_verify_volume(di, *bh, blksize, stats); |
| 781 | if (status >= 0) | 782 | if (status >= 0) |
| 782 | goto bail; | 783 | goto bail; |
| @@ -1182,7 +1183,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1182 | wake_up(&osb->osb_mount_event); | 1183 | wake_up(&osb->osb_mount_event); |
| 1183 | 1184 | ||
| 1184 | /* Start this when the mount is almost sure of being successful */ | 1185 | /* Start this when the mount is almost sure of being successful */ |
| 1185 | ocfs2_orphan_scan_init(osb); | 1186 | ocfs2_orphan_scan_start(osb); |
| 1186 | 1187 | ||
| 1187 | mlog_exit(status); | 1188 | mlog_exit(status); |
| 1188 | return status; | 1189 | return status; |
| @@ -1213,14 +1214,27 @@ static int ocfs2_get_sb(struct file_system_type *fs_type, | |||
| 1213 | mnt); | 1214 | mnt); |
| 1214 | } | 1215 | } |
| 1215 | 1216 | ||
| 1217 | static void ocfs2_kill_sb(struct super_block *sb) | ||
| 1218 | { | ||
| 1219 | struct ocfs2_super *osb = OCFS2_SB(sb); | ||
| 1220 | |||
| 1221 | /* Prevent further queueing of inode drop events */ | ||
| 1222 | spin_lock(&dentry_list_lock); | ||
| 1223 | ocfs2_set_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED); | ||
| 1224 | spin_unlock(&dentry_list_lock); | ||
| 1225 | /* Wait for work to finish and/or remove it */ | ||
| 1226 | cancel_work_sync(&osb->dentry_lock_work); | ||
| 1227 | |||
| 1228 | kill_block_super(sb); | ||
| 1229 | } | ||
| 1230 | |||
| 1216 | static struct file_system_type ocfs2_fs_type = { | 1231 | static struct file_system_type ocfs2_fs_type = { |
| 1217 | .owner = THIS_MODULE, | 1232 | .owner = THIS_MODULE, |
| 1218 | .name = "ocfs2", | 1233 | .name = "ocfs2", |
| 1219 | .get_sb = ocfs2_get_sb, /* is this called when we mount | 1234 | .get_sb = ocfs2_get_sb, /* is this called when we mount |
| 1220 | * the fs? */ | 1235 | * the fs? */ |
| 1221 | .kill_sb = kill_block_super, /* set to the generic one | 1236 | .kill_sb = ocfs2_kill_sb, |
| 1222 | * right now, but do we | 1237 | |
| 1223 | * need to change that? */ | ||
| 1224 | .fs_flags = FS_REQUIRES_DEV|FS_RENAME_DOES_D_MOVE, | 1238 | .fs_flags = FS_REQUIRES_DEV|FS_RENAME_DOES_D_MOVE, |
| 1225 | .next = NULL | 1239 | .next = NULL |
| 1226 | }; | 1240 | }; |
| @@ -1819,6 +1833,12 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err) | |||
| 1819 | 1833 | ||
| 1820 | debugfs_remove(osb->osb_ctxt); | 1834 | debugfs_remove(osb->osb_ctxt); |
| 1821 | 1835 | ||
| 1836 | /* | ||
| 1837 | * Flush inode dropping work queue so that deletes are | ||
| 1838 | * performed while the filesystem is still working | ||
| 1839 | */ | ||
| 1840 | ocfs2_drop_all_dl_inodes(osb); | ||
| 1841 | |||
| 1822 | /* Orphan scan should be stopped as early as possible */ | 1842 | /* Orphan scan should be stopped as early as possible */ |
| 1823 | ocfs2_orphan_scan_stop(osb); | 1843 | ocfs2_orphan_scan_stop(osb); |
| 1824 | 1844 | ||
| @@ -1981,6 +2001,8 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
| 1981 | snprintf(osb->dev_str, sizeof(osb->dev_str), "%u,%u", | 2001 | snprintf(osb->dev_str, sizeof(osb->dev_str), "%u,%u", |
| 1982 | MAJOR(osb->sb->s_dev), MINOR(osb->sb->s_dev)); | 2002 | MAJOR(osb->sb->s_dev), MINOR(osb->sb->s_dev)); |
| 1983 | 2003 | ||
| 2004 | ocfs2_orphan_scan_init(osb); | ||
| 2005 | |||
| 1984 | status = ocfs2_recovery_init(osb); | 2006 | status = ocfs2_recovery_init(osb); |
| 1985 | if (status) { | 2007 | if (status) { |
| 1986 | mlog(ML_ERROR, "Unable to initialize recovery state\n"); | 2008 | mlog(ML_ERROR, "Unable to initialize recovery state\n"); |
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index ba320e250747..d1a27cda984f 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c | |||
| @@ -1052,7 +1052,8 @@ static int ocfs2_xattr_block_get(struct inode *inode, | |||
| 1052 | struct ocfs2_xattr_block *xb; | 1052 | struct ocfs2_xattr_block *xb; |
| 1053 | struct ocfs2_xattr_value_root *xv; | 1053 | struct ocfs2_xattr_value_root *xv; |
| 1054 | size_t size; | 1054 | size_t size; |
| 1055 | int ret = -ENODATA, name_offset, name_len, block_off, i; | 1055 | int ret = -ENODATA, name_offset, name_len, i; |
| 1056 | int uninitialized_var(block_off); | ||
| 1056 | 1057 | ||
| 1057 | xs->bucket = ocfs2_xattr_bucket_new(inode); | 1058 | xs->bucket = ocfs2_xattr_bucket_new(inode); |
| 1058 | if (!xs->bucket) { | 1059 | if (!xs->bucket) { |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 0c93c7ef3d18..965df1227d64 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -770,7 +770,7 @@ xfs_buf_associate_memory( | |||
| 770 | bp->b_pages = NULL; | 770 | bp->b_pages = NULL; |
| 771 | bp->b_addr = mem; | 771 | bp->b_addr = mem; |
| 772 | 772 | ||
| 773 | rval = _xfs_buf_get_pages(bp, page_count, 0); | 773 | rval = _xfs_buf_get_pages(bp, page_count, XBF_DONT_BLOCK); |
| 774 | if (rval) | 774 | if (rval) |
| 775 | return rval; | 775 | return rval; |
| 776 | 776 | ||
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index db15feb906ff..4ece1906bd41 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c | |||
| @@ -2010,7 +2010,9 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) | |||
| 2010 | dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); | 2010 | dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); |
| 2011 | blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); | 2011 | blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); |
| 2012 | error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno, | 2012 | error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno, |
| 2013 | blkcnt, XFS_BUF_LOCK, &bp); | 2013 | blkcnt, |
| 2014 | XFS_BUF_LOCK | XBF_DONT_BLOCK, | ||
| 2015 | &bp); | ||
| 2014 | if (error) | 2016 | if (error) |
| 2015 | return(error); | 2017 | return(error); |
| 2016 | 2018 | ||
| @@ -2141,8 +2143,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) | |||
| 2141 | dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), | 2143 | dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), |
| 2142 | blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); | 2144 | blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); |
| 2143 | 2145 | ||
| 2144 | bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, | 2146 | bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, blkcnt, |
| 2145 | blkcnt, XFS_BUF_LOCK); | 2147 | XFS_BUF_LOCK | XBF_DONT_BLOCK); |
| 2146 | ASSERT(bp); | 2148 | ASSERT(bp); |
| 2147 | ASSERT(!XFS_BUF_GETERROR(bp)); | 2149 | ASSERT(!XFS_BUF_GETERROR(bp)); |
| 2148 | 2150 | ||
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 7928b9983c1d..8ee5b5a76a2a 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -6009,7 +6009,7 @@ xfs_getbmap( | |||
| 6009 | */ | 6009 | */ |
| 6010 | error = ENOMEM; | 6010 | error = ENOMEM; |
| 6011 | subnex = 16; | 6011 | subnex = 16; |
| 6012 | map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL); | 6012 | map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL | KM_NOFS); |
| 6013 | if (!map) | 6013 | if (!map) |
| 6014 | goto out_unlock_ilock; | 6014 | goto out_unlock_ilock; |
| 6015 | 6015 | ||
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index e9df99574829..26717388acf5 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c | |||
| @@ -120,8 +120,8 @@ xfs_btree_check_sblock( | |||
| 120 | XFS_RANDOM_BTREE_CHECK_SBLOCK))) { | 120 | XFS_RANDOM_BTREE_CHECK_SBLOCK))) { |
| 121 | if (bp) | 121 | if (bp) |
| 122 | xfs_buftrace("SBTREE ERROR", bp); | 122 | xfs_buftrace("SBTREE ERROR", bp); |
| 123 | XFS_ERROR_REPORT("xfs_btree_check_sblock", XFS_ERRLEVEL_LOW, | 123 | XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", |
| 124 | cur->bc_mp); | 124 | XFS_ERRLEVEL_LOW, cur->bc_mp, block); |
| 125 | return XFS_ERROR(EFSCORRUPTED); | 125 | return XFS_ERROR(EFSCORRUPTED); |
| 126 | } | 126 | } |
| 127 | return 0; | 127 | return 0; |
diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 9ff6e57a5075..2847bbc1c534 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c | |||
| @@ -2201,7 +2201,7 @@ kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ | |||
| 2201 | xfs_da_state_t * | 2201 | xfs_da_state_t * |
| 2202 | xfs_da_state_alloc(void) | 2202 | xfs_da_state_alloc(void) |
| 2203 | { | 2203 | { |
| 2204 | return kmem_zone_zalloc(xfs_da_state_zone, KM_SLEEP); | 2204 | return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); |
| 2205 | } | 2205 | } |
| 2206 | 2206 | ||
| 2207 | /* | 2207 | /* |
| @@ -2261,9 +2261,9 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra) | |||
| 2261 | int off; | 2261 | int off; |
| 2262 | 2262 | ||
| 2263 | if (nbuf == 1) | 2263 | if (nbuf == 1) |
| 2264 | dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP); | 2264 | dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS); |
| 2265 | else | 2265 | else |
| 2266 | dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP); | 2266 | dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS); |
| 2267 | dabuf->dirty = 0; | 2267 | dabuf->dirty = 0; |
| 2268 | #ifdef XFS_DABUF_DEBUG | 2268 | #ifdef XFS_DABUF_DEBUG |
| 2269 | dabuf->ra = ra; | 2269 | dabuf->ra = ra; |
diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index c657bec6d951..bb1d58eb3982 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c | |||
| @@ -256,7 +256,7 @@ xfs_dir_cilookup_result( | |||
| 256 | !(args->op_flags & XFS_DA_OP_CILOOKUP)) | 256 | !(args->op_flags & XFS_DA_OP_CILOOKUP)) |
| 257 | return EEXIST; | 257 | return EEXIST; |
| 258 | 258 | ||
| 259 | args->value = kmem_alloc(len, KM_MAYFAIL); | 259 | args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL); |
| 260 | if (!args->value) | 260 | if (!args->value) |
| 261 | return ENOMEM; | 261 | return ENOMEM; |
| 262 | 262 | ||
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index cbd451bb4848..2d0b3e1da9e6 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c | |||
| @@ -167,17 +167,25 @@ xfs_growfs_data_private( | |||
| 167 | new = nb - mp->m_sb.sb_dblocks; | 167 | new = nb - mp->m_sb.sb_dblocks; |
| 168 | oagcount = mp->m_sb.sb_agcount; | 168 | oagcount = mp->m_sb.sb_agcount; |
| 169 | if (nagcount > oagcount) { | 169 | if (nagcount > oagcount) { |
| 170 | void *new_perag, *old_perag; | ||
| 171 | |||
| 170 | xfs_filestream_flush(mp); | 172 | xfs_filestream_flush(mp); |
| 173 | |||
| 174 | new_perag = kmem_zalloc(sizeof(xfs_perag_t) * nagcount, | ||
| 175 | KM_MAYFAIL); | ||
| 176 | if (!new_perag) | ||
| 177 | return XFS_ERROR(ENOMEM); | ||
| 178 | |||
| 171 | down_write(&mp->m_peraglock); | 179 | down_write(&mp->m_peraglock); |
| 172 | mp->m_perag = kmem_realloc(mp->m_perag, | 180 | memcpy(new_perag, mp->m_perag, sizeof(xfs_perag_t) * oagcount); |
| 173 | sizeof(xfs_perag_t) * nagcount, | 181 | old_perag = mp->m_perag; |
| 174 | sizeof(xfs_perag_t) * oagcount, | 182 | mp->m_perag = new_perag; |
| 175 | KM_SLEEP); | 183 | |
| 176 | memset(&mp->m_perag[oagcount], 0, | ||
| 177 | (nagcount - oagcount) * sizeof(xfs_perag_t)); | ||
| 178 | mp->m_flags |= XFS_MOUNT_32BITINODES; | 184 | mp->m_flags |= XFS_MOUNT_32BITINODES; |
| 179 | nagimax = xfs_initialize_perag(mp, nagcount); | 185 | nagimax = xfs_initialize_perag(mp, nagcount); |
| 180 | up_write(&mp->m_peraglock); | 186 | up_write(&mp->m_peraglock); |
| 187 | |||
| 188 | kmem_free(old_perag); | ||
| 181 | } | 189 | } |
| 182 | tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS); | 190 | tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS); |
| 183 | tp->t_flags |= XFS_TRANS_RESERVE; | 191 | tp->t_flags |= XFS_TRANS_RESERVE; |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 1f22d65fed0a..da428b3fe0f5 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -343,6 +343,16 @@ xfs_iformat( | |||
| 343 | return XFS_ERROR(EFSCORRUPTED); | 343 | return XFS_ERROR(EFSCORRUPTED); |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && | ||
| 347 | !ip->i_mount->m_rtdev_targp)) { | ||
| 348 | xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, | ||
| 349 | "corrupt dinode %Lu, has realtime flag set.", | ||
| 350 | ip->i_ino); | ||
| 351 | XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", | ||
| 352 | XFS_ERRLEVEL_LOW, ip->i_mount, dip); | ||
| 353 | return XFS_ERROR(EFSCORRUPTED); | ||
| 354 | } | ||
| 355 | |||
| 346 | switch (ip->i_d.di_mode & S_IFMT) { | 356 | switch (ip->i_d.di_mode & S_IFMT) { |
| 347 | case S_IFIFO: | 357 | case S_IFIFO: |
| 348 | case S_IFCHR: | 358 | case S_IFCHR: |
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3750f04ede0b..9dbdff3ea484 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
| @@ -3180,7 +3180,7 @@ try_again: | |||
| 3180 | STATIC void | 3180 | STATIC void |
| 3181 | xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog) | 3181 | xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog) |
| 3182 | { | 3182 | { |
| 3183 | ASSERT(spin_is_locked(&log->l_icloglock)); | 3183 | assert_spin_locked(&log->l_icloglock); |
| 3184 | 3184 | ||
| 3185 | if (iclog->ic_state == XLOG_STATE_ACTIVE) { | 3185 | if (iclog->ic_state == XLOG_STATE_ACTIVE) { |
| 3186 | xlog_state_switch_iclogs(log, iclog, 0); | 3186 | xlog_state_switch_iclogs(log, iclog, 0); |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index c4eca5ed5dab..492d75bae2bf 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -538,7 +538,9 @@ xfs_readlink_bmap( | |||
| 538 | d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); | 538 | d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); |
| 539 | byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); | 539 | byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); |
| 540 | 540 | ||
| 541 | bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0); | 541 | bp = xfs_buf_read_flags(mp->m_ddev_targp, d, BTOBB(byte_cnt), |
| 542 | XBF_LOCK | XBF_MAPPED | | ||
| 543 | XBF_DONT_BLOCK); | ||
| 542 | error = XFS_BUF_GETERROR(bp); | 544 | error = XFS_BUF_GETERROR(bp); |
| 543 | if (error) { | 545 | if (error) { |
| 544 | xfs_ioerror_alert("xfs_readlink", | 546 | xfs_ioerror_alert("xfs_readlink", |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index fdffb413b192..f6b90240dd41 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -473,7 +473,6 @@ extern int nfs_writepages(struct address_space *, struct writeback_control *); | |||
| 473 | extern int nfs_flush_incompatible(struct file *file, struct page *page); | 473 | extern int nfs_flush_incompatible(struct file *file, struct page *page); |
| 474 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); | 474 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); |
| 475 | extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); | 475 | extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); |
| 476 | extern void nfs_writedata_release(void *); | ||
| 477 | 476 | ||
| 478 | /* | 477 | /* |
| 479 | * Try to write back everything synchronously (but check the | 478 | * Try to write back everything synchronously (but check the |
| @@ -488,7 +487,6 @@ extern int nfs_wb_page_cancel(struct inode *inode, struct page* page); | |||
| 488 | extern int nfs_commit_inode(struct inode *, int); | 487 | extern int nfs_commit_inode(struct inode *, int); |
| 489 | extern struct nfs_write_data *nfs_commitdata_alloc(void); | 488 | extern struct nfs_write_data *nfs_commitdata_alloc(void); |
| 490 | extern void nfs_commit_free(struct nfs_write_data *wdata); | 489 | extern void nfs_commit_free(struct nfs_write_data *wdata); |
| 491 | extern void nfs_commitdata_release(void *wdata); | ||
| 492 | #else | 490 | #else |
| 493 | static inline int | 491 | static inline int |
| 494 | nfs_commit_inode(struct inode *inode, int how) | 492 | nfs_commit_inode(struct inode *inode, int how) |
| @@ -507,6 +505,7 @@ nfs_have_writebacks(struct inode *inode) | |||
| 507 | * Allocate nfs_write_data structures | 505 | * Allocate nfs_write_data structures |
| 508 | */ | 506 | */ |
| 509 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages); | 507 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages); |
| 508 | extern void nfs_writedata_free(struct nfs_write_data *); | ||
| 510 | 509 | ||
| 511 | /* | 510 | /* |
| 512 | * linux/fs/nfs/read.c | 511 | * linux/fs/nfs/read.c |
| @@ -515,7 +514,6 @@ extern int nfs_readpage(struct file *, struct page *); | |||
| 515 | extern int nfs_readpages(struct file *, struct address_space *, | 514 | extern int nfs_readpages(struct file *, struct address_space *, |
| 516 | struct list_head *, unsigned); | 515 | struct list_head *, unsigned); |
| 517 | extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); | 516 | extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); |
| 518 | extern void nfs_readdata_release(void *data); | ||
| 519 | extern int nfs_readpage_async(struct nfs_open_context *, struct inode *, | 517 | extern int nfs_readpage_async(struct nfs_open_context *, struct inode *, |
| 520 | struct page *); | 518 | struct page *); |
| 521 | 519 | ||
| @@ -523,6 +521,7 @@ extern int nfs_readpage_async(struct nfs_open_context *, struct inode *, | |||
| 523 | * Allocate nfs_read_data structures | 521 | * Allocate nfs_read_data structures |
| 524 | */ | 522 | */ |
| 525 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages); | 523 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages); |
| 524 | extern void nfs_readdata_free(struct nfs_read_data *); | ||
| 526 | 525 | ||
| 527 | /* | 526 | /* |
| 528 | * linux/fs/nfs3proc.c | 527 | * linux/fs/nfs3proc.c |
diff --git a/include/linux/wait.h b/include/linux/wait.h index 6788e1a4d4ca..cf3c2f5dba51 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
| @@ -77,7 +77,14 @@ struct task_struct; | |||
| 77 | #define __WAIT_BIT_KEY_INITIALIZER(word, bit) \ | 77 | #define __WAIT_BIT_KEY_INITIALIZER(word, bit) \ |
| 78 | { .flags = word, .bit_nr = bit, } | 78 | { .flags = word, .bit_nr = bit, } |
| 79 | 79 | ||
| 80 | extern void init_waitqueue_head(wait_queue_head_t *q); | 80 | extern void __init_waitqueue_head(wait_queue_head_t *q, struct lock_class_key *); |
| 81 | |||
| 82 | #define init_waitqueue_head(q) \ | ||
| 83 | do { \ | ||
| 84 | static struct lock_class_key __key; \ | ||
| 85 | \ | ||
| 86 | __init_waitqueue_head((q), &__key); \ | ||
| 87 | } while (0) | ||
| 81 | 88 | ||
| 82 | #ifdef CONFIG_LOCKDEP | 89 | #ifdef CONFIG_LOCKDEP |
| 83 | # define __WAIT_QUEUE_HEAD_INIT_ONSTACK(name) \ | 90 | # define __WAIT_QUEUE_HEAD_INIT_ONSTACK(name) \ |
diff --git a/kernel/futex.c b/kernel/futex.c index 0672ff88f159..e18cfbdc7190 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -1010,15 +1010,19 @@ void requeue_futex(struct futex_q *q, struct futex_hash_bucket *hb1, | |||
| 1010 | * requeue_pi_wake_futex() - Wake a task that acquired the lock during requeue | 1010 | * requeue_pi_wake_futex() - Wake a task that acquired the lock during requeue |
| 1011 | * q: the futex_q | 1011 | * q: the futex_q |
| 1012 | * key: the key of the requeue target futex | 1012 | * key: the key of the requeue target futex |
| 1013 | * hb: the hash_bucket of the requeue target futex | ||
| 1013 | * | 1014 | * |
| 1014 | * During futex_requeue, with requeue_pi=1, it is possible to acquire the | 1015 | * During futex_requeue, with requeue_pi=1, it is possible to acquire the |
| 1015 | * target futex if it is uncontended or via a lock steal. Set the futex_q key | 1016 | * target futex if it is uncontended or via a lock steal. Set the futex_q key |
| 1016 | * to the requeue target futex so the waiter can detect the wakeup on the right | 1017 | * to the requeue target futex so the waiter can detect the wakeup on the right |
| 1017 | * futex, but remove it from the hb and NULL the rt_waiter so it can detect | 1018 | * futex, but remove it from the hb and NULL the rt_waiter so it can detect |
| 1018 | * atomic lock acquisition. Must be called with the q->lock_ptr held. | 1019 | * atomic lock acquisition. Set the q->lock_ptr to the requeue target hb->lock |
| 1020 | * to protect access to the pi_state to fixup the owner later. Must be called | ||
| 1021 | * with both q->lock_ptr and hb->lock held. | ||
| 1019 | */ | 1022 | */ |
| 1020 | static inline | 1023 | static inline |
| 1021 | void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key) | 1024 | void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, |
| 1025 | struct futex_hash_bucket *hb) | ||
| 1022 | { | 1026 | { |
| 1023 | drop_futex_key_refs(&q->key); | 1027 | drop_futex_key_refs(&q->key); |
| 1024 | get_futex_key_refs(key); | 1028 | get_futex_key_refs(key); |
| @@ -1030,6 +1034,11 @@ void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key) | |||
| 1030 | WARN_ON(!q->rt_waiter); | 1034 | WARN_ON(!q->rt_waiter); |
| 1031 | q->rt_waiter = NULL; | 1035 | q->rt_waiter = NULL; |
| 1032 | 1036 | ||
| 1037 | q->lock_ptr = &hb->lock; | ||
| 1038 | #ifdef CONFIG_DEBUG_PI_LIST | ||
| 1039 | q->list.plist.lock = &hb->lock; | ||
| 1040 | #endif | ||
| 1041 | |||
| 1033 | wake_up_state(q->task, TASK_NORMAL); | 1042 | wake_up_state(q->task, TASK_NORMAL); |
| 1034 | } | 1043 | } |
| 1035 | 1044 | ||
| @@ -1088,7 +1097,7 @@ static int futex_proxy_trylock_atomic(u32 __user *pifutex, | |||
| 1088 | ret = futex_lock_pi_atomic(pifutex, hb2, key2, ps, top_waiter->task, | 1097 | ret = futex_lock_pi_atomic(pifutex, hb2, key2, ps, top_waiter->task, |
| 1089 | set_waiters); | 1098 | set_waiters); |
| 1090 | if (ret == 1) | 1099 | if (ret == 1) |
| 1091 | requeue_pi_wake_futex(top_waiter, key2); | 1100 | requeue_pi_wake_futex(top_waiter, key2, hb2); |
| 1092 | 1101 | ||
| 1093 | return ret; | 1102 | return ret; |
| 1094 | } | 1103 | } |
| @@ -1247,8 +1256,15 @@ retry_private: | |||
| 1247 | if (!match_futex(&this->key, &key1)) | 1256 | if (!match_futex(&this->key, &key1)) |
| 1248 | continue; | 1257 | continue; |
| 1249 | 1258 | ||
| 1250 | WARN_ON(!requeue_pi && this->rt_waiter); | 1259 | /* |
| 1251 | WARN_ON(requeue_pi && !this->rt_waiter); | 1260 | * FUTEX_WAIT_REQEUE_PI and FUTEX_CMP_REQUEUE_PI should always |
| 1261 | * be paired with each other and no other futex ops. | ||
| 1262 | */ | ||
| 1263 | if ((requeue_pi && !this->rt_waiter) || | ||
| 1264 | (!requeue_pi && this->rt_waiter)) { | ||
| 1265 | ret = -EINVAL; | ||
| 1266 | break; | ||
| 1267 | } | ||
| 1252 | 1268 | ||
| 1253 | /* | 1269 | /* |
| 1254 | * Wake nr_wake waiters. For requeue_pi, if we acquired the | 1270 | * Wake nr_wake waiters. For requeue_pi, if we acquired the |
| @@ -1273,7 +1289,7 @@ retry_private: | |||
| 1273 | this->task, 1); | 1289 | this->task, 1); |
| 1274 | if (ret == 1) { | 1290 | if (ret == 1) { |
| 1275 | /* We got the lock. */ | 1291 | /* We got the lock. */ |
| 1276 | requeue_pi_wake_futex(this, &key2); | 1292 | requeue_pi_wake_futex(this, &key2, hb2); |
| 1277 | continue; | 1293 | continue; |
| 1278 | } else if (ret) { | 1294 | } else if (ret) { |
| 1279 | /* -EDEADLK */ | 1295 | /* -EDEADLK */ |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index d607a5b9ee29..235716556bf1 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
| @@ -180,7 +180,8 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, | |||
| 180 | int cmd = op & FUTEX_CMD_MASK; | 180 | int cmd = op & FUTEX_CMD_MASK; |
| 181 | 181 | ||
| 182 | if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI || | 182 | if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI || |
| 183 | cmd == FUTEX_WAIT_BITSET)) { | 183 | cmd == FUTEX_WAIT_BITSET || |
| 184 | cmd == FUTEX_WAIT_REQUEUE_PI)) { | ||
| 184 | if (get_compat_timespec(&ts, utime)) | 185 | if (get_compat_timespec(&ts, utime)) |
| 185 | return -EFAULT; | 186 | return -EFAULT; |
| 186 | if (!timespec_valid(&ts)) | 187 | if (!timespec_valid(&ts)) |
| @@ -191,7 +192,8 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, | |||
| 191 | t = ktime_add_safe(ktime_get(), t); | 192 | t = ktime_add_safe(ktime_get(), t); |
| 192 | tp = &t; | 193 | tp = &t; |
| 193 | } | 194 | } |
| 194 | if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE) | 195 | if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE || |
| 196 | cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP) | ||
| 195 | val2 = (int) (unsigned long) utime; | 197 | val2 = (int) (unsigned long) utime; |
| 196 | 198 | ||
| 197 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); | 199 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); |
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 1090b0aed9ba..7a34cb563fec 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -267,8 +267,8 @@ static void blk_trace_free(struct blk_trace *bt) | |||
| 267 | { | 267 | { |
| 268 | debugfs_remove(bt->msg_file); | 268 | debugfs_remove(bt->msg_file); |
| 269 | debugfs_remove(bt->dropped_file); | 269 | debugfs_remove(bt->dropped_file); |
| 270 | debugfs_remove(bt->dir); | ||
| 271 | relay_close(bt->rchan); | 270 | relay_close(bt->rchan); |
| 271 | debugfs_remove(bt->dir); | ||
| 272 | free_percpu(bt->sequence); | 272 | free_percpu(bt->sequence); |
| 273 | free_percpu(bt->msg_data); | 273 | free_percpu(bt->msg_data); |
| 274 | kfree(bt); | 274 | kfree(bt); |
| @@ -378,18 +378,8 @@ static int blk_subbuf_start_callback(struct rchan_buf *buf, void *subbuf, | |||
| 378 | 378 | ||
| 379 | static int blk_remove_buf_file_callback(struct dentry *dentry) | 379 | static int blk_remove_buf_file_callback(struct dentry *dentry) |
| 380 | { | 380 | { |
| 381 | struct dentry *parent = dentry->d_parent; | ||
| 382 | debugfs_remove(dentry); | 381 | debugfs_remove(dentry); |
| 383 | 382 | ||
| 384 | /* | ||
| 385 | * this will fail for all but the last file, but that is ok. what we | ||
| 386 | * care about is the top level buts->name directory going away, when | ||
| 387 | * the last trace file is gone. Then we don't have to rmdir() that | ||
| 388 | * manually on trace stop, so it nicely solves the issue with | ||
| 389 | * force killing of running traces. | ||
| 390 | */ | ||
| 391 | |||
| 392 | debugfs_remove(parent); | ||
| 393 | return 0; | 383 | return 0; |
| 394 | } | 384 | } |
| 395 | 385 | ||
diff --git a/kernel/wait.c b/kernel/wait.c index ea7c3b4275cf..c4bd3d825f35 100644 --- a/kernel/wait.c +++ b/kernel/wait.c | |||
| @@ -10,13 +10,14 @@ | |||
| 10 | #include <linux/wait.h> | 10 | #include <linux/wait.h> |
| 11 | #include <linux/hash.h> | 11 | #include <linux/hash.h> |
| 12 | 12 | ||
| 13 | void init_waitqueue_head(wait_queue_head_t *q) | 13 | void __init_waitqueue_head(wait_queue_head_t *q, struct lock_class_key *key) |
| 14 | { | 14 | { |
| 15 | spin_lock_init(&q->lock); | 15 | spin_lock_init(&q->lock); |
| 16 | lockdep_set_class(&q->lock, key); | ||
| 16 | INIT_LIST_HEAD(&q->task_list); | 17 | INIT_LIST_HEAD(&q->task_list); |
| 17 | } | 18 | } |
| 18 | 19 | ||
| 19 | EXPORT_SYMBOL(init_waitqueue_head); | 20 | EXPORT_SYMBOL(__init_waitqueue_head); |
| 20 | 21 | ||
| 21 | void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) | 22 | void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) |
| 22 | { | 23 | { |
diff --git a/net/socket.c b/net/socket.c index 791d71a36a93..6d4716559047 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -736,7 +736,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page, | |||
| 736 | if (more) | 736 | if (more) |
| 737 | flags |= MSG_MORE; | 737 | flags |= MSG_MORE; |
| 738 | 738 | ||
| 739 | return sock->ops->sendpage(sock, page, offset, size, flags); | 739 | return kernel_sendpage(sock, page, offset, size, flags); |
| 740 | } | 740 | } |
| 741 | 741 | ||
| 742 | static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | 742 | static ssize_t sock_splice_read(struct file *file, loff_t *ppos, |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 15c2a08a66f1..1e8cfc4c2ed6 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1285,6 +1285,8 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | |||
| 1285 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, | 1285 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, |
| 1286 | context, len); | 1286 | context, len); |
| 1287 | if (rc == -ERANGE) { | 1287 | if (rc == -ERANGE) { |
| 1288 | kfree(context); | ||
| 1289 | |||
| 1288 | /* Need a larger buffer. Query for the right size. */ | 1290 | /* Need a larger buffer. Query for the right size. */ |
| 1289 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, | 1291 | rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, |
| 1290 | NULL, 0); | 1292 | NULL, 0); |
| @@ -1292,7 +1294,6 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | |||
| 1292 | dput(dentry); | 1294 | dput(dentry); |
| 1293 | goto out_unlock; | 1295 | goto out_unlock; |
| 1294 | } | 1296 | } |
| 1295 | kfree(context); | ||
| 1296 | len = rc; | 1297 | len = rc; |
| 1297 | context = kmalloc(len+1, GFP_NOFS); | 1298 | context = kmalloc(len+1, GFP_NOFS); |
| 1298 | if (!context) { | 1299 | if (!context) { |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 51c44fdbc0f0..fea976793ae5 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -13563,6 +13563,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 13563 | set_capture_mixer(spec); | 13563 | set_capture_mixer(spec); |
| 13564 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 13564 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
| 13565 | 13565 | ||
| 13566 | spec->vmaster_nid = 0x02; | ||
| 13567 | |||
| 13566 | codec->patch_ops = alc_patch_ops; | 13568 | codec->patch_ops = alc_patch_ops; |
| 13567 | if (board_config == ALC269_AUTO) | 13569 | if (board_config == ALC269_AUTO) |
| 13568 | spec->init_hook = alc269_auto_init; | 13570 | spec->init_hook = alc269_auto_init; |
| @@ -15577,9 +15579,12 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
| 15577 | spec->stream_digital_playback = &alc861vd_pcm_digital_playback; | 15579 | spec->stream_digital_playback = &alc861vd_pcm_digital_playback; |
| 15578 | spec->stream_digital_capture = &alc861vd_pcm_digital_capture; | 15580 | spec->stream_digital_capture = &alc861vd_pcm_digital_capture; |
| 15579 | 15581 | ||
| 15580 | spec->adc_nids = alc861vd_adc_nids; | 15582 | if (!spec->adc_nids) { |
| 15581 | spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); | 15583 | spec->adc_nids = alc861vd_adc_nids; |
| 15582 | spec->capsrc_nids = alc861vd_capsrc_nids; | 15584 | spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); |
| 15585 | } | ||
| 15586 | if (!spec->capsrc_nids) | ||
| 15587 | spec->capsrc_nids = alc861vd_capsrc_nids; | ||
| 15583 | 15588 | ||
| 15584 | set_capture_mixer(spec); | 15589 | set_capture_mixer(spec); |
| 15585 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 15590 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| @@ -17496,9 +17501,12 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 17496 | spec->stream_digital_playback = &alc662_pcm_digital_playback; | 17501 | spec->stream_digital_playback = &alc662_pcm_digital_playback; |
| 17497 | spec->stream_digital_capture = &alc662_pcm_digital_capture; | 17502 | spec->stream_digital_capture = &alc662_pcm_digital_capture; |
| 17498 | 17503 | ||
| 17499 | spec->adc_nids = alc662_adc_nids; | 17504 | if (!spec->adc_nids) { |
| 17500 | spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); | 17505 | spec->adc_nids = alc662_adc_nids; |
| 17501 | spec->capsrc_nids = alc662_capsrc_nids; | 17506 | spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); |
| 17507 | } | ||
| 17508 | if (!spec->capsrc_nids) | ||
| 17509 | spec->capsrc_nids = alc662_capsrc_nids; | ||
| 17502 | 17510 | ||
| 17503 | if (!spec->cap_mixer) | 17511 | if (!spec->cap_mixer) |
| 17504 | set_capture_mixer(spec); | 17512 | set_capture_mixer(spec); |
diff --git a/sound/soc/fsl/efika-audio-fabric.c b/sound/soc/fsl/efika-audio-fabric.c index 85b0e7569504..3326e2a1e863 100644 --- a/sound/soc/fsl/efika-audio-fabric.c +++ b/sound/soc/fsl/efika-audio-fabric.c | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #include "mpc5200_psc_ac97.h" | 30 | #include "mpc5200_psc_ac97.h" |
| 31 | #include "../codecs/stac9766.h" | 31 | #include "../codecs/stac9766.h" |
| 32 | 32 | ||
| 33 | #define DRV_NAME "efika-audio-fabric" | ||
| 34 | |||
| 33 | static struct snd_soc_device device; | 35 | static struct snd_soc_device device; |
| 34 | static struct snd_soc_card card; | 36 | static struct snd_soc_card card; |
| 35 | 37 | ||
diff --git a/sound/soc/fsl/pcm030-audio-fabric.c b/sound/soc/fsl/pcm030-audio-fabric.c index 8766f7a3893d..b928ef7d28eb 100644 --- a/sound/soc/fsl/pcm030-audio-fabric.c +++ b/sound/soc/fsl/pcm030-audio-fabric.c | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #include "mpc5200_psc_ac97.h" | 30 | #include "mpc5200_psc_ac97.h" |
| 31 | #include "../codecs/wm9712.h" | 31 | #include "../codecs/wm9712.h" |
| 32 | 32 | ||
| 33 | #define DRV_NAME "pcm030-audio-fabric" | ||
| 34 | |||
| 33 | static struct snd_soc_device device; | 35 | static struct snd_soc_device device; |
| 34 | static struct snd_soc_card card; | 36 | static struct snd_soc_card card; |
| 35 | 37 | ||
