diff --git a/arch/s390/lib/uaccess.S b/arch/s390/lib/uaccess.S index 1490bc6..6207032 100644 --- a/arch/s390/lib/uaccess.S +++ b/arch/s390/lib/uaccess.S @@ -19,8 +19,8 @@ __copy_from_user_asm: sacf 512 0: mvcle %r2,%r4,0 jo 0b -1: sacf 0 lr %r2,%r5 +1: sacf 0 br %r14 2: lhi %r1,-4096 lr %r3,%r4 @@ -28,17 +28,23 @@ __copy_from_user_asm: nr %r3,%r1 # %r3 = (%r4 + 4096) & -4096 slr %r3,%r4 # %r3 = #bytes to next user page boundary clr %r5,%r3 # copy crosses next page boundary ? - jnh 1b # no, this page fauled + jnh 4f # no, this page faulted # The page after the current user page might have faulted. - # We cant't find out which page because the program check handler - # might have callled schedule, destroying all lowcore information. + # We can't find out which page because the program check handler + # might have called schedule, destroying all lowcore information. # We retry with the shortened length. 3: mvcle %r2,%r4,0 jo 3b +4: lr %r1,%r5 # pad remaining bytes with 0 + lr %r3,%r5 + slr %r5,%r5 +5: mvcle %r2,%r4,0 + jo 5b + lr %r2,%r1 j 1b .section __ex_table,"a" .long 0b,2b - .long 3b,1b + .long 3b,4b .previous .align 4 diff --git a/arch/s390x/lib/uaccess.S b/arch/s390x/lib/uaccess.S index 7e90f20..9916621 100644 --- a/arch/s390x/lib/uaccess.S +++ b/arch/s390x/lib/uaccess.S @@ -19,8 +19,8 @@ __copy_from_user_asm: sacf 512 0: mvcle %r2,%r4,0 jo 0b -1: sacf 0 lgr %r2,%r5 +1: sacf 0 br %r14 2: lghi %r1,-4096 lgr %r3,%r4 @@ -28,17 +28,23 @@ __copy_from_user_asm: ngr %r3,%r1 # %r3 = (%r4 + 4096) & -4096 slgr %r3,%r4 # %r3 = #bytes to next user page boundary clgr %r5,%r3 # copy crosses next page boundary ? - jnh 1b # no, this page fauled + jnh 4f # no, this page faulted # The page after the current user page might have faulted. - # We cant't find out which page because the program check handler - # might have callled schedule, destroying all lowcore information. + # We can't find out which page because the program check handler + # might have called schedule, destroying all lowcore information. # We retry with the shortened length. 3: mvcle %r2,%r4,0 jo 3b +4: lgr %r1,%r5 # pad remaining bytes with 0 + lgr %r3,%r5 + slgr %r5,%r5 +5: mvcle %r2,%r4,0 + jo 5b + lgr %r2,%r1 j 1b .section __ex_table,"a" .quad 0b,2b - .quad 3b,1b + .quad 3b,4b .previous .align 4 diff --git a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h index 9b6b55e..bb63c10 100644 --- a/include/asm-i386/bitops.h +++ b/include/asm-i386/bitops.h @@ -38,7 +38,7 @@ static __inline__ void set_bit(int nr, v __asm__ __volatile__( LOCK_PREFIX "btsl %1,%0" :"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); } /** @@ -55,7 +55,7 @@ static __inline__ void __set_bit(int nr, __asm__( "btsl %1,%0" :"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); } /** @@ -73,7 +73,7 @@ static __inline__ void clear_bit(int nr, __asm__ __volatile__( LOCK_PREFIX "btrl %1,%0" :"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); } #define smp_mb__before_clear_bit() barrier() #define smp_mb__after_clear_bit() barrier() @@ -92,7 +92,7 @@ static __inline__ void __change_bit(int __asm__ __volatile__( "btcl %1,%0" :"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); } /** @@ -109,7 +109,7 @@ static __inline__ void change_bit(int nr __asm__ __volatile__( LOCK_PREFIX "btcl %1,%0" :"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); } /** @@ -127,7 +127,7 @@ static __inline__ int test_and_set_bit(i __asm__ __volatile__( LOCK_PREFIX "btsl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); + :"Ir" (nr), "m" (ADDR) : "memory"); return oldbit; } @@ -147,7 +147,7 @@ static __inline__ int __test_and_set_bit __asm__( "btsl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); return oldbit; } @@ -166,7 +166,7 @@ static __inline__ int test_and_clear_bit __asm__ __volatile__( LOCK_PREFIX "btrl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); + :"Ir" (nr), "m" (ADDR) : "memory"); return oldbit; } @@ -186,7 +186,7 @@ static __inline__ int __test_and_clear_b __asm__( "btrl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr)); + :"Ir" (nr), "m" (ADDR)); return oldbit; } @@ -198,7 +198,7 @@ static __inline__ int __test_and_change_ __asm__ __volatile__( "btcl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); + :"Ir" (nr), "m" (ADDR) : "memory"); return oldbit; } @@ -217,7 +217,7 @@ static __inline__ int test_and_change_bi __asm__ __volatile__( LOCK_PREFIX "btcl %2,%1\n\tsbbl %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); + :"Ir" (nr), "m" (ADDR) : "memory"); return oldbit; } diff --git a/include/asm-i386/page.h b/include/asm-i386/page.h index a7a7f1b..8b6b3ab 100644 --- a/include/asm-i386/page.h +++ b/include/asm-i386/page.h @@ -41,7 +41,7 @@ typedef struct { unsigned long pte_low, typedef struct { unsigned long long pmd; } pmd_t; typedef struct { unsigned long long pgd; } pgd_t; #define pte_val(x) ((x).pte_low | ((unsigned long long)(x).pte_high << 32)) -#define __pte(x) ({ pte_t __pte = {(x), ((unsigned long long)(x)) >> 32}; __pte; }) +#define __pte(x) ({ pte_t __pte = {(x), (x) >> 32}; __pte; }) #else typedef struct { unsigned long pte_low; } pte_t; typedef struct { unsigned long pmd; } pmd_t; diff --git a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h index c8a4749..f6a2a4f 100644 --- a/include/asm-x86_64/bitops.h +++ b/include/asm-x86_64/bitops.h @@ -38,7 +38,7 @@ static __inline__ void set_bit(long nr, __asm__ __volatile__( LOCK_PREFIX "btsq %1,%0" :"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); } /** @@ -55,7 +55,7 @@ static __inline__ void __set_bit(long nr __asm__( "btsq %1,%0" :"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); } /** @@ -73,7 +73,7 @@ static __inline__ void clear_bit(long nr __asm__ __volatile__( LOCK_PREFIX "btrq %1,%0" :"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); } #define smp_mb__before_clear_bit() barrier() #define smp_mb__after_clear_bit() barrier() @@ -92,7 +92,7 @@ static __inline__ void __change_bit(long __asm__ __volatile__( "btcq %1,%0" :"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); } /** @@ -109,7 +109,7 @@ static __inline__ void change_bit(long n __asm__ __volatile__( LOCK_PREFIX "btcq %1,%0" :"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); } /** @@ -127,7 +127,7 @@ static __inline__ int test_and_set_bit(l __asm__ __volatile__( LOCK_PREFIX "btsq %2,%1\n\tsbbq %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"dIr" (nr) : "memory"); + :"dIr" (nr), "m" (ADDR) : "memory"); return oldbit; } @@ -147,7 +147,7 @@ static __inline__ int __test_and_set_bit __asm__( "btsq %2,%1\n\tsbbq %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); return oldbit; } @@ -166,7 +166,7 @@ static __inline__ int test_and_clear_bit __asm__ __volatile__( LOCK_PREFIX "btrq %2,%1\n\tsbbq %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"dIr" (nr) : "memory"); + :"dIr" (nr), "m" (ADDR) : "memory"); return oldbit; } @@ -186,7 +186,7 @@ static __inline__ int __test_and_clear_b __asm__( "btrq %2,%1\n\tsbbq %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"dIr" (nr)); + :"dIr" (nr), "m" (ADDR)); return oldbit; } @@ -198,7 +198,7 @@ static __inline__ int __test_and_change_ __asm__ __volatile__( "btcq %2,%1\n\tsbbq %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"dIr" (nr) : "memory"); + :"dIr" (nr), "m" (ADDR) : "memory"); return oldbit; } @@ -217,7 +217,7 @@ static __inline__ int test_and_change_bi __asm__ __volatile__( LOCK_PREFIX "btcq %2,%1\n\tsbbq %0,%0" :"=r" (oldbit),"=m" (ADDR) - :"dIr" (nr) : "memory"); + :"dIr" (nr), "m" (ADDR) : "memory"); return oldbit; } diff --git a/net/ipv4/netfilter/ip_nat_helper.c b/net/ipv4/netfilter/ip_nat_helper.c index 6298d96..645f46d 100644 --- a/net/ipv4/netfilter/ip_nat_helper.c +++ b/net/ipv4/netfilter/ip_nat_helper.c @@ -522,13 +522,7 @@ #endif static int kill_helper(struct ip_conntrack *i, void *helper) { - int ret; - - READ_LOCK(&ip_nat_lock); - ret = (i->nat.info.helper == helper); - READ_UNLOCK(&ip_nat_lock); - - return ret; + return (i->nat.info.helper == helper); } void ip_nat_helper_unregister(struct ip_nat_helper *me)