diff options
47 files changed, 422 insertions, 288 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 29d74f47ba86..0cb20d821694 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3680,6 +3680,7 @@ L: microblaze-uclinux@itee.uq.edu.au | |||
| 3680 | W: http://www.monstr.eu/fdt/ | 3680 | W: http://www.monstr.eu/fdt/ |
| 3681 | T: git git://git.monstr.eu/linux-2.6-microblaze.git | 3681 | T: git git://git.monstr.eu/linux-2.6-microblaze.git |
| 3682 | S: Supported | 3682 | S: Supported |
| 3683 | F: arch/microblaze/ | ||
| 3683 | 3684 | ||
| 3684 | MICROTEK X6 SCANNER | 3685 | MICROTEK X6 SCANNER |
| 3685 | P: Oliver Neukum | 3686 | P: Oliver Neukum |
| @@ -5313,7 +5314,9 @@ L: linux-sh@vger.kernel.org | |||
| 5313 | W: http://www.linux-sh.org | 5314 | W: http://www.linux-sh.org |
| 5314 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git | 5315 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git |
| 5315 | S: Supported | 5316 | S: Supported |
| 5317 | F: Documentation/sh/ | ||
| 5316 | F: arch/sh/ | 5318 | F: arch/sh/ |
| 5319 | F: drivers/sh/ | ||
| 5317 | 5320 | ||
| 5318 | SUSPEND TO RAM | 5321 | SUSPEND TO RAM |
| 5319 | P: Len Brown | 5322 | P: Len Brown |
| @@ -169,7 +169,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | |||
| 169 | -e s/arm.*/arm/ -e s/sa110/arm/ \ | 169 | -e s/arm.*/arm/ -e s/sa110/arm/ \ |
| 170 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ | 170 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ |
| 171 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ | 171 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ |
| 172 | -e s/sh.*/sh/ ) | 172 | -e s/sh[234].*/sh/ ) |
| 173 | 173 | ||
| 174 | # Cross compiling and selecting different set of gcc/bin-utils | 174 | # Cross compiling and selecting different set of gcc/bin-utils |
| 175 | # --------------------------------------------------------------------------- | 175 | # --------------------------------------------------------------------------- |
| @@ -210,6 +210,11 @@ ifeq ($(ARCH),sparc64) | |||
| 210 | SRCARCH := sparc | 210 | SRCARCH := sparc |
| 211 | endif | 211 | endif |
| 212 | 212 | ||
| 213 | # Additional ARCH settings for sh | ||
| 214 | ifeq ($(ARCH),sh64) | ||
| 215 | SRCARCH := sh | ||
| 216 | endif | ||
| 217 | |||
| 213 | # Where to locate arch specific headers | 218 | # Where to locate arch specific headers |
| 214 | hdr-arch := $(SRCARCH) | 219 | hdr-arch := $(SRCARCH) |
| 215 | 220 | ||
diff --git a/arch/microblaze/include/asm/auxvec.h b/arch/microblaze/include/asm/auxvec.h index e69de29bb2d1..8b137891791f 100644 --- a/arch/microblaze/include/asm/auxvec.h +++ b/arch/microblaze/include/asm/auxvec.h | |||
| @@ -0,0 +1 @@ | |||
diff --git a/arch/microblaze/include/asm/cputable.h b/arch/microblaze/include/asm/cputable.h index e69de29bb2d1..8b137891791f 100644 --- a/arch/microblaze/include/asm/cputable.h +++ b/arch/microblaze/include/asm/cputable.h | |||
| @@ -0,0 +1 @@ | |||
diff --git a/arch/microblaze/include/asm/ftrace.h b/arch/microblaze/include/asm/ftrace.h new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/arch/microblaze/include/asm/ftrace.h | |||
| @@ -0,0 +1 @@ | |||
diff --git a/arch/microblaze/include/asm/hw_irq.h b/arch/microblaze/include/asm/hw_irq.h index e69de29bb2d1..8b137891791f 100644 --- a/arch/microblaze/include/asm/hw_irq.h +++ b/arch/microblaze/include/asm/hw_irq.h | |||
| @@ -0,0 +1 @@ | |||
diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h index cfab0342588d..8b5853ee6b5c 100644 --- a/arch/microblaze/include/asm/io.h +++ b/arch/microblaze/include/asm/io.h | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <asm/byteorder.h> | 12 | #include <asm/byteorder.h> |
| 13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <asm/page.h> | ||
| 16 | 15 | ||
| 17 | #define IO_SPACE_LIMIT (0xFFFFFFFF) | 16 | #define IO_SPACE_LIMIT (0xFFFFFFFF) |
| 18 | 17 | ||
diff --git a/arch/microblaze/include/asm/socket.h b/arch/microblaze/include/asm/socket.h index f919b6b540ac..825936860314 100644 --- a/arch/microblaze/include/asm/socket.h +++ b/arch/microblaze/include/asm/socket.h | |||
| @@ -63,4 +63,7 @@ | |||
| 63 | 63 | ||
| 64 | #define SO_MARK 36 | 64 | #define SO_MARK 36 |
| 65 | 65 | ||
| 66 | #define SO_TIMESTAMPING 37 | ||
| 67 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
| 68 | |||
| 66 | #endif /* _ASM_MICROBLAZE_SOCKET_H */ | 69 | #endif /* _ASM_MICROBLAZE_SOCKET_H */ |
diff --git a/arch/microblaze/include/asm/user.h b/arch/microblaze/include/asm/user.h index e69de29bb2d1..8b137891791f 100644 --- a/arch/microblaze/include/asm/user.h +++ b/arch/microblaze/include/asm/user.h | |||
| @@ -0,0 +1 @@ | |||
diff --git a/arch/microblaze/include/asm/vga.h b/arch/microblaze/include/asm/vga.h index e69de29bb2d1..8b137891791f 100644 --- a/arch/microblaze/include/asm/vga.h +++ b/arch/microblaze/include/asm/vga.h | |||
| @@ -0,0 +1 @@ | |||
diff --git a/arch/microblaze/kernel/of_device.c b/arch/microblaze/kernel/of_device.c index 717edf4ad0b4..9a0f7632c47c 100644 --- a/arch/microblaze/kernel/of_device.c +++ b/arch/microblaze/kernel/of_device.c | |||
| @@ -13,7 +13,6 @@ void of_device_make_bus_id(struct of_device *dev) | |||
| 13 | { | 13 | { |
| 14 | static atomic_t bus_no_reg_magic; | 14 | static atomic_t bus_no_reg_magic; |
| 15 | struct device_node *node = dev->node; | 15 | struct device_node *node = dev->node; |
| 16 | char *name = dev->dev.bus_id; | ||
| 17 | const u32 *reg; | 16 | const u32 *reg; |
| 18 | u64 addr; | 17 | u64 addr; |
| 19 | int magic; | 18 | int magic; |
| @@ -25,9 +24,8 @@ void of_device_make_bus_id(struct of_device *dev) | |||
| 25 | if (reg) { | 24 | if (reg) { |
| 26 | addr = of_translate_address(node, reg); | 25 | addr = of_translate_address(node, reg); |
| 27 | if (addr != OF_BAD_ADDR) { | 26 | if (addr != OF_BAD_ADDR) { |
| 28 | snprintf(name, BUS_ID_SIZE, | 27 | dev_set_name(&dev->dev, "%llx.%s", |
| 29 | "%llx.%s", (unsigned long long)addr, | 28 | (unsigned long long)addr, node->name); |
| 30 | node->name); | ||
| 31 | return; | 29 | return; |
| 32 | } | 30 | } |
| 33 | } | 31 | } |
| @@ -37,7 +35,7 @@ void of_device_make_bus_id(struct of_device *dev) | |||
| 37 | * counter (and pray...) | 35 | * counter (and pray...) |
| 38 | */ | 36 | */ |
| 39 | magic = atomic_add_return(1, &bus_no_reg_magic); | 37 | magic = atomic_add_return(1, &bus_no_reg_magic); |
| 40 | snprintf(name, BUS_ID_SIZE, "%s.%d", node->name, magic - 1); | 38 | dev_set_name(&dev->dev, "%s.%d", node->name, magic - 1); |
| 41 | } | 39 | } |
| 42 | EXPORT_SYMBOL(of_device_make_bus_id); | 40 | EXPORT_SYMBOL(of_device_make_bus_id); |
| 43 | 41 | ||
| @@ -58,7 +56,7 @@ struct of_device *of_device_alloc(struct device_node *np, | |||
| 58 | dev->dev.archdata.of_node = np; | 56 | dev->dev.archdata.of_node = np; |
| 59 | 57 | ||
| 60 | if (bus_id) | 58 | if (bus_id) |
| 61 | strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE); | 59 | dev_set_name(&dev->dev, bus_id); |
| 62 | else | 60 | else |
| 63 | of_device_make_bus_id(dev); | 61 | of_device_make_bus_id(dev); |
| 64 | 62 | ||
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c index 60e9ed7d3132..436f26ccbfa9 100644 --- a/arch/microblaze/kernel/process.c +++ b/arch/microblaze/kernel/process.c | |||
| @@ -115,8 +115,7 @@ void flush_thread(void) | |||
| 115 | { | 115 | { |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | /* FIXME - here will be a proposed change -> remove nr parameter */ | 118 | int copy_thread(unsigned long clone_flags, unsigned long usp, |
| 119 | int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | ||
| 120 | unsigned long unused, | 119 | unsigned long unused, |
| 121 | struct task_struct *p, struct pt_regs *regs) | 120 | struct task_struct *p, struct pt_regs *regs) |
| 122 | { | 121 | { |
diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c index 475b1fac5cfd..34c48718061a 100644 --- a/arch/microblaze/kernel/prom.c +++ b/arch/microblaze/kernel/prom.c | |||
| @@ -39,7 +39,6 @@ | |||
| 39 | #include <asm/system.h> | 39 | #include <asm/system.h> |
| 40 | #include <asm/mmu.h> | 40 | #include <asm/mmu.h> |
| 41 | #include <asm/pgtable.h> | 41 | #include <asm/pgtable.h> |
| 42 | #include <linux/pci.h> | ||
| 43 | #include <asm/sections.h> | 42 | #include <asm/sections.h> |
| 44 | #include <asm/pci-bridge.h> | 43 | #include <asm/pci-bridge.h> |
| 45 | 44 | ||
diff --git a/arch/microblaze/kernel/ptrace.c b/arch/microblaze/kernel/ptrace.c index 3171e39e3220..b86aa623e36d 100644 --- a/arch/microblaze/kernel/ptrace.c +++ b/arch/microblaze/kernel/ptrace.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <linux/signal.h> | 32 | #include <linux/signal.h> |
| 33 | 33 | ||
| 34 | #include <linux/errno.h> | 34 | #include <linux/errno.h> |
| 35 | #include <linux/ptrace.h> | ||
| 36 | #include <asm/processor.h> | 35 | #include <asm/processor.h> |
| 37 | #include <linux/uaccess.h> | 36 | #include <linux/uaccess.h> |
| 38 | #include <asm/asm-offsets.h> | 37 | #include <asm/asm-offsets.h> |
diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c index ff347b98863a..3889cf45fa71 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c | |||
| @@ -37,7 +37,6 @@ | |||
| 37 | #include <linux/uaccess.h> | 37 | #include <linux/uaccess.h> |
| 38 | #include <asm/pgtable.h> | 38 | #include <asm/pgtable.h> |
| 39 | #include <asm/pgalloc.h> | 39 | #include <asm/pgalloc.h> |
| 40 | #include <linux/signal.h> | ||
| 41 | #include <linux/syscalls.h> | 40 | #include <linux/syscalls.h> |
| 42 | #include <asm/cacheflush.h> | 41 | #include <asm/cacheflush.h> |
| 43 | #include <asm/syscalls.h> | 42 | #include <asm/syscalls.h> |
diff --git a/arch/microblaze/kernel/sys_microblaze.c b/arch/microblaze/kernel/sys_microblaze.c index d90b548fb1bb..ba0568c2cc1c 100644 --- a/arch/microblaze/kernel/sys_microblaze.c +++ b/arch/microblaze/kernel/sys_microblaze.c | |||
| @@ -29,9 +29,7 @@ | |||
| 29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
| 30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
| 31 | #include <linux/fs.h> | 31 | #include <linux/fs.h> |
| 32 | #include <linux/ipc.h> | ||
| 33 | #include <linux/semaphore.h> | 32 | #include <linux/semaphore.h> |
| 34 | #include <linux/syscalls.h> | ||
| 35 | #include <linux/uaccess.h> | 33 | #include <linux/uaccess.h> |
| 36 | #include <linux/unistd.h> | 34 | #include <linux/unistd.h> |
| 37 | 35 | ||
diff --git a/arch/powerpc/include/asm/parport.h b/arch/powerpc/include/asm/parport.h index 414c50e2e881..94942d60ddfd 100644 --- a/arch/powerpc/include/asm/parport.h +++ b/arch/powerpc/include/asm/parport.h | |||
| @@ -29,7 +29,7 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) | |||
| 29 | prop = of_get_property(np, "interrupts", NULL); | 29 | prop = of_get_property(np, "interrupts", NULL); |
| 30 | if (!prop) | 30 | if (!prop) |
| 31 | continue; | 31 | continue; |
| 32 | if (parport_pc_probe_port(io1, io2, prop[0], autodma, NULL) != NULL) | 32 | if (parport_pc_probe_port(io1, io2, prop[0], autodma, NULL, 0) != NULL) |
| 33 | count++; | 33 | count++; |
| 34 | } | 34 | } |
| 35 | return count; | 35 | return count; |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 5e4babecf934..e7390dd0283d 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
| @@ -14,6 +14,7 @@ config SUPERH | |||
| 14 | select HAVE_GENERIC_DMA_COHERENT | 14 | select HAVE_GENERIC_DMA_COHERENT |
| 15 | select HAVE_IOREMAP_PROT if MMU | 15 | select HAVE_IOREMAP_PROT if MMU |
| 16 | select HAVE_ARCH_TRACEHOOK | 16 | select HAVE_ARCH_TRACEHOOK |
| 17 | select HAVE_DMA_API_DEBUG | ||
| 17 | help | 18 | help |
| 18 | The SuperH is a RISC processor targeted for use in embedded systems | 19 | The SuperH is a RISC processor targeted for use in embedded systems |
| 19 | and consumer electronics; it was also used in the Sega Dreamcast | 20 | and consumer electronics; it was also used in the Sega Dreamcast |
| @@ -21,7 +22,7 @@ config SUPERH | |||
| 21 | <http://www.linux-sh.org/>. | 22 | <http://www.linux-sh.org/>. |
| 22 | 23 | ||
| 23 | config SUPERH32 | 24 | config SUPERH32 |
| 24 | def_bool !SUPERH64 | 25 | def_bool ARCH = "sh" |
| 25 | select HAVE_KPROBES | 26 | select HAVE_KPROBES |
| 26 | select HAVE_KRETPROBES | 27 | select HAVE_KRETPROBES |
| 27 | select HAVE_FUNCTION_TRACER | 28 | select HAVE_FUNCTION_TRACER |
| @@ -31,7 +32,7 @@ config SUPERH32 | |||
| 31 | select ARCH_HIBERNATION_POSSIBLE if MMU | 32 | select ARCH_HIBERNATION_POSSIBLE if MMU |
| 32 | 33 | ||
| 33 | config SUPERH64 | 34 | config SUPERH64 |
| 34 | def_bool y if CPU_SH5 | 35 | def_bool ARCH = "sh64" |
| 35 | 36 | ||
| 36 | config ARCH_DEFCONFIG | 37 | config ARCH_DEFCONFIG |
| 37 | string | 38 | string |
| @@ -187,6 +188,8 @@ config ARCH_SHMOBILE | |||
| 187 | bool | 188 | bool |
| 188 | select ARCH_SUSPEND_POSSIBLE | 189 | select ARCH_SUSPEND_POSSIBLE |
| 189 | 190 | ||
| 191 | if SUPERH32 | ||
| 192 | |||
| 190 | choice | 193 | choice |
| 191 | prompt "Processor sub-type selection" | 194 | prompt "Processor sub-type selection" |
| 192 | 195 | ||
| @@ -408,6 +411,15 @@ config CPU_SUBTYPE_SH7366 | |||
| 408 | select SYS_SUPPORTS_NUMA | 411 | select SYS_SUPPORTS_NUMA |
| 409 | select SYS_SUPPORTS_CMT | 412 | select SYS_SUPPORTS_CMT |
| 410 | 413 | ||
| 414 | endchoice | ||
| 415 | |||
| 416 | endif | ||
| 417 | |||
| 418 | if SUPERH64 | ||
| 419 | |||
| 420 | choice | ||
| 421 | prompt "Processor sub-type selection" | ||
| 422 | |||
| 411 | # SH-5 Processor Support | 423 | # SH-5 Processor Support |
| 412 | 424 | ||
| 413 | config CPU_SUBTYPE_SH5_101 | 425 | config CPU_SUBTYPE_SH5_101 |
| @@ -420,6 +432,8 @@ config CPU_SUBTYPE_SH5_103 | |||
| 420 | 432 | ||
| 421 | endchoice | 433 | endchoice |
| 422 | 434 | ||
| 435 | endif | ||
| 436 | |||
| 423 | source "arch/sh/mm/Kconfig" | 437 | source "arch/sh/mm/Kconfig" |
| 424 | 438 | ||
| 425 | source "arch/sh/Kconfig.cpu" | 439 | source "arch/sh/Kconfig.cpu" |
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 912458f666eb..39e46919df14 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
| @@ -349,6 +349,7 @@ static int ov7725_power(struct device *dev, int mode) | |||
| 349 | static struct ov772x_camera_info ov7725_info = { | 349 | static struct ov772x_camera_info ov7725_info = { |
| 350 | .buswidth = SOCAM_DATAWIDTH_8, | 350 | .buswidth = SOCAM_DATAWIDTH_8, |
| 351 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | 351 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, |
| 352 | .edgectrl = OV772X_AUTO_EDGECTRL(0xf, 0), | ||
| 352 | .link = { | 353 | .link = { |
| 353 | .power = ov7725_power, | 354 | .power = ov7725_power, |
| 354 | }, | 355 | }, |
diff --git a/arch/sh/boards/board-urquell.c b/arch/sh/boards/board-urquell.c index 8367d1d789c3..beb88c4da2c1 100644 --- a/arch/sh/boards/board-urquell.c +++ b/arch/sh/boards/board-urquell.c | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | * Renesas Technology Corp. SH7786 Urquell Support. | 2 | * Renesas Technology Corp. SH7786 Urquell Support. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> | 4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> |
| 5 | * | ||
| 6 | * Based on board-sh7785lcr.c | ||
| 5 | * Copyright (C) 2008 Yoshihiro Shimoda | 7 | * Copyright (C) 2008 Yoshihiro Shimoda |
| 6 | * | 8 | * |
| 7 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
| @@ -21,6 +23,32 @@ | |||
| 21 | #include <asm/heartbeat.h> | 23 | #include <asm/heartbeat.h> |
| 22 | #include <asm/sizes.h> | 24 | #include <asm/sizes.h> |
| 23 | 25 | ||
| 26 | /* | ||
| 27 | * bit 1234 5678 | ||
| 28 | *---------------------------- | ||
| 29 | * SW1 0101 0010 -> Pck 33MHz version | ||
| 30 | * (1101 0010) Pck 66MHz version | ||
| 31 | * SW2 0x1x xxxx -> little endian | ||
| 32 | * 29bit mode | ||
| 33 | * SW47 0001 1000 -> CS0 : on-board flash | ||
| 34 | * CS1 : SRAM, registers, LAN, PCMCIA | ||
| 35 | * 38400 bps for SCIF1 | ||
| 36 | * | ||
| 37 | * Address | ||
| 38 | * 0x00000000 - 0x04000000 (CS0) Nor Flash | ||
| 39 | * 0x04000000 - 0x04200000 (CS1) SRAM | ||
| 40 | * 0x05000000 - 0x05800000 (CS1) on board register | ||
| 41 | * 0x05800000 - 0x06000000 (CS1) LAN91C111 | ||
| 42 | * 0x06000000 - 0x06400000 (CS1) PCMCIA | ||
| 43 | * 0x08000000 - 0x10000000 (CS2-CS3) DDR3 | ||
| 44 | * 0x10000000 - 0x14000000 (CS4) PCIe | ||
| 45 | * 0x14000000 - 0x14800000 (CS5) Core0 LRAM/URAM | ||
| 46 | * 0x14800000 - 0x15000000 (CS5) Core1 LRAM/URAM | ||
| 47 | * 0x18000000 - 0x1C000000 (CS6) ATA/NAND-Flash | ||
| 48 | * 0x1C000000 - (CS7) SH7786 Control register | ||
| 49 | */ | ||
| 50 | |||
| 51 | /* HeartBeat */ | ||
| 24 | static struct resource heartbeat_resources[] = { | 52 | static struct resource heartbeat_resources[] = { |
| 25 | [0] = { | 53 | [0] = { |
| 26 | .start = BOARDREG(SLEDR), | 54 | .start = BOARDREG(SLEDR), |
| @@ -43,6 +71,7 @@ static struct platform_device heartbeat_device = { | |||
| 43 | .resource = heartbeat_resources, | 71 | .resource = heartbeat_resources, |
| 44 | }; | 72 | }; |
| 45 | 73 | ||
| 74 | /* LAN91C111 */ | ||
| 46 | static struct smc91x_platdata smc91x_info = { | 75 | static struct smc91x_platdata smc91x_info = { |
| 47 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | 76 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, |
| 48 | }; | 77 | }; |
| @@ -69,6 +98,7 @@ static struct platform_device smc91x_eth_device = { | |||
| 69 | }, | 98 | }, |
| 70 | }; | 99 | }; |
| 71 | 100 | ||
| 101 | /* Nor Flash */ | ||
| 72 | static struct mtd_partition nor_flash_partitions[] = { | 102 | static struct mtd_partition nor_flash_partitions[] = { |
| 73 | { | 103 | { |
| 74 | .name = "loader", | 104 | .name = "loader", |
diff --git a/arch/sh/drivers/pci/ops-sh7785lcr.c b/arch/sh/drivers/pci/ops-sh7785lcr.c index e8b7446a7c2b..fb0869f0bef8 100644 --- a/arch/sh/drivers/pci/ops-sh7785lcr.c +++ b/arch/sh/drivers/pci/ops-sh7785lcr.c | |||
| @@ -48,8 +48,13 @@ EXPORT_SYMBOL(board_pci_channels); | |||
| 48 | 48 | ||
| 49 | static struct sh4_pci_address_map sh7785_pci_map = { | 49 | static struct sh4_pci_address_map sh7785_pci_map = { |
| 50 | .window0 = { | 50 | .window0 = { |
| 51 | #if defined(CONFIG_32BIT) | ||
| 52 | .base = SH7780_32BIT_DDR_BASE_ADDR, | ||
| 53 | .size = 0x40000000, | ||
| 54 | #else | ||
| 51 | .base = SH7780_CS0_BASE_ADDR, | 55 | .base = SH7780_CS0_BASE_ADDR, |
| 52 | .size = 0x20000000, | 56 | .size = 0x20000000, |
| 57 | #endif | ||
| 53 | }, | 58 | }, |
| 54 | 59 | ||
| 55 | .flags = SH4_PCIC_NO_RESET, | 60 | .flags = SH4_PCIC_NO_RESET, |
diff --git a/arch/sh/drivers/pci/pci-sh7780.h b/arch/sh/drivers/pci/pci-sh7780.h index 97b2c98f05c4..93adc7119b79 100644 --- a/arch/sh/drivers/pci/pci-sh7780.h +++ b/arch/sh/drivers/pci/pci-sh7780.h | |||
| @@ -104,6 +104,8 @@ | |||
| 104 | #define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE) | 104 | #define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE) |
| 105 | #define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE) | 105 | #define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE) |
| 106 | 106 | ||
| 107 | #define SH7780_32BIT_DDR_BASE_ADDR 0x40000000 | ||
| 108 | |||
| 107 | struct sh4_pci_address_map; | 109 | struct sh4_pci_address_map; |
| 108 | 110 | ||
| 109 | /* arch/sh/drivers/pci/pci-sh7780.c */ | 111 | /* arch/sh/drivers/pci/pci-sh7780.c */ |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index e36c7b870861..0d6ac7a1db49 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
| 21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
| 22 | #include <linux/dma-debug.h> | ||
| 22 | #include <asm/io.h> | 23 | #include <asm/io.h> |
| 23 | 24 | ||
| 24 | static int __init pcibios_init(void) | 25 | static int __init pcibios_init(void) |
| @@ -43,6 +44,8 @@ static int __init pcibios_init(void) | |||
| 43 | 44 | ||
| 44 | pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq); | 45 | pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq); |
| 45 | 46 | ||
| 47 | dma_debug_add_bus(&pci_bus_type); | ||
| 48 | |||
| 46 | return 0; | 49 | return 0; |
| 47 | } | 50 | } |
| 48 | subsys_initcall(pcibios_init); | 51 | subsys_initcall(pcibios_init); |
diff --git a/arch/sh/include/asm/dma-mapping.h b/arch/sh/include/asm/dma-mapping.h index 627315ecdb52..ea9d4f41c9d2 100644 --- a/arch/sh/include/asm/dma-mapping.h +++ b/arch/sh/include/asm/dma-mapping.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
| 5 | #include <linux/scatterlist.h> | 5 | #include <linux/scatterlist.h> |
| 6 | #include <linux/dma-debug.h> | ||
| 6 | #include <asm/cacheflush.h> | 7 | #include <asm/cacheflush.h> |
| 7 | #include <asm/io.h> | 8 | #include <asm/io.h> |
| 8 | #include <asm-generic/dma-coherent.h> | 9 | #include <asm-generic/dma-coherent.h> |
| @@ -38,16 +39,26 @@ static inline dma_addr_t dma_map_single(struct device *dev, | |||
| 38 | void *ptr, size_t size, | 39 | void *ptr, size_t size, |
| 39 | enum dma_data_direction dir) | 40 | enum dma_data_direction dir) |
| 40 | { | 41 | { |
| 42 | dma_addr_t addr = virt_to_phys(ptr); | ||
| 43 | |||
| 41 | #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) | 44 | #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) |
| 42 | if (dev->bus == &pci_bus_type) | 45 | if (dev->bus == &pci_bus_type) |
| 43 | return virt_to_phys(ptr); | 46 | return addr; |
| 44 | #endif | 47 | #endif |
| 45 | dma_cache_sync(dev, ptr, size, dir); | 48 | dma_cache_sync(dev, ptr, size, dir); |
| 46 | 49 | ||
| 47 | return virt_to_phys(ptr); | 50 | debug_dma_map_page(dev, virt_to_page(ptr), |
| 51 | (unsigned long)ptr & ~PAGE_MASK, size, | ||
| 52 | dir, addr, true); | ||
| 53 | |||
| 54 | return addr; | ||
| 48 | } | 55 | } |
| 49 | 56 | ||
| 50 | #define dma_unmap_single(dev, addr, size, dir) do { } while (0) | 57 | static inline void dma_unmap_single(struct device *dev, dma_addr_t addr, |
| 58 | size_t size, enum dma_data_direction dir) | ||
| 59 | { | ||
| 60 | debug_dma_unmap_page(dev, addr, size, dir, true); | ||
| 61 | } | ||
| 51 | 62 | ||
| 52 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | 63 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, |
| 53 | int nents, enum dma_data_direction dir) | 64 | int nents, enum dma_data_direction dir) |
| @@ -59,12 +70,19 @@ static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | |||
| 59 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); | 70 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); |
| 60 | #endif | 71 | #endif |
| 61 | sg[i].dma_address = sg_phys(&sg[i]); | 72 | sg[i].dma_address = sg_phys(&sg[i]); |
| 73 | sg[i].dma_length = sg[i].length; | ||
| 62 | } | 74 | } |
| 63 | 75 | ||
| 76 | debug_dma_map_sg(dev, sg, nents, i, dir); | ||
| 77 | |||
| 64 | return nents; | 78 | return nents; |
| 65 | } | 79 | } |
| 66 | 80 | ||
| 67 | #define dma_unmap_sg(dev, sg, nents, dir) do { } while (0) | 81 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, |
| 82 | int nents, enum dma_data_direction dir) | ||
| 83 | { | ||
| 84 | debug_dma_unmap_sg(dev, sg, nents, dir); | ||
| 85 | } | ||
| 68 | 86 | ||
| 69 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | 87 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, |
| 70 | unsigned long offset, size_t size, | 88 | unsigned long offset, size_t size, |
| @@ -111,6 +129,7 @@ static inline void dma_sync_sg(struct device *dev, struct scatterlist *sg, | |||
| 111 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); | 129 | dma_cache_sync(dev, sg_virt(&sg[i]), sg[i].length, dir); |
| 112 | #endif | 130 | #endif |
| 113 | sg[i].dma_address = sg_phys(&sg[i]); | 131 | sg[i].dma_address = sg_phys(&sg[i]); |
| 132 | sg[i].dma_length = sg[i].length; | ||
| 114 | } | 133 | } |
| 115 | } | 134 | } |
| 116 | 135 | ||
| @@ -119,6 +138,7 @@ static inline void dma_sync_single_for_cpu(struct device *dev, | |||
| 119 | enum dma_data_direction dir) | 138 | enum dma_data_direction dir) |
| 120 | { | 139 | { |
| 121 | dma_sync_single(dev, dma_handle, size, dir); | 140 | dma_sync_single(dev, dma_handle, size, dir); |
| 141 | debug_dma_sync_single_for_cpu(dev, dma_handle, size, dir); | ||
| 122 | } | 142 | } |
| 123 | 143 | ||
| 124 | static inline void dma_sync_single_for_device(struct device *dev, | 144 | static inline void dma_sync_single_for_device(struct device *dev, |
| @@ -127,6 +147,7 @@ static inline void dma_sync_single_for_device(struct device *dev, | |||
| 127 | enum dma_data_direction dir) | 147 | enum dma_data_direction dir) |
| 128 | { | 148 | { |
| 129 | dma_sync_single(dev, dma_handle, size, dir); | 149 | dma_sync_single(dev, dma_handle, size, dir); |
| 150 | debug_dma_sync_single_for_device(dev, dma_handle, size, dir); | ||
| 130 | } | 151 | } |
| 131 | 152 | ||
| 132 | static inline void dma_sync_single_range_for_cpu(struct device *dev, | 153 | static inline void dma_sync_single_range_for_cpu(struct device *dev, |
| @@ -136,6 +157,8 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, | |||
| 136 | enum dma_data_direction direction) | 157 | enum dma_data_direction direction) |
| 137 | { | 158 | { |
| 138 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction); | 159 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction); |
| 160 | debug_dma_sync_single_range_for_cpu(dev, dma_handle, | ||
| 161 | offset, size, direction); | ||
| 139 | } | 162 | } |
| 140 | 163 | ||
| 141 | static inline void dma_sync_single_range_for_device(struct device *dev, | 164 | static inline void dma_sync_single_range_for_device(struct device *dev, |
| @@ -145,6 +168,8 @@ static inline void dma_sync_single_range_for_device(struct device *dev, | |||
| 145 | enum dma_data_direction direction) | 168 | enum dma_data_direction direction) |
| 146 | { | 169 | { |
| 147 | dma_sync_single_for_device(dev, dma_handle+offset, size, direction); | 170 | dma_sync_single_for_device(dev, dma_handle+offset, size, direction); |
| 171 | debug_dma_sync_single_range_for_device(dev, dma_handle, | ||
| 172 | offset, size, direction); | ||
| 148 | } | 173 | } |
| 149 | 174 | ||
| 150 | 175 | ||
| @@ -153,6 +178,7 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, | |||
| 153 | enum dma_data_direction dir) | 178 | enum dma_data_direction dir) |
| 154 | { | 179 | { |
| 155 | dma_sync_sg(dev, sg, nelems, dir); | 180 | dma_sync_sg(dev, sg, nelems, dir); |
| 181 | debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir); | ||
| 156 | } | 182 | } |
| 157 | 183 | ||
| 158 | static inline void dma_sync_sg_for_device(struct device *dev, | 184 | static inline void dma_sync_sg_for_device(struct device *dev, |
| @@ -160,9 +186,9 @@ static inline void dma_sync_sg_for_device(struct device *dev, | |||
| 160 | enum dma_data_direction dir) | 186 | enum dma_data_direction dir) |
| 161 | { | 187 | { |
| 162 | dma_sync_sg(dev, sg, nelems, dir); | 188 | dma_sync_sg(dev, sg, nelems, dir); |
| 189 | debug_dma_sync_sg_for_device(dev, sg, nelems, dir); | ||
| 163 | } | 190 | } |
| 164 | 191 | ||
| 165 | |||
| 166 | static inline int dma_get_cache_alignment(void) | 192 | static inline int dma_get_cache_alignment(void) |
| 167 | { | 193 | { |
| 168 | /* | 194 | /* |
diff --git a/arch/sh/include/asm/scatterlist.h b/arch/sh/include/asm/scatterlist.h index 2084d0373693..c693d268a413 100644 --- a/arch/sh/include/asm/scatterlist.h +++ b/arch/sh/include/asm/scatterlist.h | |||
| @@ -5,12 +5,13 @@ | |||
| 5 | 5 | ||
| 6 | struct scatterlist { | 6 | struct scatterlist { |
| 7 | #ifdef CONFIG_DEBUG_SG | 7 | #ifdef CONFIG_DEBUG_SG |
| 8 | unsigned long sg_magic; | 8 | unsigned long sg_magic; |
| 9 | #endif | 9 | #endif |
| 10 | unsigned long page_link; | 10 | unsigned long page_link; |
| 11 | unsigned int offset;/* for highmem, page offset */ | 11 | unsigned int offset; /* for highmem, page offset */ |
| 12 | dma_addr_t dma_address; | 12 | unsigned int length; |
| 13 | unsigned int length; | 13 | dma_addr_t dma_address; |
| 14 | unsigned int dma_length; | ||
| 14 | }; | 15 | }; |
| 15 | 16 | ||
| 16 | #define ISA_DMA_THRESHOLD PHYS_ADDR_MASK | 17 | #define ISA_DMA_THRESHOLD PHYS_ADDR_MASK |
diff --git a/arch/sh/include/asm/topology.h b/arch/sh/include/asm/topology.h index a3f239545897..8489a0905a87 100644 --- a/arch/sh/include/asm/topology.h +++ b/arch/sh/include/asm/topology.h | |||
| @@ -37,8 +37,11 @@ | |||
| 37 | #define pcibus_to_node(bus) ((void)(bus), -1) | 37 | #define pcibus_to_node(bus) ((void)(bus), -1) |
| 38 | #define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ | 38 | #define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ |
| 39 | CPU_MASK_ALL : \ | 39 | CPU_MASK_ALL : \ |
| 40 | node_to_cpumask(pcibus_to_node(bus)) \ | 40 | node_to_cpumask(pcibus_to_node(bus))) |
| 41 | ) | 41 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ |
| 42 | CPU_MASK_ALL_PTR : \ | ||
| 43 | cpumask_of_node(pcibus_to_node(bus))) | ||
| 44 | |||
| 42 | #endif | 45 | #endif |
| 43 | 46 | ||
| 44 | #include <asm-generic/topology.h> | 47 | #include <asm-generic/topology.h> |
diff --git a/arch/sh/include/asm/unistd_32.h b/arch/sh/include/asm/unistd_32.h index d52c000cf924..2efb819e2db3 100644 --- a/arch/sh/include/asm/unistd_32.h +++ b/arch/sh/include/asm/unistd_32.h | |||
| @@ -341,8 +341,10 @@ | |||
| 341 | #define __NR_dup3 330 | 341 | #define __NR_dup3 330 |
| 342 | #define __NR_pipe2 331 | 342 | #define __NR_pipe2 331 |
| 343 | #define __NR_inotify_init1 332 | 343 | #define __NR_inotify_init1 332 |
| 344 | #define __NR_preadv 333 | ||
| 345 | #define __NR_pwritev 334 | ||
| 344 | 346 | ||
| 345 | #define NR_syscalls 333 | 347 | #define NR_syscalls 335 |
| 346 | 348 | ||
| 347 | #ifdef __KERNEL__ | 349 | #ifdef __KERNEL__ |
| 348 | 350 | ||
diff --git a/arch/sh/include/asm/unistd_64.h b/arch/sh/include/asm/unistd_64.h index 7c54e91753c1..6eb9d2934c0f 100644 --- a/arch/sh/include/asm/unistd_64.h +++ b/arch/sh/include/asm/unistd_64.h | |||
| @@ -381,10 +381,12 @@ | |||
| 381 | #define __NR_dup3 358 | 381 | #define __NR_dup3 358 |
| 382 | #define __NR_pipe2 359 | 382 | #define __NR_pipe2 359 |
| 383 | #define __NR_inotify_init1 360 | 383 | #define __NR_inotify_init1 360 |
| 384 | #define __NR_preadv 361 | ||
| 385 | #define __NR_pwritev 362 | ||
| 384 | 386 | ||
| 385 | #ifdef __KERNEL__ | 387 | #ifdef __KERNEL__ |
| 386 | 388 | ||
| 387 | #define NR_syscalls 361 | 389 | #define NR_syscalls 363 |
| 388 | 390 | ||
| 389 | #define __ARCH_WANT_IPC_PARSE_VERSION | 391 | #define __ARCH_WANT_IPC_PARSE_VERSION |
| 390 | #define __ARCH_WANT_OLD_READDIR | 392 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 5a47e1cf442e..90e8cfff55fd 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
| @@ -143,14 +143,14 @@ static void __init sh7786_usb_setup(void) | |||
| 143 | * Set the PHY and PLL enable bit | 143 | * Set the PHY and PLL enable bit |
| 144 | */ | 144 | */ |
| 145 | __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1); | 145 | __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1); |
| 146 | while (i-- && | 146 | while (i--) { |
| 147 | ((__raw_readl(USBST) & ACT_PLL_STATUS) != ACT_PLL_STATUS)) | 147 | if (ACT_PLL_STATUS == (__raw_readl(USBST) & ACT_PLL_STATUS)) { |
| 148 | /* Set the PHY RST bit */ | ||
| 149 | __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1); | ||
| 150 | printk(KERN_INFO "sh7786 usb setup done\n"); | ||
| 151 | break; | ||
| 152 | } | ||
| 148 | cpu_relax(); | 153 | cpu_relax(); |
| 149 | |||
| 150 | if (i) { | ||
| 151 | /* Set the PHY RST bit */ | ||
| 152 | __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1); | ||
| 153 | printk(KERN_INFO "sh7786 usb setup done\n"); | ||
| 154 | } | 154 | } |
| 155 | } | 155 | } |
| 156 | 156 | ||
diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index e67c1733e1b9..05202edd8e21 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S | |||
| @@ -349,3 +349,5 @@ ENTRY(sys_call_table) | |||
| 349 | .long sys_dup3 /* 330 */ | 349 | .long sys_dup3 /* 330 */ |
| 350 | .long sys_pipe2 | 350 | .long sys_pipe2 |
| 351 | .long sys_inotify_init1 | 351 | .long sys_inotify_init1 |
| 352 | .long sys_preadv | ||
| 353 | .long sys_writev | ||
diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 557cb91f5caf..a083609f9284 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S | |||
| @@ -387,3 +387,5 @@ sys_call_table: | |||
| 387 | .long sys_dup3 | 387 | .long sys_dup3 |
| 388 | .long sys_pipe2 | 388 | .long sys_pipe2 |
| 389 | .long sys_inotify_init1 /* 360 */ | 389 | .long sys_inotify_init1 /* 360 */ |
| 390 | .long sys_preadv | ||
| 391 | .long sys_pwritev | ||
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index edcd5fbf9651..e098ec158ddb 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
| @@ -10,11 +10,22 @@ | |||
| 10 | * for more details. | 10 | * for more details. |
| 11 | */ | 11 | */ |
| 12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 13 | #include <linux/init.h> | ||
| 13 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 14 | #include <linux/dma-mapping.h> | 15 | #include <linux/dma-mapping.h> |
| 16 | #include <linux/dma-debug.h> | ||
| 17 | #include <linux/io.h> | ||
| 15 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
| 16 | #include <asm/addrspace.h> | 19 | #include <asm/addrspace.h> |
| 17 | #include <asm/io.h> | 20 | |
| 21 | #define PREALLOC_DMA_DEBUG_ENTRIES 4096 | ||
| 22 | |||
| 23 | static int __init dma_init(void) | ||
| 24 | { | ||
| 25 | dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); | ||
| 26 | return 0; | ||
| 27 | } | ||
| 28 | fs_initcall(dma_init); | ||
| 18 | 29 | ||
| 19 | void *dma_alloc_coherent(struct device *dev, size_t size, | 30 | void *dma_alloc_coherent(struct device *dev, size_t size, |
| 20 | dma_addr_t *dma_handle, gfp_t gfp) | 31 | dma_addr_t *dma_handle, gfp_t gfp) |
| @@ -45,6 +56,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
| 45 | split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); | 56 | split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); |
| 46 | 57 | ||
| 47 | *dma_handle = virt_to_phys(ret); | 58 | *dma_handle = virt_to_phys(ret); |
| 59 | |||
| 60 | debug_dma_alloc_coherent(dev, size, *dma_handle, ret_nocache); | ||
| 61 | |||
| 48 | return ret_nocache; | 62 | return ret_nocache; |
| 49 | } | 63 | } |
| 50 | EXPORT_SYMBOL(dma_alloc_coherent); | 64 | EXPORT_SYMBOL(dma_alloc_coherent); |
| @@ -56,12 +70,15 @@ void dma_free_coherent(struct device *dev, size_t size, | |||
| 56 | unsigned long pfn = dma_handle >> PAGE_SHIFT; | 70 | unsigned long pfn = dma_handle >> PAGE_SHIFT; |
| 57 | int k; | 71 | int k; |
| 58 | 72 | ||
| 59 | if (!dma_release_from_coherent(dev, order, vaddr)) { | 73 | WARN_ON(irqs_disabled()); /* for portability */ |
| 60 | WARN_ON(irqs_disabled()); /* for portability */ | 74 | |
| 61 | for (k = 0; k < (1 << order); k++) | 75 | if (dma_release_from_coherent(dev, order, vaddr)) |
| 62 | __free_pages(pfn_to_page(pfn + k), 0); | 76 | return; |
| 63 | iounmap(vaddr); | 77 | |
| 64 | } | 78 | debug_dma_free_coherent(dev, size, vaddr, dma_handle); |
| 79 | for (k = 0; k < (1 << order); k++) | ||
| 80 | __free_pages(pfn_to_page(pfn + k), 0); | ||
| 81 | iounmap(vaddr); | ||
| 65 | } | 82 | } |
| 66 | EXPORT_SYMBOL(dma_free_coherent); | 83 | EXPORT_SYMBOL(dma_free_coherent); |
| 67 | 84 | ||
diff --git a/arch/sparc/include/asm/parport.h b/arch/sparc/include/asm/parport.h index dff3f0253aa8..ff9ead640c4a 100644 --- a/arch/sparc/include/asm/parport.h +++ b/arch/sparc/include/asm/parport.h | |||
| @@ -117,7 +117,7 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id | |||
| 117 | if (!strcmp(parent->name, "dma")) { | 117 | if (!strcmp(parent->name, "dma")) { |
| 118 | p = parport_pc_probe_port(base, base + 0x400, | 118 | p = parport_pc_probe_port(base, base + 0x400, |
| 119 | op->irqs[0], PARPORT_DMA_NOFIFO, | 119 | op->irqs[0], PARPORT_DMA_NOFIFO, |
| 120 | op->dev.parent->parent); | 120 | op->dev.parent->parent, 0); |
| 121 | if (!p) | 121 | if (!p) |
| 122 | return -ENOMEM; | 122 | return -ENOMEM; |
| 123 | dev_set_drvdata(&op->dev, p); | 123 | dev_set_drvdata(&op->dev, p); |
| @@ -168,7 +168,8 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id | |||
| 168 | p = parport_pc_probe_port(base, base + 0x400, | 168 | p = parport_pc_probe_port(base, base + 0x400, |
| 169 | op->irqs[0], | 169 | op->irqs[0], |
| 170 | slot, | 170 | slot, |
| 171 | op->dev.parent); | 171 | op->dev.parent, |
| 172 | 0); | ||
| 172 | err = -ENOMEM; | 173 | err = -ENOMEM; |
| 173 | if (!p) | 174 | if (!p) |
| 174 | goto out_disable_irq; | 175 | goto out_disable_irq; |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 4fa3bb2ddfe4..33e5ade774ca 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
| @@ -434,7 +434,8 @@ static void __init superio_parport_init(void) | |||
| 434 | 0 /*base_hi*/, | 434 | 0 /*base_hi*/, |
| 435 | PAR_IRQ, | 435 | PAR_IRQ, |
| 436 | PARPORT_DMA_NONE /* dma */, | 436 | PARPORT_DMA_NONE /* dma */, |
| 437 | NULL /*struct pci_dev* */) ) | 437 | NULL /*struct pci_dev* */), |
| 438 | 0 /* shared irq flags */ ) | ||
| 438 | 439 | ||
| 439 | printk(KERN_WARNING PFX "Probing parallel port failed.\n"); | 440 | printk(KERN_WARNING PFX "Probing parallel port failed.\n"); |
| 440 | #endif /* CONFIG_PARPORT_PC */ | 441 | #endif /* CONFIG_PARPORT_PC */ |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index b1bd3fc7bae8..36fd2e75da1c 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
| @@ -1394,7 +1394,7 @@ lpfc_parse_bg_err(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd, | |||
| 1394 | */ | 1394 | */ |
| 1395 | cmd->sense_buffer[8] = 0; /* Information */ | 1395 | cmd->sense_buffer[8] = 0; /* Information */ |
| 1396 | cmd->sense_buffer[9] = 0xa; /* Add. length */ | 1396 | cmd->sense_buffer[9] = 0xa; /* Add. length */ |
| 1397 | do_div(bghm, cmd->device->sector_size); | 1397 | bghm /= cmd->device->sector_size; |
| 1398 | 1398 | ||
| 1399 | failing_sector = scsi_get_lba(cmd); | 1399 | failing_sector = scsi_get_lba(cmd); |
| 1400 | failing_sector += bghm; | 1400 | failing_sector += bghm; |
diff --git a/drivers/sh/intc.c b/drivers/sh/intc.c index 7fb9b5c4669a..12d13d99b6f0 100644 --- a/drivers/sh/intc.c +++ b/drivers/sh/intc.c | |||
| @@ -44,6 +44,7 @@ struct intc_handle_int { | |||
| 44 | struct intc_desc_int { | 44 | struct intc_desc_int { |
| 45 | struct list_head list; | 45 | struct list_head list; |
| 46 | struct sys_device sysdev; | 46 | struct sys_device sysdev; |
| 47 | pm_message_t state; | ||
| 47 | unsigned long *reg; | 48 | unsigned long *reg; |
| 48 | #ifdef CONFIG_SMP | 49 | #ifdef CONFIG_SMP |
| 49 | unsigned long *smp; | 50 | unsigned long *smp; |
| @@ -786,18 +787,44 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state) | |||
| 786 | /* get intc controller associated with this sysdev */ | 787 | /* get intc controller associated with this sysdev */ |
| 787 | d = container_of(dev, struct intc_desc_int, sysdev); | 788 | d = container_of(dev, struct intc_desc_int, sysdev); |
| 788 | 789 | ||
| 789 | /* enable wakeup irqs belonging to this intc controller */ | 790 | switch (state.event) { |
| 790 | for_each_irq_desc(irq, desc) { | 791 | case PM_EVENT_ON: |
| 791 | if ((desc->status & IRQ_WAKEUP) && (desc->chip == &d->chip)) | 792 | if (d->state.event != PM_EVENT_FREEZE) |
| 792 | intc_enable(irq); | 793 | break; |
| 794 | for_each_irq_desc(irq, desc) { | ||
| 795 | if (desc->chip != &d->chip) | ||
| 796 | continue; | ||
| 797 | if (desc->status & IRQ_DISABLED) | ||
| 798 | intc_disable(irq); | ||
| 799 | else | ||
| 800 | intc_enable(irq); | ||
| 801 | } | ||
| 802 | break; | ||
| 803 | case PM_EVENT_FREEZE: | ||
| 804 | /* nothing has to be done */ | ||
| 805 | break; | ||
| 806 | case PM_EVENT_SUSPEND: | ||
| 807 | /* enable wakeup irqs belonging to this intc controller */ | ||
| 808 | for_each_irq_desc(irq, desc) { | ||
| 809 | if ((desc->status & IRQ_WAKEUP) && (desc->chip == &d->chip)) | ||
| 810 | intc_enable(irq); | ||
| 811 | } | ||
| 812 | break; | ||
| 793 | } | 813 | } |
| 814 | d->state = state; | ||
| 794 | 815 | ||
| 795 | return 0; | 816 | return 0; |
| 796 | } | 817 | } |
| 797 | 818 | ||
| 819 | static int intc_resume(struct sys_device *dev) | ||
| 820 | { | ||
| 821 | return intc_suspend(dev, PMSG_ON); | ||
| 822 | } | ||
| 823 | |||
| 798 | static struct sysdev_class intc_sysdev_class = { | 824 | static struct sysdev_class intc_sysdev_class = { |
| 799 | .name = "intc", | 825 | .name = "intc", |
| 800 | .suspend = intc_suspend, | 826 | .suspend = intc_suspend, |
| 827 | .resume = intc_resume, | ||
| 801 | }; | 828 | }; |
| 802 | 829 | ||
| 803 | /* register this intc as sysdev to allow suspend/resume */ | 830 | /* register this intc as sysdev to allow suspend/resume */ |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 869d47cb6db3..0a69c0977e3f 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -546,10 +546,6 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
| 546 | tty->driver_data = acm; | 546 | tty->driver_data = acm; |
| 547 | acm->tty = tty; | 547 | acm->tty = tty; |
| 548 | 548 | ||
| 549 | /* force low_latency on so that our tty_push actually forces the data through, | ||
| 550 | otherwise it is scheduled, and with high data rates data can get lost. */ | ||
| 551 | tty->low_latency = 1; | ||
| 552 | |||
| 553 | if (usb_autopm_get_interface(acm->control) < 0) | 549 | if (usb_autopm_get_interface(acm->control) < 0) |
| 554 | goto early_bail; | 550 | goto early_bail; |
| 555 | else | 551 | else |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 2620bf6fe5e1..9c4c700c7cc6 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -1215,20 +1215,22 @@ static void ti_bulk_in_callback(struct urb *urb) | |||
| 1215 | } | 1215 | } |
| 1216 | 1216 | ||
| 1217 | tty = tty_port_tty_get(&port->port); | 1217 | tty = tty_port_tty_get(&port->port); |
| 1218 | if (tty && urb->actual_length) { | 1218 | if (tty) { |
| 1219 | usb_serial_debug_data(debug, dev, __func__, | 1219 | if (urb->actual_length) { |
| 1220 | urb->actual_length, urb->transfer_buffer); | 1220 | usb_serial_debug_data(debug, dev, __func__, |
| 1221 | 1221 | urb->actual_length, urb->transfer_buffer); | |
| 1222 | if (!tport->tp_is_open) | 1222 | |
| 1223 | dbg("%s - port closed, dropping data", __func__); | 1223 | if (!tport->tp_is_open) |
| 1224 | else | 1224 | dbg("%s - port closed, dropping data", |
| 1225 | ti_recv(&urb->dev->dev, tty, | 1225 | __func__); |
| 1226 | else | ||
| 1227 | ti_recv(&urb->dev->dev, tty, | ||
| 1226 | urb->transfer_buffer, | 1228 | urb->transfer_buffer, |
| 1227 | urb->actual_length); | 1229 | urb->actual_length); |
| 1228 | 1230 | spin_lock(&tport->tp_lock); | |
| 1229 | spin_lock(&tport->tp_lock); | 1231 | tport->tp_icount.rx += urb->actual_length; |
| 1230 | tport->tp_icount.rx += urb->actual_length; | 1232 | spin_unlock(&tport->tp_lock); |
| 1231 | spin_unlock(&tport->tp_lock); | 1233 | } |
| 1232 | tty_kref_put(tty); | 1234 | tty_kref_put(tty); |
| 1233 | } | 1235 | } |
| 1234 | 1236 | ||
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2b25133524a3..06f30e965676 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
| @@ -938,9 +938,9 @@ static void fuse_release_user_pages(struct fuse_req *req, int write) | |||
| 938 | } | 938 | } |
| 939 | 939 | ||
| 940 | static int fuse_get_user_pages(struct fuse_req *req, const char __user *buf, | 940 | static int fuse_get_user_pages(struct fuse_req *req, const char __user *buf, |
| 941 | unsigned *nbytesp, int write) | 941 | size_t *nbytesp, int write) |
| 942 | { | 942 | { |
| 943 | unsigned nbytes = *nbytesp; | 943 | size_t nbytes = *nbytesp; |
| 944 | unsigned long user_addr = (unsigned long) buf; | 944 | unsigned long user_addr = (unsigned long) buf; |
| 945 | unsigned offset = user_addr & ~PAGE_MASK; | 945 | unsigned offset = user_addr & ~PAGE_MASK; |
| 946 | int npages; | 946 | int npages; |
| @@ -955,7 +955,7 @@ static int fuse_get_user_pages(struct fuse_req *req, const char __user *buf, | |||
| 955 | return 0; | 955 | return 0; |
| 956 | } | 956 | } |
| 957 | 957 | ||
| 958 | nbytes = min(nbytes, (unsigned) FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT); | 958 | nbytes = min_t(size_t, nbytes, FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT); |
| 959 | npages = (nbytes + offset + PAGE_SIZE - 1) >> PAGE_SHIFT; | 959 | npages = (nbytes + offset + PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 960 | npages = clamp(npages, 1, FUSE_MAX_PAGES_PER_REQ); | 960 | npages = clamp(npages, 1, FUSE_MAX_PAGES_PER_REQ); |
| 961 | down_read(¤t->mm->mmap_sem); | 961 | down_read(¤t->mm->mmap_sem); |
| @@ -1298,6 +1298,8 @@ static int fuse_direct_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 1298 | if (vma->vm_flags & VM_MAYSHARE) | 1298 | if (vma->vm_flags & VM_MAYSHARE) |
| 1299 | return -ENODEV; | 1299 | return -ENODEV; |
| 1300 | 1300 | ||
| 1301 | invalidate_inode_pages2(file->f_mapping); | ||
| 1302 | |||
| 1301 | return generic_file_mmap(file, vma); | 1303 | return generic_file_mmap(file, vma); |
| 1302 | } | 1304 | } |
| 1303 | 1305 | ||
diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c index 24638e059bf3..064279e33bbb 100644 --- a/fs/nilfs2/bmap.c +++ b/fs/nilfs2/bmap.c | |||
| @@ -688,6 +688,8 @@ static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_gc = { | |||
| 688 | .bpop_translate = NULL, | 688 | .bpop_translate = NULL, |
| 689 | }; | 689 | }; |
| 690 | 690 | ||
| 691 | static struct lock_class_key nilfs_bmap_dat_lock_key; | ||
| 692 | |||
| 691 | /** | 693 | /** |
| 692 | * nilfs_bmap_read - read a bmap from an inode | 694 | * nilfs_bmap_read - read a bmap from an inode |
| 693 | * @bmap: bmap | 695 | * @bmap: bmap |
| @@ -715,6 +717,7 @@ int nilfs_bmap_read(struct nilfs_bmap *bmap, struct nilfs_inode *raw_inode) | |||
| 715 | bmap->b_pops = &nilfs_bmap_ptr_ops_p; | 717 | bmap->b_pops = &nilfs_bmap_ptr_ops_p; |
| 716 | bmap->b_last_allocated_key = 0; /* XXX: use macro */ | 718 | bmap->b_last_allocated_key = 0; /* XXX: use macro */ |
| 717 | bmap->b_last_allocated_ptr = NILFS_BMAP_NEW_PTR_INIT; | 719 | bmap->b_last_allocated_ptr = NILFS_BMAP_NEW_PTR_INIT; |
| 720 | lockdep_set_class(&bmap->b_sem, &nilfs_bmap_dat_lock_key); | ||
| 718 | break; | 721 | break; |
| 719 | case NILFS_CPFILE_INO: | 722 | case NILFS_CPFILE_INO: |
| 720 | case NILFS_SUFILE_INO: | 723 | case NILFS_SUFILE_INO: |
| @@ -772,6 +775,7 @@ void nilfs_bmap_init_gcdat(struct nilfs_bmap *gcbmap, struct nilfs_bmap *bmap) | |||
| 772 | { | 775 | { |
| 773 | memcpy(gcbmap, bmap, sizeof(union nilfs_bmap_union)); | 776 | memcpy(gcbmap, bmap, sizeof(union nilfs_bmap_union)); |
| 774 | init_rwsem(&gcbmap->b_sem); | 777 | init_rwsem(&gcbmap->b_sem); |
| 778 | lockdep_set_class(&bmap->b_sem, &nilfs_bmap_dat_lock_key); | ||
| 775 | gcbmap->b_inode = &NILFS_BMAP_I(gcbmap)->vfs_inode; | 779 | gcbmap->b_inode = &NILFS_BMAP_I(gcbmap)->vfs_inode; |
| 776 | } | 780 | } |
| 777 | 781 | ||
| @@ -779,5 +783,6 @@ void nilfs_bmap_commit_gcdat(struct nilfs_bmap *gcbmap, struct nilfs_bmap *bmap) | |||
| 779 | { | 783 | { |
| 780 | memcpy(bmap, gcbmap, sizeof(union nilfs_bmap_union)); | 784 | memcpy(bmap, gcbmap, sizeof(union nilfs_bmap_union)); |
| 781 | init_rwsem(&bmap->b_sem); | 785 | init_rwsem(&bmap->b_sem); |
| 786 | lockdep_set_class(&bmap->b_sem, &nilfs_bmap_dat_lock_key); | ||
| 782 | bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode; | 787 | bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode; |
| 783 | } | 788 | } |
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h index 7558c977db02..3d0c18a16db1 100644 --- a/fs/nilfs2/nilfs.h +++ b/fs/nilfs2/nilfs.h | |||
| @@ -35,11 +35,6 @@ | |||
| 35 | #include "bmap_union.h" | 35 | #include "bmap_union.h" |
| 36 | 36 | ||
| 37 | /* | 37 | /* |
| 38 | * NILFS filesystem version | ||
| 39 | */ | ||
| 40 | #define NILFS_VERSION "2.0.5" | ||
| 41 | |||
| 42 | /* | ||
| 43 | * nilfs inode data in memory | 38 | * nilfs inode data in memory |
| 44 | */ | 39 | */ |
| 45 | struct nilfs_inode_info { | 40 | struct nilfs_inode_info { |
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c index 6ade0963fc1d..4fc081e47d70 100644 --- a/fs/nilfs2/recovery.c +++ b/fs/nilfs2/recovery.c | |||
| @@ -413,7 +413,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs, | |||
| 413 | struct nilfs_segment_entry *ent, *n; | 413 | struct nilfs_segment_entry *ent, *n; |
| 414 | struct inode *sufile = nilfs->ns_sufile; | 414 | struct inode *sufile = nilfs->ns_sufile; |
| 415 | __u64 segnum[4]; | 415 | __u64 segnum[4]; |
| 416 | time_t mtime; | ||
| 417 | int err; | 416 | int err; |
| 418 | int i; | 417 | int i; |
| 419 | 418 | ||
| @@ -442,24 +441,13 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs, | |||
| 442 | * Collecting segments written after the latest super root. | 441 | * Collecting segments written after the latest super root. |
| 443 | * These are marked dirty to avoid being reallocated in the next write. | 442 | * These are marked dirty to avoid being reallocated in the next write. |
| 444 | */ | 443 | */ |
| 445 | mtime = get_seconds(); | ||
| 446 | list_for_each_entry_safe(ent, n, head, list) { | 444 | list_for_each_entry_safe(ent, n, head, list) { |
| 447 | if (ent->segnum == segnum[0]) { | 445 | if (ent->segnum != segnum[0]) { |
| 448 | list_del(&ent->list); | 446 | err = nilfs_sufile_scrap(sufile, ent->segnum); |
| 449 | nilfs_free_segment_entry(ent); | 447 | if (unlikely(err)) |
| 450 | continue; | 448 | goto failed; |
| 451 | } | ||
| 452 | err = nilfs_open_segment_entry(ent, sufile); | ||
| 453 | if (unlikely(err)) | ||
| 454 | goto failed; | ||
| 455 | if (!nilfs_segment_usage_dirty(ent->raw_su)) { | ||
| 456 | /* make the segment garbage */ | ||
| 457 | ent->raw_su->su_nblocks = cpu_to_le32(0); | ||
| 458 | ent->raw_su->su_lastmod = cpu_to_le32(mtime); | ||
| 459 | nilfs_segment_usage_set_dirty(ent->raw_su); | ||
| 460 | } | 449 | } |
| 461 | list_del(&ent->list); | 450 | list_del(&ent->list); |
| 462 | nilfs_close_segment_entry(ent, sufile); | ||
| 463 | nilfs_free_segment_entry(ent); | 451 | nilfs_free_segment_entry(ent); |
| 464 | } | 452 | } |
| 465 | 453 | ||
diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index c774cf397e2f..98e68677f045 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c | |||
| @@ -93,6 +93,52 @@ nilfs_sufile_get_segment_usage_block(struct inode *sufile, __u64 segnum, | |||
| 93 | create, NULL, bhp); | 93 | create, NULL, bhp); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | static void nilfs_sufile_mod_counter(struct buffer_head *header_bh, | ||
| 97 | u64 ncleanadd, u64 ndirtyadd) | ||
| 98 | { | ||
| 99 | struct nilfs_sufile_header *header; | ||
| 100 | void *kaddr; | ||
| 101 | |||
| 102 | kaddr = kmap_atomic(header_bh->b_page, KM_USER0); | ||
| 103 | header = kaddr + bh_offset(header_bh); | ||
| 104 | le64_add_cpu(&header->sh_ncleansegs, ncleanadd); | ||
| 105 | le64_add_cpu(&header->sh_ndirtysegs, ndirtyadd); | ||
| 106 | kunmap_atomic(kaddr, KM_USER0); | ||
| 107 | |||
| 108 | nilfs_mdt_mark_buffer_dirty(header_bh); | ||
| 109 | } | ||
| 110 | |||
| 111 | int nilfs_sufile_update(struct inode *sufile, __u64 segnum, int create, | ||
| 112 | void (*dofunc)(struct inode *, __u64, | ||
| 113 | struct buffer_head *, | ||
| 114 | struct buffer_head *)) | ||
| 115 | { | ||
| 116 | struct buffer_head *header_bh, *bh; | ||
| 117 | int ret; | ||
| 118 | |||
| 119 | if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) { | ||
| 120 | printk(KERN_WARNING "%s: invalid segment number: %llu\n", | ||
| 121 | __func__, (unsigned long long)segnum); | ||
| 122 | return -EINVAL; | ||
| 123 | } | ||
| 124 | down_write(&NILFS_MDT(sufile)->mi_sem); | ||
| 125 | |||
| 126 | ret = nilfs_sufile_get_header_block(sufile, &header_bh); | ||
| 127 | if (ret < 0) | ||
| 128 | goto out_sem; | ||
| 129 | |||
| 130 | ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, create, &bh); | ||
| 131 | if (!ret) { | ||
| 132 | dofunc(sufile, segnum, header_bh, bh); | ||
| 133 | brelse(bh); | ||
| 134 | } | ||
| 135 | brelse(header_bh); | ||
| 136 | |||
| 137 | out_sem: | ||
| 138 | up_write(&NILFS_MDT(sufile)->mi_sem); | ||
| 139 | return ret; | ||
| 140 | } | ||
| 141 | |||
| 96 | /** | 142 | /** |
| 97 | * nilfs_sufile_alloc - allocate a segment | 143 | * nilfs_sufile_alloc - allocate a segment |
| 98 | * @sufile: inode of segment usage file | 144 | * @sufile: inode of segment usage file |
| @@ -113,7 +159,6 @@ nilfs_sufile_get_segment_usage_block(struct inode *sufile, __u64 segnum, | |||
| 113 | int nilfs_sufile_alloc(struct inode *sufile, __u64 *segnump) | 159 | int nilfs_sufile_alloc(struct inode *sufile, __u64 *segnump) |
| 114 | { | 160 | { |
| 115 | struct buffer_head *header_bh, *su_bh; | 161 | struct buffer_head *header_bh, *su_bh; |
| 116 | struct the_nilfs *nilfs; | ||
| 117 | struct nilfs_sufile_header *header; | 162 | struct nilfs_sufile_header *header; |
| 118 | struct nilfs_segment_usage *su; | 163 | struct nilfs_segment_usage *su; |
| 119 | size_t susz = NILFS_MDT(sufile)->mi_entry_size; | 164 | size_t susz = NILFS_MDT(sufile)->mi_entry_size; |
| @@ -124,8 +169,6 @@ int nilfs_sufile_alloc(struct inode *sufile, __u64 *segnump) | |||
| 124 | 169 | ||
| 125 | down_write(&NILFS_MDT(sufile)->mi_sem); | 170 | down_write(&NILFS_MDT(sufile)->mi_sem); |
| 126 | 171 | ||
| 127 | nilfs = NILFS_MDT(sufile)->mi_nilfs; | ||
| 128 | |||
| 129 | ret = nilfs_sufile_get_header_block(sufile, &header_bh); | 172 | ret = nilfs_sufile_get_header_block(sufile, &header_bh); |
| 130 | if (ret < 0) | 173 | if (ret < 0) |
| 131 | goto out_sem; | 174 | goto out_sem; |
| @@ -192,165 +235,84 @@ int nilfs_sufile_alloc(struct inode *sufile, __u64 *segnump) | |||
| 192 | return ret; | 235 | return ret; |
| 193 | } | 236 | } |
| 194 | 237 | ||
| 195 | /** | 238 | void nilfs_sufile_do_cancel_free(struct inode *sufile, __u64 segnum, |
| 196 | * nilfs_sufile_cancel_free - | 239 | struct buffer_head *header_bh, |
| 197 | * @sufile: inode of segment usage file | 240 | struct buffer_head *su_bh) |
| 198 | * @segnum: segment number | ||
| 199 | * | ||
| 200 | * Description: | ||
| 201 | * | ||
| 202 | * Return Value: On success, 0 is returned. On error, one of the following | ||
| 203 | * negative error codes is returned. | ||
| 204 | * | ||
| 205 | * %-EIO - I/O error. | ||
| 206 | * | ||
| 207 | * %-ENOMEM - Insufficient amount of memory available. | ||
| 208 | */ | ||
| 209 | int nilfs_sufile_cancel_free(struct inode *sufile, __u64 segnum) | ||
| 210 | { | 241 | { |
| 211 | struct buffer_head *header_bh, *su_bh; | ||
| 212 | struct the_nilfs *nilfs; | ||
| 213 | struct nilfs_sufile_header *header; | ||
| 214 | struct nilfs_segment_usage *su; | 242 | struct nilfs_segment_usage *su; |
| 215 | void *kaddr; | 243 | void *kaddr; |
| 216 | int ret; | ||
| 217 | |||
| 218 | down_write(&NILFS_MDT(sufile)->mi_sem); | ||
| 219 | |||
| 220 | nilfs = NILFS_MDT(sufile)->mi_nilfs; | ||
| 221 | |||
| 222 | ret = nilfs_sufile_get_header_block(sufile, &header_bh); | ||
| 223 | if (ret < 0) | ||
| 224 | goto out_sem; | ||
| 225 | |||
| 226 | ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &su_bh); | ||
| 227 | if (ret < 0) | ||
| 228 | goto out_header; | ||
| 229 | 244 | ||
| 230 | kaddr = kmap_atomic(su_bh->b_page, KM_USER0); | 245 | kaddr = kmap_atomic(su_bh->b_page, KM_USER0); |
| 231 | su = nilfs_sufile_block_get_segment_usage( | 246 | su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr); |
| 232 | sufile, segnum, su_bh, kaddr); | ||
| 233 | if (unlikely(!nilfs_segment_usage_clean(su))) { | 247 | if (unlikely(!nilfs_segment_usage_clean(su))) { |
| 234 | printk(KERN_WARNING "%s: segment %llu must be clean\n", | 248 | printk(KERN_WARNING "%s: segment %llu must be clean\n", |
| 235 | __func__, (unsigned long long)segnum); | 249 | __func__, (unsigned long long)segnum); |
| 236 | kunmap_atomic(kaddr, KM_USER0); | 250 | kunmap_atomic(kaddr, KM_USER0); |
| 237 | goto out_su_bh; | 251 | return; |
| 238 | } | 252 | } |
| 239 | nilfs_segment_usage_set_dirty(su); | 253 | nilfs_segment_usage_set_dirty(su); |
| 240 | kunmap_atomic(kaddr, KM_USER0); | 254 | kunmap_atomic(kaddr, KM_USER0); |
| 241 | 255 | ||
| 242 | kaddr = kmap_atomic(header_bh->b_page, KM_USER0); | 256 | nilfs_sufile_mod_counter(header_bh, -1, 1); |
| 243 | header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr); | ||
| 244 | le64_add_cpu(&header->sh_ncleansegs, -1); | ||
| 245 | le64_add_cpu(&header->sh_ndirtysegs, 1); | ||
| 246 | kunmap_atomic(kaddr, KM_USER0); | ||
| 247 | |||
| 248 | nilfs_mdt_mark_buffer_dirty(header_bh); | ||
| 249 | nilfs_mdt_mark_buffer_dirty(su_bh); | 257 | nilfs_mdt_mark_buffer_dirty(su_bh); |
| 250 | nilfs_mdt_mark_dirty(sufile); | 258 | nilfs_mdt_mark_dirty(sufile); |
| 251 | |||
| 252 | out_su_bh: | ||
| 253 | brelse(su_bh); | ||
| 254 | out_header: | ||
| 255 | brelse(header_bh); | ||
| 256 | out_sem: | ||
| 257 | up_write(&NILFS_MDT(sufile)->mi_sem); | ||
| 258 | return ret; | ||
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | /** | 261 | void nilfs_sufile_do_scrap(struct inode *sufile, __u64 segnum, |
| 262 | * nilfs_sufile_freev - free segments | 262 | struct buffer_head *header_bh, |
| 263 | * @sufile: inode of segment usage file | 263 | struct buffer_head *su_bh) |
| 264 | * @segnum: array of segment numbers | ||
| 265 | * @nsegs: number of segments | ||
| 266 | * | ||
| 267 | * Description: nilfs_sufile_freev() frees segments specified by @segnum and | ||
| 268 | * @nsegs, which must have been returned by a previous call to | ||
| 269 | * nilfs_sufile_alloc(). | ||
| 270 | * | ||
| 271 | * Return Value: On success, 0 is returned. On error, one of the following | ||
| 272 | * negative error codes is returned. | ||
| 273 | * | ||
| 274 | * %-EIO - I/O error. | ||
| 275 | * | ||
| 276 | * %-ENOMEM - Insufficient amount of memory available. | ||
| 277 | */ | ||
| 278 | #define NILFS_SUFILE_FREEV_PREALLOC 16 | ||
| 279 | int nilfs_sufile_freev(struct inode *sufile, __u64 *segnum, size_t nsegs) | ||
| 280 | { | 264 | { |
| 281 | struct buffer_head *header_bh, **su_bh, | ||
| 282 | *su_bh_prealloc[NILFS_SUFILE_FREEV_PREALLOC]; | ||
| 283 | struct the_nilfs *nilfs; | ||
| 284 | struct nilfs_sufile_header *header; | ||
| 285 | struct nilfs_segment_usage *su; | 265 | struct nilfs_segment_usage *su; |
| 286 | void *kaddr; | 266 | void *kaddr; |
| 287 | int ret, i; | 267 | int clean, dirty; |
| 288 | 268 | ||
| 289 | down_write(&NILFS_MDT(sufile)->mi_sem); | 269 | kaddr = kmap_atomic(su_bh->b_page, KM_USER0); |
| 290 | 270 | su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr); | |
| 291 | nilfs = NILFS_MDT(sufile)->mi_nilfs; | 271 | if (su->su_flags == cpu_to_le32(1UL << NILFS_SEGMENT_USAGE_DIRTY) && |
| 292 | 272 | su->su_nblocks == cpu_to_le32(0)) { | |
| 293 | /* prepare resources */ | ||
| 294 | if (nsegs <= NILFS_SUFILE_FREEV_PREALLOC) | ||
| 295 | su_bh = su_bh_prealloc; | ||
| 296 | else { | ||
| 297 | su_bh = kmalloc(sizeof(*su_bh) * nsegs, GFP_NOFS); | ||
| 298 | if (su_bh == NULL) { | ||
| 299 | ret = -ENOMEM; | ||
| 300 | goto out_sem; | ||
| 301 | } | ||
| 302 | } | ||
| 303 | |||
| 304 | ret = nilfs_sufile_get_header_block(sufile, &header_bh); | ||
| 305 | if (ret < 0) | ||
| 306 | goto out_su_bh; | ||
| 307 | for (i = 0; i < nsegs; i++) { | ||
| 308 | ret = nilfs_sufile_get_segment_usage_block(sufile, segnum[i], | ||
| 309 | 0, &su_bh[i]); | ||
| 310 | if (ret < 0) | ||
| 311 | goto out_bh; | ||
| 312 | } | ||
| 313 | |||
| 314 | /* free segments */ | ||
| 315 | for (i = 0; i < nsegs; i++) { | ||
| 316 | kaddr = kmap_atomic(su_bh[i]->b_page, KM_USER0); | ||
| 317 | su = nilfs_sufile_block_get_segment_usage( | ||
| 318 | sufile, segnum[i], su_bh[i], kaddr); | ||
| 319 | WARN_ON(nilfs_segment_usage_error(su)); | ||
| 320 | nilfs_segment_usage_set_clean(su); | ||
| 321 | kunmap_atomic(kaddr, KM_USER0); | 273 | kunmap_atomic(kaddr, KM_USER0); |
| 322 | nilfs_mdt_mark_buffer_dirty(su_bh[i]); | 274 | return; |
| 323 | } | 275 | } |
| 324 | kaddr = kmap_atomic(header_bh->b_page, KM_USER0); | 276 | clean = nilfs_segment_usage_clean(su); |
| 325 | header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr); | 277 | dirty = nilfs_segment_usage_dirty(su); |
| 326 | le64_add_cpu(&header->sh_ncleansegs, nsegs); | 278 | |
| 327 | le64_add_cpu(&header->sh_ndirtysegs, -(u64)nsegs); | 279 | /* make the segment garbage */ |
| 280 | su->su_lastmod = cpu_to_le64(0); | ||
| 281 | su->su_nblocks = cpu_to_le32(0); | ||
| 282 | su->su_flags = cpu_to_le32(1UL << NILFS_SEGMENT_USAGE_DIRTY); | ||
| 328 | kunmap_atomic(kaddr, KM_USER0); | 283 | kunmap_atomic(kaddr, KM_USER0); |
| 329 | nilfs_mdt_mark_buffer_dirty(header_bh); | 284 | |
| 285 | nilfs_sufile_mod_counter(header_bh, clean ? (u64)-1 : 0, dirty ? 0 : 1); | ||
| 286 | nilfs_mdt_mark_buffer_dirty(su_bh); | ||
| 330 | nilfs_mdt_mark_dirty(sufile); | 287 | nilfs_mdt_mark_dirty(sufile); |
| 288 | } | ||
| 331 | 289 | ||
| 332 | out_bh: | 290 | void nilfs_sufile_do_free(struct inode *sufile, __u64 segnum, |
| 333 | for (i--; i >= 0; i--) | 291 | struct buffer_head *header_bh, |
| 334 | brelse(su_bh[i]); | 292 | struct buffer_head *su_bh) |
| 335 | brelse(header_bh); | 293 | { |
| 294 | struct nilfs_segment_usage *su; | ||
| 295 | void *kaddr; | ||
| 296 | int sudirty; | ||
| 336 | 297 | ||
| 337 | out_su_bh: | 298 | kaddr = kmap_atomic(su_bh->b_page, KM_USER0); |
| 338 | if (su_bh != su_bh_prealloc) | 299 | su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr); |
| 339 | kfree(su_bh); | 300 | if (nilfs_segment_usage_clean(su)) { |
| 301 | printk(KERN_WARNING "%s: segment %llu is already clean\n", | ||
| 302 | __func__, (unsigned long long)segnum); | ||
| 303 | kunmap_atomic(kaddr, KM_USER0); | ||
| 304 | return; | ||
| 305 | } | ||
| 306 | WARN_ON(nilfs_segment_usage_error(su)); | ||
| 307 | WARN_ON(!nilfs_segment_usage_dirty(su)); | ||
| 340 | 308 | ||
| 341 | out_sem: | 309 | sudirty = nilfs_segment_usage_dirty(su); |
| 342 | up_write(&NILFS_MDT(sufile)->mi_sem); | 310 | nilfs_segment_usage_set_clean(su); |
| 343 | return ret; | 311 | kunmap_atomic(kaddr, KM_USER0); |
| 344 | } | 312 | nilfs_mdt_mark_buffer_dirty(su_bh); |
| 345 | 313 | ||
| 346 | /** | 314 | nilfs_sufile_mod_counter(header_bh, 1, sudirty ? (u64)-1 : 0); |
| 347 | * nilfs_sufile_free - | 315 | nilfs_mdt_mark_dirty(sufile); |
| 348 | * @sufile: | ||
| 349 | * @segnum: | ||
| 350 | */ | ||
| 351 | int nilfs_sufile_free(struct inode *sufile, __u64 segnum) | ||
| 352 | { | ||
| 353 | return nilfs_sufile_freev(sufile, &segnum, 1); | ||
| 354 | } | 316 | } |
| 355 | 317 | ||
| 356 | /** | 318 | /** |
| @@ -500,72 +462,28 @@ int nilfs_sufile_get_ncleansegs(struct inode *sufile, unsigned long *nsegsp) | |||
| 500 | return ret; | 462 | return ret; |
| 501 | } | 463 | } |
| 502 | 464 | ||
| 503 | /** | 465 | void nilfs_sufile_do_set_error(struct inode *sufile, __u64 segnum, |
| 504 | * nilfs_sufile_set_error - mark a segment as erroneous | 466 | struct buffer_head *header_bh, |
| 505 | * @sufile: inode of segment usage file | 467 | struct buffer_head *su_bh) |
| 506 | * @segnum: segment number | ||
| 507 | * | ||
| 508 | * Description: nilfs_sufile_set_error() marks the segment specified by | ||
| 509 | * @segnum as erroneous. The error segment will never be used again. | ||
| 510 | * | ||
| 511 | * Return Value: On success, 0 is returned. On error, one of the following | ||
| 512 | * negative error codes is returned. | ||
| 513 | * | ||
| 514 | * %-EIO - I/O error. | ||
| 515 | * | ||
| 516 | * %-ENOMEM - Insufficient amount of memory available. | ||
| 517 | * | ||
| 518 | * %-EINVAL - Invalid segment usage number. | ||
| 519 | */ | ||
| 520 | int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum) | ||
| 521 | { | 468 | { |
| 522 | struct buffer_head *header_bh, *su_bh; | ||
| 523 | struct nilfs_segment_usage *su; | 469 | struct nilfs_segment_usage *su; |
| 524 | struct nilfs_sufile_header *header; | ||
| 525 | void *kaddr; | 470 | void *kaddr; |
| 526 | int ret; | 471 | int suclean; |
| 527 | |||
| 528 | if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) { | ||
| 529 | printk(KERN_WARNING "%s: invalid segment number: %llu\n", | ||
| 530 | __func__, (unsigned long long)segnum); | ||
| 531 | return -EINVAL; | ||
| 532 | } | ||
| 533 | down_write(&NILFS_MDT(sufile)->mi_sem); | ||
| 534 | |||
| 535 | ret = nilfs_sufile_get_header_block(sufile, &header_bh); | ||
| 536 | if (ret < 0) | ||
| 537 | goto out_sem; | ||
| 538 | ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &su_bh); | ||
| 539 | if (ret < 0) | ||
| 540 | goto out_header; | ||
| 541 | 472 | ||
| 542 | kaddr = kmap_atomic(su_bh->b_page, KM_USER0); | 473 | kaddr = kmap_atomic(su_bh->b_page, KM_USER0); |
| 543 | su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr); | 474 | su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr); |
| 544 | if (nilfs_segment_usage_error(su)) { | 475 | if (nilfs_segment_usage_error(su)) { |
| 545 | kunmap_atomic(kaddr, KM_USER0); | 476 | kunmap_atomic(kaddr, KM_USER0); |
| 546 | brelse(su_bh); | 477 | return; |
| 547 | goto out_header; | ||
| 548 | } | 478 | } |
| 549 | 479 | suclean = nilfs_segment_usage_clean(su); | |
| 550 | nilfs_segment_usage_set_error(su); | 480 | nilfs_segment_usage_set_error(su); |
| 551 | kunmap_atomic(kaddr, KM_USER0); | 481 | kunmap_atomic(kaddr, KM_USER0); |
| 552 | brelse(su_bh); | ||
| 553 | 482 | ||
| 554 | kaddr = kmap_atomic(header_bh->b_page, KM_USER0); | 483 | if (suclean) |
| 555 | header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr); | 484 | nilfs_sufile_mod_counter(header_bh, -1, 0); |
| 556 | le64_add_cpu(&header->sh_ndirtysegs, -1); | ||
| 557 | kunmap_atomic(kaddr, KM_USER0); | ||
| 558 | nilfs_mdt_mark_buffer_dirty(header_bh); | ||
| 559 | nilfs_mdt_mark_buffer_dirty(su_bh); | 485 | nilfs_mdt_mark_buffer_dirty(su_bh); |
| 560 | nilfs_mdt_mark_dirty(sufile); | 486 | nilfs_mdt_mark_dirty(sufile); |
| 561 | brelse(su_bh); | ||
| 562 | |||
| 563 | out_header: | ||
| 564 | brelse(header_bh); | ||
| 565 | |||
| 566 | out_sem: | ||
| 567 | up_write(&NILFS_MDT(sufile)->mi_sem); | ||
| 568 | return ret; | ||
| 569 | } | 487 | } |
| 570 | 488 | ||
| 571 | /** | 489 | /** |
| @@ -625,7 +543,7 @@ ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum, | |||
| 625 | si[i + j].sui_nblocks = le32_to_cpu(su->su_nblocks); | 543 | si[i + j].sui_nblocks = le32_to_cpu(su->su_nblocks); |
| 626 | si[i + j].sui_flags = le32_to_cpu(su->su_flags) & | 544 | si[i + j].sui_flags = le32_to_cpu(su->su_flags) & |
| 627 | ~(1UL << NILFS_SEGMENT_USAGE_ACTIVE); | 545 | ~(1UL << NILFS_SEGMENT_USAGE_ACTIVE); |
| 628 | if (nilfs_segment_is_active(nilfs, segnum + i + j)) | 546 | if (nilfs_segment_is_active(nilfs, segnum + j)) |
| 629 | si[i + j].sui_flags |= | 547 | si[i + j].sui_flags |= |
| 630 | (1UL << NILFS_SEGMENT_USAGE_ACTIVE); | 548 | (1UL << NILFS_SEGMENT_USAGE_ACTIVE); |
| 631 | } | 549 | } |
diff --git a/fs/nilfs2/sufile.h b/fs/nilfs2/sufile.h index d595f33a768d..a2e2efd4ade1 100644 --- a/fs/nilfs2/sufile.h +++ b/fs/nilfs2/sufile.h | |||
| @@ -36,9 +36,6 @@ static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile) | |||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | int nilfs_sufile_alloc(struct inode *, __u64 *); | 38 | int nilfs_sufile_alloc(struct inode *, __u64 *); |
| 39 | int nilfs_sufile_cancel_free(struct inode *, __u64); | ||
| 40 | int nilfs_sufile_freev(struct inode *, __u64 *, size_t); | ||
| 41 | int nilfs_sufile_free(struct inode *, __u64); | ||
| 42 | int nilfs_sufile_get_segment_usage(struct inode *, __u64, | 39 | int nilfs_sufile_get_segment_usage(struct inode *, __u64, |
| 43 | struct nilfs_segment_usage **, | 40 | struct nilfs_segment_usage **, |
| 44 | struct buffer_head **); | 41 | struct buffer_head **); |
| @@ -46,9 +43,83 @@ void nilfs_sufile_put_segment_usage(struct inode *, __u64, | |||
| 46 | struct buffer_head *); | 43 | struct buffer_head *); |
| 47 | int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *); | 44 | int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *); |
| 48 | int nilfs_sufile_get_ncleansegs(struct inode *, unsigned long *); | 45 | int nilfs_sufile_get_ncleansegs(struct inode *, unsigned long *); |
| 49 | int nilfs_sufile_set_error(struct inode *, __u64); | ||
| 50 | ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, struct nilfs_suinfo *, | 46 | ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, struct nilfs_suinfo *, |
| 51 | size_t); | 47 | size_t); |
| 52 | 48 | ||
| 49 | int nilfs_sufile_update(struct inode *, __u64, int, | ||
| 50 | void (*dofunc)(struct inode *, __u64, | ||
| 51 | struct buffer_head *, | ||
| 52 | struct buffer_head *)); | ||
| 53 | void nilfs_sufile_do_cancel_free(struct inode *, __u64, struct buffer_head *, | ||
| 54 | struct buffer_head *); | ||
| 55 | void nilfs_sufile_do_scrap(struct inode *, __u64, struct buffer_head *, | ||
| 56 | struct buffer_head *); | ||
| 57 | void nilfs_sufile_do_free(struct inode *, __u64, struct buffer_head *, | ||
| 58 | struct buffer_head *); | ||
| 59 | void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *, | ||
| 60 | struct buffer_head *); | ||
| 61 | |||
| 62 | /** | ||
| 63 | * nilfs_sufile_cancel_free - | ||
| 64 | * @sufile: inode of segment usage file | ||
| 65 | * @segnum: segment number | ||
| 66 | * | ||
| 67 | * Description: | ||
| 68 | * | ||
| 69 | * Return Value: On success, 0 is returned. On error, one of the following | ||
| 70 | * negative error codes is returned. | ||
| 71 | * | ||
| 72 | * %-EIO - I/O error. | ||
| 73 | * | ||
| 74 | * %-ENOMEM - Insufficient amount of memory available. | ||
| 75 | */ | ||
| 76 | static inline int nilfs_sufile_cancel_free(struct inode *sufile, __u64 segnum) | ||
| 77 | { | ||
| 78 | return nilfs_sufile_update(sufile, segnum, 0, | ||
| 79 | nilfs_sufile_do_cancel_free); | ||
| 80 | } | ||
| 81 | |||
| 82 | /** | ||
| 83 | * nilfs_sufile_scrap - make a segment garbage | ||
| 84 | * @sufile: inode of segment usage file | ||
| 85 | * @segnum: segment number to be freed | ||
| 86 | */ | ||
| 87 | static inline int nilfs_sufile_scrap(struct inode *sufile, __u64 segnum) | ||
| 88 | { | ||
| 89 | return nilfs_sufile_update(sufile, segnum, 1, nilfs_sufile_do_scrap); | ||
| 90 | } | ||
| 91 | |||
| 92 | /** | ||
| 93 | * nilfs_sufile_free - free segment | ||
| 94 | * @sufile: inode of segment usage file | ||
| 95 | * @segnum: segment number to be freed | ||
| 96 | */ | ||
| 97 | static inline int nilfs_sufile_free(struct inode *sufile, __u64 segnum) | ||
| 98 | { | ||
| 99 | return nilfs_sufile_update(sufile, segnum, 0, nilfs_sufile_do_free); | ||
| 100 | } | ||
| 101 | |||
| 102 | /** | ||
| 103 | * nilfs_sufile_set_error - mark a segment as erroneous | ||
| 104 | * @sufile: inode of segment usage file | ||
| 105 | * @segnum: segment number | ||
| 106 | * | ||
| 107 | * Description: nilfs_sufile_set_error() marks the segment specified by | ||
| 108 | * @segnum as erroneous. The error segment will never be used again. | ||
| 109 | * | ||
| 110 | * Return Value: On success, 0 is returned. On error, one of the following | ||
| 111 | * negative error codes is returned. | ||
| 112 | * | ||
| 113 | * %-EIO - I/O error. | ||
| 114 | * | ||
| 115 | * %-ENOMEM - Insufficient amount of memory available. | ||
| 116 | * | ||
| 117 | * %-EINVAL - Invalid segment usage number. | ||
| 118 | */ | ||
| 119 | static inline int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum) | ||
| 120 | { | ||
| 121 | return nilfs_sufile_update(sufile, segnum, 0, | ||
| 122 | nilfs_sufile_do_set_error); | ||
| 123 | } | ||
| 53 | 124 | ||
| 54 | #endif /* _NILFS_SUFILE_H */ | 125 | #endif /* _NILFS_SUFILE_H */ |
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index e117e1ea9bff..6989b03e97ab 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
| @@ -63,7 +63,6 @@ | |||
| 63 | MODULE_AUTHOR("NTT Corp."); | 63 | MODULE_AUTHOR("NTT Corp."); |
| 64 | MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem " | 64 | MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem " |
| 65 | "(NILFS)"); | 65 | "(NILFS)"); |
| 66 | MODULE_VERSION(NILFS_VERSION); | ||
| 67 | MODULE_LICENSE("GPL"); | 66 | MODULE_LICENSE("GPL"); |
| 68 | 67 | ||
| 69 | static int nilfs_remount(struct super_block *sb, int *flags, char *data); | 68 | static int nilfs_remount(struct super_block *sb, int *flags, char *data); |
| @@ -476,11 +475,12 @@ static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 476 | { | 475 | { |
| 477 | struct super_block *sb = dentry->d_sb; | 476 | struct super_block *sb = dentry->d_sb; |
| 478 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 477 | struct nilfs_sb_info *sbi = NILFS_SB(sb); |
| 478 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
| 479 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
| 479 | unsigned long long blocks; | 480 | unsigned long long blocks; |
| 480 | unsigned long overhead; | 481 | unsigned long overhead; |
| 481 | unsigned long nrsvblocks; | 482 | unsigned long nrsvblocks; |
| 482 | sector_t nfreeblocks; | 483 | sector_t nfreeblocks; |
| 483 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
| 484 | int err; | 484 | int err; |
| 485 | 485 | ||
| 486 | /* | 486 | /* |
| @@ -514,6 +514,9 @@ static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 514 | buf->f_files = atomic_read(&sbi->s_inodes_count); | 514 | buf->f_files = atomic_read(&sbi->s_inodes_count); |
| 515 | buf->f_ffree = 0; /* nilfs_count_free_inodes(sb); */ | 515 | buf->f_ffree = 0; /* nilfs_count_free_inodes(sb); */ |
| 516 | buf->f_namelen = NILFS_NAME_LEN; | 516 | buf->f_namelen = NILFS_NAME_LEN; |
| 517 | buf->f_fsid.val[0] = (u32)id; | ||
| 518 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
| 519 | |||
| 517 | return 0; | 520 | return 0; |
| 518 | } | 521 | } |
| 519 | 522 | ||
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index 33400cf0bbe2..7f65b3be4aa9 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
| @@ -115,6 +115,7 @@ void put_nilfs(struct the_nilfs *nilfs) | |||
| 115 | static int nilfs_load_super_root(struct the_nilfs *nilfs, | 115 | static int nilfs_load_super_root(struct the_nilfs *nilfs, |
| 116 | struct nilfs_sb_info *sbi, sector_t sr_block) | 116 | struct nilfs_sb_info *sbi, sector_t sr_block) |
| 117 | { | 117 | { |
| 118 | static struct lock_class_key dat_lock_key; | ||
| 118 | struct buffer_head *bh_sr; | 119 | struct buffer_head *bh_sr; |
| 119 | struct nilfs_super_root *raw_sr; | 120 | struct nilfs_super_root *raw_sr; |
| 120 | struct nilfs_super_block **sbp = nilfs->ns_sbp; | 121 | struct nilfs_super_block **sbp = nilfs->ns_sbp; |
| @@ -163,6 +164,9 @@ static int nilfs_load_super_root(struct the_nilfs *nilfs, | |||
| 163 | if (unlikely(err)) | 164 | if (unlikely(err)) |
| 164 | goto failed_sufile; | 165 | goto failed_sufile; |
| 165 | 166 | ||
| 167 | lockdep_set_class(&NILFS_MDT(nilfs->ns_dat)->mi_sem, &dat_lock_key); | ||
| 168 | lockdep_set_class(&NILFS_MDT(nilfs->ns_gc_dat)->mi_sem, &dat_lock_key); | ||
| 169 | |||
| 166 | nilfs_mdt_set_shadow(nilfs->ns_dat, nilfs->ns_gc_dat); | 170 | nilfs_mdt_set_shadow(nilfs->ns_dat, nilfs->ns_gc_dat); |
| 167 | nilfs_mdt_set_entry_size(nilfs->ns_cpfile, checkpoint_size, | 171 | nilfs_mdt_set_entry_size(nilfs->ns_cpfile, checkpoint_size, |
| 168 | sizeof(struct nilfs_cpfile_header)); | 172 | sizeof(struct nilfs_cpfile_header)); |
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index b95842542590..625e9e4639c6 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | /** | 29 | /** |
| 30 | * usb_serial_port: structure for the specific ports of a device. | 30 | * usb_serial_port: structure for the specific ports of a device. |
| 31 | * @serial: pointer back to the struct usb_serial owner of this port. | 31 | * @serial: pointer back to the struct usb_serial owner of this port. |
| 32 | * @tty: pointer to the corresponding tty for this port. | 32 | * @port: pointer to the corresponding tty_port for this port. |
| 33 | * @lock: spinlock to grab when updating portions of this structure. | 33 | * @lock: spinlock to grab when updating portions of this structure. |
| 34 | * @mutex: mutex used to synchronize serial_open() and serial_close() | 34 | * @mutex: mutex used to synchronize serial_open() and serial_close() |
| 35 | * access for this port. | 35 | * access for this port. |
| @@ -44,19 +44,22 @@ | |||
| 44 | * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe | 44 | * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe |
| 45 | * for this port. | 45 | * for this port. |
| 46 | * @bulk_in_buffer: pointer to the bulk in buffer for this port. | 46 | * @bulk_in_buffer: pointer to the bulk in buffer for this port. |
| 47 | * @bulk_in_size: the size of the bulk_in_buffer, in bytes. | ||
| 47 | * @read_urb: pointer to the bulk in struct urb for this port. | 48 | * @read_urb: pointer to the bulk in struct urb for this port. |
| 48 | * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this | 49 | * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this |
| 49 | * port. | 50 | * port. |
| 50 | * @bulk_out_buffer: pointer to the bulk out buffer for this port. | 51 | * @bulk_out_buffer: pointer to the bulk out buffer for this port. |
| 51 | * @bulk_out_size: the size of the bulk_out_buffer, in bytes. | 52 | * @bulk_out_size: the size of the bulk_out_buffer, in bytes. |
| 52 | * @write_urb: pointer to the bulk out struct urb for this port. | 53 | * @write_urb: pointer to the bulk out struct urb for this port. |
| 54 | * @write_urb_busy: port`s writing status | ||
| 53 | * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this | 55 | * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this |
| 54 | * port. | 56 | * port. |
| 55 | * @write_wait: a wait_queue_head_t used by the port. | 57 | * @write_wait: a wait_queue_head_t used by the port. |
| 56 | * @work: work queue entry for the line discipline waking up. | 58 | * @work: work queue entry for the line discipline waking up. |
| 57 | * @open_count: number of times this port has been opened. | ||
| 58 | * @throttled: nonzero if the read urb is inactive to throttle the device | 59 | * @throttled: nonzero if the read urb is inactive to throttle the device |
| 59 | * @throttle_req: nonzero if the tty wants to throttle us | 60 | * @throttle_req: nonzero if the tty wants to throttle us |
| 61 | * @console: attached usb serial console | ||
| 62 | * @dev: pointer to the serial device | ||
| 60 | * | 63 | * |
| 61 | * This structure is used by the usb-serial core and drivers for the specific | 64 | * This structure is used by the usb-serial core and drivers for the specific |
| 62 | * ports of a device. | 65 | * ports of a device. |
