diff options
100 files changed, 660 insertions, 476 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index a0e3c3a47a51..183887518fe3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1960,7 +1960,7 @@ F: lib/kobj* | |||
| 1960 | 1960 | ||
| 1961 | DRM DRIVERS | 1961 | DRM DRIVERS |
| 1962 | M: David Airlie <airlied@linux.ie> | 1962 | M: David Airlie <airlied@linux.ie> |
| 1963 | L: dri-devel@lists.sourceforge.net | 1963 | L: dri-devel@lists.freedesktop.org |
| 1964 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | 1964 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git |
| 1965 | S: Maintained | 1965 | S: Maintained |
| 1966 | F: drivers/gpu/drm/ | 1966 | F: drivers/gpu/drm/ |
| @@ -4791,12 +4791,11 @@ F: drivers/s390/crypto/ | |||
| 4791 | 4791 | ||
| 4792 | S390 ZFCP DRIVER | 4792 | S390 ZFCP DRIVER |
| 4793 | M: Christof Schmitt <christof.schmitt@de.ibm.com> | 4793 | M: Christof Schmitt <christof.schmitt@de.ibm.com> |
| 4794 | M: Martin Peschke <mp3@de.ibm.com> | 4794 | M: Swen Schillig <swen@vnet.ibm.com> |
| 4795 | M: linux390@de.ibm.com | 4795 | M: linux390@de.ibm.com |
| 4796 | L: linux-s390@vger.kernel.org | 4796 | L: linux-s390@vger.kernel.org |
| 4797 | W: http://www.ibm.com/developerworks/linux/linux390/ | 4797 | W: http://www.ibm.com/developerworks/linux/linux390/ |
| 4798 | S: Supported | 4798 | S: Supported |
| 4799 | F: Documentation/s390/zfcpdump.txt | ||
| 4800 | F: drivers/s390/scsi/zfcp_* | 4799 | F: drivers/s390/scsi/zfcp_* |
| 4801 | 4800 | ||
| 4802 | S390 IUCV NETWORK LAYER | 4801 | S390 IUCV NETWORK LAYER |
| @@ -1,8 +1,8 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 34 | 3 | SUBLEVEL = 34 |
| 4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc5 |
| 5 | NAME = Man-Eating Seals of Antiquity | 5 | NAME = Sheep on Meth |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| 8 | # To see a list of typical targets execute "make help" | 8 | # To see a list of typical targets execute "make help" |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index 73c5c2b05f64..7f3c0a2e60cd 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
| @@ -1802,7 +1802,8 @@ static int kvm_ia64_sync_dirty_log(struct kvm *kvm, | |||
| 1802 | { | 1802 | { |
| 1803 | struct kvm_memory_slot *memslot; | 1803 | struct kvm_memory_slot *memslot; |
| 1804 | int r, i; | 1804 | int r, i; |
| 1805 | long n, base; | 1805 | long base; |
| 1806 | unsigned long n; | ||
| 1806 | unsigned long *dirty_bitmap = (unsigned long *)(kvm->arch.vm_base + | 1807 | unsigned long *dirty_bitmap = (unsigned long *)(kvm->arch.vm_base + |
| 1807 | offsetof(struct kvm_vm_data, kvm_mem_dirty_log)); | 1808 | offsetof(struct kvm_vm_data, kvm_mem_dirty_log)); |
| 1808 | 1809 | ||
| @@ -1815,7 +1816,7 @@ static int kvm_ia64_sync_dirty_log(struct kvm *kvm, | |||
| 1815 | if (!memslot->dirty_bitmap) | 1816 | if (!memslot->dirty_bitmap) |
| 1816 | goto out; | 1817 | goto out; |
| 1817 | 1818 | ||
| 1818 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 1819 | n = kvm_dirty_bitmap_bytes(memslot); |
| 1819 | base = memslot->base_gfn / BITS_PER_LONG; | 1820 | base = memslot->base_gfn / BITS_PER_LONG; |
| 1820 | 1821 | ||
| 1821 | for (i = 0; i < n/sizeof(long); ++i) { | 1822 | for (i = 0; i < n/sizeof(long); ++i) { |
| @@ -1831,7 +1832,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 1831 | struct kvm_dirty_log *log) | 1832 | struct kvm_dirty_log *log) |
| 1832 | { | 1833 | { |
| 1833 | int r; | 1834 | int r; |
| 1834 | int n; | 1835 | unsigned long n; |
| 1835 | struct kvm_memory_slot *memslot; | 1836 | struct kvm_memory_slot *memslot; |
| 1836 | int is_dirty = 0; | 1837 | int is_dirty = 0; |
| 1837 | 1838 | ||
| @@ -1850,7 +1851,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 1850 | if (is_dirty) { | 1851 | if (is_dirty) { |
| 1851 | kvm_flush_remote_tlbs(kvm); | 1852 | kvm_flush_remote_tlbs(kvm); |
| 1852 | memslot = &kvm->memslots->memslots[log->slot]; | 1853 | memslot = &kvm->memslots->memslots[log->slot]; |
| 1853 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 1854 | n = kvm_dirty_bitmap_bytes(memslot); |
| 1854 | memset(memslot->dirty_bitmap, 0, n); | 1855 | memset(memslot->dirty_bitmap, 0, n); |
| 1855 | } | 1856 | } |
| 1856 | r = 0; | 1857 | r = 0; |
diff --git a/arch/m68k/include/asm/mcfuart.h b/arch/m68k/include/asm/mcfuart.h index ef2293873612..01a8716c5fc5 100644 --- a/arch/m68k/include/asm/mcfuart.h +++ b/arch/m68k/include/asm/mcfuart.h | |||
| @@ -212,5 +212,10 @@ struct mcf_platform_uart { | |||
| 212 | #define MCFUART_URF_RXS 0xc0 /* Receiver status */ | 212 | #define MCFUART_URF_RXS 0xc0 /* Receiver status */ |
| 213 | #endif | 213 | #endif |
| 214 | 214 | ||
| 215 | #if defined(CONFIG_M5272) | ||
| 216 | #define MCFUART_TXFIFOSIZE 25 | ||
| 217 | #else | ||
| 218 | #define MCFUART_TXFIFOSIZE 1 | ||
| 219 | #endif | ||
| 215 | /****************************************************************************/ | 220 | /****************************************************************************/ |
| 216 | #endif /* mcfuart_h */ | 221 | #endif /* mcfuart_h */ |
diff --git a/arch/m68knommu/Makefile b/arch/m68knommu/Makefile index ce404bc9ccbd..14042574ac21 100644 --- a/arch/m68knommu/Makefile +++ b/arch/m68knommu/Makefile | |||
| @@ -94,7 +94,7 @@ cflags-$(CONFIG_M520x) := $(call cc-option,-mcpu=5208,-m5200) | |||
| 94 | cflags-$(CONFIG_M523x) := $(call cc-option,-mcpu=523x,-m5307) | 94 | cflags-$(CONFIG_M523x) := $(call cc-option,-mcpu=523x,-m5307) |
| 95 | cflags-$(CONFIG_M5249) := $(call cc-option,-mcpu=5249,-m5200) | 95 | cflags-$(CONFIG_M5249) := $(call cc-option,-mcpu=5249,-m5200) |
| 96 | cflags-$(CONFIG_M5271) := $(call cc-option,-mcpu=5271,-m5307) | 96 | cflags-$(CONFIG_M5271) := $(call cc-option,-mcpu=5271,-m5307) |
| 97 | cflags-$(CONFIG_M5272) := $(call cc-option,-mcpu=5271,-m5200) | 97 | cflags-$(CONFIG_M5272) := $(call cc-option,-mcpu=5272,-m5307) |
| 98 | cflags-$(CONFIG_M5275) := $(call cc-option,-mcpu=5275,-m5307) | 98 | cflags-$(CONFIG_M5275) := $(call cc-option,-mcpu=5275,-m5307) |
| 99 | cflags-$(CONFIG_M528x) := $(call cc-option,-m528x,-m5307) | 99 | cflags-$(CONFIG_M528x) := $(call cc-option,-m528x,-m5307) |
| 100 | cflags-$(CONFIG_M5307) := $(call cc-option,-m5307,-m5200) | 100 | cflags-$(CONFIG_M5307) := $(call cc-option,-m5307,-m5200) |
diff --git a/arch/m68knommu/kernel/entry.S b/arch/m68knommu/kernel/entry.S index 56043ade3941..aff6f57ef8b5 100644 --- a/arch/m68knommu/kernel/entry.S +++ b/arch/m68knommu/kernel/entry.S | |||
| @@ -145,6 +145,6 @@ ENTRY(ret_from_user_signal) | |||
| 145 | trap #0 | 145 | trap #0 |
| 146 | 146 | ||
| 147 | ENTRY(ret_from_user_rt_signal) | 147 | ENTRY(ret_from_user_rt_signal) |
| 148 | move #__NR_rt_sigreturn,%d0 | 148 | movel #__NR_rt_sigreturn,%d0 |
| 149 | trap #0 | 149 | trap #0 |
| 150 | 150 | ||
diff --git a/arch/m68knommu/platform/68360/ints.c b/arch/m68knommu/platform/68360/ints.c index 1143f77caca4..6f22970d8c20 100644 --- a/arch/m68knommu/platform/68360/ints.c +++ b/arch/m68knommu/platform/68360/ints.c | |||
| @@ -107,7 +107,6 @@ void init_IRQ(void) | |||
| 107 | _ramvec[vba+CPMVEC_PIO_PC7] = inthandler; /* pio - pc7 */ | 107 | _ramvec[vba+CPMVEC_PIO_PC7] = inthandler; /* pio - pc7 */ |
| 108 | _ramvec[vba+CPMVEC_PIO_PC6] = inthandler; /* pio - pc6 */ | 108 | _ramvec[vba+CPMVEC_PIO_PC6] = inthandler; /* pio - pc6 */ |
| 109 | _ramvec[vba+CPMVEC_TIMER3] = inthandler; /* timer 3 */ | 109 | _ramvec[vba+CPMVEC_TIMER3] = inthandler; /* timer 3 */ |
| 110 | _ramvec[vba+CPMVEC_RISCTIMER] = inthandler; /* reserved */ | ||
| 111 | _ramvec[vba+CPMVEC_PIO_PC5] = inthandler; /* pio - pc5 */ | 110 | _ramvec[vba+CPMVEC_PIO_PC5] = inthandler; /* pio - pc5 */ |
| 112 | _ramvec[vba+CPMVEC_PIO_PC4] = inthandler; /* pio - pc4 */ | 111 | _ramvec[vba+CPMVEC_PIO_PC4] = inthandler; /* pio - pc4 */ |
| 113 | _ramvec[vba+CPMVEC_RESERVED2] = inthandler; /* reserved */ | 112 | _ramvec[vba+CPMVEC_RESERVED2] = inthandler; /* reserved */ |
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index 25da07fd9f77..604af29b71ed 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
| @@ -1004,7 +1004,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 1004 | struct kvm_vcpu *vcpu; | 1004 | struct kvm_vcpu *vcpu; |
| 1005 | ulong ga, ga_end; | 1005 | ulong ga, ga_end; |
| 1006 | int is_dirty = 0; | 1006 | int is_dirty = 0; |
| 1007 | int r, n; | 1007 | int r; |
| 1008 | unsigned long n; | ||
| 1008 | 1009 | ||
| 1009 | mutex_lock(&kvm->slots_lock); | 1010 | mutex_lock(&kvm->slots_lock); |
| 1010 | 1011 | ||
| @@ -1022,7 +1023,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 1022 | kvm_for_each_vcpu(n, vcpu, kvm) | 1023 | kvm_for_each_vcpu(n, vcpu, kvm) |
| 1023 | kvmppc_mmu_pte_pflush(vcpu, ga, ga_end); | 1024 | kvmppc_mmu_pte_pflush(vcpu, ga, ga_end); |
| 1024 | 1025 | ||
| 1025 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 1026 | n = kvm_dirty_bitmap_bytes(memslot); |
| 1026 | memset(memslot->dirty_bitmap, 0, n); | 1027 | memset(memslot->dirty_bitmap, 0, n); |
| 1027 | } | 1028 | } |
| 1028 | 1029 | ||
diff --git a/arch/s390/include/asm/vdso.h b/arch/s390/include/asm/vdso.h index 4a76d9480cce..533f35751aeb 100644 --- a/arch/s390/include/asm/vdso.h +++ b/arch/s390/include/asm/vdso.h | |||
| @@ -29,6 +29,7 @@ struct vdso_data { | |||
| 29 | __u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */ | 29 | __u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */ |
| 30 | __u32 tz_dsttime; /* Type of dst correction 0x34 */ | 30 | __u32 tz_dsttime; /* Type of dst correction 0x34 */ |
| 31 | __u32 ectg_available; | 31 | __u32 ectg_available; |
| 32 | __u32 ntp_mult; /* NTP adjusted multiplier 0x3C */ | ||
| 32 | }; | 33 | }; |
| 33 | 34 | ||
| 34 | struct vdso_per_cpu_data { | 35 | struct vdso_per_cpu_data { |
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index 08db736dded0..a09408952ed0 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
| @@ -61,6 +61,7 @@ int main(void) | |||
| 61 | DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); | 61 | DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); |
| 62 | DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); | 62 | DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); |
| 63 | DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); | 63 | DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); |
| 64 | DEFINE(__VDSO_NTP_MULT, offsetof(struct vdso_data, ntp_mult)); | ||
| 64 | DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); | 65 | DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); |
| 65 | DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); | 66 | DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); |
| 66 | /* constants used by the vdso */ | 67 | /* constants used by the vdso */ |
diff --git a/arch/s390/kernel/swsusp_asm64.S b/arch/s390/kernel/swsusp_asm64.S index b354427e03b7..c56d3f56d020 100644 --- a/arch/s390/kernel/swsusp_asm64.S +++ b/arch/s390/kernel/swsusp_asm64.S | |||
| @@ -256,6 +256,9 @@ restore_registers: | |||
| 256 | lghi %r2,0 | 256 | lghi %r2,0 |
| 257 | brasl %r14,arch_set_page_states | 257 | brasl %r14,arch_set_page_states |
| 258 | 258 | ||
| 259 | /* Reinitialize the channel subsystem */ | ||
| 260 | brasl %r14,channel_subsystem_reinit | ||
| 261 | |||
| 259 | /* Return 0 */ | 262 | /* Return 0 */ |
| 260 | lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) | 263 | lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) |
| 261 | lghi %r2,0 | 264 | lghi %r2,0 |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index fba6dec156bf..d906bf19c14a 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -221,6 +221,7 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock, | |||
| 221 | vdso_data->xtime_clock_nsec = wall_time->tv_nsec; | 221 | vdso_data->xtime_clock_nsec = wall_time->tv_nsec; |
| 222 | vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec; | 222 | vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec; |
| 223 | vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec; | 223 | vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec; |
| 224 | vdso_data->ntp_mult = mult; | ||
| 224 | smp_wmb(); | 225 | smp_wmb(); |
| 225 | ++vdso_data->tb_update_count; | 226 | ++vdso_data->tb_update_count; |
| 226 | } | 227 | } |
diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S index 4a98909a8310..969643954273 100644 --- a/arch/s390/kernel/vdso32/clock_gettime.S +++ b/arch/s390/kernel/vdso32/clock_gettime.S | |||
| @@ -38,13 +38,13 @@ __kernel_clock_gettime: | |||
| 38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
| 39 | brc 3,2f | 39 | brc 3,2f |
| 40 | ahi %r0,-1 | 40 | ahi %r0,-1 |
| 41 | 2: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ | 41 | 2: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ |
| 42 | lr %r2,%r0 | 42 | lr %r2,%r0 |
| 43 | lhi %r0,1000 | 43 | l %r0,__VDSO_NTP_MULT(%r5) |
| 44 | ltr %r1,%r1 | 44 | ltr %r1,%r1 |
| 45 | mr %r0,%r0 | 45 | mr %r0,%r0 |
| 46 | jnm 3f | 46 | jnm 3f |
| 47 | ahi %r0,1000 | 47 | a %r0,__VDSO_NTP_MULT(%r5) |
| 48 | 3: alr %r0,%r2 | 48 | 3: alr %r0,%r2 |
| 49 | srdl %r0,12 | 49 | srdl %r0,12 |
| 50 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 50 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
| @@ -86,13 +86,13 @@ __kernel_clock_gettime: | |||
| 86 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 86 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
| 87 | brc 3,12f | 87 | brc 3,12f |
| 88 | ahi %r0,-1 | 88 | ahi %r0,-1 |
| 89 | 12: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ | 89 | 12: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ |
| 90 | lr %r2,%r0 | 90 | lr %r2,%r0 |
| 91 | lhi %r0,1000 | 91 | l %r0,__VDSO_NTP_MULT(%r5) |
| 92 | ltr %r1,%r1 | 92 | ltr %r1,%r1 |
| 93 | mr %r0,%r0 | 93 | mr %r0,%r0 |
| 94 | jnm 13f | 94 | jnm 13f |
| 95 | ahi %r0,1000 | 95 | a %r0,__VDSO_NTP_MULT(%r5) |
| 96 | 13: alr %r0,%r2 | 96 | 13: alr %r0,%r2 |
| 97 | srdl %r0,12 | 97 | srdl %r0,12 |
| 98 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 98 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S index ad8acfc949fb..2d3633175e3b 100644 --- a/arch/s390/kernel/vdso32/gettimeofday.S +++ b/arch/s390/kernel/vdso32/gettimeofday.S | |||
| @@ -35,13 +35,13 @@ __kernel_gettimeofday: | |||
| 35 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 35 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
| 36 | brc 3,3f | 36 | brc 3,3f |
| 37 | ahi %r0,-1 | 37 | ahi %r0,-1 |
| 38 | 3: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ | 38 | 3: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ |
| 39 | st %r0,24(%r15) | 39 | st %r0,24(%r15) |
| 40 | lhi %r0,1000 | 40 | l %r0,__VDSO_NTP_MULT(%r5) |
| 41 | ltr %r1,%r1 | 41 | ltr %r1,%r1 |
| 42 | mr %r0,%r0 | 42 | mr %r0,%r0 |
| 43 | jnm 4f | 43 | jnm 4f |
| 44 | ahi %r0,1000 | 44 | a %r0,__VDSO_NTP_MULT(%r5) |
| 45 | 4: al %r0,24(%r15) | 45 | 4: al %r0,24(%r15) |
| 46 | srdl %r0,12 | 46 | srdl %r0,12 |
| 47 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 47 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S index 49106c6e6f88..f40467884a03 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S | |||
| @@ -36,7 +36,7 @@ __kernel_clock_gettime: | |||
| 36 | stck 48(%r15) /* Store TOD clock */ | 36 | stck 48(%r15) /* Store TOD clock */ |
| 37 | lg %r1,48(%r15) | 37 | lg %r1,48(%r15) |
| 38 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 38 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
| 39 | mghi %r1,1000 | 39 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ |
| 40 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 40 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ |
| 41 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 41 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
| 42 | lg %r0,__VDSO_XTIME_SEC(%r5) | 42 | lg %r0,__VDSO_XTIME_SEC(%r5) |
| @@ -64,7 +64,7 @@ __kernel_clock_gettime: | |||
| 64 | stck 48(%r15) /* Store TOD clock */ | 64 | stck 48(%r15) /* Store TOD clock */ |
| 65 | lg %r1,48(%r15) | 65 | lg %r1,48(%r15) |
| 66 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 66 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
| 67 | mghi %r1,1000 | 67 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ |
| 68 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 68 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ |
| 69 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 69 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
| 70 | lg %r0,__VDSO_XTIME_SEC(%r5) | 70 | lg %r0,__VDSO_XTIME_SEC(%r5) |
diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S index f873e75634e1..36ee674722ec 100644 --- a/arch/s390/kernel/vdso64/gettimeofday.S +++ b/arch/s390/kernel/vdso64/gettimeofday.S | |||
| @@ -31,7 +31,7 @@ __kernel_gettimeofday: | |||
| 31 | stck 48(%r15) /* Store TOD clock */ | 31 | stck 48(%r15) /* Store TOD clock */ |
| 32 | lg %r1,48(%r15) | 32 | lg %r1,48(%r15) |
| 33 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 33 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
| 34 | mghi %r1,1000 | 34 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ |
| 35 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 35 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ |
| 36 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime.tv_nsec */ | 36 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime.tv_nsec */ |
| 37 | lg %r0,__VDSO_XTIME_SEC(%r5) /* xtime.tv_sec */ | 37 | lg %r0,__VDSO_XTIME_SEC(%r5) /* xtime.tv_sec */ |
diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h index 9e2d9447f2ad..4827a3aeac7f 100644 --- a/arch/sparc/include/asm/thread_info_64.h +++ b/arch/sparc/include/asm/thread_info_64.h | |||
| @@ -111,7 +111,7 @@ struct thread_info { | |||
| 111 | #define THREAD_SHIFT PAGE_SHIFT | 111 | #define THREAD_SHIFT PAGE_SHIFT |
| 112 | #endif /* PAGE_SHIFT == 13 */ | 112 | #endif /* PAGE_SHIFT == 13 */ |
| 113 | 113 | ||
| 114 | #define PREEMPT_ACTIVE 0x4000000 | 114 | #define PREEMPT_ACTIVE 0x10000000 |
| 115 | 115 | ||
| 116 | /* | 116 | /* |
| 117 | * macros/functions for gaining access to the thread information structure | 117 | * macros/functions for gaining access to the thread information structure |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 454ce3a25273..830d70a3e20b 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
| 23 | #include <linux/ftrace.h> | 23 | #include <linux/ftrace.h> |
| 24 | #include <linux/irq.h> | 24 | #include <linux/irq.h> |
| 25 | #include <linux/kmemleak.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/ptrace.h> | 27 | #include <asm/ptrace.h> |
| 27 | #include <asm/processor.h> | 28 | #include <asm/processor.h> |
| @@ -46,6 +47,7 @@ | |||
| 46 | 47 | ||
| 47 | #include "entry.h" | 48 | #include "entry.h" |
| 48 | #include "cpumap.h" | 49 | #include "cpumap.h" |
| 50 | #include "kstack.h" | ||
| 49 | 51 | ||
| 50 | #define NUM_IVECS (IMAP_INR + 1) | 52 | #define NUM_IVECS (IMAP_INR + 1) |
| 51 | 53 | ||
| @@ -712,24 +714,6 @@ void ack_bad_irq(unsigned int virt_irq) | |||
| 712 | void *hardirq_stack[NR_CPUS]; | 714 | void *hardirq_stack[NR_CPUS]; |
| 713 | void *softirq_stack[NR_CPUS]; | 715 | void *softirq_stack[NR_CPUS]; |
| 714 | 716 | ||
| 715 | static __attribute__((always_inline)) void *set_hardirq_stack(void) | ||
| 716 | { | ||
| 717 | void *orig_sp, *sp = hardirq_stack[smp_processor_id()]; | ||
| 718 | |||
| 719 | __asm__ __volatile__("mov %%sp, %0" : "=r" (orig_sp)); | ||
| 720 | if (orig_sp < sp || | ||
| 721 | orig_sp > (sp + THREAD_SIZE)) { | ||
| 722 | sp += THREAD_SIZE - 192 - STACK_BIAS; | ||
| 723 | __asm__ __volatile__("mov %0, %%sp" : : "r" (sp)); | ||
| 724 | } | ||
| 725 | |||
| 726 | return orig_sp; | ||
| 727 | } | ||
| 728 | static __attribute__((always_inline)) void restore_hardirq_stack(void *orig_sp) | ||
| 729 | { | ||
| 730 | __asm__ __volatile__("mov %0, %%sp" : : "r" (orig_sp)); | ||
| 731 | } | ||
| 732 | |||
| 733 | void __irq_entry handler_irq(int irq, struct pt_regs *regs) | 717 | void __irq_entry handler_irq(int irq, struct pt_regs *regs) |
| 734 | { | 718 | { |
| 735 | unsigned long pstate, bucket_pa; | 719 | unsigned long pstate, bucket_pa; |
diff --git a/arch/sparc/kernel/kstack.h b/arch/sparc/kernel/kstack.h index 5247283d1c03..53dfb92e09fb 100644 --- a/arch/sparc/kernel/kstack.h +++ b/arch/sparc/kernel/kstack.h | |||
| @@ -61,4 +61,23 @@ check_magic: | |||
| 61 | 61 | ||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | static inline __attribute__((always_inline)) void *set_hardirq_stack(void) | ||
| 65 | { | ||
| 66 | void *orig_sp, *sp = hardirq_stack[smp_processor_id()]; | ||
| 67 | |||
| 68 | __asm__ __volatile__("mov %%sp, %0" : "=r" (orig_sp)); | ||
| 69 | if (orig_sp < sp || | ||
| 70 | orig_sp > (sp + THREAD_SIZE)) { | ||
| 71 | sp += THREAD_SIZE - 192 - STACK_BIAS; | ||
| 72 | __asm__ __volatile__("mov %0, %%sp" : : "r" (sp)); | ||
| 73 | } | ||
| 74 | |||
| 75 | return orig_sp; | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline __attribute__((always_inline)) void restore_hardirq_stack(void *orig_sp) | ||
| 79 | { | ||
| 80 | __asm__ __volatile__("mov %0, %%sp" : : "r" (orig_sp)); | ||
| 81 | } | ||
| 82 | |||
| 64 | #endif /* _KSTACK_H */ | 83 | #endif /* _KSTACK_H */ |
diff --git a/arch/sparc/kernel/nmi.c b/arch/sparc/kernel/nmi.c index 75a3d1a25356..a4bd7ba74c89 100644 --- a/arch/sparc/kernel/nmi.c +++ b/arch/sparc/kernel/nmi.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
| 24 | #include <asm/pcr.h> | 24 | #include <asm/pcr.h> |
| 25 | 25 | ||
| 26 | #include "kstack.h" | ||
| 27 | |||
| 26 | /* We don't have a real NMI on sparc64, but we can fake one | 28 | /* We don't have a real NMI on sparc64, but we can fake one |
| 27 | * up using profiling counter overflow interrupts and interrupt | 29 | * up using profiling counter overflow interrupts and interrupt |
| 28 | * levels. | 30 | * levels. |
| @@ -92,6 +94,7 @@ static void die_nmi(const char *str, struct pt_regs *regs, int do_panic) | |||
| 92 | notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) | 94 | notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) |
| 93 | { | 95 | { |
| 94 | unsigned int sum, touched = 0; | 96 | unsigned int sum, touched = 0; |
| 97 | void *orig_sp; | ||
| 95 | 98 | ||
| 96 | clear_softint(1 << irq); | 99 | clear_softint(1 << irq); |
| 97 | 100 | ||
| @@ -99,6 +102,8 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) | |||
| 99 | 102 | ||
| 100 | nmi_enter(); | 103 | nmi_enter(); |
| 101 | 104 | ||
| 105 | orig_sp = set_hardirq_stack(); | ||
| 106 | |||
| 102 | if (notify_die(DIE_NMI, "nmi", regs, 0, | 107 | if (notify_die(DIE_NMI, "nmi", regs, 0, |
| 103 | pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP) | 108 | pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP) |
| 104 | touched = 1; | 109 | touched = 1; |
| @@ -124,6 +129,8 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) | |||
| 124 | pcr_ops->write(pcr_enable); | 129 | pcr_ops->write(pcr_enable); |
| 125 | } | 130 | } |
| 126 | 131 | ||
| 132 | restore_hardirq_stack(orig_sp); | ||
| 133 | |||
| 127 | nmi_exit(); | 134 | nmi_exit(); |
| 128 | } | 135 | } |
| 129 | 136 | ||
diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S index 83f1873c6c13..090b9e9ad5e3 100644 --- a/arch/sparc/kernel/rtrap_64.S +++ b/arch/sparc/kernel/rtrap_64.S | |||
| @@ -130,7 +130,17 @@ rtrap_xcall: | |||
| 130 | nop | 130 | nop |
| 131 | call trace_hardirqs_on | 131 | call trace_hardirqs_on |
| 132 | nop | 132 | nop |
| 133 | wrpr %l4, %pil | 133 | /* Do not actually set the %pil here. We will do that |
| 134 | * below after we clear PSTATE_IE in the %pstate register. | ||
| 135 | * If we re-enable interrupts here, we can recurse down | ||
| 136 | * the hardirq stack potentially endlessly, causing a | ||
| 137 | * stack overflow. | ||
| 138 | * | ||
| 139 | * It is tempting to put this test and trace_hardirqs_on | ||
| 140 | * call at the 'rt_continue' label, but that will not work | ||
| 141 | * as that path hits unconditionally and we do not want to | ||
| 142 | * execute this in NMI return paths, for example. | ||
| 143 | */ | ||
| 134 | #endif | 144 | #endif |
| 135 | rtrap_no_irq_enable: | 145 | rtrap_no_irq_enable: |
| 136 | andcc %l1, TSTATE_PRIV, %l3 | 146 | andcc %l1, TSTATE_PRIV, %l3 |
diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index ebce43018c49..c752c4c479bd 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c | |||
| @@ -50,7 +50,7 @@ static inline enum direction decode_direction(unsigned int insn) | |||
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | /* 16 = double-word, 8 = extra-word, 4 = word, 2 = half-word */ | 52 | /* 16 = double-word, 8 = extra-word, 4 = word, 2 = half-word */ |
| 53 | static inline int decode_access_size(unsigned int insn) | 53 | static inline int decode_access_size(struct pt_regs *regs, unsigned int insn) |
| 54 | { | 54 | { |
| 55 | unsigned int tmp; | 55 | unsigned int tmp; |
| 56 | 56 | ||
| @@ -66,7 +66,7 @@ static inline int decode_access_size(unsigned int insn) | |||
| 66 | return 2; | 66 | return 2; |
| 67 | else { | 67 | else { |
| 68 | printk("Impossible unaligned trap. insn=%08x\n", insn); | 68 | printk("Impossible unaligned trap. insn=%08x\n", insn); |
| 69 | die_if_kernel("Byte sized unaligned access?!?!", current_thread_info()->kregs); | 69 | die_if_kernel("Byte sized unaligned access?!?!", regs); |
| 70 | 70 | ||
| 71 | /* GCC should never warn that control reaches the end | 71 | /* GCC should never warn that control reaches the end |
| 72 | * of this function without returning a value because | 72 | * of this function without returning a value because |
| @@ -286,7 +286,7 @@ static void log_unaligned(struct pt_regs *regs) | |||
| 286 | asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | 286 | asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) |
| 287 | { | 287 | { |
| 288 | enum direction dir = decode_direction(insn); | 288 | enum direction dir = decode_direction(insn); |
| 289 | int size = decode_access_size(insn); | 289 | int size = decode_access_size(regs, insn); |
| 290 | int orig_asi, asi; | 290 | int orig_asi, asi; |
| 291 | 291 | ||
| 292 | current_thread_info()->kern_una_regs = regs; | 292 | current_thread_info()->kern_una_regs = regs; |
diff --git a/arch/sparc/lib/mcount.S b/arch/sparc/lib/mcount.S index 3753e3c6e176..3ad6cbdc2163 100644 --- a/arch/sparc/lib/mcount.S +++ b/arch/sparc/lib/mcount.S | |||
| @@ -34,7 +34,7 @@ mcount: | |||
| 34 | cmp %g1, %g2 | 34 | cmp %g1, %g2 |
| 35 | be,pn %icc, 1f | 35 | be,pn %icc, 1f |
| 36 | mov %i7, %g3 | 36 | mov %i7, %g3 |
| 37 | save %sp, -128, %sp | 37 | save %sp, -176, %sp |
| 38 | mov %g3, %o1 | 38 | mov %g3, %o1 |
| 39 | jmpl %g1, %o7 | 39 | jmpl %g1, %o7 |
| 40 | mov %i7, %o0 | 40 | mov %i7, %o0 |
| @@ -56,7 +56,7 @@ mcount: | |||
| 56 | nop | 56 | nop |
| 57 | 5: mov %i7, %g2 | 57 | 5: mov %i7, %g2 |
| 58 | mov %fp, %g3 | 58 | mov %fp, %g3 |
| 59 | save %sp, -128, %sp | 59 | save %sp, -176, %sp |
| 60 | mov %g2, %l0 | 60 | mov %g2, %l0 |
| 61 | ba,pt %xcc, ftrace_graph_caller | 61 | ba,pt %xcc, ftrace_graph_caller |
| 62 | mov %g3, %l1 | 62 | mov %g3, %l1 |
| @@ -85,7 +85,7 @@ ftrace_caller: | |||
| 85 | lduw [%g1 + %lo(function_trace_stop)], %g1 | 85 | lduw [%g1 + %lo(function_trace_stop)], %g1 |
| 86 | brnz,pn %g1, ftrace_stub | 86 | brnz,pn %g1, ftrace_stub |
| 87 | mov %fp, %g3 | 87 | mov %fp, %g3 |
| 88 | save %sp, -128, %sp | 88 | save %sp, -176, %sp |
| 89 | mov %g2, %o1 | 89 | mov %g2, %o1 |
| 90 | mov %g2, %l0 | 90 | mov %g2, %l0 |
| 91 | mov %g3, %l1 | 91 | mov %g3, %l1 |
| @@ -120,7 +120,7 @@ ENTRY(ftrace_graph_caller) | |||
| 120 | END(ftrace_graph_caller) | 120 | END(ftrace_graph_caller) |
| 121 | 121 | ||
| 122 | ENTRY(return_to_handler) | 122 | ENTRY(return_to_handler) |
| 123 | save %sp, -128, %sp | 123 | save %sp, -176, %sp |
| 124 | call ftrace_return_to_handler | 124 | call ftrace_return_to_handler |
| 125 | mov %fp, %o0 | 125 | mov %fp, %o0 |
| 126 | jmpl %o0 + 8, %g0 | 126 | jmpl %o0 + 8, %g0 |
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index 64cda95f59ca..7a656bd8bd3c 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "linux/irqreturn.h" | 6 | #include "linux/irqreturn.h" |
| 7 | #include "linux/kd.h" | 7 | #include "linux/kd.h" |
| 8 | #include "linux/sched.h" | 8 | #include "linux/sched.h" |
| 9 | #include "linux/slab.h" | ||
| 9 | #include "chan_kern.h" | 10 | #include "chan_kern.h" |
| 10 | #include "irq_kern.h" | 11 | #include "irq_kern.h" |
| 11 | #include "irq_user.h" | 12 | #include "irq_user.h" |
diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c index 06d6ccf0e444..b6b1096152aa 100644 --- a/arch/um/os-Linux/helper.c +++ b/arch/um/os-Linux/helper.c | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | #include <errno.h> | 8 | #include <errno.h> |
| 9 | #include <sched.h> | 9 | #include <sched.h> |
| 10 | #include <linux/limits.h> | 10 | #include <linux/limits.h> |
| 11 | #include <linux/slab.h> | ||
| 12 | #include <sys/socket.h> | 11 | #include <sys/socket.h> |
| 13 | #include <sys/wait.h> | 12 | #include <sys/wait.h> |
| 14 | #include "kern_constants.h" | 13 | #include "kern_constants.h" |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 59b4556a5b92..e790bc1fbfa3 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
| @@ -626,7 +626,7 @@ ia32_sys_call_table: | |||
| 626 | .quad stub32_sigreturn | 626 | .quad stub32_sigreturn |
| 627 | .quad stub32_clone /* 120 */ | 627 | .quad stub32_clone /* 120 */ |
| 628 | .quad sys_setdomainname | 628 | .quad sys_setdomainname |
| 629 | .quad sys_uname | 629 | .quad sys_newuname |
| 630 | .quad sys_modify_ldt | 630 | .quad sys_modify_ldt |
| 631 | .quad compat_sys_adjtimex | 631 | .quad compat_sys_adjtimex |
| 632 | .quad sys32_mprotect /* 125 */ | 632 | .quad sys32_mprotect /* 125 */ |
diff --git a/arch/x86/kernel/dumpstack.h b/arch/x86/kernel/dumpstack.h index e39e77168a37..e1a93be4fd44 100644 --- a/arch/x86/kernel/dumpstack.h +++ b/arch/x86/kernel/dumpstack.h | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) | 14 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) |
| 15 | #endif | 15 | #endif |
| 16 | 16 | ||
| 17 | #include <linux/uaccess.h> | ||
| 18 | |||
| 17 | extern void | 19 | extern void |
| 18 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | 20 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 19 | unsigned long *stack, unsigned long bp, char *log_lvl); | 21 | unsigned long *stack, unsigned long bp, char *log_lvl); |
| @@ -42,8 +44,10 @@ static inline unsigned long rewind_frame_pointer(int n) | |||
| 42 | get_bp(frame); | 44 | get_bp(frame); |
| 43 | 45 | ||
| 44 | #ifdef CONFIG_FRAME_POINTER | 46 | #ifdef CONFIG_FRAME_POINTER |
| 45 | while (n--) | 47 | while (n--) { |
| 46 | frame = frame->next_frame; | 48 | if (probe_kernel_address(&frame->next_frame, frame)) |
| 49 | break; | ||
| 50 | } | ||
| 47 | #endif | 51 | #endif |
| 48 | 52 | ||
| 49 | return (unsigned long)frame; | 53 | return (unsigned long)frame; |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 48aeee8eefb0..19a8906bcaa2 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -1490,8 +1490,8 @@ static int mmu_zap_unsync_children(struct kvm *kvm, | |||
| 1490 | for_each_sp(pages, sp, parents, i) { | 1490 | for_each_sp(pages, sp, parents, i) { |
| 1491 | kvm_mmu_zap_page(kvm, sp); | 1491 | kvm_mmu_zap_page(kvm, sp); |
| 1492 | mmu_pages_clear_parents(&parents); | 1492 | mmu_pages_clear_parents(&parents); |
| 1493 | zapped++; | ||
| 1493 | } | 1494 | } |
| 1494 | zapped += pages.nr; | ||
| 1495 | kvm_mmu_pages_init(parent, &parents, &pages); | 1495 | kvm_mmu_pages_init(parent, &parents, &pages); |
| 1496 | } | 1496 | } |
| 1497 | 1497 | ||
| @@ -1542,14 +1542,16 @@ void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages) | |||
| 1542 | */ | 1542 | */ |
| 1543 | 1543 | ||
| 1544 | if (used_pages > kvm_nr_mmu_pages) { | 1544 | if (used_pages > kvm_nr_mmu_pages) { |
| 1545 | while (used_pages > kvm_nr_mmu_pages) { | 1545 | while (used_pages > kvm_nr_mmu_pages && |
| 1546 | !list_empty(&kvm->arch.active_mmu_pages)) { | ||
| 1546 | struct kvm_mmu_page *page; | 1547 | struct kvm_mmu_page *page; |
| 1547 | 1548 | ||
| 1548 | page = container_of(kvm->arch.active_mmu_pages.prev, | 1549 | page = container_of(kvm->arch.active_mmu_pages.prev, |
| 1549 | struct kvm_mmu_page, link); | 1550 | struct kvm_mmu_page, link); |
| 1550 | kvm_mmu_zap_page(kvm, page); | 1551 | used_pages -= kvm_mmu_zap_page(kvm, page); |
| 1551 | used_pages--; | 1552 | used_pages--; |
| 1552 | } | 1553 | } |
| 1554 | kvm_nr_mmu_pages = used_pages; | ||
| 1553 | kvm->arch.n_free_mmu_pages = 0; | 1555 | kvm->arch.n_free_mmu_pages = 0; |
| 1554 | } | 1556 | } |
| 1555 | else | 1557 | else |
| @@ -1596,7 +1598,8 @@ static void mmu_unshadow(struct kvm *kvm, gfn_t gfn) | |||
| 1596 | && !sp->role.invalid) { | 1598 | && !sp->role.invalid) { |
| 1597 | pgprintk("%s: zap %lx %x\n", | 1599 | pgprintk("%s: zap %lx %x\n", |
| 1598 | __func__, gfn, sp->role.word); | 1600 | __func__, gfn, sp->role.word); |
| 1599 | kvm_mmu_zap_page(kvm, sp); | 1601 | if (kvm_mmu_zap_page(kvm, sp)) |
| 1602 | nn = bucket->first; | ||
| 1600 | } | 1603 | } |
| 1601 | } | 1604 | } |
| 1602 | } | 1605 | } |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 445c59411ed0..2ba58206812a 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -706,29 +706,28 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
| 706 | if (err) | 706 | if (err) |
| 707 | goto free_svm; | 707 | goto free_svm; |
| 708 | 708 | ||
| 709 | err = -ENOMEM; | ||
| 709 | page = alloc_page(GFP_KERNEL); | 710 | page = alloc_page(GFP_KERNEL); |
| 710 | if (!page) { | 711 | if (!page) |
| 711 | err = -ENOMEM; | ||
| 712 | goto uninit; | 712 | goto uninit; |
| 713 | } | ||
| 714 | 713 | ||
| 715 | err = -ENOMEM; | ||
| 716 | msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); | 714 | msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); |
| 717 | if (!msrpm_pages) | 715 | if (!msrpm_pages) |
| 718 | goto uninit; | 716 | goto free_page1; |
| 719 | 717 | ||
| 720 | nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); | 718 | nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); |
| 721 | if (!nested_msrpm_pages) | 719 | if (!nested_msrpm_pages) |
| 722 | goto uninit; | 720 | goto free_page2; |
| 723 | |||
| 724 | svm->msrpm = page_address(msrpm_pages); | ||
| 725 | svm_vcpu_init_msrpm(svm->msrpm); | ||
| 726 | 721 | ||
| 727 | hsave_page = alloc_page(GFP_KERNEL); | 722 | hsave_page = alloc_page(GFP_KERNEL); |
| 728 | if (!hsave_page) | 723 | if (!hsave_page) |
| 729 | goto uninit; | 724 | goto free_page3; |
| 725 | |||
| 730 | svm->nested.hsave = page_address(hsave_page); | 726 | svm->nested.hsave = page_address(hsave_page); |
| 731 | 727 | ||
| 728 | svm->msrpm = page_address(msrpm_pages); | ||
| 729 | svm_vcpu_init_msrpm(svm->msrpm); | ||
| 730 | |||
| 732 | svm->nested.msrpm = page_address(nested_msrpm_pages); | 731 | svm->nested.msrpm = page_address(nested_msrpm_pages); |
| 733 | 732 | ||
| 734 | svm->vmcb = page_address(page); | 733 | svm->vmcb = page_address(page); |
| @@ -744,6 +743,12 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
| 744 | 743 | ||
| 745 | return &svm->vcpu; | 744 | return &svm->vcpu; |
| 746 | 745 | ||
| 746 | free_page3: | ||
| 747 | __free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER); | ||
| 748 | free_page2: | ||
| 749 | __free_pages(msrpm_pages, MSRPM_ALLOC_ORDER); | ||
| 750 | free_page1: | ||
| 751 | __free_page(page); | ||
| 747 | uninit: | 752 | uninit: |
| 748 | kvm_vcpu_uninit(&svm->vcpu); | 753 | kvm_vcpu_uninit(&svm->vcpu); |
| 749 | free_svm: | 754 | free_svm: |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 686492ed3079..bc933cfb4e66 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -77,6 +77,8 @@ module_param(emulate_invalid_guest_state, bool, S_IRUGO); | |||
| 77 | #define KVM_PMODE_VM_CR4_ALWAYS_ON (X86_CR4_PAE | X86_CR4_VMXE) | 77 | #define KVM_PMODE_VM_CR4_ALWAYS_ON (X86_CR4_PAE | X86_CR4_VMXE) |
| 78 | #define KVM_RMODE_VM_CR4_ALWAYS_ON (X86_CR4_VME | X86_CR4_PAE | X86_CR4_VMXE) | 78 | #define KVM_RMODE_VM_CR4_ALWAYS_ON (X86_CR4_VME | X86_CR4_PAE | X86_CR4_VMXE) |
| 79 | 79 | ||
| 80 | #define RMODE_GUEST_OWNED_EFLAGS_BITS (~(X86_EFLAGS_IOPL | X86_EFLAGS_VM)) | ||
| 81 | |||
| 80 | /* | 82 | /* |
| 81 | * These 2 parameters are used to config the controls for Pause-Loop Exiting: | 83 | * These 2 parameters are used to config the controls for Pause-Loop Exiting: |
| 82 | * ple_gap: upper bound on the amount of time between two successive | 84 | * ple_gap: upper bound on the amount of time between two successive |
| @@ -131,7 +133,7 @@ struct vcpu_vmx { | |||
| 131 | } host_state; | 133 | } host_state; |
| 132 | struct { | 134 | struct { |
| 133 | int vm86_active; | 135 | int vm86_active; |
| 134 | u8 save_iopl; | 136 | ulong save_rflags; |
| 135 | struct kvm_save_segment { | 137 | struct kvm_save_segment { |
| 136 | u16 selector; | 138 | u16 selector; |
| 137 | unsigned long base; | 139 | unsigned long base; |
| @@ -818,18 +820,23 @@ static void vmx_fpu_deactivate(struct kvm_vcpu *vcpu) | |||
| 818 | 820 | ||
| 819 | static unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu) | 821 | static unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu) |
| 820 | { | 822 | { |
| 821 | unsigned long rflags; | 823 | unsigned long rflags, save_rflags; |
| 822 | 824 | ||
| 823 | rflags = vmcs_readl(GUEST_RFLAGS); | 825 | rflags = vmcs_readl(GUEST_RFLAGS); |
| 824 | if (to_vmx(vcpu)->rmode.vm86_active) | 826 | if (to_vmx(vcpu)->rmode.vm86_active) { |
| 825 | rflags &= ~(unsigned long)(X86_EFLAGS_IOPL | X86_EFLAGS_VM); | 827 | rflags &= RMODE_GUEST_OWNED_EFLAGS_BITS; |
| 828 | save_rflags = to_vmx(vcpu)->rmode.save_rflags; | ||
| 829 | rflags |= save_rflags & ~RMODE_GUEST_OWNED_EFLAGS_BITS; | ||
| 830 | } | ||
| 826 | return rflags; | 831 | return rflags; |
| 827 | } | 832 | } |
| 828 | 833 | ||
| 829 | static void vmx_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags) | 834 | static void vmx_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags) |
| 830 | { | 835 | { |
| 831 | if (to_vmx(vcpu)->rmode.vm86_active) | 836 | if (to_vmx(vcpu)->rmode.vm86_active) { |
| 837 | to_vmx(vcpu)->rmode.save_rflags = rflags; | ||
| 832 | rflags |= X86_EFLAGS_IOPL | X86_EFLAGS_VM; | 838 | rflags |= X86_EFLAGS_IOPL | X86_EFLAGS_VM; |
| 839 | } | ||
| 833 | vmcs_writel(GUEST_RFLAGS, rflags); | 840 | vmcs_writel(GUEST_RFLAGS, rflags); |
| 834 | } | 841 | } |
| 835 | 842 | ||
| @@ -1483,8 +1490,8 @@ static void enter_pmode(struct kvm_vcpu *vcpu) | |||
| 1483 | vmcs_write32(GUEST_TR_AR_BYTES, vmx->rmode.tr.ar); | 1490 | vmcs_write32(GUEST_TR_AR_BYTES, vmx->rmode.tr.ar); |
| 1484 | 1491 | ||
| 1485 | flags = vmcs_readl(GUEST_RFLAGS); | 1492 | flags = vmcs_readl(GUEST_RFLAGS); |
| 1486 | flags &= ~(X86_EFLAGS_IOPL | X86_EFLAGS_VM); | 1493 | flags &= RMODE_GUEST_OWNED_EFLAGS_BITS; |
| 1487 | flags |= (vmx->rmode.save_iopl << IOPL_SHIFT); | 1494 | flags |= vmx->rmode.save_rflags & ~RMODE_GUEST_OWNED_EFLAGS_BITS; |
| 1488 | vmcs_writel(GUEST_RFLAGS, flags); | 1495 | vmcs_writel(GUEST_RFLAGS, flags); |
| 1489 | 1496 | ||
| 1490 | vmcs_writel(GUEST_CR4, (vmcs_readl(GUEST_CR4) & ~X86_CR4_VME) | | 1497 | vmcs_writel(GUEST_CR4, (vmcs_readl(GUEST_CR4) & ~X86_CR4_VME) | |
| @@ -1557,8 +1564,7 @@ static void enter_rmode(struct kvm_vcpu *vcpu) | |||
| 1557 | vmcs_write32(GUEST_TR_AR_BYTES, 0x008b); | 1564 | vmcs_write32(GUEST_TR_AR_BYTES, 0x008b); |
| 1558 | 1565 | ||
| 1559 | flags = vmcs_readl(GUEST_RFLAGS); | 1566 | flags = vmcs_readl(GUEST_RFLAGS); |
| 1560 | vmx->rmode.save_iopl | 1567 | vmx->rmode.save_rflags = flags; |
| 1561 | = (flags & X86_EFLAGS_IOPL) >> IOPL_SHIFT; | ||
| 1562 | 1568 | ||
| 1563 | flags |= X86_EFLAGS_IOPL | X86_EFLAGS_VM; | 1569 | flags |= X86_EFLAGS_IOPL | X86_EFLAGS_VM; |
| 1564 | 1570 | ||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 24cd0ee896e9..3c4ca98ad27f 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -433,8 +433,6 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
| 433 | 433 | ||
| 434 | #ifdef CONFIG_X86_64 | 434 | #ifdef CONFIG_X86_64 |
| 435 | if (cr0 & 0xffffffff00000000UL) { | 435 | if (cr0 & 0xffffffff00000000UL) { |
| 436 | printk(KERN_DEBUG "set_cr0: 0x%lx #GP, reserved bits 0x%lx\n", | ||
| 437 | cr0, kvm_read_cr0(vcpu)); | ||
| 438 | kvm_inject_gp(vcpu, 0); | 436 | kvm_inject_gp(vcpu, 0); |
| 439 | return; | 437 | return; |
| 440 | } | 438 | } |
| @@ -443,14 +441,11 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
| 443 | cr0 &= ~CR0_RESERVED_BITS; | 441 | cr0 &= ~CR0_RESERVED_BITS; |
| 444 | 442 | ||
| 445 | if ((cr0 & X86_CR0_NW) && !(cr0 & X86_CR0_CD)) { | 443 | if ((cr0 & X86_CR0_NW) && !(cr0 & X86_CR0_CD)) { |
| 446 | printk(KERN_DEBUG "set_cr0: #GP, CD == 0 && NW == 1\n"); | ||
| 447 | kvm_inject_gp(vcpu, 0); | 444 | kvm_inject_gp(vcpu, 0); |
| 448 | return; | 445 | return; |
| 449 | } | 446 | } |
| 450 | 447 | ||
| 451 | if ((cr0 & X86_CR0_PG) && !(cr0 & X86_CR0_PE)) { | 448 | if ((cr0 & X86_CR0_PG) && !(cr0 & X86_CR0_PE)) { |
| 452 | printk(KERN_DEBUG "set_cr0: #GP, set PG flag " | ||
| 453 | "and a clear PE flag\n"); | ||
| 454 | kvm_inject_gp(vcpu, 0); | 449 | kvm_inject_gp(vcpu, 0); |
| 455 | return; | 450 | return; |
| 456 | } | 451 | } |
| @@ -461,15 +456,11 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
| 461 | int cs_db, cs_l; | 456 | int cs_db, cs_l; |
| 462 | 457 | ||
| 463 | if (!is_pae(vcpu)) { | 458 | if (!is_pae(vcpu)) { |
| 464 | printk(KERN_DEBUG "set_cr0: #GP, start paging " | ||
| 465 | "in long mode while PAE is disabled\n"); | ||
| 466 | kvm_inject_gp(vcpu, 0); | 459 | kvm_inject_gp(vcpu, 0); |
| 467 | return; | 460 | return; |
| 468 | } | 461 | } |
| 469 | kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l); | 462 | kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l); |
| 470 | if (cs_l) { | 463 | if (cs_l) { |
| 471 | printk(KERN_DEBUG "set_cr0: #GP, start paging " | ||
| 472 | "in long mode while CS.L == 1\n"); | ||
| 473 | kvm_inject_gp(vcpu, 0); | 464 | kvm_inject_gp(vcpu, 0); |
| 474 | return; | 465 | return; |
| 475 | 466 | ||
| @@ -477,8 +468,6 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
| 477 | } else | 468 | } else |
| 478 | #endif | 469 | #endif |
| 479 | if (is_pae(vcpu) && !load_pdptrs(vcpu, vcpu->arch.cr3)) { | 470 | if (is_pae(vcpu) && !load_pdptrs(vcpu, vcpu->arch.cr3)) { |
| 480 | printk(KERN_DEBUG "set_cr0: #GP, pdptrs " | ||
| 481 | "reserved bits\n"); | ||
| 482 | kvm_inject_gp(vcpu, 0); | 471 | kvm_inject_gp(vcpu, 0); |
| 483 | return; | 472 | return; |
| 484 | } | 473 | } |
| @@ -505,28 +494,23 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
| 505 | unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE; | 494 | unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE; |
| 506 | 495 | ||
| 507 | if (cr4 & CR4_RESERVED_BITS) { | 496 | if (cr4 & CR4_RESERVED_BITS) { |
| 508 | printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n"); | ||
| 509 | kvm_inject_gp(vcpu, 0); | 497 | kvm_inject_gp(vcpu, 0); |
| 510 | return; | 498 | return; |
| 511 | } | 499 | } |
| 512 | 500 | ||
| 513 | if (is_long_mode(vcpu)) { | 501 | if (is_long_mode(vcpu)) { |
| 514 | if (!(cr4 & X86_CR4_PAE)) { | 502 | if (!(cr4 & X86_CR4_PAE)) { |
| 515 | printk(KERN_DEBUG "set_cr4: #GP, clearing PAE while " | ||
| 516 | "in long mode\n"); | ||
| 517 | kvm_inject_gp(vcpu, 0); | 503 | kvm_inject_gp(vcpu, 0); |
| 518 | return; | 504 | return; |
| 519 | } | 505 | } |
| 520 | } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE) | 506 | } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE) |
| 521 | && ((cr4 ^ old_cr4) & pdptr_bits) | 507 | && ((cr4 ^ old_cr4) & pdptr_bits) |
| 522 | && !load_pdptrs(vcpu, vcpu->arch.cr3)) { | 508 | && !load_pdptrs(vcpu, vcpu->arch.cr3)) { |
| 523 | printk(KERN_DEBUG "set_cr4: #GP, pdptrs reserved bits\n"); | ||
| 524 | kvm_inject_gp(vcpu, 0); | 509 | kvm_inject_gp(vcpu, 0); |
| 525 | return; | 510 | return; |
| 526 | } | 511 | } |
| 527 | 512 | ||
| 528 | if (cr4 & X86_CR4_VMXE) { | 513 | if (cr4 & X86_CR4_VMXE) { |
| 529 | printk(KERN_DEBUG "set_cr4: #GP, setting VMXE\n"); | ||
| 530 | kvm_inject_gp(vcpu, 0); | 514 | kvm_inject_gp(vcpu, 0); |
| 531 | return; | 515 | return; |
| 532 | } | 516 | } |
| @@ -547,21 +531,16 @@ void kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) | |||
| 547 | 531 | ||
| 548 | if (is_long_mode(vcpu)) { | 532 | if (is_long_mode(vcpu)) { |
| 549 | if (cr3 & CR3_L_MODE_RESERVED_BITS) { | 533 | if (cr3 & CR3_L_MODE_RESERVED_BITS) { |
| 550 | printk(KERN_DEBUG "set_cr3: #GP, reserved bits\n"); | ||
| 551 | kvm_inject_gp(vcpu, 0); | 534 | kvm_inject_gp(vcpu, 0); |
| 552 | return; | 535 | return; |
| 553 | } | 536 | } |
| 554 | } else { | 537 | } else { |
| 555 | if (is_pae(vcpu)) { | 538 | if (is_pae(vcpu)) { |
| 556 | if (cr3 & CR3_PAE_RESERVED_BITS) { | 539 | if (cr3 & CR3_PAE_RESERVED_BITS) { |
| 557 | printk(KERN_DEBUG | ||
| 558 | "set_cr3: #GP, reserved bits\n"); | ||
| 559 | kvm_inject_gp(vcpu, 0); | 540 | kvm_inject_gp(vcpu, 0); |
| 560 | return; | 541 | return; |
| 561 | } | 542 | } |
| 562 | if (is_paging(vcpu) && !load_pdptrs(vcpu, cr3)) { | 543 | if (is_paging(vcpu) && !load_pdptrs(vcpu, cr3)) { |
| 563 | printk(KERN_DEBUG "set_cr3: #GP, pdptrs " | ||
| 564 | "reserved bits\n"); | ||
| 565 | kvm_inject_gp(vcpu, 0); | 544 | kvm_inject_gp(vcpu, 0); |
| 566 | return; | 545 | return; |
| 567 | } | 546 | } |
| @@ -593,7 +572,6 @@ EXPORT_SYMBOL_GPL(kvm_set_cr3); | |||
| 593 | void kvm_set_cr8(struct kvm_vcpu *vcpu, unsigned long cr8) | 572 | void kvm_set_cr8(struct kvm_vcpu *vcpu, unsigned long cr8) |
| 594 | { | 573 | { |
| 595 | if (cr8 & CR8_RESERVED_BITS) { | 574 | if (cr8 & CR8_RESERVED_BITS) { |
| 596 | printk(KERN_DEBUG "set_cr8: #GP, reserved bits 0x%lx\n", cr8); | ||
| 597 | kvm_inject_gp(vcpu, 0); | 575 | kvm_inject_gp(vcpu, 0); |
| 598 | return; | 576 | return; |
| 599 | } | 577 | } |
| @@ -649,15 +627,12 @@ static u32 emulated_msrs[] = { | |||
| 649 | static void set_efer(struct kvm_vcpu *vcpu, u64 efer) | 627 | static void set_efer(struct kvm_vcpu *vcpu, u64 efer) |
| 650 | { | 628 | { |
| 651 | if (efer & efer_reserved_bits) { | 629 | if (efer & efer_reserved_bits) { |
| 652 | printk(KERN_DEBUG "set_efer: 0x%llx #GP, reserved bits\n", | ||
| 653 | efer); | ||
| 654 | kvm_inject_gp(vcpu, 0); | 630 | kvm_inject_gp(vcpu, 0); |
| 655 | return; | 631 | return; |
| 656 | } | 632 | } |
| 657 | 633 | ||
| 658 | if (is_paging(vcpu) | 634 | if (is_paging(vcpu) |
| 659 | && (vcpu->arch.efer & EFER_LME) != (efer & EFER_LME)) { | 635 | && (vcpu->arch.efer & EFER_LME) != (efer & EFER_LME)) { |
| 660 | printk(KERN_DEBUG "set_efer: #GP, change LME while paging\n"); | ||
| 661 | kvm_inject_gp(vcpu, 0); | 636 | kvm_inject_gp(vcpu, 0); |
| 662 | return; | 637 | return; |
| 663 | } | 638 | } |
| @@ -667,7 +642,6 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer) | |||
| 667 | 642 | ||
| 668 | feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); | 643 | feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); |
| 669 | if (!feat || !(feat->edx & bit(X86_FEATURE_FXSR_OPT))) { | 644 | if (!feat || !(feat->edx & bit(X86_FEATURE_FXSR_OPT))) { |
| 670 | printk(KERN_DEBUG "set_efer: #GP, enable FFXSR w/o CPUID capability\n"); | ||
| 671 | kvm_inject_gp(vcpu, 0); | 645 | kvm_inject_gp(vcpu, 0); |
| 672 | return; | 646 | return; |
| 673 | } | 647 | } |
| @@ -678,7 +652,6 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer) | |||
| 678 | 652 | ||
| 679 | feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); | 653 | feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); |
| 680 | if (!feat || !(feat->ecx & bit(X86_FEATURE_SVM))) { | 654 | if (!feat || !(feat->ecx & bit(X86_FEATURE_SVM))) { |
| 681 | printk(KERN_DEBUG "set_efer: #GP, enable SVM w/o SVM\n"); | ||
| 682 | kvm_inject_gp(vcpu, 0); | 655 | kvm_inject_gp(vcpu, 0); |
| 683 | return; | 656 | return; |
| 684 | } | 657 | } |
| @@ -967,9 +940,13 @@ static int set_msr_mce(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
| 967 | if (msr >= MSR_IA32_MC0_CTL && | 940 | if (msr >= MSR_IA32_MC0_CTL && |
| 968 | msr < MSR_IA32_MC0_CTL + 4 * bank_num) { | 941 | msr < MSR_IA32_MC0_CTL + 4 * bank_num) { |
| 969 | u32 offset = msr - MSR_IA32_MC0_CTL; | 942 | u32 offset = msr - MSR_IA32_MC0_CTL; |
| 970 | /* only 0 or all 1s can be written to IA32_MCi_CTL */ | 943 | /* only 0 or all 1s can be written to IA32_MCi_CTL |
| 944 | * some Linux kernels though clear bit 10 in bank 4 to | ||
| 945 | * workaround a BIOS/GART TBL issue on AMD K8s, ignore | ||
| 946 | * this to avoid an uncatched #GP in the guest | ||
| 947 | */ | ||
| 971 | if ((offset & 0x3) == 0 && | 948 | if ((offset & 0x3) == 0 && |
| 972 | data != 0 && data != ~(u64)0) | 949 | data != 0 && (data | (1 << 10)) != ~(u64)0) |
| 973 | return -1; | 950 | return -1; |
| 974 | vcpu->arch.mce_banks[offset] = data; | 951 | vcpu->arch.mce_banks[offset] = data; |
| 975 | break; | 952 | break; |
| @@ -2635,8 +2612,9 @@ static int kvm_vm_ioctl_reinject(struct kvm *kvm, | |||
| 2635 | int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | 2612 | int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, |
| 2636 | struct kvm_dirty_log *log) | 2613 | struct kvm_dirty_log *log) |
| 2637 | { | 2614 | { |
| 2638 | int r, n, i; | 2615 | int r, i; |
| 2639 | struct kvm_memory_slot *memslot; | 2616 | struct kvm_memory_slot *memslot; |
| 2617 | unsigned long n; | ||
| 2640 | unsigned long is_dirty = 0; | 2618 | unsigned long is_dirty = 0; |
| 2641 | unsigned long *dirty_bitmap = NULL; | 2619 | unsigned long *dirty_bitmap = NULL; |
| 2642 | 2620 | ||
| @@ -2651,7 +2629,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 2651 | if (!memslot->dirty_bitmap) | 2629 | if (!memslot->dirty_bitmap) |
| 2652 | goto out; | 2630 | goto out; |
| 2653 | 2631 | ||
| 2654 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 2632 | n = kvm_dirty_bitmap_bytes(memslot); |
| 2655 | 2633 | ||
| 2656 | r = -ENOMEM; | 2634 | r = -ENOMEM; |
| 2657 | dirty_bitmap = vmalloc(n); | 2635 | dirty_bitmap = vmalloc(n); |
| @@ -4483,7 +4461,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 4483 | kvm_set_cr8(vcpu, kvm_run->cr8); | 4461 | kvm_set_cr8(vcpu, kvm_run->cr8); |
| 4484 | 4462 | ||
| 4485 | if (vcpu->arch.pio.cur_count) { | 4463 | if (vcpu->arch.pio.cur_count) { |
| 4464 | vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
| 4486 | r = complete_pio(vcpu); | 4465 | r = complete_pio(vcpu); |
| 4466 | srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx); | ||
| 4487 | if (r) | 4467 | if (r) |
| 4488 | goto out; | 4468 | goto out; |
| 4489 | } | 4469 | } |
| @@ -5146,6 +5126,7 @@ int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason) | |||
| 5146 | int ret = 0; | 5126 | int ret = 0; |
| 5147 | u32 old_tss_base = get_segment_base(vcpu, VCPU_SREG_TR); | 5127 | u32 old_tss_base = get_segment_base(vcpu, VCPU_SREG_TR); |
| 5148 | u16 old_tss_sel = get_segment_selector(vcpu, VCPU_SREG_TR); | 5128 | u16 old_tss_sel = get_segment_selector(vcpu, VCPU_SREG_TR); |
| 5129 | u32 desc_limit; | ||
| 5149 | 5130 | ||
| 5150 | old_tss_base = kvm_mmu_gva_to_gpa_write(vcpu, old_tss_base, NULL); | 5131 | old_tss_base = kvm_mmu_gva_to_gpa_write(vcpu, old_tss_base, NULL); |
| 5151 | 5132 | ||
| @@ -5168,7 +5149,10 @@ int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason) | |||
| 5168 | } | 5149 | } |
| 5169 | } | 5150 | } |
| 5170 | 5151 | ||
| 5171 | if (!nseg_desc.p || get_desc_limit(&nseg_desc) < 0x67) { | 5152 | desc_limit = get_desc_limit(&nseg_desc); |
| 5153 | if (!nseg_desc.p || | ||
| 5154 | ((desc_limit < 0x67 && (nseg_desc.type & 8)) || | ||
| 5155 | desc_limit < 0x2b)) { | ||
| 5172 | kvm_queue_exception_e(vcpu, TS_VECTOR, tss_selector & 0xfffc); | 5156 | kvm_queue_exception_e(vcpu, TS_VECTOR, tss_selector & 0xfffc); |
| 5173 | return 1; | 5157 | return 1; |
| 5174 | } | 5158 | } |
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c index c9bc896d68af..90b199f97bec 100644 --- a/drivers/char/pcmcia/cm4000_cs.c +++ b/drivers/char/pcmcia/cm4000_cs.c | |||
| @@ -1026,14 +1026,16 @@ static ssize_t cmm_read(struct file *filp, __user char *buf, size_t count, | |||
| 1026 | 1026 | ||
| 1027 | xoutb(0, REG_FLAGS1(iobase)); /* clear detectCMM */ | 1027 | xoutb(0, REG_FLAGS1(iobase)); /* clear detectCMM */ |
| 1028 | /* last check before exit */ | 1028 | /* last check before exit */ |
| 1029 | if (!io_detect_cm4000(iobase, dev)) | 1029 | if (!io_detect_cm4000(iobase, dev)) { |
| 1030 | count = -ENODEV; | 1030 | rc = -ENODEV; |
| 1031 | goto release_io; | ||
| 1032 | } | ||
| 1031 | 1033 | ||
| 1032 | if (test_bit(IS_INVREV, &dev->flags) && count > 0) | 1034 | if (test_bit(IS_INVREV, &dev->flags) && count > 0) |
| 1033 | str_invert_revert(dev->rbuf, count); | 1035 | str_invert_revert(dev->rbuf, count); |
| 1034 | 1036 | ||
| 1035 | if (copy_to_user(buf, dev->rbuf, count)) | 1037 | if (copy_to_user(buf, dev->rbuf, count)) |
| 1036 | return -EFAULT; | 1038 | rc = -EFAULT; |
| 1037 | 1039 | ||
| 1038 | release_io: | 1040 | release_io: |
| 1039 | clear_bit(LOCK_IO, &dev->flags); | 1041 | clear_bit(LOCK_IO, &dev->flags); |
diff --git a/drivers/firewire/core-iso.c b/drivers/firewire/core-iso.c index 3784a47865b7..8f5aebfb29df 100644 --- a/drivers/firewire/core-iso.c +++ b/drivers/firewire/core-iso.c | |||
| @@ -190,7 +190,7 @@ static int manage_bandwidth(struct fw_card *card, int irm_id, int generation, | |||
| 190 | for (try = 0; try < 5; try++) { | 190 | for (try = 0; try < 5; try++) { |
| 191 | new = allocate ? old - bandwidth : old + bandwidth; | 191 | new = allocate ? old - bandwidth : old + bandwidth; |
| 192 | if (new < 0 || new > BANDWIDTH_AVAILABLE_INITIAL) | 192 | if (new < 0 || new > BANDWIDTH_AVAILABLE_INITIAL) |
| 193 | break; | 193 | return -EBUSY; |
| 194 | 194 | ||
| 195 | data[0] = cpu_to_be32(old); | 195 | data[0] = cpu_to_be32(old); |
| 196 | data[1] = cpu_to_be32(new); | 196 | data[1] = cpu_to_be32(new); |
| @@ -218,7 +218,7 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation, | |||
| 218 | u32 channels_mask, u64 offset, bool allocate, __be32 data[2]) | 218 | u32 channels_mask, u64 offset, bool allocate, __be32 data[2]) |
| 219 | { | 219 | { |
| 220 | __be32 c, all, old; | 220 | __be32 c, all, old; |
| 221 | int i, retry = 5; | 221 | int i, ret = -EIO, retry = 5; |
| 222 | 222 | ||
| 223 | old = all = allocate ? cpu_to_be32(~0) : 0; | 223 | old = all = allocate ? cpu_to_be32(~0) : 0; |
| 224 | 224 | ||
| @@ -226,6 +226,8 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation, | |||
| 226 | if (!(channels_mask & 1 << i)) | 226 | if (!(channels_mask & 1 << i)) |
| 227 | continue; | 227 | continue; |
| 228 | 228 | ||
| 229 | ret = -EBUSY; | ||
| 230 | |||
| 229 | c = cpu_to_be32(1 << (31 - i)); | 231 | c = cpu_to_be32(1 << (31 - i)); |
| 230 | if ((old & c) != (all & c)) | 232 | if ((old & c) != (all & c)) |
| 231 | continue; | 233 | continue; |
| @@ -251,12 +253,16 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation, | |||
| 251 | 253 | ||
| 252 | /* 1394-1995 IRM, fall through to retry. */ | 254 | /* 1394-1995 IRM, fall through to retry. */ |
| 253 | default: | 255 | default: |
| 254 | if (retry--) | 256 | if (retry) { |
| 257 | retry--; | ||
| 255 | i--; | 258 | i--; |
| 259 | } else { | ||
| 260 | ret = -EIO; | ||
| 261 | } | ||
| 256 | } | 262 | } |
| 257 | } | 263 | } |
| 258 | 264 | ||
| 259 | return -EIO; | 265 | return ret; |
| 260 | } | 266 | } |
| 261 | 267 | ||
| 262 | static void deallocate_channel(struct fw_card *card, int irm_id, | 268 | static void deallocate_channel(struct fw_card *card, int irm_id, |
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 0cf4d7f562c5..94b16e0340ae 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
| @@ -1158,7 +1158,7 @@ static void handle_local_lock(struct fw_ohci *ohci, | |||
| 1158 | struct fw_packet *packet, u32 csr) | 1158 | struct fw_packet *packet, u32 csr) |
| 1159 | { | 1159 | { |
| 1160 | struct fw_packet response; | 1160 | struct fw_packet response; |
| 1161 | int tcode, length, ext_tcode, sel; | 1161 | int tcode, length, ext_tcode, sel, try; |
| 1162 | __be32 *payload, lock_old; | 1162 | __be32 *payload, lock_old; |
| 1163 | u32 lock_arg, lock_data; | 1163 | u32 lock_arg, lock_data; |
| 1164 | 1164 | ||
| @@ -1185,21 +1185,26 @@ static void handle_local_lock(struct fw_ohci *ohci, | |||
| 1185 | reg_write(ohci, OHCI1394_CSRCompareData, lock_arg); | 1185 | reg_write(ohci, OHCI1394_CSRCompareData, lock_arg); |
| 1186 | reg_write(ohci, OHCI1394_CSRControl, sel); | 1186 | reg_write(ohci, OHCI1394_CSRControl, sel); |
| 1187 | 1187 | ||
| 1188 | if (reg_read(ohci, OHCI1394_CSRControl) & 0x80000000) | 1188 | for (try = 0; try < 20; try++) |
| 1189 | lock_old = cpu_to_be32(reg_read(ohci, OHCI1394_CSRData)); | 1189 | if (reg_read(ohci, OHCI1394_CSRControl) & 0x80000000) { |
| 1190 | else | 1190 | lock_old = cpu_to_be32(reg_read(ohci, |
| 1191 | fw_notify("swap not done yet\n"); | 1191 | OHCI1394_CSRData)); |
| 1192 | fw_fill_response(&response, packet->header, | ||
| 1193 | RCODE_COMPLETE, | ||
| 1194 | &lock_old, sizeof(lock_old)); | ||
| 1195 | goto out; | ||
| 1196 | } | ||
| 1197 | |||
| 1198 | fw_error("swap not done (CSR lock timeout)\n"); | ||
| 1199 | fw_fill_response(&response, packet->header, RCODE_BUSY, NULL, 0); | ||
| 1192 | 1200 | ||
| 1193 | fw_fill_response(&response, packet->header, | ||
| 1194 | RCODE_COMPLETE, &lock_old, sizeof(lock_old)); | ||
| 1195 | out: | 1201 | out: |
| 1196 | fw_core_handle_response(&ohci->card, &response); | 1202 | fw_core_handle_response(&ohci->card, &response); |
| 1197 | } | 1203 | } |
| 1198 | 1204 | ||
| 1199 | static void handle_local_request(struct context *ctx, struct fw_packet *packet) | 1205 | static void handle_local_request(struct context *ctx, struct fw_packet *packet) |
| 1200 | { | 1206 | { |
| 1201 | u64 offset; | 1207 | u64 offset, csr; |
| 1202 | u32 csr; | ||
| 1203 | 1208 | ||
| 1204 | if (ctx == &ctx->ohci->at_request_ctx) { | 1209 | if (ctx == &ctx->ohci->at_request_ctx) { |
| 1205 | packet->ack = ACK_PENDING; | 1210 | packet->ack = ACK_PENDING; |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index b743411d8144..a0c365f2e521 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
| @@ -516,8 +516,6 @@ void drm_put_dev(struct drm_device *dev) | |||
| 516 | } | 516 | } |
| 517 | driver = dev->driver; | 517 | driver = dev->driver; |
| 518 | 518 | ||
| 519 | drm_vblank_cleanup(dev); | ||
| 520 | |||
| 521 | drm_lastclose(dev); | 519 | drm_lastclose(dev); |
| 522 | 520 | ||
| 523 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && | 521 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && |
| @@ -537,6 +535,8 @@ void drm_put_dev(struct drm_device *dev) | |||
| 537 | dev->agp = NULL; | 535 | dev->agp = NULL; |
| 538 | } | 536 | } |
| 539 | 537 | ||
| 538 | drm_vblank_cleanup(dev); | ||
| 539 | |||
| 540 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) | 540 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) |
| 541 | drm_rmmap(dev, r_list->map); | 541 | drm_rmmap(dev, r_list->map); |
| 542 | drm_ht_remove(&dev->map_hash); | 542 | drm_ht_remove(&dev->map_hash); |
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index f7e27b702375..d1ff9408dc1f 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c | |||
| @@ -146,10 +146,10 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy) | |||
| 146 | "<%s> I2C Interrupted\n", __func__); | 146 | "<%s> I2C Interrupted\n", __func__); |
| 147 | return -EINTR; | 147 | return -EINTR; |
| 148 | } | 148 | } |
| 149 | if (time_after(jiffies, orig_jiffies + HZ / 1000)) { | 149 | if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) { |
| 150 | dev_dbg(&i2c_imx->adapter.dev, | 150 | dev_dbg(&i2c_imx->adapter.dev, |
| 151 | "<%s> I2C bus is busy\n", __func__); | 151 | "<%s> I2C bus is busy\n", __func__); |
| 152 | return -EIO; | 152 | return -ETIMEDOUT; |
| 153 | } | 153 | } |
| 154 | schedule(); | 154 | schedule(); |
| 155 | } | 155 | } |
| @@ -444,6 +444,8 @@ static int i2c_imx_xfer(struct i2c_adapter *adapter, | |||
| 444 | result = i2c_imx_read(i2c_imx, &msgs[i]); | 444 | result = i2c_imx_read(i2c_imx, &msgs[i]); |
| 445 | else | 445 | else |
| 446 | result = i2c_imx_write(i2c_imx, &msgs[i]); | 446 | result = i2c_imx_write(i2c_imx, &msgs[i]); |
| 447 | if (result) | ||
| 448 | goto fail0; | ||
| 447 | } | 449 | } |
| 448 | 450 | ||
| 449 | fail0: | 451 | fail0: |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 6bd0f19cd451..389ac6032a7b 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -903,6 +903,11 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 903 | 903 | ||
| 904 | platform_set_drvdata(pdev, dev); | 904 | platform_set_drvdata(pdev, dev); |
| 905 | 905 | ||
| 906 | if (cpu_is_omap7xx()) | ||
| 907 | dev->reg_shift = 1; | ||
| 908 | else | ||
| 909 | dev->reg_shift = 2; | ||
| 910 | |||
| 906 | if ((r = omap_i2c_get_clocks(dev)) != 0) | 911 | if ((r = omap_i2c_get_clocks(dev)) != 0) |
| 907 | goto err_iounmap; | 912 | goto err_iounmap; |
| 908 | 913 | ||
| @@ -926,11 +931,6 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 926 | dev->b_hw = 1; /* Enable hardware fixes */ | 931 | dev->b_hw = 1; /* Enable hardware fixes */ |
| 927 | } | 932 | } |
| 928 | 933 | ||
| 929 | if (cpu_is_omap7xx()) | ||
| 930 | dev->reg_shift = 1; | ||
| 931 | else | ||
| 932 | dev->reg_shift = 2; | ||
| 933 | |||
| 934 | /* reset ASAP, clearing any IRQs */ | 934 | /* reset ASAP, clearing any IRQs */ |
| 935 | omap_i2c_init(dev); | 935 | omap_i2c_init(dev); |
| 936 | 936 | ||
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 247103372a06..a97e3fec8148 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c | |||
| @@ -173,6 +173,9 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data *alg_data) | |||
| 173 | /* We still have something to talk about... */ | 173 | /* We still have something to talk about... */ |
| 174 | val = *alg_data->mif.buf++; | 174 | val = *alg_data->mif.buf++; |
| 175 | 175 | ||
| 176 | if (alg_data->mif.len == 1) | ||
| 177 | val |= stop_bit; | ||
| 178 | |||
| 176 | alg_data->mif.len--; | 179 | alg_data->mif.len--; |
| 177 | iowrite32(val, I2C_REG_TX(alg_data)); | 180 | iowrite32(val, I2C_REG_TX(alg_data)); |
| 178 | 181 | ||
| @@ -246,6 +249,9 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data) | |||
| 246 | __func__); | 249 | __func__); |
| 247 | 250 | ||
| 248 | if (alg_data->mif.len == 1) { | 251 | if (alg_data->mif.len == 1) { |
| 252 | /* Last byte, do not acknowledge next rcv. */ | ||
| 253 | val |= stop_bit; | ||
| 254 | |||
| 249 | /* | 255 | /* |
| 250 | * Enable interrupt RFDAIE (data in Rx fifo), | 256 | * Enable interrupt RFDAIE (data in Rx fifo), |
| 251 | * and disable DRMIE (need data for Tx) | 257 | * and disable DRMIE (need data for Tx) |
| @@ -633,6 +639,8 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev) | |||
| 633 | */ | 639 | */ |
| 634 | 640 | ||
| 635 | tmp = ((freq / 1000) / I2C_PNX_SPEED_KHZ) / 2 - 2; | 641 | tmp = ((freq / 1000) / I2C_PNX_SPEED_KHZ) / 2 - 2; |
| 642 | if (tmp > 0x3FF) | ||
| 643 | tmp = 0x3FF; | ||
| 636 | iowrite32(tmp, I2C_REG_CKH(alg_data)); | 644 | iowrite32(tmp, I2C_REG_CKH(alg_data)); |
| 637 | iowrite32(tmp, I2C_REG_CKL(alg_data)); | 645 | iowrite32(tmp, I2C_REG_CKL(alg_data)); |
| 638 | 646 | ||
diff --git a/drivers/i2c/busses/i2c-stu300.c b/drivers/i2c/busses/i2c-stu300.c index 1f5b38be73bc..495be451d326 100644 --- a/drivers/i2c/busses/i2c-stu300.c +++ b/drivers/i2c/busses/i2c-stu300.c | |||
| @@ -498,7 +498,7 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate) | |||
| 498 | int i = 0; | 498 | int i = 0; |
| 499 | 499 | ||
| 500 | /* Locate the apropriate clock setting */ | 500 | /* Locate the apropriate clock setting */ |
| 501 | while (i < ARRAY_SIZE(stu300_clktable) && | 501 | while (i < ARRAY_SIZE(stu300_clktable) - 1 && |
| 502 | stu300_clktable[i].rate < clkrate) | 502 | stu300_clktable[i].rate < clkrate) |
| 503 | i++; | 503 | i++; |
| 504 | 504 | ||
diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h index d32efb651042..05947f9c1849 100644 --- a/drivers/isdn/gigaset/gigaset.h +++ b/drivers/isdn/gigaset/gigaset.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 20 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 21 | 21 | ||
| 22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
| 23 | #include <linux/sched.h> | ||
| 23 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
| 24 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 25 | #include <linux/ctype.h> | 26 | #include <linux/ctype.h> |
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index f230f6543bff..854959cada3a 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
| @@ -1484,6 +1484,11 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info) | |||
| 1484 | if (!s) | 1484 | if (!s) |
| 1485 | return -EINVAL; | 1485 | return -EINVAL; |
| 1486 | 1486 | ||
| 1487 | if (s->functions) { | ||
| 1488 | WARN_ON(1); | ||
| 1489 | return -EINVAL; | ||
| 1490 | } | ||
| 1491 | |||
| 1487 | /* We do not want to validate the CIS cache... */ | 1492 | /* We do not want to validate the CIS cache... */ |
| 1488 | mutex_lock(&s->ops_mutex); | 1493 | mutex_lock(&s->ops_mutex); |
| 1489 | destroy_cis_cache(s); | 1494 | destroy_cis_cache(s); |
| @@ -1639,7 +1644,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj, | |||
| 1639 | count = 0; | 1644 | count = 0; |
| 1640 | else { | 1645 | else { |
| 1641 | struct pcmcia_socket *s; | 1646 | struct pcmcia_socket *s; |
| 1642 | unsigned int chains; | 1647 | unsigned int chains = 1; |
| 1643 | 1648 | ||
| 1644 | if (off + count > size) | 1649 | if (off + count > size) |
| 1645 | count = size - off; | 1650 | count = size - off; |
| @@ -1648,7 +1653,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj, | |||
| 1648 | 1653 | ||
| 1649 | if (!(s->state & SOCKET_PRESENT)) | 1654 | if (!(s->state & SOCKET_PRESENT)) |
| 1650 | return -ENODEV; | 1655 | return -ENODEV; |
| 1651 | if (pccard_validate_cis(s, &chains)) | 1656 | if (!s->functions && pccard_validate_cis(s, &chains)) |
| 1652 | return -EIO; | 1657 | return -EIO; |
| 1653 | if (!chains) | 1658 | if (!chains) |
| 1654 | return -ENODATA; | 1659 | return -ENODATA; |
diff --git a/drivers/pcmcia/db1xxx_ss.c b/drivers/pcmcia/db1xxx_ss.c index 6206408e196c..2d48196a48cd 100644 --- a/drivers/pcmcia/db1xxx_ss.c +++ b/drivers/pcmcia/db1xxx_ss.c | |||
| @@ -166,8 +166,10 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock) | |||
| 166 | 166 | ||
| 167 | ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq, | 167 | ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq, |
| 168 | IRQF_DISABLED, "pcmcia_insert", sock); | 168 | IRQF_DISABLED, "pcmcia_insert", sock); |
| 169 | if (ret) | 169 | if (ret) { |
| 170 | local_irq_restore(flags); | ||
| 170 | goto out1; | 171 | goto out1; |
| 172 | } | ||
| 171 | 173 | ||
| 172 | ret = request_irq(sock->eject_irq, db1200_pcmcia_cdirq, | 174 | ret = request_irq(sock->eject_irq, db1200_pcmcia_cdirq, |
| 173 | IRQF_DISABLED, "pcmcia_eject", sock); | 175 | IRQF_DISABLED, "pcmcia_eject", sock); |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index cb6036d89e59..4014cf8e4a26 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -687,12 +687,10 @@ static void pcmcia_requery(struct pcmcia_socket *s) | |||
| 687 | new_funcs = mfc.nfn; | 687 | new_funcs = mfc.nfn; |
| 688 | else | 688 | else |
| 689 | new_funcs = 1; | 689 | new_funcs = 1; |
| 690 | if (old_funcs > new_funcs) { | 690 | if (old_funcs != new_funcs) { |
| 691 | /* we need to re-start */ | ||
| 691 | pcmcia_card_remove(s, NULL); | 692 | pcmcia_card_remove(s, NULL); |
| 692 | pcmcia_card_add(s); | 693 | pcmcia_card_add(s); |
| 693 | } else if (new_funcs > old_funcs) { | ||
| 694 | s->functions = new_funcs; | ||
| 695 | pcmcia_device_add(s, 1); | ||
| 696 | } | 694 | } |
| 697 | } | 695 | } |
| 698 | 696 | ||
| @@ -728,6 +726,8 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename) | |||
| 728 | struct pcmcia_socket *s = dev->socket; | 726 | struct pcmcia_socket *s = dev->socket; |
| 729 | const struct firmware *fw; | 727 | const struct firmware *fw; |
| 730 | int ret = -ENOMEM; | 728 | int ret = -ENOMEM; |
| 729 | cistpl_longlink_mfc_t mfc; | ||
| 730 | int old_funcs, new_funcs = 1; | ||
| 731 | 731 | ||
| 732 | if (!filename) | 732 | if (!filename) |
| 733 | return -EINVAL; | 733 | return -EINVAL; |
| @@ -750,6 +750,14 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename) | |||
| 750 | goto release; | 750 | goto release; |
| 751 | } | 751 | } |
| 752 | 752 | ||
| 753 | /* we need to re-start if the number of functions changed */ | ||
| 754 | old_funcs = s->functions; | ||
| 755 | if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, | ||
| 756 | &mfc)) | ||
| 757 | new_funcs = mfc.nfn; | ||
| 758 | |||
| 759 | if (old_funcs != new_funcs) | ||
| 760 | ret = -EBUSY; | ||
| 753 | 761 | ||
| 754 | /* update information */ | 762 | /* update information */ |
| 755 | pcmcia_device_query(dev); | 763 | pcmcia_device_query(dev); |
| @@ -858,10 +866,8 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev, | |||
| 858 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) { | 866 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) { |
| 859 | dev_dbg(&dev->dev, "device needs a fake CIS\n"); | 867 | dev_dbg(&dev->dev, "device needs a fake CIS\n"); |
| 860 | if (!dev->socket->fake_cis) | 868 | if (!dev->socket->fake_cis) |
| 861 | pcmcia_load_firmware(dev, did->cisfile); | 869 | if (pcmcia_load_firmware(dev, did->cisfile)) |
| 862 | 870 | return 0; | |
| 863 | if (!dev->socket->fake_cis) | ||
| 864 | return 0; | ||
| 865 | } | 871 | } |
| 866 | 872 | ||
| 867 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) { | 873 | if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) { |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index caec1dee2a4b..7c3d03bb4f30 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
| @@ -755,12 +755,12 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
| 755 | else | 755 | else |
| 756 | printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n"); | 756 | printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n"); |
| 757 | 757 | ||
| 758 | #ifdef CONFIG_PCMCIA_PROBE | 758 | /* If the interrupt is already assigned, it must be the same */ |
| 759 | 759 | if (s->irq.AssignedIRQ != 0) | |
| 760 | if (s->irq.AssignedIRQ != 0) { | ||
| 761 | /* If the interrupt is already assigned, it must be the same */ | ||
| 762 | irq = s->irq.AssignedIRQ; | 760 | irq = s->irq.AssignedIRQ; |
| 763 | } else { | 761 | |
| 762 | #ifdef CONFIG_PCMCIA_PROBE | ||
| 763 | if (!irq) { | ||
| 764 | int try; | 764 | int try; |
| 765 | u32 mask = s->irq_mask; | 765 | u32 mask = s->irq_mask; |
| 766 | void *data = p_dev; /* something unique to this device */ | 766 | void *data = p_dev; /* something unique to this device */ |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 559069a80a3b..a6eb7b59ba9f 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
| @@ -214,7 +214,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 214 | return; | 214 | return; |
| 215 | } | 215 | } |
| 216 | for (i = base, most = 0; i < base+num; i += 8) { | 216 | for (i = base, most = 0; i < base+num; i += 8) { |
| 217 | res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); | 217 | res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); |
| 218 | if (!res) | 218 | if (!res) |
| 219 | continue; | 219 | continue; |
| 220 | hole = inb(i); | 220 | hole = inb(i); |
| @@ -231,9 +231,14 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 231 | 231 | ||
| 232 | bad = any = 0; | 232 | bad = any = 0; |
| 233 | for (i = base; i < base+num; i += 8) { | 233 | for (i = base; i < base+num; i += 8) { |
| 234 | res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); | 234 | res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); |
| 235 | if (!res) | 235 | if (!res) { |
| 236 | if (!any) | ||
| 237 | printk(" excluding"); | ||
| 238 | if (!bad) | ||
| 239 | bad = any = i; | ||
| 236 | continue; | 240 | continue; |
| 241 | } | ||
| 237 | for (j = 0; j < 8; j++) | 242 | for (j = 0; j < 8; j++) |
| 238 | if (inb(i+j) != most) | 243 | if (inb(i+j) != most) |
| 239 | break; | 244 | break; |
| @@ -253,6 +258,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 253 | } | 258 | } |
| 254 | if (bad) { | 259 | if (bad) { |
| 255 | if ((num > 16) && (bad == base) && (i == base+num)) { | 260 | if ((num > 16) && (bad == base) && (i == base+num)) { |
| 261 | sub_interval(&s_data->io_db, bad, i-bad); | ||
| 256 | printk(" nothing: probe failed.\n"); | 262 | printk(" nothing: probe failed.\n"); |
| 257 | return; | 263 | return; |
| 258 | } else { | 264 | } else { |
| @@ -804,7 +810,7 @@ static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned | |||
| 804 | static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end) | 810 | static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end) |
| 805 | { | 811 | { |
| 806 | struct socket_data *data = s->resource_data; | 812 | struct socket_data *data = s->resource_data; |
| 807 | unsigned long size = end - start + 1; | 813 | unsigned long size; |
| 808 | int ret = 0; | 814 | int ret = 0; |
| 809 | 815 | ||
| 810 | #if defined(CONFIG_X86) | 816 | #if defined(CONFIG_X86) |
| @@ -814,6 +820,8 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long | |||
| 814 | start = 0x100; | 820 | start = 0x100; |
| 815 | #endif | 821 | #endif |
| 816 | 822 | ||
| 823 | size = end - start + 1; | ||
| 824 | |||
| 817 | if (end < start) | 825 | if (end < start) |
| 818 | return -EINVAL; | 826 | return -EINVAL; |
| 819 | 827 | ||
diff --git a/drivers/regulator/mc13783-regulator.c b/drivers/regulator/mc13783-regulator.c index a681f5e8f786..ad036dd8da13 100644 --- a/drivers/regulator/mc13783-regulator.c +++ b/drivers/regulator/mc13783-regulator.c | |||
| @@ -618,9 +618,12 @@ static int __devexit mc13783_regulator_remove(struct platform_device *pdev) | |||
| 618 | dev_get_platdata(&pdev->dev); | 618 | dev_get_platdata(&pdev->dev); |
| 619 | int i; | 619 | int i; |
| 620 | 620 | ||
| 621 | platform_set_drvdata(pdev, NULL); | ||
| 622 | |||
| 621 | for (i = 0; i < pdata->num_regulators; i++) | 623 | for (i = 0; i < pdata->num_regulators; i++) |
| 622 | regulator_unregister(priv->regulators[i]); | 624 | regulator_unregister(priv->regulators[i]); |
| 623 | 625 | ||
| 626 | kfree(priv); | ||
| 624 | return 0; | 627 | return 0; |
| 625 | } | 628 | } |
| 626 | 629 | ||
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index bbea90baf98f..acf222f91f5a 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -1899,7 +1899,8 @@ restart: | |||
| 1899 | /* Process requests that may be recovered */ | 1899 | /* Process requests that may be recovered */ |
| 1900 | if (cqr->status == DASD_CQR_NEED_ERP) { | 1900 | if (cqr->status == DASD_CQR_NEED_ERP) { |
| 1901 | erp_fn = base->discipline->erp_action(cqr); | 1901 | erp_fn = base->discipline->erp_action(cqr); |
| 1902 | erp_fn(cqr); | 1902 | if (IS_ERR(erp_fn(cqr))) |
| 1903 | continue; | ||
| 1903 | goto restart; | 1904 | goto restart; |
| 1904 | } | 1905 | } |
| 1905 | 1906 | ||
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index 6927e751ce3e..6632649dd6aa 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c | |||
| @@ -2309,7 +2309,7 @@ static struct dasd_ccw_req *dasd_3990_erp_add_erp(struct dasd_ccw_req *cqr) | |||
| 2309 | cqr->retries); | 2309 | cqr->retries); |
| 2310 | dasd_block_set_timer(device->block, (HZ << 3)); | 2310 | dasd_block_set_timer(device->block, (HZ << 3)); |
| 2311 | } | 2311 | } |
| 2312 | return cqr; | 2312 | return erp; |
| 2313 | } | 2313 | } |
| 2314 | 2314 | ||
| 2315 | ccw = cqr->cpaddr; | 2315 | ccw = cqr->cpaddr; |
| @@ -2372,6 +2372,9 @@ dasd_3990_erp_additional_erp(struct dasd_ccw_req * cqr) | |||
| 2372 | /* add erp and initialize with default TIC */ | 2372 | /* add erp and initialize with default TIC */ |
| 2373 | erp = dasd_3990_erp_add_erp(cqr); | 2373 | erp = dasd_3990_erp_add_erp(cqr); |
| 2374 | 2374 | ||
| 2375 | if (IS_ERR(erp)) | ||
| 2376 | return erp; | ||
| 2377 | |||
| 2375 | /* inspect sense, determine specific ERP if possible */ | 2378 | /* inspect sense, determine specific ERP if possible */ |
| 2376 | if (erp != cqr) { | 2379 | if (erp != cqr) { |
| 2377 | 2380 | ||
| @@ -2711,6 +2714,8 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr) | |||
| 2711 | if (erp == NULL) { | 2714 | if (erp == NULL) { |
| 2712 | /* no matching erp found - set up erp */ | 2715 | /* no matching erp found - set up erp */ |
| 2713 | erp = dasd_3990_erp_additional_erp(cqr); | 2716 | erp = dasd_3990_erp_additional_erp(cqr); |
| 2717 | if (IS_ERR(erp)) | ||
| 2718 | return erp; | ||
| 2714 | } else { | 2719 | } else { |
| 2715 | /* matching erp found - set all leading erp's to DONE */ | 2720 | /* matching erp found - set all leading erp's to DONE */ |
| 2716 | erp = dasd_3990_erp_handle_match_erp(cqr, erp); | 2721 | erp = dasd_3990_erp_handle_match_erp(cqr, erp); |
diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index 18daf16aa357..7217966f7d31 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c | |||
| @@ -638,11 +638,7 @@ static int __init zcore_reipl_init(void) | |||
| 638 | rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE); | 638 | rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE); |
| 639 | else | 639 | else |
| 640 | rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE); | 640 | rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE); |
| 641 | if (rc) { | 641 | if (rc || csum_partial(ipl_block, ipl_block->hdr.len, 0) != |
| 642 | free_page((unsigned long) ipl_block); | ||
| 643 | return rc; | ||
| 644 | } | ||
| 645 | if (csum_partial(ipl_block, ipl_block->hdr.len, 0) != | ||
| 646 | ipib_info.checksum) { | 642 | ipib_info.checksum) { |
| 647 | TRACE("Checksum does not match\n"); | 643 | TRACE("Checksum does not match\n"); |
| 648 | free_page((unsigned long) ipl_block); | 644 | free_page((unsigned long) ipl_block); |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 4038f5b4f144..ce7cb87479fe 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include "chsc.h" | 29 | #include "chsc.h" |
| 30 | 30 | ||
| 31 | static void *sei_page; | 31 | static void *sei_page; |
| 32 | static DEFINE_SPINLOCK(sda_lock); | ||
| 32 | 33 | ||
| 33 | /** | 34 | /** |
| 34 | * chsc_error_from_response() - convert a chsc response to an error | 35 | * chsc_error_from_response() - convert a chsc response to an error |
| @@ -832,11 +833,10 @@ void __init chsc_free_sei_area(void) | |||
| 832 | kfree(sei_page); | 833 | kfree(sei_page); |
| 833 | } | 834 | } |
| 834 | 835 | ||
| 835 | int __init | 836 | int chsc_enable_facility(int operation_code) |
| 836 | chsc_enable_facility(int operation_code) | ||
| 837 | { | 837 | { |
| 838 | int ret; | 838 | int ret; |
| 839 | struct { | 839 | static struct { |
| 840 | struct chsc_header request; | 840 | struct chsc_header request; |
| 841 | u8 reserved1:4; | 841 | u8 reserved1:4; |
| 842 | u8 format:4; | 842 | u8 format:4; |
| @@ -849,33 +849,32 @@ chsc_enable_facility(int operation_code) | |||
| 849 | u32 reserved5:4; | 849 | u32 reserved5:4; |
| 850 | u32 format2:4; | 850 | u32 format2:4; |
| 851 | u32 reserved6:24; | 851 | u32 reserved6:24; |
| 852 | } __attribute__ ((packed)) *sda_area; | 852 | } __attribute__ ((packed, aligned(4096))) sda_area; |
| 853 | 853 | ||
| 854 | sda_area = (void *)get_zeroed_page(GFP_KERNEL|GFP_DMA); | 854 | spin_lock(&sda_lock); |
| 855 | if (!sda_area) | 855 | memset(&sda_area, 0, sizeof(sda_area)); |
| 856 | return -ENOMEM; | 856 | sda_area.request.length = 0x0400; |
| 857 | sda_area->request.length = 0x0400; | 857 | sda_area.request.code = 0x0031; |
| 858 | sda_area->request.code = 0x0031; | 858 | sda_area.operation_code = operation_code; |
| 859 | sda_area->operation_code = operation_code; | ||
| 860 | 859 | ||
| 861 | ret = chsc(sda_area); | 860 | ret = chsc(&sda_area); |
| 862 | if (ret > 0) { | 861 | if (ret > 0) { |
| 863 | ret = (ret == 3) ? -ENODEV : -EBUSY; | 862 | ret = (ret == 3) ? -ENODEV : -EBUSY; |
| 864 | goto out; | 863 | goto out; |
| 865 | } | 864 | } |
| 866 | 865 | ||
| 867 | switch (sda_area->response.code) { | 866 | switch (sda_area.response.code) { |
| 868 | case 0x0101: | 867 | case 0x0101: |
| 869 | ret = -EOPNOTSUPP; | 868 | ret = -EOPNOTSUPP; |
| 870 | break; | 869 | break; |
| 871 | default: | 870 | default: |
| 872 | ret = chsc_error_from_response(sda_area->response.code); | 871 | ret = chsc_error_from_response(sda_area.response.code); |
| 873 | } | 872 | } |
| 874 | if (ret != 0) | 873 | if (ret != 0) |
| 875 | CIO_CRW_EVENT(2, "chsc: sda (oc=%x) failed (rc=%04x)\n", | 874 | CIO_CRW_EVENT(2, "chsc: sda (oc=%x) failed (rc=%04x)\n", |
| 876 | operation_code, sda_area->response.code); | 875 | operation_code, sda_area.response.code); |
| 877 | out: | 876 | out: |
| 878 | free_page((unsigned long)sda_area); | 877 | spin_unlock(&sda_lock); |
| 879 | return ret; | 878 | return ret; |
| 880 | } | 879 | } |
| 881 | 880 | ||
diff --git a/drivers/s390/cio/chsc_sch.c b/drivers/s390/cio/chsc_sch.c index 404f630c27ca..3b6f4adc5094 100644 --- a/drivers/s390/cio/chsc_sch.c +++ b/drivers/s390/cio/chsc_sch.c | |||
| @@ -124,7 +124,7 @@ static int chsc_subchannel_prepare(struct subchannel *sch) | |||
| 124 | * since we don't have a way to clear the subchannel and | 124 | * since we don't have a way to clear the subchannel and |
| 125 | * cannot disable it with a request running. | 125 | * cannot disable it with a request running. |
| 126 | */ | 126 | */ |
| 127 | cc = stsch(sch->schid, &schib); | 127 | cc = stsch_err(sch->schid, &schib); |
| 128 | if (!cc && scsw_stctl(&schib.scsw)) | 128 | if (!cc && scsw_stctl(&schib.scsw)) |
| 129 | return -EAGAIN; | 129 | return -EAGAIN; |
| 130 | return 0; | 130 | return 0; |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index f736cdcf08ad..5feea1a371e1 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
| @@ -361,7 +361,7 @@ int cio_commit_config(struct subchannel *sch) | |||
| 361 | struct schib schib; | 361 | struct schib schib; |
| 362 | int ccode, retry, ret = 0; | 362 | int ccode, retry, ret = 0; |
| 363 | 363 | ||
| 364 | if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib)) | 364 | if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) |
| 365 | return -ENODEV; | 365 | return -ENODEV; |
| 366 | 366 | ||
| 367 | for (retry = 0; retry < 5; retry++) { | 367 | for (retry = 0; retry < 5; retry++) { |
| @@ -372,7 +372,7 @@ int cio_commit_config(struct subchannel *sch) | |||
| 372 | return ccode; | 372 | return ccode; |
| 373 | switch (ccode) { | 373 | switch (ccode) { |
| 374 | case 0: /* successful */ | 374 | case 0: /* successful */ |
| 375 | if (stsch(sch->schid, &schib) || | 375 | if (stsch_err(sch->schid, &schib) || |
| 376 | !css_sch_is_valid(&schib)) | 376 | !css_sch_is_valid(&schib)) |
| 377 | return -ENODEV; | 377 | return -ENODEV; |
| 378 | if (cio_check_config(sch, &schib)) { | 378 | if (cio_check_config(sch, &schib)) { |
| @@ -404,7 +404,7 @@ int cio_update_schib(struct subchannel *sch) | |||
| 404 | { | 404 | { |
| 405 | struct schib schib; | 405 | struct schib schib; |
| 406 | 406 | ||
| 407 | if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib)) | 407 | if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) |
| 408 | return -ENODEV; | 408 | return -ENODEV; |
| 409 | 409 | ||
| 410 | memcpy(&sch->schib, &schib, sizeof(schib)); | 410 | memcpy(&sch->schib, &schib, sizeof(schib)); |
| @@ -771,7 +771,7 @@ cio_get_console_sch_no(void) | |||
| 771 | if (console_irq != -1) { | 771 | if (console_irq != -1) { |
| 772 | /* VM provided us with the irq number of the console. */ | 772 | /* VM provided us with the irq number of the console. */ |
| 773 | schid.sch_no = console_irq; | 773 | schid.sch_no = console_irq; |
| 774 | if (stsch(schid, &console_subchannel.schib) != 0 || | 774 | if (stsch_err(schid, &console_subchannel.schib) != 0 || |
| 775 | (console_subchannel.schib.pmcw.st != SUBCHANNEL_TYPE_IO) || | 775 | (console_subchannel.schib.pmcw.st != SUBCHANNEL_TYPE_IO) || |
| 776 | !console_subchannel.schib.pmcw.dnv) | 776 | !console_subchannel.schib.pmcw.dnv) |
| 777 | return -1; | 777 | return -1; |
| @@ -863,10 +863,10 @@ __disable_subchannel_easy(struct subchannel_id schid, struct schib *schib) | |||
| 863 | cc = 0; | 863 | cc = 0; |
| 864 | for (retry=0;retry<3;retry++) { | 864 | for (retry=0;retry<3;retry++) { |
| 865 | schib->pmcw.ena = 0; | 865 | schib->pmcw.ena = 0; |
| 866 | cc = msch(schid, schib); | 866 | cc = msch_err(schid, schib); |
| 867 | if (cc) | 867 | if (cc) |
| 868 | return (cc==3?-ENODEV:-EBUSY); | 868 | return (cc==3?-ENODEV:-EBUSY); |
| 869 | if (stsch(schid, schib) || !css_sch_is_valid(schib)) | 869 | if (stsch_err(schid, schib) || !css_sch_is_valid(schib)) |
| 870 | return -ENODEV; | 870 | return -ENODEV; |
| 871 | if (!schib->pmcw.ena) | 871 | if (!schib->pmcw.ena) |
| 872 | return 0; | 872 | return 0; |
| @@ -913,7 +913,7 @@ static int stsch_reset(struct subchannel_id schid, struct schib *addr) | |||
| 913 | 913 | ||
| 914 | pgm_check_occured = 0; | 914 | pgm_check_occured = 0; |
| 915 | s390_base_pgm_handler_fn = cio_reset_pgm_check_handler; | 915 | s390_base_pgm_handler_fn = cio_reset_pgm_check_handler; |
| 916 | rc = stsch(schid, addr); | 916 | rc = stsch_err(schid, addr); |
| 917 | s390_base_pgm_handler_fn = NULL; | 917 | s390_base_pgm_handler_fn = NULL; |
| 918 | 918 | ||
| 919 | /* The program check handler could have changed pgm_check_occured. */ | 919 | /* The program check handler could have changed pgm_check_occured. */ |
| @@ -950,7 +950,7 @@ static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data) | |||
| 950 | /* No default clear strategy */ | 950 | /* No default clear strategy */ |
| 951 | break; | 951 | break; |
| 952 | } | 952 | } |
| 953 | stsch(schid, &schib); | 953 | stsch_err(schid, &schib); |
| 954 | __disable_subchannel_easy(schid, &schib); | 954 | __disable_subchannel_easy(schid, &schib); |
| 955 | } | 955 | } |
| 956 | out: | 956 | out: |
| @@ -1086,7 +1086,7 @@ int __init cio_get_iplinfo(struct cio_iplinfo *iplinfo) | |||
| 1086 | schid = *(struct subchannel_id *)&S390_lowcore.subchannel_id; | 1086 | schid = *(struct subchannel_id *)&S390_lowcore.subchannel_id; |
| 1087 | if (!schid.one) | 1087 | if (!schid.one) |
| 1088 | return -ENODEV; | 1088 | return -ENODEV; |
| 1089 | if (stsch(schid, &schib)) | 1089 | if (stsch_err(schid, &schib)) |
| 1090 | return -ENODEV; | 1090 | return -ENODEV; |
| 1091 | if (schib.pmcw.st != SUBCHANNEL_TYPE_IO) | 1091 | if (schib.pmcw.st != SUBCHANNEL_TYPE_IO) |
| 1092 | return -ENODEV; | 1092 | return -ENODEV; |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 2769da54f2b9..511649115bd7 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
| @@ -870,15 +870,10 @@ static int __init css_bus_init(void) | |||
| 870 | 870 | ||
| 871 | /* Try to enable MSS. */ | 871 | /* Try to enable MSS. */ |
| 872 | ret = chsc_enable_facility(CHSC_SDA_OC_MSS); | 872 | ret = chsc_enable_facility(CHSC_SDA_OC_MSS); |
| 873 | switch (ret) { | 873 | if (ret) |
| 874 | case 0: /* Success. */ | ||
| 875 | max_ssid = __MAX_SSID; | ||
| 876 | break; | ||
| 877 | case -ENOMEM: | ||
| 878 | goto out; | ||
| 879 | default: | ||
| 880 | max_ssid = 0; | 874 | max_ssid = 0; |
| 881 | } | 875 | else /* Success. */ |
| 876 | max_ssid = __MAX_SSID; | ||
| 882 | 877 | ||
| 883 | ret = slow_subchannel_init(); | 878 | ret = slow_subchannel_init(); |
| 884 | if (ret) | 879 | if (ret) |
| @@ -1048,6 +1043,11 @@ static int __init channel_subsystem_init_sync(void) | |||
| 1048 | } | 1043 | } |
| 1049 | subsys_initcall_sync(channel_subsystem_init_sync); | 1044 | subsys_initcall_sync(channel_subsystem_init_sync); |
| 1050 | 1045 | ||
| 1046 | void channel_subsystem_reinit(void) | ||
| 1047 | { | ||
| 1048 | chsc_enable_facility(CHSC_SDA_OC_MSS); | ||
| 1049 | } | ||
| 1050 | |||
| 1051 | #ifdef CONFIG_PROC_FS | 1051 | #ifdef CONFIG_PROC_FS |
| 1052 | static ssize_t cio_settle_write(struct file *file, const char __user *buf, | 1052 | static ssize_t cio_settle_write(struct file *file, const char __user *buf, |
| 1053 | size_t count, loff_t *ppos) | 1053 | size_t count, loff_t *ppos) |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index c56ab94612f9..c9b852647f01 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
| @@ -45,7 +45,7 @@ static void ccw_timeout_log(struct ccw_device *cdev) | |||
| 45 | sch = to_subchannel(cdev->dev.parent); | 45 | sch = to_subchannel(cdev->dev.parent); |
| 46 | private = to_io_private(sch); | 46 | private = to_io_private(sch); |
| 47 | orb = &private->orb; | 47 | orb = &private->orb; |
| 48 | cc = stsch(sch->schid, &schib); | 48 | cc = stsch_err(sch->schid, &schib); |
| 49 | 49 | ||
| 50 | printk(KERN_WARNING "cio: ccw device timeout occurred at %llx, " | 50 | printk(KERN_WARNING "cio: ccw device timeout occurred at %llx, " |
| 51 | "device information:\n", get_clock()); | 51 | "device information:\n", get_clock()); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 18564891ea61..b3b1d2f79398 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -2105,7 +2105,8 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) | |||
| 2105 | blktrc.inb_usage = req->qdio_req.qdio_inb_usage; | 2105 | blktrc.inb_usage = req->qdio_req.qdio_inb_usage; |
| 2106 | blktrc.outb_usage = req->qdio_req.qdio_outb_usage; | 2106 | blktrc.outb_usage = req->qdio_req.qdio_outb_usage; |
| 2107 | 2107 | ||
| 2108 | if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA) { | 2108 | if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA && |
| 2109 | !(req->status & ZFCP_STATUS_FSFREQ_ERROR)) { | ||
| 2109 | blktrc.flags |= ZFCP_BLK_LAT_VALID; | 2110 | blktrc.flags |= ZFCP_BLK_LAT_VALID; |
| 2110 | blktrc.channel_lat = lat_in->channel_lat * ticks; | 2111 | blktrc.channel_lat = lat_in->channel_lat * ticks; |
| 2111 | blktrc.fabric_lat = lat_in->fabric_lat * ticks; | 2112 | blktrc.fabric_lat = lat_in->fabric_lat * ticks; |
| @@ -2157,9 +2158,8 @@ static void zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *req) | |||
| 2157 | fcp_rsp = (struct fcp_resp_with_ext *) &req->qtcb->bottom.io.fcp_rsp; | 2158 | fcp_rsp = (struct fcp_resp_with_ext *) &req->qtcb->bottom.io.fcp_rsp; |
| 2158 | zfcp_fc_eval_fcp_rsp(fcp_rsp, scpnt); | 2159 | zfcp_fc_eval_fcp_rsp(fcp_rsp, scpnt); |
| 2159 | 2160 | ||
| 2160 | zfcp_fsf_req_trace(req, scpnt); | ||
| 2161 | |||
| 2162 | skip_fsfstatus: | 2161 | skip_fsfstatus: |
| 2162 | zfcp_fsf_req_trace(req, scpnt); | ||
| 2163 | zfcp_dbf_scsi_result(req->adapter->dbf, scpnt, req); | 2163 | zfcp_dbf_scsi_result(req->adapter->dbf, scpnt, req); |
| 2164 | 2164 | ||
| 2165 | scpnt->host_scribble = NULL; | 2165 | scpnt->host_scribble = NULL; |
diff --git a/drivers/scsi/be2iscsi/be_mgmt.c b/drivers/scsi/be2iscsi/be_mgmt.c index 72617b650a7e..e641922f20bc 100644 --- a/drivers/scsi/be2iscsi/be_mgmt.c +++ b/drivers/scsi/be2iscsi/be_mgmt.c | |||
| @@ -169,6 +169,7 @@ unsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba, | |||
| 169 | SE_DEBUG(DBG_LVL_1, | 169 | SE_DEBUG(DBG_LVL_1, |
| 170 | "Failed to allocate memory for" | 170 | "Failed to allocate memory for" |
| 171 | "mgmt_invalidate_icds \n"); | 171 | "mgmt_invalidate_icds \n"); |
| 172 | spin_unlock(&ctrl->mbox_lock); | ||
| 172 | return -1; | 173 | return -1; |
| 173 | } | 174 | } |
| 174 | nonemb_cmd.size = sizeof(struct invalidate_commands_params_in); | 175 | nonemb_cmd.size = sizeof(struct invalidate_commands_params_in); |
diff --git a/drivers/scsi/bnx2i/bnx2i.h b/drivers/scsi/bnx2i/bnx2i.h index 6cf9dc37d78b..6b624e767d3b 100644 --- a/drivers/scsi/bnx2i/bnx2i.h +++ b/drivers/scsi/bnx2i/bnx2i.h | |||
| @@ -362,6 +362,7 @@ struct bnx2i_hba { | |||
| 362 | u32 num_ccell; | 362 | u32 num_ccell; |
| 363 | 363 | ||
| 364 | int ofld_conns_active; | 364 | int ofld_conns_active; |
| 365 | wait_queue_head_t eh_wait; | ||
| 365 | 366 | ||
| 366 | int max_active_conns; | 367 | int max_active_conns; |
| 367 | struct iscsi_cid_queue cid_que; | 368 | struct iscsi_cid_queue cid_que; |
| @@ -381,6 +382,7 @@ struct bnx2i_hba { | |||
| 381 | spinlock_t lock; /* protects hba structure access */ | 382 | spinlock_t lock; /* protects hba structure access */ |
| 382 | struct mutex net_dev_lock;/* sync net device access */ | 383 | struct mutex net_dev_lock;/* sync net device access */ |
| 383 | 384 | ||
| 385 | int hba_shutdown_tmo; | ||
| 384 | /* | 386 | /* |
| 385 | * PCI related info. | 387 | * PCI related info. |
| 386 | */ | 388 | */ |
diff --git a/drivers/scsi/bnx2i/bnx2i_init.c b/drivers/scsi/bnx2i/bnx2i_init.c index 6d8172e781cf..5d9296c599f6 100644 --- a/drivers/scsi/bnx2i/bnx2i_init.c +++ b/drivers/scsi/bnx2i/bnx2i_init.c | |||
| @@ -177,11 +177,22 @@ void bnx2i_stop(void *handle) | |||
| 177 | struct bnx2i_hba *hba = handle; | 177 | struct bnx2i_hba *hba = handle; |
| 178 | 178 | ||
| 179 | /* check if cleanup happened in GOING_DOWN context */ | 179 | /* check if cleanup happened in GOING_DOWN context */ |
| 180 | clear_bit(ADAPTER_STATE_UP, &hba->adapter_state); | ||
| 181 | if (!test_and_clear_bit(ADAPTER_STATE_GOING_DOWN, | 180 | if (!test_and_clear_bit(ADAPTER_STATE_GOING_DOWN, |
| 182 | &hba->adapter_state)) | 181 | &hba->adapter_state)) |
| 183 | iscsi_host_for_each_session(hba->shost, | 182 | iscsi_host_for_each_session(hba->shost, |
| 184 | bnx2i_drop_session); | 183 | bnx2i_drop_session); |
| 184 | |||
| 185 | /* Wait for all endpoints to be torn down, Chip will be reset once | ||
| 186 | * control returns to network driver. So it is required to cleanup and | ||
| 187 | * release all connection resources before returning from this routine. | ||
| 188 | */ | ||
| 189 | wait_event_interruptible_timeout(hba->eh_wait, | ||
| 190 | (hba->ofld_conns_active == 0), | ||
| 191 | hba->hba_shutdown_tmo); | ||
| 192 | /* This flag should be cleared last so that ep_disconnect() gracefully | ||
| 193 | * cleans up connection context | ||
| 194 | */ | ||
| 195 | clear_bit(ADAPTER_STATE_UP, &hba->adapter_state); | ||
| 185 | } | 196 | } |
| 186 | 197 | ||
| 187 | /** | 198 | /** |
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c index f2e9b18fe76c..fa68ab34b998 100644 --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c | |||
| @@ -820,6 +820,11 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic) | |||
| 820 | 820 | ||
| 821 | spin_lock_init(&hba->lock); | 821 | spin_lock_init(&hba->lock); |
| 822 | mutex_init(&hba->net_dev_lock); | 822 | mutex_init(&hba->net_dev_lock); |
| 823 | init_waitqueue_head(&hba->eh_wait); | ||
| 824 | if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) | ||
| 825 | hba->hba_shutdown_tmo = 240 * HZ; | ||
| 826 | else /* 5706/5708/5709 */ | ||
| 827 | hba->hba_shutdown_tmo = 30 * HZ; | ||
| 823 | 828 | ||
| 824 | if (iscsi_host_add(shost, &hba->pcidev->dev)) | 829 | if (iscsi_host_add(shost, &hba->pcidev->dev)) |
| 825 | goto free_dump_mem; | 830 | goto free_dump_mem; |
| @@ -1658,8 +1663,8 @@ static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost, | |||
| 1658 | */ | 1663 | */ |
| 1659 | hba = bnx2i_check_route(dst_addr); | 1664 | hba = bnx2i_check_route(dst_addr); |
| 1660 | 1665 | ||
| 1661 | if (!hba) { | 1666 | if (!hba || test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state)) { |
| 1662 | rc = -ENOMEM; | 1667 | rc = -EINVAL; |
| 1663 | goto check_busy; | 1668 | goto check_busy; |
| 1664 | } | 1669 | } |
| 1665 | 1670 | ||
| @@ -1804,7 +1809,7 @@ static int bnx2i_ep_poll(struct iscsi_endpoint *ep, int timeout_ms) | |||
| 1804 | (bnx2i_ep->state == | 1809 | (bnx2i_ep->state == |
| 1805 | EP_STATE_CONNECT_COMPL)), | 1810 | EP_STATE_CONNECT_COMPL)), |
| 1806 | msecs_to_jiffies(timeout_ms)); | 1811 | msecs_to_jiffies(timeout_ms)); |
| 1807 | if (!rc || (bnx2i_ep->state == EP_STATE_OFLD_FAILED)) | 1812 | if (bnx2i_ep->state == EP_STATE_OFLD_FAILED) |
| 1808 | rc = -1; | 1813 | rc = -1; |
| 1809 | 1814 | ||
| 1810 | if (rc > 0) | 1815 | if (rc > 0) |
| @@ -1957,6 +1962,8 @@ return_bnx2i_ep: | |||
| 1957 | 1962 | ||
| 1958 | if (!hba->ofld_conns_active) | 1963 | if (!hba->ofld_conns_active) |
| 1959 | bnx2i_unreg_dev_all(); | 1964 | bnx2i_unreg_dev_all(); |
| 1965 | |||
| 1966 | wake_up_interruptible(&hba->eh_wait); | ||
| 1960 | } | 1967 | } |
| 1961 | 1968 | ||
| 1962 | 1969 | ||
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index 496764349c41..0435d044c9da 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c | |||
| @@ -188,7 +188,8 @@ MODULE_DEVICE_TABLE(pci,dptids); | |||
| 188 | static int adpt_detect(struct scsi_host_template* sht) | 188 | static int adpt_detect(struct scsi_host_template* sht) |
| 189 | { | 189 | { |
| 190 | struct pci_dev *pDev = NULL; | 190 | struct pci_dev *pDev = NULL; |
| 191 | adpt_hba* pHba; | 191 | adpt_hba *pHba; |
| 192 | adpt_hba *next; | ||
| 192 | 193 | ||
| 193 | PINFO("Detecting Adaptec I2O RAID controllers...\n"); | 194 | PINFO("Detecting Adaptec I2O RAID controllers...\n"); |
| 194 | 195 | ||
| @@ -206,7 +207,8 @@ static int adpt_detect(struct scsi_host_template* sht) | |||
| 206 | } | 207 | } |
| 207 | 208 | ||
| 208 | /* In INIT state, Activate IOPs */ | 209 | /* In INIT state, Activate IOPs */ |
| 209 | for (pHba = hba_chain; pHba; pHba = pHba->next) { | 210 | for (pHba = hba_chain; pHba; pHba = next) { |
| 211 | next = pHba->next; | ||
| 210 | // Activate does get status , init outbound, and get hrt | 212 | // Activate does get status , init outbound, and get hrt |
| 211 | if (adpt_i2o_activate_hba(pHba) < 0) { | 213 | if (adpt_i2o_activate_hba(pHba) < 0) { |
| 212 | adpt_i2o_delete_hba(pHba); | 214 | adpt_i2o_delete_hba(pHba); |
| @@ -243,7 +245,8 @@ rebuild_sys_tab: | |||
| 243 | PDEBUG("HBA's in OPERATIONAL state\n"); | 245 | PDEBUG("HBA's in OPERATIONAL state\n"); |
| 244 | 246 | ||
| 245 | printk("dpti: If you have a lot of devices this could take a few minutes.\n"); | 247 | printk("dpti: If you have a lot of devices this could take a few minutes.\n"); |
| 246 | for (pHba = hba_chain; pHba; pHba = pHba->next) { | 248 | for (pHba = hba_chain; pHba; pHba = next) { |
| 249 | next = pHba->next; | ||
| 247 | printk(KERN_INFO"%s: Reading the hardware resource table.\n", pHba->name); | 250 | printk(KERN_INFO"%s: Reading the hardware resource table.\n", pHba->name); |
| 248 | if (adpt_i2o_lct_get(pHba) < 0){ | 251 | if (adpt_i2o_lct_get(pHba) < 0){ |
| 249 | adpt_i2o_delete_hba(pHba); | 252 | adpt_i2o_delete_hba(pHba); |
| @@ -263,7 +266,8 @@ rebuild_sys_tab: | |||
| 263 | adpt_sysfs_class = NULL; | 266 | adpt_sysfs_class = NULL; |
| 264 | } | 267 | } |
| 265 | 268 | ||
| 266 | for (pHba = hba_chain; pHba; pHba = pHba->next) { | 269 | for (pHba = hba_chain; pHba; pHba = next) { |
| 270 | next = pHba->next; | ||
| 267 | if (adpt_scsi_host_alloc(pHba, sht) < 0){ | 271 | if (adpt_scsi_host_alloc(pHba, sht) < 0){ |
| 268 | adpt_i2o_delete_hba(pHba); | 272 | adpt_i2o_delete_hba(pHba); |
| 269 | continue; | 273 | continue; |
| @@ -1229,11 +1233,10 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba) | |||
| 1229 | } | 1233 | } |
| 1230 | } | 1234 | } |
| 1231 | pci_dev_put(pHba->pDev); | 1235 | pci_dev_put(pHba->pDev); |
| 1232 | kfree(pHba); | ||
| 1233 | |||
| 1234 | if (adpt_sysfs_class) | 1236 | if (adpt_sysfs_class) |
| 1235 | device_destroy(adpt_sysfs_class, | 1237 | device_destroy(adpt_sysfs_class, |
| 1236 | MKDEV(DPTI_I2O_MAJOR, pHba->unit)); | 1238 | MKDEV(DPTI_I2O_MAJOR, pHba->unit)); |
| 1239 | kfree(pHba); | ||
| 1237 | 1240 | ||
| 1238 | if(hba_count <= 0){ | 1241 | if(hba_count <= 0){ |
| 1239 | unregister_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER); | 1242 | unregister_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER); |
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index ff5ec5ac1fb5..88bad0e81bdd 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
| @@ -323,16 +323,6 @@ static void set_srp_direction(struct scsi_cmnd *cmd, | |||
| 323 | srp_cmd->buf_fmt = fmt; | 323 | srp_cmd->buf_fmt = fmt; |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | static void unmap_sg_list(int num_entries, | ||
| 327 | struct device *dev, | ||
| 328 | struct srp_direct_buf *md) | ||
| 329 | { | ||
| 330 | int i; | ||
| 331 | |||
| 332 | for (i = 0; i < num_entries; ++i) | ||
| 333 | dma_unmap_single(dev, md[i].va, md[i].len, DMA_BIDIRECTIONAL); | ||
| 334 | } | ||
| 335 | |||
| 336 | /** | 326 | /** |
| 337 | * unmap_cmd_data: - Unmap data pointed in srp_cmd based on the format | 327 | * unmap_cmd_data: - Unmap data pointed in srp_cmd based on the format |
| 338 | * @cmd: srp_cmd whose additional_data member will be unmapped | 328 | * @cmd: srp_cmd whose additional_data member will be unmapped |
| @@ -350,24 +340,9 @@ static void unmap_cmd_data(struct srp_cmd *cmd, | |||
| 350 | 340 | ||
| 351 | if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC) | 341 | if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC) |
| 352 | return; | 342 | return; |
| 353 | else if (out_fmt == SRP_DATA_DESC_DIRECT || | ||
| 354 | in_fmt == SRP_DATA_DESC_DIRECT) { | ||
| 355 | struct srp_direct_buf *data = | ||
| 356 | (struct srp_direct_buf *) cmd->add_data; | ||
| 357 | dma_unmap_single(dev, data->va, data->len, DMA_BIDIRECTIONAL); | ||
| 358 | } else { | ||
| 359 | struct srp_indirect_buf *indirect = | ||
| 360 | (struct srp_indirect_buf *) cmd->add_data; | ||
| 361 | int num_mapped = indirect->table_desc.len / | ||
| 362 | sizeof(struct srp_direct_buf); | ||
| 363 | 343 | ||
| 364 | if (num_mapped <= MAX_INDIRECT_BUFS) { | 344 | if (evt_struct->cmnd) |
| 365 | unmap_sg_list(num_mapped, dev, &indirect->desc_list[0]); | 345 | scsi_dma_unmap(evt_struct->cmnd); |
| 366 | return; | ||
| 367 | } | ||
| 368 | |||
| 369 | unmap_sg_list(num_mapped, dev, evt_struct->ext_list); | ||
| 370 | } | ||
| 371 | } | 346 | } |
| 372 | 347 | ||
| 373 | static int map_sg_list(struct scsi_cmnd *cmd, int nseg, | 348 | static int map_sg_list(struct scsi_cmnd *cmd, int nseg, |
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0ee725ced511..02143af7c1af 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
| @@ -599,7 +599,7 @@ static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) | |||
| 599 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); | 599 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); |
| 600 | write_unlock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock); | 600 | write_unlock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock); |
| 601 | 601 | ||
| 602 | if (sock->sk->sk_sleep && waitqueue_active(sock->sk->sk_sleep)) { | 602 | if (sock->sk->sk_sleep) { |
| 603 | sock->sk->sk_err = EIO; | 603 | sock->sk->sk_err = EIO; |
| 604 | wake_up_interruptible(sock->sk->sk_sleep); | 604 | wake_up_interruptible(sock->sk->sk_sleep); |
| 605 | } | 605 | } |
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c index ec3723831e89..d62b3e467926 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.c +++ b/drivers/scsi/lpfc/lpfc_bsg.c | |||
| @@ -433,7 +433,7 @@ lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba, | |||
| 433 | dd_data = cmdiocbq->context1; | 433 | dd_data = cmdiocbq->context1; |
| 434 | /* normal completion and timeout crossed paths, already done */ | 434 | /* normal completion and timeout crossed paths, already done */ |
| 435 | if (!dd_data) { | 435 | if (!dd_data) { |
| 436 | spin_unlock_irqrestore(&phba->hbalock, flags); | 436 | spin_unlock_irqrestore(&phba->ct_ev_lock, flags); |
| 437 | return; | 437 | return; |
| 438 | } | 438 | } |
| 439 | 439 | ||
| @@ -1196,7 +1196,7 @@ lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba, | |||
| 1196 | dd_data = cmdiocbq->context1; | 1196 | dd_data = cmdiocbq->context1; |
| 1197 | /* normal completion and timeout crossed paths, already done */ | 1197 | /* normal completion and timeout crossed paths, already done */ |
| 1198 | if (!dd_data) { | 1198 | if (!dd_data) { |
| 1199 | spin_unlock_irqrestore(&phba->hbalock, flags); | 1199 | spin_unlock_irqrestore(&phba->ct_ev_lock, flags); |
| 1200 | return; | 1200 | return; |
| 1201 | } | 1201 | } |
| 1202 | 1202 | ||
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 359e9a71a021..1c7ef55966fb 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -2393,6 +2393,7 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job) | |||
| 2393 | return 0; | 2393 | return 0; |
| 2394 | 2394 | ||
| 2395 | done: | 2395 | done: |
| 2396 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 2396 | if (bsg_job->request->msgcode == FC_BSG_HST_CT) | 2397 | if (bsg_job->request->msgcode == FC_BSG_HST_CT) |
| 2397 | kfree(sp->fcport); | 2398 | kfree(sp->fcport); |
| 2398 | kfree(sp->ctx); | 2399 | kfree(sp->ctx); |
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index 09d6d4b76f39..caeb7d10ae04 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
| @@ -467,7 +467,7 @@ int qla4xxx_get_fwddb_entry(struct scsi_qla_host *ha, | |||
| 467 | if (conn_err_detail) | 467 | if (conn_err_detail) |
| 468 | *conn_err_detail = mbox_sts[5]; | 468 | *conn_err_detail = mbox_sts[5]; |
| 469 | if (tcp_source_port_num) | 469 | if (tcp_source_port_num) |
| 470 | *tcp_source_port_num = (uint16_t) mbox_sts[6] >> 16; | 470 | *tcp_source_port_num = (uint16_t) (mbox_sts[6] >> 16); |
| 471 | if (connection_id) | 471 | if (connection_id) |
| 472 | *connection_id = (uint16_t) mbox_sts[6] & 0x00FF; | 472 | *connection_id = (uint16_t) mbox_sts[6] & 0x00FF; |
| 473 | status = QLA_SUCCESS; | 473 | status = QLA_SUCCESS; |
diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c index d0b7d2ff9ac5..333580bf37c5 100644 --- a/drivers/scsi/wd7000.c +++ b/drivers/scsi/wd7000.c | |||
| @@ -1587,7 +1587,7 @@ static int wd7000_host_reset(struct scsi_cmnd *SCpnt) | |||
| 1587 | { | 1587 | { |
| 1588 | Adapter *host = (Adapter *) SCpnt->device->host->hostdata; | 1588 | Adapter *host = (Adapter *) SCpnt->device->host->hostdata; |
| 1589 | 1589 | ||
| 1590 | spin_unlock_irq(SCpnt->device->host->host_lock); | 1590 | spin_lock_irq(SCpnt->device->host->host_lock); |
| 1591 | 1591 | ||
| 1592 | if (wd7000_adapter_reset(host) < 0) { | 1592 | if (wd7000_adapter_reset(host) < 0) { |
| 1593 | spin_unlock_irq(SCpnt->device->host->host_lock); | 1593 | spin_unlock_irq(SCpnt->device->host->host_lock); |
diff --git a/drivers/serial/mcf.c b/drivers/serial/mcf.c index 7bb5fee639e3..b5aaef965f24 100644 --- a/drivers/serial/mcf.c +++ b/drivers/serial/mcf.c | |||
| @@ -263,6 +263,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios, | |||
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | spin_lock_irqsave(&port->lock, flags); | 265 | spin_lock_irqsave(&port->lock, flags); |
| 266 | uart_update_timeout(port, termios->c_cflag, baud); | ||
| 266 | writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR); | 267 | writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR); |
| 267 | writeb(MCFUART_UCR_CMDRESETTX, port->membase + MCFUART_UCR); | 268 | writeb(MCFUART_UCR_CMDRESETTX, port->membase + MCFUART_UCR); |
| 268 | writeb(MCFUART_UCR_CMDRESETMRPTR, port->membase + MCFUART_UCR); | 269 | writeb(MCFUART_UCR_CMDRESETMRPTR, port->membase + MCFUART_UCR); |
| @@ -379,6 +380,7 @@ static irqreturn_t mcf_interrupt(int irq, void *data) | |||
| 379 | static void mcf_config_port(struct uart_port *port, int flags) | 380 | static void mcf_config_port(struct uart_port *port, int flags) |
| 380 | { | 381 | { |
| 381 | port->type = PORT_MCF; | 382 | port->type = PORT_MCF; |
| 383 | port->fifosize = MCFUART_TXFIFOSIZE; | ||
| 382 | 384 | ||
| 383 | /* Clear mask, so no surprise interrupts. */ | 385 | /* Clear mask, so no surprise interrupts. */ |
| 384 | writeb(0, port->membase + MCFUART_UIMR); | 386 | writeb(0, port->membase + MCFUART_UIMR); |
| @@ -424,7 +426,7 @@ static int mcf_verify_port(struct uart_port *port, struct serial_struct *ser) | |||
| 424 | /* | 426 | /* |
| 425 | * Define the basic serial functions we support. | 427 | * Define the basic serial functions we support. |
| 426 | */ | 428 | */ |
| 427 | static struct uart_ops mcf_uart_ops = { | 429 | static const struct uart_ops mcf_uart_ops = { |
| 428 | .tx_empty = mcf_tx_empty, | 430 | .tx_empty = mcf_tx_empty, |
| 429 | .get_mctrl = mcf_get_mctrl, | 431 | .get_mctrl = mcf_get_mctrl, |
| 430 | .set_mctrl = mcf_set_mctrl, | 432 | .set_mctrl = mcf_set_mctrl, |
| @@ -443,7 +445,7 @@ static struct uart_ops mcf_uart_ops = { | |||
| 443 | .verify_port = mcf_verify_port, | 445 | .verify_port = mcf_verify_port, |
| 444 | }; | 446 | }; |
| 445 | 447 | ||
| 446 | static struct mcf_uart mcf_ports[3]; | 448 | static struct mcf_uart mcf_ports[4]; |
| 447 | 449 | ||
| 448 | #define MCF_MAXPORTS ARRAY_SIZE(mcf_ports) | 450 | #define MCF_MAXPORTS ARRAY_SIZE(mcf_ports) |
| 449 | 451 | ||
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 175d202ab37e..8cfa5b12ea7a 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
| @@ -105,6 +105,10 @@ struct serial_cfg_mem { | |||
| 105 | * manfid 0x0160, 0x0104 | 105 | * manfid 0x0160, 0x0104 |
| 106 | * This card appears to have a 14.7456MHz clock. | 106 | * This card appears to have a 14.7456MHz clock. |
| 107 | */ | 107 | */ |
| 108 | /* Generic Modem: MD55x (GPRS/EDGE) have | ||
| 109 | * Elan VPU16551 UART with 14.7456MHz oscillator | ||
| 110 | * manfid 0x015D, 0x4C45 | ||
| 111 | */ | ||
| 108 | static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) | 112 | static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) |
| 109 | { | 113 | { |
| 110 | port->uartclk = 14745600; | 114 | port->uartclk = 14745600; |
| @@ -196,6 +200,11 @@ static const struct serial_quirk quirks[] = { | |||
| 196 | .multi = -1, | 200 | .multi = -1, |
| 197 | .setup = quirk_setup_brainboxes_0104, | 201 | .setup = quirk_setup_brainboxes_0104, |
| 198 | }, { | 202 | }, { |
| 203 | .manfid = 0x015D, | ||
| 204 | .prodid = 0x4C45, | ||
| 205 | .multi = -1, | ||
| 206 | .setup = quirk_setup_brainboxes_0104, | ||
| 207 | }, { | ||
| 199 | .manfid = MANFID_IBM, | 208 | .manfid = MANFID_IBM, |
| 200 | .prodid = ~0, | 209 | .prodid = ~0, |
| 201 | .multi = -1, | 210 | .multi = -1, |
diff --git a/drivers/staging/dt3155/dt3155_drv.c b/drivers/staging/dt3155/dt3155_drv.c index a67c622869d2..e2c44ec6fc45 100644 --- a/drivers/staging/dt3155/dt3155_drv.c +++ b/drivers/staging/dt3155/dt3155_drv.c | |||
| @@ -57,19 +57,8 @@ MA 02111-1307 USA | |||
| 57 | 57 | ||
| 58 | extern void printques(int); | 58 | extern void printques(int); |
| 59 | 59 | ||
| 60 | #ifdef MODULE | ||
| 61 | #include <linux/module.h> | 60 | #include <linux/module.h> |
| 62 | #include <linux/interrupt.h> | 61 | #include <linux/interrupt.h> |
| 63 | |||
| 64 | |||
| 65 | MODULE_LICENSE("GPL"); | ||
| 66 | |||
| 67 | #endif | ||
| 68 | |||
| 69 | #ifndef CONFIG_PCI | ||
| 70 | #error "DT3155 : Kernel PCI support not enabled (DT3155 drive requires PCI)" | ||
| 71 | #endif | ||
| 72 | |||
| 73 | #include <linux/pci.h> | 62 | #include <linux/pci.h> |
| 74 | #include <linux/types.h> | 63 | #include <linux/types.h> |
| 75 | #include <linux/poll.h> | 64 | #include <linux/poll.h> |
| @@ -84,6 +73,9 @@ MODULE_LICENSE("GPL"); | |||
| 84 | #include "dt3155_io.h" | 73 | #include "dt3155_io.h" |
| 85 | #include "allocator.h" | 74 | #include "allocator.h" |
| 86 | 75 | ||
| 76 | |||
| 77 | MODULE_LICENSE("GPL"); | ||
| 78 | |||
| 87 | /* Error variable. Zero means no error. */ | 79 | /* Error variable. Zero means no error. */ |
| 88 | int dt3155_errno = 0; | 80 | int dt3155_errno = 0; |
| 89 | 81 | ||
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 3aed38886f94..bfec7c29486d 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c | |||
| @@ -103,7 +103,8 @@ static void fill_balloon(struct virtio_balloon *vb, size_t num) | |||
| 103 | num = min(num, ARRAY_SIZE(vb->pfns)); | 103 | num = min(num, ARRAY_SIZE(vb->pfns)); |
| 104 | 104 | ||
| 105 | for (vb->num_pfns = 0; vb->num_pfns < num; vb->num_pfns++) { | 105 | for (vb->num_pfns = 0; vb->num_pfns < num; vb->num_pfns++) { |
| 106 | struct page *page = alloc_page(GFP_HIGHUSER | __GFP_NORETRY); | 106 | struct page *page = alloc_page(GFP_HIGHUSER | __GFP_NORETRY | |
| 107 | __GFP_NOMEMALLOC | __GFP_NOWARN); | ||
| 107 | if (!page) { | 108 | if (!page) { |
| 108 | if (printk_ratelimit()) | 109 | if (printk_ratelimit()) |
| 109 | dev_printk(KERN_INFO, &vb->vdev->dev, | 110 | dev_printk(KERN_INFO, &vb->vdev->dev, |
diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index 5e813a816ce4..b3feddc4f7d6 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c | |||
| @@ -138,9 +138,9 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) | |||
| 138 | { | 138 | { |
| 139 | struct afs_super_info *super; | 139 | struct afs_super_info *super; |
| 140 | struct vfsmount *mnt; | 140 | struct vfsmount *mnt; |
| 141 | struct page *page = NULL; | 141 | struct page *page; |
| 142 | size_t size; | 142 | size_t size; |
| 143 | char *buf, *devname = NULL, *options = NULL; | 143 | char *buf, *devname, *options; |
| 144 | int ret; | 144 | int ret; |
| 145 | 145 | ||
| 146 | _enter("{%s}", mntpt->d_name.name); | 146 | _enter("{%s}", mntpt->d_name.name); |
| @@ -150,22 +150,22 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) | |||
| 150 | ret = -EINVAL; | 150 | ret = -EINVAL; |
| 151 | size = mntpt->d_inode->i_size; | 151 | size = mntpt->d_inode->i_size; |
| 152 | if (size > PAGE_SIZE - 1) | 152 | if (size > PAGE_SIZE - 1) |
| 153 | goto error; | 153 | goto error_no_devname; |
| 154 | 154 | ||
| 155 | ret = -ENOMEM; | 155 | ret = -ENOMEM; |
| 156 | devname = (char *) get_zeroed_page(GFP_KERNEL); | 156 | devname = (char *) get_zeroed_page(GFP_KERNEL); |
| 157 | if (!devname) | 157 | if (!devname) |
| 158 | goto error; | 158 | goto error_no_devname; |
| 159 | 159 | ||
| 160 | options = (char *) get_zeroed_page(GFP_KERNEL); | 160 | options = (char *) get_zeroed_page(GFP_KERNEL); |
| 161 | if (!options) | 161 | if (!options) |
| 162 | goto error; | 162 | goto error_no_options; |
| 163 | 163 | ||
| 164 | /* read the contents of the AFS special symlink */ | 164 | /* read the contents of the AFS special symlink */ |
| 165 | page = read_mapping_page(mntpt->d_inode->i_mapping, 0, NULL); | 165 | page = read_mapping_page(mntpt->d_inode->i_mapping, 0, NULL); |
| 166 | if (IS_ERR(page)) { | 166 | if (IS_ERR(page)) { |
| 167 | ret = PTR_ERR(page); | 167 | ret = PTR_ERR(page); |
| 168 | goto error; | 168 | goto error_no_page; |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | ret = -EIO; | 171 | ret = -EIO; |
| @@ -196,12 +196,12 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) | |||
| 196 | return mnt; | 196 | return mnt; |
| 197 | 197 | ||
| 198 | error: | 198 | error: |
| 199 | if (page) | 199 | page_cache_release(page); |
| 200 | page_cache_release(page); | 200 | error_no_page: |
| 201 | if (devname) | 201 | free_page((unsigned long) options); |
| 202 | free_page((unsigned long) devname); | 202 | error_no_options: |
| 203 | if (options) | 203 | free_page((unsigned long) devname); |
| 204 | free_page((unsigned long) options); | 204 | error_no_devname: |
| 205 | _leave(" = %d", ret); | 205 | _leave(" = %d", ret); |
| 206 | return ERR_PTR(ret); | 206 | return ERR_PTR(ret); |
| 207 | } | 207 | } |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index e0e769bdca59..49566c1687d8 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
| @@ -355,7 +355,7 @@ calc_reloc(unsigned long r, struct lib_info *p, int curid, int internalp) | |||
| 355 | 355 | ||
| 356 | if (!flat_reloc_valid(r, start_brk - start_data + text_len)) { | 356 | if (!flat_reloc_valid(r, start_brk - start_data + text_len)) { |
| 357 | printk("BINFMT_FLAT: reloc outside program 0x%x (0 - 0x%x/0x%x)", | 357 | printk("BINFMT_FLAT: reloc outside program 0x%x (0 - 0x%x/0x%x)", |
| 358 | (int) r,(int)(start_brk-start_code),(int)text_len); | 358 | (int) r,(int)(start_brk-start_data+text_len),(int)text_len); |
| 359 | goto failed; | 359 | goto failed; |
| 360 | } | 360 | } |
| 361 | 361 | ||
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index efb2b9400391..1cc087635a5e 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
| @@ -382,8 +382,8 @@ out: | |||
| 382 | static void ecryptfs_lower_offset_for_extent(loff_t *offset, loff_t extent_num, | 382 | static void ecryptfs_lower_offset_for_extent(loff_t *offset, loff_t extent_num, |
| 383 | struct ecryptfs_crypt_stat *crypt_stat) | 383 | struct ecryptfs_crypt_stat *crypt_stat) |
| 384 | { | 384 | { |
| 385 | (*offset) = (crypt_stat->num_header_bytes_at_front | 385 | (*offset) = ecryptfs_lower_header_size(crypt_stat) |
| 386 | + (crypt_stat->extent_size * extent_num)); | 386 | + (crypt_stat->extent_size * extent_num); |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | /** | 389 | /** |
| @@ -835,13 +835,13 @@ void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat) | |||
| 835 | set_extent_mask_and_shift(crypt_stat); | 835 | set_extent_mask_and_shift(crypt_stat); |
| 836 | crypt_stat->iv_bytes = ECRYPTFS_DEFAULT_IV_BYTES; | 836 | crypt_stat->iv_bytes = ECRYPTFS_DEFAULT_IV_BYTES; |
| 837 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) | 837 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) |
| 838 | crypt_stat->num_header_bytes_at_front = 0; | 838 | crypt_stat->metadata_size = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; |
| 839 | else { | 839 | else { |
| 840 | if (PAGE_CACHE_SIZE <= ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) | 840 | if (PAGE_CACHE_SIZE <= ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) |
| 841 | crypt_stat->num_header_bytes_at_front = | 841 | crypt_stat->metadata_size = |
| 842 | ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; | 842 | ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; |
| 843 | else | 843 | else |
| 844 | crypt_stat->num_header_bytes_at_front = PAGE_CACHE_SIZE; | 844 | crypt_stat->metadata_size = PAGE_CACHE_SIZE; |
| 845 | } | 845 | } |
| 846 | } | 846 | } |
| 847 | 847 | ||
| @@ -1108,9 +1108,9 @@ static void write_ecryptfs_marker(char *page_virt, size_t *written) | |||
| 1108 | (*written) = MAGIC_ECRYPTFS_MARKER_SIZE_BYTES; | 1108 | (*written) = MAGIC_ECRYPTFS_MARKER_SIZE_BYTES; |
| 1109 | } | 1109 | } |
| 1110 | 1110 | ||
| 1111 | static void | 1111 | void ecryptfs_write_crypt_stat_flags(char *page_virt, |
| 1112 | write_ecryptfs_flags(char *page_virt, struct ecryptfs_crypt_stat *crypt_stat, | 1112 | struct ecryptfs_crypt_stat *crypt_stat, |
| 1113 | size_t *written) | 1113 | size_t *written) |
| 1114 | { | 1114 | { |
| 1115 | u32 flags = 0; | 1115 | u32 flags = 0; |
| 1116 | int i; | 1116 | int i; |
| @@ -1238,8 +1238,7 @@ ecryptfs_write_header_metadata(char *virt, | |||
| 1238 | 1238 | ||
| 1239 | header_extent_size = (u32)crypt_stat->extent_size; | 1239 | header_extent_size = (u32)crypt_stat->extent_size; |
| 1240 | num_header_extents_at_front = | 1240 | num_header_extents_at_front = |
| 1241 | (u16)(crypt_stat->num_header_bytes_at_front | 1241 | (u16)(crypt_stat->metadata_size / crypt_stat->extent_size); |
| 1242 | / crypt_stat->extent_size); | ||
| 1243 | put_unaligned_be32(header_extent_size, virt); | 1242 | put_unaligned_be32(header_extent_size, virt); |
| 1244 | virt += 4; | 1243 | virt += 4; |
| 1245 | put_unaligned_be16(num_header_extents_at_front, virt); | 1244 | put_unaligned_be16(num_header_extents_at_front, virt); |
| @@ -1292,7 +1291,8 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t max, | |||
| 1292 | offset = ECRYPTFS_FILE_SIZE_BYTES; | 1291 | offset = ECRYPTFS_FILE_SIZE_BYTES; |
| 1293 | write_ecryptfs_marker((page_virt + offset), &written); | 1292 | write_ecryptfs_marker((page_virt + offset), &written); |
| 1294 | offset += written; | 1293 | offset += written; |
| 1295 | write_ecryptfs_flags((page_virt + offset), crypt_stat, &written); | 1294 | ecryptfs_write_crypt_stat_flags((page_virt + offset), crypt_stat, |
| 1295 | &written); | ||
| 1296 | offset += written; | 1296 | offset += written; |
| 1297 | ecryptfs_write_header_metadata((page_virt + offset), crypt_stat, | 1297 | ecryptfs_write_header_metadata((page_virt + offset), crypt_stat, |
| 1298 | &written); | 1298 | &written); |
| @@ -1382,7 +1382,7 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry) | |||
| 1382 | rc = -EINVAL; | 1382 | rc = -EINVAL; |
| 1383 | goto out; | 1383 | goto out; |
| 1384 | } | 1384 | } |
| 1385 | virt_len = crypt_stat->num_header_bytes_at_front; | 1385 | virt_len = crypt_stat->metadata_size; |
| 1386 | order = get_order(virt_len); | 1386 | order = get_order(virt_len); |
| 1387 | /* Released in this function */ | 1387 | /* Released in this function */ |
| 1388 | virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order); | 1388 | virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order); |
| @@ -1428,16 +1428,15 @@ static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat, | |||
| 1428 | header_extent_size = get_unaligned_be32(virt); | 1428 | header_extent_size = get_unaligned_be32(virt); |
| 1429 | virt += sizeof(__be32); | 1429 | virt += sizeof(__be32); |
| 1430 | num_header_extents_at_front = get_unaligned_be16(virt); | 1430 | num_header_extents_at_front = get_unaligned_be16(virt); |
| 1431 | crypt_stat->num_header_bytes_at_front = | 1431 | crypt_stat->metadata_size = (((size_t)num_header_extents_at_front |
| 1432 | (((size_t)num_header_extents_at_front | 1432 | * (size_t)header_extent_size)); |
| 1433 | * (size_t)header_extent_size)); | ||
| 1434 | (*bytes_read) = (sizeof(__be32) + sizeof(__be16)); | 1433 | (*bytes_read) = (sizeof(__be32) + sizeof(__be16)); |
| 1435 | if ((validate_header_size == ECRYPTFS_VALIDATE_HEADER_SIZE) | 1434 | if ((validate_header_size == ECRYPTFS_VALIDATE_HEADER_SIZE) |
| 1436 | && (crypt_stat->num_header_bytes_at_front | 1435 | && (crypt_stat->metadata_size |
| 1437 | < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE)) { | 1436 | < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE)) { |
| 1438 | rc = -EINVAL; | 1437 | rc = -EINVAL; |
| 1439 | printk(KERN_WARNING "Invalid header size: [%zd]\n", | 1438 | printk(KERN_WARNING "Invalid header size: [%zd]\n", |
| 1440 | crypt_stat->num_header_bytes_at_front); | 1439 | crypt_stat->metadata_size); |
| 1441 | } | 1440 | } |
| 1442 | return rc; | 1441 | return rc; |
| 1443 | } | 1442 | } |
| @@ -1452,8 +1451,7 @@ static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat, | |||
| 1452 | */ | 1451 | */ |
| 1453 | static void set_default_header_data(struct ecryptfs_crypt_stat *crypt_stat) | 1452 | static void set_default_header_data(struct ecryptfs_crypt_stat *crypt_stat) |
| 1454 | { | 1453 | { |
| 1455 | crypt_stat->num_header_bytes_at_front = | 1454 | crypt_stat->metadata_size = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; |
| 1456 | ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; | ||
| 1457 | } | 1455 | } |
| 1458 | 1456 | ||
| 1459 | /** | 1457 | /** |
| @@ -1607,6 +1605,7 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) | |||
| 1607 | ecryptfs_dentry, | 1605 | ecryptfs_dentry, |
| 1608 | ECRYPTFS_VALIDATE_HEADER_SIZE); | 1606 | ECRYPTFS_VALIDATE_HEADER_SIZE); |
| 1609 | if (rc) { | 1607 | if (rc) { |
| 1608 | memset(page_virt, 0, PAGE_CACHE_SIZE); | ||
| 1610 | rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode); | 1609 | rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode); |
| 1611 | if (rc) { | 1610 | if (rc) { |
| 1612 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " | 1611 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " |
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index 542f625312f3..bc7115403f38 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
| @@ -273,7 +273,7 @@ struct ecryptfs_crypt_stat { | |||
| 273 | u32 flags; | 273 | u32 flags; |
| 274 | unsigned int file_version; | 274 | unsigned int file_version; |
| 275 | size_t iv_bytes; | 275 | size_t iv_bytes; |
| 276 | size_t num_header_bytes_at_front; | 276 | size_t metadata_size; |
| 277 | size_t extent_size; /* Data extent size; default is 4096 */ | 277 | size_t extent_size; /* Data extent size; default is 4096 */ |
| 278 | size_t key_size; | 278 | size_t key_size; |
| 279 | size_t extent_shift; | 279 | size_t extent_shift; |
| @@ -464,6 +464,14 @@ struct ecryptfs_daemon { | |||
| 464 | 464 | ||
| 465 | extern struct mutex ecryptfs_daemon_hash_mux; | 465 | extern struct mutex ecryptfs_daemon_hash_mux; |
| 466 | 466 | ||
| 467 | static inline size_t | ||
| 468 | ecryptfs_lower_header_size(struct ecryptfs_crypt_stat *crypt_stat) | ||
| 469 | { | ||
| 470 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) | ||
| 471 | return 0; | ||
| 472 | return crypt_stat->metadata_size; | ||
| 473 | } | ||
| 474 | |||
| 467 | static inline struct ecryptfs_file_info * | 475 | static inline struct ecryptfs_file_info * |
| 468 | ecryptfs_file_to_private(struct file *file) | 476 | ecryptfs_file_to_private(struct file *file) |
| 469 | { | 477 | { |
| @@ -651,6 +659,9 @@ int ecryptfs_decrypt_page(struct page *page); | |||
| 651 | int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry); | 659 | int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry); |
| 652 | int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry); | 660 | int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry); |
| 653 | int ecryptfs_new_file_context(struct dentry *ecryptfs_dentry); | 661 | int ecryptfs_new_file_context(struct dentry *ecryptfs_dentry); |
| 662 | void ecryptfs_write_crypt_stat_flags(char *page_virt, | ||
| 663 | struct ecryptfs_crypt_stat *crypt_stat, | ||
| 664 | size_t *written); | ||
| 654 | int ecryptfs_read_and_validate_header_region(char *data, | 665 | int ecryptfs_read_and_validate_header_region(char *data, |
| 655 | struct inode *ecryptfs_inode); | 666 | struct inode *ecryptfs_inode); |
| 656 | int ecryptfs_read_and_validate_xattr_region(char *page_virt, | 667 | int ecryptfs_read_and_validate_xattr_region(char *page_virt, |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index d3362faf3852..e2d4418affac 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -324,6 +324,7 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, | |||
| 324 | rc = ecryptfs_read_and_validate_header_region(page_virt, | 324 | rc = ecryptfs_read_and_validate_header_region(page_virt, |
| 325 | ecryptfs_dentry->d_inode); | 325 | ecryptfs_dentry->d_inode); |
| 326 | if (rc) { | 326 | if (rc) { |
| 327 | memset(page_virt, 0, PAGE_CACHE_SIZE); | ||
| 327 | rc = ecryptfs_read_and_validate_xattr_region(page_virt, | 328 | rc = ecryptfs_read_and_validate_xattr_region(page_virt, |
| 328 | ecryptfs_dentry); | 329 | ecryptfs_dentry); |
| 329 | if (rc) { | 330 | if (rc) { |
| @@ -336,7 +337,7 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, | |||
| 336 | ecryptfs_dentry->d_sb)->mount_crypt_stat; | 337 | ecryptfs_dentry->d_sb)->mount_crypt_stat; |
| 337 | if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) { | 338 | if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) { |
| 338 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) | 339 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) |
| 339 | file_size = (crypt_stat->num_header_bytes_at_front | 340 | file_size = (crypt_stat->metadata_size |
| 340 | + i_size_read(lower_dentry->d_inode)); | 341 | + i_size_read(lower_dentry->d_inode)); |
| 341 | else | 342 | else |
| 342 | file_size = i_size_read(lower_dentry->d_inode); | 343 | file_size = i_size_read(lower_dentry->d_inode); |
| @@ -388,9 +389,9 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 388 | mutex_unlock(&lower_dir_dentry->d_inode->i_mutex); | 389 | mutex_unlock(&lower_dir_dentry->d_inode->i_mutex); |
| 389 | if (IS_ERR(lower_dentry)) { | 390 | if (IS_ERR(lower_dentry)) { |
| 390 | rc = PTR_ERR(lower_dentry); | 391 | rc = PTR_ERR(lower_dentry); |
| 391 | printk(KERN_ERR "%s: lookup_one_len() returned [%d] on " | 392 | ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " |
| 392 | "lower_dentry = [%s]\n", __func__, rc, | 393 | "[%d] on lower_dentry = [%s]\n", __func__, rc, |
| 393 | ecryptfs_dentry->d_name.name); | 394 | encrypted_and_encoded_name); |
| 394 | goto out_d_drop; | 395 | goto out_d_drop; |
| 395 | } | 396 | } |
| 396 | if (lower_dentry->d_inode) | 397 | if (lower_dentry->d_inode) |
| @@ -417,9 +418,9 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 417 | mutex_unlock(&lower_dir_dentry->d_inode->i_mutex); | 418 | mutex_unlock(&lower_dir_dentry->d_inode->i_mutex); |
| 418 | if (IS_ERR(lower_dentry)) { | 419 | if (IS_ERR(lower_dentry)) { |
| 419 | rc = PTR_ERR(lower_dentry); | 420 | rc = PTR_ERR(lower_dentry); |
| 420 | printk(KERN_ERR "%s: lookup_one_len() returned [%d] on " | 421 | ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " |
| 421 | "lower_dentry = [%s]\n", __func__, rc, | 422 | "[%d] on lower_dentry = [%s]\n", __func__, rc, |
| 422 | encrypted_and_encoded_name); | 423 | encrypted_and_encoded_name); |
| 423 | goto out_d_drop; | 424 | goto out_d_drop; |
| 424 | } | 425 | } |
| 425 | lookup_and_interpose: | 426 | lookup_and_interpose: |
| @@ -456,8 +457,8 @@ static int ecryptfs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 456 | rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0); | 457 | rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0); |
| 457 | if (rc) | 458 | if (rc) |
| 458 | goto out_lock; | 459 | goto out_lock; |
| 459 | fsstack_copy_attr_times(dir, lower_new_dentry->d_inode); | 460 | fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode); |
| 460 | fsstack_copy_inode_size(dir, lower_new_dentry->d_inode); | 461 | fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode); |
| 461 | old_dentry->d_inode->i_nlink = | 462 | old_dentry->d_inode->i_nlink = |
| 462 | ecryptfs_inode_to_lower(old_dentry->d_inode)->i_nlink; | 463 | ecryptfs_inode_to_lower(old_dentry->d_inode)->i_nlink; |
| 463 | i_size_write(new_dentry->d_inode, file_size_save); | 464 | i_size_write(new_dentry->d_inode, file_size_save); |
| @@ -648,38 +649,17 @@ out_lock: | |||
| 648 | return rc; | 649 | return rc; |
| 649 | } | 650 | } |
| 650 | 651 | ||
| 651 | static int | 652 | static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf, |
| 652 | ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) | 653 | size_t *bufsiz) |
| 653 | { | 654 | { |
| 655 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); | ||
| 654 | char *lower_buf; | 656 | char *lower_buf; |
| 655 | size_t lower_bufsiz; | 657 | size_t lower_bufsiz = PATH_MAX; |
| 656 | struct dentry *lower_dentry; | ||
| 657 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat; | ||
| 658 | char *plaintext_name; | ||
| 659 | size_t plaintext_name_size; | ||
| 660 | mm_segment_t old_fs; | 658 | mm_segment_t old_fs; |
| 661 | int rc; | 659 | int rc; |
| 662 | 660 | ||
| 663 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | ||
| 664 | if (!lower_dentry->d_inode->i_op->readlink) { | ||
| 665 | rc = -EINVAL; | ||
| 666 | goto out; | ||
| 667 | } | ||
| 668 | mount_crypt_stat = &ecryptfs_superblock_to_private( | ||
| 669 | dentry->d_sb)->mount_crypt_stat; | ||
| 670 | /* | ||
| 671 | * If the lower filename is encrypted, it will result in a significantly | ||
| 672 | * longer name. If needed, truncate the name after decode and decrypt. | ||
| 673 | */ | ||
| 674 | if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) | ||
| 675 | lower_bufsiz = PATH_MAX; | ||
| 676 | else | ||
| 677 | lower_bufsiz = bufsiz; | ||
| 678 | /* Released in this function */ | ||
| 679 | lower_buf = kmalloc(lower_bufsiz, GFP_KERNEL); | 661 | lower_buf = kmalloc(lower_bufsiz, GFP_KERNEL); |
| 680 | if (lower_buf == NULL) { | 662 | if (!lower_buf) { |
| 681 | printk(KERN_ERR "%s: Out of memory whilst attempting to " | ||
| 682 | "kmalloc [%zd] bytes\n", __func__, lower_bufsiz); | ||
| 683 | rc = -ENOMEM; | 663 | rc = -ENOMEM; |
| 684 | goto out; | 664 | goto out; |
| 685 | } | 665 | } |
| @@ -689,29 +669,31 @@ ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) | |||
| 689 | (char __user *)lower_buf, | 669 | (char __user *)lower_buf, |
| 690 | lower_bufsiz); | 670 | lower_bufsiz); |
| 691 | set_fs(old_fs); | 671 | set_fs(old_fs); |
| 692 | if (rc >= 0) { | 672 | if (rc < 0) |
| 693 | rc = ecryptfs_decode_and_decrypt_filename(&plaintext_name, | 673 | goto out; |
| 694 | &plaintext_name_size, | 674 | lower_bufsiz = rc; |
| 695 | dentry, lower_buf, | 675 | rc = ecryptfs_decode_and_decrypt_filename(buf, bufsiz, dentry, |
| 696 | rc); | 676 | lower_buf, lower_bufsiz); |
| 697 | if (rc) { | 677 | out: |
| 698 | printk(KERN_ERR "%s: Error attempting to decode and " | ||
| 699 | "decrypt filename; rc = [%d]\n", __func__, | ||
| 700 | rc); | ||
| 701 | goto out_free_lower_buf; | ||
| 702 | } | ||
| 703 | /* Check for bufsiz <= 0 done in sys_readlinkat() */ | ||
| 704 | rc = copy_to_user(buf, plaintext_name, | ||
| 705 | min((size_t) bufsiz, plaintext_name_size)); | ||
| 706 | if (rc) | ||
| 707 | rc = -EFAULT; | ||
| 708 | else | ||
| 709 | rc = plaintext_name_size; | ||
| 710 | kfree(plaintext_name); | ||
| 711 | fsstack_copy_attr_atime(dentry->d_inode, lower_dentry->d_inode); | ||
| 712 | } | ||
| 713 | out_free_lower_buf: | ||
| 714 | kfree(lower_buf); | 678 | kfree(lower_buf); |
| 679 | return rc; | ||
| 680 | } | ||
| 681 | |||
| 682 | static int | ||
| 683 | ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) | ||
| 684 | { | ||
| 685 | char *kbuf; | ||
| 686 | size_t kbufsiz, copied; | ||
| 687 | int rc; | ||
| 688 | |||
| 689 | rc = ecryptfs_readlink_lower(dentry, &kbuf, &kbufsiz); | ||
| 690 | if (rc) | ||
| 691 | goto out; | ||
| 692 | copied = min_t(size_t, bufsiz, kbufsiz); | ||
| 693 | rc = copy_to_user(buf, kbuf, copied) ? -EFAULT : copied; | ||
| 694 | kfree(kbuf); | ||
| 695 | fsstack_copy_attr_atime(dentry->d_inode, | ||
| 696 | ecryptfs_dentry_to_lower(dentry)->d_inode); | ||
| 715 | out: | 697 | out: |
| 716 | return rc; | 698 | return rc; |
| 717 | } | 699 | } |
| @@ -769,7 +751,7 @@ upper_size_to_lower_size(struct ecryptfs_crypt_stat *crypt_stat, | |||
| 769 | { | 751 | { |
| 770 | loff_t lower_size; | 752 | loff_t lower_size; |
| 771 | 753 | ||
| 772 | lower_size = crypt_stat->num_header_bytes_at_front; | 754 | lower_size = ecryptfs_lower_header_size(crypt_stat); |
| 773 | if (upper_size != 0) { | 755 | if (upper_size != 0) { |
| 774 | loff_t num_extents; | 756 | loff_t num_extents; |
| 775 | 757 | ||
| @@ -1016,6 +998,28 @@ out: | |||
| 1016 | return rc; | 998 | return rc; |
| 1017 | } | 999 | } |
| 1018 | 1000 | ||
| 1001 | int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry, | ||
| 1002 | struct kstat *stat) | ||
| 1003 | { | ||
| 1004 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat; | ||
| 1005 | int rc = 0; | ||
| 1006 | |||
| 1007 | mount_crypt_stat = &ecryptfs_superblock_to_private( | ||
| 1008 | dentry->d_sb)->mount_crypt_stat; | ||
| 1009 | generic_fillattr(dentry->d_inode, stat); | ||
| 1010 | if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) { | ||
| 1011 | char *target; | ||
| 1012 | size_t targetsiz; | ||
| 1013 | |||
| 1014 | rc = ecryptfs_readlink_lower(dentry, &target, &targetsiz); | ||
| 1015 | if (!rc) { | ||
| 1016 | kfree(target); | ||
| 1017 | stat->size = targetsiz; | ||
| 1018 | } | ||
| 1019 | } | ||
| 1020 | return rc; | ||
| 1021 | } | ||
| 1022 | |||
| 1019 | int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry, | 1023 | int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry, |
| 1020 | struct kstat *stat) | 1024 | struct kstat *stat) |
| 1021 | { | 1025 | { |
| @@ -1040,7 +1044,7 @@ ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, | |||
| 1040 | 1044 | ||
| 1041 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 1045 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
| 1042 | if (!lower_dentry->d_inode->i_op->setxattr) { | 1046 | if (!lower_dentry->d_inode->i_op->setxattr) { |
| 1043 | rc = -ENOSYS; | 1047 | rc = -EOPNOTSUPP; |
| 1044 | goto out; | 1048 | goto out; |
| 1045 | } | 1049 | } |
| 1046 | mutex_lock(&lower_dentry->d_inode->i_mutex); | 1050 | mutex_lock(&lower_dentry->d_inode->i_mutex); |
| @@ -1058,7 +1062,7 @@ ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, | |||
| 1058 | int rc = 0; | 1062 | int rc = 0; |
| 1059 | 1063 | ||
| 1060 | if (!lower_dentry->d_inode->i_op->getxattr) { | 1064 | if (!lower_dentry->d_inode->i_op->getxattr) { |
| 1061 | rc = -ENOSYS; | 1065 | rc = -EOPNOTSUPP; |
| 1062 | goto out; | 1066 | goto out; |
| 1063 | } | 1067 | } |
| 1064 | mutex_lock(&lower_dentry->d_inode->i_mutex); | 1068 | mutex_lock(&lower_dentry->d_inode->i_mutex); |
| @@ -1085,7 +1089,7 @@ ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size) | |||
| 1085 | 1089 | ||
| 1086 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 1090 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
| 1087 | if (!lower_dentry->d_inode->i_op->listxattr) { | 1091 | if (!lower_dentry->d_inode->i_op->listxattr) { |
| 1088 | rc = -ENOSYS; | 1092 | rc = -EOPNOTSUPP; |
| 1089 | goto out; | 1093 | goto out; |
| 1090 | } | 1094 | } |
| 1091 | mutex_lock(&lower_dentry->d_inode->i_mutex); | 1095 | mutex_lock(&lower_dentry->d_inode->i_mutex); |
| @@ -1102,7 +1106,7 @@ static int ecryptfs_removexattr(struct dentry *dentry, const char *name) | |||
| 1102 | 1106 | ||
| 1103 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 1107 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
| 1104 | if (!lower_dentry->d_inode->i_op->removexattr) { | 1108 | if (!lower_dentry->d_inode->i_op->removexattr) { |
| 1105 | rc = -ENOSYS; | 1109 | rc = -EOPNOTSUPP; |
| 1106 | goto out; | 1110 | goto out; |
| 1107 | } | 1111 | } |
| 1108 | mutex_lock(&lower_dentry->d_inode->i_mutex); | 1112 | mutex_lock(&lower_dentry->d_inode->i_mutex); |
| @@ -1133,6 +1137,7 @@ const struct inode_operations ecryptfs_symlink_iops = { | |||
| 1133 | .put_link = ecryptfs_put_link, | 1137 | .put_link = ecryptfs_put_link, |
| 1134 | .permission = ecryptfs_permission, | 1138 | .permission = ecryptfs_permission, |
| 1135 | .setattr = ecryptfs_setattr, | 1139 | .setattr = ecryptfs_setattr, |
| 1140 | .getattr = ecryptfs_getattr_link, | ||
| 1136 | .setxattr = ecryptfs_setxattr, | 1141 | .setxattr = ecryptfs_setxattr, |
| 1137 | .getxattr = ecryptfs_getxattr, | 1142 | .getxattr = ecryptfs_getxattr, |
| 1138 | .listxattr = ecryptfs_listxattr, | 1143 | .listxattr = ecryptfs_listxattr, |
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index d491237c98e7..2ee9a3a7b68c 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
| @@ -83,6 +83,19 @@ out: | |||
| 83 | return rc; | 83 | return rc; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | static void strip_xattr_flag(char *page_virt, | ||
| 87 | struct ecryptfs_crypt_stat *crypt_stat) | ||
| 88 | { | ||
| 89 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) { | ||
| 90 | size_t written; | ||
| 91 | |||
| 92 | crypt_stat->flags &= ~ECRYPTFS_METADATA_IN_XATTR; | ||
| 93 | ecryptfs_write_crypt_stat_flags(page_virt, crypt_stat, | ||
| 94 | &written); | ||
| 95 | crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 86 | /** | 99 | /** |
| 87 | * Header Extent: | 100 | * Header Extent: |
| 88 | * Octets 0-7: Unencrypted file size (big-endian) | 101 | * Octets 0-7: Unencrypted file size (big-endian) |
| @@ -98,19 +111,6 @@ out: | |||
| 98 | * (big-endian) | 111 | * (big-endian) |
| 99 | * Octet 26: Begin RFC 2440 authentication token packet set | 112 | * Octet 26: Begin RFC 2440 authentication token packet set |
| 100 | */ | 113 | */ |
| 101 | static void set_header_info(char *page_virt, | ||
| 102 | struct ecryptfs_crypt_stat *crypt_stat) | ||
| 103 | { | ||
| 104 | size_t written; | ||
| 105 | size_t save_num_header_bytes_at_front = | ||
| 106 | crypt_stat->num_header_bytes_at_front; | ||
| 107 | |||
| 108 | crypt_stat->num_header_bytes_at_front = | ||
| 109 | ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; | ||
| 110 | ecryptfs_write_header_metadata(page_virt + 20, crypt_stat, &written); | ||
| 111 | crypt_stat->num_header_bytes_at_front = | ||
| 112 | save_num_header_bytes_at_front; | ||
| 113 | } | ||
| 114 | 114 | ||
| 115 | /** | 115 | /** |
| 116 | * ecryptfs_copy_up_encrypted_with_header | 116 | * ecryptfs_copy_up_encrypted_with_header |
| @@ -136,8 +136,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, | |||
| 136 | * num_extents_per_page) | 136 | * num_extents_per_page) |
| 137 | + extent_num_in_page); | 137 | + extent_num_in_page); |
| 138 | size_t num_header_extents_at_front = | 138 | size_t num_header_extents_at_front = |
| 139 | (crypt_stat->num_header_bytes_at_front | 139 | (crypt_stat->metadata_size / crypt_stat->extent_size); |
| 140 | / crypt_stat->extent_size); | ||
| 141 | 140 | ||
| 142 | if (view_extent_num < num_header_extents_at_front) { | 141 | if (view_extent_num < num_header_extents_at_front) { |
| 143 | /* This is a header extent */ | 142 | /* This is a header extent */ |
| @@ -147,9 +146,14 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, | |||
| 147 | memset(page_virt, 0, PAGE_CACHE_SIZE); | 146 | memset(page_virt, 0, PAGE_CACHE_SIZE); |
| 148 | /* TODO: Support more than one header extent */ | 147 | /* TODO: Support more than one header extent */ |
| 149 | if (view_extent_num == 0) { | 148 | if (view_extent_num == 0) { |
| 149 | size_t written; | ||
| 150 | |||
| 150 | rc = ecryptfs_read_xattr_region( | 151 | rc = ecryptfs_read_xattr_region( |
| 151 | page_virt, page->mapping->host); | 152 | page_virt, page->mapping->host); |
| 152 | set_header_info(page_virt, crypt_stat); | 153 | strip_xattr_flag(page_virt + 16, crypt_stat); |
| 154 | ecryptfs_write_header_metadata(page_virt + 20, | ||
| 155 | crypt_stat, | ||
| 156 | &written); | ||
| 153 | } | 157 | } |
| 154 | kunmap_atomic(page_virt, KM_USER0); | 158 | kunmap_atomic(page_virt, KM_USER0); |
| 155 | flush_dcache_page(page); | 159 | flush_dcache_page(page); |
| @@ -162,7 +166,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, | |||
| 162 | /* This is an encrypted data extent */ | 166 | /* This is an encrypted data extent */ |
| 163 | loff_t lower_offset = | 167 | loff_t lower_offset = |
| 164 | ((view_extent_num * crypt_stat->extent_size) | 168 | ((view_extent_num * crypt_stat->extent_size) |
| 165 | - crypt_stat->num_header_bytes_at_front); | 169 | - crypt_stat->metadata_size); |
| 166 | 170 | ||
| 167 | rc = ecryptfs_read_lower_page_segment( | 171 | rc = ecryptfs_read_lower_page_segment( |
| 168 | page, (lower_offset >> PAGE_CACHE_SHIFT), | 172 | page, (lower_offset >> PAGE_CACHE_SHIFT), |
diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index fcef41c1d2cf..278743c7716a 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c | |||
| @@ -86,7 +86,6 @@ static void ecryptfs_destroy_inode(struct inode *inode) | |||
| 86 | if (lower_dentry->d_inode) { | 86 | if (lower_dentry->d_inode) { |
| 87 | fput(inode_info->lower_file); | 87 | fput(inode_info->lower_file); |
| 88 | inode_info->lower_file = NULL; | 88 | inode_info->lower_file = NULL; |
| 89 | d_drop(lower_dentry); | ||
| 90 | } | 89 | } |
| 91 | } | 90 | } |
| 92 | ecryptfs_destroy_crypt_stat(&inode_info->crypt_stat); | 91 | ecryptfs_destroy_crypt_stat(&inode_info->crypt_stat); |
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 9dd126276c9f..ed9ba6fe04f5 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
| @@ -61,7 +61,7 @@ struct inode *jfs_iget(struct super_block *sb, unsigned long ino) | |||
| 61 | inode->i_op = &page_symlink_inode_operations; | 61 | inode->i_op = &page_symlink_inode_operations; |
| 62 | inode->i_mapping->a_ops = &jfs_aops; | 62 | inode->i_mapping->a_ops = &jfs_aops; |
| 63 | } else { | 63 | } else { |
| 64 | inode->i_op = &jfs_symlink_inode_operations; | 64 | inode->i_op = &jfs_fast_symlink_inode_operations; |
| 65 | /* | 65 | /* |
| 66 | * The inline data should be null-terminated, but | 66 | * The inline data should be null-terminated, but |
| 67 | * don't let on-disk corruption crash the kernel | 67 | * don't let on-disk corruption crash the kernel |
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index 6c4dfcbf3f55..9e2f6a721668 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c | |||
| @@ -196,7 +196,7 @@ int dbMount(struct inode *ipbmap) | |||
| 196 | bmp->db_maxag = le32_to_cpu(dbmp_le->dn_maxag); | 196 | bmp->db_maxag = le32_to_cpu(dbmp_le->dn_maxag); |
| 197 | bmp->db_agpref = le32_to_cpu(dbmp_le->dn_agpref); | 197 | bmp->db_agpref = le32_to_cpu(dbmp_le->dn_agpref); |
| 198 | bmp->db_aglevel = le32_to_cpu(dbmp_le->dn_aglevel); | 198 | bmp->db_aglevel = le32_to_cpu(dbmp_le->dn_aglevel); |
| 199 | bmp->db_agheigth = le32_to_cpu(dbmp_le->dn_agheigth); | 199 | bmp->db_agheight = le32_to_cpu(dbmp_le->dn_agheight); |
| 200 | bmp->db_agwidth = le32_to_cpu(dbmp_le->dn_agwidth); | 200 | bmp->db_agwidth = le32_to_cpu(dbmp_le->dn_agwidth); |
| 201 | bmp->db_agstart = le32_to_cpu(dbmp_le->dn_agstart); | 201 | bmp->db_agstart = le32_to_cpu(dbmp_le->dn_agstart); |
| 202 | bmp->db_agl2size = le32_to_cpu(dbmp_le->dn_agl2size); | 202 | bmp->db_agl2size = le32_to_cpu(dbmp_le->dn_agl2size); |
| @@ -288,7 +288,7 @@ int dbSync(struct inode *ipbmap) | |||
| 288 | dbmp_le->dn_maxag = cpu_to_le32(bmp->db_maxag); | 288 | dbmp_le->dn_maxag = cpu_to_le32(bmp->db_maxag); |
| 289 | dbmp_le->dn_agpref = cpu_to_le32(bmp->db_agpref); | 289 | dbmp_le->dn_agpref = cpu_to_le32(bmp->db_agpref); |
| 290 | dbmp_le->dn_aglevel = cpu_to_le32(bmp->db_aglevel); | 290 | dbmp_le->dn_aglevel = cpu_to_le32(bmp->db_aglevel); |
| 291 | dbmp_le->dn_agheigth = cpu_to_le32(bmp->db_agheigth); | 291 | dbmp_le->dn_agheight = cpu_to_le32(bmp->db_agheight); |
| 292 | dbmp_le->dn_agwidth = cpu_to_le32(bmp->db_agwidth); | 292 | dbmp_le->dn_agwidth = cpu_to_le32(bmp->db_agwidth); |
| 293 | dbmp_le->dn_agstart = cpu_to_le32(bmp->db_agstart); | 293 | dbmp_le->dn_agstart = cpu_to_le32(bmp->db_agstart); |
| 294 | dbmp_le->dn_agl2size = cpu_to_le32(bmp->db_agl2size); | 294 | dbmp_le->dn_agl2size = cpu_to_le32(bmp->db_agl2size); |
| @@ -1441,7 +1441,7 @@ dbAllocAG(struct bmap * bmp, int agno, s64 nblocks, int l2nb, s64 * results) | |||
| 1441 | * tree index of this allocation group within the control page. | 1441 | * tree index of this allocation group within the control page. |
| 1442 | */ | 1442 | */ |
| 1443 | agperlev = | 1443 | agperlev = |
| 1444 | (1 << (L2LPERCTL - (bmp->db_agheigth << 1))) / bmp->db_agwidth; | 1444 | (1 << (L2LPERCTL - (bmp->db_agheight << 1))) / bmp->db_agwidth; |
| 1445 | ti = bmp->db_agstart + bmp->db_agwidth * (agno & (agperlev - 1)); | 1445 | ti = bmp->db_agstart + bmp->db_agwidth * (agno & (agperlev - 1)); |
| 1446 | 1446 | ||
| 1447 | /* dmap control page trees fan-out by 4 and a single allocation | 1447 | /* dmap control page trees fan-out by 4 and a single allocation |
| @@ -1460,7 +1460,7 @@ dbAllocAG(struct bmap * bmp, int agno, s64 nblocks, int l2nb, s64 * results) | |||
| 1460 | * the subtree to find the leftmost leaf that describes this | 1460 | * the subtree to find the leftmost leaf that describes this |
| 1461 | * free space. | 1461 | * free space. |
| 1462 | */ | 1462 | */ |
| 1463 | for (k = bmp->db_agheigth; k > 0; k--) { | 1463 | for (k = bmp->db_agheight; k > 0; k--) { |
| 1464 | for (n = 0, m = (ti << 2) + 1; n < 4; n++) { | 1464 | for (n = 0, m = (ti << 2) + 1; n < 4; n++) { |
| 1465 | if (l2nb <= dcp->stree[m + n]) { | 1465 | if (l2nb <= dcp->stree[m + n]) { |
| 1466 | ti = m + n; | 1466 | ti = m + n; |
| @@ -3607,7 +3607,7 @@ void dbFinalizeBmap(struct inode *ipbmap) | |||
| 3607 | } | 3607 | } |
| 3608 | 3608 | ||
| 3609 | /* | 3609 | /* |
| 3610 | * compute db_aglevel, db_agheigth, db_width, db_agstart: | 3610 | * compute db_aglevel, db_agheight, db_width, db_agstart: |
| 3611 | * an ag is covered in aglevel dmapctl summary tree, | 3611 | * an ag is covered in aglevel dmapctl summary tree, |
| 3612 | * at agheight level height (from leaf) with agwidth number of nodes | 3612 | * at agheight level height (from leaf) with agwidth number of nodes |
| 3613 | * each, which starts at agstart index node of the smmary tree node | 3613 | * each, which starts at agstart index node of the smmary tree node |
| @@ -3616,9 +3616,9 @@ void dbFinalizeBmap(struct inode *ipbmap) | |||
| 3616 | bmp->db_aglevel = BMAPSZTOLEV(bmp->db_agsize); | 3616 | bmp->db_aglevel = BMAPSZTOLEV(bmp->db_agsize); |
| 3617 | l2nl = | 3617 | l2nl = |
| 3618 | bmp->db_agl2size - (L2BPERDMAP + bmp->db_aglevel * L2LPERCTL); | 3618 | bmp->db_agl2size - (L2BPERDMAP + bmp->db_aglevel * L2LPERCTL); |
| 3619 | bmp->db_agheigth = l2nl >> 1; | 3619 | bmp->db_agheight = l2nl >> 1; |
| 3620 | bmp->db_agwidth = 1 << (l2nl - (bmp->db_agheigth << 1)); | 3620 | bmp->db_agwidth = 1 << (l2nl - (bmp->db_agheight << 1)); |
| 3621 | for (i = 5 - bmp->db_agheigth, bmp->db_agstart = 0, n = 1; i > 0; | 3621 | for (i = 5 - bmp->db_agheight, bmp->db_agstart = 0, n = 1; i > 0; |
| 3622 | i--) { | 3622 | i--) { |
| 3623 | bmp->db_agstart += n; | 3623 | bmp->db_agstart += n; |
| 3624 | n <<= 2; | 3624 | n <<= 2; |
diff --git a/fs/jfs/jfs_dmap.h b/fs/jfs/jfs_dmap.h index 1a6eb41569bc..6dcb906c55d8 100644 --- a/fs/jfs/jfs_dmap.h +++ b/fs/jfs/jfs_dmap.h | |||
| @@ -210,7 +210,7 @@ struct dbmap_disk { | |||
| 210 | __le32 dn_maxag; /* 4: max active alloc group number */ | 210 | __le32 dn_maxag; /* 4: max active alloc group number */ |
| 211 | __le32 dn_agpref; /* 4: preferred alloc group (hint) */ | 211 | __le32 dn_agpref; /* 4: preferred alloc group (hint) */ |
| 212 | __le32 dn_aglevel; /* 4: dmapctl level holding the AG */ | 212 | __le32 dn_aglevel; /* 4: dmapctl level holding the AG */ |
| 213 | __le32 dn_agheigth; /* 4: height in dmapctl of the AG */ | 213 | __le32 dn_agheight; /* 4: height in dmapctl of the AG */ |
| 214 | __le32 dn_agwidth; /* 4: width in dmapctl of the AG */ | 214 | __le32 dn_agwidth; /* 4: width in dmapctl of the AG */ |
| 215 | __le32 dn_agstart; /* 4: start tree index at AG height */ | 215 | __le32 dn_agstart; /* 4: start tree index at AG height */ |
| 216 | __le32 dn_agl2size; /* 4: l2 num of blks per alloc group */ | 216 | __le32 dn_agl2size; /* 4: l2 num of blks per alloc group */ |
| @@ -229,7 +229,7 @@ struct dbmap { | |||
| 229 | int dn_maxag; /* max active alloc group number */ | 229 | int dn_maxag; /* max active alloc group number */ |
| 230 | int dn_agpref; /* preferred alloc group (hint) */ | 230 | int dn_agpref; /* preferred alloc group (hint) */ |
| 231 | int dn_aglevel; /* dmapctl level holding the AG */ | 231 | int dn_aglevel; /* dmapctl level holding the AG */ |
| 232 | int dn_agheigth; /* height in dmapctl of the AG */ | 232 | int dn_agheight; /* height in dmapctl of the AG */ |
| 233 | int dn_agwidth; /* width in dmapctl of the AG */ | 233 | int dn_agwidth; /* width in dmapctl of the AG */ |
| 234 | int dn_agstart; /* start tree index at AG height */ | 234 | int dn_agstart; /* start tree index at AG height */ |
| 235 | int dn_agl2size; /* l2 num of blks per alloc group */ | 235 | int dn_agl2size; /* l2 num of blks per alloc group */ |
| @@ -255,7 +255,7 @@ struct bmap { | |||
| 255 | #define db_agsize db_bmap.dn_agsize | 255 | #define db_agsize db_bmap.dn_agsize |
| 256 | #define db_agl2size db_bmap.dn_agl2size | 256 | #define db_agl2size db_bmap.dn_agl2size |
| 257 | #define db_agwidth db_bmap.dn_agwidth | 257 | #define db_agwidth db_bmap.dn_agwidth |
| 258 | #define db_agheigth db_bmap.dn_agheigth | 258 | #define db_agheight db_bmap.dn_agheight |
| 259 | #define db_agstart db_bmap.dn_agstart | 259 | #define db_agstart db_bmap.dn_agstart |
| 260 | #define db_numag db_bmap.dn_numag | 260 | #define db_numag db_bmap.dn_numag |
| 261 | #define db_maxlevel db_bmap.dn_maxlevel | 261 | #define db_maxlevel db_bmap.dn_maxlevel |
diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h index 79e2c79661df..9e6bda30a6e8 100644 --- a/fs/jfs/jfs_inode.h +++ b/fs/jfs/jfs_inode.h | |||
| @@ -48,5 +48,6 @@ extern const struct file_operations jfs_dir_operations; | |||
| 48 | extern const struct inode_operations jfs_file_inode_operations; | 48 | extern const struct inode_operations jfs_file_inode_operations; |
| 49 | extern const struct file_operations jfs_file_operations; | 49 | extern const struct file_operations jfs_file_operations; |
| 50 | extern const struct inode_operations jfs_symlink_inode_operations; | 50 | extern const struct inode_operations jfs_symlink_inode_operations; |
| 51 | extern const struct inode_operations jfs_fast_symlink_inode_operations; | ||
| 51 | extern const struct dentry_operations jfs_ci_dentry_operations; | 52 | extern const struct dentry_operations jfs_ci_dentry_operations; |
| 52 | #endif /* _H_JFS_INODE */ | 53 | #endif /* _H_JFS_INODE */ |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 4a3e9f39c21d..a9cf8e8675be 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
| @@ -956,7 +956,7 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, | |||
| 956 | */ | 956 | */ |
| 957 | 957 | ||
| 958 | if (ssize <= IDATASIZE) { | 958 | if (ssize <= IDATASIZE) { |
| 959 | ip->i_op = &jfs_symlink_inode_operations; | 959 | ip->i_op = &jfs_fast_symlink_inode_operations; |
| 960 | 960 | ||
| 961 | i_fastsymlink = JFS_IP(ip)->i_inline; | 961 | i_fastsymlink = JFS_IP(ip)->i_inline; |
| 962 | memcpy(i_fastsymlink, name, ssize); | 962 | memcpy(i_fastsymlink, name, ssize); |
| @@ -978,7 +978,7 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, | |||
| 978 | else { | 978 | else { |
| 979 | jfs_info("jfs_symlink: allocate extent ip:0x%p", ip); | 979 | jfs_info("jfs_symlink: allocate extent ip:0x%p", ip); |
| 980 | 980 | ||
| 981 | ip->i_op = &page_symlink_inode_operations; | 981 | ip->i_op = &jfs_symlink_inode_operations; |
| 982 | ip->i_mapping->a_ops = &jfs_aops; | 982 | ip->i_mapping->a_ops = &jfs_aops; |
| 983 | 983 | ||
| 984 | /* | 984 | /* |
diff --git a/fs/jfs/resize.c b/fs/jfs/resize.c index 7f24a0bb08ca..1aba0039f1c9 100644 --- a/fs/jfs/resize.c +++ b/fs/jfs/resize.c | |||
| @@ -81,6 +81,7 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) | |||
| 81 | struct inode *iplist[1]; | 81 | struct inode *iplist[1]; |
| 82 | struct jfs_superblock *j_sb, *j_sb2; | 82 | struct jfs_superblock *j_sb, *j_sb2; |
| 83 | uint old_agsize; | 83 | uint old_agsize; |
| 84 | int agsizechanged = 0; | ||
| 84 | struct buffer_head *bh, *bh2; | 85 | struct buffer_head *bh, *bh2; |
| 85 | 86 | ||
| 86 | /* If the volume hasn't grown, get out now */ | 87 | /* If the volume hasn't grown, get out now */ |
| @@ -333,6 +334,9 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) | |||
| 333 | */ | 334 | */ |
| 334 | if ((rc = dbExtendFS(ipbmap, XAddress, nblocks))) | 335 | if ((rc = dbExtendFS(ipbmap, XAddress, nblocks))) |
| 335 | goto error_out; | 336 | goto error_out; |
| 337 | |||
| 338 | agsizechanged |= (bmp->db_agsize != old_agsize); | ||
| 339 | |||
| 336 | /* | 340 | /* |
| 337 | * the map now has extended to cover additional nblocks: | 341 | * the map now has extended to cover additional nblocks: |
| 338 | * dn_mapsize = oldMapsize + nblocks; | 342 | * dn_mapsize = oldMapsize + nblocks; |
| @@ -432,7 +436,7 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) | |||
| 432 | * will correctly identify the new ag); | 436 | * will correctly identify the new ag); |
| 433 | */ | 437 | */ |
| 434 | /* if new AG size the same as old AG size, done! */ | 438 | /* if new AG size the same as old AG size, done! */ |
| 435 | if (bmp->db_agsize != old_agsize) { | 439 | if (agsizechanged) { |
| 436 | if ((rc = diExtendFS(ipimap, ipbmap))) | 440 | if ((rc = diExtendFS(ipimap, ipbmap))) |
| 437 | goto error_out; | 441 | goto error_out; |
| 438 | 442 | ||
diff --git a/fs/jfs/symlink.c b/fs/jfs/symlink.c index 4af1a05aad0a..205b946d8e0d 100644 --- a/fs/jfs/symlink.c +++ b/fs/jfs/symlink.c | |||
| @@ -29,9 +29,21 @@ static void *jfs_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
| 29 | return NULL; | 29 | return NULL; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | const struct inode_operations jfs_symlink_inode_operations = { | 32 | const struct inode_operations jfs_fast_symlink_inode_operations = { |
| 33 | .readlink = generic_readlink, | 33 | .readlink = generic_readlink, |
| 34 | .follow_link = jfs_follow_link, | 34 | .follow_link = jfs_follow_link, |
| 35 | .setattr = jfs_setattr, | ||
| 36 | .setxattr = jfs_setxattr, | ||
| 37 | .getxattr = jfs_getxattr, | ||
| 38 | .listxattr = jfs_listxattr, | ||
| 39 | .removexattr = jfs_removexattr, | ||
| 40 | }; | ||
| 41 | |||
| 42 | const struct inode_operations jfs_symlink_inode_operations = { | ||
| 43 | .readlink = generic_readlink, | ||
| 44 | .follow_link = page_follow_link_light, | ||
| 45 | .put_link = page_put_link, | ||
| 46 | .setattr = jfs_setattr, | ||
| 35 | .setxattr = jfs_setxattr, | 47 | .setxattr = jfs_setxattr, |
| 36 | .getxattr = jfs_getxattr, | 48 | .getxattr = jfs_getxattr, |
| 37 | .listxattr = jfs_listxattr, | 49 | .listxattr = jfs_listxattr, |
diff --git a/fs/logfs/gc.c b/fs/logfs/gc.c index 84e36f52fe95..76c242fbe1b0 100644 --- a/fs/logfs/gc.c +++ b/fs/logfs/gc.c | |||
| @@ -459,6 +459,14 @@ static void __logfs_gc_pass(struct super_block *sb, int target) | |||
| 459 | struct logfs_block *block; | 459 | struct logfs_block *block; |
| 460 | int round, progress, last_progress = 0; | 460 | int round, progress, last_progress = 0; |
| 461 | 461 | ||
| 462 | /* | ||
| 463 | * Doing too many changes to the segfile at once would result | ||
| 464 | * in a large number of aliases. Write the journal before | ||
| 465 | * things get out of hand. | ||
| 466 | */ | ||
| 467 | if (super->s_shadow_tree.no_shadowed_segments >= MAX_OBJ_ALIASES) | ||
| 468 | logfs_write_anchor(sb); | ||
| 469 | |||
| 462 | if (no_free_segments(sb) >= target && | 470 | if (no_free_segments(sb) >= target && |
| 463 | super->s_no_object_aliases < MAX_OBJ_ALIASES) | 471 | super->s_no_object_aliases < MAX_OBJ_ALIASES) |
| 464 | return; | 472 | return; |
diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c index 33bd260b8309..fb0a613f885b 100644 --- a/fs/logfs/journal.c +++ b/fs/logfs/journal.c | |||
| @@ -389,7 +389,10 @@ static void journal_get_erase_count(struct logfs_area *area) | |||
| 389 | static int journal_erase_segment(struct logfs_area *area) | 389 | static int journal_erase_segment(struct logfs_area *area) |
| 390 | { | 390 | { |
| 391 | struct super_block *sb = area->a_sb; | 391 | struct super_block *sb = area->a_sb; |
| 392 | struct logfs_segment_header sh; | 392 | union { |
| 393 | struct logfs_segment_header sh; | ||
| 394 | unsigned char c[ALIGN(sizeof(struct logfs_segment_header), 16)]; | ||
| 395 | } u; | ||
| 393 | u64 ofs; | 396 | u64 ofs; |
| 394 | int err; | 397 | int err; |
| 395 | 398 | ||
| @@ -397,20 +400,21 @@ static int journal_erase_segment(struct logfs_area *area) | |||
| 397 | if (err) | 400 | if (err) |
| 398 | return err; | 401 | return err; |
| 399 | 402 | ||
| 400 | sh.pad = 0; | 403 | memset(&u, 0, sizeof(u)); |
| 401 | sh.type = SEG_JOURNAL; | 404 | u.sh.pad = 0; |
| 402 | sh.level = 0; | 405 | u.sh.type = SEG_JOURNAL; |
| 403 | sh.segno = cpu_to_be32(area->a_segno); | 406 | u.sh.level = 0; |
| 404 | sh.ec = cpu_to_be32(area->a_erase_count); | 407 | u.sh.segno = cpu_to_be32(area->a_segno); |
| 405 | sh.gec = cpu_to_be64(logfs_super(sb)->s_gec); | 408 | u.sh.ec = cpu_to_be32(area->a_erase_count); |
| 406 | sh.crc = logfs_crc32(&sh, sizeof(sh), 4); | 409 | u.sh.gec = cpu_to_be64(logfs_super(sb)->s_gec); |
| 410 | u.sh.crc = logfs_crc32(&u.sh, sizeof(u.sh), 4); | ||
| 407 | 411 | ||
| 408 | /* This causes a bug in segment.c. Not yet. */ | 412 | /* This causes a bug in segment.c. Not yet. */ |
| 409 | //logfs_set_segment_erased(sb, area->a_segno, area->a_erase_count, 0); | 413 | //logfs_set_segment_erased(sb, area->a_segno, area->a_erase_count, 0); |
| 410 | 414 | ||
| 411 | ofs = dev_ofs(sb, area->a_segno, 0); | 415 | ofs = dev_ofs(sb, area->a_segno, 0); |
| 412 | area->a_used_bytes = ALIGN(sizeof(sh), 16); | 416 | area->a_used_bytes = sizeof(u); |
| 413 | logfs_buf_write(area, ofs, &sh, sizeof(sh)); | 417 | logfs_buf_write(area, ofs, &u, sizeof(u)); |
| 414 | return 0; | 418 | return 0; |
| 415 | } | 419 | } |
| 416 | 420 | ||
| @@ -494,6 +498,8 @@ static void account_shadows(struct super_block *sb) | |||
| 494 | 498 | ||
| 495 | btree_grim_visitor64(&tree->new, (unsigned long)sb, account_shadow); | 499 | btree_grim_visitor64(&tree->new, (unsigned long)sb, account_shadow); |
| 496 | btree_grim_visitor64(&tree->old, (unsigned long)sb, account_shadow); | 500 | btree_grim_visitor64(&tree->old, (unsigned long)sb, account_shadow); |
| 501 | btree_grim_visitor32(&tree->segment_map, 0, NULL); | ||
| 502 | tree->no_shadowed_segments = 0; | ||
| 497 | 503 | ||
| 498 | if (li->li_block) { | 504 | if (li->li_block) { |
| 499 | /* | 505 | /* |
| @@ -607,9 +613,9 @@ static size_t __logfs_write_je(struct super_block *sb, void *buf, u16 type, | |||
| 607 | if (len == 0) | 613 | if (len == 0) |
| 608 | return logfs_write_header(super, header, 0, type); | 614 | return logfs_write_header(super, header, 0, type); |
| 609 | 615 | ||
| 616 | BUG_ON(len > sb->s_blocksize); | ||
| 610 | compr_len = logfs_compress(buf, data, len, sb->s_blocksize); | 617 | compr_len = logfs_compress(buf, data, len, sb->s_blocksize); |
| 611 | if (compr_len < 0 || type == JE_ANCHOR) { | 618 | if (compr_len < 0 || type == JE_ANCHOR) { |
| 612 | BUG_ON(len > sb->s_blocksize); | ||
| 613 | memcpy(data, buf, len); | 619 | memcpy(data, buf, len); |
| 614 | compr_len = len; | 620 | compr_len = len; |
| 615 | compr = COMPR_NONE; | 621 | compr = COMPR_NONE; |
| @@ -661,6 +667,7 @@ static int logfs_write_je_buf(struct super_block *sb, void *buf, u16 type, | |||
| 661 | if (ofs < 0) | 667 | if (ofs < 0) |
| 662 | return ofs; | 668 | return ofs; |
| 663 | logfs_buf_write(area, ofs, super->s_compressed_je, len); | 669 | logfs_buf_write(area, ofs, super->s_compressed_je, len); |
| 670 | BUG_ON(super->s_no_je >= MAX_JOURNAL_ENTRIES); | ||
| 664 | super->s_je_array[super->s_no_je++] = cpu_to_be64(ofs); | 671 | super->s_je_array[super->s_no_je++] = cpu_to_be64(ofs); |
| 665 | return 0; | 672 | return 0; |
| 666 | } | 673 | } |
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h index b84b0eec6024..0a3df1a0c936 100644 --- a/fs/logfs/logfs.h +++ b/fs/logfs/logfs.h | |||
| @@ -257,10 +257,14 @@ struct logfs_shadow { | |||
| 257 | * struct shadow_tree | 257 | * struct shadow_tree |
| 258 | * @new: shadows where old_ofs==0, indexed by new_ofs | 258 | * @new: shadows where old_ofs==0, indexed by new_ofs |
| 259 | * @old: shadows where old_ofs!=0, indexed by old_ofs | 259 | * @old: shadows where old_ofs!=0, indexed by old_ofs |
| 260 | * @segment_map: bitfield of segments containing shadows | ||
| 261 | * @no_shadowed_segment: number of segments containing shadows | ||
| 260 | */ | 262 | */ |
| 261 | struct shadow_tree { | 263 | struct shadow_tree { |
| 262 | struct btree_head64 new; | 264 | struct btree_head64 new; |
| 263 | struct btree_head64 old; | 265 | struct btree_head64 old; |
| 266 | struct btree_head32 segment_map; | ||
| 267 | int no_shadowed_segments; | ||
| 264 | }; | 268 | }; |
| 265 | 269 | ||
| 266 | struct object_alias_item { | 270 | struct object_alias_item { |
| @@ -305,13 +309,14 @@ typedef int write_alias_t(struct super_block *sb, u64 ino, u64 bix, | |||
| 305 | level_t level, int child_no, __be64 val); | 309 | level_t level, int child_no, __be64 val); |
| 306 | struct logfs_block_ops { | 310 | struct logfs_block_ops { |
| 307 | void (*write_block)(struct logfs_block *block); | 311 | void (*write_block)(struct logfs_block *block); |
| 308 | gc_level_t (*block_level)(struct logfs_block *block); | ||
| 309 | void (*free_block)(struct super_block *sb, struct logfs_block*block); | 312 | void (*free_block)(struct super_block *sb, struct logfs_block*block); |
| 310 | int (*write_alias)(struct super_block *sb, | 313 | int (*write_alias)(struct super_block *sb, |
| 311 | struct logfs_block *block, | 314 | struct logfs_block *block, |
| 312 | write_alias_t *write_one_alias); | 315 | write_alias_t *write_one_alias); |
| 313 | }; | 316 | }; |
| 314 | 317 | ||
| 318 | #define MAX_JOURNAL_ENTRIES 256 | ||
| 319 | |||
| 315 | struct logfs_super { | 320 | struct logfs_super { |
| 316 | struct mtd_info *s_mtd; /* underlying device */ | 321 | struct mtd_info *s_mtd; /* underlying device */ |
| 317 | struct block_device *s_bdev; /* underlying device */ | 322 | struct block_device *s_bdev; /* underlying device */ |
| @@ -378,7 +383,7 @@ struct logfs_super { | |||
| 378 | u32 s_journal_ec[LOGFS_JOURNAL_SEGS]; /* journal erasecounts */ | 383 | u32 s_journal_ec[LOGFS_JOURNAL_SEGS]; /* journal erasecounts */ |
| 379 | u64 s_last_version; | 384 | u64 s_last_version; |
| 380 | struct logfs_area *s_journal_area; /* open journal segment */ | 385 | struct logfs_area *s_journal_area; /* open journal segment */ |
| 381 | __be64 s_je_array[64]; | 386 | __be64 s_je_array[MAX_JOURNAL_ENTRIES]; |
| 382 | int s_no_je; | 387 | int s_no_je; |
| 383 | 388 | ||
| 384 | int s_sum_index; /* for the 12 summaries */ | 389 | int s_sum_index; /* for the 12 summaries */ |
| @@ -722,4 +727,10 @@ static inline struct logfs_area *get_area(struct super_block *sb, | |||
| 722 | return logfs_super(sb)->s_area[(__force u8)gc_level]; | 727 | return logfs_super(sb)->s_area[(__force u8)gc_level]; |
| 723 | } | 728 | } |
| 724 | 729 | ||
| 730 | static inline void logfs_mempool_destroy(mempool_t *pool) | ||
| 731 | { | ||
| 732 | if (pool) | ||
| 733 | mempool_destroy(pool); | ||
| 734 | } | ||
| 735 | |||
| 725 | #endif | 736 | #endif |
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index bff40253dfb2..3159db6958e5 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c | |||
| @@ -430,25 +430,6 @@ static void inode_write_block(struct logfs_block *block) | |||
| 430 | } | 430 | } |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | static gc_level_t inode_block_level(struct logfs_block *block) | ||
| 434 | { | ||
| 435 | BUG_ON(block->inode->i_ino == LOGFS_INO_MASTER); | ||
| 436 | return GC_LEVEL(LOGFS_MAX_LEVELS); | ||
| 437 | } | ||
| 438 | |||
| 439 | static gc_level_t indirect_block_level(struct logfs_block *block) | ||
| 440 | { | ||
| 441 | struct page *page; | ||
| 442 | struct inode *inode; | ||
| 443 | u64 bix; | ||
| 444 | level_t level; | ||
| 445 | |||
| 446 | page = block->page; | ||
| 447 | inode = page->mapping->host; | ||
| 448 | logfs_unpack_index(page->index, &bix, &level); | ||
| 449 | return expand_level(inode->i_ino, level); | ||
| 450 | } | ||
| 451 | |||
| 452 | /* | 433 | /* |
| 453 | * This silences a false, yet annoying gcc warning. I hate it when my editor | 434 | * This silences a false, yet annoying gcc warning. I hate it when my editor |
| 454 | * jumps into bitops.h each time I recompile this file. | 435 | * jumps into bitops.h each time I recompile this file. |
| @@ -587,14 +568,12 @@ static void indirect_free_block(struct super_block *sb, | |||
| 587 | 568 | ||
| 588 | static struct logfs_block_ops inode_block_ops = { | 569 | static struct logfs_block_ops inode_block_ops = { |
| 589 | .write_block = inode_write_block, | 570 | .write_block = inode_write_block, |
| 590 | .block_level = inode_block_level, | ||
| 591 | .free_block = inode_free_block, | 571 | .free_block = inode_free_block, |
| 592 | .write_alias = inode_write_alias, | 572 | .write_alias = inode_write_alias, |
| 593 | }; | 573 | }; |
| 594 | 574 | ||
| 595 | struct logfs_block_ops indirect_block_ops = { | 575 | struct logfs_block_ops indirect_block_ops = { |
| 596 | .write_block = indirect_write_block, | 576 | .write_block = indirect_write_block, |
| 597 | .block_level = indirect_block_level, | ||
| 598 | .free_block = indirect_free_block, | 577 | .free_block = indirect_free_block, |
| 599 | .write_alias = indirect_write_alias, | 578 | .write_alias = indirect_write_alias, |
| 600 | }; | 579 | }; |
| @@ -1241,6 +1220,18 @@ static void free_shadow(struct inode *inode, struct logfs_shadow *shadow) | |||
| 1241 | mempool_free(shadow, super->s_shadow_pool); | 1220 | mempool_free(shadow, super->s_shadow_pool); |
| 1242 | } | 1221 | } |
| 1243 | 1222 | ||
| 1223 | static void mark_segment(struct shadow_tree *tree, u32 segno) | ||
| 1224 | { | ||
| 1225 | int err; | ||
| 1226 | |||
| 1227 | if (!btree_lookup32(&tree->segment_map, segno)) { | ||
| 1228 | err = btree_insert32(&tree->segment_map, segno, (void *)1, | ||
| 1229 | GFP_NOFS); | ||
| 1230 | BUG_ON(err); | ||
| 1231 | tree->no_shadowed_segments++; | ||
| 1232 | } | ||
| 1233 | } | ||
| 1234 | |||
| 1244 | /** | 1235 | /** |
| 1245 | * fill_shadow_tree - Propagate shadow tree changes due to a write | 1236 | * fill_shadow_tree - Propagate shadow tree changes due to a write |
| 1246 | * @inode: Inode owning the page | 1237 | * @inode: Inode owning the page |
| @@ -1288,6 +1279,8 @@ static void fill_shadow_tree(struct inode *inode, struct page *page, | |||
| 1288 | 1279 | ||
| 1289 | super->s_dirty_used_bytes += shadow->new_len; | 1280 | super->s_dirty_used_bytes += shadow->new_len; |
| 1290 | super->s_dirty_free_bytes += shadow->old_len; | 1281 | super->s_dirty_free_bytes += shadow->old_len; |
| 1282 | mark_segment(tree, shadow->old_ofs >> super->s_segshift); | ||
| 1283 | mark_segment(tree, shadow->new_ofs >> super->s_segshift); | ||
| 1291 | } | 1284 | } |
| 1292 | } | 1285 | } |
| 1293 | 1286 | ||
| @@ -1845,19 +1838,37 @@ static int __logfs_truncate(struct inode *inode, u64 size) | |||
| 1845 | return logfs_truncate_direct(inode, size); | 1838 | return logfs_truncate_direct(inode, size); |
| 1846 | } | 1839 | } |
| 1847 | 1840 | ||
| 1848 | int logfs_truncate(struct inode *inode, u64 size) | 1841 | /* |
| 1842 | * Truncate, by changing the segment file, can consume a fair amount | ||
| 1843 | * of resources. So back off from time to time and do some GC. | ||
| 1844 | * 8 or 2048 blocks should be well within safety limits even if | ||
| 1845 | * every single block resided in a different segment. | ||
| 1846 | */ | ||
| 1847 | #define TRUNCATE_STEP (8 * 1024 * 1024) | ||
| 1848 | int logfs_truncate(struct inode *inode, u64 target) | ||
| 1849 | { | 1849 | { |
| 1850 | struct super_block *sb = inode->i_sb; | 1850 | struct super_block *sb = inode->i_sb; |
| 1851 | int err; | 1851 | u64 size = i_size_read(inode); |
| 1852 | int err = 0; | ||
| 1852 | 1853 | ||
| 1853 | logfs_get_wblocks(sb, NULL, 1); | 1854 | size = ALIGN(size, TRUNCATE_STEP); |
| 1854 | err = __logfs_truncate(inode, size); | 1855 | while (size > target) { |
| 1855 | if (!err) | 1856 | if (size > TRUNCATE_STEP) |
| 1856 | err = __logfs_write_inode(inode, 0); | 1857 | size -= TRUNCATE_STEP; |
| 1857 | logfs_put_wblocks(sb, NULL, 1); | 1858 | else |
| 1859 | size = 0; | ||
| 1860 | if (size < target) | ||
| 1861 | size = target; | ||
| 1862 | |||
| 1863 | logfs_get_wblocks(sb, NULL, 1); | ||
| 1864 | err = __logfs_truncate(inode, target); | ||
| 1865 | if (!err) | ||
| 1866 | err = __logfs_write_inode(inode, 0); | ||
| 1867 | logfs_put_wblocks(sb, NULL, 1); | ||
| 1868 | } | ||
| 1858 | 1869 | ||
| 1859 | if (!err) | 1870 | if (!err) |
| 1860 | err = vmtruncate(inode, size); | 1871 | err = vmtruncate(inode, target); |
| 1861 | 1872 | ||
| 1862 | /* I don't trust error recovery yet. */ | 1873 | /* I don't trust error recovery yet. */ |
| 1863 | WARN_ON(err); | 1874 | WARN_ON(err); |
| @@ -2251,8 +2262,6 @@ void logfs_cleanup_rw(struct super_block *sb) | |||
| 2251 | struct logfs_super *super = logfs_super(sb); | 2262 | struct logfs_super *super = logfs_super(sb); |
| 2252 | 2263 | ||
| 2253 | destroy_meta_inode(super->s_segfile_inode); | 2264 | destroy_meta_inode(super->s_segfile_inode); |
| 2254 | if (super->s_block_pool) | 2265 | logfs_mempool_destroy(super->s_block_pool); |
| 2255 | mempool_destroy(super->s_block_pool); | 2266 | logfs_mempool_destroy(super->s_shadow_pool); |
| 2256 | if (super->s_shadow_pool) | ||
| 2257 | mempool_destroy(super->s_shadow_pool); | ||
| 2258 | } | 2267 | } |
diff --git a/fs/logfs/segment.c b/fs/logfs/segment.c index 801a3a141625..f77ce2b470ba 100644 --- a/fs/logfs/segment.c +++ b/fs/logfs/segment.c | |||
| @@ -183,14 +183,8 @@ static int btree_write_alias(struct super_block *sb, struct logfs_block *block, | |||
| 183 | return 0; | 183 | return 0; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | static gc_level_t btree_block_level(struct logfs_block *block) | ||
| 187 | { | ||
| 188 | return expand_level(block->ino, block->level); | ||
| 189 | } | ||
| 190 | |||
| 191 | static struct logfs_block_ops btree_block_ops = { | 186 | static struct logfs_block_ops btree_block_ops = { |
| 192 | .write_block = btree_write_block, | 187 | .write_block = btree_write_block, |
| 193 | .block_level = btree_block_level, | ||
| 194 | .free_block = __free_block, | 188 | .free_block = __free_block, |
| 195 | .write_alias = btree_write_alias, | 189 | .write_alias = btree_write_alias, |
| 196 | }; | 190 | }; |
| @@ -919,7 +913,7 @@ err: | |||
| 919 | for (i--; i >= 0; i--) | 913 | for (i--; i >= 0; i--) |
| 920 | free_area(super->s_area[i]); | 914 | free_area(super->s_area[i]); |
| 921 | free_area(super->s_journal_area); | 915 | free_area(super->s_journal_area); |
| 922 | mempool_destroy(super->s_alias_pool); | 916 | logfs_mempool_destroy(super->s_alias_pool); |
| 923 | return -ENOMEM; | 917 | return -ENOMEM; |
| 924 | } | 918 | } |
| 925 | 919 | ||
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index b60bfac3263c..5866ee6e1327 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "logfs.h" | 12 | #include "logfs.h" |
| 13 | #include <linux/bio.h> | 13 | #include <linux/bio.h> |
| 14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 15 | #include <linux/blkdev.h> | ||
| 15 | #include <linux/mtd/mtd.h> | 16 | #include <linux/mtd/mtd.h> |
| 16 | #include <linux/statfs.h> | 17 | #include <linux/statfs.h> |
| 17 | #include <linux/buffer_head.h> | 18 | #include <linux/buffer_head.h> |
| @@ -137,6 +138,10 @@ static int logfs_sb_set(struct super_block *sb, void *_super) | |||
| 137 | sb->s_fs_info = super; | 138 | sb->s_fs_info = super; |
| 138 | sb->s_mtd = super->s_mtd; | 139 | sb->s_mtd = super->s_mtd; |
| 139 | sb->s_bdev = super->s_bdev; | 140 | sb->s_bdev = super->s_bdev; |
| 141 | if (sb->s_bdev) | ||
| 142 | sb->s_bdi = &bdev_get_queue(sb->s_bdev)->backing_dev_info; | ||
| 143 | if (sb->s_mtd) | ||
| 144 | sb->s_bdi = sb->s_mtd->backing_dev_info; | ||
| 140 | return 0; | 145 | return 0; |
| 141 | } | 146 | } |
| 142 | 147 | ||
| @@ -452,6 +457,8 @@ static int logfs_read_sb(struct super_block *sb, int read_only) | |||
| 452 | 457 | ||
| 453 | btree_init_mempool64(&super->s_shadow_tree.new, super->s_btree_pool); | 458 | btree_init_mempool64(&super->s_shadow_tree.new, super->s_btree_pool); |
| 454 | btree_init_mempool64(&super->s_shadow_tree.old, super->s_btree_pool); | 459 | btree_init_mempool64(&super->s_shadow_tree.old, super->s_btree_pool); |
| 460 | btree_init_mempool32(&super->s_shadow_tree.segment_map, | ||
| 461 | super->s_btree_pool); | ||
| 455 | 462 | ||
| 456 | ret = logfs_init_mapping(sb); | 463 | ret = logfs_init_mapping(sb); |
| 457 | if (ret) | 464 | if (ret) |
| @@ -516,8 +523,8 @@ static void logfs_kill_sb(struct super_block *sb) | |||
| 516 | if (super->s_erase_page) | 523 | if (super->s_erase_page) |
| 517 | __free_page(super->s_erase_page); | 524 | __free_page(super->s_erase_page); |
| 518 | super->s_devops->put_device(sb); | 525 | super->s_devops->put_device(sb); |
| 519 | mempool_destroy(super->s_btree_pool); | 526 | logfs_mempool_destroy(super->s_btree_pool); |
| 520 | mempool_destroy(super->s_alias_pool); | 527 | logfs_mempool_destroy(super->s_alias_pool); |
| 521 | kfree(super); | 528 | kfree(super); |
| 522 | log_super("LogFS: Finished unmounting\n"); | 529 | log_super("LogFS: Finished unmounting\n"); |
| 523 | } | 530 | } |
diff --git a/fs/quota/Kconfig b/fs/quota/Kconfig index dad7fb247ddc..3e21b1e2ad3a 100644 --- a/fs/quota/Kconfig +++ b/fs/quota/Kconfig | |||
| @@ -33,6 +33,14 @@ config PRINT_QUOTA_WARNING | |||
| 33 | Note that this behavior is currently deprecated and may go away in | 33 | Note that this behavior is currently deprecated and may go away in |
| 34 | future. Please use notification via netlink socket instead. | 34 | future. Please use notification via netlink socket instead. |
| 35 | 35 | ||
| 36 | config QUOTA_DEBUG | ||
| 37 | bool "Additional quota sanity checks" | ||
| 38 | depends on QUOTA | ||
| 39 | default n | ||
| 40 | help | ||
| 41 | If you say Y here, quota subsystem will perform some additional | ||
| 42 | sanity checks of quota internal structures. If unsure, say N. | ||
| 43 | |||
| 36 | # Generic support for tree structured quota files. Selected when needed. | 44 | # Generic support for tree structured quota files. Selected when needed. |
| 37 | config QUOTA_TREE | 45 | config QUOTA_TREE |
| 38 | tristate | 46 | tristate |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index a0a9405b202a..788b5802a7ce 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -80,8 +80,6 @@ | |||
| 80 | 80 | ||
| 81 | #include <asm/uaccess.h> | 81 | #include <asm/uaccess.h> |
| 82 | 82 | ||
| 83 | #define __DQUOT_PARANOIA | ||
| 84 | |||
| 85 | /* | 83 | /* |
| 86 | * There are three quota SMP locks. dq_list_lock protects all lists with quotas | 84 | * There are three quota SMP locks. dq_list_lock protects all lists with quotas |
| 87 | * and quota formats, dqstats structure containing statistics about the lists | 85 | * and quota formats, dqstats structure containing statistics about the lists |
| @@ -695,7 +693,7 @@ void dqput(struct dquot *dquot) | |||
| 695 | 693 | ||
| 696 | if (!dquot) | 694 | if (!dquot) |
| 697 | return; | 695 | return; |
| 698 | #ifdef __DQUOT_PARANOIA | 696 | #ifdef CONFIG_QUOTA_DEBUG |
| 699 | if (!atomic_read(&dquot->dq_count)) { | 697 | if (!atomic_read(&dquot->dq_count)) { |
| 700 | printk("VFS: dqput: trying to free free dquot\n"); | 698 | printk("VFS: dqput: trying to free free dquot\n"); |
| 701 | printk("VFS: device %s, dquot of %s %d\n", | 699 | printk("VFS: device %s, dquot of %s %d\n", |
| @@ -748,7 +746,7 @@ we_slept: | |||
| 748 | goto we_slept; | 746 | goto we_slept; |
| 749 | } | 747 | } |
| 750 | atomic_dec(&dquot->dq_count); | 748 | atomic_dec(&dquot->dq_count); |
| 751 | #ifdef __DQUOT_PARANOIA | 749 | #ifdef CONFIG_QUOTA_DEBUG |
| 752 | /* sanity check */ | 750 | /* sanity check */ |
| 753 | BUG_ON(!list_empty(&dquot->dq_free)); | 751 | BUG_ON(!list_empty(&dquot->dq_free)); |
| 754 | #endif | 752 | #endif |
| @@ -845,7 +843,7 @@ we_slept: | |||
| 845 | dquot = NULL; | 843 | dquot = NULL; |
| 846 | goto out; | 844 | goto out; |
| 847 | } | 845 | } |
| 848 | #ifdef __DQUOT_PARANOIA | 846 | #ifdef CONFIG_QUOTA_DEBUG |
| 849 | BUG_ON(!dquot->dq_sb); /* Has somebody invalidated entry under us? */ | 847 | BUG_ON(!dquot->dq_sb); /* Has somebody invalidated entry under us? */ |
| 850 | #endif | 848 | #endif |
| 851 | out: | 849 | out: |
| @@ -874,7 +872,7 @@ static int dqinit_needed(struct inode *inode, int type) | |||
| 874 | static void add_dquot_ref(struct super_block *sb, int type) | 872 | static void add_dquot_ref(struct super_block *sb, int type) |
| 875 | { | 873 | { |
| 876 | struct inode *inode, *old_inode = NULL; | 874 | struct inode *inode, *old_inode = NULL; |
| 877 | #ifdef __DQUOT_PARANOIA | 875 | #ifdef CONFIG_QUOTA_DEBUG |
| 878 | int reserved = 0; | 876 | int reserved = 0; |
| 879 | #endif | 877 | #endif |
| 880 | 878 | ||
| @@ -882,7 +880,7 @@ static void add_dquot_ref(struct super_block *sb, int type) | |||
| 882 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 880 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
| 883 | if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) | 881 | if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) |
| 884 | continue; | 882 | continue; |
| 885 | #ifdef __DQUOT_PARANOIA | 883 | #ifdef CONFIG_QUOTA_DEBUG |
| 886 | if (unlikely(inode_get_rsv_space(inode) > 0)) | 884 | if (unlikely(inode_get_rsv_space(inode) > 0)) |
| 887 | reserved = 1; | 885 | reserved = 1; |
| 888 | #endif | 886 | #endif |
| @@ -907,7 +905,7 @@ static void add_dquot_ref(struct super_block *sb, int type) | |||
| 907 | spin_unlock(&inode_lock); | 905 | spin_unlock(&inode_lock); |
| 908 | iput(old_inode); | 906 | iput(old_inode); |
| 909 | 907 | ||
| 910 | #ifdef __DQUOT_PARANOIA | 908 | #ifdef CONFIG_QUOTA_DEBUG |
| 911 | if (reserved) { | 909 | if (reserved) { |
| 912 | printk(KERN_WARNING "VFS (%s): Writes happened before quota" | 910 | printk(KERN_WARNING "VFS (%s): Writes happened before quota" |
| 913 | " was turned on thus quota information is probably " | 911 | " was turned on thus quota information is probably " |
| @@ -940,7 +938,7 @@ static int remove_inode_dquot_ref(struct inode *inode, int type, | |||
| 940 | inode->i_dquot[type] = NULL; | 938 | inode->i_dquot[type] = NULL; |
| 941 | if (dquot) { | 939 | if (dquot) { |
| 942 | if (dqput_blocks(dquot)) { | 940 | if (dqput_blocks(dquot)) { |
| 943 | #ifdef __DQUOT_PARANOIA | 941 | #ifdef CONFIG_QUOTA_DEBUG |
| 944 | if (atomic_read(&dquot->dq_count) != 1) | 942 | if (atomic_read(&dquot->dq_count) != 1) |
| 945 | printk(KERN_WARNING "VFS: Adding dquot with dq_count %d to dispose list.\n", atomic_read(&dquot->dq_count)); | 943 | printk(KERN_WARNING "VFS: Adding dquot with dq_count %d to dispose list.\n", atomic_read(&dquot->dq_count)); |
| 946 | #endif | 944 | #endif |
diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h index 81f3b14d5d76..68f883b30a53 100644 --- a/include/linux/firewire-cdev.h +++ b/include/linux/firewire-cdev.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 20 | * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | 20 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 23 | * DEALINGS IN THE SOFTWARE. | 23 | * DEALINGS IN THE SOFTWARE. |
diff --git a/include/linux/firewire-constants.h b/include/linux/firewire-constants.h index 9c63f06e67f2..9b4bb5fbba4b 100644 --- a/include/linux/firewire-constants.h +++ b/include/linux/firewire-constants.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 20 | * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | 20 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 23 | * DEALINGS IN THE SOFTWARE. | 23 | * DEALINGS IN THE SOFTWARE. |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index a3fd0f91d943..169d07758ee5 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -54,7 +54,7 @@ extern struct kmem_cache *kvm_vcpu_cache; | |||
| 54 | */ | 54 | */ |
| 55 | struct kvm_io_bus { | 55 | struct kvm_io_bus { |
| 56 | int dev_count; | 56 | int dev_count; |
| 57 | #define NR_IOBUS_DEVS 6 | 57 | #define NR_IOBUS_DEVS 200 |
| 58 | struct kvm_io_device *devs[NR_IOBUS_DEVS]; | 58 | struct kvm_io_device *devs[NR_IOBUS_DEVS]; |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| @@ -119,6 +119,11 @@ struct kvm_memory_slot { | |||
| 119 | int user_alloc; | 119 | int user_alloc; |
| 120 | }; | 120 | }; |
| 121 | 121 | ||
| 122 | static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) | ||
| 123 | { | ||
| 124 | return ALIGN(memslot->npages, BITS_PER_LONG) / 8; | ||
| 125 | } | ||
| 126 | |||
| 122 | struct kvm_kernel_irq_routing_entry { | 127 | struct kvm_kernel_irq_routing_entry { |
| 123 | u32 gsi; | 128 | u32 gsi; |
| 124 | u32 type; | 129 | u32 type; |
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index 28c9fd020d39..ebd747265294 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h | |||
| @@ -183,9 +183,13 @@ static inline struct regulator *__must_check regulator_get(struct device *dev, | |||
| 183 | { | 183 | { |
| 184 | /* Nothing except the stubbed out regulator API should be | 184 | /* Nothing except the stubbed out regulator API should be |
| 185 | * looking at the value except to check if it is an error | 185 | * looking at the value except to check if it is an error |
| 186 | * value so the actual return value doesn't matter. | 186 | * value. Drivers are free to handle NULL specifically by |
| 187 | * skipping all regulator API calls, but they don't have to. | ||
| 188 | * Drivers which don't, should make sure they properly handle | ||
| 189 | * corner cases of the API, such as regulator_get_voltage() | ||
| 190 | * returning 0. | ||
| 187 | */ | 191 | */ |
| 188 | return (struct regulator *)id; | 192 | return NULL; |
| 189 | } | 193 | } |
| 190 | static inline void regulator_put(struct regulator *regulator) | 194 | static inline void regulator_put(struct regulator *regulator) |
| 191 | { | 195 | { |
diff --git a/kernel/cred.c b/kernel/cred.c index e1dbe9eef800..62af1816c235 100644 --- a/kernel/cred.c +++ b/kernel/cred.c | |||
| @@ -398,6 +398,8 @@ struct cred *prepare_usermodehelper_creds(void) | |||
| 398 | 398 | ||
| 399 | error: | 399 | error: |
| 400 | put_cred(new); | 400 | put_cred(new); |
| 401 | return NULL; | ||
| 402 | |||
| 401 | free_tgcred: | 403 | free_tgcred: |
| 402 | #ifdef CONFIG_KEYS | 404 | #ifdef CONFIG_KEYS |
| 403 | kfree(tgcred); | 405 | kfree(tgcred); |
| @@ -791,8 +793,6 @@ bool creds_are_invalid(const struct cred *cred) | |||
| 791 | { | 793 | { |
| 792 | if (cred->magic != CRED_MAGIC) | 794 | if (cred->magic != CRED_MAGIC) |
| 793 | return true; | 795 | return true; |
| 794 | if (atomic_read(&cred->usage) < atomic_read(&cred->subscribers)) | ||
| 795 | return true; | ||
| 796 | #ifdef CONFIG_SECURITY_SELINUX | 796 | #ifdef CONFIG_SECURITY_SELINUX |
| 797 | if (selinux_is_enabled()) { | 797 | if (selinux_is_enabled()) { |
| 798 | if ((unsigned long) cred->security < PAGE_SIZE) | 798 | if ((unsigned long) cred->security < PAGE_SIZE) |
| @@ -730,23 +730,28 @@ void page_move_anon_rmap(struct page *page, | |||
| 730 | * @page: the page to add the mapping to | 730 | * @page: the page to add the mapping to |
| 731 | * @vma: the vm area in which the mapping is added | 731 | * @vma: the vm area in which the mapping is added |
| 732 | * @address: the user virtual address mapped | 732 | * @address: the user virtual address mapped |
| 733 | * @exclusive: the page is exclusively owned by the current process | ||
| 733 | */ | 734 | */ |
| 734 | static void __page_set_anon_rmap(struct page *page, | 735 | static void __page_set_anon_rmap(struct page *page, |
| 735 | struct vm_area_struct *vma, unsigned long address) | 736 | struct vm_area_struct *vma, unsigned long address, int exclusive) |
| 736 | { | 737 | { |
| 737 | struct anon_vma_chain *avc; | 738 | struct anon_vma *anon_vma = vma->anon_vma; |
| 738 | struct anon_vma *anon_vma; | ||
| 739 | 739 | ||
| 740 | BUG_ON(!vma->anon_vma); | 740 | BUG_ON(!anon_vma); |
| 741 | 741 | ||
| 742 | /* | 742 | /* |
| 743 | * We must use the _oldest_ possible anon_vma for the page mapping! | 743 | * If the page isn't exclusively mapped into this vma, |
| 744 | * we must use the _oldest_ possible anon_vma for the | ||
| 745 | * page mapping! | ||
| 744 | * | 746 | * |
| 745 | * So take the last AVC chain entry in the vma, which is the deepest | 747 | * So take the last AVC chain entry in the vma, which is |
| 746 | * ancestor, and use the anon_vma from that. | 748 | * the deepest ancestor, and use the anon_vma from that. |
| 747 | */ | 749 | */ |
| 748 | avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma); | 750 | if (!exclusive) { |
| 749 | anon_vma = avc->anon_vma; | 751 | struct anon_vma_chain *avc; |
| 752 | avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma); | ||
| 753 | anon_vma = avc->anon_vma; | ||
| 754 | } | ||
| 750 | 755 | ||
| 751 | anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; | 756 | anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; |
| 752 | page->mapping = (struct address_space *) anon_vma; | 757 | page->mapping = (struct address_space *) anon_vma; |
| @@ -802,7 +807,7 @@ void page_add_anon_rmap(struct page *page, | |||
| 802 | VM_BUG_ON(!PageLocked(page)); | 807 | VM_BUG_ON(!PageLocked(page)); |
| 803 | VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end); | 808 | VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end); |
| 804 | if (first) | 809 | if (first) |
| 805 | __page_set_anon_rmap(page, vma, address); | 810 | __page_set_anon_rmap(page, vma, address, 0); |
| 806 | else | 811 | else |
| 807 | __page_check_anon_rmap(page, vma, address); | 812 | __page_check_anon_rmap(page, vma, address); |
| 808 | } | 813 | } |
| @@ -824,7 +829,7 @@ void page_add_new_anon_rmap(struct page *page, | |||
| 824 | SetPageSwapBacked(page); | 829 | SetPageSwapBacked(page); |
| 825 | atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */ | 830 | atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */ |
| 826 | __inc_zone_page_state(page, NR_ANON_PAGES); | 831 | __inc_zone_page_state(page, NR_ANON_PAGES); |
| 827 | __page_set_anon_rmap(page, vma, address); | 832 | __page_set_anon_rmap(page, vma, address, 1); |
| 828 | if (page_evictable(page, vma)) | 833 | if (page_evictable(page, vma)) |
| 829 | lru_cache_add_lru(page, LRU_ACTIVE_ANON); | 834 | lru_cache_add_lru(page, LRU_ACTIVE_ANON); |
| 830 | else | 835 | else |
diff --git a/security/inode.c b/security/inode.c index c3a793881d04..1c812e874504 100644 --- a/security/inode.c +++ b/security/inode.c | |||
| @@ -161,13 +161,13 @@ static int create_by_name(const char *name, mode_t mode, | |||
| 161 | 161 | ||
| 162 | mutex_lock(&parent->d_inode->i_mutex); | 162 | mutex_lock(&parent->d_inode->i_mutex); |
| 163 | *dentry = lookup_one_len(name, parent, strlen(name)); | 163 | *dentry = lookup_one_len(name, parent, strlen(name)); |
| 164 | if (!IS_ERR(dentry)) { | 164 | if (!IS_ERR(*dentry)) { |
| 165 | if ((mode & S_IFMT) == S_IFDIR) | 165 | if ((mode & S_IFMT) == S_IFDIR) |
| 166 | error = mkdir(parent->d_inode, *dentry, mode); | 166 | error = mkdir(parent->d_inode, *dentry, mode); |
| 167 | else | 167 | else |
| 168 | error = create(parent->d_inode, *dentry, mode); | 168 | error = create(parent->d_inode, *dentry, mode); |
| 169 | } else | 169 | } else |
| 170 | error = PTR_ERR(dentry); | 170 | error = PTR_ERR(*dentry); |
| 171 | mutex_unlock(&parent->d_inode->i_mutex); | 171 | mutex_unlock(&parent->d_inode->i_mutex); |
| 172 | 172 | ||
| 173 | return error; | 173 | return error; |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 5a0cd194dce0..c82ae2492634 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -341,7 +341,11 @@ static void kvm_mmu_notifier_release(struct mmu_notifier *mn, | |||
| 341 | struct mm_struct *mm) | 341 | struct mm_struct *mm) |
| 342 | { | 342 | { |
| 343 | struct kvm *kvm = mmu_notifier_to_kvm(mn); | 343 | struct kvm *kvm = mmu_notifier_to_kvm(mn); |
| 344 | int idx; | ||
| 345 | |||
| 346 | idx = srcu_read_lock(&kvm->srcu); | ||
| 344 | kvm_arch_flush_shadow(kvm); | 347 | kvm_arch_flush_shadow(kvm); |
| 348 | srcu_read_unlock(&kvm->srcu, idx); | ||
| 345 | } | 349 | } |
| 346 | 350 | ||
| 347 | static const struct mmu_notifier_ops kvm_mmu_notifier_ops = { | 351 | static const struct mmu_notifier_ops kvm_mmu_notifier_ops = { |
| @@ -648,7 +652,7 @@ skip_lpage: | |||
| 648 | 652 | ||
| 649 | /* Allocate page dirty bitmap if needed */ | 653 | /* Allocate page dirty bitmap if needed */ |
| 650 | if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) { | 654 | if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) { |
| 651 | unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8; | 655 | unsigned long dirty_bytes = kvm_dirty_bitmap_bytes(&new); |
| 652 | 656 | ||
| 653 | new.dirty_bitmap = vmalloc(dirty_bytes); | 657 | new.dirty_bitmap = vmalloc(dirty_bytes); |
| 654 | if (!new.dirty_bitmap) | 658 | if (!new.dirty_bitmap) |
| @@ -768,7 +772,7 @@ int kvm_get_dirty_log(struct kvm *kvm, | |||
| 768 | { | 772 | { |
| 769 | struct kvm_memory_slot *memslot; | 773 | struct kvm_memory_slot *memslot; |
| 770 | int r, i; | 774 | int r, i; |
| 771 | int n; | 775 | unsigned long n; |
| 772 | unsigned long any = 0; | 776 | unsigned long any = 0; |
| 773 | 777 | ||
| 774 | r = -EINVAL; | 778 | r = -EINVAL; |
| @@ -780,7 +784,7 @@ int kvm_get_dirty_log(struct kvm *kvm, | |||
| 780 | if (!memslot->dirty_bitmap) | 784 | if (!memslot->dirty_bitmap) |
| 781 | goto out; | 785 | goto out; |
| 782 | 786 | ||
| 783 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 787 | n = kvm_dirty_bitmap_bytes(memslot); |
| 784 | 788 | ||
| 785 | for (i = 0; !any && i < n/sizeof(long); ++i) | 789 | for (i = 0; !any && i < n/sizeof(long); ++i) |
| 786 | any = memslot->dirty_bitmap[i]; | 790 | any = memslot->dirty_bitmap[i]; |
| @@ -1186,10 +1190,13 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn) | |||
| 1186 | memslot = gfn_to_memslot_unaliased(kvm, gfn); | 1190 | memslot = gfn_to_memslot_unaliased(kvm, gfn); |
| 1187 | if (memslot && memslot->dirty_bitmap) { | 1191 | if (memslot && memslot->dirty_bitmap) { |
| 1188 | unsigned long rel_gfn = gfn - memslot->base_gfn; | 1192 | unsigned long rel_gfn = gfn - memslot->base_gfn; |
| 1193 | unsigned long *p = memslot->dirty_bitmap + | ||
| 1194 | rel_gfn / BITS_PER_LONG; | ||
| 1195 | int offset = rel_gfn % BITS_PER_LONG; | ||
| 1189 | 1196 | ||
| 1190 | /* avoid RMW */ | 1197 | /* avoid RMW */ |
| 1191 | if (!generic_test_le_bit(rel_gfn, memslot->dirty_bitmap)) | 1198 | if (!generic_test_le_bit(offset, p)) |
| 1192 | generic___set_le_bit(rel_gfn, memslot->dirty_bitmap); | 1199 | generic___set_le_bit(offset, p); |
| 1193 | } | 1200 | } |
| 1194 | } | 1201 | } |
| 1195 | 1202 | ||
