diff options
247 files changed, 3006 insertions, 2505 deletions
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index a4f30faa4f1f..1e359b62c40a 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
| @@ -316,7 +316,7 @@ address perms offset dev inode pathname | |||
| 316 | 08049000-0804a000 rw-p 00001000 03:00 8312 /opt/test | 316 | 08049000-0804a000 rw-p 00001000 03:00 8312 /opt/test |
| 317 | 0804a000-0806b000 rw-p 00000000 00:00 0 [heap] | 317 | 0804a000-0806b000 rw-p 00000000 00:00 0 [heap] |
| 318 | a7cb1000-a7cb2000 ---p 00000000 00:00 0 | 318 | a7cb1000-a7cb2000 ---p 00000000 00:00 0 |
| 319 | a7cb2000-a7eb2000 rw-p 00000000 00:00 0 [threadstack:001ff4b4] | 319 | a7cb2000-a7eb2000 rw-p 00000000 00:00 0 |
| 320 | a7eb2000-a7eb3000 ---p 00000000 00:00 0 | 320 | a7eb2000-a7eb3000 ---p 00000000 00:00 0 |
| 321 | a7eb3000-a7ed5000 rw-p 00000000 00:00 0 | 321 | a7eb3000-a7ed5000 rw-p 00000000 00:00 0 |
| 322 | a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6 | 322 | a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6 |
| @@ -352,7 +352,6 @@ is not associated with a file: | |||
| 352 | [stack] = the stack of the main process | 352 | [stack] = the stack of the main process |
| 353 | [vdso] = the "virtual dynamic shared object", | 353 | [vdso] = the "virtual dynamic shared object", |
| 354 | the kernel system call handler | 354 | the kernel system call handler |
| 355 | [threadstack:xxxxxxxx] = the stack of the thread, xxxxxxxx is the stack size | ||
| 356 | 355 | ||
| 357 | or if empty, the mapping is anonymous. | 356 | or if empty, the mapping is anonymous. |
| 358 | 357 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index d5b0b1b6dc52..d329b053a718 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -5492,7 +5492,7 @@ S: Maintained | |||
| 5492 | F: drivers/mmc/host/tmio_mmc.* | 5492 | F: drivers/mmc/host/tmio_mmc.* |
| 5493 | 5493 | ||
| 5494 | TMPFS (SHMEM FILESYSTEM) | 5494 | TMPFS (SHMEM FILESYSTEM) |
| 5495 | M: Hugh Dickins <hugh.dickins@tiscali.co.uk> | 5495 | M: Hugh Dickins <hughd@google.com> |
| 5496 | L: linux-mm@kvack.org | 5496 | L: linux-mm@kvack.org |
| 5497 | S: Maintained | 5497 | S: Maintained |
| 5498 | F: include/linux/shmem_fs.h | 5498 | F: include/linux/shmem_fs.h |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 34 | 3 | SUBLEVEL = 34 |
| 4 | EXTRAVERSION = -rc7 | 4 | EXTRAVERSION = |
| 5 | NAME = Sheep on Meth | 5 | NAME = Sheep on Meth |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h index 610dff44d94b..e756d04b6cd5 100644 --- a/arch/alpha/include/asm/atomic.h +++ b/arch/alpha/include/asm/atomic.h | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) | 17 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) |
| 18 | #define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } ) | 18 | #define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } ) |
| 19 | 19 | ||
| 20 | #define atomic_read(v) ((v)->counter + 0) | 20 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 21 | #define atomic64_read(v) ((v)->counter + 0) | 21 | #define atomic64_read(v) (*(volatile long *)&(v)->counter) |
| 22 | 22 | ||
| 23 | #define atomic_set(v,i) ((v)->counter = (i)) | 23 | #define atomic_set(v,i) ((v)->counter = (i)) |
| 24 | #define atomic64_set(v,i) ((v)->counter = (i)) | 24 | #define atomic64_set(v,i) ((v)->counter = (i)) |
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index e8ddec2cb158..a0162fa94564 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | * strex/ldrex monitor on some implementations. The reason we can use it for | 24 | * strex/ldrex monitor on some implementations. The reason we can use it for |
| 25 | * atomic_set() is the clrex or dummy strex done on every exception return. | 25 | * atomic_set() is the clrex or dummy strex done on every exception return. |
| 26 | */ | 26 | */ |
| 27 | #define atomic_read(v) ((v)->counter) | 27 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 28 | #define atomic_set(v,i) (((v)->counter) = (i)) | 28 | #define atomic_set(v,i) (((v)->counter) = (i)) |
| 29 | 29 | ||
| 30 | #if __LINUX_ARM_ARCH__ >= 6 | 30 | #if __LINUX_ARM_ARCH__ >= 6 |
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 0d08d4170b64..4656a24058d2 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
| @@ -371,6 +371,10 @@ static inline void __flush_icache_all(void) | |||
| 371 | #ifdef CONFIG_ARM_ERRATA_411920 | 371 | #ifdef CONFIG_ARM_ERRATA_411920 |
| 372 | extern void v6_icache_inval_all(void); | 372 | extern void v6_icache_inval_all(void); |
| 373 | v6_icache_inval_all(); | 373 | v6_icache_inval_all(); |
| 374 | #elif defined(CONFIG_SMP) && __LINUX_ARM_ARCH__ >= 7 | ||
| 375 | asm("mcr p15, 0, %0, c7, c1, 0 @ invalidate I-cache inner shareable\n" | ||
| 376 | : | ||
| 377 | : "r" (0)); | ||
| 374 | #else | 378 | #else |
| 375 | asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n" | 379 | asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n" |
| 376 | : | 380 | : |
diff --git a/arch/arm/include/asm/smp_twd.h b/arch/arm/include/asm/smp_twd.h index 7be0978b2625..634f357be6bb 100644 --- a/arch/arm/include/asm/smp_twd.h +++ b/arch/arm/include/asm/smp_twd.h | |||
| @@ -1,6 +1,23 @@ | |||
| 1 | #ifndef __ASMARM_SMP_TWD_H | 1 | #ifndef __ASMARM_SMP_TWD_H |
| 2 | #define __ASMARM_SMP_TWD_H | 2 | #define __ASMARM_SMP_TWD_H |
| 3 | 3 | ||
| 4 | #define TWD_TIMER_LOAD 0x00 | ||
| 5 | #define TWD_TIMER_COUNTER 0x04 | ||
| 6 | #define TWD_TIMER_CONTROL 0x08 | ||
| 7 | #define TWD_TIMER_INTSTAT 0x0C | ||
| 8 | |||
| 9 | #define TWD_WDOG_LOAD 0x20 | ||
| 10 | #define TWD_WDOG_COUNTER 0x24 | ||
| 11 | #define TWD_WDOG_CONTROL 0x28 | ||
| 12 | #define TWD_WDOG_INTSTAT 0x2C | ||
| 13 | #define TWD_WDOG_RESETSTAT 0x30 | ||
| 14 | #define TWD_WDOG_DISABLE 0x34 | ||
| 15 | |||
| 16 | #define TWD_TIMER_CONTROL_ENABLE (1 << 0) | ||
| 17 | #define TWD_TIMER_CONTROL_ONESHOT (0 << 1) | ||
| 18 | #define TWD_TIMER_CONTROL_PERIODIC (1 << 1) | ||
| 19 | #define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2) | ||
| 20 | |||
| 4 | struct clock_event_device; | 21 | struct clock_event_device; |
| 5 | 22 | ||
| 6 | extern void __iomem *twd_base; | 23 | extern void __iomem *twd_base; |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index e085e2c545eb..bd863d8608cd 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -46,6 +46,9 @@ | |||
| 46 | #define TLB_V7_UIS_FULL (1 << 20) | 46 | #define TLB_V7_UIS_FULL (1 << 20) |
| 47 | #define TLB_V7_UIS_ASID (1 << 21) | 47 | #define TLB_V7_UIS_ASID (1 << 21) |
| 48 | 48 | ||
| 49 | /* Inner Shareable BTB operation (ARMv7 MP extensions) */ | ||
| 50 | #define TLB_V7_IS_BTB (1 << 22) | ||
| 51 | |||
| 49 | #define TLB_L2CLEAN_FR (1 << 29) /* Feroceon */ | 52 | #define TLB_L2CLEAN_FR (1 << 29) /* Feroceon */ |
| 50 | #define TLB_DCLEAN (1 << 30) | 53 | #define TLB_DCLEAN (1 << 30) |
| 51 | #define TLB_WB (1 << 31) | 54 | #define TLB_WB (1 << 31) |
| @@ -183,7 +186,7 @@ | |||
| 183 | #endif | 186 | #endif |
| 184 | 187 | ||
| 185 | #ifdef CONFIG_SMP | 188 | #ifdef CONFIG_SMP |
| 186 | #define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_BTB | \ | 189 | #define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_V7_IS_BTB | \ |
| 187 | TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | TLB_V7_UIS_ASID) | 190 | TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | TLB_V7_UIS_ASID) |
| 188 | #else | 191 | #else |
| 189 | #define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_BTB | \ | 192 | #define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_BTB | \ |
| @@ -339,6 +342,12 @@ static inline void local_flush_tlb_all(void) | |||
| 339 | dsb(); | 342 | dsb(); |
| 340 | isb(); | 343 | isb(); |
| 341 | } | 344 | } |
| 345 | if (tlb_flag(TLB_V7_IS_BTB)) { | ||
| 346 | /* flush the branch target cache */ | ||
| 347 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); | ||
| 348 | dsb(); | ||
| 349 | isb(); | ||
| 350 | } | ||
| 342 | } | 351 | } |
| 343 | 352 | ||
| 344 | static inline void local_flush_tlb_mm(struct mm_struct *mm) | 353 | static inline void local_flush_tlb_mm(struct mm_struct *mm) |
| @@ -376,6 +385,12 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) | |||
| 376 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc"); | 385 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc"); |
| 377 | dsb(); | 386 | dsb(); |
| 378 | } | 387 | } |
| 388 | if (tlb_flag(TLB_V7_IS_BTB)) { | ||
| 389 | /* flush the branch target cache */ | ||
| 390 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); | ||
| 391 | dsb(); | ||
| 392 | isb(); | ||
| 393 | } | ||
| 379 | } | 394 | } |
| 380 | 395 | ||
| 381 | static inline void | 396 | static inline void |
| @@ -416,6 +431,12 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
| 416 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc"); | 431 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc"); |
| 417 | dsb(); | 432 | dsb(); |
| 418 | } | 433 | } |
| 434 | if (tlb_flag(TLB_V7_IS_BTB)) { | ||
| 435 | /* flush the branch target cache */ | ||
| 436 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); | ||
| 437 | dsb(); | ||
| 438 | isb(); | ||
| 439 | } | ||
| 419 | } | 440 | } |
| 420 | 441 | ||
| 421 | static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | 442 | static inline void local_flush_tlb_kernel_page(unsigned long kaddr) |
| @@ -454,6 +475,12 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | |||
| 454 | dsb(); | 475 | dsb(); |
| 455 | isb(); | 476 | isb(); |
| 456 | } | 477 | } |
| 478 | if (tlb_flag(TLB_V7_IS_BTB)) { | ||
| 479 | /* flush the branch target cache */ | ||
| 480 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); | ||
| 481 | dsb(); | ||
| 482 | isb(); | ||
| 483 | } | ||
| 457 | } | 484 | } |
| 458 | 485 | ||
| 459 | /* | 486 | /* |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index ea02a7b1c244..7c5f0c024db7 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
| @@ -21,23 +21,6 @@ | |||
| 21 | #include <asm/smp_twd.h> | 21 | #include <asm/smp_twd.h> |
| 22 | #include <asm/hardware/gic.h> | 22 | #include <asm/hardware/gic.h> |
| 23 | 23 | ||
| 24 | #define TWD_TIMER_LOAD 0x00 | ||
| 25 | #define TWD_TIMER_COUNTER 0x04 | ||
| 26 | #define TWD_TIMER_CONTROL 0x08 | ||
| 27 | #define TWD_TIMER_INTSTAT 0x0C | ||
| 28 | |||
| 29 | #define TWD_WDOG_LOAD 0x20 | ||
| 30 | #define TWD_WDOG_COUNTER 0x24 | ||
| 31 | #define TWD_WDOG_CONTROL 0x28 | ||
| 32 | #define TWD_WDOG_INTSTAT 0x2C | ||
| 33 | #define TWD_WDOG_RESETSTAT 0x30 | ||
| 34 | #define TWD_WDOG_DISABLE 0x34 | ||
| 35 | |||
| 36 | #define TWD_TIMER_CONTROL_ENABLE (1 << 0) | ||
| 37 | #define TWD_TIMER_CONTROL_ONESHOT (0 << 1) | ||
| 38 | #define TWD_TIMER_CONTROL_PERIODIC (1 << 1) | ||
| 39 | #define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2) | ||
| 40 | |||
| 41 | /* set up by the platform code */ | 24 | /* set up by the platform code */ |
| 42 | void __iomem *twd_base; | 25 | void __iomem *twd_base; |
| 43 | 26 | ||
diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S index 5e3f99620c04..14a0d988c82c 100644 --- a/arch/arm/lib/clear_user.S +++ b/arch/arm/lib/clear_user.S | |||
| @@ -45,6 +45,7 @@ USER( strnebt r2, [r0]) | |||
| 45 | mov r0, #0 | 45 | mov r0, #0 |
| 46 | ldmfd sp!, {r1, pc} | 46 | ldmfd sp!, {r1, pc} |
| 47 | ENDPROC(__clear_user) | 47 | ENDPROC(__clear_user) |
| 48 | ENDPROC(__clear_user_std) | ||
| 48 | 49 | ||
| 49 | .pushsection .fixup,"ax" | 50 | .pushsection .fixup,"ax" |
| 50 | .align 0 | 51 | .align 0 |
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index 027b69bdbad1..d066df686e17 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S | |||
| @@ -93,6 +93,7 @@ WEAK(__copy_to_user) | |||
| 93 | #include "copy_template.S" | 93 | #include "copy_template.S" |
| 94 | 94 | ||
| 95 | ENDPROC(__copy_to_user) | 95 | ENDPROC(__copy_to_user) |
| 96 | ENDPROC(__copy_to_user_std) | ||
| 96 | 97 | ||
| 97 | .pushsection .fixup,"ax" | 98 | .pushsection .fixup,"ax" |
| 98 | .align 0 | 99 | .align 0 |
diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c index 122e61a9f505..e8cb982f5e8e 100644 --- a/arch/arm/mach-davinci/da830.c +++ b/arch/arm/mach-davinci/da830.c | |||
| @@ -410,7 +410,7 @@ static struct clk_lookup da830_clks[] = { | |||
| 410 | CLK("davinci-mcasp.0", NULL, &mcasp0_clk), | 410 | CLK("davinci-mcasp.0", NULL, &mcasp0_clk), |
| 411 | CLK("davinci-mcasp.1", NULL, &mcasp1_clk), | 411 | CLK("davinci-mcasp.1", NULL, &mcasp1_clk), |
| 412 | CLK("davinci-mcasp.2", NULL, &mcasp2_clk), | 412 | CLK("davinci-mcasp.2", NULL, &mcasp2_clk), |
| 413 | CLK("musb_hdrc", NULL, &usb20_clk), | 413 | CLK(NULL, "usb20", &usb20_clk), |
| 414 | CLK(NULL, "aemif", &aemif_clk), | 414 | CLK(NULL, "aemif", &aemif_clk), |
| 415 | CLK(NULL, "aintc", &aintc_clk), | 415 | CLK(NULL, "aintc", &aintc_clk), |
| 416 | CLK(NULL, "secu_mgr", &secu_mgr_clk), | 416 | CLK(NULL, "secu_mgr", &secu_mgr_clk), |
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index 9d89c67a1cc3..e46ecd847138 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S | |||
| @@ -211,6 +211,9 @@ v6_dma_inv_range: | |||
| 211 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line | 211 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line |
| 212 | #endif | 212 | #endif |
| 213 | 1: | 213 | 1: |
| 214 | #ifdef CONFIG_SMP | ||
| 215 | str r0, [r0] @ write for ownership | ||
| 216 | #endif | ||
| 214 | #ifdef HARVARD_CACHE | 217 | #ifdef HARVARD_CACHE |
| 215 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line | 218 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line |
| 216 | #else | 219 | #else |
| @@ -231,6 +234,9 @@ v6_dma_inv_range: | |||
| 231 | v6_dma_clean_range: | 234 | v6_dma_clean_range: |
| 232 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | 235 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 |
| 233 | 1: | 236 | 1: |
| 237 | #ifdef CONFIG_SMP | ||
| 238 | ldr r2, [r0] @ read for ownership | ||
| 239 | #endif | ||
| 234 | #ifdef HARVARD_CACHE | 240 | #ifdef HARVARD_CACHE |
| 235 | mcr p15, 0, r0, c7, c10, 1 @ clean D line | 241 | mcr p15, 0, r0, c7, c10, 1 @ clean D line |
| 236 | #else | 242 | #else |
| @@ -251,6 +257,10 @@ v6_dma_clean_range: | |||
| 251 | ENTRY(v6_dma_flush_range) | 257 | ENTRY(v6_dma_flush_range) |
| 252 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | 258 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 |
| 253 | 1: | 259 | 1: |
| 260 | #ifdef CONFIG_SMP | ||
| 261 | ldr r2, [r0] @ read for ownership | ||
| 262 | str r2, [r0] @ write for ownership | ||
| 263 | #endif | ||
| 254 | #ifdef HARVARD_CACHE | 264 | #ifdef HARVARD_CACHE |
| 255 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line | 265 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line |
| 256 | #else | 266 | #else |
| @@ -273,7 +283,9 @@ ENTRY(v6_dma_map_area) | |||
| 273 | add r1, r1, r0 | 283 | add r1, r1, r0 |
| 274 | teq r2, #DMA_FROM_DEVICE | 284 | teq r2, #DMA_FROM_DEVICE |
| 275 | beq v6_dma_inv_range | 285 | beq v6_dma_inv_range |
| 276 | b v6_dma_clean_range | 286 | teq r2, #DMA_TO_DEVICE |
| 287 | beq v6_dma_clean_range | ||
| 288 | b v6_dma_flush_range | ||
| 277 | ENDPROC(v6_dma_map_area) | 289 | ENDPROC(v6_dma_map_area) |
| 278 | 290 | ||
| 279 | /* | 291 | /* |
| @@ -283,9 +295,6 @@ ENDPROC(v6_dma_map_area) | |||
| 283 | * - dir - DMA direction | 295 | * - dir - DMA direction |
| 284 | */ | 296 | */ |
| 285 | ENTRY(v6_dma_unmap_area) | 297 | ENTRY(v6_dma_unmap_area) |
| 286 | add r1, r1, r0 | ||
| 287 | teq r2, #DMA_TO_DEVICE | ||
| 288 | bne v6_dma_inv_range | ||
| 289 | mov pc, lr | 298 | mov pc, lr |
| 290 | ENDPROC(v6_dma_unmap_area) | 299 | ENDPROC(v6_dma_unmap_area) |
| 291 | 300 | ||
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index bcd64f265870..06a90dcfc60a 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
| @@ -167,7 +167,11 @@ ENTRY(v7_coherent_user_range) | |||
| 167 | cmp r0, r1 | 167 | cmp r0, r1 |
| 168 | blo 1b | 168 | blo 1b |
| 169 | mov r0, #0 | 169 | mov r0, #0 |
| 170 | #ifdef CONFIG_SMP | ||
| 171 | mcr p15, 0, r0, c7, c1, 6 @ invalidate BTB Inner Shareable | ||
| 172 | #else | ||
| 170 | mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB | 173 | mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB |
| 174 | #endif | ||
| 171 | dsb | 175 | dsb |
| 172 | isb | 176 | isb |
| 173 | mov pc, lr | 177 | mov pc, lr |
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 9bfeb6b9509a..33b327379f07 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c | |||
| @@ -65,6 +65,15 @@ void flush_dcache_page(struct page *page) | |||
| 65 | } | 65 | } |
| 66 | EXPORT_SYMBOL(flush_dcache_page); | 66 | EXPORT_SYMBOL(flush_dcache_page); |
| 67 | 67 | ||
| 68 | void copy_to_user_page(struct vm_area_struct *vma, struct page *page, | ||
| 69 | unsigned long uaddr, void *dst, const void *src, | ||
| 70 | unsigned long len) | ||
| 71 | { | ||
| 72 | memcpy(dst, src, len); | ||
| 73 | if (vma->vm_flags & VM_EXEC) | ||
| 74 | __cpuc_coherent_user_range(uaddr, uaddr + len); | ||
| 75 | } | ||
| 76 | |||
| 68 | void __iomem *__arm_ioremap_pfn(unsigned long pfn, unsigned long offset, | 77 | void __iomem *__arm_ioremap_pfn(unsigned long pfn, unsigned long offset, |
| 69 | size_t size, unsigned int mtype) | 78 | size_t size, unsigned int mtype) |
| 70 | { | 79 | { |
| @@ -87,8 +96,8 @@ void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size, | |||
| 87 | } | 96 | } |
| 88 | EXPORT_SYMBOL(__arm_ioremap); | 97 | EXPORT_SYMBOL(__arm_ioremap); |
| 89 | 98 | ||
| 90 | void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size, | 99 | void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size, |
| 91 | unsigned int mtype, void *caller) | 100 | unsigned int mtype, void *caller) |
| 92 | { | 101 | { |
| 93 | return __arm_ioremap(phys_addr, size, mtype); | 102 | return __arm_ioremap(phys_addr, size, mtype); |
| 94 | } | 103 | } |
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S index 0cb1848bd876..f3f288a9546d 100644 --- a/arch/arm/mm/tlb-v7.S +++ b/arch/arm/mm/tlb-v7.S | |||
| @@ -50,7 +50,11 @@ ENTRY(v7wbi_flush_user_tlb_range) | |||
| 50 | cmp r0, r1 | 50 | cmp r0, r1 |
| 51 | blo 1b | 51 | blo 1b |
| 52 | mov ip, #0 | 52 | mov ip, #0 |
| 53 | #ifdef CONFIG_SMP | ||
| 54 | mcr p15, 0, ip, c7, c1, 6 @ flush BTAC/BTB Inner Shareable | ||
| 55 | #else | ||
| 53 | mcr p15, 0, ip, c7, c5, 6 @ flush BTAC/BTB | 56 | mcr p15, 0, ip, c7, c5, 6 @ flush BTAC/BTB |
| 57 | #endif | ||
| 54 | dsb | 58 | dsb |
| 55 | mov pc, lr | 59 | mov pc, lr |
| 56 | ENDPROC(v7wbi_flush_user_tlb_range) | 60 | ENDPROC(v7wbi_flush_user_tlb_range) |
| @@ -79,7 +83,11 @@ ENTRY(v7wbi_flush_kern_tlb_range) | |||
| 79 | cmp r0, r1 | 83 | cmp r0, r1 |
| 80 | blo 1b | 84 | blo 1b |
| 81 | mov r2, #0 | 85 | mov r2, #0 |
| 86 | #ifdef CONFIG_SMP | ||
| 87 | mcr p15, 0, r2, c7, c1, 6 @ flush BTAC/BTB Inner Shareable | ||
| 88 | #else | ||
| 82 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | 89 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB |
| 90 | #endif | ||
| 83 | dsb | 91 | dsb |
| 84 | isb | 92 | isb |
| 85 | mov pc, lr | 93 | mov pc, lr |
diff --git a/arch/avr32/include/asm/atomic.h b/arch/avr32/include/asm/atomic.h index b131c27ddf57..bbce6a1c6bb6 100644 --- a/arch/avr32/include/asm/atomic.h +++ b/arch/avr32/include/asm/atomic.h | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #define ATOMIC_INIT(i) { (i) } | 20 | #define ATOMIC_INIT(i) { (i) } |
| 21 | 21 | ||
| 22 | #define atomic_read(v) ((v)->counter) | 22 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 23 | #define atomic_set(v, i) (((v)->counter) = i) | 23 | #define atomic_set(v, i) (((v)->counter) = i) |
| 24 | 24 | ||
| 25 | /* | 25 | /* |
diff --git a/arch/cris/include/asm/atomic.h b/arch/cris/include/asm/atomic.h index a6aca819e9f3..88dc9b9c4ba0 100644 --- a/arch/cris/include/asm/atomic.h +++ b/arch/cris/include/asm/atomic.h | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | #define ATOMIC_INIT(i) { (i) } | 16 | #define ATOMIC_INIT(i) { (i) } |
| 17 | 17 | ||
| 18 | #define atomic_read(v) ((v)->counter) | 18 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 19 | #define atomic_set(v,i) (((v)->counter) = (i)) | 19 | #define atomic_set(v,i) (((v)->counter) = (i)) |
| 20 | 20 | ||
| 21 | /* These should be written in asm but we do it in C for now. */ | 21 | /* These should be written in asm but we do it in C for now. */ |
diff --git a/arch/frv/include/asm/atomic.h b/arch/frv/include/asm/atomic.h index 00a57af79afc..fae32c7fdcb6 100644 --- a/arch/frv/include/asm/atomic.h +++ b/arch/frv/include/asm/atomic.h | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | #define smp_mb__after_atomic_inc() barrier() | 36 | #define smp_mb__after_atomic_inc() barrier() |
| 37 | 37 | ||
| 38 | #define ATOMIC_INIT(i) { (i) } | 38 | #define ATOMIC_INIT(i) { (i) } |
| 39 | #define atomic_read(v) ((v)->counter) | 39 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 40 | #define atomic_set(v, i) (((v)->counter) = (i)) | 40 | #define atomic_set(v, i) (((v)->counter) = (i)) |
| 41 | 41 | ||
| 42 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | 42 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS |
diff --git a/arch/h8300/include/asm/atomic.h b/arch/h8300/include/asm/atomic.h index 33c8c0fa9583..e936804b7508 100644 --- a/arch/h8300/include/asm/atomic.h +++ b/arch/h8300/include/asm/atomic.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #define ATOMIC_INIT(i) { (i) } | 11 | #define ATOMIC_INIT(i) { (i) } |
| 12 | 12 | ||
| 13 | #define atomic_read(v) ((v)->counter) | 13 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 14 | #define atomic_set(v, i) (((v)->counter) = i) | 14 | #define atomic_set(v, i) (((v)->counter) = i) |
| 15 | 15 | ||
| 16 | #include <asm/system.h> | 16 | #include <asm/system.h> |
diff --git a/arch/ia64/include/asm/atomic.h b/arch/ia64/include/asm/atomic.h index 88405cb0832a..4e1948447a00 100644 --- a/arch/ia64/include/asm/atomic.h +++ b/arch/ia64/include/asm/atomic.h | |||
| @@ -21,8 +21,8 @@ | |||
| 21 | #define ATOMIC_INIT(i) ((atomic_t) { (i) }) | 21 | #define ATOMIC_INIT(i) ((atomic_t) { (i) }) |
| 22 | #define ATOMIC64_INIT(i) ((atomic64_t) { (i) }) | 22 | #define ATOMIC64_INIT(i) ((atomic64_t) { (i) }) |
| 23 | 23 | ||
| 24 | #define atomic_read(v) ((v)->counter) | 24 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 25 | #define atomic64_read(v) ((v)->counter) | 25 | #define atomic64_read(v) (*(volatile long *)&(v)->counter) |
| 26 | 26 | ||
| 27 | #define atomic_set(v,i) (((v)->counter) = (i)) | 27 | #define atomic_set(v,i) (((v)->counter) = (i)) |
| 28 | #define atomic64_set(v,i) (((v)->counter) = (i)) | 28 | #define atomic64_set(v,i) (((v)->counter) = (i)) |
diff --git a/arch/m32r/include/asm/atomic.h b/arch/m32r/include/asm/atomic.h index 63f0cf0f50dd..d44a51e5271b 100644 --- a/arch/m32r/include/asm/atomic.h +++ b/arch/m32r/include/asm/atomic.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | * | 26 | * |
| 27 | * Atomically reads the value of @v. | 27 | * Atomically reads the value of @v. |
| 28 | */ | 28 | */ |
| 29 | #define atomic_read(v) ((v)->counter) | 29 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * atomic_set - set atomic variable | 32 | * atomic_set - set atomic variable |
diff --git a/arch/m68k/amiga/Makefile b/arch/m68k/amiga/Makefile index 6a0d7650f980..11dd30b16b3b 100644 --- a/arch/m68k/amiga/Makefile +++ b/arch/m68k/amiga/Makefile | |||
| @@ -2,6 +2,6 @@ | |||
| 2 | # Makefile for Linux arch/m68k/amiga source directory | 2 | # Makefile for Linux arch/m68k/amiga source directory |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := config.o amiints.o cia.o chipram.o amisound.o | 5 | obj-y := config.o amiints.o cia.o chipram.o amisound.o platform.o |
| 6 | 6 | ||
| 7 | obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o | 7 | obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o |
diff --git a/arch/m68k/amiga/platform.c b/arch/m68k/amiga/platform.c new file mode 100644 index 000000000000..38f18bf14737 --- /dev/null +++ b/arch/m68k/amiga/platform.c | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007-2009 Geert Uytterhoeven | ||
| 3 | * | ||
| 4 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 5 | * License. See the file COPYING in the main directory of this archive | ||
| 6 | * for more details. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/platform_device.h> | ||
| 11 | #include <linux/zorro.h> | ||
| 12 | |||
| 13 | #include <asm/amigahw.h> | ||
| 14 | |||
| 15 | |||
| 16 | #ifdef CONFIG_ZORRO | ||
| 17 | |||
| 18 | static const struct resource zorro_resources[] __initconst = { | ||
| 19 | /* Zorro II regions (on Zorro II/III) */ | ||
| 20 | { | ||
| 21 | .name = "Zorro II exp", | ||
| 22 | .start = 0x00e80000, | ||
| 23 | .end = 0x00efffff, | ||
| 24 | .flags = IORESOURCE_MEM, | ||
| 25 | }, { | ||
| 26 | .name = "Zorro II mem", | ||
| 27 | .start = 0x00200000, | ||
| 28 | .end = 0x009fffff, | ||
| 29 | .flags = IORESOURCE_MEM, | ||
| 30 | }, | ||
| 31 | /* Zorro III regions (on Zorro III only) */ | ||
| 32 | { | ||
| 33 | .name = "Zorro III exp", | ||
| 34 | .start = 0xff000000, | ||
| 35 | .end = 0xffffffff, | ||
| 36 | .flags = IORESOURCE_MEM, | ||
| 37 | }, { | ||
| 38 | .name = "Zorro III cfg", | ||
| 39 | .start = 0x40000000, | ||
| 40 | .end = 0x7fffffff, | ||
| 41 | .flags = IORESOURCE_MEM, | ||
| 42 | } | ||
| 43 | }; | ||
| 44 | |||
| 45 | |||
| 46 | static int __init amiga_init_bus(void) | ||
| 47 | { | ||
| 48 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) | ||
| 49 | return -ENODEV; | ||
| 50 | |||
| 51 | platform_device_register_simple("amiga-zorro", -1, zorro_resources, | ||
| 52 | AMIGAHW_PRESENT(ZORRO3) ? 4 : 2); | ||
| 53 | return 0; | ||
| 54 | } | ||
| 55 | |||
| 56 | subsys_initcall(amiga_init_bus); | ||
| 57 | |||
| 58 | #endif /* CONFIG_ZORRO */ | ||
| 59 | |||
| 60 | |||
| 61 | static int __init amiga_init_devices(void) | ||
| 62 | { | ||
| 63 | if (!MACH_IS_AMIGA) | ||
| 64 | return -ENODEV; | ||
| 65 | |||
| 66 | /* video hardware */ | ||
| 67 | if (AMIGAHW_PRESENT(AMI_VIDEO)) | ||
| 68 | platform_device_register_simple("amiga-video", -1, NULL, 0); | ||
| 69 | |||
| 70 | |||
| 71 | /* sound hardware */ | ||
| 72 | if (AMIGAHW_PRESENT(AMI_AUDIO)) | ||
| 73 | platform_device_register_simple("amiga-audio", -1, NULL, 0); | ||
| 74 | |||
| 75 | |||
| 76 | /* storage interfaces */ | ||
| 77 | if (AMIGAHW_PRESENT(AMI_FLOPPY)) | ||
| 78 | platform_device_register_simple("amiga-floppy", -1, NULL, 0); | ||
| 79 | |||
| 80 | return 0; | ||
| 81 | } | ||
| 82 | |||
| 83 | device_initcall(amiga_init_devices); | ||
diff --git a/arch/m68k/bvme6000/rtc.c b/arch/m68k/bvme6000/rtc.c index b46ea1714a89..cb8617bb194b 100644 --- a/arch/m68k/bvme6000/rtc.c +++ b/arch/m68k/bvme6000/rtc.c | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
| 10 | #include <linux/errno.h> | 10 | #include <linux/errno.h> |
| 11 | #include <linux/miscdevice.h> | 11 | #include <linux/miscdevice.h> |
| 12 | #include <linux/smp_lock.h> | ||
| 13 | #include <linux/ioport.h> | 12 | #include <linux/ioport.h> |
| 14 | #include <linux/capability.h> | 13 | #include <linux/capability.h> |
| 15 | #include <linux/fcntl.h> | 14 | #include <linux/fcntl.h> |
| @@ -35,10 +34,9 @@ | |||
| 35 | static unsigned char days_in_mo[] = | 34 | static unsigned char days_in_mo[] = |
| 36 | {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | 35 | {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; |
| 37 | 36 | ||
| 38 | static char rtc_status; | 37 | static atomic_t rtc_status = ATOMIC_INIT(1); |
| 39 | 38 | ||
| 40 | static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 39 | static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 41 | unsigned long arg) | ||
| 42 | { | 40 | { |
| 43 | volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; | 41 | volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; |
| 44 | unsigned char msr; | 42 | unsigned char msr; |
| @@ -132,29 +130,20 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
| 132 | } | 130 | } |
| 133 | 131 | ||
| 134 | /* | 132 | /* |
| 135 | * We enforce only one user at a time here with the open/close. | 133 | * We enforce only one user at a time here with the open/close. |
| 136 | * Also clear the previous interrupt data on an open, and clean | ||
| 137 | * up things on a close. | ||
| 138 | */ | 134 | */ |
| 139 | |||
| 140 | static int rtc_open(struct inode *inode, struct file *file) | 135 | static int rtc_open(struct inode *inode, struct file *file) |
| 141 | { | 136 | { |
| 142 | lock_kernel(); | 137 | if (!atomic_dec_and_test(&rtc_status)) { |
| 143 | if(rtc_status) { | 138 | atomic_inc(&rtc_status); |
| 144 | unlock_kernel(); | ||
| 145 | return -EBUSY; | 139 | return -EBUSY; |
| 146 | } | 140 | } |
| 147 | |||
| 148 | rtc_status = 1; | ||
| 149 | unlock_kernel(); | ||
| 150 | return 0; | 141 | return 0; |
| 151 | } | 142 | } |
| 152 | 143 | ||
| 153 | static int rtc_release(struct inode *inode, struct file *file) | 144 | static int rtc_release(struct inode *inode, struct file *file) |
| 154 | { | 145 | { |
| 155 | lock_kernel(); | 146 | atomic_inc(&rtc_status); |
| 156 | rtc_status = 0; | ||
| 157 | unlock_kernel(); | ||
| 158 | return 0; | 147 | return 0; |
| 159 | } | 148 | } |
| 160 | 149 | ||
| @@ -163,9 +152,9 @@ static int rtc_release(struct inode *inode, struct file *file) | |||
| 163 | */ | 152 | */ |
| 164 | 153 | ||
| 165 | static const struct file_operations rtc_fops = { | 154 | static const struct file_operations rtc_fops = { |
| 166 | .ioctl = rtc_ioctl, | 155 | .unlocked_ioctl = rtc_ioctl, |
| 167 | .open = rtc_open, | 156 | .open = rtc_open, |
| 168 | .release = rtc_release, | 157 | .release = rtc_release, |
| 169 | }; | 158 | }; |
| 170 | 159 | ||
| 171 | static struct miscdevice rtc_dev = { | 160 | static struct miscdevice rtc_dev = { |
diff --git a/arch/m68k/hp300/time.h b/arch/m68k/hp300/time.h index f5b3d098b0f5..7b98242960de 100644 --- a/arch/m68k/hp300/time.h +++ b/arch/m68k/hp300/time.h | |||
| @@ -1,4 +1,2 @@ | |||
| 1 | extern void hp300_sched_init(irq_handler_t vector); | 1 | extern void hp300_sched_init(irq_handler_t vector); |
| 2 | extern unsigned long hp300_gettimeoffset (void); | 2 | extern unsigned long hp300_gettimeoffset(void); |
| 3 | |||
| 4 | |||
diff --git a/arch/m68k/include/asm/atomic_mm.h b/arch/m68k/include/asm/atomic_mm.h index d9d2ed647435..6a223b3f7e74 100644 --- a/arch/m68k/include/asm/atomic_mm.h +++ b/arch/m68k/include/asm/atomic_mm.h | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | #define ATOMIC_INIT(i) { (i) } | 16 | #define ATOMIC_INIT(i) { (i) } |
| 17 | 17 | ||
| 18 | #define atomic_read(v) ((v)->counter) | 18 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 19 | #define atomic_set(v, i) (((v)->counter) = i) | 19 | #define atomic_set(v, i) (((v)->counter) = i) |
| 20 | 20 | ||
| 21 | static inline void atomic_add(int i, atomic_t *v) | 21 | static inline void atomic_add(int i, atomic_t *v) |
diff --git a/arch/m68k/include/asm/atomic_no.h b/arch/m68k/include/asm/atomic_no.h index 5674cb9449bd..289310c63a8a 100644 --- a/arch/m68k/include/asm/atomic_no.h +++ b/arch/m68k/include/asm/atomic_no.h | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | #define ATOMIC_INIT(i) { (i) } | 16 | #define ATOMIC_INIT(i) { (i) } |
| 17 | 17 | ||
| 18 | #define atomic_read(v) ((v)->counter) | 18 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 19 | #define atomic_set(v, i) (((v)->counter) = i) | 19 | #define atomic_set(v, i) (((v)->counter) = i) |
| 20 | 20 | ||
| 21 | static __inline__ void atomic_add(int i, atomic_t *v) | 21 | static __inline__ void atomic_add(int i, atomic_t *v) |
diff --git a/arch/m68k/include/asm/bitops_mm.h b/arch/m68k/include/asm/bitops_mm.h index 9bde784e7bad..b4ecdaada520 100644 --- a/arch/m68k/include/asm/bitops_mm.h +++ b/arch/m68k/include/asm/bitops_mm.h | |||
| @@ -365,6 +365,10 @@ static inline int minix_test_bit(int nr, const void *vaddr) | |||
| 365 | #define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) | 365 | #define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) |
| 366 | #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) | 366 | #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) |
| 367 | #define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) | 367 | #define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) |
| 368 | #define ext2_find_next_zero_bit(addr, size, offset) \ | ||
| 369 | generic_find_next_zero_le_bit((unsigned long *)addr, size, offset) | ||
| 370 | #define ext2_find_next_bit(addr, size, offset) \ | ||
| 371 | generic_find_next_le_bit((unsigned long *)addr, size, offset) | ||
| 368 | 372 | ||
| 369 | static inline int ext2_test_bit(int nr, const void *vaddr) | 373 | static inline int ext2_test_bit(int nr, const void *vaddr) |
| 370 | { | 374 | { |
| @@ -394,10 +398,9 @@ static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size) | |||
| 394 | return (p - addr) * 32 + res; | 398 | return (p - addr) * 32 + res; |
| 395 | } | 399 | } |
| 396 | 400 | ||
| 397 | static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size, | 401 | static inline unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, |
| 398 | unsigned offset) | 402 | unsigned long size, unsigned long offset) |
| 399 | { | 403 | { |
| 400 | const unsigned long *addr = vaddr; | ||
| 401 | const unsigned long *p = addr + (offset >> 5); | 404 | const unsigned long *p = addr + (offset >> 5); |
| 402 | int bit = offset & 31UL, res; | 405 | int bit = offset & 31UL, res; |
| 403 | 406 | ||
| @@ -437,10 +440,9 @@ static inline int ext2_find_first_bit(const void *vaddr, unsigned size) | |||
| 437 | return (p - addr) * 32 + res; | 440 | return (p - addr) * 32 + res; |
| 438 | } | 441 | } |
| 439 | 442 | ||
| 440 | static inline int ext2_find_next_bit(const void *vaddr, unsigned size, | 443 | static inline unsigned long generic_find_next_le_bit(const unsigned long *addr, |
| 441 | unsigned offset) | 444 | unsigned long size, unsigned long offset) |
| 442 | { | 445 | { |
| 443 | const unsigned long *addr = vaddr; | ||
| 444 | const unsigned long *p = addr + (offset >> 5); | 446 | const unsigned long *p = addr + (offset >> 5); |
| 445 | int bit = offset & 31UL, res; | 447 | int bit = offset & 31UL, res; |
| 446 | 448 | ||
diff --git a/arch/m68k/include/asm/param.h b/arch/m68k/include/asm/param.h index 85c41b75aa78..36265ccf5c7b 100644 --- a/arch/m68k/include/asm/param.h +++ b/arch/m68k/include/asm/param.h | |||
| @@ -1,26 +1,12 @@ | |||
| 1 | #ifndef _M68K_PARAM_H | 1 | #ifndef _M68K_PARAM_H |
| 2 | #define _M68K_PARAM_H | 2 | #define _M68K_PARAM_H |
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | ||
| 5 | # define HZ CONFIG_HZ /* Internal kernel timer frequency */ | ||
| 6 | # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ | ||
| 7 | # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ | ||
| 8 | #endif | ||
| 9 | |||
| 10 | #ifndef HZ | ||
| 11 | #define HZ 100 | ||
| 12 | #endif | ||
| 13 | |||
| 14 | #ifdef __uClinux__ | 4 | #ifdef __uClinux__ |
| 15 | #define EXEC_PAGESIZE 4096 | 5 | #define EXEC_PAGESIZE 4096 |
| 16 | #else | 6 | #else |
| 17 | #define EXEC_PAGESIZE 8192 | 7 | #define EXEC_PAGESIZE 8192 |
| 18 | #endif | 8 | #endif |
| 19 | 9 | ||
| 20 | #ifndef NOGROUP | 10 | #include <asm-generic/param.h> |
| 21 | #define NOGROUP (-1) | ||
| 22 | #endif | ||
| 23 | |||
| 24 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | ||
| 25 | 11 | ||
| 26 | #endif /* _M68K_PARAM_H */ | 12 | #endif /* _M68K_PARAM_H */ |
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index aacd6d17b833..ada4f4cca811 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
| @@ -455,7 +455,7 @@ static inline void access_error040(struct frame *fp) | |||
| 455 | 455 | ||
| 456 | if (do_page_fault(&fp->ptregs, addr, errorcode)) { | 456 | if (do_page_fault(&fp->ptregs, addr, errorcode)) { |
| 457 | #ifdef DEBUG | 457 | #ifdef DEBUG |
| 458 | printk("do_page_fault() !=0 \n"); | 458 | printk("do_page_fault() !=0\n"); |
| 459 | #endif | 459 | #endif |
| 460 | if (user_mode(&fp->ptregs)){ | 460 | if (user_mode(&fp->ptregs)){ |
| 461 | /* delay writebacks after signal delivery */ | 461 | /* delay writebacks after signal delivery */ |
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index 0356da9bf763..1c16b1baf8db 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c | |||
| @@ -148,7 +148,7 @@ static void mac_cache_card_flush(int writeback) | |||
| 148 | void __init config_mac(void) | 148 | void __init config_mac(void) |
| 149 | { | 149 | { |
| 150 | if (!MACH_IS_MAC) | 150 | if (!MACH_IS_MAC) |
| 151 | printk(KERN_ERR "ERROR: no Mac, but config_mac() called!! \n"); | 151 | printk(KERN_ERR "ERROR: no Mac, but config_mac() called!!\n"); |
| 152 | 152 | ||
| 153 | mach_sched_init = mac_sched_init; | 153 | mach_sched_init = mac_sched_init; |
| 154 | mach_init_IRQ = mac_init_IRQ; | 154 | mach_init_IRQ = mac_init_IRQ; |
| @@ -867,7 +867,7 @@ static void __init mac_identify(void) | |||
| 867 | */ | 867 | */ |
| 868 | iop_preinit(); | 868 | iop_preinit(); |
| 869 | 869 | ||
| 870 | printk(KERN_INFO "Detected Macintosh model: %d \n", model); | 870 | printk(KERN_INFO "Detected Macintosh model: %d\n", model); |
| 871 | 871 | ||
| 872 | /* | 872 | /* |
| 873 | * Report booter data: | 873 | * Report booter data: |
| @@ -878,12 +878,12 @@ static void __init mac_identify(void) | |||
| 878 | mac_bi_data.videoaddr, mac_bi_data.videorow, | 878 | mac_bi_data.videoaddr, mac_bi_data.videorow, |
| 879 | mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF, | 879 | mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF, |
| 880 | mac_bi_data.dimensions >> 16); | 880 | mac_bi_data.dimensions >> 16); |
| 881 | printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx \n", | 881 | printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n", |
| 882 | mac_bi_data.videological, mac_orig_videoaddr, | 882 | mac_bi_data.videological, mac_orig_videoaddr, |
| 883 | mac_bi_data.sccbase); | 883 | mac_bi_data.sccbase); |
| 884 | printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx \n", | 884 | printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n", |
| 885 | mac_bi_data.boottime, mac_bi_data.gmtbias); | 885 | mac_bi_data.boottime, mac_bi_data.gmtbias); |
| 886 | printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n", | 886 | printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n", |
| 887 | mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); | 887 | mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); |
| 888 | 888 | ||
| 889 | iop_init(); | 889 | iop_init(); |
diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c index d0e35cf99fc6..a96394a0333d 100644 --- a/arch/m68k/mm/fault.c +++ b/arch/m68k/mm/fault.c | |||
| @@ -154,7 +154,6 @@ good_area: | |||
| 154 | * the fault. | 154 | * the fault. |
| 155 | */ | 155 | */ |
| 156 | 156 | ||
| 157 | survive: | ||
| 158 | fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); | 157 | fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); |
| 159 | #ifdef DEBUG | 158 | #ifdef DEBUG |
| 160 | printk("handle_mm_fault returns %d\n",fault); | 159 | printk("handle_mm_fault returns %d\n",fault); |
| @@ -180,15 +179,10 @@ good_area: | |||
| 180 | */ | 179 | */ |
| 181 | out_of_memory: | 180 | out_of_memory: |
| 182 | up_read(&mm->mmap_sem); | 181 | up_read(&mm->mmap_sem); |
| 183 | if (is_global_init(current)) { | 182 | if (!user_mode(regs)) |
| 184 | yield(); | 183 | goto no_context; |
| 185 | down_read(&mm->mmap_sem); | 184 | pagefault_out_of_memory(); |
| 186 | goto survive; | 185 | return 0; |
| 187 | } | ||
| 188 | |||
| 189 | printk("VM: killing process %s\n", current->comm); | ||
| 190 | if (user_mode(regs)) | ||
| 191 | do_group_exit(SIGKILL); | ||
| 192 | 186 | ||
| 193 | no_context: | 187 | no_context: |
| 194 | current->thread.signo = SIGBUS; | 188 | current->thread.signo = SIGBUS; |
diff --git a/arch/m68k/mvme16x/rtc.c b/arch/m68k/mvme16x/rtc.c index 8da9c250d3e1..11ac6f63967a 100644 --- a/arch/m68k/mvme16x/rtc.c +++ b/arch/m68k/mvme16x/rtc.c | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
| 10 | #include <linux/errno.h> | 10 | #include <linux/errno.h> |
| 11 | #include <linux/miscdevice.h> | 11 | #include <linux/miscdevice.h> |
| 12 | #include <linux/smp_lock.h> | ||
| 13 | #include <linux/ioport.h> | 12 | #include <linux/ioport.h> |
| 14 | #include <linux/capability.h> | 13 | #include <linux/capability.h> |
| 15 | #include <linux/fcntl.h> | 14 | #include <linux/fcntl.h> |
| @@ -36,8 +35,7 @@ static const unsigned char days_in_mo[] = | |||
| 36 | 35 | ||
| 37 | static atomic_t rtc_ready = ATOMIC_INIT(1); | 36 | static atomic_t rtc_ready = ATOMIC_INIT(1); |
| 38 | 37 | ||
| 39 | static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 38 | static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 40 | unsigned long arg) | ||
| 41 | { | 39 | { |
| 42 | volatile MK48T08ptr_t rtc = (MK48T08ptr_t)MVME_RTC_BASE; | 40 | volatile MK48T08ptr_t rtc = (MK48T08ptr_t)MVME_RTC_BASE; |
| 43 | unsigned long flags; | 41 | unsigned long flags; |
| @@ -120,22 +118,15 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
| 120 | } | 118 | } |
| 121 | 119 | ||
| 122 | /* | 120 | /* |
| 123 | * We enforce only one user at a time here with the open/close. | 121 | * We enforce only one user at a time here with the open/close. |
| 124 | * Also clear the previous interrupt data on an open, and clean | ||
| 125 | * up things on a close. | ||
| 126 | */ | 122 | */ |
| 127 | |||
| 128 | static int rtc_open(struct inode *inode, struct file *file) | 123 | static int rtc_open(struct inode *inode, struct file *file) |
| 129 | { | 124 | { |
| 130 | lock_kernel(); | ||
| 131 | if( !atomic_dec_and_test(&rtc_ready) ) | 125 | if( !atomic_dec_and_test(&rtc_ready) ) |
| 132 | { | 126 | { |
| 133 | atomic_inc( &rtc_ready ); | 127 | atomic_inc( &rtc_ready ); |
| 134 | unlock_kernel(); | ||
| 135 | return -EBUSY; | 128 | return -EBUSY; |
| 136 | } | 129 | } |
| 137 | unlock_kernel(); | ||
| 138 | |||
| 139 | return 0; | 130 | return 0; |
| 140 | } | 131 | } |
| 141 | 132 | ||
| @@ -150,9 +141,9 @@ static int rtc_release(struct inode *inode, struct file *file) | |||
| 150 | */ | 141 | */ |
| 151 | 142 | ||
| 152 | static const struct file_operations rtc_fops = { | 143 | static const struct file_operations rtc_fops = { |
| 153 | .ioctl = rtc_ioctl, | 144 | .unlocked_ioctl = rtc_ioctl, |
| 154 | .open = rtc_open, | 145 | .open = rtc_open, |
| 155 | .release = rtc_release, | 146 | .release = rtc_release, |
| 156 | }; | 147 | }; |
| 157 | 148 | ||
| 158 | static struct miscdevice rtc_dev= | 149 | static struct miscdevice rtc_dev= |
diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c index 31ab3f08bbda..ad10fecec2fe 100644 --- a/arch/m68k/q40/config.c +++ b/arch/m68k/q40/config.c | |||
| @@ -126,7 +126,7 @@ static void q40_reset(void) | |||
| 126 | { | 126 | { |
| 127 | halted = 1; | 127 | halted = 1; |
| 128 | printk("\n\n*******************************************\n" | 128 | printk("\n\n*******************************************\n" |
| 129 | "Called q40_reset : press the RESET button!! \n" | 129 | "Called q40_reset : press the RESET button!!\n" |
| 130 | "*******************************************\n"); | 130 | "*******************************************\n"); |
| 131 | Q40_LED_ON(); | 131 | Q40_LED_ON(); |
| 132 | while (1) | 132 | while (1) |
diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index 446bec29b142..26460d15b338 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h | |||
| @@ -182,6 +182,39 @@ extern long __user_bad(void); | |||
| 182 | * Returns zero on success, or -EFAULT on error. | 182 | * Returns zero on success, or -EFAULT on error. |
| 183 | * On error, the variable @x is set to zero. | 183 | * On error, the variable @x is set to zero. |
| 184 | */ | 184 | */ |
| 185 | #define get_user(x, ptr) \ | ||
| 186 | __get_user_check((x), (ptr), sizeof(*(ptr))) | ||
| 187 | |||
| 188 | #define __get_user_check(x, ptr, size) \ | ||
| 189 | ({ \ | ||
| 190 | unsigned long __gu_val = 0; \ | ||
| 191 | const typeof(*(ptr)) __user *__gu_addr = (ptr); \ | ||
| 192 | int __gu_err = 0; \ | ||
| 193 | \ | ||
| 194 | if (access_ok(VERIFY_READ, __gu_addr, size)) { \ | ||
| 195 | switch (size) { \ | ||
| 196 | case 1: \ | ||
| 197 | __get_user_asm("lbu", __gu_addr, __gu_val, \ | ||
| 198 | __gu_err); \ | ||
| 199 | break; \ | ||
| 200 | case 2: \ | ||
| 201 | __get_user_asm("lhu", __gu_addr, __gu_val, \ | ||
| 202 | __gu_err); \ | ||
| 203 | break; \ | ||
| 204 | case 4: \ | ||
| 205 | __get_user_asm("lw", __gu_addr, __gu_val, \ | ||
| 206 | __gu_err); \ | ||
| 207 | break; \ | ||
| 208 | default: \ | ||
| 209 | __gu_err = __user_bad(); \ | ||
| 210 | break; \ | ||
| 211 | } \ | ||
| 212 | } else { \ | ||
| 213 | __gu_err = -EFAULT; \ | ||
| 214 | } \ | ||
| 215 | x = (typeof(*(ptr)))__gu_val; \ | ||
| 216 | __gu_err; \ | ||
| 217 | }) | ||
| 185 | 218 | ||
| 186 | #define __get_user(x, ptr) \ | 219 | #define __get_user(x, ptr) \ |
| 187 | ({ \ | 220 | ({ \ |
| @@ -206,12 +239,6 @@ extern long __user_bad(void); | |||
| 206 | }) | 239 | }) |
| 207 | 240 | ||
| 208 | 241 | ||
| 209 | #define get_user(x, ptr) \ | ||
| 210 | ({ \ | ||
| 211 | access_ok(VERIFY_READ, (ptr), sizeof(*(ptr))) \ | ||
| 212 | ? __get_user((x), (ptr)) : -EFAULT; \ | ||
| 213 | }) | ||
| 214 | |||
| 215 | #define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \ | 242 | #define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \ |
| 216 | ({ \ | 243 | ({ \ |
| 217 | __asm__ __volatile__ ( \ | 244 | __asm__ __volatile__ ( \ |
| @@ -266,6 +293,42 @@ extern long __user_bad(void); | |||
| 266 | * | 293 | * |
| 267 | * Returns zero on success, or -EFAULT on error. | 294 | * Returns zero on success, or -EFAULT on error. |
| 268 | */ | 295 | */ |
| 296 | #define put_user(x, ptr) \ | ||
| 297 | __put_user_check((x), (ptr), sizeof(*(ptr))) | ||
| 298 | |||
| 299 | #define __put_user_check(x, ptr, size) \ | ||
| 300 | ({ \ | ||
| 301 | typeof(*(ptr)) __pu_val; \ | ||
| 302 | typeof(*(ptr)) __user *__pu_addr = (ptr); \ | ||
| 303 | int __pu_err = 0; \ | ||
| 304 | \ | ||
| 305 | __pu_val = (x); \ | ||
| 306 | if (access_ok(VERIFY_WRITE, __pu_addr, size)) { \ | ||
| 307 | switch (size) { \ | ||
| 308 | case 1: \ | ||
| 309 | __put_user_asm("sb", __pu_addr, __pu_val, \ | ||
| 310 | __pu_err); \ | ||
| 311 | break; \ | ||
| 312 | case 2: \ | ||
| 313 | __put_user_asm("sh", __pu_addr, __pu_val, \ | ||
| 314 | __pu_err); \ | ||
| 315 | break; \ | ||
| 316 | case 4: \ | ||
| 317 | __put_user_asm("sw", __pu_addr, __pu_val, \ | ||
| 318 | __pu_err); \ | ||
| 319 | break; \ | ||
| 320 | case 8: \ | ||
| 321 | __put_user_asm_8(__pu_addr, __pu_val, __pu_err);\ | ||
| 322 | break; \ | ||
| 323 | default: \ | ||
| 324 | __pu_err = __user_bad(); \ | ||
| 325 | break; \ | ||
| 326 | } \ | ||
| 327 | } else { \ | ||
| 328 | __pu_err = -EFAULT; \ | ||
| 329 | } \ | ||
| 330 | __pu_err; \ | ||
| 331 | }) | ||
| 269 | 332 | ||
| 270 | #define __put_user(x, ptr) \ | 333 | #define __put_user(x, ptr) \ |
| 271 | ({ \ | 334 | ({ \ |
| @@ -290,18 +353,6 @@ extern long __user_bad(void); | |||
| 290 | __gu_err; \ | 353 | __gu_err; \ |
| 291 | }) | 354 | }) |
| 292 | 355 | ||
| 293 | #ifndef CONFIG_MMU | ||
| 294 | |||
| 295 | #define put_user(x, ptr) __put_user((x), (ptr)) | ||
| 296 | |||
| 297 | #else /* CONFIG_MMU */ | ||
| 298 | |||
| 299 | #define put_user(x, ptr) \ | ||
| 300 | ({ \ | ||
| 301 | access_ok(VERIFY_WRITE, (ptr), sizeof(*(ptr))) \ | ||
| 302 | ? __put_user((x), (ptr)) : -EFAULT; \ | ||
| 303 | }) | ||
| 304 | #endif /* CONFIG_MMU */ | ||
| 305 | 356 | ||
| 306 | /* copy_to_from_user */ | 357 | /* copy_to_from_user */ |
| 307 | #define __copy_from_user(to, from, n) \ | 358 | #define __copy_from_user(to, from, n) \ |
diff --git a/arch/microblaze/kernel/cpu/cache.c b/arch/microblaze/kernel/cpu/cache.c index 21c3a92394de..109876e8d643 100644 --- a/arch/microblaze/kernel/cpu/cache.c +++ b/arch/microblaze/kernel/cpu/cache.c | |||
| @@ -137,8 +137,9 @@ do { \ | |||
| 137 | do { \ | 137 | do { \ |
| 138 | int step = -line_length; \ | 138 | int step = -line_length; \ |
| 139 | int align = ~(line_length - 1); \ | 139 | int align = ~(line_length - 1); \ |
| 140 | int count; \ | ||
| 140 | end = ((end & align) == end) ? end - line_length : end & align; \ | 141 | end = ((end & align) == end) ? end - line_length : end & align; \ |
| 141 | int count = end - start; \ | 142 | count = end - start; \ |
| 142 | WARN_ON(count < 0); \ | 143 | WARN_ON(count < 0); \ |
| 143 | \ | 144 | \ |
| 144 | __asm__ __volatile__ (" 1: " #op " %0, %1; \ | 145 | __asm__ __volatile__ (" 1: " #op " %0, %1; \ |
diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S index 391d6197fc3b..8cc18cd2cce6 100644 --- a/arch/microblaze/kernel/entry-nommu.S +++ b/arch/microblaze/kernel/entry-nommu.S | |||
| @@ -476,6 +476,8 @@ ENTRY(ret_from_fork) | |||
| 476 | nop | 476 | nop |
| 477 | 477 | ||
| 478 | work_pending: | 478 | work_pending: |
| 479 | enable_irq | ||
| 480 | |||
| 479 | andi r11, r19, _TIF_NEED_RESCHED | 481 | andi r11, r19, _TIF_NEED_RESCHED |
| 480 | beqi r11, 1f | 482 | beqi r11, 1f |
| 481 | bralid r15, schedule | 483 | bralid r15, schedule |
diff --git a/arch/microblaze/kernel/microblaze_ksyms.c b/arch/microblaze/kernel/microblaze_ksyms.c index bc4dcb7d3861..ff85f7718035 100644 --- a/arch/microblaze/kernel/microblaze_ksyms.c +++ b/arch/microblaze/kernel/microblaze_ksyms.c | |||
| @@ -52,3 +52,14 @@ EXPORT_SYMBOL_GPL(_ebss); | |||
| 52 | extern void _mcount(void); | 52 | extern void _mcount(void); |
| 53 | EXPORT_SYMBOL(_mcount); | 53 | EXPORT_SYMBOL(_mcount); |
| 54 | #endif | 54 | #endif |
| 55 | |||
| 56 | /* | ||
| 57 | * Assembly functions that may be used (directly or indirectly) by modules | ||
| 58 | */ | ||
| 59 | EXPORT_SYMBOL(__copy_tofrom_user); | ||
| 60 | EXPORT_SYMBOL(__strncpy_user); | ||
| 61 | |||
| 62 | #ifdef CONFIG_OPT_LIB_ASM | ||
| 63 | EXPORT_SYMBOL(memcpy); | ||
| 64 | EXPORT_SYMBOL(memmove); | ||
| 65 | #endif | ||
diff --git a/arch/microblaze/kernel/module.c b/arch/microblaze/kernel/module.c index cbecf110dc30..0e73f6606547 100644 --- a/arch/microblaze/kernel/module.c +++ b/arch/microblaze/kernel/module.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
| 17 | 17 | ||
| 18 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
| 19 | #include <asm/cacheflush.h> | ||
| 19 | 20 | ||
| 20 | void *module_alloc(unsigned long size) | 21 | void *module_alloc(unsigned long size) |
| 21 | { | 22 | { |
| @@ -151,6 +152,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
| 151 | int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | 152 | int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, |
| 152 | struct module *module) | 153 | struct module *module) |
| 153 | { | 154 | { |
| 155 | flush_dcache(); | ||
| 154 | return 0; | 156 | return 0; |
| 155 | } | 157 | } |
| 156 | 158 | ||
diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c index f42c2dde8b1c..cca3579d4268 100644 --- a/arch/microblaze/mm/init.c +++ b/arch/microblaze/mm/init.c | |||
| @@ -47,6 +47,7 @@ unsigned long memory_start; | |||
| 47 | EXPORT_SYMBOL(memory_start); | 47 | EXPORT_SYMBOL(memory_start); |
| 48 | unsigned long memory_end; /* due to mm/nommu.c */ | 48 | unsigned long memory_end; /* due to mm/nommu.c */ |
| 49 | unsigned long memory_size; | 49 | unsigned long memory_size; |
| 50 | EXPORT_SYMBOL(memory_size); | ||
| 50 | 51 | ||
| 51 | /* | 52 | /* |
| 52 | * paging_init() sets up the page tables - in fact we've already done this. | 53 | * paging_init() sets up the page tables - in fact we've already done this. |
diff --git a/arch/microblaze/mm/pgtable.c b/arch/microblaze/mm/pgtable.c index 784557fb28cf..59bf2335a4ce 100644 --- a/arch/microblaze/mm/pgtable.c +++ b/arch/microblaze/mm/pgtable.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | 42 | ||
| 43 | unsigned long ioremap_base; | 43 | unsigned long ioremap_base; |
| 44 | unsigned long ioremap_bot; | 44 | unsigned long ioremap_bot; |
| 45 | EXPORT_SYMBOL(ioremap_bot); | ||
| 45 | 46 | ||
| 46 | /* The maximum lowmem defaults to 768Mb, but this can be configured to | 47 | /* The maximum lowmem defaults to 768Mb, but this can be configured to |
| 47 | * another value. | 48 | * another value. |
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 01c8c97c15b7..9cb782b8e036 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c | |||
| @@ -1507,7 +1507,7 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus) | |||
| 1507 | pci_bus_add_devices(bus); | 1507 | pci_bus_add_devices(bus); |
| 1508 | 1508 | ||
| 1509 | /* Fixup EEH */ | 1509 | /* Fixup EEH */ |
| 1510 | eeh_add_device_tree_late(bus); | 1510 | /* eeh_add_device_tree_late(bus); */ |
| 1511 | } | 1511 | } |
| 1512 | EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); | 1512 | EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); |
| 1513 | 1513 | ||
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h index 519197ede089..59dc0c7ef733 100644 --- a/arch/mips/include/asm/atomic.h +++ b/arch/mips/include/asm/atomic.h | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | * | 29 | * |
| 30 | * Atomically reads the value of @v. | 30 | * Atomically reads the value of @v. |
| 31 | */ | 31 | */ |
| 32 | #define atomic_read(v) ((v)->counter) | 32 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 33 | 33 | ||
| 34 | /* | 34 | /* |
| 35 | * atomic_set - set atomic variable | 35 | * atomic_set - set atomic variable |
| @@ -410,7 +410,7 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | |||
| 410 | * @v: pointer of type atomic64_t | 410 | * @v: pointer of type atomic64_t |
| 411 | * | 411 | * |
| 412 | */ | 412 | */ |
| 413 | #define atomic64_read(v) ((v)->counter) | 413 | #define atomic64_read(v) (*(volatile long *)&(v)->counter) |
| 414 | 414 | ||
| 415 | /* | 415 | /* |
| 416 | * atomic64_set - set atomic variable | 416 | * atomic64_set - set atomic variable |
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 49382d5e891a..c6e3c93ce7c7 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
| @@ -135,6 +135,12 @@ | |||
| 135 | #define FPU_CSR_COND7 0x80000000 /* $fcc7 */ | 135 | #define FPU_CSR_COND7 0x80000000 /* $fcc7 */ |
| 136 | 136 | ||
| 137 | /* | 137 | /* |
| 138 | * Bits 18 - 20 of the FPU Status Register will be read as 0, | ||
| 139 | * and should be written as zero. | ||
| 140 | */ | ||
| 141 | #define FPU_CSR_RSVD 0x001c0000 | ||
| 142 | |||
| 143 | /* | ||
| 138 | * X the exception cause indicator | 144 | * X the exception cause indicator |
| 139 | * E the exception enable | 145 | * E the exception enable |
| 140 | * S the sticky/flag bit | 146 | * S the sticky/flag bit |
| @@ -161,7 +167,8 @@ | |||
| 161 | #define FPU_CSR_UDF_S 0x00000008 | 167 | #define FPU_CSR_UDF_S 0x00000008 |
| 162 | #define FPU_CSR_INE_S 0x00000004 | 168 | #define FPU_CSR_INE_S 0x00000004 |
| 163 | 169 | ||
| 164 | /* rounding mode */ | 170 | /* Bits 0 and 1 of FPU Status Register specify the rounding mode */ |
| 171 | #define FPU_CSR_RM 0x00000003 | ||
| 165 | #define FPU_CSR_RN 0x0 /* nearest */ | 172 | #define FPU_CSR_RN 0x0 /* nearest */ |
| 166 | #define FPU_CSR_RZ 0x1 /* towards zero */ | 173 | #define FPU_CSR_RZ 0x1 /* towards zero */ |
| 167 | #define FPU_CSR_RU 0x2 /* towards +Infinity */ | 174 | #define FPU_CSR_RU 0x2 /* towards +Infinity */ |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 44337ba03717..a5297e2a353a 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -385,7 +385,7 @@ EXPORT(sysn32_call_table) | |||
| 385 | PTR sys_fchmodat | 385 | PTR sys_fchmodat |
| 386 | PTR sys_faccessat | 386 | PTR sys_faccessat |
| 387 | PTR compat_sys_pselect6 | 387 | PTR compat_sys_pselect6 |
| 388 | PTR sys_ppoll /* 6265 */ | 388 | PTR compat_sys_ppoll /* 6265 */ |
| 389 | PTR sys_unshare | 389 | PTR sys_unshare |
| 390 | PTR sys_splice | 390 | PTR sys_splice |
| 391 | PTR sys_sync_file_range | 391 | PTR sys_sync_file_range |
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index 8f2f8e9d8b21..f2338d1c0b48 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
| @@ -78,6 +78,9 @@ DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats); | |||
| 78 | #define FPCREG_RID 0 /* $0 = revision id */ | 78 | #define FPCREG_RID 0 /* $0 = revision id */ |
| 79 | #define FPCREG_CSR 31 /* $31 = csr */ | 79 | #define FPCREG_CSR 31 /* $31 = csr */ |
| 80 | 80 | ||
| 81 | /* Determine rounding mode from the RM bits of the FCSR */ | ||
| 82 | #define modeindex(v) ((v) & FPU_CSR_RM) | ||
| 83 | |||
| 81 | /* Convert Mips rounding mode (0..3) to IEEE library modes. */ | 84 | /* Convert Mips rounding mode (0..3) to IEEE library modes. */ |
| 82 | static const unsigned char ieee_rm[4] = { | 85 | static const unsigned char ieee_rm[4] = { |
| 83 | [FPU_CSR_RN] = IEEE754_RN, | 86 | [FPU_CSR_RN] = IEEE754_RN, |
| @@ -384,10 +387,14 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
| 384 | (void *) (xcp->cp0_epc), | 387 | (void *) (xcp->cp0_epc), |
| 385 | MIPSInst_RT(ir), value); | 388 | MIPSInst_RT(ir), value); |
| 386 | #endif | 389 | #endif |
| 387 | value &= (FPU_CSR_FLUSH | FPU_CSR_ALL_E | FPU_CSR_ALL_S | 0x03); | 390 | |
| 388 | ctx->fcr31 &= ~(FPU_CSR_FLUSH | FPU_CSR_ALL_E | FPU_CSR_ALL_S | 0x03); | 391 | /* |
| 389 | /* convert to ieee library modes */ | 392 | * Don't write reserved bits, |
| 390 | ctx->fcr31 |= (value & ~0x3) | ieee_rm[value & 0x3]; | 393 | * and convert to ieee library modes |
| 394 | */ | ||
| 395 | ctx->fcr31 = (value & | ||
| 396 | ~(FPU_CSR_RSVD | FPU_CSR_RM)) | | ||
| 397 | ieee_rm[modeindex(value)]; | ||
| 391 | } | 398 | } |
| 392 | if ((ctx->fcr31 >> 5) & ctx->fcr31 & FPU_CSR_ALL_E) { | 399 | if ((ctx->fcr31 >> 5) & ctx->fcr31 & FPU_CSR_ALL_E) { |
| 393 | return SIGFPE; | 400 | return SIGFPE; |
diff --git a/arch/mips/oprofile/op_model_loongson2.c b/arch/mips/oprofile/op_model_loongson2.c index 29e2326b6257..fa3bf661ae29 100644 --- a/arch/mips/oprofile/op_model_loongson2.c +++ b/arch/mips/oprofile/op_model_loongson2.c | |||
| @@ -122,7 +122,7 @@ static irqreturn_t loongson2_perfcount_handler(int irq, void *dev_id) | |||
| 122 | */ | 122 | */ |
| 123 | 123 | ||
| 124 | /* Check whether the irq belongs to me */ | 124 | /* Check whether the irq belongs to me */ |
| 125 | enabled = read_c0_perfcnt() & LOONGSON2_PERFCNT_INT_EN; | 125 | enabled = read_c0_perfctrl() & LOONGSON2_PERFCNT_INT_EN; |
| 126 | if (!enabled) | 126 | if (!enabled) |
| 127 | return IRQ_NONE; | 127 | return IRQ_NONE; |
| 128 | enabled = reg.cnt1_enabled | reg.cnt2_enabled; | 128 | enabled = reg.cnt1_enabled | reg.cnt2_enabled; |
diff --git a/arch/mn10300/include/asm/atomic.h b/arch/mn10300/include/asm/atomic.h index 5bf5be9566de..e41222d6c2fd 100644 --- a/arch/mn10300/include/asm/atomic.h +++ b/arch/mn10300/include/asm/atomic.h | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | * Atomically reads the value of @v. Note that the guaranteed | 31 | * Atomically reads the value of @v. Note that the guaranteed |
| 32 | * useful range of an atomic_t is only 24 bits. | 32 | * useful range of an atomic_t is only 24 bits. |
| 33 | */ | 33 | */ |
| 34 | #define atomic_read(v) ((v)->counter) | 34 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 35 | 35 | ||
| 36 | /** | 36 | /** |
| 37 | * atomic_set - set atomic variable | 37 | * atomic_set - set atomic variable |
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h index 716634d1f546..f81955934aeb 100644 --- a/arch/parisc/include/asm/atomic.h +++ b/arch/parisc/include/asm/atomic.h | |||
| @@ -189,7 +189,7 @@ static __inline__ void atomic_set(atomic_t *v, int i) | |||
| 189 | 189 | ||
| 190 | static __inline__ int atomic_read(const atomic_t *v) | 190 | static __inline__ int atomic_read(const atomic_t *v) |
| 191 | { | 191 | { |
| 192 | return v->counter; | 192 | return (*(volatile int *)&(v)->counter); |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | /* exported interface */ | 195 | /* exported interface */ |
| @@ -286,7 +286,7 @@ atomic64_set(atomic64_t *v, s64 i) | |||
| 286 | static __inline__ s64 | 286 | static __inline__ s64 |
| 287 | atomic64_read(const atomic64_t *v) | 287 | atomic64_read(const atomic64_t *v) |
| 288 | { | 288 | { |
| 289 | return v->counter; | 289 | return (*(volatile long *)&(v)->counter); |
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | #define atomic64_add(i,v) ((void)(__atomic64_add_return( ((s64)(i)),(v)))) | 292 | #define atomic64_add(i,v) ((void)(__atomic64_add_return( ((s64)(i)),(v)))) |
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index 9f4c9d4f5803..bd100fcf40d0 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
| @@ -130,43 +130,5 @@ static inline int irqs_disabled_flags(unsigned long flags) | |||
| 130 | */ | 130 | */ |
| 131 | struct irq_chip; | 131 | struct irq_chip; |
| 132 | 132 | ||
| 133 | #ifdef CONFIG_PERF_EVENTS | ||
| 134 | |||
| 135 | #ifdef CONFIG_PPC64 | ||
| 136 | static inline unsigned long test_perf_event_pending(void) | ||
| 137 | { | ||
| 138 | unsigned long x; | ||
| 139 | |||
| 140 | asm volatile("lbz %0,%1(13)" | ||
| 141 | : "=r" (x) | ||
| 142 | : "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
| 143 | return x; | ||
| 144 | } | ||
| 145 | |||
| 146 | static inline void set_perf_event_pending(void) | ||
| 147 | { | ||
| 148 | asm volatile("stb %0,%1(13)" : : | ||
| 149 | "r" (1), | ||
| 150 | "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
| 151 | } | ||
| 152 | |||
| 153 | static inline void clear_perf_event_pending(void) | ||
| 154 | { | ||
| 155 | asm volatile("stb %0,%1(13)" : : | ||
| 156 | "r" (0), | ||
| 157 | "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
| 158 | } | ||
| 159 | #endif /* CONFIG_PPC64 */ | ||
| 160 | |||
| 161 | #else /* CONFIG_PERF_EVENTS */ | ||
| 162 | |||
| 163 | static inline unsigned long test_perf_event_pending(void) | ||
| 164 | { | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | |||
| 168 | static inline void clear_perf_event_pending(void) {} | ||
| 169 | #endif /* CONFIG_PERF_EVENTS */ | ||
| 170 | |||
| 171 | #endif /* __KERNEL__ */ | 133 | #endif /* __KERNEL__ */ |
| 172 | #endif /* _ASM_POWERPC_HW_IRQ_H */ | 134 | #endif /* _ASM_POWERPC_HW_IRQ_H */ |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 957ceb7059c5..c09138d150d4 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
| @@ -133,7 +133,6 @@ int main(void) | |||
| 133 | DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr)); | 133 | DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr)); |
| 134 | DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled)); | 134 | DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled)); |
| 135 | DEFINE(PACAHARDIRQEN, offsetof(struct paca_struct, hard_enabled)); | 135 | DEFINE(PACAHARDIRQEN, offsetof(struct paca_struct, hard_enabled)); |
| 136 | DEFINE(PACAPERFPEND, offsetof(struct paca_struct, perf_event_pending)); | ||
| 137 | DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); | 136 | DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); |
| 138 | #ifdef CONFIG_PPC_MM_SLICES | 137 | #ifdef CONFIG_PPC_MM_SLICES |
| 139 | DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct, | 138 | DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct, |
diff --git a/arch/powerpc/kernel/dma-swiotlb.c b/arch/powerpc/kernel/dma-swiotlb.c index 59c928564a03..4ff4da2c238b 100644 --- a/arch/powerpc/kernel/dma-swiotlb.c +++ b/arch/powerpc/kernel/dma-swiotlb.c | |||
| @@ -1,7 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Contains routines needed to support swiotlb for ppc. | 2 | * Contains routines needed to support swiotlb for ppc. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Becky Bruce, Freescale Semiconductor | 4 | * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. |
| 5 | * Author: Becky Bruce | ||
| 5 | * | 6 | * |
| 6 | * This program is free software; you can redistribute it and/or modify it | 7 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * under the terms of the GNU General Public License as published by the | 8 | * under the terms of the GNU General Public License as published by the |
| @@ -70,7 +71,7 @@ static int ppc_swiotlb_bus_notify(struct notifier_block *nb, | |||
| 70 | sd->max_direct_dma_addr = 0; | 71 | sd->max_direct_dma_addr = 0; |
| 71 | 72 | ||
| 72 | /* May need to bounce if the device can't address all of DRAM */ | 73 | /* May need to bounce if the device can't address all of DRAM */ |
| 73 | if (dma_get_mask(dev) < lmb_end_of_DRAM()) | 74 | if ((dma_get_mask(dev) + 1) < lmb_end_of_DRAM()) |
| 74 | set_dma_ops(dev, &swiotlb_dma_ops); | 75 | set_dma_ops(dev, &swiotlb_dma_ops); |
| 75 | 76 | ||
| 76 | return NOTIFY_DONE; | 77 | return NOTIFY_DONE; |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 07109d843787..42e9d908914a 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -556,15 +556,6 @@ ALT_FW_FTR_SECTION_END_IFCLR(FW_FEATURE_ISERIES) | |||
| 556 | 2: | 556 | 2: |
| 557 | TRACE_AND_RESTORE_IRQ(r5); | 557 | TRACE_AND_RESTORE_IRQ(r5); |
| 558 | 558 | ||
| 559 | #ifdef CONFIG_PERF_EVENTS | ||
| 560 | /* check paca->perf_event_pending if we're enabling ints */ | ||
| 561 | lbz r3,PACAPERFPEND(r13) | ||
| 562 | and. r3,r3,r5 | ||
| 563 | beq 27f | ||
| 564 | bl .perf_event_do_pending | ||
| 565 | 27: | ||
| 566 | #endif /* CONFIG_PERF_EVENTS */ | ||
| 567 | |||
| 568 | /* extract EE bit and use it to restore paca->hard_enabled */ | 559 | /* extract EE bit and use it to restore paca->hard_enabled */ |
| 569 | ld r3,_MSR(r1) | 560 | ld r3,_MSR(r1) |
| 570 | rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */ | 561 | rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */ |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 64f6f2031c22..066bd31551d5 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -53,7 +53,6 @@ | |||
| 53 | #include <linux/bootmem.h> | 53 | #include <linux/bootmem.h> |
| 54 | #include <linux/pci.h> | 54 | #include <linux/pci.h> |
| 55 | #include <linux/debugfs.h> | 55 | #include <linux/debugfs.h> |
| 56 | #include <linux/perf_event.h> | ||
| 57 | 56 | ||
| 58 | #include <asm/uaccess.h> | 57 | #include <asm/uaccess.h> |
| 59 | #include <asm/system.h> | 58 | #include <asm/system.h> |
| @@ -145,11 +144,6 @@ notrace void raw_local_irq_restore(unsigned long en) | |||
| 145 | } | 144 | } |
| 146 | #endif /* CONFIG_PPC_STD_MMU_64 */ | 145 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
| 147 | 146 | ||
| 148 | if (test_perf_event_pending()) { | ||
| 149 | clear_perf_event_pending(); | ||
| 150 | perf_event_do_pending(); | ||
| 151 | } | ||
| 152 | |||
| 153 | /* | 147 | /* |
| 154 | * if (get_paca()->hard_enabled) return; | 148 | * if (get_paca()->hard_enabled) return; |
| 155 | * But again we need to take care that gcc gets hard_enabled directly | 149 | * But again we need to take care that gcc gets hard_enabled directly |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 1b16b9a3e49a..0441bbdadbd1 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -532,25 +532,60 @@ void __init iSeries_time_init_early(void) | |||
| 532 | } | 532 | } |
| 533 | #endif /* CONFIG_PPC_ISERIES */ | 533 | #endif /* CONFIG_PPC_ISERIES */ |
| 534 | 534 | ||
| 535 | #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_PPC32) | 535 | #ifdef CONFIG_PERF_EVENTS |
| 536 | DEFINE_PER_CPU(u8, perf_event_pending); | ||
| 537 | 536 | ||
| 538 | void set_perf_event_pending(void) | 537 | /* |
| 538 | * 64-bit uses a byte in the PACA, 32-bit uses a per-cpu variable... | ||
| 539 | */ | ||
| 540 | #ifdef CONFIG_PPC64 | ||
| 541 | static inline unsigned long test_perf_event_pending(void) | ||
| 539 | { | 542 | { |
| 540 | get_cpu_var(perf_event_pending) = 1; | 543 | unsigned long x; |
| 541 | set_dec(1); | 544 | |
| 542 | put_cpu_var(perf_event_pending); | 545 | asm volatile("lbz %0,%1(13)" |
| 546 | : "=r" (x) | ||
| 547 | : "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
| 548 | return x; | ||
| 543 | } | 549 | } |
| 544 | 550 | ||
| 551 | static inline void set_perf_event_pending_flag(void) | ||
| 552 | { | ||
| 553 | asm volatile("stb %0,%1(13)" : : | ||
| 554 | "r" (1), | ||
| 555 | "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
| 556 | } | ||
| 557 | |||
| 558 | static inline void clear_perf_event_pending(void) | ||
| 559 | { | ||
| 560 | asm volatile("stb %0,%1(13)" : : | ||
| 561 | "r" (0), | ||
| 562 | "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
| 563 | } | ||
| 564 | |||
| 565 | #else /* 32-bit */ | ||
| 566 | |||
| 567 | DEFINE_PER_CPU(u8, perf_event_pending); | ||
| 568 | |||
| 569 | #define set_perf_event_pending_flag() __get_cpu_var(perf_event_pending) = 1 | ||
| 545 | #define test_perf_event_pending() __get_cpu_var(perf_event_pending) | 570 | #define test_perf_event_pending() __get_cpu_var(perf_event_pending) |
| 546 | #define clear_perf_event_pending() __get_cpu_var(perf_event_pending) = 0 | 571 | #define clear_perf_event_pending() __get_cpu_var(perf_event_pending) = 0 |
| 547 | 572 | ||
| 548 | #else /* CONFIG_PERF_EVENTS && CONFIG_PPC32 */ | 573 | #endif /* 32 vs 64 bit */ |
| 574 | |||
| 575 | void set_perf_event_pending(void) | ||
| 576 | { | ||
| 577 | preempt_disable(); | ||
| 578 | set_perf_event_pending_flag(); | ||
| 579 | set_dec(1); | ||
| 580 | preempt_enable(); | ||
| 581 | } | ||
| 582 | |||
| 583 | #else /* CONFIG_PERF_EVENTS */ | ||
| 549 | 584 | ||
| 550 | #define test_perf_event_pending() 0 | 585 | #define test_perf_event_pending() 0 |
| 551 | #define clear_perf_event_pending() | 586 | #define clear_perf_event_pending() |
| 552 | 587 | ||
| 553 | #endif /* CONFIG_PERF_EVENTS && CONFIG_PPC32 */ | 588 | #endif /* CONFIG_PERF_EVENTS */ |
| 554 | 589 | ||
| 555 | /* | 590 | /* |
| 556 | * For iSeries shared processors, we have to let the hypervisor | 591 | * For iSeries shared processors, we have to let the hypervisor |
| @@ -582,10 +617,6 @@ void timer_interrupt(struct pt_regs * regs) | |||
| 582 | set_dec(DECREMENTER_MAX); | 617 | set_dec(DECREMENTER_MAX); |
| 583 | 618 | ||
| 584 | #ifdef CONFIG_PPC32 | 619 | #ifdef CONFIG_PPC32 |
| 585 | if (test_perf_event_pending()) { | ||
| 586 | clear_perf_event_pending(); | ||
| 587 | perf_event_do_pending(); | ||
| 588 | } | ||
| 589 | if (atomic_read(&ppc_n_lost_interrupts) != 0) | 620 | if (atomic_read(&ppc_n_lost_interrupts) != 0) |
| 590 | do_IRQ(regs); | 621 | do_IRQ(regs); |
| 591 | #endif | 622 | #endif |
| @@ -604,6 +635,11 @@ void timer_interrupt(struct pt_regs * regs) | |||
| 604 | 635 | ||
| 605 | calculate_steal_time(); | 636 | calculate_steal_time(); |
| 606 | 637 | ||
| 638 | if (test_perf_event_pending()) { | ||
| 639 | clear_perf_event_pending(); | ||
| 640 | perf_event_do_pending(); | ||
| 641 | } | ||
| 642 | |||
| 607 | #ifdef CONFIG_PPC_ISERIES | 643 | #ifdef CONFIG_PPC_ISERIES |
| 608 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | 644 | if (firmware_has_feature(FW_FEATURE_ISERIES)) |
| 609 | get_lppaca()->int_dword.fields.decr_int = 0; | 645 | get_lppaca()->int_dword.fields.decr_int = 0; |
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c index 2570fcc7665d..812312542e50 100644 --- a/arch/powerpc/kvm/44x_tlb.c +++ b/arch/powerpc/kvm/44x_tlb.c | |||
| @@ -440,7 +440,7 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws) | |||
| 440 | unsigned int gtlb_index; | 440 | unsigned int gtlb_index; |
| 441 | 441 | ||
| 442 | gtlb_index = kvmppc_get_gpr(vcpu, ra); | 442 | gtlb_index = kvmppc_get_gpr(vcpu, ra); |
| 443 | if (gtlb_index > KVM44x_GUEST_TLB_SIZE) { | 443 | if (gtlb_index >= KVM44x_GUEST_TLB_SIZE) { |
| 444 | printk("%s: index %d\n", __func__, gtlb_index); | 444 | printk("%s: index %d\n", __func__, gtlb_index); |
| 445 | kvmppc_dump_vcpu(vcpu); | 445 | kvmppc_dump_vcpu(vcpu); |
| 446 | return EMULATE_FAIL; | 446 | return EMULATE_FAIL; |
diff --git a/arch/s390/kernel/head31.S b/arch/s390/kernel/head31.S index 1bbcc499d455..b8f8dc126102 100644 --- a/arch/s390/kernel/head31.S +++ b/arch/s390/kernel/head31.S | |||
| @@ -82,7 +82,7 @@ startup_continue: | |||
| 82 | _ehead: | 82 | _ehead: |
| 83 | 83 | ||
| 84 | #ifdef CONFIG_SHARED_KERNEL | 84 | #ifdef CONFIG_SHARED_KERNEL |
| 85 | .org 0x100000 | 85 | .org 0x100000 - 0x11000 # head.o ends at 0x11000 |
| 86 | #endif | 86 | #endif |
| 87 | 87 | ||
| 88 | # | 88 | # |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index 1f70970de0aa..cdef68717416 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
| @@ -80,7 +80,7 @@ startup_continue: | |||
| 80 | _ehead: | 80 | _ehead: |
| 81 | 81 | ||
| 82 | #ifdef CONFIG_SHARED_KERNEL | 82 | #ifdef CONFIG_SHARED_KERNEL |
| 83 | .org 0x100000 | 83 | .org 0x100000 - 0x11000 # head.o ends at 0x11000 |
| 84 | #endif | 84 | #endif |
| 85 | 85 | ||
| 86 | # | 86 | # |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 33fdc5a79764..9f654da4cecc 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
| @@ -640,7 +640,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 640 | 640 | ||
| 641 | asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | 641 | asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) |
| 642 | { | 642 | { |
| 643 | long ret; | 643 | long ret = 0; |
| 644 | 644 | ||
| 645 | /* Do the secure computing check first. */ | 645 | /* Do the secure computing check first. */ |
| 646 | secure_computing(regs->gprs[2]); | 646 | secure_computing(regs->gprs[2]); |
| @@ -649,7 +649,6 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
| 649 | * The sysc_tracesys code in entry.S stored the system | 649 | * The sysc_tracesys code in entry.S stored the system |
| 650 | * call number to gprs[2]. | 650 | * call number to gprs[2]. |
| 651 | */ | 651 | */ |
| 652 | ret = regs->gprs[2]; | ||
| 653 | if (test_thread_flag(TIF_SYSCALL_TRACE) && | 652 | if (test_thread_flag(TIF_SYSCALL_TRACE) && |
| 654 | (tracehook_report_syscall_entry(regs) || | 653 | (tracehook_report_syscall_entry(regs) || |
| 655 | regs->gprs[2] >= NR_syscalls)) { | 654 | regs->gprs[2] >= NR_syscalls)) { |
| @@ -671,7 +670,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
| 671 | regs->gprs[2], regs->orig_gpr2, | 670 | regs->gprs[2], regs->orig_gpr2, |
| 672 | regs->gprs[3], regs->gprs[4], | 671 | regs->gprs[3], regs->gprs[4], |
| 673 | regs->gprs[5]); | 672 | regs->gprs[5]); |
| 674 | return ret; | 673 | return ret ?: regs->gprs[2]; |
| 675 | } | 674 | } |
| 676 | 675 | ||
| 677 | asmlinkage void do_syscall_trace_exit(struct pt_regs *regs) | 676 | asmlinkage void do_syscall_trace_exit(struct pt_regs *regs) |
diff --git a/arch/sh/include/asm/atomic.h b/arch/sh/include/asm/atomic.h index 275a448ae8c2..c7983124d99d 100644 --- a/arch/sh/include/asm/atomic.h +++ b/arch/sh/include/asm/atomic.h | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) | 14 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) |
| 15 | 15 | ||
| 16 | #define atomic_read(v) ((v)->counter) | 16 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 17 | #define atomic_set(v,i) ((v)->counter = (i)) | 17 | #define atomic_set(v,i) ((v)->counter = (i)) |
| 18 | 18 | ||
| 19 | #if defined(CONFIG_GUSA_RB) | 19 | #if defined(CONFIG_GUSA_RB) |
diff --git a/arch/sparc/include/asm/atomic_32.h b/arch/sparc/include/asm/atomic_32.h index f0d343c3b956..7ae128b19d3f 100644 --- a/arch/sparc/include/asm/atomic_32.h +++ b/arch/sparc/include/asm/atomic_32.h | |||
| @@ -25,7 +25,7 @@ extern int atomic_cmpxchg(atomic_t *, int, int); | |||
| 25 | extern int atomic_add_unless(atomic_t *, int, int); | 25 | extern int atomic_add_unless(atomic_t *, int, int); |
| 26 | extern void atomic_set(atomic_t *, int); | 26 | extern void atomic_set(atomic_t *, int); |
| 27 | 27 | ||
| 28 | #define atomic_read(v) ((v)->counter) | 28 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 29 | 29 | ||
| 30 | #define atomic_add(i, v) ((void)__atomic_add_return( (int)(i), (v))) | 30 | #define atomic_add(i, v) ((void)__atomic_add_return( (int)(i), (v))) |
| 31 | #define atomic_sub(i, v) ((void)__atomic_add_return(-(int)(i), (v))) | 31 | #define atomic_sub(i, v) ((void)__atomic_add_return(-(int)(i), (v))) |
diff --git a/arch/sparc/include/asm/atomic_64.h b/arch/sparc/include/asm/atomic_64.h index f2e48009989e..2050ca02c423 100644 --- a/arch/sparc/include/asm/atomic_64.h +++ b/arch/sparc/include/asm/atomic_64.h | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | #define ATOMIC_INIT(i) { (i) } | 13 | #define ATOMIC_INIT(i) { (i) } |
| 14 | #define ATOMIC64_INIT(i) { (i) } | 14 | #define ATOMIC64_INIT(i) { (i) } |
| 15 | 15 | ||
| 16 | #define atomic_read(v) ((v)->counter) | 16 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 17 | #define atomic64_read(v) ((v)->counter) | 17 | #define atomic64_read(v) (*(volatile long *)&(v)->counter) |
| 18 | 18 | ||
| 19 | #define atomic_set(v, i) (((v)->counter) = i) | 19 | #define atomic_set(v, i) (((v)->counter) = i) |
| 20 | #define atomic64_set(v, i) (((v)->counter) = i) | 20 | #define atomic64_set(v, i) (((v)->counter) = i) |
diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h index 8f8217b9bdac..37b39d27abe0 100644 --- a/arch/x86/include/asm/atomic.h +++ b/arch/x86/include/asm/atomic.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | */ | 22 | */ |
| 23 | static inline int atomic_read(const atomic_t *v) | 23 | static inline int atomic_read(const atomic_t *v) |
| 24 | { | 24 | { |
| 25 | return v->counter; | 25 | return (*(volatile int *)&(v)->counter); |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h index 51c5b4056929..b014e235ea8d 100644 --- a/arch/x86/include/asm/atomic64_64.h +++ b/arch/x86/include/asm/atomic64_64.h | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | */ | 18 | */ |
| 19 | static inline long atomic64_read(const atomic64_t *v) | 19 | static inline long atomic64_read(const atomic64_t *v) |
| 20 | { | 20 | { |
| 21 | return v->counter; | 21 | return (*(volatile long *)&(v)->counter); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | /** | 24 | /** |
diff --git a/arch/x86/include/asm/k8.h b/arch/x86/include/asm/k8.h index f70e60071fe8..af00bd1d2089 100644 --- a/arch/x86/include/asm/k8.h +++ b/arch/x86/include/asm/k8.h | |||
| @@ -16,11 +16,16 @@ extern int k8_numa_init(unsigned long start_pfn, unsigned long end_pfn); | |||
| 16 | extern int k8_scan_nodes(void); | 16 | extern int k8_scan_nodes(void); |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_K8_NB | 18 | #ifdef CONFIG_K8_NB |
| 19 | extern int num_k8_northbridges; | ||
| 20 | |||
| 19 | static inline struct pci_dev *node_to_k8_nb_misc(int node) | 21 | static inline struct pci_dev *node_to_k8_nb_misc(int node) |
| 20 | { | 22 | { |
| 21 | return (node < num_k8_northbridges) ? k8_northbridges[node] : NULL; | 23 | return (node < num_k8_northbridges) ? k8_northbridges[node] : NULL; |
| 22 | } | 24 | } |
| 25 | |||
| 23 | #else | 26 | #else |
| 27 | #define num_k8_northbridges 0 | ||
| 28 | |||
| 24 | static inline struct pci_dev *node_to_k8_nb_misc(int node) | 29 | static inline struct pci_dev *node_to_k8_nb_misc(int node) |
| 25 | { | 30 | { |
| 26 | return NULL; | 31 | return NULL; |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index b3eeb66c0a51..95962a93f99a 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -340,6 +340,10 @@ amd_check_l3_disable(int index, struct _cpuid4_info_regs *this_leaf) | |||
| 340 | (boot_cpu_data.x86_mask < 0x1))) | 340 | (boot_cpu_data.x86_mask < 0x1))) |
| 341 | return; | 341 | return; |
| 342 | 342 | ||
| 343 | /* not in virtualized environments */ | ||
| 344 | if (num_k8_northbridges == 0) | ||
| 345 | return; | ||
| 346 | |||
| 343 | this_leaf->can_disable = true; | 347 | this_leaf->can_disable = true; |
| 344 | this_leaf->l3_indices = amd_calc_l3_indices(); | 348 | this_leaf->l3_indices = amd_calc_l3_indices(); |
| 345 | } | 349 | } |
diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c index b43bbaebe2c0..1658efdfb4e5 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes.c | |||
| @@ -534,20 +534,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
| 534 | struct kprobe_ctlblk *kcb; | 534 | struct kprobe_ctlblk *kcb; |
| 535 | 535 | ||
| 536 | addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); | 536 | addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); |
| 537 | if (*addr != BREAKPOINT_INSTRUCTION) { | ||
| 538 | /* | ||
| 539 | * The breakpoint instruction was removed right | ||
| 540 | * after we hit it. Another cpu has removed | ||
| 541 | * either a probepoint or a debugger breakpoint | ||
| 542 | * at this address. In either case, no further | ||
| 543 | * handling of this interrupt is appropriate. | ||
| 544 | * Back up over the (now missing) int3 and run | ||
| 545 | * the original instruction. | ||
| 546 | */ | ||
| 547 | regs->ip = (unsigned long)addr; | ||
| 548 | return 1; | ||
| 549 | } | ||
| 550 | |||
| 551 | /* | 537 | /* |
| 552 | * We don't want to be preempted for the entire | 538 | * We don't want to be preempted for the entire |
| 553 | * duration of kprobe processing. We conditionally | 539 | * duration of kprobe processing. We conditionally |
| @@ -579,6 +565,19 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
| 579 | setup_singlestep(p, regs, kcb, 0); | 565 | setup_singlestep(p, regs, kcb, 0); |
| 580 | return 1; | 566 | return 1; |
| 581 | } | 567 | } |
| 568 | } else if (*addr != BREAKPOINT_INSTRUCTION) { | ||
| 569 | /* | ||
| 570 | * The breakpoint instruction was removed right | ||
| 571 | * after we hit it. Another cpu has removed | ||
| 572 | * either a probepoint or a debugger breakpoint | ||
| 573 | * at this address. In either case, no further | ||
| 574 | * handling of this interrupt is appropriate. | ||
| 575 | * Back up over the (now missing) int3 and run | ||
| 576 | * the original instruction. | ||
| 577 | */ | ||
| 578 | regs->ip = (unsigned long)addr; | ||
| 579 | preempt_enable_no_resched(); | ||
| 580 | return 1; | ||
| 582 | } else if (kprobe_running()) { | 581 | } else if (kprobe_running()) { |
| 583 | p = __get_cpu_var(current_kprobe); | 582 | p = __get_cpu_var(current_kprobe); |
| 584 | if (p->break_handler && p->break_handler(p, regs)) { | 583 | if (p->break_handler && p->break_handler(p, regs)) { |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 28ad9f4d8b94..0415c3ef91b5 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -546,11 +546,13 @@ static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c) | |||
| 546 | * check OSVW bit for CPUs that are not affected | 546 | * check OSVW bit for CPUs that are not affected |
| 547 | * by erratum #400 | 547 | * by erratum #400 |
| 548 | */ | 548 | */ |
| 549 | rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); | 549 | if (cpu_has(c, X86_FEATURE_OSVW)) { |
| 550 | if (val >= 2) { | 550 | rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); |
| 551 | rdmsrl(MSR_AMD64_OSVW_STATUS, val); | 551 | if (val >= 2) { |
| 552 | if (!(val & BIT(1))) | 552 | rdmsrl(MSR_AMD64_OSVW_STATUS, val); |
| 553 | goto no_c1e_idle; | 553 | if (!(val & BIT(1))) |
| 554 | goto no_c1e_idle; | ||
| 555 | } | ||
| 554 | } | 556 | } |
| 555 | return 1; | 557 | return 1; |
| 556 | } | 558 | } |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 2ba58206812a..737361fcd503 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -2067,7 +2067,7 @@ static int cpuid_interception(struct vcpu_svm *svm) | |||
| 2067 | static int iret_interception(struct vcpu_svm *svm) | 2067 | static int iret_interception(struct vcpu_svm *svm) |
| 2068 | { | 2068 | { |
| 2069 | ++svm->vcpu.stat.nmi_window_exits; | 2069 | ++svm->vcpu.stat.nmi_window_exits; |
| 2070 | svm->vmcb->control.intercept &= ~(1UL << INTERCEPT_IRET); | 2070 | svm->vmcb->control.intercept &= ~(1ULL << INTERCEPT_IRET); |
| 2071 | svm->vcpu.arch.hflags |= HF_IRET_MASK; | 2071 | svm->vcpu.arch.hflags |= HF_IRET_MASK; |
| 2072 | return 1; | 2072 | return 1; |
| 2073 | } | 2073 | } |
| @@ -2479,7 +2479,7 @@ static void svm_inject_nmi(struct kvm_vcpu *vcpu) | |||
| 2479 | 2479 | ||
| 2480 | svm->vmcb->control.event_inj = SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_NMI; | 2480 | svm->vmcb->control.event_inj = SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_NMI; |
| 2481 | vcpu->arch.hflags |= HF_NMI_MASK; | 2481 | vcpu->arch.hflags |= HF_NMI_MASK; |
| 2482 | svm->vmcb->control.intercept |= (1UL << INTERCEPT_IRET); | 2482 | svm->vmcb->control.intercept |= (1ULL << INTERCEPT_IRET); |
| 2483 | ++vcpu->stat.nmi_injections; | 2483 | ++vcpu->stat.nmi_injections; |
| 2484 | } | 2484 | } |
| 2485 | 2485 | ||
| @@ -2539,10 +2539,10 @@ static void svm_set_nmi_mask(struct kvm_vcpu *vcpu, bool masked) | |||
| 2539 | 2539 | ||
| 2540 | if (masked) { | 2540 | if (masked) { |
| 2541 | svm->vcpu.arch.hflags |= HF_NMI_MASK; | 2541 | svm->vcpu.arch.hflags |= HF_NMI_MASK; |
| 2542 | svm->vmcb->control.intercept |= (1UL << INTERCEPT_IRET); | 2542 | svm->vmcb->control.intercept |= (1ULL << INTERCEPT_IRET); |
| 2543 | } else { | 2543 | } else { |
| 2544 | svm->vcpu.arch.hflags &= ~HF_NMI_MASK; | 2544 | svm->vcpu.arch.hflags &= ~HF_NMI_MASK; |
| 2545 | svm->vmcb->control.intercept &= ~(1UL << INTERCEPT_IRET); | 2545 | svm->vmcb->control.intercept &= ~(1ULL << INTERCEPT_IRET); |
| 2546 | } | 2546 | } |
| 2547 | } | 2547 | } |
| 2548 | 2548 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index bc933cfb4e66..2f8db0ec8ae4 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -2703,8 +2703,7 @@ static int vmx_nmi_allowed(struct kvm_vcpu *vcpu) | |||
| 2703 | return 0; | 2703 | return 0; |
| 2704 | 2704 | ||
| 2705 | return !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & | 2705 | return !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & |
| 2706 | (GUEST_INTR_STATE_STI | GUEST_INTR_STATE_MOV_SS | | 2706 | (GUEST_INTR_STATE_MOV_SS | GUEST_INTR_STATE_NMI)); |
| 2707 | GUEST_INTR_STATE_NMI)); | ||
| 2708 | } | 2707 | } |
| 2709 | 2708 | ||
| 2710 | static bool vmx_get_nmi_mask(struct kvm_vcpu *vcpu) | 2709 | static bool vmx_get_nmi_mask(struct kvm_vcpu *vcpu) |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3c4ca98ad27f..c4f35b545c1d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -1712,6 +1712,7 @@ static int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, | |||
| 1712 | if (copy_from_user(cpuid_entries, entries, | 1712 | if (copy_from_user(cpuid_entries, entries, |
| 1713 | cpuid->nent * sizeof(struct kvm_cpuid_entry))) | 1713 | cpuid->nent * sizeof(struct kvm_cpuid_entry))) |
| 1714 | goto out_free; | 1714 | goto out_free; |
| 1715 | vcpu_load(vcpu); | ||
| 1715 | for (i = 0; i < cpuid->nent; i++) { | 1716 | for (i = 0; i < cpuid->nent; i++) { |
| 1716 | vcpu->arch.cpuid_entries[i].function = cpuid_entries[i].function; | 1717 | vcpu->arch.cpuid_entries[i].function = cpuid_entries[i].function; |
| 1717 | vcpu->arch.cpuid_entries[i].eax = cpuid_entries[i].eax; | 1718 | vcpu->arch.cpuid_entries[i].eax = cpuid_entries[i].eax; |
| @@ -1729,6 +1730,7 @@ static int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, | |||
| 1729 | r = 0; | 1730 | r = 0; |
| 1730 | kvm_apic_set_version(vcpu); | 1731 | kvm_apic_set_version(vcpu); |
| 1731 | kvm_x86_ops->cpuid_update(vcpu); | 1732 | kvm_x86_ops->cpuid_update(vcpu); |
| 1733 | vcpu_put(vcpu); | ||
| 1732 | 1734 | ||
| 1733 | out_free: | 1735 | out_free: |
| 1734 | vfree(cpuid_entries); | 1736 | vfree(cpuid_entries); |
| @@ -1749,9 +1751,11 @@ static int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, | |||
| 1749 | if (copy_from_user(&vcpu->arch.cpuid_entries, entries, | 1751 | if (copy_from_user(&vcpu->arch.cpuid_entries, entries, |
| 1750 | cpuid->nent * sizeof(struct kvm_cpuid_entry2))) | 1752 | cpuid->nent * sizeof(struct kvm_cpuid_entry2))) |
| 1751 | goto out; | 1753 | goto out; |
| 1754 | vcpu_load(vcpu); | ||
| 1752 | vcpu->arch.cpuid_nent = cpuid->nent; | 1755 | vcpu->arch.cpuid_nent = cpuid->nent; |
| 1753 | kvm_apic_set_version(vcpu); | 1756 | kvm_apic_set_version(vcpu); |
| 1754 | kvm_x86_ops->cpuid_update(vcpu); | 1757 | kvm_x86_ops->cpuid_update(vcpu); |
| 1758 | vcpu_put(vcpu); | ||
| 1755 | return 0; | 1759 | return 0; |
| 1756 | 1760 | ||
| 1757 | out: | 1761 | out: |
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 28c68762648f..38512d0c4742 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
| @@ -461,7 +461,8 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes) | |||
| 461 | * node, it must now point to the fake node ID. | 461 | * node, it must now point to the fake node ID. |
| 462 | */ | 462 | */ |
| 463 | for (j = 0; j < MAX_LOCAL_APIC; j++) | 463 | for (j = 0; j < MAX_LOCAL_APIC; j++) |
| 464 | if (apicid_to_node[j] == nid) | 464 | if (apicid_to_node[j] == nid && |
| 465 | fake_apicid_to_node[j] == NUMA_NO_NODE) | ||
| 465 | fake_apicid_to_node[j] = i; | 466 | fake_apicid_to_node[j] = i; |
| 466 | } | 467 | } |
| 467 | for (i = 0; i < num_nodes; i++) | 468 | for (i = 0; i < num_nodes; i++) |
diff --git a/arch/x86/pci/mrst.c b/arch/x86/pci/mrst.c index 8bf2fcb88d04..1cdc02cf8fa4 100644 --- a/arch/x86/pci/mrst.c +++ b/arch/x86/pci/mrst.c | |||
| @@ -247,6 +247,10 @@ static void __devinit pci_fixed_bar_fixup(struct pci_dev *dev) | |||
| 247 | u32 size; | 247 | u32 size; |
| 248 | int i; | 248 | int i; |
| 249 | 249 | ||
| 250 | /* Must have extended configuration space */ | ||
| 251 | if (dev->cfg_size < PCIE_CAP_OFFSET + 4) | ||
| 252 | return; | ||
| 253 | |||
| 250 | /* Fixup the BAR sizes for fixed BAR devices and make them unmoveable */ | 254 | /* Fixup the BAR sizes for fixed BAR devices and make them unmoveable */ |
| 251 | offset = fixed_bar_cap(dev->bus, dev->devfn); | 255 | offset = fixed_bar_cap(dev->bus, dev->devfn); |
| 252 | if (!offset || PCI_DEVFN(2, 0) == dev->devfn || | 256 | if (!offset || PCI_DEVFN(2, 0) == dev->devfn || |
diff --git a/arch/xtensa/include/asm/atomic.h b/arch/xtensa/include/asm/atomic.h index 22d6dde42619..a96a0619d0b7 100644 --- a/arch/xtensa/include/asm/atomic.h +++ b/arch/xtensa/include/asm/atomic.h | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | * | 46 | * |
| 47 | * Atomically reads the value of @v. | 47 | * Atomically reads the value of @v. |
| 48 | */ | 48 | */ |
| 49 | #define atomic_read(v) ((v)->counter) | 49 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 50 | 50 | ||
| 51 | /** | 51 | /** |
| 52 | * atomic_set - set atomic variable | 52 | * atomic_set - set atomic variable |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index e2e992599e68..baa76bbf244a 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -475,101 +475,13 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 475 | }, | 475 | }, |
| 476 | { | 476 | { |
| 477 | .callback = init_set_sci_en_on_resume, | 477 | .callback = init_set_sci_en_on_resume, |
| 478 | .ident = "Lenovo ThinkPad X201", | 478 | .ident = "Lenovo ThinkPad X201[s]", |
| 479 | .matches = { | 479 | .matches = { |
| 480 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 480 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| 481 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | 481 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), |
| 482 | }, | 482 | }, |
| 483 | }, | 483 | }, |
| 484 | { | 484 | { |
| 485 | .callback = init_set_sci_en_on_resume, | ||
| 486 | .ident = "Lenovo ThinkPad X201", | ||
| 487 | .matches = { | ||
| 488 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 489 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
| 490 | }, | ||
| 491 | }, | ||
| 492 | { | ||
| 493 | .callback = init_set_sci_en_on_resume, | ||
| 494 | .ident = "Lenovo ThinkPad T410", | ||
| 495 | .matches = { | ||
| 496 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 497 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
| 498 | }, | ||
| 499 | }, | ||
| 500 | { | ||
| 501 | .callback = init_set_sci_en_on_resume, | ||
| 502 | .ident = "Lenovo ThinkPad T510", | ||
| 503 | .matches = { | ||
| 504 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 505 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
| 506 | }, | ||
| 507 | }, | ||
| 508 | { | ||
| 509 | .callback = init_set_sci_en_on_resume, | ||
| 510 | .ident = "Lenovo ThinkPad W510", | ||
| 511 | .matches = { | ||
| 512 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 513 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
| 514 | }, | ||
| 515 | }, | ||
| 516 | { | ||
| 517 | .callback = init_set_sci_en_on_resume, | ||
| 518 | .ident = "Lenovo ThinkPad X201", | ||
| 519 | .matches = { | ||
| 520 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 521 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
| 522 | }, | ||
| 523 | }, | ||
| 524 | { | ||
| 525 | .callback = init_set_sci_en_on_resume, | ||
| 526 | .ident = "Lenovo ThinkPad X201", | ||
| 527 | .matches = { | ||
| 528 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 529 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
| 530 | }, | ||
| 531 | }, | ||
| 532 | { | ||
| 533 | .callback = init_set_sci_en_on_resume, | ||
| 534 | .ident = "Lenovo ThinkPad T410", | ||
| 535 | .matches = { | ||
| 536 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 537 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
| 538 | }, | ||
| 539 | }, | ||
| 540 | { | ||
| 541 | .callback = init_set_sci_en_on_resume, | ||
| 542 | .ident = "Lenovo ThinkPad T510", | ||
| 543 | .matches = { | ||
| 544 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 545 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
| 546 | }, | ||
| 547 | }, | ||
| 548 | { | ||
| 549 | .callback = init_set_sci_en_on_resume, | ||
| 550 | .ident = "Lenovo ThinkPad W510", | ||
| 551 | .matches = { | ||
| 552 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 553 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
| 554 | }, | ||
| 555 | }, | ||
| 556 | { | ||
| 557 | .callback = init_set_sci_en_on_resume, | ||
| 558 | .ident = "Lenovo ThinkPad X201", | ||
| 559 | .matches = { | ||
| 560 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 561 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
| 562 | }, | ||
| 563 | }, | ||
| 564 | { | ||
| 565 | .callback = init_set_sci_en_on_resume, | ||
| 566 | .ident = "Lenovo ThinkPad X201", | ||
| 567 | .matches = { | ||
| 568 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 569 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
| 570 | }, | ||
| 571 | }, | ||
| 572 | { | ||
| 573 | .callback = init_old_suspend_ordering, | 485 | .callback = init_old_suspend_ordering, |
| 574 | .ident = "Panasonic CF51-2L", | 486 | .ident = "Panasonic CF51-2L", |
| 575 | .matches = { | 487 | .matches = { |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 4b4b565c835f..c5fbe198fbdb 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -187,7 +187,7 @@ EXPORT_SYMBOL_GPL(platform_device_alloc); | |||
| 187 | * released. | 187 | * released. |
| 188 | */ | 188 | */ |
| 189 | int platform_device_add_resources(struct platform_device *pdev, | 189 | int platform_device_add_resources(struct platform_device *pdev, |
| 190 | struct resource *res, unsigned int num) | 190 | const struct resource *res, unsigned int num) |
| 191 | { | 191 | { |
| 192 | struct resource *r; | 192 | struct resource *r; |
| 193 | 193 | ||
| @@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister); | |||
| 367 | */ | 367 | */ |
| 368 | struct platform_device *platform_device_register_simple(const char *name, | 368 | struct platform_device *platform_device_register_simple(const char *name, |
| 369 | int id, | 369 | int id, |
| 370 | struct resource *res, | 370 | const struct resource *res, |
| 371 | unsigned int num) | 371 | unsigned int num) |
| 372 | { | 372 | { |
| 373 | struct platform_device *pdev; | 373 | struct platform_device *pdev; |
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index 0182a22c423a..832798aa14f6 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | #include <linux/blkdev.h> | 66 | #include <linux/blkdev.h> |
| 67 | #include <linux/elevator.h> | 67 | #include <linux/elevator.h> |
| 68 | #include <linux/interrupt.h> | 68 | #include <linux/interrupt.h> |
| 69 | #include <linux/platform_device.h> | ||
| 69 | 70 | ||
| 70 | #include <asm/setup.h> | 71 | #include <asm/setup.h> |
| 71 | #include <asm/uaccess.h> | 72 | #include <asm/uaccess.h> |
| @@ -1696,34 +1697,18 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data) | |||
| 1696 | return get_disk(unit[drive].gendisk); | 1697 | return get_disk(unit[drive].gendisk); |
| 1697 | } | 1698 | } |
| 1698 | 1699 | ||
| 1699 | static int __init amiga_floppy_init(void) | 1700 | static int __init amiga_floppy_probe(struct platform_device *pdev) |
| 1700 | { | 1701 | { |
| 1701 | int i, ret; | 1702 | int i, ret; |
| 1702 | 1703 | ||
| 1703 | if (!MACH_IS_AMIGA) | ||
| 1704 | return -ENODEV; | ||
| 1705 | |||
| 1706 | if (!AMIGAHW_PRESENT(AMI_FLOPPY)) | ||
| 1707 | return -ENODEV; | ||
| 1708 | |||
| 1709 | if (register_blkdev(FLOPPY_MAJOR,"fd")) | 1704 | if (register_blkdev(FLOPPY_MAJOR,"fd")) |
| 1710 | return -EBUSY; | 1705 | return -EBUSY; |
| 1711 | 1706 | ||
| 1712 | /* | ||
| 1713 | * We request DSKPTR, DSKLEN and DSKDATA only, because the other | ||
| 1714 | * floppy registers are too spreaded over the custom register space | ||
| 1715 | */ | ||
| 1716 | ret = -EBUSY; | ||
| 1717 | if (!request_mem_region(CUSTOM_PHYSADDR+0x20, 8, "amiflop [Paula]")) { | ||
| 1718 | printk("fd: cannot get floppy registers\n"); | ||
| 1719 | goto out_blkdev; | ||
| 1720 | } | ||
| 1721 | |||
| 1722 | ret = -ENOMEM; | 1707 | ret = -ENOMEM; |
| 1723 | if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) == | 1708 | if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) == |
| 1724 | NULL) { | 1709 | NULL) { |
| 1725 | printk("fd: cannot get chip mem buffer\n"); | 1710 | printk("fd: cannot get chip mem buffer\n"); |
| 1726 | goto out_memregion; | 1711 | goto out_blkdev; |
| 1727 | } | 1712 | } |
| 1728 | 1713 | ||
| 1729 | ret = -EBUSY; | 1714 | ret = -EBUSY; |
| @@ -1792,18 +1777,13 @@ out_irq2: | |||
| 1792 | free_irq(IRQ_AMIGA_DSKBLK, NULL); | 1777 | free_irq(IRQ_AMIGA_DSKBLK, NULL); |
| 1793 | out_irq: | 1778 | out_irq: |
| 1794 | amiga_chip_free(raw_buf); | 1779 | amiga_chip_free(raw_buf); |
| 1795 | out_memregion: | ||
| 1796 | release_mem_region(CUSTOM_PHYSADDR+0x20, 8); | ||
| 1797 | out_blkdev: | 1780 | out_blkdev: |
| 1798 | unregister_blkdev(FLOPPY_MAJOR,"fd"); | 1781 | unregister_blkdev(FLOPPY_MAJOR,"fd"); |
| 1799 | return ret; | 1782 | return ret; |
| 1800 | } | 1783 | } |
| 1801 | 1784 | ||
| 1802 | module_init(amiga_floppy_init); | ||
| 1803 | #ifdef MODULE | ||
| 1804 | |||
| 1805 | #if 0 /* not safe to unload */ | 1785 | #if 0 /* not safe to unload */ |
| 1806 | void cleanup_module(void) | 1786 | static int __exit amiga_floppy_remove(struct platform_device *pdev) |
| 1807 | { | 1787 | { |
| 1808 | int i; | 1788 | int i; |
| 1809 | 1789 | ||
| @@ -1820,12 +1800,25 @@ void cleanup_module(void) | |||
| 1820 | custom.dmacon = DMAF_DISK; /* disable DMA */ | 1800 | custom.dmacon = DMAF_DISK; /* disable DMA */ |
| 1821 | amiga_chip_free(raw_buf); | 1801 | amiga_chip_free(raw_buf); |
| 1822 | blk_cleanup_queue(floppy_queue); | 1802 | blk_cleanup_queue(floppy_queue); |
| 1823 | release_mem_region(CUSTOM_PHYSADDR+0x20, 8); | ||
| 1824 | unregister_blkdev(FLOPPY_MAJOR, "fd"); | 1803 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
| 1825 | } | 1804 | } |
| 1826 | #endif | 1805 | #endif |
| 1827 | 1806 | ||
| 1828 | #else | 1807 | static struct platform_driver amiga_floppy_driver = { |
| 1808 | .driver = { | ||
| 1809 | .name = "amiga-floppy", | ||
| 1810 | .owner = THIS_MODULE, | ||
| 1811 | }, | ||
| 1812 | }; | ||
| 1813 | |||
| 1814 | static int __init amiga_floppy_init(void) | ||
| 1815 | { | ||
| 1816 | return platform_driver_probe(&amiga_floppy_driver, amiga_floppy_probe); | ||
| 1817 | } | ||
| 1818 | |||
| 1819 | module_init(amiga_floppy_init); | ||
| 1820 | |||
| 1821 | #ifndef MODULE | ||
| 1829 | static int __init amiga_floppy_setup (char *str) | 1822 | static int __init amiga_floppy_setup (char *str) |
| 1830 | { | 1823 | { |
| 1831 | int n; | 1824 | int n; |
| @@ -1840,3 +1833,5 @@ static int __init amiga_floppy_setup (char *str) | |||
| 1840 | 1833 | ||
| 1841 | __setup("floppy=", amiga_floppy_setup); | 1834 | __setup("floppy=", amiga_floppy_setup); |
| 1842 | #endif | 1835 | #endif |
| 1836 | |||
| 1837 | MODULE_ALIAS("platform:amiga-floppy"); | ||
diff --git a/drivers/char/serial167.c b/drivers/char/serial167.c index 8dfd24721a82..78a62ebe75c7 100644 --- a/drivers/char/serial167.c +++ b/drivers/char/serial167.c | |||
| @@ -627,7 +627,6 @@ static irqreturn_t cd2401_rx_interrupt(int irq, void *dev_id) | |||
| 627 | char data; | 627 | char data; |
| 628 | int char_count; | 628 | int char_count; |
| 629 | int save_cnt; | 629 | int save_cnt; |
| 630 | int len; | ||
| 631 | 630 | ||
| 632 | /* determine the channel and change to that context */ | 631 | /* determine the channel and change to that context */ |
| 633 | channel = (u_short) (base_addr[CyLICR] >> 2); | 632 | channel = (u_short) (base_addr[CyLICR] >> 2); |
| @@ -1528,7 +1527,6 @@ static int | |||
| 1528 | cy_ioctl(struct tty_struct *tty, struct file *file, | 1527 | cy_ioctl(struct tty_struct *tty, struct file *file, |
| 1529 | unsigned int cmd, unsigned long arg) | 1528 | unsigned int cmd, unsigned long arg) |
| 1530 | { | 1529 | { |
| 1531 | unsigned long val; | ||
| 1532 | struct cyclades_port *info = tty->driver_data; | 1530 | struct cyclades_port *info = tty->driver_data; |
| 1533 | int ret_val = 0; | 1531 | int ret_val = 0; |
| 1534 | void __user *argp = (void __user *)arg; | 1532 | void __user *argp = (void __user *)arg; |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 6da962c9b21c..d71f0fc34b46 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -1875,6 +1875,7 @@ got_driver: | |||
| 1875 | */ | 1875 | */ |
| 1876 | if (filp->f_op == &hung_up_tty_fops) | 1876 | if (filp->f_op == &hung_up_tty_fops) |
| 1877 | filp->f_op = &tty_fops; | 1877 | filp->f_op = &tty_fops; |
| 1878 | unlock_kernel(); | ||
| 1878 | goto retry_open; | 1879 | goto retry_open; |
| 1879 | } | 1880 | } |
| 1880 | unlock_kernel(); | 1881 | unlock_kernel(); |
diff --git a/drivers/gpio/it8761e_gpio.c b/drivers/gpio/it8761e_gpio.c index 753219cf993a..41a9388f2fde 100644 --- a/drivers/gpio/it8761e_gpio.c +++ b/drivers/gpio/it8761e_gpio.c | |||
| @@ -80,8 +80,8 @@ static int it8761e_gpio_get(struct gpio_chip *gc, unsigned gpio_num) | |||
| 80 | u16 reg; | 80 | u16 reg; |
| 81 | u8 bit; | 81 | u8 bit; |
| 82 | 82 | ||
| 83 | bit = gpio_num % 7; | 83 | bit = gpio_num % 8; |
| 84 | reg = (gpio_num >= 7) ? gpio_ba + 1 : gpio_ba; | 84 | reg = (gpio_num >= 8) ? gpio_ba + 1 : gpio_ba; |
| 85 | 85 | ||
| 86 | return !!(inb(reg) & (1 << bit)); | 86 | return !!(inb(reg) & (1 << bit)); |
| 87 | } | 87 | } |
| @@ -91,8 +91,8 @@ static int it8761e_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) | |||
| 91 | u8 curr_dirs; | 91 | u8 curr_dirs; |
| 92 | u8 io_reg, bit; | 92 | u8 io_reg, bit; |
| 93 | 93 | ||
| 94 | bit = gpio_num % 7; | 94 | bit = gpio_num % 8; |
| 95 | io_reg = (gpio_num >= 7) ? GPIO2X_IO : GPIO1X_IO; | 95 | io_reg = (gpio_num >= 8) ? GPIO2X_IO : GPIO1X_IO; |
| 96 | 96 | ||
| 97 | spin_lock(&sio_lock); | 97 | spin_lock(&sio_lock); |
| 98 | 98 | ||
| @@ -116,8 +116,8 @@ static void it8761e_gpio_set(struct gpio_chip *gc, | |||
| 116 | u8 curr_vals, bit; | 116 | u8 curr_vals, bit; |
| 117 | u16 reg; | 117 | u16 reg; |
| 118 | 118 | ||
| 119 | bit = gpio_num % 7; | 119 | bit = gpio_num % 8; |
| 120 | reg = (gpio_num >= 7) ? gpio_ba + 1 : gpio_ba; | 120 | reg = (gpio_num >= 8) ? gpio_ba + 1 : gpio_ba; |
| 121 | 121 | ||
| 122 | spin_lock(&sio_lock); | 122 | spin_lock(&sio_lock); |
| 123 | 123 | ||
| @@ -135,8 +135,8 @@ static int it8761e_gpio_direction_out(struct gpio_chip *gc, | |||
| 135 | { | 135 | { |
| 136 | u8 curr_dirs, io_reg, bit; | 136 | u8 curr_dirs, io_reg, bit; |
| 137 | 137 | ||
| 138 | bit = gpio_num % 7; | 138 | bit = gpio_num % 8; |
| 139 | io_reg = (gpio_num >= 7) ? GPIO2X_IO : GPIO1X_IO; | 139 | io_reg = (gpio_num >= 8) ? GPIO2X_IO : GPIO1X_IO; |
| 140 | 140 | ||
| 141 | it8761e_gpio_set(gc, gpio_num, val); | 141 | it8761e_gpio_set(gc, gpio_num, val); |
| 142 | 142 | ||
| @@ -200,7 +200,7 @@ static int __init it8761e_gpio_init(void) | |||
| 200 | return -EBUSY; | 200 | return -EBUSY; |
| 201 | 201 | ||
| 202 | it8761e_gpio_chip.base = -1; | 202 | it8761e_gpio_chip.base = -1; |
| 203 | it8761e_gpio_chip.ngpio = 14; | 203 | it8761e_gpio_chip.ngpio = 16; |
| 204 | 204 | ||
| 205 | err = gpiochip_add(&it8761e_gpio_chip); | 205 | err = gpiochip_add(&it8761e_gpio_chip); |
| 206 | if (err < 0) | 206 | if (err < 0) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 2b8b969d0c15..df6a9cd82c4d 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -456,11 +456,15 @@ i915_error_object_create(struct drm_device *dev, | |||
| 456 | 456 | ||
| 457 | for (page = 0; page < page_count; page++) { | 457 | for (page = 0; page < page_count; page++) { |
| 458 | void *s, *d = kmalloc(PAGE_SIZE, GFP_ATOMIC); | 458 | void *s, *d = kmalloc(PAGE_SIZE, GFP_ATOMIC); |
| 459 | unsigned long flags; | ||
| 460 | |||
| 459 | if (d == NULL) | 461 | if (d == NULL) |
| 460 | goto unwind; | 462 | goto unwind; |
| 461 | s = kmap_atomic(src_priv->pages[page], KM_USER0); | 463 | local_irq_save(flags); |
| 464 | s = kmap_atomic(src_priv->pages[page], KM_IRQ0); | ||
| 462 | memcpy(d, s, PAGE_SIZE); | 465 | memcpy(d, s, PAGE_SIZE); |
| 463 | kunmap_atomic(s, KM_USER0); | 466 | kunmap_atomic(s, KM_IRQ0); |
| 467 | local_irq_restore(flags); | ||
| 464 | dst->pages[page] = d; | 468 | dst->pages[page] = d; |
| 465 | } | 469 | } |
| 466 | dst->page_count = page_count; | 470 | dst->page_count = page_count; |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 40ab6d9c3736..cc5316dcf580 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
| @@ -424,7 +424,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
| 424 | if ((*cmd & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) && | 424 | if ((*cmd & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) && |
| 425 | (*cmd & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { | 425 | (*cmd & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { |
| 426 | u32 *cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3); | 426 | u32 *cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3); |
| 427 | offset = *cmd << 10; | 427 | offset = *cmd3 << 10; |
| 428 | if (radeon_check_and_fixup_offset | 428 | if (radeon_check_and_fixup_offset |
| 429 | (dev_priv, file_priv, &offset)) { | 429 | (dev_priv, file_priv, &offset)) { |
| 430 | DRM_ERROR("Invalid second packet offset\n"); | 430 | DRM_ERROR("Invalid second packet offset\n"); |
| @@ -2895,9 +2895,12 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, | |||
| 2895 | return rv; | 2895 | return rv; |
| 2896 | rv = drm_buffer_copy_from_user(cmdbuf->buffer, buffer, | 2896 | rv = drm_buffer_copy_from_user(cmdbuf->buffer, buffer, |
| 2897 | cmdbuf->bufsz); | 2897 | cmdbuf->bufsz); |
| 2898 | if (rv) | 2898 | if (rv) { |
| 2899 | drm_buffer_free(cmdbuf->buffer); | ||
| 2899 | return rv; | 2900 | return rv; |
| 2900 | } | 2901 | } |
| 2902 | } else | ||
| 2903 | goto done; | ||
| 2901 | 2904 | ||
| 2902 | orig_nbox = cmdbuf->nbox; | 2905 | orig_nbox = cmdbuf->nbox; |
| 2903 | 2906 | ||
| @@ -2905,8 +2908,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, | |||
| 2905 | int temp; | 2908 | int temp; |
| 2906 | temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf); | 2909 | temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf); |
| 2907 | 2910 | ||
| 2908 | if (cmdbuf->bufsz != 0) | 2911 | drm_buffer_free(cmdbuf->buffer); |
| 2909 | drm_buffer_free(cmdbuf->buffer); | ||
| 2910 | 2912 | ||
| 2911 | return temp; | 2913 | return temp; |
| 2912 | } | 2914 | } |
| @@ -3012,16 +3014,15 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, | |||
| 3012 | } | 3014 | } |
| 3013 | } | 3015 | } |
| 3014 | 3016 | ||
| 3015 | if (cmdbuf->bufsz != 0) | 3017 | drm_buffer_free(cmdbuf->buffer); |
| 3016 | drm_buffer_free(cmdbuf->buffer); | ||
| 3017 | 3018 | ||
| 3019 | done: | ||
| 3018 | DRM_DEBUG("DONE\n"); | 3020 | DRM_DEBUG("DONE\n"); |
| 3019 | COMMIT_RING(); | 3021 | COMMIT_RING(); |
| 3020 | return 0; | 3022 | return 0; |
| 3021 | 3023 | ||
| 3022 | err: | 3024 | err: |
| 3023 | if (cmdbuf->bufsz != 0) | 3025 | drm_buffer_free(cmdbuf->buffer); |
| 3024 | drm_buffer_free(cmdbuf->buffer); | ||
| 3025 | return -EINVAL; | 3026 | return -EINVAL; |
| 3026 | } | 3027 | } |
| 3027 | 3028 | ||
diff --git a/drivers/hid/hid-cherry.c b/drivers/hid/hid-cherry.c index 7e597d7f770f..24663a8717b1 100644 --- a/drivers/hid/hid-cherry.c +++ b/drivers/hid/hid-cherry.c | |||
| @@ -59,6 +59,7 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
| 59 | 59 | ||
| 60 | static const struct hid_device_id ch_devices[] = { | 60 | static const struct hid_device_id ch_devices[] = { |
| 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
| 62 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
| 62 | { } | 63 | { } |
| 63 | }; | 64 | }; |
| 64 | MODULE_DEVICE_TABLE(hid, ch_devices); | 65 | MODULE_DEVICE_TABLE(hid, ch_devices); |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 2e2aa759d230..143e788b729b 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1043,13 +1043,8 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | |||
| 1043 | 1043 | ||
| 1044 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) | 1044 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) |
| 1045 | hid->hiddev_report_event(hid, report); | 1045 | hid->hiddev_report_event(hid, report); |
| 1046 | if (hid->claimed & HID_CLAIMED_HIDRAW) { | 1046 | if (hid->claimed & HID_CLAIMED_HIDRAW) |
| 1047 | /* numbered reports need to be passed with the report num */ | 1047 | hidraw_report_event(hid, data, size); |
| 1048 | if (report_enum->numbered) | ||
| 1049 | hidraw_report_event(hid, data - 1, size + 1); | ||
| 1050 | else | ||
| 1051 | hidraw_report_event(hid, data, size); | ||
| 1052 | } | ||
| 1053 | 1048 | ||
| 1054 | for (a = 0; a < report->maxfield; a++) | 1049 | for (a = 0; a < report->maxfield; a++) |
| 1055 | hid_input_field(hid, report->field[a], cdata, interrupt); | 1050 | hid_input_field(hid, report->field[a], cdata, interrupt); |
| @@ -1296,6 +1291,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
| 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1291 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
| 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1292 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
| 1298 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1293 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
| 1294 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
| 1299 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | 1295 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, |
| 1300 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, | 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, |
| 1301 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, | 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 797e06470356..09d27649a0f7 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -131,6 +131,7 @@ | |||
| 131 | 131 | ||
| 132 | #define USB_VENDOR_ID_CHERRY 0x046a | 132 | #define USB_VENDOR_ID_CHERRY 0x046a |
| 133 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 133 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
| 134 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 | ||
| 134 | 135 | ||
| 135 | #define USB_VENDOR_ID_CHIC 0x05fe | 136 | #define USB_VENDOR_ID_CHIC 0x05fe |
| 136 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 | 137 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 |
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index 9b24fc510712..4777bbfa1cc2 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * HID driver for N-Trig touchscreens | 2 | * HID driver for N-Trig touchscreens |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2008 Rafi Rubin | 4 | * Copyright (c) 2008-2010 Rafi Rubin |
| 5 | * Copyright (c) 2009 Stephane Chatty | 5 | * Copyright (c) 2009-2010 Stephane Chatty |
| 6 | * | 6 | * |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| @@ -15,6 +15,8 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <linux/hid.h> | 17 | #include <linux/hid.h> |
| 18 | #include <linux/usb.h> | ||
| 19 | #include "usbhid/usbhid.h" | ||
| 18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 19 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
| 20 | 22 | ||
| @@ -22,17 +24,16 @@ | |||
| 22 | 24 | ||
| 23 | #define NTRIG_DUPLICATE_USAGES 0x001 | 25 | #define NTRIG_DUPLICATE_USAGES 0x001 |
| 24 | 26 | ||
| 25 | #define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ | ||
| 26 | EV_KEY, (c)) | ||
| 27 | |||
| 28 | struct ntrig_data { | 27 | struct ntrig_data { |
| 29 | /* Incoming raw values for a single contact */ | 28 | /* Incoming raw values for a single contact */ |
| 30 | __u16 x, y, w, h; | 29 | __u16 x, y, w, h; |
| 31 | __u16 id; | 30 | __u16 id; |
| 32 | __u8 confidence; | 31 | |
| 32 | bool tipswitch; | ||
| 33 | bool confidence; | ||
| 34 | bool first_contact_touch; | ||
| 33 | 35 | ||
| 34 | bool reading_mt; | 36 | bool reading_mt; |
| 35 | __u8 first_contact_confidence; | ||
| 36 | 37 | ||
| 37 | __u8 mt_footer[4]; | 38 | __u8 mt_footer[4]; |
| 38 | __u8 mt_foot_count; | 39 | __u8 mt_foot_count; |
| @@ -139,9 +140,10 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 139 | case 0xff000001: | 140 | case 0xff000001: |
| 140 | /* Tag indicating the start of a multitouch group */ | 141 | /* Tag indicating the start of a multitouch group */ |
| 141 | nd->reading_mt = 1; | 142 | nd->reading_mt = 1; |
| 142 | nd->first_contact_confidence = 0; | 143 | nd->first_contact_touch = 0; |
| 143 | break; | 144 | break; |
| 144 | case HID_DG_TIPSWITCH: | 145 | case HID_DG_TIPSWITCH: |
| 146 | nd->tipswitch = value; | ||
| 145 | /* Prevent emission of touch until validated */ | 147 | /* Prevent emission of touch until validated */ |
| 146 | return 1; | 148 | return 1; |
| 147 | case HID_DG_CONFIDENCE: | 149 | case HID_DG_CONFIDENCE: |
| @@ -169,8 +171,14 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 169 | * to emit a normal (X, Y) position | 171 | * to emit a normal (X, Y) position |
| 170 | */ | 172 | */ |
| 171 | if (!nd->reading_mt) { | 173 | if (!nd->reading_mt) { |
| 174 | /* | ||
| 175 | * TipSwitch indicates the presence of a | ||
| 176 | * finger in single touch mode. | ||
| 177 | */ | ||
| 178 | input_report_key(input, BTN_TOUCH, | ||
| 179 | nd->tipswitch); | ||
| 172 | input_report_key(input, BTN_TOOL_DOUBLETAP, | 180 | input_report_key(input, BTN_TOOL_DOUBLETAP, |
| 173 | (nd->confidence != 0)); | 181 | nd->tipswitch); |
| 174 | input_event(input, EV_ABS, ABS_X, nd->x); | 182 | input_event(input, EV_ABS, ABS_X, nd->x); |
| 175 | input_event(input, EV_ABS, ABS_Y, nd->y); | 183 | input_event(input, EV_ABS, ABS_Y, nd->y); |
| 176 | } | 184 | } |
| @@ -209,7 +217,13 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 209 | 217 | ||
| 210 | /* emit a normal (X, Y) for the first point only */ | 218 | /* emit a normal (X, Y) for the first point only */ |
| 211 | if (nd->id == 0) { | 219 | if (nd->id == 0) { |
| 212 | nd->first_contact_confidence = nd->confidence; | 220 | /* |
| 221 | * TipSwitch is superfluous in multitouch | ||
| 222 | * mode. The footer events tell us | ||
| 223 | * if there is a finger on the screen or | ||
| 224 | * not. | ||
| 225 | */ | ||
| 226 | nd->first_contact_touch = nd->confidence; | ||
| 213 | input_event(input, EV_ABS, ABS_X, nd->x); | 227 | input_event(input, EV_ABS, ABS_X, nd->x); |
| 214 | input_event(input, EV_ABS, ABS_Y, nd->y); | 228 | input_event(input, EV_ABS, ABS_Y, nd->y); |
| 215 | } | 229 | } |
| @@ -239,30 +253,11 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 239 | 253 | ||
| 240 | nd->reading_mt = 0; | 254 | nd->reading_mt = 0; |
| 241 | 255 | ||
| 242 | if (nd->first_contact_confidence) { | 256 | if (nd->first_contact_touch) { |
| 243 | switch (value) { | 257 | input_report_key(input, BTN_TOOL_DOUBLETAP, 1); |
| 244 | case 0: /* for single touch devices */ | ||
| 245 | case 1: | ||
| 246 | input_report_key(input, | ||
| 247 | BTN_TOOL_DOUBLETAP, 1); | ||
| 248 | break; | ||
| 249 | case 2: | ||
| 250 | input_report_key(input, | ||
| 251 | BTN_TOOL_TRIPLETAP, 1); | ||
| 252 | break; | ||
| 253 | case 3: | ||
| 254 | default: | ||
| 255 | input_report_key(input, | ||
| 256 | BTN_TOOL_QUADTAP, 1); | ||
| 257 | } | ||
| 258 | input_report_key(input, BTN_TOUCH, 1); | 258 | input_report_key(input, BTN_TOUCH, 1); |
| 259 | } else { | 259 | } else { |
| 260 | input_report_key(input, | 260 | input_report_key(input, BTN_TOOL_DOUBLETAP, 0); |
| 261 | BTN_TOOL_DOUBLETAP, 0); | ||
| 262 | input_report_key(input, | ||
| 263 | BTN_TOOL_TRIPLETAP, 0); | ||
| 264 | input_report_key(input, | ||
| 265 | BTN_TOOL_QUADTAP, 0); | ||
| 266 | input_report_key(input, BTN_TOUCH, 0); | 261 | input_report_key(input, BTN_TOUCH, 0); |
| 267 | } | 262 | } |
| 268 | break; | 263 | break; |
| @@ -286,6 +281,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 286 | struct ntrig_data *nd; | 281 | struct ntrig_data *nd; |
| 287 | struct hid_input *hidinput; | 282 | struct hid_input *hidinput; |
| 288 | struct input_dev *input; | 283 | struct input_dev *input; |
| 284 | struct hid_report *report; | ||
| 289 | 285 | ||
| 290 | if (id->driver_data) | 286 | if (id->driver_data) |
| 291 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; | 287 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
| @@ -327,13 +323,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 327 | __clear_bit(BTN_TOOL_PEN, input->keybit); | 323 | __clear_bit(BTN_TOOL_PEN, input->keybit); |
| 328 | __clear_bit(BTN_TOOL_FINGER, input->keybit); | 324 | __clear_bit(BTN_TOOL_FINGER, input->keybit); |
| 329 | __clear_bit(BTN_0, input->keybit); | 325 | __clear_bit(BTN_0, input->keybit); |
| 330 | /* | ||
| 331 | * A little something special to enable | ||
| 332 | * two and three finger taps. | ||
| 333 | */ | ||
| 334 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); | 326 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); |
| 335 | __set_bit(BTN_TOOL_TRIPLETAP, input->keybit); | ||
| 336 | __set_bit(BTN_TOOL_QUADTAP, input->keybit); | ||
| 337 | /* | 327 | /* |
| 338 | * The physical touchscreen (single touch) | 328 | * The physical touchscreen (single touch) |
| 339 | * input has a value for physical, whereas | 329 | * input has a value for physical, whereas |
| @@ -349,6 +339,12 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 349 | } | 339 | } |
| 350 | } | 340 | } |
| 351 | 341 | ||
| 342 | /* This is needed for devices with more recent firmware versions */ | ||
| 343 | report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0x0a]; | ||
| 344 | if (report) | ||
| 345 | usbhid_submit_report(hdev, report, USB_DIR_OUT); | ||
| 346 | |||
| 347 | |||
| 352 | return 0; | 348 | return 0; |
| 353 | err_free: | 349 | err_free: |
| 354 | kfree(nd); | 350 | kfree(nd); |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 7502a4b2fa86..402d5574b574 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
| @@ -76,7 +76,7 @@ static int sony_set_operational_usb(struct hid_device *hdev) | |||
| 76 | 76 | ||
| 77 | static int sony_set_operational_bt(struct hid_device *hdev) | 77 | static int sony_set_operational_bt(struct hid_device *hdev) |
| 78 | { | 78 | { |
| 79 | unsigned char buf[] = { 0x53, 0xf4, 0x42, 0x03, 0x00, 0x00 }; | 79 | unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 }; |
| 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); | 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); |
| 81 | } | 81 | } |
| 82 | 82 | ||
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index f7700cf49721..f947d8337e21 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
| @@ -277,7 +277,6 @@ static int __init wacom_init(void) | |||
| 277 | ret = hid_register_driver(&wacom_driver); | 277 | ret = hid_register_driver(&wacom_driver); |
| 278 | if (ret) | 278 | if (ret) |
| 279 | printk(KERN_ERR "can't register wacom driver\n"); | 279 | printk(KERN_ERR "can't register wacom driver\n"); |
| 280 | printk(KERN_ERR "wacom driver registered\n"); | ||
| 281 | return ret; | 280 | return ret; |
| 282 | } | 281 | } |
| 283 | 282 | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 56d06cd8075b..7b85b696fdab 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
| @@ -999,13 +999,6 @@ static int usbhid_start(struct hid_device *hid) | |||
| 999 | } | 999 | } |
| 1000 | } | 1000 | } |
| 1001 | 1001 | ||
| 1002 | init_waitqueue_head(&usbhid->wait); | ||
| 1003 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
| 1004 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
| 1005 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
| 1006 | |||
| 1007 | spin_lock_init(&usbhid->lock); | ||
| 1008 | |||
| 1009 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); | 1002 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); |
| 1010 | if (!usbhid->urbctrl) { | 1003 | if (!usbhid->urbctrl) { |
| 1011 | ret = -ENOMEM; | 1004 | ret = -ENOMEM; |
| @@ -1179,6 +1172,12 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 1179 | usbhid->intf = intf; | 1172 | usbhid->intf = intf; |
| 1180 | usbhid->ifnum = interface->desc.bInterfaceNumber; | 1173 | usbhid->ifnum = interface->desc.bInterfaceNumber; |
| 1181 | 1174 | ||
| 1175 | init_waitqueue_head(&usbhid->wait); | ||
| 1176 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
| 1177 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
| 1178 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
| 1179 | spin_lock_init(&usbhid->lock); | ||
| 1180 | |||
| 1182 | ret = hid_add_device(hid); | 1181 | ret = hid_add_device(hid); |
| 1183 | if (ret) { | 1182 | if (ret) { |
| 1184 | if (ret != -ENODEV) | 1183 | if (ret != -ENODEV) |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 0f28d91f29d8..f085c18d2905 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -195,6 +195,9 @@ static unsigned int applesmc_accelerometer; | |||
| 195 | /* Indicates whether this computer has light sensors and keyboard backlight. */ | 195 | /* Indicates whether this computer has light sensors and keyboard backlight. */ |
| 196 | static unsigned int applesmc_light; | 196 | static unsigned int applesmc_light; |
| 197 | 197 | ||
| 198 | /* The number of fans handled by the driver */ | ||
| 199 | static unsigned int fans_handled; | ||
| 200 | |||
| 198 | /* Indicates which temperature sensors set to use. */ | 201 | /* Indicates which temperature sensors set to use. */ |
| 199 | static unsigned int applesmc_temperature_set; | 202 | static unsigned int applesmc_temperature_set; |
| 200 | 203 | ||
| @@ -1492,39 +1495,24 @@ static int __init applesmc_init(void) | |||
| 1492 | 1495 | ||
| 1493 | /* create fan files */ | 1496 | /* create fan files */ |
| 1494 | count = applesmc_get_fan_count(); | 1497 | count = applesmc_get_fan_count(); |
| 1495 | if (count < 0) { | 1498 | if (count < 0) |
| 1496 | printk(KERN_ERR "applesmc: Cannot get the number of fans.\n"); | 1499 | printk(KERN_ERR "applesmc: Cannot get the number of fans.\n"); |
| 1497 | } else { | 1500 | else |
| 1498 | printk(KERN_INFO "applesmc: %d fans found.\n", count); | 1501 | printk(KERN_INFO "applesmc: %d fans found.\n", count); |
| 1499 | 1502 | ||
| 1500 | switch (count) { | 1503 | if (count > 4) { |
| 1501 | default: | 1504 | count = 4; |
| 1502 | printk(KERN_WARNING "applesmc: More than 4 fans found," | 1505 | printk(KERN_WARNING "applesmc: More than 4 fans found," |
| 1503 | " but at most 4 fans are supported" | 1506 | " but at most 4 fans are supported" |
| 1504 | " by the driver.\n"); | 1507 | " by the driver.\n"); |
| 1505 | case 4: | 1508 | } |
| 1506 | ret = sysfs_create_group(&pdev->dev.kobj, | 1509 | |
| 1507 | &fan_attribute_groups[3]); | 1510 | while (fans_handled < count) { |
| 1508 | if (ret) | 1511 | ret = sysfs_create_group(&pdev->dev.kobj, |
| 1509 | goto out_key_enumeration; | 1512 | &fan_attribute_groups[fans_handled]); |
| 1510 | case 3: | 1513 | if (ret) |
| 1511 | ret = sysfs_create_group(&pdev->dev.kobj, | 1514 | goto out_fans; |
| 1512 | &fan_attribute_groups[2]); | 1515 | fans_handled++; |
| 1513 | if (ret) | ||
| 1514 | goto out_key_enumeration; | ||
| 1515 | case 2: | ||
| 1516 | ret = sysfs_create_group(&pdev->dev.kobj, | ||
| 1517 | &fan_attribute_groups[1]); | ||
| 1518 | if (ret) | ||
| 1519 | goto out_key_enumeration; | ||
| 1520 | case 1: | ||
| 1521 | ret = sysfs_create_group(&pdev->dev.kobj, | ||
| 1522 | &fan_attribute_groups[0]); | ||
| 1523 | if (ret) | ||
| 1524 | goto out_fan_1; | ||
| 1525 | case 0: | ||
| 1526 | ; | ||
| 1527 | } | ||
| 1528 | } | 1516 | } |
| 1529 | 1517 | ||
| 1530 | for (i = 0; | 1518 | for (i = 0; |
| @@ -1593,10 +1581,10 @@ out_accelerometer: | |||
| 1593 | applesmc_release_accelerometer(); | 1581 | applesmc_release_accelerometer(); |
| 1594 | out_temperature: | 1582 | out_temperature: |
| 1595 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); | 1583 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); |
| 1596 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]); | 1584 | out_fans: |
| 1597 | out_fan_1: | 1585 | while (fans_handled) |
| 1598 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); | 1586 | sysfs_remove_group(&pdev->dev.kobj, |
| 1599 | out_key_enumeration: | 1587 | &fan_attribute_groups[--fans_handled]); |
| 1600 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); | 1588 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); |
| 1601 | out_name: | 1589 | out_name: |
| 1602 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); | 1590 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); |
| @@ -1622,8 +1610,9 @@ static void __exit applesmc_exit(void) | |||
| 1622 | if (applesmc_accelerometer) | 1610 | if (applesmc_accelerometer) |
| 1623 | applesmc_release_accelerometer(); | 1611 | applesmc_release_accelerometer(); |
| 1624 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); | 1612 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); |
| 1625 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]); | 1613 | while (fans_handled) |
| 1626 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); | 1614 | sysfs_remove_group(&pdev->dev.kobj, |
| 1615 | &fan_attribute_groups[--fans_handled]); | ||
| 1627 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); | 1616 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); |
| 1628 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); | 1617 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); |
| 1629 | platform_device_unregister(pdev); | 1618 | platform_device_unregister(pdev); |
diff --git a/drivers/hwmon/asc7621.c b/drivers/hwmon/asc7621.c index 7f948105d8ad..0f388adc6187 100644 --- a/drivers/hwmon/asc7621.c +++ b/drivers/hwmon/asc7621.c | |||
| @@ -268,8 +268,11 @@ static ssize_t store_fan16(struct device *dev, | |||
| 268 | if (strict_strtol(buf, 10, &reqval)) | 268 | if (strict_strtol(buf, 10, &reqval)) |
| 269 | return -EINVAL; | 269 | return -EINVAL; |
| 270 | 270 | ||
| 271 | /* If a minimum RPM of zero is requested, then we set the register to | ||
| 272 | 0xffff. This value allows the fan to be stopped completely without | ||
| 273 | generating an alarm. */ | ||
| 271 | reqval = | 274 | reqval = |
| 272 | (SENSORS_LIMIT((reqval) <= 0 ? 0 : 5400000 / (reqval), 0, 65534)); | 275 | (reqval <= 0 ? 0xffff : SENSORS_LIMIT(5400000 / reqval, 0, 0xfffe)); |
| 273 | 276 | ||
| 274 | mutex_lock(&data->update_lock); | 277 | mutex_lock(&data->update_lock); |
| 275 | data->reg[param->msb[0]] = (reqval >> 8) & 0xff; | 278 | data->reg[param->msb[0]] = (reqval >> 8) & 0xff; |
| @@ -285,8 +288,9 @@ static ssize_t store_fan16(struct device *dev, | |||
| 285 | * Voltages are scaled in the device so that the nominal voltage | 288 | * Voltages are scaled in the device so that the nominal voltage |
| 286 | * is 3/4ths of the 0-255 range (i.e. 192). | 289 | * is 3/4ths of the 0-255 range (i.e. 192). |
| 287 | * If all voltages are 'normal' then all voltage registers will | 290 | * If all voltages are 'normal' then all voltage registers will |
| 288 | * read 0xC0. This doesn't help us if we don't have a point of refernce. | 291 | * read 0xC0. |
| 289 | * The data sheet however provides us with the full scale value for each | 292 | * |
| 293 | * The data sheet provides us with the 3/4 scale value for each voltage | ||
| 290 | * which is stored in in_scaling. The sda->index parameter value provides | 294 | * which is stored in in_scaling. The sda->index parameter value provides |
| 291 | * the index into in_scaling. | 295 | * the index into in_scaling. |
| 292 | * | 296 | * |
| @@ -295,7 +299,7 @@ static ssize_t store_fan16(struct device *dev, | |||
| 295 | */ | 299 | */ |
| 296 | 300 | ||
| 297 | static int asc7621_in_scaling[] = { | 301 | static int asc7621_in_scaling[] = { |
| 298 | 3320, 3000, 4380, 6640, 16000 | 302 | 2500, 2250, 3300, 5000, 12000 |
| 299 | }; | 303 | }; |
| 300 | 304 | ||
| 301 | static ssize_t show_in10(struct device *dev, struct device_attribute *attr, | 305 | static ssize_t show_in10(struct device *dev, struct device_attribute *attr, |
| @@ -306,19 +310,12 @@ static ssize_t show_in10(struct device *dev, struct device_attribute *attr, | |||
| 306 | u8 nr = sda->index; | 310 | u8 nr = sda->index; |
| 307 | 311 | ||
| 308 | mutex_lock(&data->update_lock); | 312 | mutex_lock(&data->update_lock); |
| 309 | regval = (data->reg[param->msb[0]] * asc7621_in_scaling[nr]) / 256; | 313 | regval = (data->reg[param->msb[0]] << 8) | (data->reg[param->lsb[0]]); |
| 310 | |||
| 311 | /* The LSB value is a 2-bit scaling of the MSB's LSbit value. | ||
| 312 | * I.E. If the maximim voltage for this input is 6640 millivolts then | ||
| 313 | * a MSB register value of 0 = 0mv and 255 = 6640mv. | ||
| 314 | * A 1 step change therefore represents 25.9mv (6640 / 256). | ||
| 315 | * The extra 2-bits therefore represent increments of 6.48mv. | ||
| 316 | */ | ||
| 317 | regval += ((asc7621_in_scaling[nr] / 256) / 4) * | ||
| 318 | (data->reg[param->lsb[0]] >> 6); | ||
| 319 | |||
| 320 | mutex_unlock(&data->update_lock); | 314 | mutex_unlock(&data->update_lock); |
| 321 | 315 | ||
| 316 | /* The LSB value is a 2-bit scaling of the MSB's LSbit value. */ | ||
| 317 | regval = (regval >> 6) * asc7621_in_scaling[nr] / (0xc0 << 2); | ||
| 318 | |||
| 322 | return sprintf(buf, "%u\n", regval); | 319 | return sprintf(buf, "%u\n", regval); |
| 323 | } | 320 | } |
| 324 | 321 | ||
| @@ -331,7 +328,7 @@ static ssize_t show_in8(struct device *dev, struct device_attribute *attr, | |||
| 331 | 328 | ||
| 332 | return sprintf(buf, "%u\n", | 329 | return sprintf(buf, "%u\n", |
| 333 | ((data->reg[param->msb[0]] * | 330 | ((data->reg[param->msb[0]] * |
| 334 | asc7621_in_scaling[nr]) / 256)); | 331 | asc7621_in_scaling[nr]) / 0xc0)); |
| 335 | } | 332 | } |
| 336 | 333 | ||
| 337 | static ssize_t store_in8(struct device *dev, struct device_attribute *attr, | 334 | static ssize_t store_in8(struct device *dev, struct device_attribute *attr, |
| @@ -344,9 +341,11 @@ static ssize_t store_in8(struct device *dev, struct device_attribute *attr, | |||
| 344 | if (strict_strtol(buf, 10, &reqval)) | 341 | if (strict_strtol(buf, 10, &reqval)) |
| 345 | return -EINVAL; | 342 | return -EINVAL; |
| 346 | 343 | ||
| 347 | reqval = SENSORS_LIMIT(reqval, 0, asc7621_in_scaling[nr]); | 344 | reqval = SENSORS_LIMIT(reqval, 0, 0xffff); |
| 345 | |||
| 346 | reqval = reqval * 0xc0 / asc7621_in_scaling[nr]; | ||
| 348 | 347 | ||
| 349 | reqval = (reqval * 255 + 128) / asc7621_in_scaling[nr]; | 348 | reqval = SENSORS_LIMIT(reqval, 0, 0xff); |
| 350 | 349 | ||
| 351 | mutex_lock(&data->update_lock); | 350 | mutex_lock(&data->update_lock); |
| 352 | data->reg[param->msb[0]] = reqval; | 351 | data->reg[param->msb[0]] = reqval; |
| @@ -846,11 +845,11 @@ static struct asc7621_param asc7621_params[] = { | |||
| 846 | PWRITE(in3_max, 3, PRI_LOW, 0x4b, 0, 0, 0, in8), | 845 | PWRITE(in3_max, 3, PRI_LOW, 0x4b, 0, 0, 0, in8), |
| 847 | PWRITE(in4_max, 4, PRI_LOW, 0x4d, 0, 0, 0, in8), | 846 | PWRITE(in4_max, 4, PRI_LOW, 0x4d, 0, 0, 0, in8), |
| 848 | 847 | ||
| 849 | PREAD(in0_alarm, 0, PRI_LOW, 0x41, 0, 0x01, 0, bitmask), | 848 | PREAD(in0_alarm, 0, PRI_HIGH, 0x41, 0, 0x01, 0, bitmask), |
| 850 | PREAD(in1_alarm, 1, PRI_LOW, 0x41, 0, 0x01, 1, bitmask), | 849 | PREAD(in1_alarm, 1, PRI_HIGH, 0x41, 0, 0x01, 1, bitmask), |
| 851 | PREAD(in2_alarm, 2, PRI_LOW, 0x41, 0, 0x01, 2, bitmask), | 850 | PREAD(in2_alarm, 2, PRI_HIGH, 0x41, 0, 0x01, 2, bitmask), |
| 852 | PREAD(in3_alarm, 3, PRI_LOW, 0x41, 0, 0x01, 3, bitmask), | 851 | PREAD(in3_alarm, 3, PRI_HIGH, 0x41, 0, 0x01, 3, bitmask), |
| 853 | PREAD(in4_alarm, 4, PRI_LOW, 0x42, 0, 0x01, 0, bitmask), | 852 | PREAD(in4_alarm, 4, PRI_HIGH, 0x42, 0, 0x01, 0, bitmask), |
| 854 | 853 | ||
| 855 | PREAD(fan1_input, 0, PRI_HIGH, 0x29, 0x28, 0, 0, fan16), | 854 | PREAD(fan1_input, 0, PRI_HIGH, 0x29, 0x28, 0, 0, fan16), |
| 856 | PREAD(fan2_input, 1, PRI_HIGH, 0x2b, 0x2a, 0, 0, fan16), | 855 | PREAD(fan2_input, 1, PRI_HIGH, 0x2b, 0x2a, 0, 0, fan16), |
| @@ -862,10 +861,10 @@ static struct asc7621_param asc7621_params[] = { | |||
| 862 | PWRITE(fan3_min, 2, PRI_LOW, 0x59, 0x58, 0, 0, fan16), | 861 | PWRITE(fan3_min, 2, PRI_LOW, 0x59, 0x58, 0, 0, fan16), |
| 863 | PWRITE(fan4_min, 3, PRI_LOW, 0x5b, 0x5a, 0, 0, fan16), | 862 | PWRITE(fan4_min, 3, PRI_LOW, 0x5b, 0x5a, 0, 0, fan16), |
| 864 | 863 | ||
| 865 | PREAD(fan1_alarm, 0, PRI_LOW, 0x42, 0, 0x01, 0, bitmask), | 864 | PREAD(fan1_alarm, 0, PRI_HIGH, 0x42, 0, 0x01, 2, bitmask), |
| 866 | PREAD(fan2_alarm, 1, PRI_LOW, 0x42, 0, 0x01, 1, bitmask), | 865 | PREAD(fan2_alarm, 1, PRI_HIGH, 0x42, 0, 0x01, 3, bitmask), |
| 867 | PREAD(fan3_alarm, 2, PRI_LOW, 0x42, 0, 0x01, 2, bitmask), | 866 | PREAD(fan3_alarm, 2, PRI_HIGH, 0x42, 0, 0x01, 4, bitmask), |
| 868 | PREAD(fan4_alarm, 3, PRI_LOW, 0x42, 0, 0x01, 3, bitmask), | 867 | PREAD(fan4_alarm, 3, PRI_HIGH, 0x42, 0, 0x01, 5, bitmask), |
| 869 | 868 | ||
| 870 | PREAD(temp1_input, 0, PRI_HIGH, 0x25, 0x10, 0, 0, temp10), | 869 | PREAD(temp1_input, 0, PRI_HIGH, 0x25, 0x10, 0, 0, temp10), |
| 871 | PREAD(temp2_input, 1, PRI_HIGH, 0x26, 0x15, 0, 0, temp10), | 870 | PREAD(temp2_input, 1, PRI_HIGH, 0x26, 0x15, 0, 0, temp10), |
| @@ -886,10 +885,10 @@ static struct asc7621_param asc7621_params[] = { | |||
| 886 | PWRITE(temp3_max, 2, PRI_LOW, 0x53, 0, 0, 0, temp8), | 885 | PWRITE(temp3_max, 2, PRI_LOW, 0x53, 0, 0, 0, temp8), |
| 887 | PWRITE(temp4_max, 3, PRI_LOW, 0x35, 0, 0, 0, temp8), | 886 | PWRITE(temp4_max, 3, PRI_LOW, 0x35, 0, 0, 0, temp8), |
| 888 | 887 | ||
| 889 | PREAD(temp1_alarm, 0, PRI_LOW, 0x41, 0, 0x01, 4, bitmask), | 888 | PREAD(temp1_alarm, 0, PRI_HIGH, 0x41, 0, 0x01, 4, bitmask), |
| 890 | PREAD(temp2_alarm, 1, PRI_LOW, 0x41, 0, 0x01, 5, bitmask), | 889 | PREAD(temp2_alarm, 1, PRI_HIGH, 0x41, 0, 0x01, 5, bitmask), |
| 891 | PREAD(temp3_alarm, 2, PRI_LOW, 0x41, 0, 0x01, 6, bitmask), | 890 | PREAD(temp3_alarm, 2, PRI_HIGH, 0x41, 0, 0x01, 6, bitmask), |
| 892 | PREAD(temp4_alarm, 3, PRI_LOW, 0x43, 0, 0x01, 0, bitmask), | 891 | PREAD(temp4_alarm, 3, PRI_HIGH, 0x43, 0, 0x01, 0, bitmask), |
| 893 | 892 | ||
| 894 | PWRITE(temp1_source, 0, PRI_LOW, 0x02, 0, 0x07, 4, bitmask), | 893 | PWRITE(temp1_source, 0, PRI_LOW, 0x02, 0, 0x07, 4, bitmask), |
| 895 | PWRITE(temp2_source, 1, PRI_LOW, 0x02, 0, 0x07, 0, bitmask), | 894 | PWRITE(temp2_source, 1, PRI_LOW, 0x02, 0, 0x07, 0, bitmask), |
| @@ -898,7 +897,7 @@ static struct asc7621_param asc7621_params[] = { | |||
| 898 | 897 | ||
| 899 | PWRITE(temp1_smoothing_enable, 0, PRI_LOW, 0x62, 0, 0x01, 3, bitmask), | 898 | PWRITE(temp1_smoothing_enable, 0, PRI_LOW, 0x62, 0, 0x01, 3, bitmask), |
| 900 | PWRITE(temp2_smoothing_enable, 1, PRI_LOW, 0x63, 0, 0x01, 7, bitmask), | 899 | PWRITE(temp2_smoothing_enable, 1, PRI_LOW, 0x63, 0, 0x01, 7, bitmask), |
| 901 | PWRITE(temp3_smoothing_enable, 2, PRI_LOW, 0x64, 0, 0x01, 3, bitmask), | 900 | PWRITE(temp3_smoothing_enable, 2, PRI_LOW, 0x63, 0, 0x01, 3, bitmask), |
| 902 | PWRITE(temp4_smoothing_enable, 3, PRI_LOW, 0x3c, 0, 0x01, 3, bitmask), | 901 | PWRITE(temp4_smoothing_enable, 3, PRI_LOW, 0x3c, 0, 0x01, 3, bitmask), |
| 903 | 902 | ||
| 904 | PWRITE(temp1_smoothing_time, 0, PRI_LOW, 0x62, 0, 0x07, 0, temp_st), | 903 | PWRITE(temp1_smoothing_time, 0, PRI_LOW, 0x62, 0, 0x07, 0, temp_st), |
diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c index c8ab50516672..7580f55e67e3 100644 --- a/drivers/hwmon/hp_accel.c +++ b/drivers/hwmon/hp_accel.c | |||
| @@ -328,8 +328,8 @@ static int lis3lv02d_remove(struct acpi_device *device, int type) | |||
| 328 | lis3lv02d_joystick_disable(); | 328 | lis3lv02d_joystick_disable(); |
| 329 | lis3lv02d_poweroff(&lis3_dev); | 329 | lis3lv02d_poweroff(&lis3_dev); |
| 330 | 330 | ||
| 331 | flush_work(&hpled_led.work); | ||
| 332 | led_classdev_unregister(&hpled_led.led_classdev); | 331 | led_classdev_unregister(&hpled_led.led_classdev); |
| 332 | flush_work(&hpled_led.work); | ||
| 333 | 333 | ||
| 334 | return lis3lv02d_remove_fs(&lis3_dev); | 334 | return lis3lv02d_remove_fs(&lis3_dev); |
| 335 | } | 335 | } |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index b1edd778639c..405febd94f24 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
| @@ -54,6 +54,9 @@ static signed short btn_avb_wheel[] = | |||
| 54 | static signed short abs_joystick[] = | 54 | static signed short abs_joystick[] = |
| 55 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; | 55 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; |
| 56 | 56 | ||
| 57 | static signed short abs_joystick_rudder[] = | ||
| 58 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, -1 }; | ||
| 59 | |||
| 57 | static signed short abs_avb_pegasus[] = | 60 | static signed short abs_avb_pegasus[] = |
| 58 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, | 61 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, |
| 59 | ABS_HAT1X, ABS_HAT1Y, -1 }; | 62 | ABS_HAT1X, ABS_HAT1Y, -1 }; |
| @@ -76,8 +79,9 @@ static struct iforce_device iforce_device[] = { | |||
| 76 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? | 79 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? |
| 77 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, | 80 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, |
| 78 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? | 81 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? |
| 82 | { 0x06f8, 0x0001, "Guillemot Jet Leader Force Feedback", btn_joystick, abs_joystick_rudder, ff_iforce }, | ||
| 79 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? | 83 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? |
| 80 | { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? | 84 | { 0x06f8, 0xa302, "Guillemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? |
| 81 | { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, | 85 | { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, |
| 82 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } | 86 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } |
| 83 | }; | 87 | }; |
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index b41303d3ec54..6c96631ae5d9 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
| @@ -212,6 +212,7 @@ static struct usb_device_id iforce_usb_ids [] = { | |||
| 212 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ | 212 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ |
| 213 | { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ | 213 | { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ |
| 214 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ | 214 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ |
| 215 | { USB_DEVICE(0x06f8, 0x0003) }, /* Guillemot Jet Leader Force Feedback */ | ||
| 215 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ | 216 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ |
| 216 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ | 217 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ |
| 217 | { } /* Terminating entry */ | 218 | { } /* Terminating entry */ |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 0520c2e19927..112b4ee52ff2 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
| @@ -185,7 +185,7 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) | |||
| 185 | int fingers; | 185 | int fingers; |
| 186 | static int old_fingers; | 186 | static int old_fingers; |
| 187 | 187 | ||
| 188 | if (etd->fw_version_maj == 0x01) { | 188 | if (etd->fw_version < 0x020000) { |
| 189 | /* | 189 | /* |
| 190 | * byte 0: D U p1 p2 1 p3 R L | 190 | * byte 0: D U p1 p2 1 p3 R L |
| 191 | * byte 1: f 0 th tw x9 x8 y9 y8 | 191 | * byte 1: f 0 th tw x9 x8 y9 y8 |
| @@ -227,7 +227,7 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) | |||
| 227 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); | 227 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
| 228 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); | 228 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
| 229 | 229 | ||
| 230 | if ((etd->fw_version_maj == 0x01) && | 230 | if (etd->fw_version < 0x020000 && |
| 231 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { | 231 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { |
| 232 | /* rocker up */ | 232 | /* rocker up */ |
| 233 | input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); | 233 | input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); |
| @@ -321,7 +321,7 @@ static int elantech_check_parity_v1(struct psmouse *psmouse) | |||
| 321 | unsigned char p1, p2, p3; | 321 | unsigned char p1, p2, p3; |
| 322 | 322 | ||
| 323 | /* Parity bits are placed differently */ | 323 | /* Parity bits are placed differently */ |
| 324 | if (etd->fw_version_maj == 0x01) { | 324 | if (etd->fw_version < 0x020000) { |
| 325 | /* byte 0: D U p1 p2 1 p3 R L */ | 325 | /* byte 0: D U p1 p2 1 p3 R L */ |
| 326 | p1 = (packet[0] & 0x20) >> 5; | 326 | p1 = (packet[0] & 0x20) >> 5; |
| 327 | p2 = (packet[0] & 0x10) >> 4; | 327 | p2 = (packet[0] & 0x10) >> 4; |
| @@ -457,7 +457,7 @@ static void elantech_set_input_params(struct psmouse *psmouse) | |||
| 457 | switch (etd->hw_version) { | 457 | switch (etd->hw_version) { |
| 458 | case 1: | 458 | case 1: |
| 459 | /* Rocker button */ | 459 | /* Rocker button */ |
| 460 | if ((etd->fw_version_maj == 0x01) && | 460 | if (etd->fw_version < 0x020000 && |
| 461 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { | 461 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { |
| 462 | __set_bit(BTN_FORWARD, dev->keybit); | 462 | __set_bit(BTN_FORWARD, dev->keybit); |
| 463 | __set_bit(BTN_BACK, dev->keybit); | 463 | __set_bit(BTN_BACK, dev->keybit); |
| @@ -686,15 +686,14 @@ int elantech_init(struct psmouse *psmouse) | |||
| 686 | pr_err("elantech.c: failed to query firmware version.\n"); | 686 | pr_err("elantech.c: failed to query firmware version.\n"); |
| 687 | goto init_fail; | 687 | goto init_fail; |
| 688 | } | 688 | } |
| 689 | etd->fw_version_maj = param[0]; | 689 | |
| 690 | etd->fw_version_min = param[2]; | 690 | etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2]; |
| 691 | 691 | ||
| 692 | /* | 692 | /* |
| 693 | * Assume every version greater than this is new EeePC style | 693 | * Assume every version greater than this is new EeePC style |
| 694 | * hardware with 6 byte packets | 694 | * hardware with 6 byte packets |
| 695 | */ | 695 | */ |
| 696 | if ((etd->fw_version_maj == 0x02 && etd->fw_version_min >= 0x30) || | 696 | if (etd->fw_version >= 0x020030) { |
| 697 | etd->fw_version_maj > 0x02) { | ||
| 698 | etd->hw_version = 2; | 697 | etd->hw_version = 2; |
| 699 | /* For now show extra debug information */ | 698 | /* For now show extra debug information */ |
| 700 | etd->debug = 1; | 699 | etd->debug = 1; |
| @@ -704,8 +703,9 @@ int elantech_init(struct psmouse *psmouse) | |||
| 704 | etd->hw_version = 1; | 703 | etd->hw_version = 1; |
| 705 | etd->paritycheck = 1; | 704 | etd->paritycheck = 1; |
| 706 | } | 705 | } |
| 707 | pr_info("elantech.c: assuming hardware version %d, firmware version %d.%d\n", | 706 | |
| 708 | etd->hw_version, etd->fw_version_maj, etd->fw_version_min); | 707 | pr_info("elantech.c: assuming hardware version %d, firmware version %d.%d.%d\n", |
| 708 | etd->hw_version, param[0], param[1], param[2]); | ||
| 709 | 709 | ||
| 710 | if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, param)) { | 710 | if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, param)) { |
| 711 | pr_err("elantech.c: failed to query capabilities.\n"); | 711 | pr_err("elantech.c: failed to query capabilities.\n"); |
| @@ -720,8 +720,8 @@ int elantech_init(struct psmouse *psmouse) | |||
| 720 | * a touch action starts causing the mouse cursor or scrolled page | 720 | * a touch action starts causing the mouse cursor or scrolled page |
| 721 | * to jump. Enable a workaround. | 721 | * to jump. Enable a workaround. |
| 722 | */ | 722 | */ |
| 723 | if (etd->fw_version_maj == 0x02 && etd->fw_version_min == 0x22) { | 723 | if (etd->fw_version == 0x020022) { |
| 724 | pr_info("elantech.c: firmware version 2.34 detected, " | 724 | pr_info("elantech.c: firmware version 2.0.34 detected, " |
| 725 | "enabling jumpy cursor workaround\n"); | 725 | "enabling jumpy cursor workaround\n"); |
| 726 | etd->jumpy_cursor = 1; | 726 | etd->jumpy_cursor = 1; |
| 727 | } | 727 | } |
diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index feac5f7af966..ac57bde1bb9f 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h | |||
| @@ -100,11 +100,10 @@ struct elantech_data { | |||
| 100 | unsigned char reg_26; | 100 | unsigned char reg_26; |
| 101 | unsigned char debug; | 101 | unsigned char debug; |
| 102 | unsigned char capabilities; | 102 | unsigned char capabilities; |
| 103 | unsigned char fw_version_maj; | ||
| 104 | unsigned char fw_version_min; | ||
| 105 | unsigned char hw_version; | ||
| 106 | unsigned char paritycheck; | 103 | unsigned char paritycheck; |
| 107 | unsigned char jumpy_cursor; | 104 | unsigned char jumpy_cursor; |
| 105 | unsigned char hw_version; | ||
| 106 | unsigned int fw_version; | ||
| 108 | unsigned char parity[256]; | 107 | unsigned char parity[256]; |
| 109 | }; | 108 | }; |
| 110 | 109 | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index cbc807264940..a3c97315a473 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
| @@ -1394,6 +1394,7 @@ static int psmouse_reconnect(struct serio *serio) | |||
| 1394 | struct psmouse *psmouse = serio_get_drvdata(serio); | 1394 | struct psmouse *psmouse = serio_get_drvdata(serio); |
| 1395 | struct psmouse *parent = NULL; | 1395 | struct psmouse *parent = NULL; |
| 1396 | struct serio_driver *drv = serio->drv; | 1396 | struct serio_driver *drv = serio->drv; |
| 1397 | unsigned char type; | ||
| 1397 | int rc = -1; | 1398 | int rc = -1; |
| 1398 | 1399 | ||
| 1399 | if (!drv || !psmouse) { | 1400 | if (!drv || !psmouse) { |
| @@ -1413,10 +1414,15 @@ static int psmouse_reconnect(struct serio *serio) | |||
| 1413 | if (psmouse->reconnect) { | 1414 | if (psmouse->reconnect) { |
| 1414 | if (psmouse->reconnect(psmouse)) | 1415 | if (psmouse->reconnect(psmouse)) |
| 1415 | goto out; | 1416 | goto out; |
| 1416 | } else if (psmouse_probe(psmouse) < 0 || | 1417 | } else { |
| 1417 | psmouse->type != psmouse_extensions(psmouse, | 1418 | psmouse_reset(psmouse); |
| 1418 | psmouse_max_proto, false)) { | 1419 | |
| 1419 | goto out; | 1420 | if (psmouse_probe(psmouse) < 0) |
| 1421 | goto out; | ||
| 1422 | |||
| 1423 | type = psmouse_extensions(psmouse, psmouse_max_proto, false); | ||
| 1424 | if (psmouse->type != type) | ||
| 1425 | goto out; | ||
| 1420 | } | 1426 | } |
| 1421 | 1427 | ||
| 1422 | /* ok, the device type (and capabilities) match the old one, | 1428 | /* ok, the device type (and capabilities) match the old one, |
diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c index e019d53d1ab4..0d2d7e54b465 100644 --- a/drivers/input/touchscreen/ad7877.c +++ b/drivers/input/touchscreen/ad7877.c | |||
| @@ -156,9 +156,14 @@ struct ser_req { | |||
| 156 | u16 reset; | 156 | u16 reset; |
| 157 | u16 ref_on; | 157 | u16 ref_on; |
| 158 | u16 command; | 158 | u16 command; |
| 159 | u16 sample; | ||
| 160 | struct spi_message msg; | 159 | struct spi_message msg; |
| 161 | struct spi_transfer xfer[6]; | 160 | struct spi_transfer xfer[6]; |
| 161 | |||
| 162 | /* | ||
| 163 | * DMA (thus cache coherency maintenance) requires the | ||
| 164 | * transfer buffers to live in their own cache lines. | ||
| 165 | */ | ||
| 166 | u16 sample ____cacheline_aligned; | ||
| 162 | }; | 167 | }; |
| 163 | 168 | ||
| 164 | struct ad7877 { | 169 | struct ad7877 { |
| @@ -182,8 +187,6 @@ struct ad7877 { | |||
| 182 | u8 averaging; | 187 | u8 averaging; |
| 183 | u8 pen_down_acc_interval; | 188 | u8 pen_down_acc_interval; |
| 184 | 189 | ||
| 185 | u16 conversion_data[AD7877_NR_SENSE]; | ||
| 186 | |||
| 187 | struct spi_transfer xfer[AD7877_NR_SENSE + 2]; | 190 | struct spi_transfer xfer[AD7877_NR_SENSE + 2]; |
| 188 | struct spi_message msg; | 191 | struct spi_message msg; |
| 189 | 192 | ||
| @@ -195,6 +198,12 @@ struct ad7877 { | |||
| 195 | spinlock_t lock; | 198 | spinlock_t lock; |
| 196 | struct timer_list timer; /* P: lock */ | 199 | struct timer_list timer; /* P: lock */ |
| 197 | unsigned pending:1; /* P: lock */ | 200 | unsigned pending:1; /* P: lock */ |
| 201 | |||
| 202 | /* | ||
| 203 | * DMA (thus cache coherency maintenance) requires the | ||
| 204 | * transfer buffers to live in their own cache lines. | ||
| 205 | */ | ||
| 206 | u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; | ||
| 198 | }; | 207 | }; |
| 199 | 208 | ||
| 200 | static int gpio3; | 209 | static int gpio3; |
diff --git a/drivers/mfd/wm831x-core.c b/drivers/mfd/wm831x-core.c index a3d5728b6449..f2ab025ad97a 100644 --- a/drivers/mfd/wm831x-core.c +++ b/drivers/mfd/wm831x-core.c | |||
| @@ -349,6 +349,9 @@ int wm831x_auxadc_read(struct wm831x *wm831x, enum wm831x_auxadc input) | |||
| 349 | goto disable; | 349 | goto disable; |
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | /* If an interrupt arrived late clean up after it */ | ||
| 353 | try_wait_for_completion(&wm831x->auxadc_done); | ||
| 354 | |||
| 352 | /* Ignore the result to allow us to soldier on without IRQ hookup */ | 355 | /* Ignore the result to allow us to soldier on without IRQ hookup */ |
| 353 | wait_for_completion_timeout(&wm831x->auxadc_done, msecs_to_jiffies(5)); | 356 | wait_for_completion_timeout(&wm831x->auxadc_done, msecs_to_jiffies(5)); |
| 354 | 357 | ||
diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c index e400a3bed063..b5807484b4c9 100644 --- a/drivers/mfd/wm8350-core.c +++ b/drivers/mfd/wm8350-core.c | |||
| @@ -363,6 +363,10 @@ int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref) | |||
| 363 | reg |= 1 << channel | WM8350_AUXADC_POLL; | 363 | reg |= 1 << channel | WM8350_AUXADC_POLL; |
| 364 | wm8350_reg_write(wm8350, WM8350_DIGITISER_CONTROL_1, reg); | 364 | wm8350_reg_write(wm8350, WM8350_DIGITISER_CONTROL_1, reg); |
| 365 | 365 | ||
| 366 | /* If a late IRQ left the completion signalled then consume | ||
| 367 | * the completion. */ | ||
| 368 | try_wait_for_completion(&wm8350->auxadc_done); | ||
| 369 | |||
| 366 | /* We ignore the result of the completion and just check for a | 370 | /* We ignore the result of the completion and just check for a |
| 367 | * conversion result, allowing us to soldier on if the IRQ | 371 | * conversion result, allowing us to soldier on if the IRQ |
| 368 | * infrastructure is not set up for the chip. */ | 372 | * infrastructure is not set up for the chip. */ |
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c index a6dd7da37357..336d9f553f3e 100644 --- a/drivers/mmc/host/at91_mci.c +++ b/drivers/mmc/host/at91_mci.c | |||
| @@ -314,8 +314,8 @@ static void at91_mci_post_dma_read(struct at91mci_host *host) | |||
| 314 | dmabuf = (unsigned *)tmpv; | 314 | dmabuf = (unsigned *)tmpv; |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | flush_kernel_dcache_page(sg_page(sg)); | ||
| 317 | kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ); | 318 | kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ); |
| 318 | dmac_flush_range((void *)sgbuffer, ((void *)sgbuffer) + amount); | ||
| 319 | data->bytes_xfered += amount; | 319 | data->bytes_xfered += amount; |
| 320 | if (size == 0) | 320 | if (size == 0) |
| 321 | break; | 321 | break; |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 88be37d9e9a5..fb279f4ed8b3 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -266,7 +266,7 @@ static int atmci_req_show(struct seq_file *s, void *v) | |||
| 266 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", | 266 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", |
| 267 | cmd->opcode, cmd->arg, cmd->flags, | 267 | cmd->opcode, cmd->arg, cmd->flags, |
| 268 | cmd->resp[0], cmd->resp[1], cmd->resp[2], | 268 | cmd->resp[0], cmd->resp[1], cmd->resp[2], |
| 269 | cmd->resp[2], cmd->error); | 269 | cmd->resp[3], cmd->error); |
| 270 | if (data) | 270 | if (data) |
| 271 | seq_printf(s, "DATA %u / %u * %u flg %x err %d\n", | 271 | seq_printf(s, "DATA %u / %u * %u flg %x err %d\n", |
| 272 | data->bytes_xfered, data->blocks, | 272 | data->bytes_xfered, data->blocks, |
| @@ -276,7 +276,7 @@ static int atmci_req_show(struct seq_file *s, void *v) | |||
| 276 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", | 276 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", |
| 277 | stop->opcode, stop->arg, stop->flags, | 277 | stop->opcode, stop->arg, stop->flags, |
| 278 | stop->resp[0], stop->resp[1], stop->resp[2], | 278 | stop->resp[0], stop->resp[1], stop->resp[2], |
| 279 | stop->resp[2], stop->error); | 279 | stop->resp[3], stop->error); |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | spin_unlock_bh(&slot->host->lock); | 282 | spin_unlock_bh(&slot->host->lock); |
| @@ -569,9 +569,10 @@ static void atmci_dma_cleanup(struct atmel_mci *host) | |||
| 569 | { | 569 | { |
| 570 | struct mmc_data *data = host->data; | 570 | struct mmc_data *data = host->data; |
| 571 | 571 | ||
| 572 | dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len, | 572 | if (data) |
| 573 | ((data->flags & MMC_DATA_WRITE) | 573 | dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len, |
| 574 | ? DMA_TO_DEVICE : DMA_FROM_DEVICE)); | 574 | ((data->flags & MMC_DATA_WRITE) |
| 575 | ? DMA_TO_DEVICE : DMA_FROM_DEVICE)); | ||
| 575 | } | 576 | } |
| 576 | 577 | ||
| 577 | static void atmci_stop_dma(struct atmel_mci *host) | 578 | static void atmci_stop_dma(struct atmel_mci *host) |
| @@ -1099,8 +1100,8 @@ static void atmci_command_complete(struct atmel_mci *host, | |||
| 1099 | "command error: status=0x%08x\n", status); | 1100 | "command error: status=0x%08x\n", status); |
| 1100 | 1101 | ||
| 1101 | if (cmd->data) { | 1102 | if (cmd->data) { |
| 1102 | host->data = NULL; | ||
| 1103 | atmci_stop_dma(host); | 1103 | atmci_stop_dma(host); |
| 1104 | host->data = NULL; | ||
| 1104 | mci_writel(host, IDR, MCI_NOTBUSY | 1105 | mci_writel(host, IDR, MCI_NOTBUSY |
| 1105 | | MCI_TXRDY | MCI_RXRDY | 1106 | | MCI_TXRDY | MCI_RXRDY |
| 1106 | | ATMCI_DATA_ERROR_FLAGS); | 1107 | | ATMCI_DATA_ERROR_FLAGS); |
| @@ -1293,6 +1294,7 @@ static void atmci_tasklet_func(unsigned long priv) | |||
| 1293 | } else { | 1294 | } else { |
| 1294 | data->bytes_xfered = data->blocks * data->blksz; | 1295 | data->bytes_xfered = data->blocks * data->blksz; |
| 1295 | data->error = 0; | 1296 | data->error = 0; |
| 1297 | mci_writel(host, IDR, ATMCI_DATA_ERROR_FLAGS); | ||
| 1296 | } | 1298 | } |
| 1297 | 1299 | ||
| 1298 | if (!data->stop) { | 1300 | if (!data->stop) { |
| @@ -1751,13 +1753,13 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
| 1751 | ret = -ENODEV; | 1753 | ret = -ENODEV; |
| 1752 | if (pdata->slot[0].bus_width) { | 1754 | if (pdata->slot[0].bus_width) { |
| 1753 | ret = atmci_init_slot(host, &pdata->slot[0], | 1755 | ret = atmci_init_slot(host, &pdata->slot[0], |
| 1754 | MCI_SDCSEL_SLOT_A, 0); | 1756 | 0, MCI_SDCSEL_SLOT_A); |
| 1755 | if (!ret) | 1757 | if (!ret) |
| 1756 | nr_slots++; | 1758 | nr_slots++; |
| 1757 | } | 1759 | } |
| 1758 | if (pdata->slot[1].bus_width) { | 1760 | if (pdata->slot[1].bus_width) { |
| 1759 | ret = atmci_init_slot(host, &pdata->slot[1], | 1761 | ret = atmci_init_slot(host, &pdata->slot[1], |
| 1760 | MCI_SDCSEL_SLOT_B, 1); | 1762 | 1, MCI_SDCSEL_SLOT_B); |
| 1761 | if (!ret) | 1763 | if (!ret) |
| 1762 | nr_slots++; | 1764 | nr_slots++; |
| 1763 | } | 1765 | } |
diff --git a/drivers/net/a2065.c b/drivers/net/a2065.c index ed5e9742be2c..a8f0512bad38 100644 --- a/drivers/net/a2065.c +++ b/drivers/net/a2065.c | |||
| @@ -674,6 +674,7 @@ static struct zorro_device_id a2065_zorro_tbl[] __devinitdata = { | |||
| 674 | { ZORRO_PROD_AMERISTAR_A2065 }, | 674 | { ZORRO_PROD_AMERISTAR_A2065 }, |
| 675 | { 0 } | 675 | { 0 } |
| 676 | }; | 676 | }; |
| 677 | MODULE_DEVICE_TABLE(zorro, a2065_zorro_tbl); | ||
| 677 | 678 | ||
| 678 | static struct zorro_driver a2065_driver = { | 679 | static struct zorro_driver a2065_driver = { |
| 679 | .name = "a2065", | 680 | .name = "a2065", |
diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c index fa1a2354f5f9..4b30a46486e2 100644 --- a/drivers/net/ariadne.c +++ b/drivers/net/ariadne.c | |||
| @@ -145,6 +145,7 @@ static struct zorro_device_id ariadne_zorro_tbl[] __devinitdata = { | |||
| 145 | { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE }, | 145 | { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE }, |
| 146 | { 0 } | 146 | { 0 } |
| 147 | }; | 147 | }; |
| 148 | MODULE_DEVICE_TABLE(zorro, ariadne_zorro_tbl); | ||
| 148 | 149 | ||
| 149 | static struct zorro_driver ariadne_driver = { | 150 | static struct zorro_driver ariadne_driver = { |
| 150 | .name = "ariadne", | 151 | .name = "ariadne", |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 4e97ca182997..5d3763fb3472 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -1649,6 +1649,7 @@ static void free_skb_resources(struct gfar_private *priv) | |||
| 1649 | sizeof(struct rxbd8) * priv->total_rx_ring_size, | 1649 | sizeof(struct rxbd8) * priv->total_rx_ring_size, |
| 1650 | priv->tx_queue[0]->tx_bd_base, | 1650 | priv->tx_queue[0]->tx_bd_base, |
| 1651 | priv->tx_queue[0]->tx_bd_dma_base); | 1651 | priv->tx_queue[0]->tx_bd_dma_base); |
| 1652 | skb_queue_purge(&priv->rx_recycle); | ||
| 1652 | } | 1653 | } |
| 1653 | 1654 | ||
| 1654 | void gfar_start(struct net_device *dev) | 1655 | void gfar_start(struct net_device *dev) |
| @@ -2088,7 +2089,6 @@ static int gfar_close(struct net_device *dev) | |||
| 2088 | 2089 | ||
| 2089 | disable_napi(priv); | 2090 | disable_napi(priv); |
| 2090 | 2091 | ||
| 2091 | skb_queue_purge(&priv->rx_recycle); | ||
| 2092 | cancel_work_sync(&priv->reset_task); | 2092 | cancel_work_sync(&priv->reset_task); |
| 2093 | stop_gfar(dev); | 2093 | stop_gfar(dev); |
| 2094 | 2094 | ||
diff --git a/drivers/net/hydra.c b/drivers/net/hydra.c index 24724b4ad709..07d8e5b634f3 100644 --- a/drivers/net/hydra.c +++ b/drivers/net/hydra.c | |||
| @@ -71,6 +71,7 @@ static struct zorro_device_id hydra_zorro_tbl[] __devinitdata = { | |||
| 71 | { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET }, | 71 | { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET }, |
| 72 | { 0 } | 72 | { 0 } |
| 73 | }; | 73 | }; |
| 74 | MODULE_DEVICE_TABLE(zorro, hydra_zorro_tbl); | ||
| 74 | 75 | ||
| 75 | static struct zorro_driver hydra_driver = { | 76 | static struct zorro_driver hydra_driver = { |
| 76 | .name = "hydra", | 77 | .name = "hydra", |
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 0cd80e4d71d9..e67691dca4ab 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
| @@ -32,6 +32,7 @@ static int kszphy_config_init(struct phy_device *phydev) | |||
| 32 | 32 | ||
| 33 | static struct phy_driver ks8001_driver = { | 33 | static struct phy_driver ks8001_driver = { |
| 34 | .phy_id = PHY_ID_KS8001, | 34 | .phy_id = PHY_ID_KS8001, |
| 35 | .name = "Micrel KS8001", | ||
| 35 | .phy_id_mask = 0x00fffff0, | 36 | .phy_id_mask = 0x00fffff0, |
| 36 | .features = PHY_BASIC_FEATURES, | 37 | .features = PHY_BASIC_FEATURES, |
| 37 | .flags = PHY_POLL, | 38 | .flags = PHY_POLL, |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index f9f0730b53d5..5ec542dd5b50 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
| @@ -187,7 +187,6 @@ tx_drop: | |||
| 187 | return NETDEV_TX_OK; | 187 | return NETDEV_TX_OK; |
| 188 | 188 | ||
| 189 | rx_drop: | 189 | rx_drop: |
| 190 | kfree_skb(skb); | ||
| 191 | rcv_stats->rx_dropped++; | 190 | rcv_stats->rx_dropped++; |
| 192 | return NETDEV_TX_OK; | 191 | return NETDEV_TX_OK; |
| 193 | } | 192 | } |
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 99a6da464bd3..e1c2fcaa8bed 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
| @@ -727,12 +727,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) | |||
| 727 | { | 727 | { |
| 728 | struct device *parent = aru->udev->dev.parent; | 728 | struct device *parent = aru->udev->dev.parent; |
| 729 | 729 | ||
| 730 | complete(&aru->firmware_loading_complete); | ||
| 731 | |||
| 730 | /* unbind anything failed */ | 732 | /* unbind anything failed */ |
| 731 | if (parent) | 733 | if (parent) |
| 732 | down(&parent->sem); | 734 | down(&parent->sem); |
| 733 | device_release_driver(&aru->udev->dev); | 735 | device_release_driver(&aru->udev->dev); |
| 734 | if (parent) | 736 | if (parent) |
| 735 | up(&parent->sem); | 737 | up(&parent->sem); |
| 738 | |||
| 739 | usb_put_dev(aru->udev); | ||
| 736 | } | 740 | } |
| 737 | 741 | ||
| 738 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | 742 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) |
| @@ -761,6 +765,8 @@ static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | |||
| 761 | if (err) | 765 | if (err) |
| 762 | goto err_unrx; | 766 | goto err_unrx; |
| 763 | 767 | ||
| 768 | complete(&aru->firmware_loading_complete); | ||
| 769 | usb_put_dev(aru->udev); | ||
| 764 | return; | 770 | return; |
| 765 | 771 | ||
| 766 | err_unrx: | 772 | err_unrx: |
| @@ -858,6 +864,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
| 858 | init_usb_anchor(&aru->tx_pending); | 864 | init_usb_anchor(&aru->tx_pending); |
| 859 | init_usb_anchor(&aru->tx_submitted); | 865 | init_usb_anchor(&aru->tx_submitted); |
| 860 | init_completion(&aru->cmd_wait); | 866 | init_completion(&aru->cmd_wait); |
| 867 | init_completion(&aru->firmware_loading_complete); | ||
| 861 | spin_lock_init(&aru->tx_urb_lock); | 868 | spin_lock_init(&aru->tx_urb_lock); |
| 862 | 869 | ||
| 863 | aru->tx_pending_urbs = 0; | 870 | aru->tx_pending_urbs = 0; |
| @@ -877,6 +884,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
| 877 | if (err) | 884 | if (err) |
| 878 | goto err_freehw; | 885 | goto err_freehw; |
| 879 | 886 | ||
| 887 | usb_get_dev(aru->udev); | ||
| 880 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", | 888 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", |
| 881 | &aru->udev->dev, GFP_KERNEL, aru, | 889 | &aru->udev->dev, GFP_KERNEL, aru, |
| 882 | ar9170_usb_firmware_step2); | 890 | ar9170_usb_firmware_step2); |
| @@ -896,6 +904,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf) | |||
| 896 | return; | 904 | return; |
| 897 | 905 | ||
| 898 | aru->common.state = AR9170_IDLE; | 906 | aru->common.state = AR9170_IDLE; |
| 907 | |||
| 908 | wait_for_completion(&aru->firmware_loading_complete); | ||
| 909 | |||
| 899 | ar9170_unregister(&aru->common); | 910 | ar9170_unregister(&aru->common); |
| 900 | ar9170_usb_cancel_urbs(aru); | 911 | ar9170_usb_cancel_urbs(aru); |
| 901 | 912 | ||
diff --git a/drivers/net/wireless/ath/ar9170/usb.h b/drivers/net/wireless/ath/ar9170/usb.h index a2ce3b169ceb..919b06046eb3 100644 --- a/drivers/net/wireless/ath/ar9170/usb.h +++ b/drivers/net/wireless/ath/ar9170/usb.h | |||
| @@ -71,6 +71,7 @@ struct ar9170_usb { | |||
| 71 | unsigned int tx_pending_urbs; | 71 | unsigned int tx_pending_urbs; |
| 72 | 72 | ||
| 73 | struct completion cmd_wait; | 73 | struct completion cmd_wait; |
| 74 | struct completion firmware_loading_complete; | ||
| 74 | int readlen; | 75 | int readlen; |
| 75 | u8 *readbuf; | 76 | u8 *readbuf; |
| 76 | 77 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index 6383d9f8c9b3..f4e59ae07f8e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
| @@ -2621,7 +2621,9 @@ struct iwl_ssid_ie { | |||
| 2621 | #define PROBE_OPTION_MAX_3945 4 | 2621 | #define PROBE_OPTION_MAX_3945 4 |
| 2622 | #define PROBE_OPTION_MAX 20 | 2622 | #define PROBE_OPTION_MAX 20 |
| 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) | 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) |
| 2624 | #define IWL_GOOD_CRC_TH cpu_to_le16(1) | 2624 | #define IWL_GOOD_CRC_TH_DISABLED 0 |
| 2625 | #define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1) | ||
| 2626 | #define IWL_GOOD_CRC_TH_NEVER cpu_to_le16(0xffff) | ||
| 2625 | #define IWL_MAX_SCAN_SIZE 1024 | 2627 | #define IWL_MAX_SCAN_SIZE 1024 |
| 2626 | #define IWL_MAX_CMD_SIZE 4096 | 2628 | #define IWL_MAX_CMD_SIZE 4096 |
| 2627 | #define IWL_MAX_PROBE_REQUEST 200 | 2629 | #define IWL_MAX_PROBE_REQUEST 200 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 12e455a4b90e..741e65ec8301 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -813,16 +813,29 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
| 813 | rate = IWL_RATE_1M_PLCP; | 813 | rate = IWL_RATE_1M_PLCP; |
| 814 | rate_flags = RATE_MCS_CCK_MSK; | 814 | rate_flags = RATE_MCS_CCK_MSK; |
| 815 | } | 815 | } |
| 816 | scan->good_CRC_th = 0; | 816 | scan->good_CRC_th = IWL_GOOD_CRC_TH_DISABLED; |
| 817 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { | 817 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 818 | band = IEEE80211_BAND_5GHZ; | 818 | band = IEEE80211_BAND_5GHZ; |
| 819 | rate = IWL_RATE_6M_PLCP; | 819 | rate = IWL_RATE_6M_PLCP; |
| 820 | /* | 820 | /* |
| 821 | * If active scaning is requested but a certain channel | 821 | * If active scanning is requested but a certain channel is |
| 822 | * is marked passive, we can do active scanning if we | 822 | * marked passive, we can do active scanning if we detect |
| 823 | * detect transmissions. | 823 | * transmissions. |
| 824 | * | ||
| 825 | * There is an issue with some firmware versions that triggers | ||
| 826 | * a sysassert on a "good CRC threshold" of zero (== disabled), | ||
| 827 | * on a radar channel even though this means that we should NOT | ||
| 828 | * send probes. | ||
| 829 | * | ||
| 830 | * The "good CRC threshold" is the number of frames that we | ||
| 831 | * need to receive during our dwell time on a channel before | ||
| 832 | * sending out probes -- setting this to a huge value will | ||
| 833 | * mean we never reach it, but at the same time work around | ||
| 834 | * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER | ||
| 835 | * here instead of IWL_GOOD_CRC_TH_DISABLED. | ||
| 824 | */ | 836 | */ |
| 825 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 837 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT : |
| 838 | IWL_GOOD_CRC_TH_NEVER; | ||
| 826 | 839 | ||
| 827 | /* Force use of chains B and C (0x6) for scan Rx for 4965 | 840 | /* Force use of chains B and C (0x6) for scan Rx for 4965 |
| 828 | * Avoid A (0x1) because of its off-channel reception on A-band. | 841 | * Avoid A (0x1) because of its off-channel reception on A-band. |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index b55e4f39a9e1..b74a56c48d26 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -2967,7 +2967,8 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2967 | * is marked passive, we can do active scanning if we | 2967 | * is marked passive, we can do active scanning if we |
| 2968 | * detect transmissions. | 2968 | * detect transmissions. |
| 2969 | */ | 2969 | */ |
| 2970 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 2970 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT : |
| 2971 | IWL_GOOD_CRC_TH_DISABLED; | ||
| 2971 | band = IEEE80211_BAND_5GHZ; | 2972 | band = IEEE80211_BAND_5GHZ; |
| 2972 | } else { | 2973 | } else { |
| 2973 | IWL_WARN(priv, "Invalid scan band count\n"); | 2974 | IWL_WARN(priv, "Invalid scan band count\n"); |
diff --git a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c index 81c753a617ab..9548cbb5012a 100644 --- a/drivers/net/zorro8390.c +++ b/drivers/net/zorro8390.c | |||
| @@ -102,6 +102,7 @@ static struct zorro_device_id zorro8390_zorro_tbl[] __devinitdata = { | |||
| 102 | { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, }, | 102 | { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, }, |
| 103 | { 0 } | 103 | { 0 } |
| 104 | }; | 104 | }; |
| 105 | MODULE_DEVICE_TABLE(zorro, zorro8390_zorro_tbl); | ||
| 105 | 106 | ||
| 106 | static struct zorro_driver zorro8390_driver = { | 107 | static struct zorro_driver zorro8390_driver = { |
| 107 | .name = "zorro8390", | 108 | .name = "zorro8390", |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 4fe36d2e1049..19b111383f62 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
| @@ -838,65 +838,11 @@ static void pci_bus_dump_resources(struct pci_bus *bus) | |||
| 838 | } | 838 | } |
| 839 | } | 839 | } |
| 840 | 840 | ||
| 841 | static int __init pci_bus_get_depth(struct pci_bus *bus) | ||
| 842 | { | ||
| 843 | int depth = 0; | ||
| 844 | struct pci_dev *dev; | ||
| 845 | |||
| 846 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 847 | int ret; | ||
| 848 | struct pci_bus *b = dev->subordinate; | ||
| 849 | if (!b) | ||
| 850 | continue; | ||
| 851 | |||
| 852 | ret = pci_bus_get_depth(b); | ||
| 853 | if (ret + 1 > depth) | ||
| 854 | depth = ret + 1; | ||
| 855 | } | ||
| 856 | |||
| 857 | return depth; | ||
| 858 | } | ||
| 859 | static int __init pci_get_max_depth(void) | ||
| 860 | { | ||
| 861 | int depth = 0; | ||
| 862 | struct pci_bus *bus; | ||
| 863 | |||
| 864 | list_for_each_entry(bus, &pci_root_buses, node) { | ||
| 865 | int ret; | ||
| 866 | |||
| 867 | ret = pci_bus_get_depth(bus); | ||
| 868 | if (ret > depth) | ||
| 869 | depth = ret; | ||
| 870 | } | ||
| 871 | |||
| 872 | return depth; | ||
| 873 | } | ||
| 874 | |||
| 875 | /* | ||
| 876 | * first try will not touch pci bridge res | ||
| 877 | * second and later try will clear small leaf bridge res | ||
| 878 | * will stop till to the max deepth if can not find good one | ||
| 879 | */ | ||
| 880 | void __init | 841 | void __init |
| 881 | pci_assign_unassigned_resources(void) | 842 | pci_assign_unassigned_resources(void) |
| 882 | { | 843 | { |
| 883 | struct pci_bus *bus; | 844 | struct pci_bus *bus; |
| 884 | int tried_times = 0; | ||
| 885 | enum release_type rel_type = leaf_only; | ||
| 886 | struct resource_list_x head, *list; | ||
| 887 | unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM | | ||
| 888 | IORESOURCE_PREFETCH; | ||
| 889 | unsigned long failed_type; | ||
| 890 | int max_depth = pci_get_max_depth(); | ||
| 891 | int pci_try_num; | ||
| 892 | 845 | ||
| 893 | head.next = NULL; | ||
| 894 | |||
| 895 | pci_try_num = max_depth + 1; | ||
| 896 | printk(KERN_DEBUG "PCI: max bus depth: %d pci_try_num: %d\n", | ||
| 897 | max_depth, pci_try_num); | ||
| 898 | |||
| 899 | again: | ||
| 900 | /* Depth first, calculate sizes and alignments of all | 846 | /* Depth first, calculate sizes and alignments of all |
| 901 | subordinate buses. */ | 847 | subordinate buses. */ |
| 902 | list_for_each_entry(bus, &pci_root_buses, node) { | 848 | list_for_each_entry(bus, &pci_root_buses, node) { |
| @@ -904,65 +850,9 @@ again: | |||
| 904 | } | 850 | } |
| 905 | /* Depth last, allocate resources and update the hardware. */ | 851 | /* Depth last, allocate resources and update the hardware. */ |
| 906 | list_for_each_entry(bus, &pci_root_buses, node) { | 852 | list_for_each_entry(bus, &pci_root_buses, node) { |
| 907 | __pci_bus_assign_resources(bus, &head); | 853 | pci_bus_assign_resources(bus); |
| 908 | } | ||
| 909 | tried_times++; | ||
| 910 | |||
| 911 | /* any device complain? */ | ||
| 912 | if (!head.next) | ||
| 913 | goto enable_and_dump; | ||
| 914 | failed_type = 0; | ||
| 915 | for (list = head.next; list;) { | ||
| 916 | failed_type |= list->flags; | ||
| 917 | list = list->next; | ||
| 918 | } | ||
| 919 | /* | ||
| 920 | * io port are tight, don't try extra | ||
| 921 | * or if reach the limit, don't want to try more | ||
| 922 | */ | ||
| 923 | failed_type &= type_mask; | ||
| 924 | if ((failed_type == IORESOURCE_IO) || (tried_times >= pci_try_num)) { | ||
| 925 | free_failed_list(&head); | ||
| 926 | goto enable_and_dump; | ||
| 927 | } | ||
| 928 | |||
| 929 | printk(KERN_DEBUG "PCI: No. %d try to assign unassigned res\n", | ||
| 930 | tried_times + 1); | ||
| 931 | |||
| 932 | /* third times and later will not check if it is leaf */ | ||
| 933 | if ((tried_times + 1) > 2) | ||
| 934 | rel_type = whole_subtree; | ||
| 935 | |||
| 936 | /* | ||
| 937 | * Try to release leaf bridge's resources that doesn't fit resource of | ||
| 938 | * child device under that bridge | ||
| 939 | */ | ||
| 940 | for (list = head.next; list;) { | ||
| 941 | bus = list->dev->bus; | ||
| 942 | pci_bus_release_bridge_resources(bus, list->flags & type_mask, | ||
| 943 | rel_type); | ||
| 944 | list = list->next; | ||
| 945 | } | ||
| 946 | /* restore size and flags */ | ||
| 947 | for (list = head.next; list;) { | ||
| 948 | struct resource *res = list->res; | ||
| 949 | |||
| 950 | res->start = list->start; | ||
| 951 | res->end = list->end; | ||
| 952 | res->flags = list->flags; | ||
| 953 | if (list->dev->subordinate) | ||
| 954 | res->flags = 0; | ||
| 955 | |||
| 956 | list = list->next; | ||
| 957 | } | ||
| 958 | free_failed_list(&head); | ||
| 959 | |||
| 960 | goto again; | ||
| 961 | |||
| 962 | enable_and_dump: | ||
| 963 | /* Depth last, update the hardware. */ | ||
| 964 | list_for_each_entry(bus, &pci_root_buses, node) | ||
| 965 | pci_enable_bridges(bus); | 854 | pci_enable_bridges(bus); |
| 855 | } | ||
| 966 | 856 | ||
| 967 | /* dump the resource on buses */ | 857 | /* dump the resource on buses */ |
| 968 | list_for_each_entry(bus, &pci_root_buses, node) { | 858 | list_for_each_entry(bus, &pci_root_buses, node) { |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index acf222f91f5a..fa2339cb1681 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -37,6 +37,9 @@ | |||
| 37 | */ | 37 | */ |
| 38 | #define DASD_CHANQ_MAX_SIZE 4 | 38 | #define DASD_CHANQ_MAX_SIZE 4 |
| 39 | 39 | ||
| 40 | #define DASD_SLEEPON_START_TAG (void *) 1 | ||
| 41 | #define DASD_SLEEPON_END_TAG (void *) 2 | ||
| 42 | |||
| 40 | /* | 43 | /* |
| 41 | * SECTION: exported variables of dasd.c | 44 | * SECTION: exported variables of dasd.c |
| 42 | */ | 45 | */ |
| @@ -1472,7 +1475,10 @@ void dasd_add_request_tail(struct dasd_ccw_req *cqr) | |||
| 1472 | */ | 1475 | */ |
| 1473 | static void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) | 1476 | static void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) |
| 1474 | { | 1477 | { |
| 1475 | wake_up((wait_queue_head_t *) data); | 1478 | spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); |
| 1479 | cqr->callback_data = DASD_SLEEPON_END_TAG; | ||
| 1480 | spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); | ||
| 1481 | wake_up(&generic_waitq); | ||
| 1476 | } | 1482 | } |
| 1477 | 1483 | ||
| 1478 | static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) | 1484 | static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) |
| @@ -1482,10 +1488,7 @@ static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) | |||
| 1482 | 1488 | ||
| 1483 | device = cqr->startdev; | 1489 | device = cqr->startdev; |
| 1484 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | 1490 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
| 1485 | rc = ((cqr->status == DASD_CQR_DONE || | 1491 | rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); |
| 1486 | cqr->status == DASD_CQR_NEED_ERP || | ||
| 1487 | cqr->status == DASD_CQR_TERMINATED) && | ||
| 1488 | list_empty(&cqr->devlist)); | ||
| 1489 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1492 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
| 1490 | return rc; | 1493 | return rc; |
| 1491 | } | 1494 | } |
| @@ -1573,7 +1576,7 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible) | |||
| 1573 | wait_event(generic_waitq, !(device->stopped)); | 1576 | wait_event(generic_waitq, !(device->stopped)); |
| 1574 | 1577 | ||
| 1575 | cqr->callback = dasd_wakeup_cb; | 1578 | cqr->callback = dasd_wakeup_cb; |
| 1576 | cqr->callback_data = (void *) &generic_waitq; | 1579 | cqr->callback_data = DASD_SLEEPON_START_TAG; |
| 1577 | dasd_add_request_tail(cqr); | 1580 | dasd_add_request_tail(cqr); |
| 1578 | if (interruptible) { | 1581 | if (interruptible) { |
| 1579 | rc = wait_event_interruptible( | 1582 | rc = wait_event_interruptible( |
| @@ -1652,7 +1655,7 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) | |||
| 1652 | } | 1655 | } |
| 1653 | 1656 | ||
| 1654 | cqr->callback = dasd_wakeup_cb; | 1657 | cqr->callback = dasd_wakeup_cb; |
| 1655 | cqr->callback_data = (void *) &generic_waitq; | 1658 | cqr->callback_data = DASD_SLEEPON_START_TAG; |
| 1656 | cqr->status = DASD_CQR_QUEUED; | 1659 | cqr->status = DASD_CQR_QUEUED; |
| 1657 | list_add(&cqr->devlist, &device->ccw_queue); | 1660 | list_add(&cqr->devlist, &device->ccw_queue); |
| 1658 | 1661 | ||
diff --git a/drivers/scsi/zorro7xx.c b/drivers/scsi/zorro7xx.c index 105449c15fa9..e17764d71476 100644 --- a/drivers/scsi/zorro7xx.c +++ b/drivers/scsi/zorro7xx.c | |||
| @@ -69,6 +69,7 @@ static struct zorro_device_id zorro7xx_zorro_tbl[] __devinitdata = { | |||
| 69 | }, | 69 | }, |
| 70 | { 0 } | 70 | { 0 } |
| 71 | }; | 71 | }; |
| 72 | MODULE_DEVICE_TABLE(zorro, zorro7xx_zorro_tbl); | ||
| 72 | 73 | ||
| 73 | static int __devinit zorro7xx_init_one(struct zorro_dev *z, | 74 | static int __devinit zorro7xx_init_one(struct zorro_dev *z, |
| 74 | const struct zorro_device_id *ent) | 75 | const struct zorro_device_id *ent) |
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 4315b23590bd..eacb588a9345 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
| @@ -120,7 +120,8 @@ | |||
| 120 | #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ | 120 | #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ |
| 121 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ | 121 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ |
| 122 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ | 122 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ |
| 123 | #define UCR4_CTSTL_32 (32<<10) /* CTS trigger level (32 chars) */ | 123 | #define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */ |
| 124 | #define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */ | ||
| 124 | #define UCR4_INVR (1<<9) /* Inverted infrared reception */ | 125 | #define UCR4_INVR (1<<9) /* Inverted infrared reception */ |
| 125 | #define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ | 126 | #define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ |
| 126 | #define UCR4_WKEN (1<<7) /* Wake interrupt enable */ | 127 | #define UCR4_WKEN (1<<7) /* Wake interrupt enable */ |
| @@ -591,6 +592,9 @@ static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) | |||
| 591 | return 0; | 592 | return 0; |
| 592 | } | 593 | } |
| 593 | 594 | ||
| 595 | /* half the RX buffer size */ | ||
| 596 | #define CTSTL 16 | ||
| 597 | |||
| 594 | static int imx_startup(struct uart_port *port) | 598 | static int imx_startup(struct uart_port *port) |
| 595 | { | 599 | { |
| 596 | struct imx_port *sport = (struct imx_port *)port; | 600 | struct imx_port *sport = (struct imx_port *)port; |
| @@ -607,6 +611,10 @@ static int imx_startup(struct uart_port *port) | |||
| 607 | if (USE_IRDA(sport)) | 611 | if (USE_IRDA(sport)) |
| 608 | temp |= UCR4_IRSC; | 612 | temp |= UCR4_IRSC; |
| 609 | 613 | ||
| 614 | /* set the trigger level for CTS */ | ||
| 615 | temp &= ~(UCR4_CTSTL_MASK<< UCR4_CTSTL_SHF); | ||
| 616 | temp |= CTSTL<< UCR4_CTSTL_SHF; | ||
| 617 | |||
| 610 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); | 618 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); |
| 611 | 619 | ||
| 612 | if (USE_IRDA(sport)) { | 620 | if (USE_IRDA(sport)) { |
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index a176ab4bd65b..02469c31bf0b 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
| @@ -1467,7 +1467,7 @@ mpc52xx_uart_init(void) | |||
| 1467 | /* | 1467 | /* |
| 1468 | * Map the PSC FIFO Controller and init if on MPC512x. | 1468 | * Map the PSC FIFO Controller and init if on MPC512x. |
| 1469 | */ | 1469 | */ |
| 1470 | if (psc_ops->fifoc_init) { | 1470 | if (psc_ops && psc_ops->fifoc_init) { |
| 1471 | ret = psc_ops->fifoc_init(); | 1471 | ret = psc_ops->fifoc_init(); |
| 1472 | if (ret) | 1472 | if (ret) |
| 1473 | return ret; | 1473 | return ret; |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index 4a6366a42129..111a01a747fc 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
| @@ -380,6 +380,7 @@ static int usbfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 380 | mutex_lock(&inode->i_mutex); | 380 | mutex_lock(&inode->i_mutex); |
| 381 | dentry_unhash(dentry); | 381 | dentry_unhash(dentry); |
| 382 | if (usbfs_empty(dentry)) { | 382 | if (usbfs_empty(dentry)) { |
| 383 | dont_mount(dentry); | ||
| 383 | drop_nlink(dentry->d_inode); | 384 | drop_nlink(dentry->d_inode); |
| 384 | drop_nlink(dentry->d_inode); | 385 | drop_nlink(dentry->d_inode); |
| 385 | dput(dentry); | 386 | dput(dentry); |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index e69d238c5af0..49fa953aaf6e 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
| @@ -1035,7 +1035,12 @@ int vhost_add_used(struct vhost_virtqueue *vq, unsigned int head, int len) | |||
| 1035 | /* This actually signals the guest, using eventfd. */ | 1035 | /* This actually signals the guest, using eventfd. */ |
| 1036 | void vhost_signal(struct vhost_dev *dev, struct vhost_virtqueue *vq) | 1036 | void vhost_signal(struct vhost_dev *dev, struct vhost_virtqueue *vq) |
| 1037 | { | 1037 | { |
| 1038 | __u16 flags = 0; | 1038 | __u16 flags; |
| 1039 | /* Flush out used index updates. This is paired | ||
| 1040 | * with the barrier that the Guest executes when enabling | ||
| 1041 | * interrupts. */ | ||
| 1042 | smp_mb(); | ||
| 1043 | |||
| 1039 | if (get_user(flags, &vq->avail->flags)) { | 1044 | if (get_user(flags, &vq->avail->flags)) { |
| 1040 | vq_err(vq, "Failed to get flags"); | 1045 | vq_err(vq, "Failed to get flags"); |
| 1041 | return; | 1046 | return; |
diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index dca48df98444..e5d6b56d4447 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c | |||
| @@ -50,8 +50,9 @@ | |||
| 50 | #include <linux/fb.h> | 50 | #include <linux/fb.h> |
| 51 | #include <linux/init.h> | 51 | #include <linux/init.h> |
| 52 | #include <linux/ioport.h> | 52 | #include <linux/ioport.h> |
| 53 | 53 | #include <linux/platform_device.h> | |
| 54 | #include <linux/uaccess.h> | 54 | #include <linux/uaccess.h> |
| 55 | |||
| 55 | #include <asm/system.h> | 56 | #include <asm/system.h> |
| 56 | #include <asm/irq.h> | 57 | #include <asm/irq.h> |
| 57 | #include <asm/amigahw.h> | 58 | #include <asm/amigahw.h> |
| @@ -1135,7 +1136,7 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg | |||
| 1135 | * Interface to the low level console driver | 1136 | * Interface to the low level console driver |
| 1136 | */ | 1137 | */ |
| 1137 | 1138 | ||
| 1138 | static void amifb_deinit(void); | 1139 | static void amifb_deinit(struct platform_device *pdev); |
| 1139 | 1140 | ||
| 1140 | /* | 1141 | /* |
| 1141 | * Internal routines | 1142 | * Internal routines |
| @@ -2246,7 +2247,7 @@ static inline void chipfree(void) | |||
| 2246 | * Initialisation | 2247 | * Initialisation |
| 2247 | */ | 2248 | */ |
| 2248 | 2249 | ||
| 2249 | static int __init amifb_init(void) | 2250 | static int __init amifb_probe(struct platform_device *pdev) |
| 2250 | { | 2251 | { |
| 2251 | int tag, i, err = 0; | 2252 | int tag, i, err = 0; |
| 2252 | u_long chipptr; | 2253 | u_long chipptr; |
| @@ -2261,16 +2262,6 @@ static int __init amifb_init(void) | |||
| 2261 | } | 2262 | } |
| 2262 | amifb_setup(option); | 2263 | amifb_setup(option); |
| 2263 | #endif | 2264 | #endif |
| 2264 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_VIDEO)) | ||
| 2265 | return -ENODEV; | ||
| 2266 | |||
| 2267 | /* | ||
| 2268 | * We request all registers starting from bplpt[0] | ||
| 2269 | */ | ||
| 2270 | if (!request_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120, | ||
| 2271 | "amifb [Denise/Lisa]")) | ||
| 2272 | return -EBUSY; | ||
| 2273 | |||
| 2274 | custom.dmacon = DMAF_ALL | DMAF_MASTER; | 2265 | custom.dmacon = DMAF_ALL | DMAF_MASTER; |
| 2275 | 2266 | ||
| 2276 | switch (amiga_chipset) { | 2267 | switch (amiga_chipset) { |
| @@ -2377,6 +2368,7 @@ default_chipset: | |||
| 2377 | fb_info.fbops = &amifb_ops; | 2368 | fb_info.fbops = &amifb_ops; |
| 2378 | fb_info.par = ¤tpar; | 2369 | fb_info.par = ¤tpar; |
| 2379 | fb_info.flags = FBINFO_DEFAULT; | 2370 | fb_info.flags = FBINFO_DEFAULT; |
| 2371 | fb_info.device = &pdev->dev; | ||
| 2380 | 2372 | ||
| 2381 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb, | 2373 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb, |
| 2382 | NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) { | 2374 | NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) { |
| @@ -2451,18 +2443,18 @@ default_chipset: | |||
| 2451 | return 0; | 2443 | return 0; |
| 2452 | 2444 | ||
| 2453 | amifb_error: | 2445 | amifb_error: |
| 2454 | amifb_deinit(); | 2446 | amifb_deinit(pdev); |
| 2455 | return err; | 2447 | return err; |
| 2456 | } | 2448 | } |
| 2457 | 2449 | ||
| 2458 | static void amifb_deinit(void) | 2450 | static void amifb_deinit(struct platform_device *pdev) |
| 2459 | { | 2451 | { |
| 2460 | if (fb_info.cmap.len) | 2452 | if (fb_info.cmap.len) |
| 2461 | fb_dealloc_cmap(&fb_info.cmap); | 2453 | fb_dealloc_cmap(&fb_info.cmap); |
| 2454 | fb_dealloc_cmap(&fb_info.cmap); | ||
| 2462 | chipfree(); | 2455 | chipfree(); |
| 2463 | if (videomemory) | 2456 | if (videomemory) |
| 2464 | iounmap((void*)videomemory); | 2457 | iounmap((void*)videomemory); |
| 2465 | release_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120); | ||
| 2466 | custom.dmacon = DMAF_ALL | DMAF_MASTER; | 2458 | custom.dmacon = DMAF_ALL | DMAF_MASTER; |
| 2467 | } | 2459 | } |
| 2468 | 2460 | ||
| @@ -3794,14 +3786,35 @@ static void ami_rebuild_copper(void) | |||
| 3794 | } | 3786 | } |
| 3795 | } | 3787 | } |
| 3796 | 3788 | ||
| 3797 | static void __exit amifb_exit(void) | 3789 | static int __exit amifb_remove(struct platform_device *pdev) |
| 3798 | { | 3790 | { |
| 3799 | unregister_framebuffer(&fb_info); | 3791 | unregister_framebuffer(&fb_info); |
| 3800 | amifb_deinit(); | 3792 | amifb_deinit(pdev); |
| 3801 | amifb_video_off(); | 3793 | amifb_video_off(); |
| 3794 | return 0; | ||
| 3795 | } | ||
| 3796 | |||
| 3797 | static struct platform_driver amifb_driver = { | ||
| 3798 | .remove = __exit_p(amifb_remove), | ||
| 3799 | .driver = { | ||
| 3800 | .name = "amiga-video", | ||
| 3801 | .owner = THIS_MODULE, | ||
| 3802 | }, | ||
| 3803 | }; | ||
| 3804 | |||
| 3805 | static int __init amifb_init(void) | ||
| 3806 | { | ||
| 3807 | return platform_driver_probe(&amifb_driver, amifb_probe); | ||
| 3802 | } | 3808 | } |
| 3803 | 3809 | ||
| 3804 | module_init(amifb_init); | 3810 | module_init(amifb_init); |
| 3811 | |||
| 3812 | static void __exit amifb_exit(void) | ||
| 3813 | { | ||
| 3814 | platform_driver_unregister(&amifb_driver); | ||
| 3815 | } | ||
| 3816 | |||
| 3805 | module_exit(amifb_exit); | 3817 | module_exit(amifb_exit); |
| 3806 | 3818 | ||
| 3807 | MODULE_LICENSE("GPL"); | 3819 | MODULE_LICENSE("GPL"); |
| 3820 | MODULE_ALIAS("platform:amiga-video"); | ||
diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c index 44e49c28b2a7..c2ec3dcd4e91 100644 --- a/drivers/video/bfin-t350mcqb-fb.c +++ b/drivers/video/bfin-t350mcqb-fb.c | |||
| @@ -488,9 +488,9 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) | |||
| 488 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; | 488 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; |
| 489 | fbinfo->flags = FBINFO_FLAG_DEFAULT; | 489 | fbinfo->flags = FBINFO_FLAG_DEFAULT; |
| 490 | 490 | ||
| 491 | info->fb_buffer = | 491 | info->fb_buffer = dma_alloc_coherent(NULL, fbinfo->fix.smem_len + |
| 492 | dma_alloc_coherent(NULL, fbinfo->fix.smem_len, &info->dma_handle, | 492 | ACTIVE_VIDEO_MEM_OFFSET, |
| 493 | GFP_KERNEL); | 493 | &info->dma_handle, GFP_KERNEL); |
| 494 | 494 | ||
| 495 | if (NULL == info->fb_buffer) { | 495 | if (NULL == info->fb_buffer) { |
| 496 | printk(KERN_ERR DRIVER_NAME | 496 | printk(KERN_ERR DRIVER_NAME |
| @@ -568,8 +568,8 @@ out7: | |||
| 568 | out6: | 568 | out6: |
| 569 | fb_dealloc_cmap(&fbinfo->cmap); | 569 | fb_dealloc_cmap(&fbinfo->cmap); |
| 570 | out4: | 570 | out4: |
| 571 | dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | 571 | dma_free_coherent(NULL, fbinfo->fix.smem_len + ACTIVE_VIDEO_MEM_OFFSET, |
| 572 | info->dma_handle); | 572 | info->fb_buffer, info->dma_handle); |
| 573 | out3: | 573 | out3: |
| 574 | framebuffer_release(fbinfo); | 574 | framebuffer_release(fbinfo); |
| 575 | out2: | 575 | out2: |
| @@ -592,8 +592,9 @@ static int __devexit bfin_t350mcqb_remove(struct platform_device *pdev) | |||
| 592 | free_irq(info->irq, info); | 592 | free_irq(info->irq, info); |
| 593 | 593 | ||
| 594 | if (info->fb_buffer != NULL) | 594 | if (info->fb_buffer != NULL) |
| 595 | dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | 595 | dma_free_coherent(NULL, fbinfo->fix.smem_len + |
| 596 | info->dma_handle); | 596 | ACTIVE_VIDEO_MEM_OFFSET, info->fb_buffer, |
| 597 | info->dma_handle); | ||
| 597 | 598 | ||
| 598 | fb_dealloc_cmap(&fbinfo->cmap); | 599 | fb_dealloc_cmap(&fbinfo->cmap); |
| 599 | 600 | ||
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index 8d8dfda2f868..6df7c54db0a3 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -299,6 +299,7 @@ static const struct zorro_device_id cirrusfb_zorro_table[] = { | |||
| 299 | }, | 299 | }, |
| 300 | { 0 } | 300 | { 0 } |
| 301 | }; | 301 | }; |
| 302 | MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table); | ||
| 302 | 303 | ||
| 303 | static const struct { | 304 | static const struct { |
| 304 | zorro_id id2; | 305 | zorro_id id2; |
diff --git a/drivers/video/fm2fb.c b/drivers/video/fm2fb.c index 6c91c61cdb63..1b0feb8e7244 100644 --- a/drivers/video/fm2fb.c +++ b/drivers/video/fm2fb.c | |||
| @@ -219,6 +219,7 @@ static struct zorro_device_id fm2fb_devices[] __devinitdata = { | |||
| 219 | { ZORRO_PROD_HELFRICH_RAINBOW_II }, | 219 | { ZORRO_PROD_HELFRICH_RAINBOW_II }, |
| 220 | { 0 } | 220 | { 0 } |
| 221 | }; | 221 | }; |
| 222 | MODULE_DEVICE_TABLE(zorro, fm2fb_devices); | ||
| 222 | 223 | ||
| 223 | static struct zorro_driver fm2fb_driver = { | 224 | static struct zorro_driver fm2fb_driver = { |
| 224 | .name = "fm2fb", | 225 | .name = "fm2fb", |
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 0bf5020d0d32..b87ba23442d2 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig | |||
| @@ -175,7 +175,7 @@ config SA1100_WATCHDOG | |||
| 175 | 175 | ||
| 176 | config MPCORE_WATCHDOG | 176 | config MPCORE_WATCHDOG |
| 177 | tristate "MPcore watchdog" | 177 | tristate "MPcore watchdog" |
| 178 | depends on ARM_MPCORE_PLATFORM && LOCAL_TIMERS | 178 | depends on HAVE_ARM_TWD |
| 179 | help | 179 | help |
| 180 | Watchdog timer embedded into the MPcore system. | 180 | Watchdog timer embedded into the MPcore system. |
| 181 | 181 | ||
diff --git a/drivers/watchdog/mpcore_wdt.c b/drivers/watchdog/mpcore_wdt.c index 016c6a791cab..b8ec7aca3c8e 100644 --- a/drivers/watchdog/mpcore_wdt.c +++ b/drivers/watchdog/mpcore_wdt.c | |||
| @@ -31,8 +31,9 @@ | |||
| 31 | #include <linux/platform_device.h> | 31 | #include <linux/platform_device.h> |
| 32 | #include <linux/uaccess.h> | 32 | #include <linux/uaccess.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/io.h> | ||
| 34 | 35 | ||
| 35 | #include <asm/hardware/arm_twd.h> | 36 | #include <asm/smp_twd.h> |
| 36 | 37 | ||
| 37 | struct mpcore_wdt { | 38 | struct mpcore_wdt { |
| 38 | unsigned long timer_alive; | 39 | unsigned long timer_alive; |
| @@ -44,7 +45,7 @@ struct mpcore_wdt { | |||
| 44 | }; | 45 | }; |
| 45 | 46 | ||
| 46 | static struct platform_device *mpcore_wdt_dev; | 47 | static struct platform_device *mpcore_wdt_dev; |
| 47 | extern unsigned int mpcore_timer_rate; | 48 | static DEFINE_SPINLOCK(wdt_lock); |
| 48 | 49 | ||
| 49 | #define TIMER_MARGIN 60 | 50 | #define TIMER_MARGIN 60 |
| 50 | static int mpcore_margin = TIMER_MARGIN; | 51 | static int mpcore_margin = TIMER_MARGIN; |
| @@ -94,13 +95,15 @@ static irqreturn_t mpcore_wdt_fire(int irq, void *arg) | |||
| 94 | */ | 95 | */ |
| 95 | static void mpcore_wdt_keepalive(struct mpcore_wdt *wdt) | 96 | static void mpcore_wdt_keepalive(struct mpcore_wdt *wdt) |
| 96 | { | 97 | { |
| 97 | unsigned int count; | 98 | unsigned long count; |
| 98 | 99 | ||
| 100 | spin_lock(&wdt_lock); | ||
| 99 | /* Assume prescale is set to 256 */ | 101 | /* Assume prescale is set to 256 */ |
| 100 | count = (mpcore_timer_rate / 256) * mpcore_margin; | 102 | count = __raw_readl(wdt->base + TWD_WDOG_COUNTER); |
| 103 | count = (0xFFFFFFFFU - count) * (HZ / 5); | ||
| 104 | count = (count / 256) * mpcore_margin; | ||
| 101 | 105 | ||
| 102 | /* Reload the counter */ | 106 | /* Reload the counter */ |
| 103 | spin_lock(&wdt_lock); | ||
| 104 | writel(count + wdt->perturb, wdt->base + TWD_WDOG_LOAD); | 107 | writel(count + wdt->perturb, wdt->base + TWD_WDOG_LOAD); |
| 105 | wdt->perturb = wdt->perturb ? 0 : 1; | 108 | wdt->perturb = wdt->perturb ? 0 : 1; |
| 106 | spin_unlock(&wdt_lock); | 109 | spin_unlock(&wdt_lock); |
| @@ -119,7 +122,6 @@ static void mpcore_wdt_start(struct mpcore_wdt *wdt) | |||
| 119 | { | 122 | { |
| 120 | dev_printk(KERN_INFO, wdt->dev, "enabling watchdog.\n"); | 123 | dev_printk(KERN_INFO, wdt->dev, "enabling watchdog.\n"); |
| 121 | 124 | ||
| 122 | spin_lock(&wdt_lock); | ||
| 123 | /* This loads the count register but does NOT start the count yet */ | 125 | /* This loads the count register but does NOT start the count yet */ |
| 124 | mpcore_wdt_keepalive(wdt); | 126 | mpcore_wdt_keepalive(wdt); |
| 125 | 127 | ||
| @@ -130,7 +132,6 @@ static void mpcore_wdt_start(struct mpcore_wdt *wdt) | |||
| 130 | /* Enable watchdog - prescale=256, watchdog mode=1, enable=1 */ | 132 | /* Enable watchdog - prescale=256, watchdog mode=1, enable=1 */ |
| 131 | writel(0x0000FF09, wdt->base + TWD_WDOG_CONTROL); | 133 | writel(0x0000FF09, wdt->base + TWD_WDOG_CONTROL); |
| 132 | } | 134 | } |
| 133 | spin_unlock(&wdt_lock); | ||
| 134 | } | 135 | } |
| 135 | 136 | ||
| 136 | static int mpcore_wdt_set_heartbeat(int t) | 137 | static int mpcore_wdt_set_heartbeat(int t) |
| @@ -360,7 +361,7 @@ static int __devinit mpcore_wdt_probe(struct platform_device *dev) | |||
| 360 | mpcore_wdt_miscdev.parent = &dev->dev; | 361 | mpcore_wdt_miscdev.parent = &dev->dev; |
| 361 | ret = misc_register(&mpcore_wdt_miscdev); | 362 | ret = misc_register(&mpcore_wdt_miscdev); |
| 362 | if (ret) { | 363 | if (ret) { |
| 363 | dev_printk(KERN_ERR, _dev, | 364 | dev_printk(KERN_ERR, wdt->dev, |
| 364 | "cannot register miscdev on minor=%d (err=%d)\n", | 365 | "cannot register miscdev on minor=%d (err=%d)\n", |
| 365 | WATCHDOG_MINOR, ret); | 366 | WATCHDOG_MINOR, ret); |
| 366 | goto err_misc; | 367 | goto err_misc; |
| @@ -369,13 +370,13 @@ static int __devinit mpcore_wdt_probe(struct platform_device *dev) | |||
| 369 | ret = request_irq(wdt->irq, mpcore_wdt_fire, IRQF_DISABLED, | 370 | ret = request_irq(wdt->irq, mpcore_wdt_fire, IRQF_DISABLED, |
| 370 | "mpcore_wdt", wdt); | 371 | "mpcore_wdt", wdt); |
| 371 | if (ret) { | 372 | if (ret) { |
| 372 | dev_printk(KERN_ERR, _dev, | 373 | dev_printk(KERN_ERR, wdt->dev, |
| 373 | "cannot register IRQ%d for watchdog\n", wdt->irq); | 374 | "cannot register IRQ%d for watchdog\n", wdt->irq); |
| 374 | goto err_irq; | 375 | goto err_irq; |
| 375 | } | 376 | } |
| 376 | 377 | ||
| 377 | mpcore_wdt_stop(wdt); | 378 | mpcore_wdt_stop(wdt); |
| 378 | platform_set_drvdata(&dev->dev, wdt); | 379 | platform_set_drvdata(dev, wdt); |
| 379 | mpcore_wdt_dev = dev; | 380 | mpcore_wdt_dev = dev; |
| 380 | 381 | ||
| 381 | return 0; | 382 | return 0; |
diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c index d47c47fc048f..3c7046d79654 100644 --- a/drivers/zorro/proc.c +++ b/drivers/zorro/proc.c | |||
| @@ -97,7 +97,7 @@ static void zorro_seq_stop(struct seq_file *m, void *v) | |||
| 97 | 97 | ||
| 98 | static int zorro_seq_show(struct seq_file *m, void *v) | 98 | static int zorro_seq_show(struct seq_file *m, void *v) |
| 99 | { | 99 | { |
| 100 | u_int slot = *(loff_t *)v; | 100 | unsigned int slot = *(loff_t *)v; |
| 101 | struct zorro_dev *z = &zorro_autocon[slot]; | 101 | struct zorro_dev *z = &zorro_autocon[slot]; |
| 102 | 102 | ||
| 103 | seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id, | 103 | seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id, |
| @@ -129,7 +129,7 @@ static const struct file_operations zorro_devices_proc_fops = { | |||
| 129 | 129 | ||
| 130 | static struct proc_dir_entry *proc_bus_zorro_dir; | 130 | static struct proc_dir_entry *proc_bus_zorro_dir; |
| 131 | 131 | ||
| 132 | static int __init zorro_proc_attach_device(u_int slot) | 132 | static int __init zorro_proc_attach_device(unsigned int slot) |
| 133 | { | 133 | { |
| 134 | struct proc_dir_entry *entry; | 134 | struct proc_dir_entry *entry; |
| 135 | char name[4]; | 135 | char name[4]; |
| @@ -146,7 +146,7 @@ static int __init zorro_proc_attach_device(u_int slot) | |||
| 146 | 146 | ||
| 147 | static int __init zorro_proc_init(void) | 147 | static int __init zorro_proc_init(void) |
| 148 | { | 148 | { |
| 149 | u_int slot; | 149 | unsigned int slot; |
| 150 | 150 | ||
| 151 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { | 151 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { |
| 152 | proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL); | 152 | proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL); |
diff --git a/drivers/zorro/zorro-driver.c b/drivers/zorro/zorro-driver.c index 53180a37cc9a..7ee2b6e71786 100644 --- a/drivers/zorro/zorro-driver.c +++ b/drivers/zorro/zorro-driver.c | |||
| @@ -137,10 +137,34 @@ static int zorro_bus_match(struct device *dev, struct device_driver *drv) | |||
| 137 | return 0; | 137 | return 0; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
| 141 | { | ||
| 142 | #ifdef CONFIG_HOTPLUG | ||
| 143 | struct zorro_dev *z; | ||
| 144 | |||
| 145 | if (!dev) | ||
| 146 | return -ENODEV; | ||
| 147 | |||
| 148 | z = to_zorro_dev(dev); | ||
| 149 | if (!z) | ||
| 150 | return -ENODEV; | ||
| 151 | |||
| 152 | if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) || | ||
| 153 | add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) || | ||
| 154 | add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) || | ||
| 155 | add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id)) | ||
| 156 | return -ENOMEM; | ||
| 157 | |||
| 158 | return 0; | ||
| 159 | #else /* !CONFIG_HOTPLUG */ | ||
| 160 | return -ENODEV; | ||
| 161 | #endif /* !CONFIG_HOTPLUG */ | ||
| 162 | } | ||
| 140 | 163 | ||
| 141 | struct bus_type zorro_bus_type = { | 164 | struct bus_type zorro_bus_type = { |
| 142 | .name = "zorro", | 165 | .name = "zorro", |
| 143 | .match = zorro_bus_match, | 166 | .match = zorro_bus_match, |
| 167 | .uevent = zorro_uevent, | ||
| 144 | .probe = zorro_device_probe, | 168 | .probe = zorro_device_probe, |
| 145 | .remove = zorro_device_remove, | 169 | .remove = zorro_device_remove, |
| 146 | }; | 170 | }; |
diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c index 1d2a772ea14c..eb924e0a64ce 100644 --- a/drivers/zorro/zorro-sysfs.c +++ b/drivers/zorro/zorro-sysfs.c | |||
| @@ -77,6 +77,16 @@ static struct bin_attribute zorro_config_attr = { | |||
| 77 | .read = zorro_read_config, | 77 | .read = zorro_read_config, |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | ||
| 81 | char *buf) | ||
| 82 | { | ||
| 83 | struct zorro_dev *z = to_zorro_dev(dev); | ||
| 84 | |||
| 85 | return sprintf(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id); | ||
| 86 | } | ||
| 87 | |||
| 88 | static DEVICE_ATTR(modalias, S_IRUGO, modalias_show, NULL); | ||
| 89 | |||
| 80 | int zorro_create_sysfs_dev_files(struct zorro_dev *z) | 90 | int zorro_create_sysfs_dev_files(struct zorro_dev *z) |
| 81 | { | 91 | { |
| 82 | struct device *dev = &z->dev; | 92 | struct device *dev = &z->dev; |
| @@ -89,6 +99,7 @@ int zorro_create_sysfs_dev_files(struct zorro_dev *z) | |||
| 89 | (error = device_create_file(dev, &dev_attr_slotaddr)) || | 99 | (error = device_create_file(dev, &dev_attr_slotaddr)) || |
| 90 | (error = device_create_file(dev, &dev_attr_slotsize)) || | 100 | (error = device_create_file(dev, &dev_attr_slotsize)) || |
| 91 | (error = device_create_file(dev, &dev_attr_resource)) || | 101 | (error = device_create_file(dev, &dev_attr_resource)) || |
| 102 | (error = device_create_file(dev, &dev_attr_modalias)) || | ||
| 92 | (error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr))) | 103 | (error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr))) |
| 93 | return error; | 104 | return error; |
| 94 | 105 | ||
diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c index d45fb34e2d23..6455f3a244c5 100644 --- a/drivers/zorro/zorro.c +++ b/drivers/zorro/zorro.c | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/zorro.h> | 15 | #include <linux/zorro.h> |
| 16 | #include <linux/bitops.h> | 16 | #include <linux/bitops.h> |
| 17 | #include <linux/string.h> | 17 | #include <linux/string.h> |
| 18 | #include <linux/platform_device.h> | ||
| 19 | #include <linux/slab.h> | ||
| 18 | 20 | ||
| 19 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
| 20 | #include <asm/amigahw.h> | 22 | #include <asm/amigahw.h> |
| @@ -26,24 +28,17 @@ | |||
| 26 | * Zorro Expansion Devices | 28 | * Zorro Expansion Devices |
| 27 | */ | 29 | */ |
| 28 | 30 | ||
| 29 | u_int zorro_num_autocon = 0; | 31 | unsigned int zorro_num_autocon; |
| 30 | struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO]; | 32 | struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO]; |
| 31 | 33 | ||
| 32 | 34 | ||
| 33 | /* | 35 | /* |
| 34 | * Single Zorro bus | 36 | * Zorro bus |
| 35 | */ | 37 | */ |
| 36 | 38 | ||
| 37 | struct zorro_bus zorro_bus = {\ | 39 | struct zorro_bus { |
| 38 | .resources = { | 40 | struct list_head devices; /* list of devices on this bus */ |
| 39 | /* Zorro II regions (on Zorro II/III) */ | 41 | struct device dev; |
| 40 | { .name = "Zorro II exp", .start = 0x00e80000, .end = 0x00efffff }, | ||
| 41 | { .name = "Zorro II mem", .start = 0x00200000, .end = 0x009fffff }, | ||
| 42 | /* Zorro III regions (on Zorro III only) */ | ||
| 43 | { .name = "Zorro III exp", .start = 0xff000000, .end = 0xffffffff }, | ||
| 44 | { .name = "Zorro III cfg", .start = 0x40000000, .end = 0x7fffffff } | ||
| 45 | }, | ||
| 46 | .name = "Zorro bus" | ||
| 47 | }; | 42 | }; |
| 48 | 43 | ||
| 49 | 44 | ||
| @@ -53,18 +48,19 @@ struct zorro_bus zorro_bus = {\ | |||
| 53 | 48 | ||
| 54 | struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) | 49 | struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) |
| 55 | { | 50 | { |
| 56 | struct zorro_dev *z; | 51 | struct zorro_dev *z; |
| 57 | 52 | ||
| 58 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) | 53 | if (!zorro_num_autocon) |
| 59 | return NULL; | 54 | return NULL; |
| 60 | 55 | ||
| 61 | for (z = from ? from+1 : &zorro_autocon[0]; | 56 | for (z = from ? from+1 : &zorro_autocon[0]; |
| 62 | z < zorro_autocon+zorro_num_autocon; | 57 | z < zorro_autocon+zorro_num_autocon; |
| 63 | z++) | 58 | z++) |
| 64 | if (id == ZORRO_WILDCARD || id == z->id) | 59 | if (id == ZORRO_WILDCARD || id == z->id) |
| 65 | return z; | 60 | return z; |
| 66 | return NULL; | 61 | return NULL; |
| 67 | } | 62 | } |
| 63 | EXPORT_SYMBOL(zorro_find_device); | ||
| 68 | 64 | ||
| 69 | 65 | ||
| 70 | /* | 66 | /* |
| @@ -83,121 +79,138 @@ struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) | |||
| 83 | */ | 79 | */ |
| 84 | 80 | ||
| 85 | DECLARE_BITMAP(zorro_unused_z2ram, 128); | 81 | DECLARE_BITMAP(zorro_unused_z2ram, 128); |
| 82 | EXPORT_SYMBOL(zorro_unused_z2ram); | ||
| 86 | 83 | ||
| 87 | 84 | ||
| 88 | static void __init mark_region(unsigned long start, unsigned long end, | 85 | static void __init mark_region(unsigned long start, unsigned long end, |
| 89 | int flag) | 86 | int flag) |
| 90 | { | 87 | { |
| 91 | if (flag) | ||
| 92 | start += Z2RAM_CHUNKMASK; | ||
| 93 | else | ||
| 94 | end += Z2RAM_CHUNKMASK; | ||
| 95 | start &= ~Z2RAM_CHUNKMASK; | ||
| 96 | end &= ~Z2RAM_CHUNKMASK; | ||
| 97 | |||
| 98 | if (end <= Z2RAM_START || start >= Z2RAM_END) | ||
| 99 | return; | ||
| 100 | start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; | ||
| 101 | end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; | ||
| 102 | while (start < end) { | ||
| 103 | u32 chunk = start>>Z2RAM_CHUNKSHIFT; | ||
| 104 | if (flag) | 88 | if (flag) |
| 105 | set_bit(chunk, zorro_unused_z2ram); | 89 | start += Z2RAM_CHUNKMASK; |
| 106 | else | 90 | else |
| 107 | clear_bit(chunk, zorro_unused_z2ram); | 91 | end += Z2RAM_CHUNKMASK; |
| 108 | start += Z2RAM_CHUNKSIZE; | 92 | start &= ~Z2RAM_CHUNKMASK; |
| 109 | } | 93 | end &= ~Z2RAM_CHUNKMASK; |
| 94 | |||
| 95 | if (end <= Z2RAM_START || start >= Z2RAM_END) | ||
| 96 | return; | ||
| 97 | start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; | ||
| 98 | end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; | ||
| 99 | while (start < end) { | ||
| 100 | u32 chunk = start>>Z2RAM_CHUNKSHIFT; | ||
| 101 | if (flag) | ||
| 102 | set_bit(chunk, zorro_unused_z2ram); | ||
| 103 | else | ||
| 104 | clear_bit(chunk, zorro_unused_z2ram); | ||
| 105 | start += Z2RAM_CHUNKSIZE; | ||
| 106 | } | ||
| 110 | } | 107 | } |
| 111 | 108 | ||
| 112 | 109 | ||
| 113 | static struct resource __init *zorro_find_parent_resource(struct zorro_dev *z) | 110 | static struct resource __init *zorro_find_parent_resource( |
| 111 | struct platform_device *bridge, struct zorro_dev *z) | ||
| 114 | { | 112 | { |
| 115 | int i; | 113 | int i; |
| 116 | 114 | ||
| 117 | for (i = 0; i < zorro_bus.num_resources; i++) | 115 | for (i = 0; i < bridge->num_resources; i++) { |
| 118 | if (zorro_resource_start(z) >= zorro_bus.resources[i].start && | 116 | struct resource *r = &bridge->resource[i]; |
| 119 | zorro_resource_end(z) <= zorro_bus.resources[i].end) | 117 | if (zorro_resource_start(z) >= r->start && |
| 120 | return &zorro_bus.resources[i]; | 118 | zorro_resource_end(z) <= r->end) |
| 121 | return &iomem_resource; | 119 | return r; |
| 120 | } | ||
| 121 | return &iomem_resource; | ||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | 124 | ||
| 125 | /* | ||
| 126 | * Initialization | ||
| 127 | */ | ||
| 128 | 125 | ||
| 129 | static int __init zorro_init(void) | 126 | static int __init amiga_zorro_probe(struct platform_device *pdev) |
| 130 | { | 127 | { |
| 131 | struct zorro_dev *z; | 128 | struct zorro_bus *bus; |
| 132 | unsigned int i; | 129 | struct zorro_dev *z; |
| 133 | int error; | 130 | struct resource *r; |
| 134 | 131 | unsigned int i; | |
| 135 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) | 132 | int error; |
| 136 | return 0; | 133 | |
| 137 | 134 | /* Initialize the Zorro bus */ | |
| 138 | pr_info("Zorro: Probing AutoConfig expansion devices: %d device%s\n", | 135 | bus = kzalloc(sizeof(*bus), GFP_KERNEL); |
| 139 | zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); | 136 | if (!bus) |
| 140 | 137 | return -ENOMEM; | |
| 141 | /* Initialize the Zorro bus */ | 138 | |
| 142 | INIT_LIST_HEAD(&zorro_bus.devices); | 139 | INIT_LIST_HEAD(&bus->devices); |
| 143 | dev_set_name(&zorro_bus.dev, "zorro"); | 140 | bus->dev.parent = &pdev->dev; |
| 144 | error = device_register(&zorro_bus.dev); | 141 | dev_set_name(&bus->dev, "zorro"); |
| 145 | if (error) { | 142 | error = device_register(&bus->dev); |
| 146 | pr_err("Zorro: Error registering zorro_bus\n"); | ||
| 147 | return error; | ||
| 148 | } | ||
| 149 | |||
| 150 | /* Request the resources */ | ||
| 151 | zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; | ||
| 152 | for (i = 0; i < zorro_bus.num_resources; i++) | ||
| 153 | request_resource(&iomem_resource, &zorro_bus.resources[i]); | ||
| 154 | |||
| 155 | /* Register all devices */ | ||
| 156 | for (i = 0; i < zorro_num_autocon; i++) { | ||
| 157 | z = &zorro_autocon[i]; | ||
| 158 | z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); | ||
| 159 | if (z->id == ZORRO_PROD_GVP_EPC_BASE) { | ||
| 160 | /* GVP quirk */ | ||
| 161 | unsigned long magic = zorro_resource_start(z)+0x8000; | ||
| 162 | z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; | ||
| 163 | } | ||
| 164 | sprintf(z->name, "Zorro device %08x", z->id); | ||
| 165 | zorro_name_device(z); | ||
| 166 | z->resource.name = z->name; | ||
| 167 | if (request_resource(zorro_find_parent_resource(z), &z->resource)) | ||
| 168 | pr_err("Zorro: Address space collision on device %s %pR\n", | ||
| 169 | z->name, &z->resource); | ||
| 170 | dev_set_name(&z->dev, "%02x", i); | ||
| 171 | z->dev.parent = &zorro_bus.dev; | ||
| 172 | z->dev.bus = &zorro_bus_type; | ||
| 173 | error = device_register(&z->dev); | ||
| 174 | if (error) { | 143 | if (error) { |
| 175 | pr_err("Zorro: Error registering device %s\n", z->name); | 144 | pr_err("Zorro: Error registering zorro_bus\n"); |
| 176 | continue; | 145 | kfree(bus); |
| 146 | return error; | ||
| 177 | } | 147 | } |
| 178 | error = zorro_create_sysfs_dev_files(z); | 148 | platform_set_drvdata(pdev, bus); |
| 179 | if (error) | 149 | |
| 180 | dev_err(&z->dev, "Error creating sysfs files\n"); | 150 | /* Register all devices */ |
| 181 | } | 151 | pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n", |
| 182 | 152 | zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); | |
| 183 | /* Mark all available Zorro II memory */ | 153 | |
| 184 | zorro_for_each_dev(z) { | 154 | for (i = 0; i < zorro_num_autocon; i++) { |
| 185 | if (z->rom.er_Type & ERTF_MEMLIST) | 155 | z = &zorro_autocon[i]; |
| 186 | mark_region(zorro_resource_start(z), zorro_resource_end(z)+1, 1); | 156 | z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); |
| 187 | } | 157 | if (z->id == ZORRO_PROD_GVP_EPC_BASE) { |
| 188 | 158 | /* GVP quirk */ | |
| 189 | /* Unmark all used Zorro II memory */ | 159 | unsigned long magic = zorro_resource_start(z)+0x8000; |
| 190 | for (i = 0; i < m68k_num_memory; i++) | 160 | z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; |
| 191 | if (m68k_memory[i].addr < 16*1024*1024) | 161 | } |
| 192 | mark_region(m68k_memory[i].addr, | 162 | sprintf(z->name, "Zorro device %08x", z->id); |
| 193 | m68k_memory[i].addr+m68k_memory[i].size, 0); | 163 | zorro_name_device(z); |
| 194 | 164 | z->resource.name = z->name; | |
| 195 | return 0; | 165 | r = zorro_find_parent_resource(pdev, z); |
| 166 | error = request_resource(r, &z->resource); | ||
| 167 | if (error) | ||
| 168 | dev_err(&bus->dev, | ||
| 169 | "Address space collision on device %s %pR\n", | ||
| 170 | z->name, &z->resource); | ||
| 171 | dev_set_name(&z->dev, "%02x", i); | ||
| 172 | z->dev.parent = &bus->dev; | ||
| 173 | z->dev.bus = &zorro_bus_type; | ||
| 174 | error = device_register(&z->dev); | ||
| 175 | if (error) { | ||
| 176 | dev_err(&bus->dev, "Error registering device %s\n", | ||
| 177 | z->name); | ||
| 178 | continue; | ||
| 179 | } | ||
| 180 | error = zorro_create_sysfs_dev_files(z); | ||
| 181 | if (error) | ||
| 182 | dev_err(&z->dev, "Error creating sysfs files\n"); | ||
| 183 | } | ||
| 184 | |||
| 185 | /* Mark all available Zorro II memory */ | ||
| 186 | zorro_for_each_dev(z) { | ||
| 187 | if (z->rom.er_Type & ERTF_MEMLIST) | ||
| 188 | mark_region(zorro_resource_start(z), | ||
| 189 | zorro_resource_end(z)+1, 1); | ||
| 190 | } | ||
| 191 | |||
| 192 | /* Unmark all used Zorro II memory */ | ||
| 193 | for (i = 0; i < m68k_num_memory; i++) | ||
| 194 | if (m68k_memory[i].addr < 16*1024*1024) | ||
| 195 | mark_region(m68k_memory[i].addr, | ||
| 196 | m68k_memory[i].addr+m68k_memory[i].size, | ||
| 197 | 0); | ||
| 198 | |||
| 199 | return 0; | ||
| 196 | } | 200 | } |
| 197 | 201 | ||
| 198 | subsys_initcall(zorro_init); | 202 | static struct platform_driver amiga_zorro_driver = { |
| 203 | .driver = { | ||
| 204 | .name = "amiga-zorro", | ||
| 205 | .owner = THIS_MODULE, | ||
| 206 | }, | ||
| 207 | }; | ||
| 199 | 208 | ||
| 200 | EXPORT_SYMBOL(zorro_find_device); | 209 | static int __init amiga_zorro_init(void) |
| 201 | EXPORT_SYMBOL(zorro_unused_z2ram); | 210 | { |
| 211 | return platform_driver_probe(&amiga_zorro_driver, amiga_zorro_probe); | ||
| 212 | } | ||
| 213 | |||
| 214 | module_init(amiga_zorro_init); | ||
| 202 | 215 | ||
| 203 | MODULE_LICENSE("GPL"); | 216 | MODULE_LICENSE("GPL"); |
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 109a6c606d92..e8e5e63ac950 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
| @@ -177,8 +177,7 @@ static int try_to_fill_dentry(struct dentry *dentry, int flags) | |||
| 177 | } | 177 | } |
| 178 | /* Trigger mount for path component or follow link */ | 178 | /* Trigger mount for path component or follow link */ |
| 179 | } else if (ino->flags & AUTOFS_INF_PENDING || | 179 | } else if (ino->flags & AUTOFS_INF_PENDING || |
| 180 | autofs4_need_mount(flags) || | 180 | autofs4_need_mount(flags)) { |
| 181 | current->link_count) { | ||
| 182 | DPRINTK("waiting for mount name=%.*s", | 181 | DPRINTK("waiting for mount name=%.*s", |
| 183 | dentry->d_name.len, dentry->d_name.name); | 182 | dentry->d_name.len, dentry->d_name.name); |
| 184 | 183 | ||
| @@ -262,7 +261,7 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
| 262 | spin_unlock(&dcache_lock); | 261 | spin_unlock(&dcache_lock); |
| 263 | spin_unlock(&sbi->fs_lock); | 262 | spin_unlock(&sbi->fs_lock); |
| 264 | 263 | ||
| 265 | status = try_to_fill_dentry(dentry, 0); | 264 | status = try_to_fill_dentry(dentry, nd->flags); |
| 266 | if (status) | 265 | if (status) |
| 267 | goto out_error; | 266 | goto out_error; |
| 268 | 267 | ||
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e84ef60ffe35..97a97839a867 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -1481,12 +1481,17 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 1481 | ret = -EBADF; | 1481 | ret = -EBADF; |
| 1482 | goto out_drop_write; | 1482 | goto out_drop_write; |
| 1483 | } | 1483 | } |
| 1484 | |||
| 1484 | src = src_file->f_dentry->d_inode; | 1485 | src = src_file->f_dentry->d_inode; |
| 1485 | 1486 | ||
| 1486 | ret = -EINVAL; | 1487 | ret = -EINVAL; |
| 1487 | if (src == inode) | 1488 | if (src == inode) |
| 1488 | goto out_fput; | 1489 | goto out_fput; |
| 1489 | 1490 | ||
| 1491 | /* the src must be open for reading */ | ||
| 1492 | if (!(src_file->f_mode & FMODE_READ)) | ||
| 1493 | goto out_fput; | ||
| 1494 | |||
| 1490 | ret = -EISDIR; | 1495 | ret = -EISDIR; |
| 1491 | if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode)) | 1496 | if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode)) |
| 1492 | goto out_fput; | 1497 | goto out_fput; |
diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h index f7c255f9c624..a8cd821226da 100644 --- a/fs/cachefiles/internal.h +++ b/fs/cachefiles/internal.h | |||
| @@ -34,6 +34,7 @@ struct cachefiles_object { | |||
| 34 | loff_t i_size; /* object size */ | 34 | loff_t i_size; /* object size */ |
| 35 | unsigned long flags; | 35 | unsigned long flags; |
| 36 | #define CACHEFILES_OBJECT_ACTIVE 0 /* T if marked active */ | 36 | #define CACHEFILES_OBJECT_ACTIVE 0 /* T if marked active */ |
| 37 | #define CACHEFILES_OBJECT_BURIED 1 /* T if preemptively buried */ | ||
| 37 | atomic_t usage; /* object usage count */ | 38 | atomic_t usage; /* object usage count */ |
| 38 | uint8_t type; /* object type */ | 39 | uint8_t type; /* object type */ |
| 39 | uint8_t new; /* T if object new */ | 40 | uint8_t new; /* T if object new */ |
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c index d5db84a1ee0d..f4a7840bf42c 100644 --- a/fs/cachefiles/namei.c +++ b/fs/cachefiles/namei.c | |||
| @@ -93,6 +93,59 @@ static noinline void cachefiles_printk_object(struct cachefiles_object *object, | |||
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | /* | 95 | /* |
| 96 | * mark the owner of a dentry, if there is one, to indicate that that dentry | ||
| 97 | * has been preemptively deleted | ||
| 98 | * - the caller must hold the i_mutex on the dentry's parent as required to | ||
| 99 | * call vfs_unlink(), vfs_rmdir() or vfs_rename() | ||
| 100 | */ | ||
| 101 | static void cachefiles_mark_object_buried(struct cachefiles_cache *cache, | ||
| 102 | struct dentry *dentry) | ||
| 103 | { | ||
| 104 | struct cachefiles_object *object; | ||
| 105 | struct rb_node *p; | ||
| 106 | |||
| 107 | _enter(",'%*.*s'", | ||
| 108 | dentry->d_name.len, dentry->d_name.len, dentry->d_name.name); | ||
| 109 | |||
| 110 | write_lock(&cache->active_lock); | ||
| 111 | |||
| 112 | p = cache->active_nodes.rb_node; | ||
| 113 | while (p) { | ||
| 114 | object = rb_entry(p, struct cachefiles_object, active_node); | ||
| 115 | if (object->dentry > dentry) | ||
| 116 | p = p->rb_left; | ||
| 117 | else if (object->dentry < dentry) | ||
| 118 | p = p->rb_right; | ||
| 119 | else | ||
| 120 | goto found_dentry; | ||
| 121 | } | ||
| 122 | |||
| 123 | write_unlock(&cache->active_lock); | ||
| 124 | _leave(" [no owner]"); | ||
| 125 | return; | ||
| 126 | |||
| 127 | /* found the dentry for */ | ||
| 128 | found_dentry: | ||
| 129 | kdebug("preemptive burial: OBJ%x [%s] %p", | ||
| 130 | object->fscache.debug_id, | ||
| 131 | fscache_object_states[object->fscache.state], | ||
| 132 | dentry); | ||
| 133 | |||
| 134 | if (object->fscache.state < FSCACHE_OBJECT_DYING) { | ||
| 135 | printk(KERN_ERR "\n"); | ||
| 136 | printk(KERN_ERR "CacheFiles: Error:" | ||
| 137 | " Can't preemptively bury live object\n"); | ||
| 138 | cachefiles_printk_object(object, NULL); | ||
| 139 | } else if (test_and_set_bit(CACHEFILES_OBJECT_BURIED, &object->flags)) { | ||
| 140 | printk(KERN_ERR "CacheFiles: Error:" | ||
| 141 | " Object already preemptively buried\n"); | ||
| 142 | } | ||
| 143 | |||
| 144 | write_unlock(&cache->active_lock); | ||
| 145 | _leave(" [owner marked]"); | ||
| 146 | } | ||
| 147 | |||
| 148 | /* | ||
| 96 | * record the fact that an object is now active | 149 | * record the fact that an object is now active |
| 97 | */ | 150 | */ |
| 98 | static int cachefiles_mark_object_active(struct cachefiles_cache *cache, | 151 | static int cachefiles_mark_object_active(struct cachefiles_cache *cache, |
| @@ -219,7 +272,8 @@ requeue: | |||
| 219 | */ | 272 | */ |
| 220 | static int cachefiles_bury_object(struct cachefiles_cache *cache, | 273 | static int cachefiles_bury_object(struct cachefiles_cache *cache, |
| 221 | struct dentry *dir, | 274 | struct dentry *dir, |
| 222 | struct dentry *rep) | 275 | struct dentry *rep, |
| 276 | bool preemptive) | ||
| 223 | { | 277 | { |
| 224 | struct dentry *grave, *trap; | 278 | struct dentry *grave, *trap; |
| 225 | char nbuffer[8 + 8 + 1]; | 279 | char nbuffer[8 + 8 + 1]; |
| @@ -229,11 +283,16 @@ static int cachefiles_bury_object(struct cachefiles_cache *cache, | |||
| 229 | dir->d_name.len, dir->d_name.len, dir->d_name.name, | 283 | dir->d_name.len, dir->d_name.len, dir->d_name.name, |
| 230 | rep->d_name.len, rep->d_name.len, rep->d_name.name); | 284 | rep->d_name.len, rep->d_name.len, rep->d_name.name); |
| 231 | 285 | ||
| 286 | _debug("remove %p from %p", rep, dir); | ||
| 287 | |||
| 232 | /* non-directories can just be unlinked */ | 288 | /* non-directories can just be unlinked */ |
| 233 | if (!S_ISDIR(rep->d_inode->i_mode)) { | 289 | if (!S_ISDIR(rep->d_inode->i_mode)) { |
| 234 | _debug("unlink stale object"); | 290 | _debug("unlink stale object"); |
| 235 | ret = vfs_unlink(dir->d_inode, rep); | 291 | ret = vfs_unlink(dir->d_inode, rep); |
| 236 | 292 | ||
| 293 | if (preemptive) | ||
| 294 | cachefiles_mark_object_buried(cache, rep); | ||
| 295 | |||
| 237 | mutex_unlock(&dir->d_inode->i_mutex); | 296 | mutex_unlock(&dir->d_inode->i_mutex); |
| 238 | 297 | ||
| 239 | if (ret == -EIO) | 298 | if (ret == -EIO) |
| @@ -325,6 +384,9 @@ try_again: | |||
| 325 | if (ret != 0 && ret != -ENOMEM) | 384 | if (ret != 0 && ret != -ENOMEM) |
| 326 | cachefiles_io_error(cache, "Rename failed with error %d", ret); | 385 | cachefiles_io_error(cache, "Rename failed with error %d", ret); |
| 327 | 386 | ||
| 387 | if (preemptive) | ||
| 388 | cachefiles_mark_object_buried(cache, rep); | ||
| 389 | |||
| 328 | unlock_rename(cache->graveyard, dir); | 390 | unlock_rename(cache->graveyard, dir); |
| 329 | dput(grave); | 391 | dput(grave); |
| 330 | _leave(" = 0"); | 392 | _leave(" = 0"); |
| @@ -340,7 +402,7 @@ int cachefiles_delete_object(struct cachefiles_cache *cache, | |||
| 340 | struct dentry *dir; | 402 | struct dentry *dir; |
| 341 | int ret; | 403 | int ret; |
| 342 | 404 | ||
| 343 | _enter(",{%p}", object->dentry); | 405 | _enter(",OBJ%x{%p}", object->fscache.debug_id, object->dentry); |
| 344 | 406 | ||
| 345 | ASSERT(object->dentry); | 407 | ASSERT(object->dentry); |
| 346 | ASSERT(object->dentry->d_inode); | 408 | ASSERT(object->dentry->d_inode); |
| @@ -350,15 +412,25 @@ int cachefiles_delete_object(struct cachefiles_cache *cache, | |||
| 350 | 412 | ||
| 351 | mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); | 413 | mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); |
| 352 | 414 | ||
| 353 | /* we need to check that our parent is _still_ our parent - it may have | 415 | if (test_bit(CACHEFILES_OBJECT_BURIED, &object->flags)) { |
| 354 | * been renamed */ | 416 | /* object allocation for the same key preemptively deleted this |
| 355 | if (dir == object->dentry->d_parent) { | 417 | * object's file so that it could create its own file */ |
| 356 | ret = cachefiles_bury_object(cache, dir, object->dentry); | 418 | _debug("object preemptively buried"); |
| 357 | } else { | ||
| 358 | /* it got moved, presumably by cachefilesd culling it, so it's | ||
| 359 | * no longer in the key path and we can ignore it */ | ||
| 360 | mutex_unlock(&dir->d_inode->i_mutex); | 419 | mutex_unlock(&dir->d_inode->i_mutex); |
| 361 | ret = 0; | 420 | ret = 0; |
| 421 | } else { | ||
| 422 | /* we need to check that our parent is _still_ our parent - it | ||
| 423 | * may have been renamed */ | ||
| 424 | if (dir == object->dentry->d_parent) { | ||
| 425 | ret = cachefiles_bury_object(cache, dir, | ||
| 426 | object->dentry, false); | ||
| 427 | } else { | ||
| 428 | /* it got moved, presumably by cachefilesd culling it, | ||
| 429 | * so it's no longer in the key path and we can ignore | ||
| 430 | * it */ | ||
| 431 | mutex_unlock(&dir->d_inode->i_mutex); | ||
| 432 | ret = 0; | ||
| 433 | } | ||
| 362 | } | 434 | } |
| 363 | 435 | ||
| 364 | dput(dir); | 436 | dput(dir); |
| @@ -381,7 +453,9 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent, | |||
| 381 | const char *name; | 453 | const char *name; |
| 382 | int ret, nlen; | 454 | int ret, nlen; |
| 383 | 455 | ||
| 384 | _enter("{%p},,%s,", parent->dentry, key); | 456 | _enter("OBJ%x{%p},OBJ%x,%s,", |
| 457 | parent->fscache.debug_id, parent->dentry, | ||
| 458 | object->fscache.debug_id, key); | ||
| 385 | 459 | ||
| 386 | cache = container_of(parent->fscache.cache, | 460 | cache = container_of(parent->fscache.cache, |
| 387 | struct cachefiles_cache, cache); | 461 | struct cachefiles_cache, cache); |
| @@ -509,7 +583,7 @@ lookup_again: | |||
| 509 | * mutex) */ | 583 | * mutex) */ |
| 510 | object->dentry = NULL; | 584 | object->dentry = NULL; |
| 511 | 585 | ||
| 512 | ret = cachefiles_bury_object(cache, dir, next); | 586 | ret = cachefiles_bury_object(cache, dir, next, true); |
| 513 | dput(next); | 587 | dput(next); |
| 514 | next = NULL; | 588 | next = NULL; |
| 515 | 589 | ||
| @@ -828,7 +902,7 @@ int cachefiles_cull(struct cachefiles_cache *cache, struct dentry *dir, | |||
| 828 | /* actually remove the victim (drops the dir mutex) */ | 902 | /* actually remove the victim (drops the dir mutex) */ |
| 829 | _debug("bury"); | 903 | _debug("bury"); |
| 830 | 904 | ||
| 831 | ret = cachefiles_bury_object(cache, dir, victim); | 905 | ret = cachefiles_bury_object(cache, dir, victim, false); |
| 832 | if (ret < 0) | 906 | if (ret < 0) |
| 833 | goto error; | 907 | goto error; |
| 834 | 908 | ||
diff --git a/fs/cachefiles/security.c b/fs/cachefiles/security.c index b5808cdb2232..039b5011d83b 100644 --- a/fs/cachefiles/security.c +++ b/fs/cachefiles/security.c | |||
| @@ -77,6 +77,8 @@ static int cachefiles_check_cache_dir(struct cachefiles_cache *cache, | |||
| 77 | /* | 77 | /* |
| 78 | * check the security details of the on-disk cache | 78 | * check the security details of the on-disk cache |
| 79 | * - must be called with security override in force | 79 | * - must be called with security override in force |
| 80 | * - must return with a security override in force - even in the case of an | ||
| 81 | * error | ||
| 80 | */ | 82 | */ |
| 81 | int cachefiles_determine_cache_security(struct cachefiles_cache *cache, | 83 | int cachefiles_determine_cache_security(struct cachefiles_cache *cache, |
| 82 | struct dentry *root, | 84 | struct dentry *root, |
| @@ -99,6 +101,8 @@ int cachefiles_determine_cache_security(struct cachefiles_cache *cache, | |||
| 99 | * which create files */ | 101 | * which create files */ |
| 100 | ret = set_create_files_as(new, root->d_inode); | 102 | ret = set_create_files_as(new, root->d_inode); |
| 101 | if (ret < 0) { | 103 | if (ret < 0) { |
| 104 | abort_creds(new); | ||
| 105 | cachefiles_begin_secure(cache, _saved_cred); | ||
| 102 | _leave(" = %d [cfa]", ret); | 106 | _leave(" = %d [cfa]", ret); |
| 103 | return ret; | 107 | return ret; |
| 104 | } | 108 | } |
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 4b42c2bb603f..a9005d862ed4 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c | |||
| @@ -504,7 +504,6 @@ static void writepages_finish(struct ceph_osd_request *req, | |||
| 504 | int i; | 504 | int i; |
| 505 | struct ceph_snap_context *snapc = req->r_snapc; | 505 | struct ceph_snap_context *snapc = req->r_snapc; |
| 506 | struct address_space *mapping = inode->i_mapping; | 506 | struct address_space *mapping = inode->i_mapping; |
| 507 | struct writeback_control *wbc = req->r_wbc; | ||
| 508 | __s32 rc = -EIO; | 507 | __s32 rc = -EIO; |
| 509 | u64 bytes = 0; | 508 | u64 bytes = 0; |
| 510 | struct ceph_client *client = ceph_inode_to_client(inode); | 509 | struct ceph_client *client = ceph_inode_to_client(inode); |
| @@ -546,10 +545,6 @@ static void writepages_finish(struct ceph_osd_request *req, | |||
| 546 | clear_bdi_congested(&client->backing_dev_info, | 545 | clear_bdi_congested(&client->backing_dev_info, |
| 547 | BLK_RW_ASYNC); | 546 | BLK_RW_ASYNC); |
| 548 | 547 | ||
| 549 | if (i >= wrote) { | ||
| 550 | dout("inode %p skipping page %p\n", inode, page); | ||
| 551 | wbc->pages_skipped++; | ||
| 552 | } | ||
| 553 | ceph_put_snap_context((void *)page->private); | 548 | ceph_put_snap_context((void *)page->private); |
| 554 | page->private = 0; | 549 | page->private = 0; |
| 555 | ClearPagePrivate(page); | 550 | ClearPagePrivate(page); |
| @@ -799,7 +794,6 @@ get_more_pages: | |||
| 799 | alloc_page_vec(client, req); | 794 | alloc_page_vec(client, req); |
| 800 | req->r_callback = writepages_finish; | 795 | req->r_callback = writepages_finish; |
| 801 | req->r_inode = inode; | 796 | req->r_inode = inode; |
| 802 | req->r_wbc = wbc; | ||
| 803 | } | 797 | } |
| 804 | 798 | ||
| 805 | /* note position of first page in pvec */ | 799 | /* note position of first page in pvec */ |
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 0c1681806867..d9400534b279 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -858,6 +858,8 @@ static int __ceph_is_any_caps(struct ceph_inode_info *ci) | |||
| 858 | } | 858 | } |
| 859 | 859 | ||
| 860 | /* | 860 | /* |
| 861 | * Remove a cap. Take steps to deal with a racing iterate_session_caps. | ||
| 862 | * | ||
| 861 | * caller should hold i_lock. | 863 | * caller should hold i_lock. |
| 862 | * caller will not hold session s_mutex if called from destroy_inode. | 864 | * caller will not hold session s_mutex if called from destroy_inode. |
| 863 | */ | 865 | */ |
| @@ -866,15 +868,10 @@ void __ceph_remove_cap(struct ceph_cap *cap) | |||
| 866 | struct ceph_mds_session *session = cap->session; | 868 | struct ceph_mds_session *session = cap->session; |
| 867 | struct ceph_inode_info *ci = cap->ci; | 869 | struct ceph_inode_info *ci = cap->ci; |
| 868 | struct ceph_mds_client *mdsc = &ceph_client(ci->vfs_inode.i_sb)->mdsc; | 870 | struct ceph_mds_client *mdsc = &ceph_client(ci->vfs_inode.i_sb)->mdsc; |
| 871 | int removed = 0; | ||
| 869 | 872 | ||
| 870 | dout("__ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode); | 873 | dout("__ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode); |
| 871 | 874 | ||
| 872 | /* remove from inode list */ | ||
| 873 | rb_erase(&cap->ci_node, &ci->i_caps); | ||
| 874 | cap->ci = NULL; | ||
| 875 | if (ci->i_auth_cap == cap) | ||
| 876 | ci->i_auth_cap = NULL; | ||
| 877 | |||
| 878 | /* remove from session list */ | 875 | /* remove from session list */ |
| 879 | spin_lock(&session->s_cap_lock); | 876 | spin_lock(&session->s_cap_lock); |
| 880 | if (session->s_cap_iterator == cap) { | 877 | if (session->s_cap_iterator == cap) { |
| @@ -885,10 +882,18 @@ void __ceph_remove_cap(struct ceph_cap *cap) | |||
| 885 | list_del_init(&cap->session_caps); | 882 | list_del_init(&cap->session_caps); |
| 886 | session->s_nr_caps--; | 883 | session->s_nr_caps--; |
| 887 | cap->session = NULL; | 884 | cap->session = NULL; |
| 885 | removed = 1; | ||
| 888 | } | 886 | } |
| 887 | /* protect backpointer with s_cap_lock: see iterate_session_caps */ | ||
| 888 | cap->ci = NULL; | ||
| 889 | spin_unlock(&session->s_cap_lock); | 889 | spin_unlock(&session->s_cap_lock); |
| 890 | 890 | ||
| 891 | if (cap->session == NULL) | 891 | /* remove from inode list */ |
| 892 | rb_erase(&cap->ci_node, &ci->i_caps); | ||
| 893 | if (ci->i_auth_cap == cap) | ||
| 894 | ci->i_auth_cap = NULL; | ||
| 895 | |||
| 896 | if (removed) | ||
| 892 | ceph_put_cap(cap); | 897 | ceph_put_cap(cap); |
| 893 | 898 | ||
| 894 | if (!__ceph_is_any_caps(ci) && ci->i_snap_realm) { | 899 | if (!__ceph_is_any_caps(ci) && ci->i_snap_realm) { |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 261f3e6c0bcf..85b4d2ffdeba 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -733,6 +733,10 @@ no_change: | |||
| 733 | __ceph_get_fmode(ci, cap_fmode); | 733 | __ceph_get_fmode(ci, cap_fmode); |
| 734 | spin_unlock(&inode->i_lock); | 734 | spin_unlock(&inode->i_lock); |
| 735 | } | 735 | } |
| 736 | } else if (cap_fmode >= 0) { | ||
| 737 | pr_warning("mds issued no caps on %llx.%llx\n", | ||
| 738 | ceph_vinop(inode)); | ||
| 739 | __ceph_get_fmode(ci, cap_fmode); | ||
| 736 | } | 740 | } |
| 737 | 741 | ||
| 738 | /* update delegation info? */ | 742 | /* update delegation info? */ |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 60a9a4ae47be..24561a557e01 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -736,9 +736,10 @@ static void cleanup_cap_releases(struct ceph_mds_session *session) | |||
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | /* | 738 | /* |
| 739 | * Helper to safely iterate over all caps associated with a session. | 739 | * Helper to safely iterate over all caps associated with a session, with |
| 740 | * special care taken to handle a racing __ceph_remove_cap(). | ||
| 740 | * | 741 | * |
| 741 | * caller must hold session s_mutex | 742 | * Caller must hold session s_mutex. |
| 742 | */ | 743 | */ |
| 743 | static int iterate_session_caps(struct ceph_mds_session *session, | 744 | static int iterate_session_caps(struct ceph_mds_session *session, |
| 744 | int (*cb)(struct inode *, struct ceph_cap *, | 745 | int (*cb)(struct inode *, struct ceph_cap *, |
| @@ -2136,7 +2137,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) | |||
| 2136 | struct ceph_mds_session *session = NULL; | 2137 | struct ceph_mds_session *session = NULL; |
| 2137 | struct ceph_msg *reply; | 2138 | struct ceph_msg *reply; |
| 2138 | struct rb_node *p; | 2139 | struct rb_node *p; |
| 2139 | int err; | 2140 | int err = -ENOMEM; |
| 2140 | struct ceph_pagelist *pagelist; | 2141 | struct ceph_pagelist *pagelist; |
| 2141 | 2142 | ||
| 2142 | pr_info("reconnect to recovering mds%d\n", mds); | 2143 | pr_info("reconnect to recovering mds%d\n", mds); |
| @@ -2185,7 +2186,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) | |||
| 2185 | goto fail; | 2186 | goto fail; |
| 2186 | err = iterate_session_caps(session, encode_caps_cb, pagelist); | 2187 | err = iterate_session_caps(session, encode_caps_cb, pagelist); |
| 2187 | if (err < 0) | 2188 | if (err < 0) |
| 2188 | goto out; | 2189 | goto fail; |
| 2189 | 2190 | ||
| 2190 | /* | 2191 | /* |
| 2191 | * snaprealms. we provide mds with the ino, seq (version), and | 2192 | * snaprealms. we provide mds with the ino, seq (version), and |
| @@ -2213,28 +2214,31 @@ send: | |||
| 2213 | reply->nr_pages = calc_pages_for(0, pagelist->length); | 2214 | reply->nr_pages = calc_pages_for(0, pagelist->length); |
| 2214 | ceph_con_send(&session->s_con, reply); | 2215 | ceph_con_send(&session->s_con, reply); |
| 2215 | 2216 | ||
| 2216 | if (session) { | 2217 | session->s_state = CEPH_MDS_SESSION_OPEN; |
| 2217 | session->s_state = CEPH_MDS_SESSION_OPEN; | 2218 | mutex_unlock(&session->s_mutex); |
| 2218 | __wake_requests(mdsc, &session->s_waiting); | 2219 | |
| 2219 | } | 2220 | mutex_lock(&mdsc->mutex); |
| 2221 | __wake_requests(mdsc, &session->s_waiting); | ||
| 2222 | mutex_unlock(&mdsc->mutex); | ||
| 2223 | |||
| 2224 | ceph_put_mds_session(session); | ||
| 2220 | 2225 | ||
| 2221 | out: | ||
| 2222 | up_read(&mdsc->snap_rwsem); | 2226 | up_read(&mdsc->snap_rwsem); |
| 2223 | if (session) { | ||
| 2224 | mutex_unlock(&session->s_mutex); | ||
| 2225 | ceph_put_mds_session(session); | ||
| 2226 | } | ||
| 2227 | mutex_lock(&mdsc->mutex); | 2227 | mutex_lock(&mdsc->mutex); |
| 2228 | return; | 2228 | return; |
| 2229 | 2229 | ||
| 2230 | fail: | 2230 | fail: |
| 2231 | ceph_msg_put(reply); | 2231 | ceph_msg_put(reply); |
| 2232 | up_read(&mdsc->snap_rwsem); | ||
| 2233 | mutex_unlock(&session->s_mutex); | ||
| 2234 | ceph_put_mds_session(session); | ||
| 2232 | fail_nomsg: | 2235 | fail_nomsg: |
| 2233 | ceph_pagelist_release(pagelist); | 2236 | ceph_pagelist_release(pagelist); |
| 2234 | kfree(pagelist); | 2237 | kfree(pagelist); |
| 2235 | fail_nopagelist: | 2238 | fail_nopagelist: |
| 2236 | pr_err("ENOMEM preparing reconnect for mds%d\n", mds); | 2239 | pr_err("error %d preparing reconnect for mds%d\n", err, mds); |
| 2237 | goto out; | 2240 | mutex_lock(&mdsc->mutex); |
| 2241 | return; | ||
| 2238 | } | 2242 | } |
| 2239 | 2243 | ||
| 2240 | 2244 | ||
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c index 509f57d9ccb3..cd4fadb6491a 100644 --- a/fs/ceph/messenger.c +++ b/fs/ceph/messenger.c | |||
| @@ -492,7 +492,14 @@ static void prepare_write_message(struct ceph_connection *con) | |||
| 492 | list_move_tail(&m->list_head, &con->out_sent); | 492 | list_move_tail(&m->list_head, &con->out_sent); |
| 493 | } | 493 | } |
| 494 | 494 | ||
| 495 | m->hdr.seq = cpu_to_le64(++con->out_seq); | 495 | /* |
| 496 | * only assign outgoing seq # if we haven't sent this message | ||
| 497 | * yet. if it is requeued, resend with it's original seq. | ||
| 498 | */ | ||
| 499 | if (m->needs_out_seq) { | ||
| 500 | m->hdr.seq = cpu_to_le64(++con->out_seq); | ||
| 501 | m->needs_out_seq = false; | ||
| 502 | } | ||
| 496 | 503 | ||
| 497 | dout("prepare_write_message %p seq %lld type %d len %d+%d+%d %d pgs\n", | 504 | dout("prepare_write_message %p seq %lld type %d len %d+%d+%d %d pgs\n", |
| 498 | m, con->out_seq, le16_to_cpu(m->hdr.type), | 505 | m, con->out_seq, le16_to_cpu(m->hdr.type), |
| @@ -1986,6 +1993,8 @@ void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg) | |||
| 1986 | 1993 | ||
| 1987 | BUG_ON(msg->front.iov_len != le32_to_cpu(msg->hdr.front_len)); | 1994 | BUG_ON(msg->front.iov_len != le32_to_cpu(msg->hdr.front_len)); |
| 1988 | 1995 | ||
| 1996 | msg->needs_out_seq = true; | ||
| 1997 | |||
| 1989 | /* queue */ | 1998 | /* queue */ |
| 1990 | mutex_lock(&con->mutex); | 1999 | mutex_lock(&con->mutex); |
| 1991 | BUG_ON(!list_empty(&msg->list_head)); | 2000 | BUG_ON(!list_empty(&msg->list_head)); |
| @@ -2085,15 +2094,19 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, | |||
| 2085 | kref_init(&m->kref); | 2094 | kref_init(&m->kref); |
| 2086 | INIT_LIST_HEAD(&m->list_head); | 2095 | INIT_LIST_HEAD(&m->list_head); |
| 2087 | 2096 | ||
| 2097 | m->hdr.tid = 0; | ||
| 2088 | m->hdr.type = cpu_to_le16(type); | 2098 | m->hdr.type = cpu_to_le16(type); |
| 2099 | m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT); | ||
| 2100 | m->hdr.version = 0; | ||
| 2089 | m->hdr.front_len = cpu_to_le32(front_len); | 2101 | m->hdr.front_len = cpu_to_le32(front_len); |
| 2090 | m->hdr.middle_len = 0; | 2102 | m->hdr.middle_len = 0; |
| 2091 | m->hdr.data_len = cpu_to_le32(page_len); | 2103 | m->hdr.data_len = cpu_to_le32(page_len); |
| 2092 | m->hdr.data_off = cpu_to_le16(page_off); | 2104 | m->hdr.data_off = cpu_to_le16(page_off); |
| 2093 | m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT); | 2105 | m->hdr.reserved = 0; |
| 2094 | m->footer.front_crc = 0; | 2106 | m->footer.front_crc = 0; |
| 2095 | m->footer.middle_crc = 0; | 2107 | m->footer.middle_crc = 0; |
| 2096 | m->footer.data_crc = 0; | 2108 | m->footer.data_crc = 0; |
| 2109 | m->footer.flags = 0; | ||
| 2097 | m->front_max = front_len; | 2110 | m->front_max = front_len; |
| 2098 | m->front_is_vmalloc = false; | 2111 | m->front_is_vmalloc = false; |
| 2099 | m->more_to_follow = false; | 2112 | m->more_to_follow = false; |
diff --git a/fs/ceph/messenger.h b/fs/ceph/messenger.h index a343dae73cdc..a5caf91cc971 100644 --- a/fs/ceph/messenger.h +++ b/fs/ceph/messenger.h | |||
| @@ -86,6 +86,7 @@ struct ceph_msg { | |||
| 86 | struct kref kref; | 86 | struct kref kref; |
| 87 | bool front_is_vmalloc; | 87 | bool front_is_vmalloc; |
| 88 | bool more_to_follow; | 88 | bool more_to_follow; |
| 89 | bool needs_out_seq; | ||
| 89 | int front_max; | 90 | int front_max; |
| 90 | 91 | ||
| 91 | struct ceph_msgpool *pool; | 92 | struct ceph_msgpool *pool; |
diff --git a/fs/ceph/osd_client.c b/fs/ceph/osd_client.c index c7b4dedaace6..3514f71ff85f 100644 --- a/fs/ceph/osd_client.c +++ b/fs/ceph/osd_client.c | |||
| @@ -565,7 +565,8 @@ static int __map_osds(struct ceph_osd_client *osdc, | |||
| 565 | { | 565 | { |
| 566 | struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base; | 566 | struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base; |
| 567 | struct ceph_pg pgid; | 567 | struct ceph_pg pgid; |
| 568 | int o = -1; | 568 | int acting[CEPH_PG_MAX_SIZE]; |
| 569 | int o = -1, num = 0; | ||
| 569 | int err; | 570 | int err; |
| 570 | 571 | ||
| 571 | dout("map_osds %p tid %lld\n", req, req->r_tid); | 572 | dout("map_osds %p tid %lld\n", req, req->r_tid); |
| @@ -576,10 +577,16 @@ static int __map_osds(struct ceph_osd_client *osdc, | |||
| 576 | pgid = reqhead->layout.ol_pgid; | 577 | pgid = reqhead->layout.ol_pgid; |
| 577 | req->r_pgid = pgid; | 578 | req->r_pgid = pgid; |
| 578 | 579 | ||
| 579 | o = ceph_calc_pg_primary(osdc->osdmap, pgid); | 580 | err = ceph_calc_pg_acting(osdc->osdmap, pgid, acting); |
| 581 | if (err > 0) { | ||
| 582 | o = acting[0]; | ||
| 583 | num = err; | ||
| 584 | } | ||
| 580 | 585 | ||
| 581 | if ((req->r_osd && req->r_osd->o_osd == o && | 586 | if ((req->r_osd && req->r_osd->o_osd == o && |
| 582 | req->r_sent >= req->r_osd->o_incarnation) || | 587 | req->r_sent >= req->r_osd->o_incarnation && |
| 588 | req->r_num_pg_osds == num && | ||
| 589 | memcmp(req->r_pg_osds, acting, sizeof(acting[0])*num) == 0) || | ||
| 583 | (req->r_osd == NULL && o == -1)) | 590 | (req->r_osd == NULL && o == -1)) |
| 584 | return 0; /* no change */ | 591 | return 0; /* no change */ |
| 585 | 592 | ||
| @@ -587,6 +594,10 @@ static int __map_osds(struct ceph_osd_client *osdc, | |||
| 587 | req->r_tid, le32_to_cpu(pgid.pool), le16_to_cpu(pgid.ps), o, | 594 | req->r_tid, le32_to_cpu(pgid.pool), le16_to_cpu(pgid.ps), o, |
| 588 | req->r_osd ? req->r_osd->o_osd : -1); | 595 | req->r_osd ? req->r_osd->o_osd : -1); |
| 589 | 596 | ||
| 597 | /* record full pg acting set */ | ||
| 598 | memcpy(req->r_pg_osds, acting, sizeof(acting[0]) * num); | ||
| 599 | req->r_num_pg_osds = num; | ||
| 600 | |||
| 590 | if (req->r_osd) { | 601 | if (req->r_osd) { |
| 591 | __cancel_request(req); | 602 | __cancel_request(req); |
| 592 | list_del_init(&req->r_osd_item); | 603 | list_del_init(&req->r_osd_item); |
| @@ -612,7 +623,7 @@ static int __map_osds(struct ceph_osd_client *osdc, | |||
| 612 | __remove_osd_from_lru(req->r_osd); | 623 | __remove_osd_from_lru(req->r_osd); |
| 613 | list_add(&req->r_osd_item, &req->r_osd->o_requests); | 624 | list_add(&req->r_osd_item, &req->r_osd->o_requests); |
| 614 | } | 625 | } |
| 615 | err = 1; /* osd changed */ | 626 | err = 1; /* osd or pg changed */ |
| 616 | 627 | ||
| 617 | out: | 628 | out: |
| 618 | return err; | 629 | return err; |
| @@ -779,16 +790,18 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 779 | struct ceph_osd_request *req; | 790 | struct ceph_osd_request *req; |
| 780 | u64 tid; | 791 | u64 tid; |
| 781 | int numops, object_len, flags; | 792 | int numops, object_len, flags; |
| 793 | s32 result; | ||
| 782 | 794 | ||
| 783 | tid = le64_to_cpu(msg->hdr.tid); | 795 | tid = le64_to_cpu(msg->hdr.tid); |
| 784 | if (msg->front.iov_len < sizeof(*rhead)) | 796 | if (msg->front.iov_len < sizeof(*rhead)) |
| 785 | goto bad; | 797 | goto bad; |
| 786 | numops = le32_to_cpu(rhead->num_ops); | 798 | numops = le32_to_cpu(rhead->num_ops); |
| 787 | object_len = le32_to_cpu(rhead->object_len); | 799 | object_len = le32_to_cpu(rhead->object_len); |
| 800 | result = le32_to_cpu(rhead->result); | ||
| 788 | if (msg->front.iov_len != sizeof(*rhead) + object_len + | 801 | if (msg->front.iov_len != sizeof(*rhead) + object_len + |
| 789 | numops * sizeof(struct ceph_osd_op)) | 802 | numops * sizeof(struct ceph_osd_op)) |
| 790 | goto bad; | 803 | goto bad; |
| 791 | dout("handle_reply %p tid %llu\n", msg, tid); | 804 | dout("handle_reply %p tid %llu result %d\n", msg, tid, (int)result); |
| 792 | 805 | ||
| 793 | /* lookup */ | 806 | /* lookup */ |
| 794 | mutex_lock(&osdc->request_mutex); | 807 | mutex_lock(&osdc->request_mutex); |
| @@ -834,7 +847,8 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 834 | dout("handle_reply tid %llu flags %d\n", tid, flags); | 847 | dout("handle_reply tid %llu flags %d\n", tid, flags); |
| 835 | 848 | ||
| 836 | /* either this is a read, or we got the safe response */ | 849 | /* either this is a read, or we got the safe response */ |
| 837 | if ((flags & CEPH_OSD_FLAG_ONDISK) || | 850 | if (result < 0 || |
| 851 | (flags & CEPH_OSD_FLAG_ONDISK) || | ||
| 838 | ((flags & CEPH_OSD_FLAG_WRITE) == 0)) | 852 | ((flags & CEPH_OSD_FLAG_WRITE) == 0)) |
| 839 | __unregister_request(osdc, req); | 853 | __unregister_request(osdc, req); |
| 840 | 854 | ||
diff --git a/fs/ceph/osd_client.h b/fs/ceph/osd_client.h index b0759911e7c3..ce776989ef6a 100644 --- a/fs/ceph/osd_client.h +++ b/fs/ceph/osd_client.h | |||
| @@ -48,6 +48,8 @@ struct ceph_osd_request { | |||
| 48 | struct list_head r_osd_item; | 48 | struct list_head r_osd_item; |
| 49 | struct ceph_osd *r_osd; | 49 | struct ceph_osd *r_osd; |
| 50 | struct ceph_pg r_pgid; | 50 | struct ceph_pg r_pgid; |
| 51 | int r_pg_osds[CEPH_PG_MAX_SIZE]; | ||
| 52 | int r_num_pg_osds; | ||
| 51 | 53 | ||
| 52 | struct ceph_connection *r_con_filling_msg; | 54 | struct ceph_connection *r_con_filling_msg; |
| 53 | 55 | ||
| @@ -66,7 +68,6 @@ struct ceph_osd_request { | |||
| 66 | struct list_head r_unsafe_item; | 68 | struct list_head r_unsafe_item; |
| 67 | 69 | ||
| 68 | struct inode *r_inode; /* for use by callbacks */ | 70 | struct inode *r_inode; /* for use by callbacks */ |
| 69 | struct writeback_control *r_wbc; /* ditto */ | ||
| 70 | 71 | ||
| 71 | char r_oid[40]; /* object name */ | 72 | char r_oid[40]; /* object name */ |
| 72 | int r_oid_len; | 73 | int r_oid_len; |
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 2e2c15eed82a..cfdd8f4388b7 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
| @@ -1041,12 +1041,33 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
| 1041 | } | 1041 | } |
| 1042 | 1042 | ||
| 1043 | /* | 1043 | /* |
| 1044 | * Return acting set for given pgid. | ||
| 1045 | */ | ||
| 1046 | int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | ||
| 1047 | int *acting) | ||
| 1048 | { | ||
| 1049 | int rawosds[CEPH_PG_MAX_SIZE], *osds; | ||
| 1050 | int i, o, num = CEPH_PG_MAX_SIZE; | ||
| 1051 | |||
| 1052 | osds = calc_pg_raw(osdmap, pgid, rawosds, &num); | ||
| 1053 | if (!osds) | ||
| 1054 | return -1; | ||
| 1055 | |||
| 1056 | /* primary is first up osd */ | ||
| 1057 | o = 0; | ||
| 1058 | for (i = 0; i < num; i++) | ||
| 1059 | if (ceph_osd_is_up(osdmap, osds[i])) | ||
| 1060 | acting[o++] = osds[i]; | ||
| 1061 | return o; | ||
| 1062 | } | ||
| 1063 | |||
| 1064 | /* | ||
| 1044 | * Return primary osd for given pgid, or -1 if none. | 1065 | * Return primary osd for given pgid, or -1 if none. |
| 1045 | */ | 1066 | */ |
| 1046 | int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, struct ceph_pg pgid) | 1067 | int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, struct ceph_pg pgid) |
| 1047 | { | 1068 | { |
| 1048 | int rawosds[10], *osds; | 1069 | int rawosds[CEPH_PG_MAX_SIZE], *osds; |
| 1049 | int i, num = ARRAY_SIZE(rawosds); | 1070 | int i, num = CEPH_PG_MAX_SIZE; |
| 1050 | 1071 | ||
| 1051 | osds = calc_pg_raw(osdmap, pgid, rawosds, &num); | 1072 | osds = calc_pg_raw(osdmap, pgid, rawosds, &num); |
| 1052 | if (!osds) | 1073 | if (!osds) |
| @@ -1054,9 +1075,7 @@ int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, struct ceph_pg pgid) | |||
| 1054 | 1075 | ||
| 1055 | /* primary is first up osd */ | 1076 | /* primary is first up osd */ |
| 1056 | for (i = 0; i < num; i++) | 1077 | for (i = 0; i < num; i++) |
| 1057 | if (ceph_osd_is_up(osdmap, osds[i])) { | 1078 | if (ceph_osd_is_up(osdmap, osds[i])) |
| 1058 | return osds[i]; | 1079 | return osds[i]; |
| 1059 | break; | ||
| 1060 | } | ||
| 1061 | return -1; | 1080 | return -1; |
| 1062 | } | 1081 | } |
diff --git a/fs/ceph/osdmap.h b/fs/ceph/osdmap.h index 8bc9f1e4f562..970b547e510d 100644 --- a/fs/ceph/osdmap.h +++ b/fs/ceph/osdmap.h | |||
| @@ -120,6 +120,8 @@ extern int ceph_calc_object_layout(struct ceph_object_layout *ol, | |||
| 120 | const char *oid, | 120 | const char *oid, |
| 121 | struct ceph_file_layout *fl, | 121 | struct ceph_file_layout *fl, |
| 122 | struct ceph_osdmap *osdmap); | 122 | struct ceph_osdmap *osdmap); |
| 123 | extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | ||
| 124 | int *acting); | ||
| 123 | extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, | 125 | extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, |
| 124 | struct ceph_pg pgid); | 126 | struct ceph_pg pgid); |
| 125 | 127 | ||
diff --git a/fs/ceph/rados.h b/fs/ceph/rados.h index a1fc1d017b58..fd56451a871f 100644 --- a/fs/ceph/rados.h +++ b/fs/ceph/rados.h | |||
| @@ -58,6 +58,7 @@ struct ceph_timespec { | |||
| 58 | #define CEPH_PG_LAYOUT_LINEAR 2 | 58 | #define CEPH_PG_LAYOUT_LINEAR 2 |
| 59 | #define CEPH_PG_LAYOUT_HYBRID 3 | 59 | #define CEPH_PG_LAYOUT_HYBRID 3 |
| 60 | 60 | ||
| 61 | #define CEPH_PG_MAX_SIZE 16 /* max # osds in a single pg */ | ||
| 61 | 62 | ||
| 62 | /* | 63 | /* |
| 63 | * placement group. | 64 | * placement group. |
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index f888cf487b7c..110857ba9269 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
| @@ -47,10 +47,20 @@ const char *ceph_file_part(const char *s, int len) | |||
| 47 | */ | 47 | */ |
| 48 | static void ceph_put_super(struct super_block *s) | 48 | static void ceph_put_super(struct super_block *s) |
| 49 | { | 49 | { |
| 50 | struct ceph_client *cl = ceph_client(s); | 50 | struct ceph_client *client = ceph_sb_to_client(s); |
| 51 | 51 | ||
| 52 | dout("put_super\n"); | 52 | dout("put_super\n"); |
| 53 | ceph_mdsc_close_sessions(&cl->mdsc); | 53 | ceph_mdsc_close_sessions(&client->mdsc); |
| 54 | |||
| 55 | /* | ||
| 56 | * ensure we release the bdi before put_anon_super releases | ||
| 57 | * the device name. | ||
| 58 | */ | ||
| 59 | if (s->s_bdi == &client->backing_dev_info) { | ||
| 60 | bdi_unregister(&client->backing_dev_info); | ||
| 61 | s->s_bdi = NULL; | ||
| 62 | } | ||
| 63 | |||
| 54 | return; | 64 | return; |
| 55 | } | 65 | } |
| 56 | 66 | ||
| @@ -636,6 +646,8 @@ static void ceph_destroy_client(struct ceph_client *client) | |||
| 636 | destroy_workqueue(client->pg_inv_wq); | 646 | destroy_workqueue(client->pg_inv_wq); |
| 637 | destroy_workqueue(client->trunc_wq); | 647 | destroy_workqueue(client->trunc_wq); |
| 638 | 648 | ||
| 649 | bdi_destroy(&client->backing_dev_info); | ||
| 650 | |||
| 639 | if (client->msgr) | 651 | if (client->msgr) |
| 640 | ceph_messenger_destroy(client->msgr); | 652 | ceph_messenger_destroy(client->msgr); |
| 641 | mempool_destroy(client->wb_pagevec_pool); | 653 | mempool_destroy(client->wb_pagevec_pool); |
| @@ -876,14 +888,14 @@ static int ceph_register_bdi(struct super_block *sb, struct ceph_client *client) | |||
| 876 | { | 888 | { |
| 877 | int err; | 889 | int err; |
| 878 | 890 | ||
| 879 | sb->s_bdi = &client->backing_dev_info; | ||
| 880 | |||
| 881 | /* set ra_pages based on rsize mount option? */ | 891 | /* set ra_pages based on rsize mount option? */ |
| 882 | if (client->mount_args->rsize >= PAGE_CACHE_SIZE) | 892 | if (client->mount_args->rsize >= PAGE_CACHE_SIZE) |
| 883 | client->backing_dev_info.ra_pages = | 893 | client->backing_dev_info.ra_pages = |
| 884 | (client->mount_args->rsize + PAGE_CACHE_SIZE - 1) | 894 | (client->mount_args->rsize + PAGE_CACHE_SIZE - 1) |
| 885 | >> PAGE_SHIFT; | 895 | >> PAGE_SHIFT; |
| 886 | err = bdi_register_dev(&client->backing_dev_info, sb->s_dev); | 896 | err = bdi_register_dev(&client->backing_dev_info, sb->s_dev); |
| 897 | if (!err) | ||
| 898 | sb->s_bdi = &client->backing_dev_info; | ||
| 887 | return err; | 899 | return err; |
| 888 | } | 900 | } |
| 889 | 901 | ||
| @@ -957,9 +969,6 @@ static void ceph_kill_sb(struct super_block *s) | |||
| 957 | dout("kill_sb %p\n", s); | 969 | dout("kill_sb %p\n", s); |
| 958 | ceph_mdsc_pre_umount(&client->mdsc); | 970 | ceph_mdsc_pre_umount(&client->mdsc); |
| 959 | kill_anon_super(s); /* will call put_super after sb is r/o */ | 971 | kill_anon_super(s); /* will call put_super after sb is r/o */ |
| 960 | if (s->s_bdi == &client->backing_dev_info) | ||
| 961 | bdi_unregister(&client->backing_dev_info); | ||
| 962 | bdi_destroy(&client->backing_dev_info); | ||
| 963 | ceph_destroy_client(client); | 972 | ceph_destroy_client(client); |
| 964 | } | 973 | } |
| 965 | 974 | ||
diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c index a20bea598933..cfd1ce34e0bc 100644 --- a/fs/cifs/asn1.c +++ b/fs/cifs/asn1.c | |||
| @@ -492,17 +492,13 @@ compare_oid(unsigned long *oid1, unsigned int oid1len, | |||
| 492 | 492 | ||
| 493 | int | 493 | int |
| 494 | decode_negTokenInit(unsigned char *security_blob, int length, | 494 | decode_negTokenInit(unsigned char *security_blob, int length, |
| 495 | enum securityEnum *secType) | 495 | struct TCP_Server_Info *server) |
| 496 | { | 496 | { |
| 497 | struct asn1_ctx ctx; | 497 | struct asn1_ctx ctx; |
| 498 | unsigned char *end; | 498 | unsigned char *end; |
| 499 | unsigned char *sequence_end; | 499 | unsigned char *sequence_end; |
| 500 | unsigned long *oid = NULL; | 500 | unsigned long *oid = NULL; |
| 501 | unsigned int cls, con, tag, oidlen, rc; | 501 | unsigned int cls, con, tag, oidlen, rc; |
| 502 | bool use_ntlmssp = false; | ||
| 503 | bool use_kerberos = false; | ||
| 504 | bool use_kerberosu2u = false; | ||
| 505 | bool use_mskerberos = false; | ||
| 506 | 502 | ||
| 507 | /* cifs_dump_mem(" Received SecBlob ", security_blob, length); */ | 503 | /* cifs_dump_mem(" Received SecBlob ", security_blob, length); */ |
| 508 | 504 | ||
| @@ -510,11 +506,11 @@ decode_negTokenInit(unsigned char *security_blob, int length, | |||
| 510 | 506 | ||
| 511 | /* GSSAPI header */ | 507 | /* GSSAPI header */ |
| 512 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 508 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 513 | cFYI(1, ("Error decoding negTokenInit header")); | 509 | cFYI(1, "Error decoding negTokenInit header"); |
| 514 | return 0; | 510 | return 0; |
| 515 | } else if ((cls != ASN1_APL) || (con != ASN1_CON) | 511 | } else if ((cls != ASN1_APL) || (con != ASN1_CON) |
| 516 | || (tag != ASN1_EOC)) { | 512 | || (tag != ASN1_EOC)) { |
| 517 | cFYI(1, ("cls = %d con = %d tag = %d", cls, con, tag)); | 513 | cFYI(1, "cls = %d con = %d tag = %d", cls, con, tag); |
| 518 | return 0; | 514 | return 0; |
| 519 | } | 515 | } |
| 520 | 516 | ||
| @@ -535,56 +531,52 @@ decode_negTokenInit(unsigned char *security_blob, int length, | |||
| 535 | 531 | ||
| 536 | /* SPNEGO OID not present or garbled -- bail out */ | 532 | /* SPNEGO OID not present or garbled -- bail out */ |
| 537 | if (!rc) { | 533 | if (!rc) { |
| 538 | cFYI(1, ("Error decoding negTokenInit header")); | 534 | cFYI(1, "Error decoding negTokenInit header"); |
| 539 | return 0; | 535 | return 0; |
| 540 | } | 536 | } |
| 541 | 537 | ||
| 542 | /* SPNEGO */ | 538 | /* SPNEGO */ |
| 543 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 539 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 544 | cFYI(1, ("Error decoding negTokenInit")); | 540 | cFYI(1, "Error decoding negTokenInit"); |
| 545 | return 0; | 541 | return 0; |
| 546 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON) | 542 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON) |
| 547 | || (tag != ASN1_EOC)) { | 543 | || (tag != ASN1_EOC)) { |
| 548 | cFYI(1, | 544 | cFYI(1, "cls = %d con = %d tag = %d end = %p (%d) exit 0", |
| 549 | ("cls = %d con = %d tag = %d end = %p (%d) exit 0", | 545 | cls, con, tag, end, *end); |
| 550 | cls, con, tag, end, *end)); | ||
| 551 | return 0; | 546 | return 0; |
| 552 | } | 547 | } |
| 553 | 548 | ||
| 554 | /* negTokenInit */ | 549 | /* negTokenInit */ |
| 555 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 550 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 556 | cFYI(1, ("Error decoding negTokenInit")); | 551 | cFYI(1, "Error decoding negTokenInit"); |
| 557 | return 0; | 552 | return 0; |
| 558 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) | 553 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) |
| 559 | || (tag != ASN1_SEQ)) { | 554 | || (tag != ASN1_SEQ)) { |
| 560 | cFYI(1, | 555 | cFYI(1, "cls = %d con = %d tag = %d end = %p (%d) exit 1", |
| 561 | ("cls = %d con = %d tag = %d end = %p (%d) exit 1", | 556 | cls, con, tag, end, *end); |
| 562 | cls, con, tag, end, *end)); | ||
| 563 | return 0; | 557 | return 0; |
| 564 | } | 558 | } |
| 565 | 559 | ||
| 566 | /* sequence */ | 560 | /* sequence */ |
| 567 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 561 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 568 | cFYI(1, ("Error decoding 2nd part of negTokenInit")); | 562 | cFYI(1, "Error decoding 2nd part of negTokenInit"); |
| 569 | return 0; | 563 | return 0; |
| 570 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON) | 564 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON) |
| 571 | || (tag != ASN1_EOC)) { | 565 | || (tag != ASN1_EOC)) { |
| 572 | cFYI(1, | 566 | cFYI(1, "cls = %d con = %d tag = %d end = %p (%d) exit 0", |
| 573 | ("cls = %d con = %d tag = %d end = %p (%d) exit 0", | 567 | cls, con, tag, end, *end); |
| 574 | cls, con, tag, end, *end)); | ||
| 575 | return 0; | 568 | return 0; |
| 576 | } | 569 | } |
| 577 | 570 | ||
| 578 | /* sequence of */ | 571 | /* sequence of */ |
| 579 | if (asn1_header_decode | 572 | if (asn1_header_decode |
| 580 | (&ctx, &sequence_end, &cls, &con, &tag) == 0) { | 573 | (&ctx, &sequence_end, &cls, &con, &tag) == 0) { |
| 581 | cFYI(1, ("Error decoding 2nd part of negTokenInit")); | 574 | cFYI(1, "Error decoding 2nd part of negTokenInit"); |
| 582 | return 0; | 575 | return 0; |
| 583 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) | 576 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) |
| 584 | || (tag != ASN1_SEQ)) { | 577 | || (tag != ASN1_SEQ)) { |
| 585 | cFYI(1, | 578 | cFYI(1, "cls = %d con = %d tag = %d end = %p (%d) exit 1", |
| 586 | ("cls = %d con = %d tag = %d end = %p (%d) exit 1", | 579 | cls, con, tag, end, *end); |
| 587 | cls, con, tag, end, *end)); | ||
| 588 | return 0; | 580 | return 0; |
| 589 | } | 581 | } |
| 590 | 582 | ||
| @@ -592,37 +584,33 @@ decode_negTokenInit(unsigned char *security_blob, int length, | |||
| 592 | while (!asn1_eoc_decode(&ctx, sequence_end)) { | 584 | while (!asn1_eoc_decode(&ctx, sequence_end)) { |
| 593 | rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag); | 585 | rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag); |
| 594 | if (!rc) { | 586 | if (!rc) { |
| 595 | cFYI(1, | 587 | cFYI(1, "Error decoding negTokenInit hdr exit2"); |
| 596 | ("Error decoding negTokenInit hdr exit2")); | ||
| 597 | return 0; | 588 | return 0; |
| 598 | } | 589 | } |
| 599 | if ((tag == ASN1_OJI) && (con == ASN1_PRI)) { | 590 | if ((tag == ASN1_OJI) && (con == ASN1_PRI)) { |
| 600 | if (asn1_oid_decode(&ctx, end, &oid, &oidlen)) { | 591 | if (asn1_oid_decode(&ctx, end, &oid, &oidlen)) { |
| 601 | 592 | ||
| 602 | cFYI(1, ("OID len = %d oid = 0x%lx 0x%lx " | 593 | cFYI(1, "OID len = %d oid = 0x%lx 0x%lx " |
| 603 | "0x%lx 0x%lx", oidlen, *oid, | 594 | "0x%lx 0x%lx", oidlen, *oid, |
| 604 | *(oid + 1), *(oid + 2), *(oid + 3))); | 595 | *(oid + 1), *(oid + 2), *(oid + 3)); |
| 605 | 596 | ||
| 606 | if (compare_oid(oid, oidlen, MSKRB5_OID, | 597 | if (compare_oid(oid, oidlen, MSKRB5_OID, |
| 607 | MSKRB5_OID_LEN) && | 598 | MSKRB5_OID_LEN)) |
| 608 | !use_mskerberos) | 599 | server->sec_mskerberos = true; |
| 609 | use_mskerberos = true; | ||
| 610 | else if (compare_oid(oid, oidlen, KRB5U2U_OID, | 600 | else if (compare_oid(oid, oidlen, KRB5U2U_OID, |
| 611 | KRB5U2U_OID_LEN) && | 601 | KRB5U2U_OID_LEN)) |
| 612 | !use_kerberosu2u) | 602 | server->sec_kerberosu2u = true; |
| 613 | use_kerberosu2u = true; | ||
| 614 | else if (compare_oid(oid, oidlen, KRB5_OID, | 603 | else if (compare_oid(oid, oidlen, KRB5_OID, |
| 615 | KRB5_OID_LEN) && | 604 | KRB5_OID_LEN)) |
| 616 | !use_kerberos) | 605 | server->sec_kerberos = true; |
| 617 | use_kerberos = true; | ||
| 618 | else if (compare_oid(oid, oidlen, NTLMSSP_OID, | 606 | else if (compare_oid(oid, oidlen, NTLMSSP_OID, |
| 619 | NTLMSSP_OID_LEN)) | 607 | NTLMSSP_OID_LEN)) |
| 620 | use_ntlmssp = true; | 608 | server->sec_ntlmssp = true; |
| 621 | 609 | ||
| 622 | kfree(oid); | 610 | kfree(oid); |
| 623 | } | 611 | } |
| 624 | } else { | 612 | } else { |
| 625 | cFYI(1, ("Should be an oid what is going on?")); | 613 | cFYI(1, "Should be an oid what is going on?"); |
| 626 | } | 614 | } |
| 627 | } | 615 | } |
| 628 | 616 | ||
| @@ -632,54 +620,47 @@ decode_negTokenInit(unsigned char *security_blob, int length, | |||
| 632 | no mechListMic (e.g. NTLMSSP instead of KRB5) */ | 620 | no mechListMic (e.g. NTLMSSP instead of KRB5) */ |
| 633 | if (ctx.error == ASN1_ERR_DEC_EMPTY) | 621 | if (ctx.error == ASN1_ERR_DEC_EMPTY) |
| 634 | goto decode_negtoken_exit; | 622 | goto decode_negtoken_exit; |
| 635 | cFYI(1, ("Error decoding last part negTokenInit exit3")); | 623 | cFYI(1, "Error decoding last part negTokenInit exit3"); |
| 636 | return 0; | 624 | return 0; |
| 637 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { | 625 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { |
| 638 | /* tag = 3 indicating mechListMIC */ | 626 | /* tag = 3 indicating mechListMIC */ |
| 639 | cFYI(1, ("Exit 4 cls = %d con = %d tag = %d end = %p (%d)", | 627 | cFYI(1, "Exit 4 cls = %d con = %d tag = %d end = %p (%d)", |
| 640 | cls, con, tag, end, *end)); | 628 | cls, con, tag, end, *end); |
| 641 | return 0; | 629 | return 0; |
| 642 | } | 630 | } |
| 643 | 631 | ||
| 644 | /* sequence */ | 632 | /* sequence */ |
| 645 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 633 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 646 | cFYI(1, ("Error decoding last part negTokenInit exit5")); | 634 | cFYI(1, "Error decoding last part negTokenInit exit5"); |
| 647 | return 0; | 635 | return 0; |
| 648 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) | 636 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) |
| 649 | || (tag != ASN1_SEQ)) { | 637 | || (tag != ASN1_SEQ)) { |
| 650 | cFYI(1, ("cls = %d con = %d tag = %d end = %p (%d)", | 638 | cFYI(1, "cls = %d con = %d tag = %d end = %p (%d)", |
| 651 | cls, con, tag, end, *end)); | 639 | cls, con, tag, end, *end); |
| 652 | } | 640 | } |
| 653 | 641 | ||
| 654 | /* sequence of */ | 642 | /* sequence of */ |
| 655 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 643 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 656 | cFYI(1, ("Error decoding last part negTokenInit exit 7")); | 644 | cFYI(1, "Error decoding last part negTokenInit exit 7"); |
| 657 | return 0; | 645 | return 0; |
| 658 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { | 646 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { |
| 659 | cFYI(1, ("Exit 8 cls = %d con = %d tag = %d end = %p (%d)", | 647 | cFYI(1, "Exit 8 cls = %d con = %d tag = %d end = %p (%d)", |
| 660 | cls, con, tag, end, *end)); | 648 | cls, con, tag, end, *end); |
| 661 | return 0; | 649 | return 0; |
| 662 | } | 650 | } |
| 663 | 651 | ||
| 664 | /* general string */ | 652 | /* general string */ |
| 665 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { | 653 | if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { |
| 666 | cFYI(1, ("Error decoding last part negTokenInit exit9")); | 654 | cFYI(1, "Error decoding last part negTokenInit exit9"); |
| 667 | return 0; | 655 | return 0; |
| 668 | } else if ((cls != ASN1_UNI) || (con != ASN1_PRI) | 656 | } else if ((cls != ASN1_UNI) || (con != ASN1_PRI) |
| 669 | || (tag != ASN1_GENSTR)) { | 657 | || (tag != ASN1_GENSTR)) { |
| 670 | cFYI(1, ("Exit10 cls = %d con = %d tag = %d end = %p (%d)", | 658 | cFYI(1, "Exit10 cls = %d con = %d tag = %d end = %p (%d)", |
| 671 | cls, con, tag, end, *end)); | 659 | cls, con, tag, end, *end); |
| 672 | return 0; | 660 | return 0; |
| 673 | } | 661 | } |
| 674 | cFYI(1, ("Need to call asn1_octets_decode() function for %s", | 662 | cFYI(1, "Need to call asn1_octets_decode() function for %s", |
| 675 | ctx.pointer)); /* is this UTF-8 or ASCII? */ | 663 | ctx.pointer); /* is this UTF-8 or ASCII? */ |
| 676 | decode_negtoken_exit: | 664 | decode_negtoken_exit: |
| 677 | if (use_kerberos) | ||
| 678 | *secType = Kerberos; | ||
| 679 | else if (use_mskerberos) | ||
| 680 | *secType = MSKerberos; | ||
| 681 | else if (use_ntlmssp) | ||
| 682 | *secType = RawNTLMSSP; | ||
| 683 | |||
| 684 | return 1; | 665 | return 1; |
| 685 | } | 666 | } |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 42cec2a7c0cf..4fce6e61b34e 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
| @@ -60,10 +60,10 @@ cifs_dump_mem(char *label, void *data, int length) | |||
| 60 | #ifdef CONFIG_CIFS_DEBUG2 | 60 | #ifdef CONFIG_CIFS_DEBUG2 |
| 61 | void cifs_dump_detail(struct smb_hdr *smb) | 61 | void cifs_dump_detail(struct smb_hdr *smb) |
| 62 | { | 62 | { |
| 63 | cERROR(1, ("Cmd: %d Err: 0x%x Flags: 0x%x Flgs2: 0x%x Mid: %d Pid: %d", | 63 | cERROR(1, "Cmd: %d Err: 0x%x Flags: 0x%x Flgs2: 0x%x Mid: %d Pid: %d", |
| 64 | smb->Command, smb->Status.CifsError, | 64 | smb->Command, smb->Status.CifsError, |
| 65 | smb->Flags, smb->Flags2, smb->Mid, smb->Pid)); | 65 | smb->Flags, smb->Flags2, smb->Mid, smb->Pid); |
| 66 | cERROR(1, ("smb buf %p len %d", smb, smbCalcSize_LE(smb))); | 66 | cERROR(1, "smb buf %p len %d", smb, smbCalcSize_LE(smb)); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | 69 | ||
| @@ -75,25 +75,25 @@ void cifs_dump_mids(struct TCP_Server_Info *server) | |||
| 75 | if (server == NULL) | 75 | if (server == NULL) |
| 76 | return; | 76 | return; |
| 77 | 77 | ||
| 78 | cERROR(1, ("Dump pending requests:")); | 78 | cERROR(1, "Dump pending requests:"); |
| 79 | spin_lock(&GlobalMid_Lock); | 79 | spin_lock(&GlobalMid_Lock); |
| 80 | list_for_each(tmp, &server->pending_mid_q) { | 80 | list_for_each(tmp, &server->pending_mid_q) { |
| 81 | mid_entry = list_entry(tmp, struct mid_q_entry, qhead); | 81 | mid_entry = list_entry(tmp, struct mid_q_entry, qhead); |
| 82 | cERROR(1, ("State: %d Cmd: %d Pid: %d Tsk: %p Mid %d", | 82 | cERROR(1, "State: %d Cmd: %d Pid: %d Tsk: %p Mid %d", |
| 83 | mid_entry->midState, | 83 | mid_entry->midState, |
| 84 | (int)mid_entry->command, | 84 | (int)mid_entry->command, |
| 85 | mid_entry->pid, | 85 | mid_entry->pid, |
| 86 | mid_entry->tsk, | 86 | mid_entry->tsk, |
| 87 | mid_entry->mid)); | 87 | mid_entry->mid); |
| 88 | #ifdef CONFIG_CIFS_STATS2 | 88 | #ifdef CONFIG_CIFS_STATS2 |
| 89 | cERROR(1, ("IsLarge: %d buf: %p time rcv: %ld now: %ld", | 89 | cERROR(1, "IsLarge: %d buf: %p time rcv: %ld now: %ld", |
| 90 | mid_entry->largeBuf, | 90 | mid_entry->largeBuf, |
| 91 | mid_entry->resp_buf, | 91 | mid_entry->resp_buf, |
| 92 | mid_entry->when_received, | 92 | mid_entry->when_received, |
| 93 | jiffies)); | 93 | jiffies); |
| 94 | #endif /* STATS2 */ | 94 | #endif /* STATS2 */ |
| 95 | cERROR(1, ("IsMult: %d IsEnd: %d", mid_entry->multiRsp, | 95 | cERROR(1, "IsMult: %d IsEnd: %d", mid_entry->multiRsp, |
| 96 | mid_entry->multiEnd)); | 96 | mid_entry->multiEnd); |
| 97 | if (mid_entry->resp_buf) { | 97 | if (mid_entry->resp_buf) { |
| 98 | cifs_dump_detail(mid_entry->resp_buf); | 98 | cifs_dump_detail(mid_entry->resp_buf); |
| 99 | cifs_dump_mem("existing buf: ", | 99 | cifs_dump_mem("existing buf: ", |
| @@ -716,7 +716,7 @@ static const struct file_operations cifs_multiuser_mount_proc_fops = { | |||
| 716 | 716 | ||
| 717 | static int cifs_security_flags_proc_show(struct seq_file *m, void *v) | 717 | static int cifs_security_flags_proc_show(struct seq_file *m, void *v) |
| 718 | { | 718 | { |
| 719 | seq_printf(m, "0x%x\n", extended_security); | 719 | seq_printf(m, "0x%x\n", global_secflags); |
| 720 | return 0; | 720 | return 0; |
| 721 | } | 721 | } |
| 722 | 722 | ||
| @@ -744,13 +744,13 @@ static ssize_t cifs_security_flags_proc_write(struct file *file, | |||
| 744 | /* single char or single char followed by null */ | 744 | /* single char or single char followed by null */ |
| 745 | c = flags_string[0]; | 745 | c = flags_string[0]; |
| 746 | if (c == '0' || c == 'n' || c == 'N') { | 746 | if (c == '0' || c == 'n' || c == 'N') { |
| 747 | extended_security = CIFSSEC_DEF; /* default */ | 747 | global_secflags = CIFSSEC_DEF; /* default */ |
| 748 | return count; | 748 | return count; |
| 749 | } else if (c == '1' || c == 'y' || c == 'Y') { | 749 | } else if (c == '1' || c == 'y' || c == 'Y') { |
| 750 | extended_security = CIFSSEC_MAX; | 750 | global_secflags = CIFSSEC_MAX; |
| 751 | return count; | 751 | return count; |
| 752 | } else if (!isdigit(c)) { | 752 | } else if (!isdigit(c)) { |
| 753 | cERROR(1, ("invalid flag %c", c)); | 753 | cERROR(1, "invalid flag %c", c); |
| 754 | return -EINVAL; | 754 | return -EINVAL; |
| 755 | } | 755 | } |
| 756 | } | 756 | } |
| @@ -758,26 +758,26 @@ static ssize_t cifs_security_flags_proc_write(struct file *file, | |||
| 758 | 758 | ||
| 759 | flags = simple_strtoul(flags_string, NULL, 0); | 759 | flags = simple_strtoul(flags_string, NULL, 0); |
| 760 | 760 | ||
| 761 | cFYI(1, ("sec flags 0x%x", flags)); | 761 | cFYI(1, "sec flags 0x%x", flags); |
| 762 | 762 | ||
| 763 | if (flags <= 0) { | 763 | if (flags <= 0) { |
| 764 | cERROR(1, ("invalid security flags %s", flags_string)); | 764 | cERROR(1, "invalid security flags %s", flags_string); |
| 765 | return -EINVAL; | 765 | return -EINVAL; |
| 766 | } | 766 | } |
| 767 | 767 | ||
| 768 | if (flags & ~CIFSSEC_MASK) { | 768 | if (flags & ~CIFSSEC_MASK) { |
| 769 | cERROR(1, ("attempt to set unsupported security flags 0x%x", | 769 | cERROR(1, "attempt to set unsupported security flags 0x%x", |
| 770 | flags & ~CIFSSEC_MASK)); | 770 | flags & ~CIFSSEC_MASK); |
| 771 | return -EINVAL; | 771 | return -EINVAL; |
| 772 | } | 772 | } |
| 773 | /* flags look ok - update the global security flags for cifs module */ | 773 | /* flags look ok - update the global security flags for cifs module */ |
| 774 | extended_security = flags; | 774 | global_secflags = flags; |
| 775 | if (extended_security & CIFSSEC_MUST_SIGN) { | 775 | if (global_secflags & CIFSSEC_MUST_SIGN) { |
| 776 | /* requiring signing implies signing is allowed */ | 776 | /* requiring signing implies signing is allowed */ |
| 777 | extended_security |= CIFSSEC_MAY_SIGN; | 777 | global_secflags |= CIFSSEC_MAY_SIGN; |
| 778 | cFYI(1, ("packet signing now required")); | 778 | cFYI(1, "packet signing now required"); |
| 779 | } else if ((extended_security & CIFSSEC_MAY_SIGN) == 0) { | 779 | } else if ((global_secflags & CIFSSEC_MAY_SIGN) == 0) { |
| 780 | cFYI(1, ("packet signing disabled")); | 780 | cFYI(1, "packet signing disabled"); |
| 781 | } | 781 | } |
| 782 | /* BB should we turn on MAY flags for other MUST options? */ | 782 | /* BB should we turn on MAY flags for other MUST options? */ |
| 783 | return count; | 783 | return count; |
diff --git a/fs/cifs/cifs_debug.h b/fs/cifs/cifs_debug.h index 5eb3b83bbfa7..aa316891ac0c 100644 --- a/fs/cifs/cifs_debug.h +++ b/fs/cifs/cifs_debug.h | |||
| @@ -43,34 +43,54 @@ void dump_smb(struct smb_hdr *, int); | |||
| 43 | */ | 43 | */ |
| 44 | #ifdef CIFS_DEBUG | 44 | #ifdef CIFS_DEBUG |
| 45 | 45 | ||
| 46 | |||
| 47 | /* information message: e.g., configuration, major event */ | 46 | /* information message: e.g., configuration, major event */ |
| 48 | extern int cifsFYI; | 47 | extern int cifsFYI; |
| 49 | #define cifsfyi(format,arg...) if (cifsFYI & CIFS_INFO) printk(KERN_DEBUG " " __FILE__ ": " format "\n" "" , ## arg) | 48 | #define cifsfyi(fmt, arg...) \ |
| 49 | do { \ | ||
| 50 | if (cifsFYI & CIFS_INFO) \ | ||
| 51 | printk(KERN_DEBUG "%s: " fmt "\n", __FILE__, ##arg); \ | ||
| 52 | } while (0) | ||
| 50 | 53 | ||
| 51 | #define cFYI(button,prspec) if (button) cifsfyi prspec | 54 | #define cFYI(set, fmt, arg...) \ |
| 55 | do { \ | ||
| 56 | if (set) \ | ||
| 57 | cifsfyi(fmt, ##arg); \ | ||
| 58 | } while (0) | ||
| 52 | 59 | ||
| 53 | #define cifswarn(format, arg...) printk(KERN_WARNING ": " format "\n" , ## arg) | 60 | #define cifswarn(fmt, arg...) \ |
| 61 | printk(KERN_WARNING fmt "\n", ##arg) | ||
| 54 | 62 | ||
| 55 | /* debug event message: */ | 63 | /* debug event message: */ |
| 56 | extern int cifsERROR; | 64 | extern int cifsERROR; |
| 57 | 65 | ||
| 58 | #define cEVENT(format,arg...) if (cifsERROR) printk(KERN_EVENT __FILE__ ": " format "\n" , ## arg) | 66 | #define cEVENT(fmt, arg...) \ |
| 67 | do { \ | ||
| 68 | if (cifsERROR) \ | ||
| 69 | printk(KERN_EVENT "%s: " fmt "\n", __FILE__, ##arg); \ | ||
| 70 | } while (0) | ||
| 59 | 71 | ||
| 60 | /* error event message: e.g., i/o error */ | 72 | /* error event message: e.g., i/o error */ |
| 61 | #define cifserror(format,arg...) if (cifsERROR) printk(KERN_ERR " CIFS VFS: " format "\n" "" , ## arg) | 73 | #define cifserror(fmt, arg...) \ |
| 74 | do { \ | ||
| 75 | if (cifsERROR) \ | ||
| 76 | printk(KERN_ERR "CIFS VFS: " fmt "\n", ##arg); \ | ||
| 77 | } while (0) | ||
| 62 | 78 | ||
| 63 | #define cERROR(button, prspec) if (button) cifserror prspec | 79 | #define cERROR(set, fmt, arg...) \ |
| 80 | do { \ | ||
| 81 | if (set) \ | ||
| 82 | cifserror(fmt, ##arg); \ | ||
| 83 | } while (0) | ||
| 64 | 84 | ||
| 65 | /* | 85 | /* |
| 66 | * debug OFF | 86 | * debug OFF |
| 67 | * --------- | 87 | * --------- |
| 68 | */ | 88 | */ |
| 69 | #else /* _CIFS_DEBUG */ | 89 | #else /* _CIFS_DEBUG */ |
| 70 | #define cERROR(button, prspec) | 90 | #define cERROR(set, fmt, arg...) |
| 71 | #define cEVENT(format, arg...) | 91 | #define cEVENT(fmt, arg...) |
| 72 | #define cFYI(button, prspec) | 92 | #define cFYI(set, fmt, arg...) |
| 73 | #define cifserror(format, arg...) | 93 | #define cifserror(fmt, arg...) |
| 74 | #endif /* _CIFS_DEBUG */ | 94 | #endif /* _CIFS_DEBUG */ |
| 75 | 95 | ||
| 76 | #endif /* _H_CIFS_DEBUG */ | 96 | #endif /* _H_CIFS_DEBUG */ |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 78e4d2a3a68b..ac19a6f3dae0 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
| @@ -85,8 +85,8 @@ static char *cifs_get_share_name(const char *node_name) | |||
| 85 | /* find server name end */ | 85 | /* find server name end */ |
| 86 | pSep = memchr(UNC+2, '\\', len-2); | 86 | pSep = memchr(UNC+2, '\\', len-2); |
| 87 | if (!pSep) { | 87 | if (!pSep) { |
| 88 | cERROR(1, ("%s: no server name end in node name: %s", | 88 | cERROR(1, "%s: no server name end in node name: %s", |
| 89 | __func__, node_name)); | 89 | __func__, node_name); |
| 90 | kfree(UNC); | 90 | kfree(UNC); |
| 91 | return ERR_PTR(-EINVAL); | 91 | return ERR_PTR(-EINVAL); |
| 92 | } | 92 | } |
| @@ -142,8 +142,8 @@ char *cifs_compose_mount_options(const char *sb_mountdata, | |||
| 142 | 142 | ||
| 143 | rc = dns_resolve_server_name_to_ip(*devname, &srvIP); | 143 | rc = dns_resolve_server_name_to_ip(*devname, &srvIP); |
| 144 | if (rc != 0) { | 144 | if (rc != 0) { |
| 145 | cERROR(1, ("%s: Failed to resolve server part of %s to IP: %d", | 145 | cERROR(1, "%s: Failed to resolve server part of %s to IP: %d", |
| 146 | __func__, *devname, rc)); | 146 | __func__, *devname, rc); |
| 147 | goto compose_mount_options_err; | 147 | goto compose_mount_options_err; |
| 148 | } | 148 | } |
| 149 | /* md_len = strlen(...) + 12 for 'sep+prefixpath=' | 149 | /* md_len = strlen(...) + 12 for 'sep+prefixpath=' |
| @@ -217,8 +217,8 @@ char *cifs_compose_mount_options(const char *sb_mountdata, | |||
| 217 | strcat(mountdata, fullpath + ref->path_consumed); | 217 | strcat(mountdata, fullpath + ref->path_consumed); |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | /*cFYI(1,("%s: parent mountdata: %s", __func__,sb_mountdata));*/ | 220 | /*cFYI(1, "%s: parent mountdata: %s", __func__,sb_mountdata);*/ |
| 221 | /*cFYI(1, ("%s: submount mountdata: %s", __func__, mountdata ));*/ | 221 | /*cFYI(1, "%s: submount mountdata: %s", __func__, mountdata );*/ |
| 222 | 222 | ||
| 223 | compose_mount_options_out: | 223 | compose_mount_options_out: |
| 224 | kfree(srvIP); | 224 | kfree(srvIP); |
| @@ -294,11 +294,11 @@ static int add_mount_helper(struct vfsmount *newmnt, struct nameidata *nd, | |||
| 294 | 294 | ||
| 295 | static void dump_referral(const struct dfs_info3_param *ref) | 295 | static void dump_referral(const struct dfs_info3_param *ref) |
| 296 | { | 296 | { |
| 297 | cFYI(1, ("DFS: ref path: %s", ref->path_name)); | 297 | cFYI(1, "DFS: ref path: %s", ref->path_name); |
| 298 | cFYI(1, ("DFS: node path: %s", ref->node_name)); | 298 | cFYI(1, "DFS: node path: %s", ref->node_name); |
| 299 | cFYI(1, ("DFS: fl: %hd, srv_type: %hd", ref->flags, ref->server_type)); | 299 | cFYI(1, "DFS: fl: %hd, srv_type: %hd", ref->flags, ref->server_type); |
| 300 | cFYI(1, ("DFS: ref_flags: %hd, path_consumed: %hd", ref->ref_flag, | 300 | cFYI(1, "DFS: ref_flags: %hd, path_consumed: %hd", ref->ref_flag, |
| 301 | ref->path_consumed)); | 301 | ref->path_consumed); |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | 304 | ||
| @@ -314,7 +314,7 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
| 314 | int rc = 0; | 314 | int rc = 0; |
| 315 | struct vfsmount *mnt = ERR_PTR(-ENOENT); | 315 | struct vfsmount *mnt = ERR_PTR(-ENOENT); |
| 316 | 316 | ||
| 317 | cFYI(1, ("in %s", __func__)); | 317 | cFYI(1, "in %s", __func__); |
| 318 | BUG_ON(IS_ROOT(dentry)); | 318 | BUG_ON(IS_ROOT(dentry)); |
| 319 | 319 | ||
| 320 | xid = GetXid(); | 320 | xid = GetXid(); |
| @@ -352,15 +352,15 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
| 352 | /* connect to a node */ | 352 | /* connect to a node */ |
| 353 | len = strlen(referrals[i].node_name); | 353 | len = strlen(referrals[i].node_name); |
| 354 | if (len < 2) { | 354 | if (len < 2) { |
| 355 | cERROR(1, ("%s: Net Address path too short: %s", | 355 | cERROR(1, "%s: Net Address path too short: %s", |
| 356 | __func__, referrals[i].node_name)); | 356 | __func__, referrals[i].node_name); |
| 357 | rc = -EINVAL; | 357 | rc = -EINVAL; |
| 358 | goto out_err; | 358 | goto out_err; |
| 359 | } | 359 | } |
| 360 | mnt = cifs_dfs_do_refmount(nd->path.mnt, | 360 | mnt = cifs_dfs_do_refmount(nd->path.mnt, |
| 361 | nd->path.dentry, referrals + i); | 361 | nd->path.dentry, referrals + i); |
| 362 | cFYI(1, ("%s: cifs_dfs_do_refmount:%s , mnt:%p", __func__, | 362 | cFYI(1, "%s: cifs_dfs_do_refmount:%s , mnt:%p", __func__, |
| 363 | referrals[i].node_name, mnt)); | 363 | referrals[i].node_name, mnt); |
| 364 | 364 | ||
| 365 | /* complete mount procedure if we accured submount */ | 365 | /* complete mount procedure if we accured submount */ |
| 366 | if (!IS_ERR(mnt)) | 366 | if (!IS_ERR(mnt)) |
| @@ -378,7 +378,7 @@ out: | |||
| 378 | FreeXid(xid); | 378 | FreeXid(xid); |
| 379 | free_dfs_info_array(referrals, num_referrals); | 379 | free_dfs_info_array(referrals, num_referrals); |
| 380 | kfree(full_path); | 380 | kfree(full_path); |
| 381 | cFYI(1, ("leaving %s" , __func__)); | 381 | cFYI(1, "leaving %s" , __func__); |
| 382 | return ERR_PTR(rc); | 382 | return ERR_PTR(rc); |
| 383 | out_err: | 383 | out_err: |
| 384 | path_put(&nd->path); | 384 | path_put(&nd->path); |
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index 310d12f69a92..379bd7d9c05f 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
| @@ -133,9 +133,9 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo) | |||
| 133 | dp = description + strlen(description); | 133 | dp = description + strlen(description); |
| 134 | 134 | ||
| 135 | /* for now, only sec=krb5 and sec=mskrb5 are valid */ | 135 | /* for now, only sec=krb5 and sec=mskrb5 are valid */ |
| 136 | if (server->secType == Kerberos) | 136 | if (server->sec_kerberos) |
| 137 | sprintf(dp, ";sec=krb5"); | 137 | sprintf(dp, ";sec=krb5"); |
| 138 | else if (server->secType == MSKerberos) | 138 | else if (server->sec_mskerberos) |
| 139 | sprintf(dp, ";sec=mskrb5"); | 139 | sprintf(dp, ";sec=mskrb5"); |
| 140 | else | 140 | else |
| 141 | goto out; | 141 | goto out; |
| @@ -149,7 +149,7 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo) | |||
| 149 | dp = description + strlen(description); | 149 | dp = description + strlen(description); |
| 150 | sprintf(dp, ";pid=0x%x", current->pid); | 150 | sprintf(dp, ";pid=0x%x", current->pid); |
| 151 | 151 | ||
| 152 | cFYI(1, ("key description = %s", description)); | 152 | cFYI(1, "key description = %s", description); |
| 153 | spnego_key = request_key(&cifs_spnego_key_type, description, ""); | 153 | spnego_key = request_key(&cifs_spnego_key_type, description, ""); |
| 154 | 154 | ||
| 155 | #ifdef CONFIG_CIFS_DEBUG2 | 155 | #ifdef CONFIG_CIFS_DEBUG2 |
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index d07676bd76d2..430f510a1720 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
| @@ -200,9 +200,8 @@ cifs_strtoUCS(__le16 *to, const char *from, int len, | |||
| 200 | /* works for 2.4.0 kernel or later */ | 200 | /* works for 2.4.0 kernel or later */ |
| 201 | charlen = codepage->char2uni(from, len, &wchar_to[i]); | 201 | charlen = codepage->char2uni(from, len, &wchar_to[i]); |
| 202 | if (charlen < 1) { | 202 | if (charlen < 1) { |
| 203 | cERROR(1, | 203 | cERROR(1, "strtoUCS: char2uni of %d returned %d", |
| 204 | ("strtoUCS: char2uni of %d returned %d", | 204 | (int)*from, charlen); |
| 205 | (int)*from, charlen)); | ||
| 206 | /* A question mark */ | 205 | /* A question mark */ |
| 207 | to[i] = cpu_to_le16(0x003f); | 206 | to[i] = cpu_to_le16(0x003f); |
| 208 | charlen = 1; | 207 | charlen = 1; |
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index 9b716d044bbd..85d7cf7ff2c8 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
| @@ -87,11 +87,11 @@ int match_sid(struct cifs_sid *ctsid) | |||
| 87 | continue; /* all sub_auth values do not match */ | 87 | continue; /* all sub_auth values do not match */ |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | cFYI(1, ("matching sid: %s\n", wksidarr[i].sidname)); | 90 | cFYI(1, "matching sid: %s\n", wksidarr[i].sidname); |
| 91 | return 0; /* sids compare/match */ | 91 | return 0; /* sids compare/match */ |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | cFYI(1, ("No matching sid")); | 94 | cFYI(1, "No matching sid"); |
| 95 | return -1; | 95 | return -1; |
| 96 | } | 96 | } |
| 97 | 97 | ||
| @@ -208,14 +208,14 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, | |||
| 208 | *pbits_to_set &= ~S_IXUGO; | 208 | *pbits_to_set &= ~S_IXUGO; |
| 209 | return; | 209 | return; |
| 210 | } else if (type != ACCESS_ALLOWED) { | 210 | } else if (type != ACCESS_ALLOWED) { |
| 211 | cERROR(1, ("unknown access control type %d", type)); | 211 | cERROR(1, "unknown access control type %d", type); |
| 212 | return; | 212 | return; |
| 213 | } | 213 | } |
| 214 | /* else ACCESS_ALLOWED type */ | 214 | /* else ACCESS_ALLOWED type */ |
| 215 | 215 | ||
| 216 | if (flags & GENERIC_ALL) { | 216 | if (flags & GENERIC_ALL) { |
| 217 | *pmode |= (S_IRWXUGO & (*pbits_to_set)); | 217 | *pmode |= (S_IRWXUGO & (*pbits_to_set)); |
| 218 | cFYI(DBG2, ("all perms")); | 218 | cFYI(DBG2, "all perms"); |
| 219 | return; | 219 | return; |
| 220 | } | 220 | } |
| 221 | if ((flags & GENERIC_WRITE) || | 221 | if ((flags & GENERIC_WRITE) || |
| @@ -228,7 +228,7 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, | |||
| 228 | ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) | 228 | ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) |
| 229 | *pmode |= (S_IXUGO & (*pbits_to_set)); | 229 | *pmode |= (S_IXUGO & (*pbits_to_set)); |
| 230 | 230 | ||
| 231 | cFYI(DBG2, ("access flags 0x%x mode now 0x%x", flags, *pmode)); | 231 | cFYI(DBG2, "access flags 0x%x mode now 0x%x", flags, *pmode); |
| 232 | return; | 232 | return; |
| 233 | } | 233 | } |
| 234 | 234 | ||
| @@ -257,7 +257,7 @@ static void mode_to_access_flags(umode_t mode, umode_t bits_to_use, | |||
| 257 | if (mode & S_IXUGO) | 257 | if (mode & S_IXUGO) |
| 258 | *pace_flags |= SET_FILE_EXEC_RIGHTS; | 258 | *pace_flags |= SET_FILE_EXEC_RIGHTS; |
| 259 | 259 | ||
| 260 | cFYI(DBG2, ("mode: 0x%x, access flags now 0x%x", mode, *pace_flags)); | 260 | cFYI(DBG2, "mode: 0x%x, access flags now 0x%x", mode, *pace_flags); |
| 261 | return; | 261 | return; |
| 262 | } | 262 | } |
| 263 | 263 | ||
| @@ -297,24 +297,24 @@ static void dump_ace(struct cifs_ace *pace, char *end_of_acl) | |||
| 297 | /* validate that we do not go past end of acl */ | 297 | /* validate that we do not go past end of acl */ |
| 298 | 298 | ||
| 299 | if (le16_to_cpu(pace->size) < 16) { | 299 | if (le16_to_cpu(pace->size) < 16) { |
| 300 | cERROR(1, ("ACE too small, %d", le16_to_cpu(pace->size))); | 300 | cERROR(1, "ACE too small %d", le16_to_cpu(pace->size)); |
| 301 | return; | 301 | return; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | if (end_of_acl < (char *)pace + le16_to_cpu(pace->size)) { | 304 | if (end_of_acl < (char *)pace + le16_to_cpu(pace->size)) { |
| 305 | cERROR(1, ("ACL too small to parse ACE")); | 305 | cERROR(1, "ACL too small to parse ACE"); |
| 306 | return; | 306 | return; |
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | num_subauth = pace->sid.num_subauth; | 309 | num_subauth = pace->sid.num_subauth; |
| 310 | if (num_subauth) { | 310 | if (num_subauth) { |
| 311 | int i; | 311 | int i; |
| 312 | cFYI(1, ("ACE revision %d num_auth %d type %d flags %d size %d", | 312 | cFYI(1, "ACE revision %d num_auth %d type %d flags %d size %d", |
| 313 | pace->sid.revision, pace->sid.num_subauth, pace->type, | 313 | pace->sid.revision, pace->sid.num_subauth, pace->type, |
| 314 | pace->flags, le16_to_cpu(pace->size))); | 314 | pace->flags, le16_to_cpu(pace->size)); |
| 315 | for (i = 0; i < num_subauth; ++i) { | 315 | for (i = 0; i < num_subauth; ++i) { |
| 316 | cFYI(1, ("ACE sub_auth[%d]: 0x%x", i, | 316 | cFYI(1, "ACE sub_auth[%d]: 0x%x", i, |
| 317 | le32_to_cpu(pace->sid.sub_auth[i]))); | 317 | le32_to_cpu(pace->sid.sub_auth[i])); |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | /* BB add length check to make sure that we do not have huge | 320 | /* BB add length check to make sure that we do not have huge |
| @@ -347,13 +347,13 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, | |||
| 347 | 347 | ||
| 348 | /* validate that we do not go past end of acl */ | 348 | /* validate that we do not go past end of acl */ |
| 349 | if (end_of_acl < (char *)pdacl + le16_to_cpu(pdacl->size)) { | 349 | if (end_of_acl < (char *)pdacl + le16_to_cpu(pdacl->size)) { |
| 350 | cERROR(1, ("ACL too small to parse DACL")); | 350 | cERROR(1, "ACL too small to parse DACL"); |
| 351 | return; | 351 | return; |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | cFYI(DBG2, ("DACL revision %d size %d num aces %d", | 354 | cFYI(DBG2, "DACL revision %d size %d num aces %d", |
| 355 | le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size), | 355 | le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size), |
| 356 | le32_to_cpu(pdacl->num_aces))); | 356 | le32_to_cpu(pdacl->num_aces)); |
| 357 | 357 | ||
| 358 | /* reset rwx permissions for user/group/other. | 358 | /* reset rwx permissions for user/group/other. |
| 359 | Also, if num_aces is 0 i.e. DACL has no ACEs, | 359 | Also, if num_aces is 0 i.e. DACL has no ACEs, |
| @@ -437,25 +437,25 @@ static int parse_sid(struct cifs_sid *psid, char *end_of_acl) | |||
| 437 | /* validate that we do not go past end of ACL - sid must be at least 8 | 437 | /* validate that we do not go past end of ACL - sid must be at least 8 |
| 438 | bytes long (assuming no sub-auths - e.g. the null SID */ | 438 | bytes long (assuming no sub-auths - e.g. the null SID */ |
| 439 | if (end_of_acl < (char *)psid + 8) { | 439 | if (end_of_acl < (char *)psid + 8) { |
| 440 | cERROR(1, ("ACL too small to parse SID %p", psid)); | 440 | cERROR(1, "ACL too small to parse SID %p", psid); |
| 441 | return -EINVAL; | 441 | return -EINVAL; |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | if (psid->num_subauth) { | 444 | if (psid->num_subauth) { |
| 445 | #ifdef CONFIG_CIFS_DEBUG2 | 445 | #ifdef CONFIG_CIFS_DEBUG2 |
| 446 | int i; | 446 | int i; |
| 447 | cFYI(1, ("SID revision %d num_auth %d", | 447 | cFYI(1, "SID revision %d num_auth %d", |
| 448 | psid->revision, psid->num_subauth)); | 448 | psid->revision, psid->num_subauth); |
| 449 | 449 | ||
| 450 | for (i = 0; i < psid->num_subauth; i++) { | 450 | for (i = 0; i < psid->num_subauth; i++) { |
| 451 | cFYI(1, ("SID sub_auth[%d]: 0x%x ", i, | 451 | cFYI(1, "SID sub_auth[%d]: 0x%x ", i, |
| 452 | le32_to_cpu(psid->sub_auth[i]))); | 452 | le32_to_cpu(psid->sub_auth[i])); |
| 453 | } | 453 | } |
| 454 | 454 | ||
| 455 | /* BB add length check to make sure that we do not have huge | 455 | /* BB add length check to make sure that we do not have huge |
| 456 | num auths and therefore go off the end */ | 456 | num auths and therefore go off the end */ |
| 457 | cFYI(1, ("RID 0x%x", | 457 | cFYI(1, "RID 0x%x", |
| 458 | le32_to_cpu(psid->sub_auth[psid->num_subauth-1]))); | 458 | le32_to_cpu(psid->sub_auth[psid->num_subauth-1])); |
| 459 | #endif | 459 | #endif |
| 460 | } | 460 | } |
| 461 | 461 | ||
| @@ -482,11 +482,11 @@ static int parse_sec_desc(struct cifs_ntsd *pntsd, int acl_len, | |||
| 482 | le32_to_cpu(pntsd->gsidoffset)); | 482 | le32_to_cpu(pntsd->gsidoffset)); |
| 483 | dacloffset = le32_to_cpu(pntsd->dacloffset); | 483 | dacloffset = le32_to_cpu(pntsd->dacloffset); |
| 484 | dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); | 484 | dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); |
| 485 | cFYI(DBG2, ("revision %d type 0x%x ooffset 0x%x goffset 0x%x " | 485 | cFYI(DBG2, "revision %d type 0x%x ooffset 0x%x goffset 0x%x " |
| 486 | "sacloffset 0x%x dacloffset 0x%x", | 486 | "sacloffset 0x%x dacloffset 0x%x", |
| 487 | pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset), | 487 | pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset), |
| 488 | le32_to_cpu(pntsd->gsidoffset), | 488 | le32_to_cpu(pntsd->gsidoffset), |
| 489 | le32_to_cpu(pntsd->sacloffset), dacloffset)); | 489 | le32_to_cpu(pntsd->sacloffset), dacloffset); |
| 490 | /* cifs_dump_mem("owner_sid: ", owner_sid_ptr, 64); */ | 490 | /* cifs_dump_mem("owner_sid: ", owner_sid_ptr, 64); */ |
| 491 | rc = parse_sid(owner_sid_ptr, end_of_acl); | 491 | rc = parse_sid(owner_sid_ptr, end_of_acl); |
| 492 | if (rc) | 492 | if (rc) |
| @@ -500,7 +500,7 @@ static int parse_sec_desc(struct cifs_ntsd *pntsd, int acl_len, | |||
| 500 | parse_dacl(dacl_ptr, end_of_acl, owner_sid_ptr, | 500 | parse_dacl(dacl_ptr, end_of_acl, owner_sid_ptr, |
| 501 | group_sid_ptr, fattr); | 501 | group_sid_ptr, fattr); |
| 502 | else | 502 | else |
| 503 | cFYI(1, ("no ACL")); /* BB grant all or default perms? */ | 503 | cFYI(1, "no ACL"); /* BB grant all or default perms? */ |
| 504 | 504 | ||
| 505 | /* cifscred->uid = owner_sid_ptr->rid; | 505 | /* cifscred->uid = owner_sid_ptr->rid; |
| 506 | cifscred->gid = group_sid_ptr->rid; | 506 | cifscred->gid = group_sid_ptr->rid; |
| @@ -563,7 +563,7 @@ static struct cifs_ntsd *get_cifs_acl_by_fid(struct cifs_sb_info *cifs_sb, | |||
| 563 | FreeXid(xid); | 563 | FreeXid(xid); |
| 564 | 564 | ||
| 565 | 565 | ||
| 566 | cFYI(1, ("GetCIFSACL rc = %d ACL len %d", rc, *pacllen)); | 566 | cFYI(1, "GetCIFSACL rc = %d ACL len %d", rc, *pacllen); |
| 567 | return pntsd; | 567 | return pntsd; |
| 568 | } | 568 | } |
| 569 | 569 | ||
| @@ -581,12 +581,12 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, | |||
| 581 | &fid, &oplock, NULL, cifs_sb->local_nls, | 581 | &fid, &oplock, NULL, cifs_sb->local_nls, |
| 582 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 582 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 583 | if (rc) { | 583 | if (rc) { |
| 584 | cERROR(1, ("Unable to open file to get ACL")); | 584 | cERROR(1, "Unable to open file to get ACL"); |
| 585 | goto out; | 585 | goto out; |
| 586 | } | 586 | } |
| 587 | 587 | ||
| 588 | rc = CIFSSMBGetCIFSACL(xid, cifs_sb->tcon, fid, &pntsd, pacllen); | 588 | rc = CIFSSMBGetCIFSACL(xid, cifs_sb->tcon, fid, &pntsd, pacllen); |
| 589 | cFYI(1, ("GetCIFSACL rc = %d ACL len %d", rc, *pacllen)); | 589 | cFYI(1, "GetCIFSACL rc = %d ACL len %d", rc, *pacllen); |
| 590 | 590 | ||
| 591 | CIFSSMBClose(xid, cifs_sb->tcon, fid); | 591 | CIFSSMBClose(xid, cifs_sb->tcon, fid); |
| 592 | out: | 592 | out: |
| @@ -621,7 +621,7 @@ static int set_cifs_acl_by_fid(struct cifs_sb_info *cifs_sb, __u16 fid, | |||
| 621 | rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen); | 621 | rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen); |
| 622 | FreeXid(xid); | 622 | FreeXid(xid); |
| 623 | 623 | ||
| 624 | cFYI(DBG2, ("SetCIFSACL rc = %d", rc)); | 624 | cFYI(DBG2, "SetCIFSACL rc = %d", rc); |
| 625 | return rc; | 625 | return rc; |
| 626 | } | 626 | } |
| 627 | 627 | ||
| @@ -638,12 +638,12 @@ static int set_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, const char *path, | |||
| 638 | &fid, &oplock, NULL, cifs_sb->local_nls, | 638 | &fid, &oplock, NULL, cifs_sb->local_nls, |
| 639 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 639 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 640 | if (rc) { | 640 | if (rc) { |
| 641 | cERROR(1, ("Unable to open file to set ACL")); | 641 | cERROR(1, "Unable to open file to set ACL"); |
| 642 | goto out; | 642 | goto out; |
| 643 | } | 643 | } |
| 644 | 644 | ||
| 645 | rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen); | 645 | rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen); |
| 646 | cFYI(DBG2, ("SetCIFSACL rc = %d", rc)); | 646 | cFYI(DBG2, "SetCIFSACL rc = %d", rc); |
| 647 | 647 | ||
| 648 | CIFSSMBClose(xid, cifs_sb->tcon, fid); | 648 | CIFSSMBClose(xid, cifs_sb->tcon, fid); |
| 649 | out: | 649 | out: |
| @@ -659,7 +659,7 @@ static int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen, | |||
| 659 | struct cifsFileInfo *open_file; | 659 | struct cifsFileInfo *open_file; |
| 660 | int rc; | 660 | int rc; |
| 661 | 661 | ||
| 662 | cFYI(DBG2, ("set ACL for %s from mode 0x%x", path, inode->i_mode)); | 662 | cFYI(DBG2, "set ACL for %s from mode 0x%x", path, inode->i_mode); |
| 663 | 663 | ||
| 664 | open_file = find_readable_file(CIFS_I(inode)); | 664 | open_file = find_readable_file(CIFS_I(inode)); |
| 665 | if (!open_file) | 665 | if (!open_file) |
| @@ -679,7 +679,7 @@ cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr, | |||
| 679 | u32 acllen = 0; | 679 | u32 acllen = 0; |
| 680 | int rc = 0; | 680 | int rc = 0; |
| 681 | 681 | ||
| 682 | cFYI(DBG2, ("converting ACL to mode for %s", path)); | 682 | cFYI(DBG2, "converting ACL to mode for %s", path); |
| 683 | 683 | ||
| 684 | if (pfid) | 684 | if (pfid) |
| 685 | pntsd = get_cifs_acl_by_fid(cifs_sb, *pfid, &acllen); | 685 | pntsd = get_cifs_acl_by_fid(cifs_sb, *pfid, &acllen); |
| @@ -690,7 +690,7 @@ cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr, | |||
| 690 | if (pntsd) | 690 | if (pntsd) |
| 691 | rc = parse_sec_desc(pntsd, acllen, fattr); | 691 | rc = parse_sec_desc(pntsd, acllen, fattr); |
| 692 | if (rc) | 692 | if (rc) |
| 693 | cFYI(1, ("parse sec desc failed rc = %d", rc)); | 693 | cFYI(1, "parse sec desc failed rc = %d", rc); |
| 694 | 694 | ||
| 695 | kfree(pntsd); | 695 | kfree(pntsd); |
| 696 | return; | 696 | return; |
| @@ -704,7 +704,7 @@ int mode_to_acl(struct inode *inode, const char *path, __u64 nmode) | |||
| 704 | struct cifs_ntsd *pntsd = NULL; /* acl obtained from server */ | 704 | struct cifs_ntsd *pntsd = NULL; /* acl obtained from server */ |
| 705 | struct cifs_ntsd *pnntsd = NULL; /* modified acl to be sent to server */ | 705 | struct cifs_ntsd *pnntsd = NULL; /* modified acl to be sent to server */ |
| 706 | 706 | ||
| 707 | cFYI(DBG2, ("set ACL from mode for %s", path)); | 707 | cFYI(DBG2, "set ACL from mode for %s", path); |
| 708 | 708 | ||
| 709 | /* Get the security descriptor */ | 709 | /* Get the security descriptor */ |
| 710 | pntsd = get_cifs_acl(CIFS_SB(inode->i_sb), inode, path, &secdesclen); | 710 | pntsd = get_cifs_acl(CIFS_SB(inode->i_sb), inode, path, &secdesclen); |
| @@ -721,19 +721,19 @@ int mode_to_acl(struct inode *inode, const char *path, __u64 nmode) | |||
| 721 | DEFSECDESCLEN : secdesclen; | 721 | DEFSECDESCLEN : secdesclen; |
| 722 | pnntsd = kmalloc(secdesclen, GFP_KERNEL); | 722 | pnntsd = kmalloc(secdesclen, GFP_KERNEL); |
| 723 | if (!pnntsd) { | 723 | if (!pnntsd) { |
| 724 | cERROR(1, ("Unable to allocate security descriptor")); | 724 | cERROR(1, "Unable to allocate security descriptor"); |
| 725 | kfree(pntsd); | 725 | kfree(pntsd); |
| 726 | return -ENOMEM; | 726 | return -ENOMEM; |
| 727 | } | 727 | } |
| 728 | 728 | ||
| 729 | rc = build_sec_desc(pntsd, pnntsd, inode, nmode); | 729 | rc = build_sec_desc(pntsd, pnntsd, inode, nmode); |
| 730 | 730 | ||
| 731 | cFYI(DBG2, ("build_sec_desc rc: %d", rc)); | 731 | cFYI(DBG2, "build_sec_desc rc: %d", rc); |
| 732 | 732 | ||
| 733 | if (!rc) { | 733 | if (!rc) { |
| 734 | /* Set the security descriptor */ | 734 | /* Set the security descriptor */ |
| 735 | rc = set_cifs_acl(pnntsd, secdesclen, inode, path); | 735 | rc = set_cifs_acl(pnntsd, secdesclen, inode, path); |
| 736 | cFYI(DBG2, ("set_cifs_acl rc: %d", rc)); | 736 | cFYI(DBG2, "set_cifs_acl rc: %d", rc); |
| 737 | } | 737 | } |
| 738 | 738 | ||
| 739 | kfree(pnntsd); | 739 | kfree(pnntsd); |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index fbe986430d0c..847628dfdc44 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
| @@ -103,7 +103,7 @@ static int cifs_calc_signature2(const struct kvec *iov, int n_vec, | |||
| 103 | if (iov[i].iov_len == 0) | 103 | if (iov[i].iov_len == 0) |
| 104 | continue; | 104 | continue; |
| 105 | if (iov[i].iov_base == NULL) { | 105 | if (iov[i].iov_base == NULL) { |
| 106 | cERROR(1, ("null iovec entry")); | 106 | cERROR(1, "null iovec entry"); |
| 107 | return -EIO; | 107 | return -EIO; |
| 108 | } | 108 | } |
| 109 | /* The first entry includes a length field (which does not get | 109 | /* The first entry includes a length field (which does not get |
| @@ -181,8 +181,8 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu, | |||
| 181 | 181 | ||
| 182 | /* Do not need to verify session setups with signature "BSRSPYL " */ | 182 | /* Do not need to verify session setups with signature "BSRSPYL " */ |
| 183 | if (memcmp(cifs_pdu->Signature.SecuritySignature, "BSRSPYL ", 8) == 0) | 183 | if (memcmp(cifs_pdu->Signature.SecuritySignature, "BSRSPYL ", 8) == 0) |
| 184 | cFYI(1, ("dummy signature received for smb command 0x%x", | 184 | cFYI(1, "dummy signature received for smb command 0x%x", |
| 185 | cifs_pdu->Command)); | 185 | cifs_pdu->Command); |
| 186 | 186 | ||
| 187 | /* save off the origiginal signature so we can modify the smb and check | 187 | /* save off the origiginal signature so we can modify the smb and check |
| 188 | its signature against what the server sent */ | 188 | its signature against what the server sent */ |
| @@ -291,7 +291,7 @@ void calc_lanman_hash(const char *password, const char *cryptkey, bool encrypt, | |||
| 291 | if (password) | 291 | if (password) |
| 292 | strncpy(password_with_pad, password, CIFS_ENCPWD_SIZE); | 292 | strncpy(password_with_pad, password, CIFS_ENCPWD_SIZE); |
| 293 | 293 | ||
| 294 | if (!encrypt && extended_security & CIFSSEC_MAY_PLNTXT) { | 294 | if (!encrypt && global_secflags & CIFSSEC_MAY_PLNTXT) { |
| 295 | memset(lnm_session_key, 0, CIFS_SESS_KEY_SIZE); | 295 | memset(lnm_session_key, 0, CIFS_SESS_KEY_SIZE); |
| 296 | memcpy(lnm_session_key, password_with_pad, | 296 | memcpy(lnm_session_key, password_with_pad, |
| 297 | CIFS_ENCPWD_SIZE); | 297 | CIFS_ENCPWD_SIZE); |
| @@ -398,7 +398,7 @@ void setup_ntlmv2_rsp(struct cifsSesInfo *ses, char *resp_buf, | |||
| 398 | /* calculate buf->ntlmv2_hash */ | 398 | /* calculate buf->ntlmv2_hash */ |
| 399 | rc = calc_ntlmv2_hash(ses, nls_cp); | 399 | rc = calc_ntlmv2_hash(ses, nls_cp); |
| 400 | if (rc) | 400 | if (rc) |
| 401 | cERROR(1, ("could not get v2 hash rc %d", rc)); | 401 | cERROR(1, "could not get v2 hash rc %d", rc); |
| 402 | CalcNTLMv2_response(ses, resp_buf); | 402 | CalcNTLMv2_response(ses, resp_buf); |
| 403 | 403 | ||
| 404 | /* now calculate the MAC key for NTLMv2 */ | 404 | /* now calculate the MAC key for NTLMv2 */ |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index ad235d604a0b..78c02eb4cb1f 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -49,10 +49,6 @@ | |||
| 49 | #include "cifs_spnego.h" | 49 | #include "cifs_spnego.h" |
| 50 | #define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */ | 50 | #define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */ |
| 51 | 51 | ||
| 52 | #ifdef CONFIG_CIFS_QUOTA | ||
| 53 | static const struct quotactl_ops cifs_quotactl_ops; | ||
| 54 | #endif /* QUOTA */ | ||
| 55 | |||
| 56 | int cifsFYI = 0; | 52 | int cifsFYI = 0; |
| 57 | int cifsERROR = 1; | 53 | int cifsERROR = 1; |
| 58 | int traceSMB = 0; | 54 | int traceSMB = 0; |
| @@ -61,7 +57,7 @@ unsigned int experimEnabled = 0; | |||
| 61 | unsigned int linuxExtEnabled = 1; | 57 | unsigned int linuxExtEnabled = 1; |
| 62 | unsigned int lookupCacheEnabled = 1; | 58 | unsigned int lookupCacheEnabled = 1; |
| 63 | unsigned int multiuser_mount = 0; | 59 | unsigned int multiuser_mount = 0; |
| 64 | unsigned int extended_security = CIFSSEC_DEF; | 60 | unsigned int global_secflags = CIFSSEC_DEF; |
| 65 | /* unsigned int ntlmv2_support = 0; */ | 61 | /* unsigned int ntlmv2_support = 0; */ |
| 66 | unsigned int sign_CIFS_PDUs = 1; | 62 | unsigned int sign_CIFS_PDUs = 1; |
| 67 | static const struct super_operations cifs_super_ops; | 63 | static const struct super_operations cifs_super_ops; |
| @@ -86,8 +82,6 @@ extern mempool_t *cifs_sm_req_poolp; | |||
| 86 | extern mempool_t *cifs_req_poolp; | 82 | extern mempool_t *cifs_req_poolp; |
| 87 | extern mempool_t *cifs_mid_poolp; | 83 | extern mempool_t *cifs_mid_poolp; |
| 88 | 84 | ||
| 89 | extern struct kmem_cache *cifs_oplock_cachep; | ||
| 90 | |||
| 91 | static int | 85 | static int |
| 92 | cifs_read_super(struct super_block *sb, void *data, | 86 | cifs_read_super(struct super_block *sb, void *data, |
| 93 | const char *devname, int silent) | 87 | const char *devname, int silent) |
| @@ -135,8 +129,7 @@ cifs_read_super(struct super_block *sb, void *data, | |||
| 135 | 129 | ||
| 136 | if (rc) { | 130 | if (rc) { |
| 137 | if (!silent) | 131 | if (!silent) |
| 138 | cERROR(1, | 132 | cERROR(1, "cifs_mount failed w/return code = %d", rc); |
| 139 | ("cifs_mount failed w/return code = %d", rc)); | ||
| 140 | goto out_mount_failed; | 133 | goto out_mount_failed; |
| 141 | } | 134 | } |
| 142 | 135 | ||
| @@ -146,9 +139,6 @@ cifs_read_super(struct super_block *sb, void *data, | |||
| 146 | /* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512) | 139 | /* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512) |
| 147 | sb->s_blocksize = | 140 | sb->s_blocksize = |
| 148 | cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */ | 141 | cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */ |
| 149 | #ifdef CONFIG_CIFS_QUOTA | ||
| 150 | sb->s_qcop = &cifs_quotactl_ops; | ||
| 151 | #endif | ||
| 152 | sb->s_blocksize = CIFS_MAX_MSGSIZE; | 142 | sb->s_blocksize = CIFS_MAX_MSGSIZE; |
| 153 | sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */ | 143 | sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */ |
| 154 | inode = cifs_root_iget(sb, ROOT_I); | 144 | inode = cifs_root_iget(sb, ROOT_I); |
| @@ -168,7 +158,7 @@ cifs_read_super(struct super_block *sb, void *data, | |||
| 168 | 158 | ||
| 169 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 159 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
| 170 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { | 160 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { |
| 171 | cFYI(1, ("export ops supported")); | 161 | cFYI(1, "export ops supported"); |
| 172 | sb->s_export_op = &cifs_export_ops; | 162 | sb->s_export_op = &cifs_export_ops; |
| 173 | } | 163 | } |
| 174 | #endif /* EXPERIMENTAL */ | 164 | #endif /* EXPERIMENTAL */ |
| @@ -176,7 +166,7 @@ cifs_read_super(struct super_block *sb, void *data, | |||
| 176 | return 0; | 166 | return 0; |
| 177 | 167 | ||
| 178 | out_no_root: | 168 | out_no_root: |
| 179 | cERROR(1, ("cifs_read_super: get root inode failed")); | 169 | cERROR(1, "cifs_read_super: get root inode failed"); |
| 180 | if (inode) | 170 | if (inode) |
| 181 | iput(inode); | 171 | iput(inode); |
| 182 | 172 | ||
| @@ -203,10 +193,10 @@ cifs_put_super(struct super_block *sb) | |||
| 203 | int rc = 0; | 193 | int rc = 0; |
| 204 | struct cifs_sb_info *cifs_sb; | 194 | struct cifs_sb_info *cifs_sb; |
| 205 | 195 | ||
| 206 | cFYI(1, ("In cifs_put_super")); | 196 | cFYI(1, "In cifs_put_super"); |
| 207 | cifs_sb = CIFS_SB(sb); | 197 | cifs_sb = CIFS_SB(sb); |
| 208 | if (cifs_sb == NULL) { | 198 | if (cifs_sb == NULL) { |
| 209 | cFYI(1, ("Empty cifs superblock info passed to unmount")); | 199 | cFYI(1, "Empty cifs superblock info passed to unmount"); |
| 210 | return; | 200 | return; |
| 211 | } | 201 | } |
| 212 | 202 | ||
| @@ -214,7 +204,7 @@ cifs_put_super(struct super_block *sb) | |||
| 214 | 204 | ||
| 215 | rc = cifs_umount(sb, cifs_sb); | 205 | rc = cifs_umount(sb, cifs_sb); |
| 216 | if (rc) | 206 | if (rc) |
| 217 | cERROR(1, ("cifs_umount failed with return code %d", rc)); | 207 | cERROR(1, "cifs_umount failed with return code %d", rc); |
| 218 | #ifdef CONFIG_CIFS_DFS_UPCALL | 208 | #ifdef CONFIG_CIFS_DFS_UPCALL |
| 219 | if (cifs_sb->mountdata) { | 209 | if (cifs_sb->mountdata) { |
| 220 | kfree(cifs_sb->mountdata); | 210 | kfree(cifs_sb->mountdata); |
| @@ -300,7 +290,6 @@ static int cifs_permission(struct inode *inode, int mask) | |||
| 300 | static struct kmem_cache *cifs_inode_cachep; | 290 | static struct kmem_cache *cifs_inode_cachep; |
| 301 | static struct kmem_cache *cifs_req_cachep; | 291 | static struct kmem_cache *cifs_req_cachep; |
| 302 | static struct kmem_cache *cifs_mid_cachep; | 292 | static struct kmem_cache *cifs_mid_cachep; |
| 303 | struct kmem_cache *cifs_oplock_cachep; | ||
| 304 | static struct kmem_cache *cifs_sm_req_cachep; | 293 | static struct kmem_cache *cifs_sm_req_cachep; |
| 305 | mempool_t *cifs_sm_req_poolp; | 294 | mempool_t *cifs_sm_req_poolp; |
| 306 | mempool_t *cifs_req_poolp; | 295 | mempool_t *cifs_req_poolp; |
| @@ -432,106 +421,6 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m) | |||
| 432 | return 0; | 421 | return 0; |
| 433 | } | 422 | } |
| 434 | 423 | ||
| 435 | #ifdef CONFIG_CIFS_QUOTA | ||
| 436 | int cifs_xquota_set(struct super_block *sb, int quota_type, qid_t qid, | ||
| 437 | struct fs_disk_quota *pdquota) | ||
| 438 | { | ||
| 439 | int xid; | ||
| 440 | int rc = 0; | ||
| 441 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | ||
| 442 | struct cifsTconInfo *pTcon; | ||
| 443 | |||
| 444 | if (cifs_sb) | ||
| 445 | pTcon = cifs_sb->tcon; | ||
| 446 | else | ||
| 447 | return -EIO; | ||
| 448 | |||
| 449 | |||
| 450 | xid = GetXid(); | ||
| 451 | if (pTcon) { | ||
| 452 | cFYI(1, ("set type: 0x%x id: %d", quota_type, qid)); | ||
| 453 | } else | ||
| 454 | rc = -EIO; | ||
| 455 | |||
| 456 | FreeXid(xid); | ||
| 457 | return rc; | ||
| 458 | } | ||
| 459 | |||
| 460 | int cifs_xquota_get(struct super_block *sb, int quota_type, qid_t qid, | ||
| 461 | struct fs_disk_quota *pdquota) | ||
| 462 | { | ||
| 463 | int xid; | ||
| 464 | int rc = 0; | ||
| 465 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | ||
| 466 | struct cifsTconInfo *pTcon; | ||
| 467 | |||
| 468 | if (cifs_sb) | ||
| 469 | pTcon = cifs_sb->tcon; | ||
| 470 | else | ||
| 471 | return -EIO; | ||
| 472 | |||
| 473 | xid = GetXid(); | ||
| 474 | if (pTcon) { | ||
| 475 | cFYI(1, ("set type: 0x%x id: %d", quota_type, qid)); | ||
| 476 | } else | ||
| 477 | rc = -EIO; | ||
| 478 | |||
| 479 | FreeXid(xid); | ||
| 480 | return rc; | ||
| 481 | } | ||
| 482 | |||
| 483 | int cifs_xstate_set(struct super_block *sb, unsigned int flags, int operation) | ||
| 484 | { | ||
| 485 | int xid; | ||
| 486 | int rc = 0; | ||
| 487 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | ||
| 488 | struct cifsTconInfo *pTcon; | ||
| 489 | |||
| 490 | if (cifs_sb) | ||
| 491 | pTcon = cifs_sb->tcon; | ||
| 492 | else | ||
| 493 | return -EIO; | ||
| 494 | |||
| 495 | xid = GetXid(); | ||
| 496 | if (pTcon) { | ||
| 497 | cFYI(1, ("flags: 0x%x operation: 0x%x", flags, operation)); | ||
| 498 | } else | ||
| 499 | rc = -EIO; | ||
| 500 | |||
| 501 | FreeXid(xid); | ||
| 502 | return rc; | ||
| 503 | } | ||
| 504 | |||
| 505 | int cifs_xstate_get(struct super_block *sb, struct fs_quota_stat *qstats) | ||
| 506 | { | ||
| 507 | int xid; | ||
| 508 | int rc = 0; | ||
| 509 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | ||
| 510 | struct cifsTconInfo *pTcon; | ||
| 511 | |||
| 512 | if (cifs_sb) | ||
| 513 | pTcon = cifs_sb->tcon; | ||
| 514 | else | ||
| 515 | return -EIO; | ||
| 516 | |||
| 517 | xid = GetXid(); | ||
| 518 | if (pTcon) { | ||
| 519 | cFYI(1, ("pqstats %p", qstats)); | ||
| 520 | } else | ||
| 521 | rc = -EIO; | ||
| 522 | |||
| 523 | FreeXid(xid); | ||
| 524 | return rc; | ||
| 525 | } | ||
| 526 | |||
| 527 | static const struct quotactl_ops cifs_quotactl_ops = { | ||
| 528 | .set_xquota = cifs_xquota_set, | ||
| 529 | .get_xquota = cifs_xquota_get, | ||
| 530 | .set_xstate = cifs_xstate_set, | ||
| 531 | .get_xstate = cifs_xstate_get, | ||
| 532 | }; | ||
| 533 | #endif | ||
| 534 | |||
| 535 | static void cifs_umount_begin(struct super_block *sb) | 424 | static void cifs_umount_begin(struct super_block *sb) |
| 536 | { | 425 | { |
| 537 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | 426 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
| @@ -558,7 +447,7 @@ static void cifs_umount_begin(struct super_block *sb) | |||
| 558 | /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ | 447 | /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ |
| 559 | /* cancel_notify_requests(tcon); */ | 448 | /* cancel_notify_requests(tcon); */ |
| 560 | if (tcon->ses && tcon->ses->server) { | 449 | if (tcon->ses && tcon->ses->server) { |
| 561 | cFYI(1, ("wake up tasks now - umount begin not complete")); | 450 | cFYI(1, "wake up tasks now - umount begin not complete"); |
| 562 | wake_up_all(&tcon->ses->server->request_q); | 451 | wake_up_all(&tcon->ses->server->request_q); |
| 563 | wake_up_all(&tcon->ses->server->response_q); | 452 | wake_up_all(&tcon->ses->server->response_q); |
| 564 | msleep(1); /* yield */ | 453 | msleep(1); /* yield */ |
| @@ -609,7 +498,7 @@ cifs_get_sb(struct file_system_type *fs_type, | |||
| 609 | int rc; | 498 | int rc; |
| 610 | struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL); | 499 | struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL); |
| 611 | 500 | ||
| 612 | cFYI(1, ("Devname: %s flags: %d ", dev_name, flags)); | 501 | cFYI(1, "Devname: %s flags: %d ", dev_name, flags); |
| 613 | 502 | ||
| 614 | if (IS_ERR(sb)) | 503 | if (IS_ERR(sb)) |
| 615 | return PTR_ERR(sb); | 504 | return PTR_ERR(sb); |
| @@ -656,7 +545,6 @@ static loff_t cifs_llseek(struct file *file, loff_t offset, int origin) | |||
| 656 | return generic_file_llseek_unlocked(file, offset, origin); | 545 | return generic_file_llseek_unlocked(file, offset, origin); |
| 657 | } | 546 | } |
| 658 | 547 | ||
| 659 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 660 | static int cifs_setlease(struct file *file, long arg, struct file_lock **lease) | 548 | static int cifs_setlease(struct file *file, long arg, struct file_lock **lease) |
| 661 | { | 549 | { |
| 662 | /* note that this is called by vfs setlease with the BKL held | 550 | /* note that this is called by vfs setlease with the BKL held |
| @@ -685,7 +573,6 @@ static int cifs_setlease(struct file *file, long arg, struct file_lock **lease) | |||
| 685 | else | 573 | else |
| 686 | return -EAGAIN; | 574 | return -EAGAIN; |
| 687 | } | 575 | } |
| 688 | #endif | ||
| 689 | 576 | ||
| 690 | struct file_system_type cifs_fs_type = { | 577 | struct file_system_type cifs_fs_type = { |
| 691 | .owner = THIS_MODULE, | 578 | .owner = THIS_MODULE, |
| @@ -762,10 +649,7 @@ const struct file_operations cifs_file_ops = { | |||
| 762 | #ifdef CONFIG_CIFS_POSIX | 649 | #ifdef CONFIG_CIFS_POSIX |
| 763 | .unlocked_ioctl = cifs_ioctl, | 650 | .unlocked_ioctl = cifs_ioctl, |
| 764 | #endif /* CONFIG_CIFS_POSIX */ | 651 | #endif /* CONFIG_CIFS_POSIX */ |
| 765 | |||
| 766 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 767 | .setlease = cifs_setlease, | 652 | .setlease = cifs_setlease, |
| 768 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
| 769 | }; | 653 | }; |
| 770 | 654 | ||
| 771 | const struct file_operations cifs_file_direct_ops = { | 655 | const struct file_operations cifs_file_direct_ops = { |
| @@ -784,9 +668,7 @@ const struct file_operations cifs_file_direct_ops = { | |||
| 784 | .unlocked_ioctl = cifs_ioctl, | 668 | .unlocked_ioctl = cifs_ioctl, |
| 785 | #endif /* CONFIG_CIFS_POSIX */ | 669 | #endif /* CONFIG_CIFS_POSIX */ |
| 786 | .llseek = cifs_llseek, | 670 | .llseek = cifs_llseek, |
| 787 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 788 | .setlease = cifs_setlease, | 671 | .setlease = cifs_setlease, |
| 789 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
| 790 | }; | 672 | }; |
| 791 | const struct file_operations cifs_file_nobrl_ops = { | 673 | const struct file_operations cifs_file_nobrl_ops = { |
| 792 | .read = do_sync_read, | 674 | .read = do_sync_read, |
| @@ -803,10 +685,7 @@ const struct file_operations cifs_file_nobrl_ops = { | |||
| 803 | #ifdef CONFIG_CIFS_POSIX | 685 | #ifdef CONFIG_CIFS_POSIX |
| 804 | .unlocked_ioctl = cifs_ioctl, | 686 | .unlocked_ioctl = cifs_ioctl, |
| 805 | #endif /* CONFIG_CIFS_POSIX */ | 687 | #endif /* CONFIG_CIFS_POSIX */ |
| 806 | |||
| 807 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 808 | .setlease = cifs_setlease, | 688 | .setlease = cifs_setlease, |
| 809 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
| 810 | }; | 689 | }; |
| 811 | 690 | ||
| 812 | const struct file_operations cifs_file_direct_nobrl_ops = { | 691 | const struct file_operations cifs_file_direct_nobrl_ops = { |
| @@ -824,9 +703,7 @@ const struct file_operations cifs_file_direct_nobrl_ops = { | |||
| 824 | .unlocked_ioctl = cifs_ioctl, | 703 | .unlocked_ioctl = cifs_ioctl, |
| 825 | #endif /* CONFIG_CIFS_POSIX */ | 704 | #endif /* CONFIG_CIFS_POSIX */ |
| 826 | .llseek = cifs_llseek, | 705 | .llseek = cifs_llseek, |
| 827 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 828 | .setlease = cifs_setlease, | 706 | .setlease = cifs_setlease, |
| 829 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
| 830 | }; | 707 | }; |
| 831 | 708 | ||
| 832 | const struct file_operations cifs_dir_ops = { | 709 | const struct file_operations cifs_dir_ops = { |
| @@ -878,7 +755,7 @@ cifs_init_request_bufs(void) | |||
| 878 | } else { | 755 | } else { |
| 879 | CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/ | 756 | CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/ |
| 880 | } | 757 | } |
| 881 | /* cERROR(1,("CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize)); */ | 758 | /* cERROR(1, "CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize); */ |
| 882 | cifs_req_cachep = kmem_cache_create("cifs_request", | 759 | cifs_req_cachep = kmem_cache_create("cifs_request", |
| 883 | CIFSMaxBufSize + | 760 | CIFSMaxBufSize + |
| 884 | MAX_CIFS_HDR_SIZE, 0, | 761 | MAX_CIFS_HDR_SIZE, 0, |
| @@ -890,7 +767,7 @@ cifs_init_request_bufs(void) | |||
| 890 | cifs_min_rcv = 1; | 767 | cifs_min_rcv = 1; |
| 891 | else if (cifs_min_rcv > 64) { | 768 | else if (cifs_min_rcv > 64) { |
| 892 | cifs_min_rcv = 64; | 769 | cifs_min_rcv = 64; |
| 893 | cERROR(1, ("cifs_min_rcv set to maximum (64)")); | 770 | cERROR(1, "cifs_min_rcv set to maximum (64)"); |
| 894 | } | 771 | } |
| 895 | 772 | ||
| 896 | cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv, | 773 | cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv, |
| @@ -921,7 +798,7 @@ cifs_init_request_bufs(void) | |||
| 921 | cifs_min_small = 2; | 798 | cifs_min_small = 2; |
| 922 | else if (cifs_min_small > 256) { | 799 | else if (cifs_min_small > 256) { |
| 923 | cifs_min_small = 256; | 800 | cifs_min_small = 256; |
| 924 | cFYI(1, ("cifs_min_small set to maximum (256)")); | 801 | cFYI(1, "cifs_min_small set to maximum (256)"); |
| 925 | } | 802 | } |
| 926 | 803 | ||
| 927 | cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small, | 804 | cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small, |
| @@ -962,15 +839,6 @@ cifs_init_mids(void) | |||
| 962 | return -ENOMEM; | 839 | return -ENOMEM; |
| 963 | } | 840 | } |
| 964 | 841 | ||
| 965 | cifs_oplock_cachep = kmem_cache_create("cifs_oplock_structs", | ||
| 966 | sizeof(struct oplock_q_entry), 0, | ||
| 967 | SLAB_HWCACHE_ALIGN, NULL); | ||
| 968 | if (cifs_oplock_cachep == NULL) { | ||
| 969 | mempool_destroy(cifs_mid_poolp); | ||
| 970 | kmem_cache_destroy(cifs_mid_cachep); | ||
| 971 | return -ENOMEM; | ||
| 972 | } | ||
| 973 | |||
| 974 | return 0; | 842 | return 0; |
| 975 | } | 843 | } |
| 976 | 844 | ||
| @@ -979,7 +847,6 @@ cifs_destroy_mids(void) | |||
| 979 | { | 847 | { |
| 980 | mempool_destroy(cifs_mid_poolp); | 848 | mempool_destroy(cifs_mid_poolp); |
| 981 | kmem_cache_destroy(cifs_mid_cachep); | 849 | kmem_cache_destroy(cifs_mid_cachep); |
| 982 | kmem_cache_destroy(cifs_oplock_cachep); | ||
| 983 | } | 850 | } |
| 984 | 851 | ||
| 985 | static int __init | 852 | static int __init |
| @@ -1019,10 +886,10 @@ init_cifs(void) | |||
| 1019 | 886 | ||
| 1020 | if (cifs_max_pending < 2) { | 887 | if (cifs_max_pending < 2) { |
| 1021 | cifs_max_pending = 2; | 888 | cifs_max_pending = 2; |
| 1022 | cFYI(1, ("cifs_max_pending set to min of 2")); | 889 | cFYI(1, "cifs_max_pending set to min of 2"); |
| 1023 | } else if (cifs_max_pending > 256) { | 890 | } else if (cifs_max_pending > 256) { |
| 1024 | cifs_max_pending = 256; | 891 | cifs_max_pending = 256; |
| 1025 | cFYI(1, ("cifs_max_pending set to max of 256")); | 892 | cFYI(1, "cifs_max_pending set to max of 256"); |
| 1026 | } | 893 | } |
| 1027 | 894 | ||
| 1028 | rc = cifs_init_inodecache(); | 895 | rc = cifs_init_inodecache(); |
| @@ -1080,7 +947,7 @@ init_cifs(void) | |||
| 1080 | static void __exit | 947 | static void __exit |
| 1081 | exit_cifs(void) | 948 | exit_cifs(void) |
| 1082 | { | 949 | { |
| 1083 | cFYI(DBG2, ("exit_cifs")); | 950 | cFYI(DBG2, "exit_cifs"); |
| 1084 | cifs_proc_clean(); | 951 | cifs_proc_clean(); |
| 1085 | #ifdef CONFIG_CIFS_DFS_UPCALL | 952 | #ifdef CONFIG_CIFS_DFS_UPCALL |
| 1086 | cifs_dfs_release_automount_timer(); | 953 | cifs_dfs_release_automount_timer(); |
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 7aa57ecdc437..0242ff9cbf41 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
| @@ -114,5 +114,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); | |||
| 114 | extern const struct export_operations cifs_export_ops; | 114 | extern const struct export_operations cifs_export_ops; |
| 115 | #endif /* EXPERIMENTAL */ | 115 | #endif /* EXPERIMENTAL */ |
| 116 | 116 | ||
| 117 | #define CIFS_VERSION "1.62" | 117 | #define CIFS_VERSION "1.64" |
| 118 | #endif /* _CIFSFS_H */ | 118 | #endif /* _CIFSFS_H */ |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index ecf0ffbe2b64..a88479ceaad5 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -87,7 +87,6 @@ enum securityEnum { | |||
| 87 | RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */ | 87 | RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */ |
| 88 | /* NTLMSSP, */ /* can use rawNTLMSSP instead of NTLMSSP via SPNEGO */ | 88 | /* NTLMSSP, */ /* can use rawNTLMSSP instead of NTLMSSP via SPNEGO */ |
| 89 | Kerberos, /* Kerberos via SPNEGO */ | 89 | Kerberos, /* Kerberos via SPNEGO */ |
| 90 | MSKerberos, /* MS Kerberos via SPNEGO */ | ||
| 91 | }; | 90 | }; |
| 92 | 91 | ||
| 93 | enum protocolEnum { | 92 | enum protocolEnum { |
| @@ -185,6 +184,12 @@ struct TCP_Server_Info { | |||
| 185 | struct mac_key mac_signing_key; | 184 | struct mac_key mac_signing_key; |
| 186 | char ntlmv2_hash[16]; | 185 | char ntlmv2_hash[16]; |
| 187 | unsigned long lstrp; /* when we got last response from this server */ | 186 | unsigned long lstrp; /* when we got last response from this server */ |
| 187 | u16 dialect; /* dialect index that server chose */ | ||
| 188 | /* extended security flavors that server supports */ | ||
| 189 | bool sec_kerberos; /* supports plain Kerberos */ | ||
| 190 | bool sec_mskerberos; /* supports legacy MS Kerberos */ | ||
| 191 | bool sec_kerberosu2u; /* supports U2U Kerberos */ | ||
| 192 | bool sec_ntlmssp; /* supports NTLMSSP */ | ||
| 188 | }; | 193 | }; |
| 189 | 194 | ||
| 190 | /* | 195 | /* |
| @@ -502,6 +507,7 @@ struct dfs_info3_param { | |||
| 502 | #define CIFS_FATTR_DFS_REFERRAL 0x1 | 507 | #define CIFS_FATTR_DFS_REFERRAL 0x1 |
| 503 | #define CIFS_FATTR_DELETE_PENDING 0x2 | 508 | #define CIFS_FATTR_DELETE_PENDING 0x2 |
| 504 | #define CIFS_FATTR_NEED_REVAL 0x4 | 509 | #define CIFS_FATTR_NEED_REVAL 0x4 |
| 510 | #define CIFS_FATTR_INO_COLLISION 0x8 | ||
| 505 | 511 | ||
| 506 | struct cifs_fattr { | 512 | struct cifs_fattr { |
| 507 | u32 cf_flags; | 513 | u32 cf_flags; |
| @@ -717,7 +723,7 @@ GLOBAL_EXTERN unsigned int multiuser_mount; /* if enabled allows new sessions | |||
| 717 | GLOBAL_EXTERN unsigned int oplockEnabled; | 723 | GLOBAL_EXTERN unsigned int oplockEnabled; |
| 718 | GLOBAL_EXTERN unsigned int experimEnabled; | 724 | GLOBAL_EXTERN unsigned int experimEnabled; |
| 719 | GLOBAL_EXTERN unsigned int lookupCacheEnabled; | 725 | GLOBAL_EXTERN unsigned int lookupCacheEnabled; |
| 720 | GLOBAL_EXTERN unsigned int extended_security; /* if on, session setup sent | 726 | GLOBAL_EXTERN unsigned int global_secflags; /* if on, session setup sent |
| 721 | with more secure ntlmssp2 challenge/resp */ | 727 | with more secure ntlmssp2 challenge/resp */ |
| 722 | GLOBAL_EXTERN unsigned int sign_CIFS_PDUs; /* enable smb packet signing */ | 728 | GLOBAL_EXTERN unsigned int sign_CIFS_PDUs; /* enable smb packet signing */ |
| 723 | GLOBAL_EXTERN unsigned int linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/ | 729 | GLOBAL_EXTERN unsigned int linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/ |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 39e47f46dea5..fb1657e0fdb8 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
| @@ -39,8 +39,20 @@ extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *, | |||
| 39 | unsigned int /* length */); | 39 | unsigned int /* length */); |
| 40 | extern unsigned int _GetXid(void); | 40 | extern unsigned int _GetXid(void); |
| 41 | extern void _FreeXid(unsigned int); | 41 | extern void _FreeXid(unsigned int); |
| 42 | #define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current_fsuid())); | 42 | #define GetXid() \ |
| 43 | #define FreeXid(curr_xid) {_FreeXid(curr_xid); cFYI(1,("CIFS VFS: leaving %s (xid = %d) rc = %d",__func__,curr_xid,(int)rc));} | 43 | ({ \ |
| 44 | int __xid = (int)_GetXid(); \ | ||
| 45 | cFYI(1, "CIFS VFS: in %s as Xid: %d with uid: %d", \ | ||
| 46 | __func__, __xid, current_fsuid()); \ | ||
| 47 | __xid; \ | ||
| 48 | }) | ||
| 49 | |||
| 50 | #define FreeXid(curr_xid) \ | ||
| 51 | do { \ | ||
| 52 | _FreeXid(curr_xid); \ | ||
| 53 | cFYI(1, "CIFS VFS: leaving %s (xid = %d) rc = %d", \ | ||
| 54 | __func__, curr_xid, (int)rc); \ | ||
| 55 | } while (0) | ||
| 44 | extern char *build_path_from_dentry(struct dentry *); | 56 | extern char *build_path_from_dentry(struct dentry *); |
| 45 | extern char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb); | 57 | extern char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb); |
| 46 | extern char *build_wildcard_path_from_dentry(struct dentry *direntry); | 58 | extern char *build_wildcard_path_from_dentry(struct dentry *direntry); |
| @@ -73,7 +85,7 @@ extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *); | |||
| 73 | extern unsigned int smbCalcSize(struct smb_hdr *ptr); | 85 | extern unsigned int smbCalcSize(struct smb_hdr *ptr); |
| 74 | extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); | 86 | extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); |
| 75 | extern int decode_negTokenInit(unsigned char *security_blob, int length, | 87 | extern int decode_negTokenInit(unsigned char *security_blob, int length, |
| 76 | enum securityEnum *secType); | 88 | struct TCP_Server_Info *server); |
| 77 | extern int cifs_convert_address(char *src, void *dst); | 89 | extern int cifs_convert_address(char *src, void *dst); |
| 78 | extern int map_smb_to_linux_error(struct smb_hdr *smb, int logErr); | 90 | extern int map_smb_to_linux_error(struct smb_hdr *smb, int logErr); |
| 79 | extern void header_assemble(struct smb_hdr *, char /* command */ , | 91 | extern void header_assemble(struct smb_hdr *, char /* command */ , |
| @@ -83,7 +95,6 @@ extern int small_smb_init_no_tc(const int smb_cmd, const int wct, | |||
| 83 | struct cifsSesInfo *ses, | 95 | struct cifsSesInfo *ses, |
| 84 | void **request_buf); | 96 | void **request_buf); |
| 85 | extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, | 97 | extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, |
| 86 | const int stage, | ||
| 87 | const struct nls_table *nls_cp); | 98 | const struct nls_table *nls_cp); |
| 88 | extern __u16 GetNextMid(struct TCP_Server_Info *server); | 99 | extern __u16 GetNextMid(struct TCP_Server_Info *server); |
| 89 | extern struct timespec cifs_NTtimeToUnix(__le64 utc_nanoseconds_since_1601); | 100 | extern struct timespec cifs_NTtimeToUnix(__le64 utc_nanoseconds_since_1601); |
| @@ -95,8 +106,11 @@ extern struct cifsFileInfo *cifs_new_fileinfo(struct inode *newinode, | |||
| 95 | __u16 fileHandle, struct file *file, | 106 | __u16 fileHandle, struct file *file, |
| 96 | struct vfsmount *mnt, unsigned int oflags); | 107 | struct vfsmount *mnt, unsigned int oflags); |
| 97 | extern int cifs_posix_open(char *full_path, struct inode **pinode, | 108 | extern int cifs_posix_open(char *full_path, struct inode **pinode, |
| 98 | struct vfsmount *mnt, int mode, int oflags, | 109 | struct vfsmount *mnt, |
| 99 | __u32 *poplock, __u16 *pnetfid, int xid); | 110 | struct super_block *sb, |
| 111 | int mode, int oflags, | ||
| 112 | __u32 *poplock, __u16 *pnetfid, int xid); | ||
| 113 | void cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr); | ||
| 100 | extern void cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, | 114 | extern void cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, |
| 101 | FILE_UNIX_BASIC_INFO *info, | 115 | FILE_UNIX_BASIC_INFO *info, |
| 102 | struct cifs_sb_info *cifs_sb); | 116 | struct cifs_sb_info *cifs_sb); |
| @@ -125,7 +139,9 @@ extern void cifs_dfs_release_automount_timer(void); | |||
| 125 | void cifs_proc_init(void); | 139 | void cifs_proc_init(void); |
| 126 | void cifs_proc_clean(void); | 140 | void cifs_proc_clean(void); |
| 127 | 141 | ||
| 128 | extern int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, | 142 | extern int cifs_negotiate_protocol(unsigned int xid, |
| 143 | struct cifsSesInfo *ses); | ||
| 144 | extern int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses, | ||
| 129 | struct nls_table *nls_info); | 145 | struct nls_table *nls_info); |
| 130 | extern int CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses); | 146 | extern int CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses); |
| 131 | 147 | ||
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 5d3f29fef532..c65c3419dd37 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * fs/cifs/cifssmb.c | 2 | * fs/cifs/cifssmb.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) International Business Machines Corp., 2002,2009 | 4 | * Copyright (C) International Business Machines Corp., 2002,2010 |
| 5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
| 6 | * | 6 | * |
| 7 | * Contains the routines for constructing the SMB PDUs themselves | 7 | * Contains the routines for constructing the SMB PDUs themselves |
| @@ -130,8 +130,8 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command) | |||
| 130 | if (smb_command != SMB_COM_WRITE_ANDX && | 130 | if (smb_command != SMB_COM_WRITE_ANDX && |
| 131 | smb_command != SMB_COM_OPEN_ANDX && | 131 | smb_command != SMB_COM_OPEN_ANDX && |
| 132 | smb_command != SMB_COM_TREE_DISCONNECT) { | 132 | smb_command != SMB_COM_TREE_DISCONNECT) { |
| 133 | cFYI(1, ("can not send cmd %d while umounting", | 133 | cFYI(1, "can not send cmd %d while umounting", |
| 134 | smb_command)); | 134 | smb_command); |
| 135 | return -ENODEV; | 135 | return -ENODEV; |
| 136 | } | 136 | } |
| 137 | } | 137 | } |
| @@ -157,7 +157,7 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command) | |||
| 157 | * back on-line | 157 | * back on-line |
| 158 | */ | 158 | */ |
| 159 | if (!tcon->retry || ses->status == CifsExiting) { | 159 | if (!tcon->retry || ses->status == CifsExiting) { |
| 160 | cFYI(1, ("gave up waiting on reconnect in smb_init")); | 160 | cFYI(1, "gave up waiting on reconnect in smb_init"); |
| 161 | return -EHOSTDOWN; | 161 | return -EHOSTDOWN; |
| 162 | } | 162 | } |
| 163 | } | 163 | } |
| @@ -172,7 +172,8 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command) | |||
| 172 | * reconnect the same SMB session | 172 | * reconnect the same SMB session |
| 173 | */ | 173 | */ |
| 174 | mutex_lock(&ses->session_mutex); | 174 | mutex_lock(&ses->session_mutex); |
| 175 | if (ses->need_reconnect) | 175 | rc = cifs_negotiate_protocol(0, ses); |
| 176 | if (rc == 0 && ses->need_reconnect) | ||
| 176 | rc = cifs_setup_session(0, ses, nls_codepage); | 177 | rc = cifs_setup_session(0, ses, nls_codepage); |
| 177 | 178 | ||
| 178 | /* do we need to reconnect tcon? */ | 179 | /* do we need to reconnect tcon? */ |
| @@ -184,7 +185,7 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command) | |||
| 184 | mark_open_files_invalid(tcon); | 185 | mark_open_files_invalid(tcon); |
| 185 | rc = CIFSTCon(0, ses, tcon->treeName, tcon, nls_codepage); | 186 | rc = CIFSTCon(0, ses, tcon->treeName, tcon, nls_codepage); |
| 186 | mutex_unlock(&ses->session_mutex); | 187 | mutex_unlock(&ses->session_mutex); |
| 187 | cFYI(1, ("reconnect tcon rc = %d", rc)); | 188 | cFYI(1, "reconnect tcon rc = %d", rc); |
| 188 | 189 | ||
| 189 | if (rc) | 190 | if (rc) |
| 190 | goto out; | 191 | goto out; |
| @@ -355,7 +356,6 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 355 | struct TCP_Server_Info *server; | 356 | struct TCP_Server_Info *server; |
| 356 | u16 count; | 357 | u16 count; |
| 357 | unsigned int secFlags; | 358 | unsigned int secFlags; |
| 358 | u16 dialect; | ||
| 359 | 359 | ||
| 360 | if (ses->server) | 360 | if (ses->server) |
| 361 | server = ses->server; | 361 | server = ses->server; |
| @@ -372,9 +372,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 372 | if (ses->overrideSecFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL))) | 372 | if (ses->overrideSecFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL))) |
| 373 | secFlags = ses->overrideSecFlg; /* BB FIXME fix sign flags? */ | 373 | secFlags = ses->overrideSecFlg; /* BB FIXME fix sign flags? */ |
| 374 | else /* if override flags set only sign/seal OR them with global auth */ | 374 | else /* if override flags set only sign/seal OR them with global auth */ |
| 375 | secFlags = extended_security | ses->overrideSecFlg; | 375 | secFlags = global_secflags | ses->overrideSecFlg; |
| 376 | 376 | ||
| 377 | cFYI(1, ("secFlags 0x%x", secFlags)); | 377 | cFYI(1, "secFlags 0x%x", secFlags); |
| 378 | 378 | ||
| 379 | pSMB->hdr.Mid = GetNextMid(server); | 379 | pSMB->hdr.Mid = GetNextMid(server); |
| 380 | pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS); | 380 | pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS); |
| @@ -382,14 +382,14 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 382 | if ((secFlags & CIFSSEC_MUST_KRB5) == CIFSSEC_MUST_KRB5) | 382 | if ((secFlags & CIFSSEC_MUST_KRB5) == CIFSSEC_MUST_KRB5) |
| 383 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; | 383 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; |
| 384 | else if ((secFlags & CIFSSEC_AUTH_MASK) == CIFSSEC_MAY_KRB5) { | 384 | else if ((secFlags & CIFSSEC_AUTH_MASK) == CIFSSEC_MAY_KRB5) { |
| 385 | cFYI(1, ("Kerberos only mechanism, enable extended security")); | 385 | cFYI(1, "Kerberos only mechanism, enable extended security"); |
| 386 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; | 386 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; |
| 387 | } | 387 | } |
| 388 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 388 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
| 389 | else if ((secFlags & CIFSSEC_MUST_NTLMSSP) == CIFSSEC_MUST_NTLMSSP) | 389 | else if ((secFlags & CIFSSEC_MUST_NTLMSSP) == CIFSSEC_MUST_NTLMSSP) |
| 390 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; | 390 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; |
| 391 | else if ((secFlags & CIFSSEC_AUTH_MASK) == CIFSSEC_MAY_NTLMSSP) { | 391 | else if ((secFlags & CIFSSEC_AUTH_MASK) == CIFSSEC_MAY_NTLMSSP) { |
| 392 | cFYI(1, ("NTLMSSP only mechanism, enable extended security")); | 392 | cFYI(1, "NTLMSSP only mechanism, enable extended security"); |
| 393 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; | 393 | pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; |
| 394 | } | 394 | } |
| 395 | #endif | 395 | #endif |
| @@ -408,10 +408,10 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 408 | if (rc != 0) | 408 | if (rc != 0) |
| 409 | goto neg_err_exit; | 409 | goto neg_err_exit; |
| 410 | 410 | ||
| 411 | dialect = le16_to_cpu(pSMBr->DialectIndex); | 411 | server->dialect = le16_to_cpu(pSMBr->DialectIndex); |
| 412 | cFYI(1, ("Dialect: %d", dialect)); | 412 | cFYI(1, "Dialect: %d", server->dialect); |
| 413 | /* Check wct = 1 error case */ | 413 | /* Check wct = 1 error case */ |
| 414 | if ((pSMBr->hdr.WordCount < 13) || (dialect == BAD_PROT)) { | 414 | if ((pSMBr->hdr.WordCount < 13) || (server->dialect == BAD_PROT)) { |
| 415 | /* core returns wct = 1, but we do not ask for core - otherwise | 415 | /* core returns wct = 1, but we do not ask for core - otherwise |
| 416 | small wct just comes when dialect index is -1 indicating we | 416 | small wct just comes when dialect index is -1 indicating we |
| 417 | could not negotiate a common dialect */ | 417 | could not negotiate a common dialect */ |
| @@ -419,8 +419,8 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 419 | goto neg_err_exit; | 419 | goto neg_err_exit; |
| 420 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | 420 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
| 421 | } else if ((pSMBr->hdr.WordCount == 13) | 421 | } else if ((pSMBr->hdr.WordCount == 13) |
| 422 | && ((dialect == LANMAN_PROT) | 422 | && ((server->dialect == LANMAN_PROT) |
| 423 | || (dialect == LANMAN2_PROT))) { | 423 | || (server->dialect == LANMAN2_PROT))) { |
| 424 | __s16 tmp; | 424 | __s16 tmp; |
| 425 | struct lanman_neg_rsp *rsp = (struct lanman_neg_rsp *)pSMBr; | 425 | struct lanman_neg_rsp *rsp = (struct lanman_neg_rsp *)pSMBr; |
| 426 | 426 | ||
| @@ -428,8 +428,8 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 428 | (secFlags & CIFSSEC_MAY_PLNTXT)) | 428 | (secFlags & CIFSSEC_MAY_PLNTXT)) |
| 429 | server->secType = LANMAN; | 429 | server->secType = LANMAN; |
| 430 | else { | 430 | else { |
| 431 | cERROR(1, ("mount failed weak security disabled" | 431 | cERROR(1, "mount failed weak security disabled" |
| 432 | " in /proc/fs/cifs/SecurityFlags")); | 432 | " in /proc/fs/cifs/SecurityFlags"); |
| 433 | rc = -EOPNOTSUPP; | 433 | rc = -EOPNOTSUPP; |
| 434 | goto neg_err_exit; | 434 | goto neg_err_exit; |
| 435 | } | 435 | } |
| @@ -462,9 +462,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 462 | utc = CURRENT_TIME; | 462 | utc = CURRENT_TIME; |
| 463 | ts = cnvrtDosUnixTm(rsp->SrvTime.Date, | 463 | ts = cnvrtDosUnixTm(rsp->SrvTime.Date, |
| 464 | rsp->SrvTime.Time, 0); | 464 | rsp->SrvTime.Time, 0); |
| 465 | cFYI(1, ("SrvTime %d sec since 1970 (utc: %d) diff: %d", | 465 | cFYI(1, "SrvTime %d sec since 1970 (utc: %d) diff: %d", |
| 466 | (int)ts.tv_sec, (int)utc.tv_sec, | 466 | (int)ts.tv_sec, (int)utc.tv_sec, |
| 467 | (int)(utc.tv_sec - ts.tv_sec))); | 467 | (int)(utc.tv_sec - ts.tv_sec)); |
| 468 | val = (int)(utc.tv_sec - ts.tv_sec); | 468 | val = (int)(utc.tv_sec - ts.tv_sec); |
| 469 | seconds = abs(val); | 469 | seconds = abs(val); |
| 470 | result = (seconds / MIN_TZ_ADJ) * MIN_TZ_ADJ; | 470 | result = (seconds / MIN_TZ_ADJ) * MIN_TZ_ADJ; |
| @@ -478,7 +478,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 478 | server->timeAdj = (int)tmp; | 478 | server->timeAdj = (int)tmp; |
| 479 | server->timeAdj *= 60; /* also in seconds */ | 479 | server->timeAdj *= 60; /* also in seconds */ |
| 480 | } | 480 | } |
| 481 | cFYI(1, ("server->timeAdj: %d seconds", server->timeAdj)); | 481 | cFYI(1, "server->timeAdj: %d seconds", server->timeAdj); |
| 482 | 482 | ||
| 483 | 483 | ||
| 484 | /* BB get server time for time conversions and add | 484 | /* BB get server time for time conversions and add |
| @@ -493,14 +493,14 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 493 | goto neg_err_exit; | 493 | goto neg_err_exit; |
| 494 | } | 494 | } |
| 495 | 495 | ||
| 496 | cFYI(1, ("LANMAN negotiated")); | 496 | cFYI(1, "LANMAN negotiated"); |
| 497 | /* we will not end up setting signing flags - as no signing | 497 | /* we will not end up setting signing flags - as no signing |
| 498 | was in LANMAN and server did not return the flags on */ | 498 | was in LANMAN and server did not return the flags on */ |
| 499 | goto signing_check; | 499 | goto signing_check; |
| 500 | #else /* weak security disabled */ | 500 | #else /* weak security disabled */ |
| 501 | } else if (pSMBr->hdr.WordCount == 13) { | 501 | } else if (pSMBr->hdr.WordCount == 13) { |
| 502 | cERROR(1, ("mount failed, cifs module not built " | 502 | cERROR(1, "mount failed, cifs module not built " |
| 503 | "with CIFS_WEAK_PW_HASH support")); | 503 | "with CIFS_WEAK_PW_HASH support"); |
| 504 | rc = -EOPNOTSUPP; | 504 | rc = -EOPNOTSUPP; |
| 505 | #endif /* WEAK_PW_HASH */ | 505 | #endif /* WEAK_PW_HASH */ |
| 506 | goto neg_err_exit; | 506 | goto neg_err_exit; |
| @@ -512,14 +512,14 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 512 | /* else wct == 17 NTLM */ | 512 | /* else wct == 17 NTLM */ |
| 513 | server->secMode = pSMBr->SecurityMode; | 513 | server->secMode = pSMBr->SecurityMode; |
| 514 | if ((server->secMode & SECMODE_USER) == 0) | 514 | if ((server->secMode & SECMODE_USER) == 0) |
| 515 | cFYI(1, ("share mode security")); | 515 | cFYI(1, "share mode security"); |
| 516 | 516 | ||
| 517 | if ((server->secMode & SECMODE_PW_ENCRYPT) == 0) | 517 | if ((server->secMode & SECMODE_PW_ENCRYPT) == 0) |
| 518 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | 518 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
| 519 | if ((secFlags & CIFSSEC_MAY_PLNTXT) == 0) | 519 | if ((secFlags & CIFSSEC_MAY_PLNTXT) == 0) |
| 520 | #endif /* CIFS_WEAK_PW_HASH */ | 520 | #endif /* CIFS_WEAK_PW_HASH */ |
| 521 | cERROR(1, ("Server requests plain text password" | 521 | cERROR(1, "Server requests plain text password" |
| 522 | " but client support disabled")); | 522 | " but client support disabled"); |
| 523 | 523 | ||
| 524 | if ((secFlags & CIFSSEC_MUST_NTLMV2) == CIFSSEC_MUST_NTLMV2) | 524 | if ((secFlags & CIFSSEC_MUST_NTLMV2) == CIFSSEC_MUST_NTLMV2) |
| 525 | server->secType = NTLMv2; | 525 | server->secType = NTLMv2; |
| @@ -539,7 +539,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 539 | #endif */ | 539 | #endif */ |
| 540 | else { | 540 | else { |
| 541 | rc = -EOPNOTSUPP; | 541 | rc = -EOPNOTSUPP; |
| 542 | cERROR(1, ("Invalid security type")); | 542 | cERROR(1, "Invalid security type"); |
| 543 | goto neg_err_exit; | 543 | goto neg_err_exit; |
| 544 | } | 544 | } |
| 545 | /* else ... any others ...? */ | 545 | /* else ... any others ...? */ |
| @@ -551,7 +551,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 551 | server->maxBuf = min(le32_to_cpu(pSMBr->MaxBufferSize), | 551 | server->maxBuf = min(le32_to_cpu(pSMBr->MaxBufferSize), |
| 552 | (__u32) CIFSMaxBufSize + MAX_CIFS_HDR_SIZE); | 552 | (__u32) CIFSMaxBufSize + MAX_CIFS_HDR_SIZE); |
| 553 | server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); | 553 | server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); |
| 554 | cFYI(DBG2, ("Max buf = %d", ses->server->maxBuf)); | 554 | cFYI(DBG2, "Max buf = %d", ses->server->maxBuf); |
| 555 | GETU32(ses->server->sessid) = le32_to_cpu(pSMBr->SessionKey); | 555 | GETU32(ses->server->sessid) = le32_to_cpu(pSMBr->SessionKey); |
| 556 | server->capabilities = le32_to_cpu(pSMBr->Capabilities); | 556 | server->capabilities = le32_to_cpu(pSMBr->Capabilities); |
| 557 | server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); | 557 | server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); |
| @@ -582,7 +582,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 582 | if (memcmp(server->server_GUID, | 582 | if (memcmp(server->server_GUID, |
| 583 | pSMBr->u.extended_response. | 583 | pSMBr->u.extended_response. |
| 584 | GUID, 16) != 0) { | 584 | GUID, 16) != 0) { |
| 585 | cFYI(1, ("server UID changed")); | 585 | cFYI(1, "server UID changed"); |
| 586 | memcpy(server->server_GUID, | 586 | memcpy(server->server_GUID, |
| 587 | pSMBr->u.extended_response.GUID, | 587 | pSMBr->u.extended_response.GUID, |
| 588 | 16); | 588 | 16); |
| @@ -597,13 +597,19 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 597 | server->secType = RawNTLMSSP; | 597 | server->secType = RawNTLMSSP; |
| 598 | } else { | 598 | } else { |
| 599 | rc = decode_negTokenInit(pSMBr->u.extended_response. | 599 | rc = decode_negTokenInit(pSMBr->u.extended_response. |
| 600 | SecurityBlob, | 600 | SecurityBlob, count - 16, |
| 601 | count - 16, | 601 | server); |
| 602 | &server->secType); | ||
| 603 | if (rc == 1) | 602 | if (rc == 1) |
| 604 | rc = 0; | 603 | rc = 0; |
| 605 | else | 604 | else |
| 606 | rc = -EINVAL; | 605 | rc = -EINVAL; |
| 606 | |||
| 607 | if (server->sec_kerberos || server->sec_mskerberos) | ||
| 608 | server->secType = Kerberos; | ||
| 609 | else if (server->sec_ntlmssp) | ||
| 610 | server->secType = RawNTLMSSP; | ||
| 611 | else | ||
| 612 | rc = -EOPNOTSUPP; | ||
| 607 | } | 613 | } |
| 608 | } else | 614 | } else |
| 609 | server->capabilities &= ~CAP_EXTENDED_SECURITY; | 615 | server->capabilities &= ~CAP_EXTENDED_SECURITY; |
| @@ -614,22 +620,21 @@ signing_check: | |||
| 614 | if ((secFlags & CIFSSEC_MAY_SIGN) == 0) { | 620 | if ((secFlags & CIFSSEC_MAY_SIGN) == 0) { |
| 615 | /* MUST_SIGN already includes the MAY_SIGN FLAG | 621 | /* MUST_SIGN already includes the MAY_SIGN FLAG |
| 616 | so if this is zero it means that signing is disabled */ | 622 | so if this is zero it means that signing is disabled */ |
| 617 | cFYI(1, ("Signing disabled")); | 623 | cFYI(1, "Signing disabled"); |
| 618 | if (server->secMode & SECMODE_SIGN_REQUIRED) { | 624 | if (server->secMode & SECMODE_SIGN_REQUIRED) { |
| 619 | cERROR(1, ("Server requires " | 625 | cERROR(1, "Server requires " |
| 620 | "packet signing to be enabled in " | 626 | "packet signing to be enabled in " |
| 621 | "/proc/fs/cifs/SecurityFlags.")); | 627 | "/proc/fs/cifs/SecurityFlags."); |
| 622 | rc = -EOPNOTSUPP; | 628 | rc = -EOPNOTSUPP; |
| 623 | } | 629 | } |
| 624 | server->secMode &= | 630 | server->secMode &= |
| 625 | ~(SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED); | 631 | ~(SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED); |
| 626 | } else if ((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) { | 632 | } else if ((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) { |
| 627 | /* signing required */ | 633 | /* signing required */ |
| 628 | cFYI(1, ("Must sign - secFlags 0x%x", secFlags)); | 634 | cFYI(1, "Must sign - secFlags 0x%x", secFlags); |
| 629 | if ((server->secMode & | 635 | if ((server->secMode & |
| 630 | (SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED)) == 0) { | 636 | (SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED)) == 0) { |
| 631 | cERROR(1, | 637 | cERROR(1, "signing required but server lacks support"); |
| 632 | ("signing required but server lacks support")); | ||
| 633 | rc = -EOPNOTSUPP; | 638 | rc = -EOPNOTSUPP; |
| 634 | } else | 639 | } else |
| 635 | server->secMode |= SECMODE_SIGN_REQUIRED; | 640 | server->secMode |= SECMODE_SIGN_REQUIRED; |
| @@ -643,7 +648,7 @@ signing_check: | |||
| 643 | neg_err_exit: | 648 | neg_err_exit: |
| 644 | cifs_buf_release(pSMB); | 649 | cifs_buf_release(pSMB); |
| 645 | 650 | ||
| 646 | cFYI(1, ("negprot rc %d", rc)); | 651 | cFYI(1, "negprot rc %d", rc); |
| 647 | return rc; | 652 | return rc; |
| 648 | } | 653 | } |
| 649 | 654 | ||
| @@ -653,7 +658,7 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon) | |||
| 653 | struct smb_hdr *smb_buffer; | 658 | struct smb_hdr *smb_buffer; |
| 654 | int rc = 0; | 659 | int rc = 0; |
| 655 | 660 | ||
| 656 | cFYI(1, ("In tree disconnect")); | 661 | cFYI(1, "In tree disconnect"); |
| 657 | 662 | ||
| 658 | /* BB: do we need to check this? These should never be NULL. */ | 663 | /* BB: do we need to check this? These should never be NULL. */ |
| 659 | if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) | 664 | if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) |
| @@ -675,7 +680,7 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon) | |||
| 675 | 680 | ||
| 676 | rc = SendReceiveNoRsp(xid, tcon->ses, smb_buffer, 0); | 681 | rc = SendReceiveNoRsp(xid, tcon->ses, smb_buffer, 0); |
| 677 | if (rc) | 682 | if (rc) |
| 678 | cFYI(1, ("Tree disconnect failed %d", rc)); | 683 | cFYI(1, "Tree disconnect failed %d", rc); |
| 679 | 684 | ||
| 680 | /* No need to return error on this operation if tid invalidated and | 685 | /* No need to return error on this operation if tid invalidated and |
| 681 | closed on server already e.g. due to tcp session crashing */ | 686 | closed on server already e.g. due to tcp session crashing */ |
| @@ -691,7 +696,7 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses) | |||
| 691 | LOGOFF_ANDX_REQ *pSMB; | 696 | LOGOFF_ANDX_REQ *pSMB; |
| 692 | int rc = 0; | 697 | int rc = 0; |
| 693 | 698 | ||
| 694 | cFYI(1, ("In SMBLogoff for session disconnect")); | 699 | cFYI(1, "In SMBLogoff for session disconnect"); |
| 695 | 700 | ||
| 696 | /* | 701 | /* |
| 697 | * BB: do we need to check validity of ses and server? They should | 702 | * BB: do we need to check validity of ses and server? They should |
| @@ -744,7 +749,7 @@ CIFSPOSIXDelFile(const int xid, struct cifsTconInfo *tcon, const char *fileName, | |||
| 744 | int bytes_returned = 0; | 749 | int bytes_returned = 0; |
| 745 | __u16 params, param_offset, offset, byte_count; | 750 | __u16 params, param_offset, offset, byte_count; |
| 746 | 751 | ||
| 747 | cFYI(1, ("In POSIX delete")); | 752 | cFYI(1, "In POSIX delete"); |
| 748 | PsxDelete: | 753 | PsxDelete: |
| 749 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 754 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 750 | (void **) &pSMBr); | 755 | (void **) &pSMBr); |
| @@ -796,7 +801,7 @@ PsxDelete: | |||
| 796 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 801 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 797 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 802 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 798 | if (rc) | 803 | if (rc) |
| 799 | cFYI(1, ("Posix delete returned %d", rc)); | 804 | cFYI(1, "Posix delete returned %d", rc); |
| 800 | cifs_buf_release(pSMB); | 805 | cifs_buf_release(pSMB); |
| 801 | 806 | ||
| 802 | cifs_stats_inc(&tcon->num_deletes); | 807 | cifs_stats_inc(&tcon->num_deletes); |
| @@ -843,7 +848,7 @@ DelFileRetry: | |||
| 843 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 848 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 844 | cifs_stats_inc(&tcon->num_deletes); | 849 | cifs_stats_inc(&tcon->num_deletes); |
| 845 | if (rc) | 850 | if (rc) |
| 846 | cFYI(1, ("Error in RMFile = %d", rc)); | 851 | cFYI(1, "Error in RMFile = %d", rc); |
| 847 | 852 | ||
| 848 | cifs_buf_release(pSMB); | 853 | cifs_buf_release(pSMB); |
| 849 | if (rc == -EAGAIN) | 854 | if (rc == -EAGAIN) |
| @@ -862,7 +867,7 @@ CIFSSMBRmDir(const int xid, struct cifsTconInfo *tcon, const char *dirName, | |||
| 862 | int bytes_returned; | 867 | int bytes_returned; |
| 863 | int name_len; | 868 | int name_len; |
| 864 | 869 | ||
| 865 | cFYI(1, ("In CIFSSMBRmDir")); | 870 | cFYI(1, "In CIFSSMBRmDir"); |
| 866 | RmDirRetry: | 871 | RmDirRetry: |
| 867 | rc = smb_init(SMB_COM_DELETE_DIRECTORY, 0, tcon, (void **) &pSMB, | 872 | rc = smb_init(SMB_COM_DELETE_DIRECTORY, 0, tcon, (void **) &pSMB, |
| 868 | (void **) &pSMBr); | 873 | (void **) &pSMBr); |
| @@ -887,7 +892,7 @@ RmDirRetry: | |||
| 887 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 892 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 888 | cifs_stats_inc(&tcon->num_rmdirs); | 893 | cifs_stats_inc(&tcon->num_rmdirs); |
| 889 | if (rc) | 894 | if (rc) |
| 890 | cFYI(1, ("Error in RMDir = %d", rc)); | 895 | cFYI(1, "Error in RMDir = %d", rc); |
| 891 | 896 | ||
| 892 | cifs_buf_release(pSMB); | 897 | cifs_buf_release(pSMB); |
| 893 | if (rc == -EAGAIN) | 898 | if (rc == -EAGAIN) |
| @@ -905,7 +910,7 @@ CIFSSMBMkDir(const int xid, struct cifsTconInfo *tcon, | |||
| 905 | int bytes_returned; | 910 | int bytes_returned; |
| 906 | int name_len; | 911 | int name_len; |
| 907 | 912 | ||
| 908 | cFYI(1, ("In CIFSSMBMkDir")); | 913 | cFYI(1, "In CIFSSMBMkDir"); |
| 909 | MkDirRetry: | 914 | MkDirRetry: |
| 910 | rc = smb_init(SMB_COM_CREATE_DIRECTORY, 0, tcon, (void **) &pSMB, | 915 | rc = smb_init(SMB_COM_CREATE_DIRECTORY, 0, tcon, (void **) &pSMB, |
| 911 | (void **) &pSMBr); | 916 | (void **) &pSMBr); |
| @@ -930,7 +935,7 @@ MkDirRetry: | |||
| 930 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 935 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 931 | cifs_stats_inc(&tcon->num_mkdirs); | 936 | cifs_stats_inc(&tcon->num_mkdirs); |
| 932 | if (rc) | 937 | if (rc) |
| 933 | cFYI(1, ("Error in Mkdir = %d", rc)); | 938 | cFYI(1, "Error in Mkdir = %d", rc); |
| 934 | 939 | ||
| 935 | cifs_buf_release(pSMB); | 940 | cifs_buf_release(pSMB); |
| 936 | if (rc == -EAGAIN) | 941 | if (rc == -EAGAIN) |
| @@ -953,7 +958,7 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags, | |||
| 953 | OPEN_PSX_REQ *pdata; | 958 | OPEN_PSX_REQ *pdata; |
| 954 | OPEN_PSX_RSP *psx_rsp; | 959 | OPEN_PSX_RSP *psx_rsp; |
| 955 | 960 | ||
| 956 | cFYI(1, ("In POSIX Create")); | 961 | cFYI(1, "In POSIX Create"); |
| 957 | PsxCreat: | 962 | PsxCreat: |
| 958 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 963 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 959 | (void **) &pSMBr); | 964 | (void **) &pSMBr); |
| @@ -1007,11 +1012,11 @@ PsxCreat: | |||
| 1007 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 1012 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 1008 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 1013 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 1009 | if (rc) { | 1014 | if (rc) { |
| 1010 | cFYI(1, ("Posix create returned %d", rc)); | 1015 | cFYI(1, "Posix create returned %d", rc); |
| 1011 | goto psx_create_err; | 1016 | goto psx_create_err; |
| 1012 | } | 1017 | } |
| 1013 | 1018 | ||
| 1014 | cFYI(1, ("copying inode info")); | 1019 | cFYI(1, "copying inode info"); |
| 1015 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 1020 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 1016 | 1021 | ||
| 1017 | if (rc || (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP))) { | 1022 | if (rc || (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP))) { |
| @@ -1033,11 +1038,11 @@ PsxCreat: | |||
| 1033 | /* check to make sure response data is there */ | 1038 | /* check to make sure response data is there */ |
| 1034 | if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { | 1039 | if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { |
| 1035 | pRetData->Type = cpu_to_le32(-1); /* unknown */ | 1040 | pRetData->Type = cpu_to_le32(-1); /* unknown */ |
| 1036 | cFYI(DBG2, ("unknown type")); | 1041 | cFYI(DBG2, "unknown type"); |
| 1037 | } else { | 1042 | } else { |
| 1038 | if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP) | 1043 | if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP) |
| 1039 | + sizeof(FILE_UNIX_BASIC_INFO)) { | 1044 | + sizeof(FILE_UNIX_BASIC_INFO)) { |
| 1040 | cERROR(1, ("Open response data too small")); | 1045 | cERROR(1, "Open response data too small"); |
| 1041 | pRetData->Type = cpu_to_le32(-1); | 1046 | pRetData->Type = cpu_to_le32(-1); |
| 1042 | goto psx_create_err; | 1047 | goto psx_create_err; |
| 1043 | } | 1048 | } |
| @@ -1084,7 +1089,7 @@ static __u16 convert_disposition(int disposition) | |||
| 1084 | ofun = SMBOPEN_OCREATE | SMBOPEN_OTRUNC; | 1089 | ofun = SMBOPEN_OCREATE | SMBOPEN_OTRUNC; |
| 1085 | break; | 1090 | break; |
| 1086 | default: | 1091 | default: |
| 1087 | cFYI(1, ("unknown disposition %d", disposition)); | 1092 | cFYI(1, "unknown disposition %d", disposition); |
| 1088 | ofun = SMBOPEN_OAPPEND; /* regular open */ | 1093 | ofun = SMBOPEN_OAPPEND; /* regular open */ |
| 1089 | } | 1094 | } |
| 1090 | return ofun; | 1095 | return ofun; |
| @@ -1175,7 +1180,7 @@ OldOpenRetry: | |||
| 1175 | (struct smb_hdr *)pSMBr, &bytes_returned, CIFS_LONG_OP); | 1180 | (struct smb_hdr *)pSMBr, &bytes_returned, CIFS_LONG_OP); |
| 1176 | cifs_stats_inc(&tcon->num_opens); | 1181 | cifs_stats_inc(&tcon->num_opens); |
| 1177 | if (rc) { | 1182 | if (rc) { |
| 1178 | cFYI(1, ("Error in Open = %d", rc)); | 1183 | cFYI(1, "Error in Open = %d", rc); |
| 1179 | } else { | 1184 | } else { |
| 1180 | /* BB verify if wct == 15 */ | 1185 | /* BB verify if wct == 15 */ |
| 1181 | 1186 | ||
| @@ -1288,7 +1293,7 @@ openRetry: | |||
| 1288 | (struct smb_hdr *)pSMBr, &bytes_returned, CIFS_LONG_OP); | 1293 | (struct smb_hdr *)pSMBr, &bytes_returned, CIFS_LONG_OP); |
| 1289 | cifs_stats_inc(&tcon->num_opens); | 1294 | cifs_stats_inc(&tcon->num_opens); |
| 1290 | if (rc) { | 1295 | if (rc) { |
| 1291 | cFYI(1, ("Error in Open = %d", rc)); | 1296 | cFYI(1, "Error in Open = %d", rc); |
| 1292 | } else { | 1297 | } else { |
| 1293 | *pOplock = pSMBr->OplockLevel; /* 1 byte no need to le_to_cpu */ | 1298 | *pOplock = pSMBr->OplockLevel; /* 1 byte no need to le_to_cpu */ |
| 1294 | *netfid = pSMBr->Fid; /* cifs fid stays in le */ | 1299 | *netfid = pSMBr->Fid; /* cifs fid stays in le */ |
| @@ -1326,7 +1331,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid, | |||
| 1326 | int resp_buf_type = 0; | 1331 | int resp_buf_type = 0; |
| 1327 | struct kvec iov[1]; | 1332 | struct kvec iov[1]; |
| 1328 | 1333 | ||
| 1329 | cFYI(1, ("Reading %d bytes on fid %d", count, netfid)); | 1334 | cFYI(1, "Reading %d bytes on fid %d", count, netfid); |
| 1330 | if (tcon->ses->capabilities & CAP_LARGE_FILES) | 1335 | if (tcon->ses->capabilities & CAP_LARGE_FILES) |
| 1331 | wct = 12; | 1336 | wct = 12; |
| 1332 | else { | 1337 | else { |
| @@ -1371,7 +1376,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid, | |||
| 1371 | cifs_stats_inc(&tcon->num_reads); | 1376 | cifs_stats_inc(&tcon->num_reads); |
| 1372 | pSMBr = (READ_RSP *)iov[0].iov_base; | 1377 | pSMBr = (READ_RSP *)iov[0].iov_base; |
| 1373 | if (rc) { | 1378 | if (rc) { |
| 1374 | cERROR(1, ("Send error in read = %d", rc)); | 1379 | cERROR(1, "Send error in read = %d", rc); |
| 1375 | } else { | 1380 | } else { |
| 1376 | int data_length = le16_to_cpu(pSMBr->DataLengthHigh); | 1381 | int data_length = le16_to_cpu(pSMBr->DataLengthHigh); |
| 1377 | data_length = data_length << 16; | 1382 | data_length = data_length << 16; |
| @@ -1381,15 +1386,15 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid, | |||
| 1381 | /*check that DataLength would not go beyond end of SMB */ | 1386 | /*check that DataLength would not go beyond end of SMB */ |
| 1382 | if ((data_length > CIFSMaxBufSize) | 1387 | if ((data_length > CIFSMaxBufSize) |
| 1383 | || (data_length > count)) { | 1388 | || (data_length > count)) { |
| 1384 | cFYI(1, ("bad length %d for count %d", | 1389 | cFYI(1, "bad length %d for count %d", |
| 1385 | data_length, count)); | 1390 | data_length, count); |
| 1386 | rc = -EIO; | 1391 | rc = -EIO; |
| 1387 | *nbytes = 0; | 1392 | *nbytes = 0; |
| 1388 | } else { | 1393 | } else { |
| 1389 | pReadData = (char *) (&pSMBr->hdr.Protocol) + | 1394 | pReadData = (char *) (&pSMBr->hdr.Protocol) + |
| 1390 | le16_to_cpu(pSMBr->DataOffset); | 1395 | le16_to_cpu(pSMBr->DataOffset); |
| 1391 | /* if (rc = copy_to_user(buf, pReadData, data_length)) { | 1396 | /* if (rc = copy_to_user(buf, pReadData, data_length)) { |
| 1392 | cERROR(1,("Faulting on read rc = %d",rc)); | 1397 | cERROR(1, "Faulting on read rc = %d",rc); |
| 1393 | rc = -EFAULT; | 1398 | rc = -EFAULT; |
| 1394 | }*/ /* can not use copy_to_user when using page cache*/ | 1399 | }*/ /* can not use copy_to_user when using page cache*/ |
| 1395 | if (*buf) | 1400 | if (*buf) |
| @@ -1433,7 +1438,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, | |||
| 1433 | 1438 | ||
| 1434 | *nbytes = 0; | 1439 | *nbytes = 0; |
| 1435 | 1440 | ||
| 1436 | /* cFYI(1, ("write at %lld %d bytes", offset, count));*/ | 1441 | /* cFYI(1, "write at %lld %d bytes", offset, count);*/ |
| 1437 | if (tcon->ses == NULL) | 1442 | if (tcon->ses == NULL) |
| 1438 | return -ECONNABORTED; | 1443 | return -ECONNABORTED; |
| 1439 | 1444 | ||
| @@ -1514,7 +1519,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, | |||
| 1514 | (struct smb_hdr *) pSMBr, &bytes_returned, long_op); | 1519 | (struct smb_hdr *) pSMBr, &bytes_returned, long_op); |
| 1515 | cifs_stats_inc(&tcon->num_writes); | 1520 | cifs_stats_inc(&tcon->num_writes); |
| 1516 | if (rc) { | 1521 | if (rc) { |
| 1517 | cFYI(1, ("Send error in write = %d", rc)); | 1522 | cFYI(1, "Send error in write = %d", rc); |
| 1518 | } else { | 1523 | } else { |
| 1519 | *nbytes = le16_to_cpu(pSMBr->CountHigh); | 1524 | *nbytes = le16_to_cpu(pSMBr->CountHigh); |
| 1520 | *nbytes = (*nbytes) << 16; | 1525 | *nbytes = (*nbytes) << 16; |
| @@ -1551,7 +1556,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
| 1551 | 1556 | ||
| 1552 | *nbytes = 0; | 1557 | *nbytes = 0; |
| 1553 | 1558 | ||
| 1554 | cFYI(1, ("write2 at %lld %d bytes", (long long)offset, count)); | 1559 | cFYI(1, "write2 at %lld %d bytes", (long long)offset, count); |
| 1555 | 1560 | ||
| 1556 | if (tcon->ses->capabilities & CAP_LARGE_FILES) { | 1561 | if (tcon->ses->capabilities & CAP_LARGE_FILES) { |
| 1557 | wct = 14; | 1562 | wct = 14; |
| @@ -1606,7 +1611,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
| 1606 | long_op); | 1611 | long_op); |
| 1607 | cifs_stats_inc(&tcon->num_writes); | 1612 | cifs_stats_inc(&tcon->num_writes); |
| 1608 | if (rc) { | 1613 | if (rc) { |
| 1609 | cFYI(1, ("Send error Write2 = %d", rc)); | 1614 | cFYI(1, "Send error Write2 = %d", rc); |
| 1610 | } else if (resp_buf_type == 0) { | 1615 | } else if (resp_buf_type == 0) { |
| 1611 | /* presumably this can not happen, but best to be safe */ | 1616 | /* presumably this can not happen, but best to be safe */ |
| 1612 | rc = -EIO; | 1617 | rc = -EIO; |
| @@ -1651,7 +1656,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon, | |||
| 1651 | int timeout = 0; | 1656 | int timeout = 0; |
| 1652 | __u16 count; | 1657 | __u16 count; |
| 1653 | 1658 | ||
| 1654 | cFYI(1, ("CIFSSMBLock timeout %d numLock %d", (int)waitFlag, numLock)); | 1659 | cFYI(1, "CIFSSMBLock timeout %d numLock %d", (int)waitFlag, numLock); |
| 1655 | rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB); | 1660 | rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB); |
| 1656 | 1661 | ||
| 1657 | if (rc) | 1662 | if (rc) |
| @@ -1699,7 +1704,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon, | |||
| 1699 | } | 1704 | } |
| 1700 | cifs_stats_inc(&tcon->num_locks); | 1705 | cifs_stats_inc(&tcon->num_locks); |
| 1701 | if (rc) | 1706 | if (rc) |
| 1702 | cFYI(1, ("Send error in Lock = %d", rc)); | 1707 | cFYI(1, "Send error in Lock = %d", rc); |
| 1703 | 1708 | ||
| 1704 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 1709 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
| 1705 | since file handle passed in no longer valid */ | 1710 | since file handle passed in no longer valid */ |
| @@ -1722,7 +1727,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon, | |||
| 1722 | __u16 params, param_offset, offset, byte_count, count; | 1727 | __u16 params, param_offset, offset, byte_count, count; |
| 1723 | struct kvec iov[1]; | 1728 | struct kvec iov[1]; |
| 1724 | 1729 | ||
| 1725 | cFYI(1, ("Posix Lock")); | 1730 | cFYI(1, "Posix Lock"); |
| 1726 | 1731 | ||
| 1727 | if (pLockData == NULL) | 1732 | if (pLockData == NULL) |
| 1728 | return -EINVAL; | 1733 | return -EINVAL; |
| @@ -1792,7 +1797,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon, | |||
| 1792 | } | 1797 | } |
| 1793 | 1798 | ||
| 1794 | if (rc) { | 1799 | if (rc) { |
| 1795 | cFYI(1, ("Send error in Posix Lock = %d", rc)); | 1800 | cFYI(1, "Send error in Posix Lock = %d", rc); |
| 1796 | } else if (get_flag) { | 1801 | } else if (get_flag) { |
| 1797 | /* lock structure can be returned on get */ | 1802 | /* lock structure can be returned on get */ |
| 1798 | __u16 data_offset; | 1803 | __u16 data_offset; |
| @@ -1849,7 +1854,7 @@ CIFSSMBClose(const int xid, struct cifsTconInfo *tcon, int smb_file_id) | |||
| 1849 | { | 1854 | { |
| 1850 | int rc = 0; | 1855 | int rc = 0; |
| 1851 | CLOSE_REQ *pSMB = NULL; | 1856 | CLOSE_REQ *pSMB = NULL; |
| 1852 | cFYI(1, ("In CIFSSMBClose")); | 1857 | cFYI(1, "In CIFSSMBClose"); |
| 1853 | 1858 | ||
| 1854 | /* do not retry on dead session on close */ | 1859 | /* do not retry on dead session on close */ |
| 1855 | rc = small_smb_init(SMB_COM_CLOSE, 3, tcon, (void **) &pSMB); | 1860 | rc = small_smb_init(SMB_COM_CLOSE, 3, tcon, (void **) &pSMB); |
| @@ -1866,7 +1871,7 @@ CIFSSMBClose(const int xid, struct cifsTconInfo *tcon, int smb_file_id) | |||
| 1866 | if (rc) { | 1871 | if (rc) { |
| 1867 | if (rc != -EINTR) { | 1872 | if (rc != -EINTR) { |
| 1868 | /* EINTR is expected when user ctl-c to kill app */ | 1873 | /* EINTR is expected when user ctl-c to kill app */ |
| 1869 | cERROR(1, ("Send error in Close = %d", rc)); | 1874 | cERROR(1, "Send error in Close = %d", rc); |
| 1870 | } | 1875 | } |
| 1871 | } | 1876 | } |
| 1872 | 1877 | ||
| @@ -1882,7 +1887,7 @@ CIFSSMBFlush(const int xid, struct cifsTconInfo *tcon, int smb_file_id) | |||
| 1882 | { | 1887 | { |
| 1883 | int rc = 0; | 1888 | int rc = 0; |
| 1884 | FLUSH_REQ *pSMB = NULL; | 1889 | FLUSH_REQ *pSMB = NULL; |
| 1885 | cFYI(1, ("In CIFSSMBFlush")); | 1890 | cFYI(1, "In CIFSSMBFlush"); |
| 1886 | 1891 | ||
| 1887 | rc = small_smb_init(SMB_COM_FLUSH, 1, tcon, (void **) &pSMB); | 1892 | rc = small_smb_init(SMB_COM_FLUSH, 1, tcon, (void **) &pSMB); |
| 1888 | if (rc) | 1893 | if (rc) |
| @@ -1893,7 +1898,7 @@ CIFSSMBFlush(const int xid, struct cifsTconInfo *tcon, int smb_file_id) | |||
| 1893 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 1898 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
| 1894 | cifs_stats_inc(&tcon->num_flushes); | 1899 | cifs_stats_inc(&tcon->num_flushes); |
| 1895 | if (rc) | 1900 | if (rc) |
| 1896 | cERROR(1, ("Send error in Flush = %d", rc)); | 1901 | cERROR(1, "Send error in Flush = %d", rc); |
| 1897 | 1902 | ||
| 1898 | return rc; | 1903 | return rc; |
| 1899 | } | 1904 | } |
| @@ -1910,7 +1915,7 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon, | |||
| 1910 | int name_len, name_len2; | 1915 | int name_len, name_len2; |
| 1911 | __u16 count; | 1916 | __u16 count; |
| 1912 | 1917 | ||
| 1913 | cFYI(1, ("In CIFSSMBRename")); | 1918 | cFYI(1, "In CIFSSMBRename"); |
| 1914 | renameRetry: | 1919 | renameRetry: |
| 1915 | rc = smb_init(SMB_COM_RENAME, 1, tcon, (void **) &pSMB, | 1920 | rc = smb_init(SMB_COM_RENAME, 1, tcon, (void **) &pSMB, |
| 1916 | (void **) &pSMBr); | 1921 | (void **) &pSMBr); |
| @@ -1956,7 +1961,7 @@ renameRetry: | |||
| 1956 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 1961 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 1957 | cifs_stats_inc(&tcon->num_renames); | 1962 | cifs_stats_inc(&tcon->num_renames); |
| 1958 | if (rc) | 1963 | if (rc) |
| 1959 | cFYI(1, ("Send error in rename = %d", rc)); | 1964 | cFYI(1, "Send error in rename = %d", rc); |
| 1960 | 1965 | ||
| 1961 | cifs_buf_release(pSMB); | 1966 | cifs_buf_release(pSMB); |
| 1962 | 1967 | ||
| @@ -1980,7 +1985,7 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | |||
| 1980 | int len_of_str; | 1985 | int len_of_str; |
| 1981 | __u16 params, param_offset, offset, count, byte_count; | 1986 | __u16 params, param_offset, offset, count, byte_count; |
| 1982 | 1987 | ||
| 1983 | cFYI(1, ("Rename to File by handle")); | 1988 | cFYI(1, "Rename to File by handle"); |
| 1984 | rc = smb_init(SMB_COM_TRANSACTION2, 15, pTcon, (void **) &pSMB, | 1989 | rc = smb_init(SMB_COM_TRANSACTION2, 15, pTcon, (void **) &pSMB, |
| 1985 | (void **) &pSMBr); | 1990 | (void **) &pSMBr); |
| 1986 | if (rc) | 1991 | if (rc) |
| @@ -2035,7 +2040,7 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | |||
| 2035 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2040 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2036 | cifs_stats_inc(&pTcon->num_t2renames); | 2041 | cifs_stats_inc(&pTcon->num_t2renames); |
| 2037 | if (rc) | 2042 | if (rc) |
| 2038 | cFYI(1, ("Send error in Rename (by file handle) = %d", rc)); | 2043 | cFYI(1, "Send error in Rename (by file handle) = %d", rc); |
| 2039 | 2044 | ||
| 2040 | cifs_buf_release(pSMB); | 2045 | cifs_buf_release(pSMB); |
| 2041 | 2046 | ||
| @@ -2057,7 +2062,7 @@ CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char *fromName, | |||
| 2057 | int name_len, name_len2; | 2062 | int name_len, name_len2; |
| 2058 | __u16 count; | 2063 | __u16 count; |
| 2059 | 2064 | ||
| 2060 | cFYI(1, ("In CIFSSMBCopy")); | 2065 | cFYI(1, "In CIFSSMBCopy"); |
| 2061 | copyRetry: | 2066 | copyRetry: |
| 2062 | rc = smb_init(SMB_COM_COPY, 1, tcon, (void **) &pSMB, | 2067 | rc = smb_init(SMB_COM_COPY, 1, tcon, (void **) &pSMB, |
| 2063 | (void **) &pSMBr); | 2068 | (void **) &pSMBr); |
| @@ -2102,8 +2107,8 @@ copyRetry: | |||
| 2102 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2107 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 2103 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2108 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2104 | if (rc) { | 2109 | if (rc) { |
| 2105 | cFYI(1, ("Send error in copy = %d with %d files copied", | 2110 | cFYI(1, "Send error in copy = %d with %d files copied", |
| 2106 | rc, le16_to_cpu(pSMBr->CopyCount))); | 2111 | rc, le16_to_cpu(pSMBr->CopyCount)); |
| 2107 | } | 2112 | } |
| 2108 | cifs_buf_release(pSMB); | 2113 | cifs_buf_release(pSMB); |
| 2109 | 2114 | ||
| @@ -2127,7 +2132,7 @@ CIFSUnixCreateSymLink(const int xid, struct cifsTconInfo *tcon, | |||
| 2127 | int bytes_returned = 0; | 2132 | int bytes_returned = 0; |
| 2128 | __u16 params, param_offset, offset, byte_count; | 2133 | __u16 params, param_offset, offset, byte_count; |
| 2129 | 2134 | ||
| 2130 | cFYI(1, ("In Symlink Unix style")); | 2135 | cFYI(1, "In Symlink Unix style"); |
| 2131 | createSymLinkRetry: | 2136 | createSymLinkRetry: |
| 2132 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 2137 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 2133 | (void **) &pSMBr); | 2138 | (void **) &pSMBr); |
| @@ -2192,7 +2197,7 @@ createSymLinkRetry: | |||
| 2192 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2197 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2193 | cifs_stats_inc(&tcon->num_symlinks); | 2198 | cifs_stats_inc(&tcon->num_symlinks); |
| 2194 | if (rc) | 2199 | if (rc) |
| 2195 | cFYI(1, ("Send error in SetPathInfo create symlink = %d", rc)); | 2200 | cFYI(1, "Send error in SetPathInfo create symlink = %d", rc); |
| 2196 | 2201 | ||
| 2197 | cifs_buf_release(pSMB); | 2202 | cifs_buf_release(pSMB); |
| 2198 | 2203 | ||
| @@ -2216,7 +2221,7 @@ CIFSUnixCreateHardLink(const int xid, struct cifsTconInfo *tcon, | |||
| 2216 | int bytes_returned = 0; | 2221 | int bytes_returned = 0; |
| 2217 | __u16 params, param_offset, offset, byte_count; | 2222 | __u16 params, param_offset, offset, byte_count; |
| 2218 | 2223 | ||
| 2219 | cFYI(1, ("In Create Hard link Unix style")); | 2224 | cFYI(1, "In Create Hard link Unix style"); |
| 2220 | createHardLinkRetry: | 2225 | createHardLinkRetry: |
| 2221 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 2226 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 2222 | (void **) &pSMBr); | 2227 | (void **) &pSMBr); |
| @@ -2278,7 +2283,7 @@ createHardLinkRetry: | |||
| 2278 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2283 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2279 | cifs_stats_inc(&tcon->num_hardlinks); | 2284 | cifs_stats_inc(&tcon->num_hardlinks); |
| 2280 | if (rc) | 2285 | if (rc) |
| 2281 | cFYI(1, ("Send error in SetPathInfo (hard link) = %d", rc)); | 2286 | cFYI(1, "Send error in SetPathInfo (hard link) = %d", rc); |
| 2282 | 2287 | ||
| 2283 | cifs_buf_release(pSMB); | 2288 | cifs_buf_release(pSMB); |
| 2284 | if (rc == -EAGAIN) | 2289 | if (rc == -EAGAIN) |
| @@ -2299,7 +2304,7 @@ CIFSCreateHardLink(const int xid, struct cifsTconInfo *tcon, | |||
| 2299 | int name_len, name_len2; | 2304 | int name_len, name_len2; |
| 2300 | __u16 count; | 2305 | __u16 count; |
| 2301 | 2306 | ||
| 2302 | cFYI(1, ("In CIFSCreateHardLink")); | 2307 | cFYI(1, "In CIFSCreateHardLink"); |
| 2303 | winCreateHardLinkRetry: | 2308 | winCreateHardLinkRetry: |
| 2304 | 2309 | ||
| 2305 | rc = smb_init(SMB_COM_NT_RENAME, 4, tcon, (void **) &pSMB, | 2310 | rc = smb_init(SMB_COM_NT_RENAME, 4, tcon, (void **) &pSMB, |
| @@ -2350,7 +2355,7 @@ winCreateHardLinkRetry: | |||
| 2350 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2355 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2351 | cifs_stats_inc(&tcon->num_hardlinks); | 2356 | cifs_stats_inc(&tcon->num_hardlinks); |
| 2352 | if (rc) | 2357 | if (rc) |
| 2353 | cFYI(1, ("Send error in hard link (NT rename) = %d", rc)); | 2358 | cFYI(1, "Send error in hard link (NT rename) = %d", rc); |
| 2354 | 2359 | ||
| 2355 | cifs_buf_release(pSMB); | 2360 | cifs_buf_release(pSMB); |
| 2356 | if (rc == -EAGAIN) | 2361 | if (rc == -EAGAIN) |
| @@ -2373,7 +2378,7 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon, | |||
| 2373 | __u16 params, byte_count; | 2378 | __u16 params, byte_count; |
| 2374 | char *data_start; | 2379 | char *data_start; |
| 2375 | 2380 | ||
| 2376 | cFYI(1, ("In QPathSymLinkInfo (Unix) for path %s", searchName)); | 2381 | cFYI(1, "In QPathSymLinkInfo (Unix) for path %s", searchName); |
| 2377 | 2382 | ||
| 2378 | querySymLinkRetry: | 2383 | querySymLinkRetry: |
| 2379 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 2384 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| @@ -2420,7 +2425,7 @@ querySymLinkRetry: | |||
| 2420 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2425 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 2421 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2426 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2422 | if (rc) { | 2427 | if (rc) { |
| 2423 | cFYI(1, ("Send error in QuerySymLinkInfo = %d", rc)); | 2428 | cFYI(1, "Send error in QuerySymLinkInfo = %d", rc); |
| 2424 | } else { | 2429 | } else { |
| 2425 | /* decode response */ | 2430 | /* decode response */ |
| 2426 | 2431 | ||
| @@ -2521,21 +2526,21 @@ validate_ntransact(char *buf, char **ppparm, char **ppdata, | |||
| 2521 | 2526 | ||
| 2522 | /* should we also check that parm and data areas do not overlap? */ | 2527 | /* should we also check that parm and data areas do not overlap? */ |
| 2523 | if (*ppparm > end_of_smb) { | 2528 | if (*ppparm > end_of_smb) { |
| 2524 | cFYI(1, ("parms start after end of smb")); | 2529 | cFYI(1, "parms start after end of smb"); |
| 2525 | return -EINVAL; | 2530 | return -EINVAL; |
| 2526 | } else if (parm_count + *ppparm > end_of_smb) { | 2531 | } else if (parm_count + *ppparm > end_of_smb) { |
| 2527 | cFYI(1, ("parm end after end of smb")); | 2532 | cFYI(1, "parm end after end of smb"); |
| 2528 | return -EINVAL; | 2533 | return -EINVAL; |
| 2529 | } else if (*ppdata > end_of_smb) { | 2534 | } else if (*ppdata > end_of_smb) { |
| 2530 | cFYI(1, ("data starts after end of smb")); | 2535 | cFYI(1, "data starts after end of smb"); |
| 2531 | return -EINVAL; | 2536 | return -EINVAL; |
| 2532 | } else if (data_count + *ppdata > end_of_smb) { | 2537 | } else if (data_count + *ppdata > end_of_smb) { |
| 2533 | cFYI(1, ("data %p + count %d (%p) ends after end of smb %p start %p", | 2538 | cFYI(1, "data %p + count %d (%p) past smb end %p start %p", |
| 2534 | *ppdata, data_count, (data_count + *ppdata), | 2539 | *ppdata, data_count, (data_count + *ppdata), |
| 2535 | end_of_smb, pSMBr)); | 2540 | end_of_smb, pSMBr); |
| 2536 | return -EINVAL; | 2541 | return -EINVAL; |
| 2537 | } else if (parm_count + data_count > pSMBr->ByteCount) { | 2542 | } else if (parm_count + data_count > pSMBr->ByteCount) { |
| 2538 | cFYI(1, ("parm count and data count larger than SMB")); | 2543 | cFYI(1, "parm count and data count larger than SMB"); |
| 2539 | return -EINVAL; | 2544 | return -EINVAL; |
| 2540 | } | 2545 | } |
| 2541 | *pdatalen = data_count; | 2546 | *pdatalen = data_count; |
| @@ -2554,7 +2559,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 2554 | struct smb_com_transaction_ioctl_req *pSMB; | 2559 | struct smb_com_transaction_ioctl_req *pSMB; |
| 2555 | struct smb_com_transaction_ioctl_rsp *pSMBr; | 2560 | struct smb_com_transaction_ioctl_rsp *pSMBr; |
| 2556 | 2561 | ||
| 2557 | cFYI(1, ("In Windows reparse style QueryLink for path %s", searchName)); | 2562 | cFYI(1, "In Windows reparse style QueryLink for path %s", searchName); |
| 2558 | rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, | 2563 | rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, |
| 2559 | (void **) &pSMBr); | 2564 | (void **) &pSMBr); |
| 2560 | if (rc) | 2565 | if (rc) |
| @@ -2583,7 +2588,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 2583 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2588 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 2584 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2589 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2585 | if (rc) { | 2590 | if (rc) { |
| 2586 | cFYI(1, ("Send error in QueryReparseLinkInfo = %d", rc)); | 2591 | cFYI(1, "Send error in QueryReparseLinkInfo = %d", rc); |
| 2587 | } else { /* decode response */ | 2592 | } else { /* decode response */ |
| 2588 | __u32 data_offset = le32_to_cpu(pSMBr->DataOffset); | 2593 | __u32 data_offset = le32_to_cpu(pSMBr->DataOffset); |
| 2589 | __u32 data_count = le32_to_cpu(pSMBr->DataCount); | 2594 | __u32 data_count = le32_to_cpu(pSMBr->DataCount); |
| @@ -2607,7 +2612,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 2607 | if ((reparse_buf->LinkNamesBuf + | 2612 | if ((reparse_buf->LinkNamesBuf + |
| 2608 | reparse_buf->TargetNameOffset + | 2613 | reparse_buf->TargetNameOffset + |
| 2609 | reparse_buf->TargetNameLen) > end_of_smb) { | 2614 | reparse_buf->TargetNameLen) > end_of_smb) { |
| 2610 | cFYI(1, ("reparse buf beyond SMB")); | 2615 | cFYI(1, "reparse buf beyond SMB"); |
| 2611 | rc = -EIO; | 2616 | rc = -EIO; |
| 2612 | goto qreparse_out; | 2617 | goto qreparse_out; |
| 2613 | } | 2618 | } |
| @@ -2628,12 +2633,12 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 2628 | } | 2633 | } |
| 2629 | } else { | 2634 | } else { |
| 2630 | rc = -EIO; | 2635 | rc = -EIO; |
| 2631 | cFYI(1, ("Invalid return data count on " | 2636 | cFYI(1, "Invalid return data count on " |
| 2632 | "get reparse info ioctl")); | 2637 | "get reparse info ioctl"); |
| 2633 | } | 2638 | } |
| 2634 | symlinkinfo[buflen] = 0; /* just in case so the caller | 2639 | symlinkinfo[buflen] = 0; /* just in case so the caller |
| 2635 | does not go off the end of the buffer */ | 2640 | does not go off the end of the buffer */ |
| 2636 | cFYI(1, ("readlink result - %s", symlinkinfo)); | 2641 | cFYI(1, "readlink result - %s", symlinkinfo); |
| 2637 | } | 2642 | } |
| 2638 | 2643 | ||
| 2639 | qreparse_out: | 2644 | qreparse_out: |
| @@ -2656,7 +2661,7 @@ static void cifs_convert_ace(posix_acl_xattr_entry *ace, | |||
| 2656 | ace->e_perm = cpu_to_le16(cifs_ace->cifs_e_perm); | 2661 | ace->e_perm = cpu_to_le16(cifs_ace->cifs_e_perm); |
| 2657 | ace->e_tag = cpu_to_le16(cifs_ace->cifs_e_tag); | 2662 | ace->e_tag = cpu_to_le16(cifs_ace->cifs_e_tag); |
| 2658 | ace->e_id = cpu_to_le32(le64_to_cpu(cifs_ace->cifs_uid)); | 2663 | ace->e_id = cpu_to_le32(le64_to_cpu(cifs_ace->cifs_uid)); |
| 2659 | /* cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id)); */ | 2664 | /* cFYI(1, "perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id); */ |
| 2660 | 2665 | ||
| 2661 | return; | 2666 | return; |
| 2662 | } | 2667 | } |
| @@ -2682,8 +2687,8 @@ static int cifs_copy_posix_acl(char *trgt, char *src, const int buflen, | |||
| 2682 | size += sizeof(struct cifs_posix_ace) * count; | 2687 | size += sizeof(struct cifs_posix_ace) * count; |
| 2683 | /* check if we would go beyond end of SMB */ | 2688 | /* check if we would go beyond end of SMB */ |
| 2684 | if (size_of_data_area < size) { | 2689 | if (size_of_data_area < size) { |
| 2685 | cFYI(1, ("bad CIFS POSIX ACL size %d vs. %d", | 2690 | cFYI(1, "bad CIFS POSIX ACL size %d vs. %d", |
| 2686 | size_of_data_area, size)); | 2691 | size_of_data_area, size); |
| 2687 | return -EINVAL; | 2692 | return -EINVAL; |
| 2688 | } | 2693 | } |
| 2689 | } else if (acl_type & ACL_TYPE_DEFAULT) { | 2694 | } else if (acl_type & ACL_TYPE_DEFAULT) { |
| @@ -2730,7 +2735,7 @@ static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace *cifs_ace, | |||
| 2730 | cifs_ace->cifs_uid = cpu_to_le64(-1); | 2735 | cifs_ace->cifs_uid = cpu_to_le64(-1); |
| 2731 | } else | 2736 | } else |
| 2732 | cifs_ace->cifs_uid = cpu_to_le64(le32_to_cpu(local_ace->e_id)); | 2737 | cifs_ace->cifs_uid = cpu_to_le64(le32_to_cpu(local_ace->e_id)); |
| 2733 | /*cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id));*/ | 2738 | /*cFYI(1, "perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id);*/ |
| 2734 | return rc; | 2739 | return rc; |
| 2735 | } | 2740 | } |
| 2736 | 2741 | ||
| @@ -2748,12 +2753,12 @@ static __u16 ACL_to_cifs_posix(char *parm_data, const char *pACL, | |||
| 2748 | return 0; | 2753 | return 0; |
| 2749 | 2754 | ||
| 2750 | count = posix_acl_xattr_count((size_t)buflen); | 2755 | count = posix_acl_xattr_count((size_t)buflen); |
| 2751 | cFYI(1, ("setting acl with %d entries from buf of length %d and " | 2756 | cFYI(1, "setting acl with %d entries from buf of length %d and " |
| 2752 | "version of %d", | 2757 | "version of %d", |
| 2753 | count, buflen, le32_to_cpu(local_acl->a_version))); | 2758 | count, buflen, le32_to_cpu(local_acl->a_version)); |
| 2754 | if (le32_to_cpu(local_acl->a_version) != 2) { | 2759 | if (le32_to_cpu(local_acl->a_version) != 2) { |
| 2755 | cFYI(1, ("unknown POSIX ACL version %d", | 2760 | cFYI(1, "unknown POSIX ACL version %d", |
| 2756 | le32_to_cpu(local_acl->a_version))); | 2761 | le32_to_cpu(local_acl->a_version)); |
| 2757 | return 0; | 2762 | return 0; |
| 2758 | } | 2763 | } |
| 2759 | cifs_acl->version = cpu_to_le16(1); | 2764 | cifs_acl->version = cpu_to_le16(1); |
| @@ -2762,7 +2767,7 @@ static __u16 ACL_to_cifs_posix(char *parm_data, const char *pACL, | |||
| 2762 | else if (acl_type == ACL_TYPE_DEFAULT) | 2767 | else if (acl_type == ACL_TYPE_DEFAULT) |
| 2763 | cifs_acl->default_entry_count = cpu_to_le16(count); | 2768 | cifs_acl->default_entry_count = cpu_to_le16(count); |
| 2764 | else { | 2769 | else { |
| 2765 | cFYI(1, ("unknown ACL type %d", acl_type)); | 2770 | cFYI(1, "unknown ACL type %d", acl_type); |
| 2766 | return 0; | 2771 | return 0; |
| 2767 | } | 2772 | } |
| 2768 | for (i = 0; i < count; i++) { | 2773 | for (i = 0; i < count; i++) { |
| @@ -2795,7 +2800,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon, | |||
| 2795 | int name_len; | 2800 | int name_len; |
| 2796 | __u16 params, byte_count; | 2801 | __u16 params, byte_count; |
| 2797 | 2802 | ||
| 2798 | cFYI(1, ("In GetPosixACL (Unix) for path %s", searchName)); | 2803 | cFYI(1, "In GetPosixACL (Unix) for path %s", searchName); |
| 2799 | 2804 | ||
| 2800 | queryAclRetry: | 2805 | queryAclRetry: |
| 2801 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 2806 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| @@ -2847,7 +2852,7 @@ queryAclRetry: | |||
| 2847 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2852 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2848 | cifs_stats_inc(&tcon->num_acl_get); | 2853 | cifs_stats_inc(&tcon->num_acl_get); |
| 2849 | if (rc) { | 2854 | if (rc) { |
| 2850 | cFYI(1, ("Send error in Query POSIX ACL = %d", rc)); | 2855 | cFYI(1, "Send error in Query POSIX ACL = %d", rc); |
| 2851 | } else { | 2856 | } else { |
| 2852 | /* decode response */ | 2857 | /* decode response */ |
| 2853 | 2858 | ||
| @@ -2884,7 +2889,7 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon, | |||
| 2884 | int bytes_returned = 0; | 2889 | int bytes_returned = 0; |
| 2885 | __u16 params, byte_count, data_count, param_offset, offset; | 2890 | __u16 params, byte_count, data_count, param_offset, offset; |
| 2886 | 2891 | ||
| 2887 | cFYI(1, ("In SetPosixACL (Unix) for path %s", fileName)); | 2892 | cFYI(1, "In SetPosixACL (Unix) for path %s", fileName); |
| 2888 | setAclRetry: | 2893 | setAclRetry: |
| 2889 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 2894 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 2890 | (void **) &pSMBr); | 2895 | (void **) &pSMBr); |
| @@ -2939,7 +2944,7 @@ setAclRetry: | |||
| 2939 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2944 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 2940 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2945 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 2941 | if (rc) | 2946 | if (rc) |
| 2942 | cFYI(1, ("Set POSIX ACL returned %d", rc)); | 2947 | cFYI(1, "Set POSIX ACL returned %d", rc); |
| 2943 | 2948 | ||
| 2944 | setACLerrorExit: | 2949 | setACLerrorExit: |
| 2945 | cifs_buf_release(pSMB); | 2950 | cifs_buf_release(pSMB); |
| @@ -2959,7 +2964,7 @@ CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, | |||
| 2959 | int bytes_returned; | 2964 | int bytes_returned; |
| 2960 | __u16 params, byte_count; | 2965 | __u16 params, byte_count; |
| 2961 | 2966 | ||
| 2962 | cFYI(1, ("In GetExtAttr")); | 2967 | cFYI(1, "In GetExtAttr"); |
| 2963 | if (tcon == NULL) | 2968 | if (tcon == NULL) |
| 2964 | return -ENODEV; | 2969 | return -ENODEV; |
| 2965 | 2970 | ||
| @@ -2998,7 +3003,7 @@ GetExtAttrRetry: | |||
| 2998 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3003 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 2999 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3004 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3000 | if (rc) { | 3005 | if (rc) { |
| 3001 | cFYI(1, ("error %d in GetExtAttr", rc)); | 3006 | cFYI(1, "error %d in GetExtAttr", rc); |
| 3002 | } else { | 3007 | } else { |
| 3003 | /* decode response */ | 3008 | /* decode response */ |
| 3004 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3009 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| @@ -3013,7 +3018,7 @@ GetExtAttrRetry: | |||
| 3013 | struct file_chattr_info *pfinfo; | 3018 | struct file_chattr_info *pfinfo; |
| 3014 | /* BB Do we need a cast or hash here ? */ | 3019 | /* BB Do we need a cast or hash here ? */ |
| 3015 | if (count != 16) { | 3020 | if (count != 16) { |
| 3016 | cFYI(1, ("Illegal size ret in GetExtAttr")); | 3021 | cFYI(1, "Illegal size ret in GetExtAttr"); |
| 3017 | rc = -EIO; | 3022 | rc = -EIO; |
| 3018 | goto GetExtAttrOut; | 3023 | goto GetExtAttrOut; |
| 3019 | } | 3024 | } |
| @@ -3043,7 +3048,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
| 3043 | QUERY_SEC_DESC_REQ *pSMB; | 3048 | QUERY_SEC_DESC_REQ *pSMB; |
| 3044 | struct kvec iov[1]; | 3049 | struct kvec iov[1]; |
| 3045 | 3050 | ||
| 3046 | cFYI(1, ("GetCifsACL")); | 3051 | cFYI(1, "GetCifsACL"); |
| 3047 | 3052 | ||
| 3048 | *pbuflen = 0; | 3053 | *pbuflen = 0; |
| 3049 | *acl_inf = NULL; | 3054 | *acl_inf = NULL; |
| @@ -3068,7 +3073,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
| 3068 | CIFS_STD_OP); | 3073 | CIFS_STD_OP); |
| 3069 | cifs_stats_inc(&tcon->num_acl_get); | 3074 | cifs_stats_inc(&tcon->num_acl_get); |
| 3070 | if (rc) { | 3075 | if (rc) { |
| 3071 | cFYI(1, ("Send error in QuerySecDesc = %d", rc)); | 3076 | cFYI(1, "Send error in QuerySecDesc = %d", rc); |
| 3072 | } else { /* decode response */ | 3077 | } else { /* decode response */ |
| 3073 | __le32 *parm; | 3078 | __le32 *parm; |
| 3074 | __u32 parm_len; | 3079 | __u32 parm_len; |
| @@ -3083,7 +3088,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
| 3083 | goto qsec_out; | 3088 | goto qsec_out; |
| 3084 | pSMBr = (struct smb_com_ntransact_rsp *)iov[0].iov_base; | 3089 | pSMBr = (struct smb_com_ntransact_rsp *)iov[0].iov_base; |
| 3085 | 3090 | ||
| 3086 | cFYI(1, ("smb %p parm %p data %p", pSMBr, parm, *acl_inf)); | 3091 | cFYI(1, "smb %p parm %p data %p", pSMBr, parm, *acl_inf); |
| 3087 | 3092 | ||
| 3088 | if (le32_to_cpu(pSMBr->ParameterCount) != 4) { | 3093 | if (le32_to_cpu(pSMBr->ParameterCount) != 4) { |
| 3089 | rc = -EIO; /* bad smb */ | 3094 | rc = -EIO; /* bad smb */ |
| @@ -3095,8 +3100,8 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
| 3095 | 3100 | ||
| 3096 | acl_len = le32_to_cpu(*parm); | 3101 | acl_len = le32_to_cpu(*parm); |
| 3097 | if (acl_len != *pbuflen) { | 3102 | if (acl_len != *pbuflen) { |
| 3098 | cERROR(1, ("acl length %d does not match %d", | 3103 | cERROR(1, "acl length %d does not match %d", |
| 3099 | acl_len, *pbuflen)); | 3104 | acl_len, *pbuflen); |
| 3100 | if (*pbuflen > acl_len) | 3105 | if (*pbuflen > acl_len) |
| 3101 | *pbuflen = acl_len; | 3106 | *pbuflen = acl_len; |
| 3102 | } | 3107 | } |
| @@ -3105,7 +3110,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
| 3105 | header followed by the smallest SID */ | 3110 | header followed by the smallest SID */ |
| 3106 | if ((*pbuflen < sizeof(struct cifs_ntsd) + 8) || | 3111 | if ((*pbuflen < sizeof(struct cifs_ntsd) + 8) || |
| 3107 | (*pbuflen >= 64 * 1024)) { | 3112 | (*pbuflen >= 64 * 1024)) { |
| 3108 | cERROR(1, ("bad acl length %d", *pbuflen)); | 3113 | cERROR(1, "bad acl length %d", *pbuflen); |
| 3109 | rc = -EINVAL; | 3114 | rc = -EINVAL; |
| 3110 | *pbuflen = 0; | 3115 | *pbuflen = 0; |
| 3111 | } else { | 3116 | } else { |
| @@ -3179,9 +3184,9 @@ setCifsAclRetry: | |||
| 3179 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3184 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3180 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3185 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3181 | 3186 | ||
| 3182 | cFYI(1, ("SetCIFSACL bytes_returned: %d, rc: %d", bytes_returned, rc)); | 3187 | cFYI(1, "SetCIFSACL bytes_returned: %d, rc: %d", bytes_returned, rc); |
| 3183 | if (rc) | 3188 | if (rc) |
| 3184 | cFYI(1, ("Set CIFS ACL returned %d", rc)); | 3189 | cFYI(1, "Set CIFS ACL returned %d", rc); |
| 3185 | cifs_buf_release(pSMB); | 3190 | cifs_buf_release(pSMB); |
| 3186 | 3191 | ||
| 3187 | if (rc == -EAGAIN) | 3192 | if (rc == -EAGAIN) |
| @@ -3205,7 +3210,7 @@ int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon, | |||
| 3205 | int bytes_returned; | 3210 | int bytes_returned; |
| 3206 | int name_len; | 3211 | int name_len; |
| 3207 | 3212 | ||
| 3208 | cFYI(1, ("In SMBQPath path %s", searchName)); | 3213 | cFYI(1, "In SMBQPath path %s", searchName); |
| 3209 | QInfRetry: | 3214 | QInfRetry: |
| 3210 | rc = smb_init(SMB_COM_QUERY_INFORMATION, 0, tcon, (void **) &pSMB, | 3215 | rc = smb_init(SMB_COM_QUERY_INFORMATION, 0, tcon, (void **) &pSMB, |
| 3211 | (void **) &pSMBr); | 3216 | (void **) &pSMBr); |
| @@ -3231,7 +3236,7 @@ QInfRetry: | |||
| 3231 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3236 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3232 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3237 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3233 | if (rc) { | 3238 | if (rc) { |
| 3234 | cFYI(1, ("Send error in QueryInfo = %d", rc)); | 3239 | cFYI(1, "Send error in QueryInfo = %d", rc); |
| 3235 | } else if (pFinfo) { | 3240 | } else if (pFinfo) { |
| 3236 | struct timespec ts; | 3241 | struct timespec ts; |
| 3237 | __u32 time = le32_to_cpu(pSMBr->last_write_time); | 3242 | __u32 time = le32_to_cpu(pSMBr->last_write_time); |
| @@ -3305,7 +3310,7 @@ QFileInfoRetry: | |||
| 3305 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3310 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3306 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3311 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3307 | if (rc) { | 3312 | if (rc) { |
| 3308 | cFYI(1, ("Send error in QPathInfo = %d", rc)); | 3313 | cFYI(1, "Send error in QPathInfo = %d", rc); |
| 3309 | } else { /* decode response */ | 3314 | } else { /* decode response */ |
| 3310 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3315 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3311 | 3316 | ||
| @@ -3343,7 +3348,7 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 3343 | int name_len; | 3348 | int name_len; |
| 3344 | __u16 params, byte_count; | 3349 | __u16 params, byte_count; |
| 3345 | 3350 | ||
| 3346 | /* cFYI(1, ("In QPathInfo path %s", searchName)); */ | 3351 | /* cFYI(1, "In QPathInfo path %s", searchName); */ |
| 3347 | QPathInfoRetry: | 3352 | QPathInfoRetry: |
| 3348 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 3353 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 3349 | (void **) &pSMBr); | 3354 | (void **) &pSMBr); |
| @@ -3393,7 +3398,7 @@ QPathInfoRetry: | |||
| 3393 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3398 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3394 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3399 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3395 | if (rc) { | 3400 | if (rc) { |
| 3396 | cFYI(1, ("Send error in QPathInfo = %d", rc)); | 3401 | cFYI(1, "Send error in QPathInfo = %d", rc); |
| 3397 | } else { /* decode response */ | 3402 | } else { /* decode response */ |
| 3398 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3403 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3399 | 3404 | ||
| @@ -3473,14 +3478,14 @@ UnixQFileInfoRetry: | |||
| 3473 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3478 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3474 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3479 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3475 | if (rc) { | 3480 | if (rc) { |
| 3476 | cFYI(1, ("Send error in QPathInfo = %d", rc)); | 3481 | cFYI(1, "Send error in QPathInfo = %d", rc); |
| 3477 | } else { /* decode response */ | 3482 | } else { /* decode response */ |
| 3478 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3483 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3479 | 3484 | ||
| 3480 | if (rc || (pSMBr->ByteCount < sizeof(FILE_UNIX_BASIC_INFO))) { | 3485 | if (rc || (pSMBr->ByteCount < sizeof(FILE_UNIX_BASIC_INFO))) { |
| 3481 | cERROR(1, ("Malformed FILE_UNIX_BASIC_INFO response.\n" | 3486 | cERROR(1, "Malformed FILE_UNIX_BASIC_INFO response.\n" |
| 3482 | "Unix Extensions can be disabled on mount " | 3487 | "Unix Extensions can be disabled on mount " |
| 3483 | "by specifying the nosfu mount option.")); | 3488 | "by specifying the nosfu mount option."); |
| 3484 | rc = -EIO; /* bad smb */ | 3489 | rc = -EIO; /* bad smb */ |
| 3485 | } else { | 3490 | } else { |
| 3486 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); | 3491 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); |
| @@ -3512,7 +3517,7 @@ CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 3512 | int name_len; | 3517 | int name_len; |
| 3513 | __u16 params, byte_count; | 3518 | __u16 params, byte_count; |
| 3514 | 3519 | ||
| 3515 | cFYI(1, ("In QPathInfo (Unix) the path %s", searchName)); | 3520 | cFYI(1, "In QPathInfo (Unix) the path %s", searchName); |
| 3516 | UnixQPathInfoRetry: | 3521 | UnixQPathInfoRetry: |
| 3517 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 3522 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 3518 | (void **) &pSMBr); | 3523 | (void **) &pSMBr); |
| @@ -3559,14 +3564,14 @@ UnixQPathInfoRetry: | |||
| 3559 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3564 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3560 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3565 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3561 | if (rc) { | 3566 | if (rc) { |
| 3562 | cFYI(1, ("Send error in QPathInfo = %d", rc)); | 3567 | cFYI(1, "Send error in QPathInfo = %d", rc); |
| 3563 | } else { /* decode response */ | 3568 | } else { /* decode response */ |
| 3564 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3569 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3565 | 3570 | ||
| 3566 | if (rc || (pSMBr->ByteCount < sizeof(FILE_UNIX_BASIC_INFO))) { | 3571 | if (rc || (pSMBr->ByteCount < sizeof(FILE_UNIX_BASIC_INFO))) { |
| 3567 | cERROR(1, ("Malformed FILE_UNIX_BASIC_INFO response.\n" | 3572 | cERROR(1, "Malformed FILE_UNIX_BASIC_INFO response.\n" |
| 3568 | "Unix Extensions can be disabled on mount " | 3573 | "Unix Extensions can be disabled on mount " |
| 3569 | "by specifying the nosfu mount option.")); | 3574 | "by specifying the nosfu mount option."); |
| 3570 | rc = -EIO; /* bad smb */ | 3575 | rc = -EIO; /* bad smb */ |
| 3571 | } else { | 3576 | } else { |
| 3572 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); | 3577 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); |
| @@ -3600,7 +3605,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, | |||
| 3600 | int name_len; | 3605 | int name_len; |
| 3601 | __u16 params, byte_count; | 3606 | __u16 params, byte_count; |
| 3602 | 3607 | ||
| 3603 | cFYI(1, ("In FindFirst for %s", searchName)); | 3608 | cFYI(1, "In FindFirst for %s", searchName); |
| 3604 | 3609 | ||
| 3605 | findFirstRetry: | 3610 | findFirstRetry: |
| 3606 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 3611 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| @@ -3677,7 +3682,7 @@ findFirstRetry: | |||
| 3677 | if (rc) {/* BB add logic to retry regular search if Unix search | 3682 | if (rc) {/* BB add logic to retry regular search if Unix search |
| 3678 | rejected unexpectedly by server */ | 3683 | rejected unexpectedly by server */ |
| 3679 | /* BB Add code to handle unsupported level rc */ | 3684 | /* BB Add code to handle unsupported level rc */ |
| 3680 | cFYI(1, ("Error in FindFirst = %d", rc)); | 3685 | cFYI(1, "Error in FindFirst = %d", rc); |
| 3681 | 3686 | ||
| 3682 | cifs_buf_release(pSMB); | 3687 | cifs_buf_release(pSMB); |
| 3683 | 3688 | ||
| @@ -3716,7 +3721,7 @@ findFirstRetry: | |||
| 3716 | lnoff = le16_to_cpu(parms->LastNameOffset); | 3721 | lnoff = le16_to_cpu(parms->LastNameOffset); |
| 3717 | if (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE < | 3722 | if (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE < |
| 3718 | lnoff) { | 3723 | lnoff) { |
| 3719 | cERROR(1, ("ignoring corrupt resume name")); | 3724 | cERROR(1, "ignoring corrupt resume name"); |
| 3720 | psrch_inf->last_entry = NULL; | 3725 | psrch_inf->last_entry = NULL; |
| 3721 | return rc; | 3726 | return rc; |
| 3722 | } | 3727 | } |
| @@ -3744,7 +3749,7 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, | |||
| 3744 | int bytes_returned, name_len; | 3749 | int bytes_returned, name_len; |
| 3745 | __u16 params, byte_count; | 3750 | __u16 params, byte_count; |
| 3746 | 3751 | ||
| 3747 | cFYI(1, ("In FindNext")); | 3752 | cFYI(1, "In FindNext"); |
| 3748 | 3753 | ||
| 3749 | if (psrch_inf->endOfSearch) | 3754 | if (psrch_inf->endOfSearch) |
| 3750 | return -ENOENT; | 3755 | return -ENOENT; |
| @@ -3808,7 +3813,7 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, | |||
| 3808 | cifs_buf_release(pSMB); | 3813 | cifs_buf_release(pSMB); |
| 3809 | rc = 0; /* search probably was closed at end of search*/ | 3814 | rc = 0; /* search probably was closed at end of search*/ |
| 3810 | } else | 3815 | } else |
| 3811 | cFYI(1, ("FindNext returned = %d", rc)); | 3816 | cFYI(1, "FindNext returned = %d", rc); |
| 3812 | } else { /* decode response */ | 3817 | } else { /* decode response */ |
| 3813 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3818 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3814 | 3819 | ||
| @@ -3844,15 +3849,15 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, | |||
| 3844 | lnoff = le16_to_cpu(parms->LastNameOffset); | 3849 | lnoff = le16_to_cpu(parms->LastNameOffset); |
| 3845 | if (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE < | 3850 | if (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE < |
| 3846 | lnoff) { | 3851 | lnoff) { |
| 3847 | cERROR(1, ("ignoring corrupt resume name")); | 3852 | cERROR(1, "ignoring corrupt resume name"); |
| 3848 | psrch_inf->last_entry = NULL; | 3853 | psrch_inf->last_entry = NULL; |
| 3849 | return rc; | 3854 | return rc; |
| 3850 | } else | 3855 | } else |
| 3851 | psrch_inf->last_entry = | 3856 | psrch_inf->last_entry = |
| 3852 | psrch_inf->srch_entries_start + lnoff; | 3857 | psrch_inf->srch_entries_start + lnoff; |
| 3853 | 3858 | ||
| 3854 | /* cFYI(1,("fnxt2 entries in buf %d index_of_last %d", | 3859 | /* cFYI(1, "fnxt2 entries in buf %d index_of_last %d", |
| 3855 | psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */ | 3860 | psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry); */ |
| 3856 | 3861 | ||
| 3857 | /* BB fixme add unlock here */ | 3862 | /* BB fixme add unlock here */ |
| 3858 | } | 3863 | } |
| @@ -3877,7 +3882,7 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, | |||
| 3877 | int rc = 0; | 3882 | int rc = 0; |
| 3878 | FINDCLOSE_REQ *pSMB = NULL; | 3883 | FINDCLOSE_REQ *pSMB = NULL; |
| 3879 | 3884 | ||
| 3880 | cFYI(1, ("In CIFSSMBFindClose")); | 3885 | cFYI(1, "In CIFSSMBFindClose"); |
| 3881 | rc = small_smb_init(SMB_COM_FIND_CLOSE2, 1, tcon, (void **)&pSMB); | 3886 | rc = small_smb_init(SMB_COM_FIND_CLOSE2, 1, tcon, (void **)&pSMB); |
| 3882 | 3887 | ||
| 3883 | /* no sense returning error if session restarted | 3888 | /* no sense returning error if session restarted |
| @@ -3891,7 +3896,7 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, | |||
| 3891 | pSMB->ByteCount = 0; | 3896 | pSMB->ByteCount = 0; |
| 3892 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 3897 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
| 3893 | if (rc) | 3898 | if (rc) |
| 3894 | cERROR(1, ("Send error in FindClose = %d", rc)); | 3899 | cERROR(1, "Send error in FindClose = %d", rc); |
| 3895 | 3900 | ||
| 3896 | cifs_stats_inc(&tcon->num_fclose); | 3901 | cifs_stats_inc(&tcon->num_fclose); |
| 3897 | 3902 | ||
| @@ -3914,7 +3919,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, | |||
| 3914 | int name_len, bytes_returned; | 3919 | int name_len, bytes_returned; |
| 3915 | __u16 params, byte_count; | 3920 | __u16 params, byte_count; |
| 3916 | 3921 | ||
| 3917 | cFYI(1, ("In GetSrvInodeNum for %s", searchName)); | 3922 | cFYI(1, "In GetSrvInodeNum for %s", searchName); |
| 3918 | if (tcon == NULL) | 3923 | if (tcon == NULL) |
| 3919 | return -ENODEV; | 3924 | return -ENODEV; |
| 3920 | 3925 | ||
| @@ -3964,7 +3969,7 @@ GetInodeNumberRetry: | |||
| 3964 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 3969 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 3965 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3970 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 3966 | if (rc) { | 3971 | if (rc) { |
| 3967 | cFYI(1, ("error %d in QueryInternalInfo", rc)); | 3972 | cFYI(1, "error %d in QueryInternalInfo", rc); |
| 3968 | } else { | 3973 | } else { |
| 3969 | /* decode response */ | 3974 | /* decode response */ |
| 3970 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3975 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| @@ -3979,7 +3984,7 @@ GetInodeNumberRetry: | |||
| 3979 | struct file_internal_info *pfinfo; | 3984 | struct file_internal_info *pfinfo; |
| 3980 | /* BB Do we need a cast or hash here ? */ | 3985 | /* BB Do we need a cast or hash here ? */ |
| 3981 | if (count < 8) { | 3986 | if (count < 8) { |
| 3982 | cFYI(1, ("Illegal size ret in QryIntrnlInf")); | 3987 | cFYI(1, "Illegal size ret in QryIntrnlInf"); |
| 3983 | rc = -EIO; | 3988 | rc = -EIO; |
| 3984 | goto GetInodeNumOut; | 3989 | goto GetInodeNumOut; |
| 3985 | } | 3990 | } |
| @@ -4020,16 +4025,16 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
| 4020 | *num_of_nodes = le16_to_cpu(pSMBr->NumberOfReferrals); | 4025 | *num_of_nodes = le16_to_cpu(pSMBr->NumberOfReferrals); |
| 4021 | 4026 | ||
| 4022 | if (*num_of_nodes < 1) { | 4027 | if (*num_of_nodes < 1) { |
| 4023 | cERROR(1, ("num_referrals: must be at least > 0," | 4028 | cERROR(1, "num_referrals: must be at least > 0," |
| 4024 | "but we get num_referrals = %d\n", *num_of_nodes)); | 4029 | "but we get num_referrals = %d\n", *num_of_nodes); |
| 4025 | rc = -EINVAL; | 4030 | rc = -EINVAL; |
| 4026 | goto parse_DFS_referrals_exit; | 4031 | goto parse_DFS_referrals_exit; |
| 4027 | } | 4032 | } |
| 4028 | 4033 | ||
| 4029 | ref = (struct dfs_referral_level_3 *) &(pSMBr->referrals); | 4034 | ref = (struct dfs_referral_level_3 *) &(pSMBr->referrals); |
| 4030 | if (ref->VersionNumber != cpu_to_le16(3)) { | 4035 | if (ref->VersionNumber != cpu_to_le16(3)) { |
| 4031 | cERROR(1, ("Referrals of V%d version are not supported," | 4036 | cERROR(1, "Referrals of V%d version are not supported," |
| 4032 | "should be V3", le16_to_cpu(ref->VersionNumber))); | 4037 | "should be V3", le16_to_cpu(ref->VersionNumber)); |
| 4033 | rc = -EINVAL; | 4038 | rc = -EINVAL; |
| 4034 | goto parse_DFS_referrals_exit; | 4039 | goto parse_DFS_referrals_exit; |
| 4035 | } | 4040 | } |
| @@ -4038,14 +4043,14 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
| 4038 | data_end = (char *)(&(pSMBr->PathConsumed)) + | 4043 | data_end = (char *)(&(pSMBr->PathConsumed)) + |
| 4039 | le16_to_cpu(pSMBr->t2.DataCount); | 4044 | le16_to_cpu(pSMBr->t2.DataCount); |
| 4040 | 4045 | ||
| 4041 | cFYI(1, ("num_referrals: %d dfs flags: 0x%x ... \n", | 4046 | cFYI(1, "num_referrals: %d dfs flags: 0x%x ...\n", |
| 4042 | *num_of_nodes, | 4047 | *num_of_nodes, |
| 4043 | le32_to_cpu(pSMBr->DFSFlags))); | 4048 | le32_to_cpu(pSMBr->DFSFlags)); |
| 4044 | 4049 | ||
| 4045 | *target_nodes = kzalloc(sizeof(struct dfs_info3_param) * | 4050 | *target_nodes = kzalloc(sizeof(struct dfs_info3_param) * |
| 4046 | *num_of_nodes, GFP_KERNEL); | 4051 | *num_of_nodes, GFP_KERNEL); |
| 4047 | if (*target_nodes == NULL) { | 4052 | if (*target_nodes == NULL) { |
| 4048 | cERROR(1, ("Failed to allocate buffer for target_nodes\n")); | 4053 | cERROR(1, "Failed to allocate buffer for target_nodes\n"); |
| 4049 | rc = -ENOMEM; | 4054 | rc = -ENOMEM; |
| 4050 | goto parse_DFS_referrals_exit; | 4055 | goto parse_DFS_referrals_exit; |
| 4051 | } | 4056 | } |
| @@ -4121,7 +4126,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, | |||
| 4121 | *num_of_nodes = 0; | 4126 | *num_of_nodes = 0; |
| 4122 | *target_nodes = NULL; | 4127 | *target_nodes = NULL; |
| 4123 | 4128 | ||
| 4124 | cFYI(1, ("In GetDFSRefer the path %s", searchName)); | 4129 | cFYI(1, "In GetDFSRefer the path %s", searchName); |
| 4125 | if (ses == NULL) | 4130 | if (ses == NULL) |
| 4126 | return -ENODEV; | 4131 | return -ENODEV; |
| 4127 | getDFSRetry: | 4132 | getDFSRetry: |
| @@ -4188,7 +4193,7 @@ getDFSRetry: | |||
| 4188 | rc = SendReceive(xid, ses, (struct smb_hdr *) pSMB, | 4193 | rc = SendReceive(xid, ses, (struct smb_hdr *) pSMB, |
| 4189 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4194 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4190 | if (rc) { | 4195 | if (rc) { |
| 4191 | cFYI(1, ("Send error in GetDFSRefer = %d", rc)); | 4196 | cFYI(1, "Send error in GetDFSRefer = %d", rc); |
| 4192 | goto GetDFSRefExit; | 4197 | goto GetDFSRefExit; |
| 4193 | } | 4198 | } |
| 4194 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4199 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| @@ -4199,9 +4204,9 @@ getDFSRetry: | |||
| 4199 | goto GetDFSRefExit; | 4204 | goto GetDFSRefExit; |
| 4200 | } | 4205 | } |
| 4201 | 4206 | ||
| 4202 | cFYI(1, ("Decoding GetDFSRefer response BCC: %d Offset %d", | 4207 | cFYI(1, "Decoding GetDFSRefer response BCC: %d Offset %d", |
| 4203 | pSMBr->ByteCount, | 4208 | pSMBr->ByteCount, |
| 4204 | le16_to_cpu(pSMBr->t2.DataOffset))); | 4209 | le16_to_cpu(pSMBr->t2.DataOffset)); |
| 4205 | 4210 | ||
| 4206 | /* parse returned result into more usable form */ | 4211 | /* parse returned result into more usable form */ |
| 4207 | rc = parse_DFS_referrals(pSMBr, num_of_nodes, | 4212 | rc = parse_DFS_referrals(pSMBr, num_of_nodes, |
| @@ -4229,7 +4234,7 @@ SMBOldQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData) | |||
| 4229 | int bytes_returned = 0; | 4234 | int bytes_returned = 0; |
| 4230 | __u16 params, byte_count; | 4235 | __u16 params, byte_count; |
| 4231 | 4236 | ||
| 4232 | cFYI(1, ("OldQFSInfo")); | 4237 | cFYI(1, "OldQFSInfo"); |
| 4233 | oldQFSInfoRetry: | 4238 | oldQFSInfoRetry: |
| 4234 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4239 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4235 | (void **) &pSMBr); | 4240 | (void **) &pSMBr); |
| @@ -4262,7 +4267,7 @@ oldQFSInfoRetry: | |||
| 4262 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4267 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4263 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4268 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4264 | if (rc) { | 4269 | if (rc) { |
| 4265 | cFYI(1, ("Send error in QFSInfo = %d", rc)); | 4270 | cFYI(1, "Send error in QFSInfo = %d", rc); |
| 4266 | } else { /* decode response */ | 4271 | } else { /* decode response */ |
| 4267 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4272 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4268 | 4273 | ||
| @@ -4270,8 +4275,8 @@ oldQFSInfoRetry: | |||
| 4270 | rc = -EIO; /* bad smb */ | 4275 | rc = -EIO; /* bad smb */ |
| 4271 | else { | 4276 | else { |
| 4272 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); | 4277 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); |
| 4273 | cFYI(1, ("qfsinf resp BCC: %d Offset %d", | 4278 | cFYI(1, "qfsinf resp BCC: %d Offset %d", |
| 4274 | pSMBr->ByteCount, data_offset)); | 4279 | pSMBr->ByteCount, data_offset); |
| 4275 | 4280 | ||
| 4276 | response_data = (FILE_SYSTEM_ALLOC_INFO *) | 4281 | response_data = (FILE_SYSTEM_ALLOC_INFO *) |
| 4277 | (((char *) &pSMBr->hdr.Protocol) + data_offset); | 4282 | (((char *) &pSMBr->hdr.Protocol) + data_offset); |
| @@ -4283,11 +4288,10 @@ oldQFSInfoRetry: | |||
| 4283 | le32_to_cpu(response_data->TotalAllocationUnits); | 4288 | le32_to_cpu(response_data->TotalAllocationUnits); |
| 4284 | FSData->f_bfree = FSData->f_bavail = | 4289 | FSData->f_bfree = FSData->f_bavail = |
| 4285 | le32_to_cpu(response_data->FreeAllocationUnits); | 4290 | le32_to_cpu(response_data->FreeAllocationUnits); |
| 4286 | cFYI(1, | 4291 | cFYI(1, "Blocks: %lld Free: %lld Block size %ld", |
| 4287 | ("Blocks: %lld Free: %lld Block size %ld", | 4292 | (unsigned long long)FSData->f_blocks, |
| 4288 | (unsigned long long)FSData->f_blocks, | 4293 | (unsigned long long)FSData->f_bfree, |
| 4289 | (unsigned long long)FSData->f_bfree, | 4294 | FSData->f_bsize); |
| 4290 | FSData->f_bsize)); | ||
| 4291 | } | 4295 | } |
| 4292 | } | 4296 | } |
| 4293 | cifs_buf_release(pSMB); | 4297 | cifs_buf_release(pSMB); |
| @@ -4309,7 +4313,7 @@ CIFSSMBQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData) | |||
| 4309 | int bytes_returned = 0; | 4313 | int bytes_returned = 0; |
| 4310 | __u16 params, byte_count; | 4314 | __u16 params, byte_count; |
| 4311 | 4315 | ||
| 4312 | cFYI(1, ("In QFSInfo")); | 4316 | cFYI(1, "In QFSInfo"); |
| 4313 | QFSInfoRetry: | 4317 | QFSInfoRetry: |
| 4314 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4318 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4315 | (void **) &pSMBr); | 4319 | (void **) &pSMBr); |
| @@ -4342,7 +4346,7 @@ QFSInfoRetry: | |||
| 4342 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4346 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4343 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4347 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4344 | if (rc) { | 4348 | if (rc) { |
| 4345 | cFYI(1, ("Send error in QFSInfo = %d", rc)); | 4349 | cFYI(1, "Send error in QFSInfo = %d", rc); |
| 4346 | } else { /* decode response */ | 4350 | } else { /* decode response */ |
| 4347 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4351 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4348 | 4352 | ||
| @@ -4363,11 +4367,10 @@ QFSInfoRetry: | |||
| 4363 | le64_to_cpu(response_data->TotalAllocationUnits); | 4367 | le64_to_cpu(response_data->TotalAllocationUnits); |
| 4364 | FSData->f_bfree = FSData->f_bavail = | 4368 | FSData->f_bfree = FSData->f_bavail = |
| 4365 | le64_to_cpu(response_data->FreeAllocationUnits); | 4369 | le64_to_cpu(response_data->FreeAllocationUnits); |
| 4366 | cFYI(1, | 4370 | cFYI(1, "Blocks: %lld Free: %lld Block size %ld", |
| 4367 | ("Blocks: %lld Free: %lld Block size %ld", | 4371 | (unsigned long long)FSData->f_blocks, |
| 4368 | (unsigned long long)FSData->f_blocks, | 4372 | (unsigned long long)FSData->f_bfree, |
| 4369 | (unsigned long long)FSData->f_bfree, | 4373 | FSData->f_bsize); |
| 4370 | FSData->f_bsize)); | ||
| 4371 | } | 4374 | } |
| 4372 | } | 4375 | } |
| 4373 | cifs_buf_release(pSMB); | 4376 | cifs_buf_release(pSMB); |
| @@ -4389,7 +4392,7 @@ CIFSSMBQFSAttributeInfo(const int xid, struct cifsTconInfo *tcon) | |||
| 4389 | int bytes_returned = 0; | 4392 | int bytes_returned = 0; |
| 4390 | __u16 params, byte_count; | 4393 | __u16 params, byte_count; |
| 4391 | 4394 | ||
| 4392 | cFYI(1, ("In QFSAttributeInfo")); | 4395 | cFYI(1, "In QFSAttributeInfo"); |
| 4393 | QFSAttributeRetry: | 4396 | QFSAttributeRetry: |
| 4394 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4397 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4395 | (void **) &pSMBr); | 4398 | (void **) &pSMBr); |
| @@ -4423,7 +4426,7 @@ QFSAttributeRetry: | |||
| 4423 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4426 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4424 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4427 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4425 | if (rc) { | 4428 | if (rc) { |
| 4426 | cERROR(1, ("Send error in QFSAttributeInfo = %d", rc)); | 4429 | cERROR(1, "Send error in QFSAttributeInfo = %d", rc); |
| 4427 | } else { /* decode response */ | 4430 | } else { /* decode response */ |
| 4428 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4431 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4429 | 4432 | ||
| @@ -4459,7 +4462,7 @@ CIFSSMBQFSDeviceInfo(const int xid, struct cifsTconInfo *tcon) | |||
| 4459 | int bytes_returned = 0; | 4462 | int bytes_returned = 0; |
| 4460 | __u16 params, byte_count; | 4463 | __u16 params, byte_count; |
| 4461 | 4464 | ||
| 4462 | cFYI(1, ("In QFSDeviceInfo")); | 4465 | cFYI(1, "In QFSDeviceInfo"); |
| 4463 | QFSDeviceRetry: | 4466 | QFSDeviceRetry: |
| 4464 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4467 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4465 | (void **) &pSMBr); | 4468 | (void **) &pSMBr); |
| @@ -4494,7 +4497,7 @@ QFSDeviceRetry: | |||
| 4494 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4497 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4495 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4498 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4496 | if (rc) { | 4499 | if (rc) { |
| 4497 | cFYI(1, ("Send error in QFSDeviceInfo = %d", rc)); | 4500 | cFYI(1, "Send error in QFSDeviceInfo = %d", rc); |
| 4498 | } else { /* decode response */ | 4501 | } else { /* decode response */ |
| 4499 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4502 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4500 | 4503 | ||
| @@ -4529,7 +4532,7 @@ CIFSSMBQFSUnixInfo(const int xid, struct cifsTconInfo *tcon) | |||
| 4529 | int bytes_returned = 0; | 4532 | int bytes_returned = 0; |
| 4530 | __u16 params, byte_count; | 4533 | __u16 params, byte_count; |
| 4531 | 4534 | ||
| 4532 | cFYI(1, ("In QFSUnixInfo")); | 4535 | cFYI(1, "In QFSUnixInfo"); |
| 4533 | QFSUnixRetry: | 4536 | QFSUnixRetry: |
| 4534 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4537 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4535 | (void **) &pSMBr); | 4538 | (void **) &pSMBr); |
| @@ -4563,7 +4566,7 @@ QFSUnixRetry: | |||
| 4563 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4566 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4564 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4567 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4565 | if (rc) { | 4568 | if (rc) { |
| 4566 | cERROR(1, ("Send error in QFSUnixInfo = %d", rc)); | 4569 | cERROR(1, "Send error in QFSUnixInfo = %d", rc); |
| 4567 | } else { /* decode response */ | 4570 | } else { /* decode response */ |
| 4568 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4571 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4569 | 4572 | ||
| @@ -4598,7 +4601,7 @@ CIFSSMBSetFSUnixInfo(const int xid, struct cifsTconInfo *tcon, __u64 cap) | |||
| 4598 | int bytes_returned = 0; | 4601 | int bytes_returned = 0; |
| 4599 | __u16 params, param_offset, offset, byte_count; | 4602 | __u16 params, param_offset, offset, byte_count; |
| 4600 | 4603 | ||
| 4601 | cFYI(1, ("In SETFSUnixInfo")); | 4604 | cFYI(1, "In SETFSUnixInfo"); |
| 4602 | SETFSUnixRetry: | 4605 | SETFSUnixRetry: |
| 4603 | /* BB switch to small buf init to save memory */ | 4606 | /* BB switch to small buf init to save memory */ |
| 4604 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4607 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| @@ -4646,7 +4649,7 @@ SETFSUnixRetry: | |||
| 4646 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4649 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4647 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4650 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4648 | if (rc) { | 4651 | if (rc) { |
| 4649 | cERROR(1, ("Send error in SETFSUnixInfo = %d", rc)); | 4652 | cERROR(1, "Send error in SETFSUnixInfo = %d", rc); |
| 4650 | } else { /* decode response */ | 4653 | } else { /* decode response */ |
| 4651 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4654 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4652 | if (rc) | 4655 | if (rc) |
| @@ -4674,7 +4677,7 @@ CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 4674 | int bytes_returned = 0; | 4677 | int bytes_returned = 0; |
| 4675 | __u16 params, byte_count; | 4678 | __u16 params, byte_count; |
| 4676 | 4679 | ||
| 4677 | cFYI(1, ("In QFSPosixInfo")); | 4680 | cFYI(1, "In QFSPosixInfo"); |
| 4678 | QFSPosixRetry: | 4681 | QFSPosixRetry: |
| 4679 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4682 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4680 | (void **) &pSMBr); | 4683 | (void **) &pSMBr); |
| @@ -4708,7 +4711,7 @@ QFSPosixRetry: | |||
| 4708 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4711 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4709 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4712 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4710 | if (rc) { | 4713 | if (rc) { |
| 4711 | cFYI(1, ("Send error in QFSUnixInfo = %d", rc)); | 4714 | cFYI(1, "Send error in QFSUnixInfo = %d", rc); |
| 4712 | } else { /* decode response */ | 4715 | } else { /* decode response */ |
| 4713 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4716 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 4714 | 4717 | ||
| @@ -4768,7 +4771,7 @@ CIFSSMBSetEOF(const int xid, struct cifsTconInfo *tcon, const char *fileName, | |||
| 4768 | int bytes_returned = 0; | 4771 | int bytes_returned = 0; |
| 4769 | __u16 params, byte_count, data_count, param_offset, offset; | 4772 | __u16 params, byte_count, data_count, param_offset, offset; |
| 4770 | 4773 | ||
| 4771 | cFYI(1, ("In SetEOF")); | 4774 | cFYI(1, "In SetEOF"); |
| 4772 | SetEOFRetry: | 4775 | SetEOFRetry: |
| 4773 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 4776 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 4774 | (void **) &pSMBr); | 4777 | (void **) &pSMBr); |
| @@ -4834,7 +4837,7 @@ SetEOFRetry: | |||
| 4834 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4837 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 4835 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4838 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 4836 | if (rc) | 4839 | if (rc) |
| 4837 | cFYI(1, ("SetPathInfo (file size) returned %d", rc)); | 4840 | cFYI(1, "SetPathInfo (file size) returned %d", rc); |
| 4838 | 4841 | ||
| 4839 | cifs_buf_release(pSMB); | 4842 | cifs_buf_release(pSMB); |
| 4840 | 4843 | ||
| @@ -4854,8 +4857,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size, | |||
| 4854 | int rc = 0; | 4857 | int rc = 0; |
| 4855 | __u16 params, param_offset, offset, byte_count, count; | 4858 | __u16 params, param_offset, offset, byte_count, count; |
| 4856 | 4859 | ||
| 4857 | cFYI(1, ("SetFileSize (via SetFileInfo) %lld", | 4860 | cFYI(1, "SetFileSize (via SetFileInfo) %lld", |
| 4858 | (long long)size)); | 4861 | (long long)size); |
| 4859 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); | 4862 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); |
| 4860 | 4863 | ||
| 4861 | if (rc) | 4864 | if (rc) |
| @@ -4914,9 +4917,7 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size, | |||
| 4914 | pSMB->ByteCount = cpu_to_le16(byte_count); | 4917 | pSMB->ByteCount = cpu_to_le16(byte_count); |
| 4915 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 4918 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
| 4916 | if (rc) { | 4919 | if (rc) { |
| 4917 | cFYI(1, | 4920 | cFYI(1, "Send error in SetFileInfo (SetFileSize) = %d", rc); |
| 4918 | ("Send error in SetFileInfo (SetFileSize) = %d", | ||
| 4919 | rc)); | ||
| 4920 | } | 4921 | } |
| 4921 | 4922 | ||
| 4922 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 4923 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
| @@ -4940,7 +4941,7 @@ CIFSSMBSetFileInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 4940 | int rc = 0; | 4941 | int rc = 0; |
| 4941 | __u16 params, param_offset, offset, byte_count, count; | 4942 | __u16 params, param_offset, offset, byte_count, count; |
| 4942 | 4943 | ||
| 4943 | cFYI(1, ("Set Times (via SetFileInfo)")); | 4944 | cFYI(1, "Set Times (via SetFileInfo)"); |
| 4944 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); | 4945 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); |
| 4945 | 4946 | ||
| 4946 | if (rc) | 4947 | if (rc) |
| @@ -4985,7 +4986,7 @@ CIFSSMBSetFileInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 4985 | memcpy(data_offset, data, sizeof(FILE_BASIC_INFO)); | 4986 | memcpy(data_offset, data, sizeof(FILE_BASIC_INFO)); |
| 4986 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 4987 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
| 4987 | if (rc) | 4988 | if (rc) |
| 4988 | cFYI(1, ("Send error in Set Time (SetFileInfo) = %d", rc)); | 4989 | cFYI(1, "Send error in Set Time (SetFileInfo) = %d", rc); |
| 4989 | 4990 | ||
| 4990 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 4991 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
| 4991 | since file handle passed in no longer valid */ | 4992 | since file handle passed in no longer valid */ |
| @@ -5002,7 +5003,7 @@ CIFSSMBSetFileDisposition(const int xid, struct cifsTconInfo *tcon, | |||
| 5002 | int rc = 0; | 5003 | int rc = 0; |
| 5003 | __u16 params, param_offset, offset, byte_count, count; | 5004 | __u16 params, param_offset, offset, byte_count, count; |
| 5004 | 5005 | ||
| 5005 | cFYI(1, ("Set File Disposition (via SetFileInfo)")); | 5006 | cFYI(1, "Set File Disposition (via SetFileInfo)"); |
| 5006 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); | 5007 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); |
| 5007 | 5008 | ||
| 5008 | if (rc) | 5009 | if (rc) |
| @@ -5044,7 +5045,7 @@ CIFSSMBSetFileDisposition(const int xid, struct cifsTconInfo *tcon, | |||
| 5044 | *data_offset = delete_file ? 1 : 0; | 5045 | *data_offset = delete_file ? 1 : 0; |
| 5045 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 5046 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
| 5046 | if (rc) | 5047 | if (rc) |
| 5047 | cFYI(1, ("Send error in SetFileDisposition = %d", rc)); | 5048 | cFYI(1, "Send error in SetFileDisposition = %d", rc); |
| 5048 | 5049 | ||
| 5049 | return rc; | 5050 | return rc; |
| 5050 | } | 5051 | } |
| @@ -5062,7 +5063,7 @@ CIFSSMBSetPathInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 5062 | char *data_offset; | 5063 | char *data_offset; |
| 5063 | __u16 params, param_offset, offset, byte_count, count; | 5064 | __u16 params, param_offset, offset, byte_count, count; |
| 5064 | 5065 | ||
| 5065 | cFYI(1, ("In SetTimes")); | 5066 | cFYI(1, "In SetTimes"); |
| 5066 | 5067 | ||
| 5067 | SetTimesRetry: | 5068 | SetTimesRetry: |
| 5068 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 5069 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| @@ -5118,7 +5119,7 @@ SetTimesRetry: | |||
| 5118 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5119 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 5119 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5120 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 5120 | if (rc) | 5121 | if (rc) |
| 5121 | cFYI(1, ("SetPathInfo (times) returned %d", rc)); | 5122 | cFYI(1, "SetPathInfo (times) returned %d", rc); |
| 5122 | 5123 | ||
| 5123 | cifs_buf_release(pSMB); | 5124 | cifs_buf_release(pSMB); |
| 5124 | 5125 | ||
| @@ -5143,7 +5144,7 @@ CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, char *fileName, | |||
| 5143 | int bytes_returned; | 5144 | int bytes_returned; |
| 5144 | int name_len; | 5145 | int name_len; |
| 5145 | 5146 | ||
| 5146 | cFYI(1, ("In SetAttrLegacy")); | 5147 | cFYI(1, "In SetAttrLegacy"); |
| 5147 | 5148 | ||
| 5148 | SetAttrLgcyRetry: | 5149 | SetAttrLgcyRetry: |
| 5149 | rc = smb_init(SMB_COM_SETATTR, 8, tcon, (void **) &pSMB, | 5150 | rc = smb_init(SMB_COM_SETATTR, 8, tcon, (void **) &pSMB, |
| @@ -5169,7 +5170,7 @@ SetAttrLgcyRetry: | |||
| 5169 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5170 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 5170 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5171 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 5171 | if (rc) | 5172 | if (rc) |
| 5172 | cFYI(1, ("Error in LegacySetAttr = %d", rc)); | 5173 | cFYI(1, "Error in LegacySetAttr = %d", rc); |
| 5173 | 5174 | ||
| 5174 | cifs_buf_release(pSMB); | 5175 | cifs_buf_release(pSMB); |
| 5175 | 5176 | ||
| @@ -5231,7 +5232,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 5231 | int rc = 0; | 5232 | int rc = 0; |
| 5232 | u16 params, param_offset, offset, byte_count, count; | 5233 | u16 params, param_offset, offset, byte_count, count; |
| 5233 | 5234 | ||
| 5234 | cFYI(1, ("Set Unix Info (via SetFileInfo)")); | 5235 | cFYI(1, "Set Unix Info (via SetFileInfo)"); |
| 5235 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); | 5236 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); |
| 5236 | 5237 | ||
| 5237 | if (rc) | 5238 | if (rc) |
| @@ -5276,7 +5277,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 5276 | 5277 | ||
| 5277 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 5278 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
| 5278 | if (rc) | 5279 | if (rc) |
| 5279 | cFYI(1, ("Send error in Set Time (SetFileInfo) = %d", rc)); | 5280 | cFYI(1, "Send error in Set Time (SetFileInfo) = %d", rc); |
| 5280 | 5281 | ||
| 5281 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 5282 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
| 5282 | since file handle passed in no longer valid */ | 5283 | since file handle passed in no longer valid */ |
| @@ -5297,7 +5298,7 @@ CIFSSMBUnixSetPathInfo(const int xid, struct cifsTconInfo *tcon, char *fileName, | |||
| 5297 | FILE_UNIX_BASIC_INFO *data_offset; | 5298 | FILE_UNIX_BASIC_INFO *data_offset; |
| 5298 | __u16 params, param_offset, offset, count, byte_count; | 5299 | __u16 params, param_offset, offset, count, byte_count; |
| 5299 | 5300 | ||
| 5300 | cFYI(1, ("In SetUID/GID/Mode")); | 5301 | cFYI(1, "In SetUID/GID/Mode"); |
| 5301 | setPermsRetry: | 5302 | setPermsRetry: |
| 5302 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 5303 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 5303 | (void **) &pSMBr); | 5304 | (void **) &pSMBr); |
| @@ -5353,7 +5354,7 @@ setPermsRetry: | |||
| 5353 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5354 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 5354 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5355 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 5355 | if (rc) | 5356 | if (rc) |
| 5356 | cFYI(1, ("SetPathInfo (perms) returned %d", rc)); | 5357 | cFYI(1, "SetPathInfo (perms) returned %d", rc); |
| 5357 | 5358 | ||
| 5358 | cifs_buf_release(pSMB); | 5359 | cifs_buf_release(pSMB); |
| 5359 | if (rc == -EAGAIN) | 5360 | if (rc == -EAGAIN) |
| @@ -5372,7 +5373,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon, | |||
| 5372 | struct dir_notify_req *dnotify_req; | 5373 | struct dir_notify_req *dnotify_req; |
| 5373 | int bytes_returned; | 5374 | int bytes_returned; |
| 5374 | 5375 | ||
| 5375 | cFYI(1, ("In CIFSSMBNotify for file handle %d", (int)netfid)); | 5376 | cFYI(1, "In CIFSSMBNotify for file handle %d", (int)netfid); |
| 5376 | rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, | 5377 | rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, |
| 5377 | (void **) &pSMBr); | 5378 | (void **) &pSMBr); |
| 5378 | if (rc) | 5379 | if (rc) |
| @@ -5406,7 +5407,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon, | |||
| 5406 | (struct smb_hdr *)pSMBr, &bytes_returned, | 5407 | (struct smb_hdr *)pSMBr, &bytes_returned, |
| 5407 | CIFS_ASYNC_OP); | 5408 | CIFS_ASYNC_OP); |
| 5408 | if (rc) { | 5409 | if (rc) { |
| 5409 | cFYI(1, ("Error in Notify = %d", rc)); | 5410 | cFYI(1, "Error in Notify = %d", rc); |
| 5410 | } else { | 5411 | } else { |
| 5411 | /* Add file to outstanding requests */ | 5412 | /* Add file to outstanding requests */ |
| 5412 | /* BB change to kmem cache alloc */ | 5413 | /* BB change to kmem cache alloc */ |
| @@ -5462,7 +5463,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, | |||
| 5462 | char *end_of_smb; | 5463 | char *end_of_smb; |
| 5463 | __u16 params, byte_count, data_offset; | 5464 | __u16 params, byte_count, data_offset; |
| 5464 | 5465 | ||
| 5465 | cFYI(1, ("In Query All EAs path %s", searchName)); | 5466 | cFYI(1, "In Query All EAs path %s", searchName); |
| 5466 | QAllEAsRetry: | 5467 | QAllEAsRetry: |
| 5467 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 5468 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 5468 | (void **) &pSMBr); | 5469 | (void **) &pSMBr); |
| @@ -5509,7 +5510,7 @@ QAllEAsRetry: | |||
| 5509 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5510 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 5510 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5511 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 5511 | if (rc) { | 5512 | if (rc) { |
| 5512 | cFYI(1, ("Send error in QueryAllEAs = %d", rc)); | 5513 | cFYI(1, "Send error in QueryAllEAs = %d", rc); |
| 5513 | goto QAllEAsOut; | 5514 | goto QAllEAsOut; |
| 5514 | } | 5515 | } |
| 5515 | 5516 | ||
| @@ -5537,16 +5538,16 @@ QAllEAsRetry: | |||
| 5537 | (((char *) &pSMBr->hdr.Protocol) + data_offset); | 5538 | (((char *) &pSMBr->hdr.Protocol) + data_offset); |
| 5538 | 5539 | ||
| 5539 | list_len = le32_to_cpu(ea_response_data->list_len); | 5540 | list_len = le32_to_cpu(ea_response_data->list_len); |
| 5540 | cFYI(1, ("ea length %d", list_len)); | 5541 | cFYI(1, "ea length %d", list_len); |
| 5541 | if (list_len <= 8) { | 5542 | if (list_len <= 8) { |
| 5542 | cFYI(1, ("empty EA list returned from server")); | 5543 | cFYI(1, "empty EA list returned from server"); |
| 5543 | goto QAllEAsOut; | 5544 | goto QAllEAsOut; |
| 5544 | } | 5545 | } |
| 5545 | 5546 | ||
| 5546 | /* make sure list_len doesn't go past end of SMB */ | 5547 | /* make sure list_len doesn't go past end of SMB */ |
| 5547 | end_of_smb = (char *)pByteArea(&pSMBr->hdr) + BCC(&pSMBr->hdr); | 5548 | end_of_smb = (char *)pByteArea(&pSMBr->hdr) + BCC(&pSMBr->hdr); |
| 5548 | if ((char *)ea_response_data + list_len > end_of_smb) { | 5549 | if ((char *)ea_response_data + list_len > end_of_smb) { |
| 5549 | cFYI(1, ("EA list appears to go beyond SMB")); | 5550 | cFYI(1, "EA list appears to go beyond SMB"); |
| 5550 | rc = -EIO; | 5551 | rc = -EIO; |
| 5551 | goto QAllEAsOut; | 5552 | goto QAllEAsOut; |
| 5552 | } | 5553 | } |
| @@ -5563,7 +5564,7 @@ QAllEAsRetry: | |||
| 5563 | temp_ptr += 4; | 5564 | temp_ptr += 4; |
| 5564 | /* make sure we can read name_len and value_len */ | 5565 | /* make sure we can read name_len and value_len */ |
| 5565 | if (list_len < 0) { | 5566 | if (list_len < 0) { |
| 5566 | cFYI(1, ("EA entry goes beyond length of list")); | 5567 | cFYI(1, "EA entry goes beyond length of list"); |
| 5567 | rc = -EIO; | 5568 | rc = -EIO; |
| 5568 | goto QAllEAsOut; | 5569 | goto QAllEAsOut; |
| 5569 | } | 5570 | } |
| @@ -5572,7 +5573,7 @@ QAllEAsRetry: | |||
| 5572 | value_len = le16_to_cpu(temp_fea->value_len); | 5573 | value_len = le16_to_cpu(temp_fea->value_len); |
| 5573 | list_len -= name_len + 1 + value_len; | 5574 | list_len -= name_len + 1 + value_len; |
| 5574 | if (list_len < 0) { | 5575 | if (list_len < 0) { |
| 5575 | cFYI(1, ("EA entry goes beyond length of list")); | 5576 | cFYI(1, "EA entry goes beyond length of list"); |
| 5576 | rc = -EIO; | 5577 | rc = -EIO; |
| 5577 | goto QAllEAsOut; | 5578 | goto QAllEAsOut; |
| 5578 | } | 5579 | } |
| @@ -5639,7 +5640,7 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName, | |||
| 5639 | int bytes_returned = 0; | 5640 | int bytes_returned = 0; |
| 5640 | __u16 params, param_offset, byte_count, offset, count; | 5641 | __u16 params, param_offset, byte_count, offset, count; |
| 5641 | 5642 | ||
| 5642 | cFYI(1, ("In SetEA")); | 5643 | cFYI(1, "In SetEA"); |
| 5643 | SetEARetry: | 5644 | SetEARetry: |
| 5644 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 5645 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, |
| 5645 | (void **) &pSMBr); | 5646 | (void **) &pSMBr); |
| @@ -5721,7 +5722,7 @@ SetEARetry: | |||
| 5721 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5722 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
| 5722 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5723 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
| 5723 | if (rc) | 5724 | if (rc) |
| 5724 | cFYI(1, ("SetPathInfo (EA) returned %d", rc)); | 5725 | cFYI(1, "SetPathInfo (EA) returned %d", rc); |
| 5725 | 5726 | ||
| 5726 | cifs_buf_release(pSMB); | 5727 | cifs_buf_release(pSMB); |
| 5727 | 5728 | ||
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index d9566bf8f917..2208f06e4c45 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -102,6 +102,7 @@ struct smb_vol { | |||
| 102 | bool sockopt_tcp_nodelay:1; | 102 | bool sockopt_tcp_nodelay:1; |
| 103 | unsigned short int port; | 103 | unsigned short int port; |
| 104 | char *prepath; | 104 | char *prepath; |
| 105 | struct nls_table *local_nls; | ||
| 105 | }; | 106 | }; |
| 106 | 107 | ||
| 107 | static int ipv4_connect(struct TCP_Server_Info *server); | 108 | static int ipv4_connect(struct TCP_Server_Info *server); |
| @@ -135,7 +136,7 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
| 135 | spin_unlock(&GlobalMid_Lock); | 136 | spin_unlock(&GlobalMid_Lock); |
| 136 | server->maxBuf = 0; | 137 | server->maxBuf = 0; |
| 137 | 138 | ||
| 138 | cFYI(1, ("Reconnecting tcp session")); | 139 | cFYI(1, "Reconnecting tcp session"); |
| 139 | 140 | ||
| 140 | /* before reconnecting the tcp session, mark the smb session (uid) | 141 | /* before reconnecting the tcp session, mark the smb session (uid) |
| 141 | and the tid bad so they are not used until reconnected */ | 142 | and the tid bad so they are not used until reconnected */ |
| @@ -153,12 +154,12 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
| 153 | /* do not want to be sending data on a socket we are freeing */ | 154 | /* do not want to be sending data on a socket we are freeing */ |
| 154 | mutex_lock(&server->srv_mutex); | 155 | mutex_lock(&server->srv_mutex); |
| 155 | if (server->ssocket) { | 156 | if (server->ssocket) { |
| 156 | cFYI(1, ("State: 0x%x Flags: 0x%lx", server->ssocket->state, | 157 | cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state, |
| 157 | server->ssocket->flags)); | 158 | server->ssocket->flags); |
| 158 | kernel_sock_shutdown(server->ssocket, SHUT_WR); | 159 | kernel_sock_shutdown(server->ssocket, SHUT_WR); |
| 159 | cFYI(1, ("Post shutdown state: 0x%x Flags: 0x%lx", | 160 | cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx", |
| 160 | server->ssocket->state, | 161 | server->ssocket->state, |
| 161 | server->ssocket->flags)); | 162 | server->ssocket->flags); |
| 162 | sock_release(server->ssocket); | 163 | sock_release(server->ssocket); |
| 163 | server->ssocket = NULL; | 164 | server->ssocket = NULL; |
| 164 | } | 165 | } |
| @@ -187,7 +188,7 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
| 187 | else | 188 | else |
| 188 | rc = ipv4_connect(server); | 189 | rc = ipv4_connect(server); |
| 189 | if (rc) { | 190 | if (rc) { |
| 190 | cFYI(1, ("reconnect error %d", rc)); | 191 | cFYI(1, "reconnect error %d", rc); |
| 191 | msleep(3000); | 192 | msleep(3000); |
| 192 | } else { | 193 | } else { |
| 193 | atomic_inc(&tcpSesReconnectCount); | 194 | atomic_inc(&tcpSesReconnectCount); |
| @@ -223,7 +224,7 @@ static int check2ndT2(struct smb_hdr *pSMB, unsigned int maxBufSize) | |||
| 223 | /* check for plausible wct, bcc and t2 data and parm sizes */ | 224 | /* check for plausible wct, bcc and t2 data and parm sizes */ |
| 224 | /* check for parm and data offset going beyond end of smb */ | 225 | /* check for parm and data offset going beyond end of smb */ |
| 225 | if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */ | 226 | if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */ |
| 226 | cFYI(1, ("invalid transact2 word count")); | 227 | cFYI(1, "invalid transact2 word count"); |
| 227 | return -EINVAL; | 228 | return -EINVAL; |
| 228 | } | 229 | } |
| 229 | 230 | ||
| @@ -237,15 +238,15 @@ static int check2ndT2(struct smb_hdr *pSMB, unsigned int maxBufSize) | |||
| 237 | if (remaining == 0) | 238 | if (remaining == 0) |
| 238 | return 0; | 239 | return 0; |
| 239 | else if (remaining < 0) { | 240 | else if (remaining < 0) { |
| 240 | cFYI(1, ("total data %d smaller than data in frame %d", | 241 | cFYI(1, "total data %d smaller than data in frame %d", |
| 241 | total_data_size, data_in_this_rsp)); | 242 | total_data_size, data_in_this_rsp); |
| 242 | return -EINVAL; | 243 | return -EINVAL; |
| 243 | } else { | 244 | } else { |
| 244 | cFYI(1, ("missing %d bytes from transact2, check next response", | 245 | cFYI(1, "missing %d bytes from transact2, check next response", |
| 245 | remaining)); | 246 | remaining); |
| 246 | if (total_data_size > maxBufSize) { | 247 | if (total_data_size > maxBufSize) { |
| 247 | cERROR(1, ("TotalDataSize %d is over maximum buffer %d", | 248 | cERROR(1, "TotalDataSize %d is over maximum buffer %d", |
| 248 | total_data_size, maxBufSize)); | 249 | total_data_size, maxBufSize); |
| 249 | return -EINVAL; | 250 | return -EINVAL; |
| 250 | } | 251 | } |
| 251 | return remaining; | 252 | return remaining; |
| @@ -267,7 +268,7 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) | |||
| 267 | total_data_size = le16_to_cpu(pSMBt->t2_rsp.TotalDataCount); | 268 | total_data_size = le16_to_cpu(pSMBt->t2_rsp.TotalDataCount); |
| 268 | 269 | ||
| 269 | if (total_data_size != le16_to_cpu(pSMB2->t2_rsp.TotalDataCount)) { | 270 | if (total_data_size != le16_to_cpu(pSMB2->t2_rsp.TotalDataCount)) { |
| 270 | cFYI(1, ("total data size of primary and secondary t2 differ")); | 271 | cFYI(1, "total data size of primary and secondary t2 differ"); |
| 271 | } | 272 | } |
| 272 | 273 | ||
| 273 | total_in_buf = le16_to_cpu(pSMBt->t2_rsp.DataCount); | 274 | total_in_buf = le16_to_cpu(pSMBt->t2_rsp.DataCount); |
| @@ -282,7 +283,7 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) | |||
| 282 | 283 | ||
| 283 | total_in_buf2 = le16_to_cpu(pSMB2->t2_rsp.DataCount); | 284 | total_in_buf2 = le16_to_cpu(pSMB2->t2_rsp.DataCount); |
| 284 | if (remaining < total_in_buf2) { | 285 | if (remaining < total_in_buf2) { |
| 285 | cFYI(1, ("transact2 2nd response contains too much data")); | 286 | cFYI(1, "transact2 2nd response contains too much data"); |
| 286 | } | 287 | } |
| 287 | 288 | ||
| 288 | /* find end of first SMB data area */ | 289 | /* find end of first SMB data area */ |
| @@ -311,7 +312,7 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) | |||
| 311 | pTargetSMB->smb_buf_length = byte_count; | 312 | pTargetSMB->smb_buf_length = byte_count; |
| 312 | 313 | ||
| 313 | if (remaining == total_in_buf2) { | 314 | if (remaining == total_in_buf2) { |
| 314 | cFYI(1, ("found the last secondary response")); | 315 | cFYI(1, "found the last secondary response"); |
| 315 | return 0; /* we are done */ | 316 | return 0; /* we are done */ |
| 316 | } else /* more responses to go */ | 317 | } else /* more responses to go */ |
| 317 | return 1; | 318 | return 1; |
| @@ -339,7 +340,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) | |||
| 339 | int reconnect; | 340 | int reconnect; |
| 340 | 341 | ||
| 341 | current->flags |= PF_MEMALLOC; | 342 | current->flags |= PF_MEMALLOC; |
| 342 | cFYI(1, ("Demultiplex PID: %d", task_pid_nr(current))); | 343 | cFYI(1, "Demultiplex PID: %d", task_pid_nr(current)); |
| 343 | 344 | ||
| 344 | length = atomic_inc_return(&tcpSesAllocCount); | 345 | length = atomic_inc_return(&tcpSesAllocCount); |
| 345 | if (length > 1) | 346 | if (length > 1) |
| @@ -353,7 +354,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) | |||
| 353 | if (bigbuf == NULL) { | 354 | if (bigbuf == NULL) { |
| 354 | bigbuf = cifs_buf_get(); | 355 | bigbuf = cifs_buf_get(); |
| 355 | if (!bigbuf) { | 356 | if (!bigbuf) { |
| 356 | cERROR(1, ("No memory for large SMB response")); | 357 | cERROR(1, "No memory for large SMB response"); |
| 357 | msleep(3000); | 358 | msleep(3000); |
| 358 | /* retry will check if exiting */ | 359 | /* retry will check if exiting */ |
| 359 | continue; | 360 | continue; |
| @@ -366,7 +367,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) | |||
| 366 | if (smallbuf == NULL) { | 367 | if (smallbuf == NULL) { |
| 367 | smallbuf = cifs_small_buf_get(); | 368 | smallbuf = cifs_small_buf_get(); |
| 368 | if (!smallbuf) { | 369 | if (!smallbuf) { |
| 369 | cERROR(1, ("No memory for SMB response")); | 370 | cERROR(1, "No memory for SMB response"); |
| 370 | msleep(1000); | 371 | msleep(1000); |
| 371 | /* retry will check if exiting */ | 372 | /* retry will check if exiting */ |
| 372 | continue; | 373 | continue; |
| @@ -391,9 +392,9 @@ incomplete_rcv: | |||
| 391 | if (server->tcpStatus == CifsExiting) { | 392 | if (server->tcpStatus == CifsExiting) { |
| 392 | break; | 393 | break; |
| 393 | } else if (server->tcpStatus == CifsNeedReconnect) { | 394 | } else if (server->tcpStatus == CifsNeedReconnect) { |
| 394 | cFYI(1, ("Reconnect after server stopped responding")); | 395 | cFYI(1, "Reconnect after server stopped responding"); |
| 395 | cifs_reconnect(server); | 396 | cifs_reconnect(server); |
| 396 | cFYI(1, ("call to reconnect done")); | 397 | cFYI(1, "call to reconnect done"); |
| 397 | csocket = server->ssocket; | 398 | csocket = server->ssocket; |
| 398 | continue; | 399 | continue; |
| 399 | } else if ((length == -ERESTARTSYS) || (length == -EAGAIN)) { | 400 | } else if ((length == -ERESTARTSYS) || (length == -EAGAIN)) { |
| @@ -411,7 +412,7 @@ incomplete_rcv: | |||
| 411 | continue; | 412 | continue; |
| 412 | } else if (length <= 0) { | 413 | } else if (length <= 0) { |
| 413 | if (server->tcpStatus == CifsNew) { | 414 | if (server->tcpStatus == CifsNew) { |
| 414 | cFYI(1, ("tcp session abend after SMBnegprot")); | 415 | cFYI(1, "tcp session abend after SMBnegprot"); |
| 415 | /* some servers kill the TCP session rather than | 416 | /* some servers kill the TCP session rather than |
| 416 | returning an SMB negprot error, in which | 417 | returning an SMB negprot error, in which |
| 417 | case reconnecting here is not going to help, | 418 | case reconnecting here is not going to help, |
| @@ -419,18 +420,18 @@ incomplete_rcv: | |||
| 419 | break; | 420 | break; |
| 420 | } | 421 | } |
| 421 | if (!try_to_freeze() && (length == -EINTR)) { | 422 | if (!try_to_freeze() && (length == -EINTR)) { |
| 422 | cFYI(1, ("cifsd thread killed")); | 423 | cFYI(1, "cifsd thread killed"); |
| 423 | break; | 424 | break; |
| 424 | } | 425 | } |
| 425 | cFYI(1, ("Reconnect after unexpected peek error %d", | 426 | cFYI(1, "Reconnect after unexpected peek error %d", |
| 426 | length)); | 427 | length); |
| 427 | cifs_reconnect(server); | 428 | cifs_reconnect(server); |
| 428 | csocket = server->ssocket; | 429 | csocket = server->ssocket; |
| 429 | wake_up(&server->response_q); | 430 | wake_up(&server->response_q); |
| 430 | continue; | 431 | continue; |
| 431 | } else if (length < pdu_length) { | 432 | } else if (length < pdu_length) { |
| 432 | cFYI(1, ("requested %d bytes but only got %d bytes", | 433 | cFYI(1, "requested %d bytes but only got %d bytes", |
| 433 | pdu_length, length)); | 434 | pdu_length, length); |
| 434 | pdu_length -= length; | 435 | pdu_length -= length; |
| 435 | msleep(1); | 436 | msleep(1); |
| 436 | goto incomplete_rcv; | 437 | goto incomplete_rcv; |
| @@ -450,18 +451,18 @@ incomplete_rcv: | |||
| 450 | pdu_length = be32_to_cpu((__force __be32)smb_buffer->smb_buf_length); | 451 | pdu_length = be32_to_cpu((__force __be32)smb_buffer->smb_buf_length); |
| 451 | smb_buffer->smb_buf_length = pdu_length; | 452 | smb_buffer->smb_buf_length = pdu_length; |
| 452 | 453 | ||
| 453 | cFYI(1, ("rfc1002 length 0x%x", pdu_length+4)); | 454 | cFYI(1, "rfc1002 length 0x%x", pdu_length+4); |
| 454 | 455 | ||
| 455 | if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) { | 456 | if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) { |
| 456 | continue; | 457 | continue; |
| 457 | } else if (temp == (char)RFC1002_POSITIVE_SESSION_RESPONSE) { | 458 | } else if (temp == (char)RFC1002_POSITIVE_SESSION_RESPONSE) { |
| 458 | cFYI(1, ("Good RFC 1002 session rsp")); | 459 | cFYI(1, "Good RFC 1002 session rsp"); |
| 459 | continue; | 460 | continue; |
| 460 | } else if (temp == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) { | 461 | } else if (temp == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) { |
| 461 | /* we get this from Windows 98 instead of | 462 | /* we get this from Windows 98 instead of |
| 462 | an error on SMB negprot response */ | 463 | an error on SMB negprot response */ |
| 463 | cFYI(1, ("Negative RFC1002 Session Response Error 0x%x)", | 464 | cFYI(1, "Negative RFC1002 Session Response Error 0x%x)", |
| 464 | pdu_length)); | 465 | pdu_length); |
| 465 | if (server->tcpStatus == CifsNew) { | 466 | if (server->tcpStatus == CifsNew) { |
| 466 | /* if nack on negprot (rather than | 467 | /* if nack on negprot (rather than |
| 467 | ret of smb negprot error) reconnecting | 468 | ret of smb negprot error) reconnecting |
| @@ -484,7 +485,7 @@ incomplete_rcv: | |||
| 484 | continue; | 485 | continue; |
| 485 | } | 486 | } |
| 486 | } else if (temp != (char) 0) { | 487 | } else if (temp != (char) 0) { |
| 487 | cERROR(1, ("Unknown RFC 1002 frame")); | 488 | cERROR(1, "Unknown RFC 1002 frame"); |
| 488 | cifs_dump_mem(" Received Data: ", (char *)smb_buffer, | 489 | cifs_dump_mem(" Received Data: ", (char *)smb_buffer, |
| 489 | length); | 490 | length); |
| 490 | cifs_reconnect(server); | 491 | cifs_reconnect(server); |
| @@ -495,8 +496,8 @@ incomplete_rcv: | |||
| 495 | /* else we have an SMB response */ | 496 | /* else we have an SMB response */ |
| 496 | if ((pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) || | 497 | if ((pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) || |
| 497 | (pdu_length < sizeof(struct smb_hdr) - 1 - 4)) { | 498 | (pdu_length < sizeof(struct smb_hdr) - 1 - 4)) { |
| 498 | cERROR(1, ("Invalid size SMB length %d pdu_length %d", | 499 | cERROR(1, "Invalid size SMB length %d pdu_length %d", |
| 499 | length, pdu_length+4)); | 500 | length, pdu_length+4); |
| 500 | cifs_reconnect(server); | 501 | cifs_reconnect(server); |
| 501 | csocket = server->ssocket; | 502 | csocket = server->ssocket; |
| 502 | wake_up(&server->response_q); | 503 | wake_up(&server->response_q); |
| @@ -539,8 +540,8 @@ incomplete_rcv: | |||
| 539 | length = 0; | 540 | length = 0; |
| 540 | continue; | 541 | continue; |
| 541 | } else if (length <= 0) { | 542 | } else if (length <= 0) { |
| 542 | cERROR(1, ("Received no data, expecting %d", | 543 | cERROR(1, "Received no data, expecting %d", |
| 543 | pdu_length - total_read)); | 544 | pdu_length - total_read); |
| 544 | cifs_reconnect(server); | 545 | cifs_reconnect(server); |
| 545 | csocket = server->ssocket; | 546 | csocket = server->ssocket; |
| 546 | reconnect = 1; | 547 | reconnect = 1; |
| @@ -588,7 +589,7 @@ incomplete_rcv: | |||
| 588 | } | 589 | } |
| 589 | } else { | 590 | } else { |
| 590 | if (!isLargeBuf) { | 591 | if (!isLargeBuf) { |
| 591 | cERROR(1,("1st trans2 resp needs bigbuf")); | 592 | cERROR(1, "1st trans2 resp needs bigbuf"); |
| 592 | /* BB maybe we can fix this up, switch | 593 | /* BB maybe we can fix this up, switch |
| 593 | to already allocated large buffer? */ | 594 | to already allocated large buffer? */ |
| 594 | } else { | 595 | } else { |
| @@ -630,8 +631,8 @@ multi_t2_fnd: | |||
| 630 | wake_up_process(task_to_wake); | 631 | wake_up_process(task_to_wake); |
| 631 | } else if (!is_valid_oplock_break(smb_buffer, server) && | 632 | } else if (!is_valid_oplock_break(smb_buffer, server) && |
| 632 | !isMultiRsp) { | 633 | !isMultiRsp) { |
| 633 | cERROR(1, ("No task to wake, unknown frame received! " | 634 | cERROR(1, "No task to wake, unknown frame received! " |
| 634 | "NumMids %d", midCount.counter)); | 635 | "NumMids %d", midCount.counter); |
| 635 | cifs_dump_mem("Received Data is: ", (char *)smb_buffer, | 636 | cifs_dump_mem("Received Data is: ", (char *)smb_buffer, |
| 636 | sizeof(struct smb_hdr)); | 637 | sizeof(struct smb_hdr)); |
| 637 | #ifdef CONFIG_CIFS_DEBUG2 | 638 | #ifdef CONFIG_CIFS_DEBUG2 |
| @@ -708,8 +709,8 @@ multi_t2_fnd: | |||
| 708 | list_for_each(tmp, &server->pending_mid_q) { | 709 | list_for_each(tmp, &server->pending_mid_q) { |
| 709 | mid_entry = list_entry(tmp, struct mid_q_entry, qhead); | 710 | mid_entry = list_entry(tmp, struct mid_q_entry, qhead); |
| 710 | if (mid_entry->midState == MID_REQUEST_SUBMITTED) { | 711 | if (mid_entry->midState == MID_REQUEST_SUBMITTED) { |
| 711 | cFYI(1, ("Clearing Mid 0x%x - waking up ", | 712 | cFYI(1, "Clearing Mid 0x%x - waking up ", |
| 712 | mid_entry->mid)); | 713 | mid_entry->mid); |
| 713 | task_to_wake = mid_entry->tsk; | 714 | task_to_wake = mid_entry->tsk; |
| 714 | if (task_to_wake) | 715 | if (task_to_wake) |
| 715 | wake_up_process(task_to_wake); | 716 | wake_up_process(task_to_wake); |
| @@ -728,7 +729,7 @@ multi_t2_fnd: | |||
| 728 | to wait at least 45 seconds before giving up | 729 | to wait at least 45 seconds before giving up |
| 729 | on a request getting a response and going ahead | 730 | on a request getting a response and going ahead |
| 730 | and killing cifsd */ | 731 | and killing cifsd */ |
| 731 | cFYI(1, ("Wait for exit from demultiplex thread")); | 732 | cFYI(1, "Wait for exit from demultiplex thread"); |
| 732 | msleep(46000); | 733 | msleep(46000); |
| 733 | /* if threads still have not exited they are probably never | 734 | /* if threads still have not exited they are probably never |
| 734 | coming home not much else we can do but free the memory */ | 735 | coming home not much else we can do but free the memory */ |
| @@ -849,7 +850,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 849 | separator[0] = options[4]; | 850 | separator[0] = options[4]; |
| 850 | options += 5; | 851 | options += 5; |
| 851 | } else { | 852 | } else { |
| 852 | cFYI(1, ("Null separator not allowed")); | 853 | cFYI(1, "Null separator not allowed"); |
| 853 | } | 854 | } |
| 854 | } | 855 | } |
| 855 | 856 | ||
| @@ -974,7 +975,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 974 | } | 975 | } |
| 975 | } else if (strnicmp(data, "sec", 3) == 0) { | 976 | } else if (strnicmp(data, "sec", 3) == 0) { |
| 976 | if (!value || !*value) { | 977 | if (!value || !*value) { |
| 977 | cERROR(1, ("no security value specified")); | 978 | cERROR(1, "no security value specified"); |
| 978 | continue; | 979 | continue; |
| 979 | } else if (strnicmp(value, "krb5i", 5) == 0) { | 980 | } else if (strnicmp(value, "krb5i", 5) == 0) { |
| 980 | vol->secFlg |= CIFSSEC_MAY_KRB5 | | 981 | vol->secFlg |= CIFSSEC_MAY_KRB5 | |
| @@ -982,7 +983,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 982 | } else if (strnicmp(value, "krb5p", 5) == 0) { | 983 | } else if (strnicmp(value, "krb5p", 5) == 0) { |
| 983 | /* vol->secFlg |= CIFSSEC_MUST_SEAL | | 984 | /* vol->secFlg |= CIFSSEC_MUST_SEAL | |
| 984 | CIFSSEC_MAY_KRB5; */ | 985 | CIFSSEC_MAY_KRB5; */ |
| 985 | cERROR(1, ("Krb5 cifs privacy not supported")); | 986 | cERROR(1, "Krb5 cifs privacy not supported"); |
| 986 | return 1; | 987 | return 1; |
| 987 | } else if (strnicmp(value, "krb5", 4) == 0) { | 988 | } else if (strnicmp(value, "krb5", 4) == 0) { |
| 988 | vol->secFlg |= CIFSSEC_MAY_KRB5; | 989 | vol->secFlg |= CIFSSEC_MAY_KRB5; |
| @@ -1014,7 +1015,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1014 | } else if (strnicmp(value, "none", 4) == 0) { | 1015 | } else if (strnicmp(value, "none", 4) == 0) { |
| 1015 | vol->nullauth = 1; | 1016 | vol->nullauth = 1; |
| 1016 | } else { | 1017 | } else { |
| 1017 | cERROR(1, ("bad security option: %s", value)); | 1018 | cERROR(1, "bad security option: %s", value); |
| 1018 | return 1; | 1019 | return 1; |
| 1019 | } | 1020 | } |
| 1020 | } else if ((strnicmp(data, "unc", 3) == 0) | 1021 | } else if ((strnicmp(data, "unc", 3) == 0) |
| @@ -1053,7 +1054,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1053 | a domain name and need special handling? */ | 1054 | a domain name and need special handling? */ |
| 1054 | if (strnlen(value, 256) < 256) { | 1055 | if (strnlen(value, 256) < 256) { |
| 1055 | vol->domainname = value; | 1056 | vol->domainname = value; |
| 1056 | cFYI(1, ("Domain name set")); | 1057 | cFYI(1, "Domain name set"); |
| 1057 | } else { | 1058 | } else { |
| 1058 | printk(KERN_WARNING "CIFS: domain name too " | 1059 | printk(KERN_WARNING "CIFS: domain name too " |
| 1059 | "long\n"); | 1060 | "long\n"); |
| @@ -1076,7 +1077,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1076 | strcpy(vol->prepath+1, value); | 1077 | strcpy(vol->prepath+1, value); |
| 1077 | } else | 1078 | } else |
| 1078 | strcpy(vol->prepath, value); | 1079 | strcpy(vol->prepath, value); |
| 1079 | cFYI(1, ("prefix path %s", vol->prepath)); | 1080 | cFYI(1, "prefix path %s", vol->prepath); |
| 1080 | } else { | 1081 | } else { |
| 1081 | printk(KERN_WARNING "CIFS: prefix too long\n"); | 1082 | printk(KERN_WARNING "CIFS: prefix too long\n"); |
| 1082 | return 1; | 1083 | return 1; |
| @@ -1092,7 +1093,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1092 | vol->iocharset = value; | 1093 | vol->iocharset = value; |
| 1093 | /* if iocharset not set then load_nls_default | 1094 | /* if iocharset not set then load_nls_default |
| 1094 | is used by caller */ | 1095 | is used by caller */ |
| 1095 | cFYI(1, ("iocharset set to %s", value)); | 1096 | cFYI(1, "iocharset set to %s", value); |
| 1096 | } else { | 1097 | } else { |
| 1097 | printk(KERN_WARNING "CIFS: iocharset name " | 1098 | printk(KERN_WARNING "CIFS: iocharset name " |
| 1098 | "too long.\n"); | 1099 | "too long.\n"); |
| @@ -1144,14 +1145,14 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1144 | } | 1145 | } |
| 1145 | } else if (strnicmp(data, "sockopt", 5) == 0) { | 1146 | } else if (strnicmp(data, "sockopt", 5) == 0) { |
| 1146 | if (!value || !*value) { | 1147 | if (!value || !*value) { |
| 1147 | cERROR(1, ("no socket option specified")); | 1148 | cERROR(1, "no socket option specified"); |
| 1148 | continue; | 1149 | continue; |
| 1149 | } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) { | 1150 | } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) { |
| 1150 | vol->sockopt_tcp_nodelay = 1; | 1151 | vol->sockopt_tcp_nodelay = 1; |
| 1151 | } | 1152 | } |
| 1152 | } else if (strnicmp(data, "netbiosname", 4) == 0) { | 1153 | } else if (strnicmp(data, "netbiosname", 4) == 0) { |
| 1153 | if (!value || !*value || (*value == ' ')) { | 1154 | if (!value || !*value || (*value == ' ')) { |
| 1154 | cFYI(1, ("invalid (empty) netbiosname")); | 1155 | cFYI(1, "invalid (empty) netbiosname"); |
| 1155 | } else { | 1156 | } else { |
| 1156 | memset(vol->source_rfc1001_name, 0x20, 15); | 1157 | memset(vol->source_rfc1001_name, 0x20, 15); |
| 1157 | for (i = 0; i < 15; i++) { | 1158 | for (i = 0; i < 15; i++) { |
| @@ -1175,7 +1176,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1175 | } else if (strnicmp(data, "servern", 7) == 0) { | 1176 | } else if (strnicmp(data, "servern", 7) == 0) { |
| 1176 | /* servernetbiosname specified override *SMBSERVER */ | 1177 | /* servernetbiosname specified override *SMBSERVER */ |
| 1177 | if (!value || !*value || (*value == ' ')) { | 1178 | if (!value || !*value || (*value == ' ')) { |
| 1178 | cFYI(1, ("empty server netbiosname specified")); | 1179 | cFYI(1, "empty server netbiosname specified"); |
| 1179 | } else { | 1180 | } else { |
| 1180 | /* last byte, type, is 0x20 for servr type */ | 1181 | /* last byte, type, is 0x20 for servr type */ |
| 1181 | memset(vol->target_rfc1001_name, 0x20, 16); | 1182 | memset(vol->target_rfc1001_name, 0x20, 16); |
| @@ -1434,7 +1435,7 @@ cifs_find_tcp_session(struct sockaddr_storage *addr, unsigned short int port) | |||
| 1434 | 1435 | ||
| 1435 | ++server->srv_count; | 1436 | ++server->srv_count; |
| 1436 | write_unlock(&cifs_tcp_ses_lock); | 1437 | write_unlock(&cifs_tcp_ses_lock); |
| 1437 | cFYI(1, ("Existing tcp session with server found")); | 1438 | cFYI(1, "Existing tcp session with server found"); |
| 1438 | return server; | 1439 | return server; |
| 1439 | } | 1440 | } |
| 1440 | write_unlock(&cifs_tcp_ses_lock); | 1441 | write_unlock(&cifs_tcp_ses_lock); |
| @@ -1475,7 +1476,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
| 1475 | 1476 | ||
| 1476 | memset(&addr, 0, sizeof(struct sockaddr_storage)); | 1477 | memset(&addr, 0, sizeof(struct sockaddr_storage)); |
| 1477 | 1478 | ||
| 1478 | cFYI(1, ("UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip)); | 1479 | cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip); |
| 1479 | 1480 | ||
| 1480 | if (volume_info->UNCip && volume_info->UNC) { | 1481 | if (volume_info->UNCip && volume_info->UNC) { |
| 1481 | rc = cifs_convert_address(volume_info->UNCip, &addr); | 1482 | rc = cifs_convert_address(volume_info->UNCip, &addr); |
| @@ -1487,13 +1488,12 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
| 1487 | } else if (volume_info->UNCip) { | 1488 | } else if (volume_info->UNCip) { |
| 1488 | /* BB using ip addr as tcp_ses name to connect to the | 1489 | /* BB using ip addr as tcp_ses name to connect to the |
| 1489 | DFS root below */ | 1490 | DFS root below */ |
| 1490 | cERROR(1, ("Connecting to DFS root not implemented yet")); | 1491 | cERROR(1, "Connecting to DFS root not implemented yet"); |
| 1491 | rc = -EINVAL; | 1492 | rc = -EINVAL; |
| 1492 | goto out_err; | 1493 | goto out_err; |
| 1493 | } else /* which tcp_sess DFS root would we conect to */ { | 1494 | } else /* which tcp_sess DFS root would we conect to */ { |
| 1494 | cERROR(1, | 1495 | cERROR(1, "CIFS mount error: No UNC path (e.g. -o " |
| 1495 | ("CIFS mount error: No UNC path (e.g. -o " | 1496 | "unc=//192.168.1.100/public) specified"); |
| 1496 | "unc=//192.168.1.100/public) specified")); | ||
| 1497 | rc = -EINVAL; | 1497 | rc = -EINVAL; |
| 1498 | goto out_err; | 1498 | goto out_err; |
| 1499 | } | 1499 | } |
| @@ -1540,7 +1540,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
| 1540 | ++tcp_ses->srv_count; | 1540 | ++tcp_ses->srv_count; |
| 1541 | 1541 | ||
| 1542 | if (addr.ss_family == AF_INET6) { | 1542 | if (addr.ss_family == AF_INET6) { |
| 1543 | cFYI(1, ("attempting ipv6 connect")); | 1543 | cFYI(1, "attempting ipv6 connect"); |
| 1544 | /* BB should we allow ipv6 on port 139? */ | 1544 | /* BB should we allow ipv6 on port 139? */ |
| 1545 | /* other OS never observed in Wild doing 139 with v6 */ | 1545 | /* other OS never observed in Wild doing 139 with v6 */ |
| 1546 | sin_server6->sin6_port = htons(volume_info->port); | 1546 | sin_server6->sin6_port = htons(volume_info->port); |
| @@ -1554,7 +1554,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
| 1554 | rc = ipv4_connect(tcp_ses); | 1554 | rc = ipv4_connect(tcp_ses); |
| 1555 | } | 1555 | } |
| 1556 | if (rc < 0) { | 1556 | if (rc < 0) { |
| 1557 | cERROR(1, ("Error connecting to socket. Aborting operation")); | 1557 | cERROR(1, "Error connecting to socket. Aborting operation"); |
| 1558 | goto out_err; | 1558 | goto out_err; |
| 1559 | } | 1559 | } |
| 1560 | 1560 | ||
| @@ -1567,7 +1567,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
| 1567 | tcp_ses, "cifsd"); | 1567 | tcp_ses, "cifsd"); |
| 1568 | if (IS_ERR(tcp_ses->tsk)) { | 1568 | if (IS_ERR(tcp_ses->tsk)) { |
| 1569 | rc = PTR_ERR(tcp_ses->tsk); | 1569 | rc = PTR_ERR(tcp_ses->tsk); |
| 1570 | cERROR(1, ("error %d create cifsd thread", rc)); | 1570 | cERROR(1, "error %d create cifsd thread", rc); |
| 1571 | module_put(THIS_MODULE); | 1571 | module_put(THIS_MODULE); |
| 1572 | goto out_err; | 1572 | goto out_err; |
| 1573 | } | 1573 | } |
| @@ -1616,6 +1616,7 @@ cifs_put_smb_ses(struct cifsSesInfo *ses) | |||
| 1616 | int xid; | 1616 | int xid; |
| 1617 | struct TCP_Server_Info *server = ses->server; | 1617 | struct TCP_Server_Info *server = ses->server; |
| 1618 | 1618 | ||
| 1619 | cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count); | ||
| 1619 | write_lock(&cifs_tcp_ses_lock); | 1620 | write_lock(&cifs_tcp_ses_lock); |
| 1620 | if (--ses->ses_count > 0) { | 1621 | if (--ses->ses_count > 0) { |
| 1621 | write_unlock(&cifs_tcp_ses_lock); | 1622 | write_unlock(&cifs_tcp_ses_lock); |
| @@ -1634,6 +1635,102 @@ cifs_put_smb_ses(struct cifsSesInfo *ses) | |||
| 1634 | cifs_put_tcp_session(server); | 1635 | cifs_put_tcp_session(server); |
| 1635 | } | 1636 | } |
| 1636 | 1637 | ||
| 1638 | static struct cifsSesInfo * | ||
| 1639 | cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) | ||
| 1640 | { | ||
| 1641 | int rc = -ENOMEM, xid; | ||
| 1642 | struct cifsSesInfo *ses; | ||
| 1643 | |||
| 1644 | xid = GetXid(); | ||
| 1645 | |||
| 1646 | ses = cifs_find_smb_ses(server, volume_info->username); | ||
| 1647 | if (ses) { | ||
| 1648 | cFYI(1, "Existing smb sess found (status=%d)", ses->status); | ||
| 1649 | |||
| 1650 | /* existing SMB ses has a server reference already */ | ||
| 1651 | cifs_put_tcp_session(server); | ||
| 1652 | |||
| 1653 | mutex_lock(&ses->session_mutex); | ||
| 1654 | rc = cifs_negotiate_protocol(xid, ses); | ||
| 1655 | if (rc) { | ||
| 1656 | mutex_unlock(&ses->session_mutex); | ||
| 1657 | /* problem -- put our ses reference */ | ||
| 1658 | cifs_put_smb_ses(ses); | ||
| 1659 | FreeXid(xid); | ||
| 1660 | return ERR_PTR(rc); | ||
| 1661 | } | ||
| 1662 | if (ses->need_reconnect) { | ||
| 1663 | cFYI(1, "Session needs reconnect"); | ||
| 1664 | rc = cifs_setup_session(xid, ses, | ||
| 1665 | volume_info->local_nls); | ||
| 1666 | if (rc) { | ||
| 1667 | mutex_unlock(&ses->session_mutex); | ||
| 1668 | /* problem -- put our reference */ | ||
| 1669 | cifs_put_smb_ses(ses); | ||
| 1670 | FreeXid(xid); | ||
| 1671 | return ERR_PTR(rc); | ||
| 1672 | } | ||
| 1673 | } | ||
| 1674 | mutex_unlock(&ses->session_mutex); | ||
| 1675 | FreeXid(xid); | ||
| 1676 | return ses; | ||
| 1677 | } | ||
| 1678 | |||
| 1679 | cFYI(1, "Existing smb sess not found"); | ||
| 1680 | ses = sesInfoAlloc(); | ||
| 1681 | if (ses == NULL) | ||
| 1682 | goto get_ses_fail; | ||
| 1683 | |||
| 1684 | /* new SMB session uses our server ref */ | ||
| 1685 | ses->server = server; | ||
| 1686 | if (server->addr.sockAddr6.sin6_family == AF_INET6) | ||
| 1687 | sprintf(ses->serverName, "%pI6", | ||
| 1688 | &server->addr.sockAddr6.sin6_addr); | ||
| 1689 | else | ||
| 1690 | sprintf(ses->serverName, "%pI4", | ||
| 1691 | &server->addr.sockAddr.sin_addr.s_addr); | ||
| 1692 | |||
| 1693 | if (volume_info->username) | ||
| 1694 | strncpy(ses->userName, volume_info->username, | ||
| 1695 | MAX_USERNAME_SIZE); | ||
| 1696 | |||
| 1697 | /* volume_info->password freed at unmount */ | ||
| 1698 | if (volume_info->password) { | ||
| 1699 | ses->password = kstrdup(volume_info->password, GFP_KERNEL); | ||
| 1700 | if (!ses->password) | ||
| 1701 | goto get_ses_fail; | ||
| 1702 | } | ||
| 1703 | if (volume_info->domainname) { | ||
| 1704 | int len = strlen(volume_info->domainname); | ||
| 1705 | ses->domainName = kmalloc(len + 1, GFP_KERNEL); | ||
| 1706 | if (ses->domainName) | ||
| 1707 | strcpy(ses->domainName, volume_info->domainname); | ||
| 1708 | } | ||
| 1709 | ses->linux_uid = volume_info->linux_uid; | ||
| 1710 | ses->overrideSecFlg = volume_info->secFlg; | ||
| 1711 | |||
| 1712 | mutex_lock(&ses->session_mutex); | ||
| 1713 | rc = cifs_negotiate_protocol(xid, ses); | ||
| 1714 | if (!rc) | ||
| 1715 | rc = cifs_setup_session(xid, ses, volume_info->local_nls); | ||
| 1716 | mutex_unlock(&ses->session_mutex); | ||
| 1717 | if (rc) | ||
| 1718 | goto get_ses_fail; | ||
| 1719 | |||
| 1720 | /* success, put it on the list */ | ||
| 1721 | write_lock(&cifs_tcp_ses_lock); | ||
| 1722 | list_add(&ses->smb_ses_list, &server->smb_ses_list); | ||
| 1723 | write_unlock(&cifs_tcp_ses_lock); | ||
| 1724 | |||
| 1725 | FreeXid(xid); | ||
| 1726 | return ses; | ||
| 1727 | |||
| 1728 | get_ses_fail: | ||
| 1729 | sesInfoFree(ses); | ||
| 1730 | FreeXid(xid); | ||
| 1731 | return ERR_PTR(rc); | ||
| 1732 | } | ||
| 1733 | |||
| 1637 | static struct cifsTconInfo * | 1734 | static struct cifsTconInfo * |
| 1638 | cifs_find_tcon(struct cifsSesInfo *ses, const char *unc) | 1735 | cifs_find_tcon(struct cifsSesInfo *ses, const char *unc) |
| 1639 | { | 1736 | { |
| @@ -1662,6 +1759,7 @@ cifs_put_tcon(struct cifsTconInfo *tcon) | |||
| 1662 | int xid; | 1759 | int xid; |
| 1663 | struct cifsSesInfo *ses = tcon->ses; | 1760 | struct cifsSesInfo *ses = tcon->ses; |
| 1664 | 1761 | ||
| 1762 | cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count); | ||
| 1665 | write_lock(&cifs_tcp_ses_lock); | 1763 | write_lock(&cifs_tcp_ses_lock); |
| 1666 | if (--tcon->tc_count > 0) { | 1764 | if (--tcon->tc_count > 0) { |
| 1667 | write_unlock(&cifs_tcp_ses_lock); | 1765 | write_unlock(&cifs_tcp_ses_lock); |
| @@ -1679,6 +1777,80 @@ cifs_put_tcon(struct cifsTconInfo *tcon) | |||
| 1679 | cifs_put_smb_ses(ses); | 1777 | cifs_put_smb_ses(ses); |
| 1680 | } | 1778 | } |
| 1681 | 1779 | ||
| 1780 | static struct cifsTconInfo * | ||
| 1781 | cifs_get_tcon(struct cifsSesInfo *ses, struct smb_vol *volume_info) | ||
| 1782 | { | ||
| 1783 | int rc, xid; | ||
| 1784 | struct cifsTconInfo *tcon; | ||
| 1785 | |||
| 1786 | tcon = cifs_find_tcon(ses, volume_info->UNC); | ||
| 1787 | if (tcon) { | ||
| 1788 | cFYI(1, "Found match on UNC path"); | ||
| 1789 | /* existing tcon already has a reference */ | ||
| 1790 | cifs_put_smb_ses(ses); | ||
| 1791 | if (tcon->seal != volume_info->seal) | ||
| 1792 | cERROR(1, "transport encryption setting " | ||
| 1793 | "conflicts with existing tid"); | ||
| 1794 | return tcon; | ||
| 1795 | } | ||
| 1796 | |||
| 1797 | tcon = tconInfoAlloc(); | ||
| 1798 | if (tcon == NULL) { | ||
| 1799 | rc = -ENOMEM; | ||
| 1800 | goto out_fail; | ||
| 1801 | } | ||
| 1802 | |||
| 1803 | tcon->ses = ses; | ||
| 1804 | if (volume_info->password) { | ||
| 1805 | tcon->password = kstrdup(volume_info->password, GFP_KERNEL); | ||
| 1806 | if (!tcon->password) { | ||
| 1807 | rc = -ENOMEM; | ||
| 1808 | goto out_fail; | ||
| 1809 | } | ||
| 1810 | } | ||
| 1811 | |||
| 1812 | if (strchr(volume_info->UNC + 3, '\\') == NULL | ||
| 1813 | && strchr(volume_info->UNC + 3, '/') == NULL) { | ||
| 1814 | cERROR(1, "Missing share name"); | ||
| 1815 | rc = -ENODEV; | ||
| 1816 | goto out_fail; | ||
| 1817 | } | ||
| 1818 | |||
| 1819 | /* BB Do we need to wrap session_mutex around | ||
| 1820 | * this TCon call and Unix SetFS as | ||
| 1821 | * we do on SessSetup and reconnect? */ | ||
| 1822 | xid = GetXid(); | ||
| 1823 | rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls); | ||
| 1824 | FreeXid(xid); | ||
| 1825 | cFYI(1, "CIFS Tcon rc = %d", rc); | ||
| 1826 | if (rc) | ||
| 1827 | goto out_fail; | ||
| 1828 | |||
| 1829 | if (volume_info->nodfs) { | ||
| 1830 | tcon->Flags &= ~SMB_SHARE_IS_IN_DFS; | ||
| 1831 | cFYI(1, "DFS disabled (%d)", tcon->Flags); | ||
| 1832 | } | ||
| 1833 | tcon->seal = volume_info->seal; | ||
| 1834 | /* we can have only one retry value for a connection | ||
| 1835 | to a share so for resources mounted more than once | ||
| 1836 | to the same server share the last value passed in | ||
| 1837 | for the retry flag is used */ | ||
| 1838 | tcon->retry = volume_info->retry; | ||
| 1839 | tcon->nocase = volume_info->nocase; | ||
| 1840 | tcon->local_lease = volume_info->local_lease; | ||
| 1841 | |||
| 1842 | write_lock(&cifs_tcp_ses_lock); | ||
| 1843 | list_add(&tcon->tcon_list, &ses->tcon_list); | ||
| 1844 | write_unlock(&cifs_tcp_ses_lock); | ||
| 1845 | |||
| 1846 | return tcon; | ||
| 1847 | |||
| 1848 | out_fail: | ||
| 1849 | tconInfoFree(tcon); | ||
| 1850 | return ERR_PTR(rc); | ||
| 1851 | } | ||
| 1852 | |||
| 1853 | |||
| 1682 | int | 1854 | int |
| 1683 | get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, | 1855 | get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, |
| 1684 | const struct nls_table *nls_codepage, unsigned int *pnum_referrals, | 1856 | const struct nls_table *nls_codepage, unsigned int *pnum_referrals, |
| @@ -1703,8 +1875,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path, | |||
| 1703 | strcpy(temp_unc + 2, pSesInfo->serverName); | 1875 | strcpy(temp_unc + 2, pSesInfo->serverName); |
| 1704 | strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$"); | 1876 | strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$"); |
| 1705 | rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage); | 1877 | rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage); |
| 1706 | cFYI(1, | 1878 | cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid); |
| 1707 | ("CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid)); | ||
| 1708 | kfree(temp_unc); | 1879 | kfree(temp_unc); |
| 1709 | } | 1880 | } |
| 1710 | if (rc == 0) | 1881 | if (rc == 0) |
| @@ -1777,12 +1948,12 @@ ipv4_connect(struct TCP_Server_Info *server) | |||
| 1777 | rc = sock_create_kern(PF_INET, SOCK_STREAM, | 1948 | rc = sock_create_kern(PF_INET, SOCK_STREAM, |
| 1778 | IPPROTO_TCP, &socket); | 1949 | IPPROTO_TCP, &socket); |
| 1779 | if (rc < 0) { | 1950 | if (rc < 0) { |
| 1780 | cERROR(1, ("Error %d creating socket", rc)); | 1951 | cERROR(1, "Error %d creating socket", rc); |
| 1781 | return rc; | 1952 | return rc; |
| 1782 | } | 1953 | } |
| 1783 | 1954 | ||
| 1784 | /* BB other socket options to set KEEPALIVE, NODELAY? */ | 1955 | /* BB other socket options to set KEEPALIVE, NODELAY? */ |
| 1785 | cFYI(1, ("Socket created")); | 1956 | cFYI(1, "Socket created"); |
| 1786 | server->ssocket = socket; | 1957 | server->ssocket = socket; |
| 1787 | socket->sk->sk_allocation = GFP_NOFS; | 1958 | socket->sk->sk_allocation = GFP_NOFS; |
| 1788 | cifs_reclassify_socket4(socket); | 1959 | cifs_reclassify_socket4(socket); |
| @@ -1827,7 +1998,7 @@ ipv4_connect(struct TCP_Server_Info *server) | |||
| 1827 | if (!connected) { | 1998 | if (!connected) { |
| 1828 | if (orig_port) | 1999 | if (orig_port) |
| 1829 | server->addr.sockAddr.sin_port = orig_port; | 2000 | server->addr.sockAddr.sin_port = orig_port; |
| 1830 | cFYI(1, ("Error %d connecting to server via ipv4", rc)); | 2001 | cFYI(1, "Error %d connecting to server via ipv4", rc); |
| 1831 | sock_release(socket); | 2002 | sock_release(socket); |
| 1832 | server->ssocket = NULL; | 2003 | server->ssocket = NULL; |
| 1833 | return rc; | 2004 | return rc; |
| @@ -1855,12 +2026,12 @@ ipv4_connect(struct TCP_Server_Info *server) | |||
| 1855 | rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY, | 2026 | rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY, |
| 1856 | (char *)&val, sizeof(val)); | 2027 | (char *)&val, sizeof(val)); |
| 1857 | if (rc) | 2028 | if (rc) |
| 1858 | cFYI(1, ("set TCP_NODELAY socket option error %d", rc)); | 2029 | cFYI(1, "set TCP_NODELAY socket option error %d", rc); |
| 1859 | } | 2030 | } |
| 1860 | 2031 | ||
| 1861 | cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx", | 2032 | cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx", |
| 1862 | socket->sk->sk_sndbuf, | 2033 | socket->sk->sk_sndbuf, |
| 1863 | socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo)); | 2034 | socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo); |
| 1864 | 2035 | ||
| 1865 | /* send RFC1001 sessinit */ | 2036 | /* send RFC1001 sessinit */ |
| 1866 | if (server->addr.sockAddr.sin_port == htons(RFC1001_PORT)) { | 2037 | if (server->addr.sockAddr.sin_port == htons(RFC1001_PORT)) { |
| @@ -1938,13 +2109,13 @@ ipv6_connect(struct TCP_Server_Info *server) | |||
| 1938 | rc = sock_create_kern(PF_INET6, SOCK_STREAM, | 2109 | rc = sock_create_kern(PF_INET6, SOCK_STREAM, |
| 1939 | IPPROTO_TCP, &socket); | 2110 | IPPROTO_TCP, &socket); |
| 1940 | if (rc < 0) { | 2111 | if (rc < 0) { |
| 1941 | cERROR(1, ("Error %d creating ipv6 socket", rc)); | 2112 | cERROR(1, "Error %d creating ipv6 socket", rc); |
| 1942 | socket = NULL; | 2113 | socket = NULL; |
| 1943 | return rc; | 2114 | return rc; |
| 1944 | } | 2115 | } |
| 1945 | 2116 | ||
| 1946 | /* BB other socket options to set KEEPALIVE, NODELAY? */ | 2117 | /* BB other socket options to set KEEPALIVE, NODELAY? */ |
| 1947 | cFYI(1, ("ipv6 Socket created")); | 2118 | cFYI(1, "ipv6 Socket created"); |
| 1948 | server->ssocket = socket; | 2119 | server->ssocket = socket; |
| 1949 | socket->sk->sk_allocation = GFP_NOFS; | 2120 | socket->sk->sk_allocation = GFP_NOFS; |
| 1950 | cifs_reclassify_socket6(socket); | 2121 | cifs_reclassify_socket6(socket); |
| @@ -1988,7 +2159,7 @@ ipv6_connect(struct TCP_Server_Info *server) | |||
| 1988 | if (!connected) { | 2159 | if (!connected) { |
| 1989 | if (orig_port) | 2160 | if (orig_port) |
| 1990 | server->addr.sockAddr6.sin6_port = orig_port; | 2161 | server->addr.sockAddr6.sin6_port = orig_port; |
| 1991 | cFYI(1, ("Error %d connecting to server via ipv6", rc)); | 2162 | cFYI(1, "Error %d connecting to server via ipv6", rc); |
| 1992 | sock_release(socket); | 2163 | sock_release(socket); |
| 1993 | server->ssocket = NULL; | 2164 | server->ssocket = NULL; |
| 1994 | return rc; | 2165 | return rc; |
| @@ -2007,7 +2178,7 @@ ipv6_connect(struct TCP_Server_Info *server) | |||
| 2007 | rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY, | 2178 | rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY, |
| 2008 | (char *)&val, sizeof(val)); | 2179 | (char *)&val, sizeof(val)); |
| 2009 | if (rc) | 2180 | if (rc) |
| 2010 | cFYI(1, ("set TCP_NODELAY socket option error %d", rc)); | 2181 | cFYI(1, "set TCP_NODELAY socket option error %d", rc); |
| 2011 | } | 2182 | } |
| 2012 | 2183 | ||
| 2013 | server->ssocket = socket; | 2184 | server->ssocket = socket; |
| @@ -2032,13 +2203,13 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
| 2032 | if (vol_info && vol_info->no_linux_ext) { | 2203 | if (vol_info && vol_info->no_linux_ext) { |
| 2033 | tcon->fsUnixInfo.Capability = 0; | 2204 | tcon->fsUnixInfo.Capability = 0; |
| 2034 | tcon->unix_ext = 0; /* Unix Extensions disabled */ | 2205 | tcon->unix_ext = 0; /* Unix Extensions disabled */ |
| 2035 | cFYI(1, ("Linux protocol extensions disabled")); | 2206 | cFYI(1, "Linux protocol extensions disabled"); |
| 2036 | return; | 2207 | return; |
| 2037 | } else if (vol_info) | 2208 | } else if (vol_info) |
| 2038 | tcon->unix_ext = 1; /* Unix Extensions supported */ | 2209 | tcon->unix_ext = 1; /* Unix Extensions supported */ |
| 2039 | 2210 | ||
| 2040 | if (tcon->unix_ext == 0) { | 2211 | if (tcon->unix_ext == 0) { |
| 2041 | cFYI(1, ("Unix extensions disabled so not set on reconnect")); | 2212 | cFYI(1, "Unix extensions disabled so not set on reconnect"); |
| 2042 | return; | 2213 | return; |
| 2043 | } | 2214 | } |
| 2044 | 2215 | ||
| @@ -2054,12 +2225,11 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
| 2054 | cap &= ~CIFS_UNIX_POSIX_ACL_CAP; | 2225 | cap &= ~CIFS_UNIX_POSIX_ACL_CAP; |
| 2055 | if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) { | 2226 | if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) { |
| 2056 | if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) | 2227 | if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) |
| 2057 | cERROR(1, ("POSIXPATH support change")); | 2228 | cERROR(1, "POSIXPATH support change"); |
| 2058 | cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; | 2229 | cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; |
| 2059 | } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) { | 2230 | } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) { |
| 2060 | cERROR(1, ("possible reconnect error")); | 2231 | cERROR(1, "possible reconnect error"); |
| 2061 | cERROR(1, | 2232 | cERROR(1, "server disabled POSIX path support"); |
| 2062 | ("server disabled POSIX path support")); | ||
| 2063 | } | 2233 | } |
| 2064 | } | 2234 | } |
| 2065 | 2235 | ||
| @@ -2067,7 +2237,7 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
| 2067 | if (vol_info && vol_info->no_psx_acl) | 2237 | if (vol_info && vol_info->no_psx_acl) |
| 2068 | cap &= ~CIFS_UNIX_POSIX_ACL_CAP; | 2238 | cap &= ~CIFS_UNIX_POSIX_ACL_CAP; |
| 2069 | else if (CIFS_UNIX_POSIX_ACL_CAP & cap) { | 2239 | else if (CIFS_UNIX_POSIX_ACL_CAP & cap) { |
| 2070 | cFYI(1, ("negotiated posix acl support")); | 2240 | cFYI(1, "negotiated posix acl support"); |
| 2071 | if (sb) | 2241 | if (sb) |
| 2072 | sb->s_flags |= MS_POSIXACL; | 2242 | sb->s_flags |= MS_POSIXACL; |
| 2073 | } | 2243 | } |
| @@ -2075,7 +2245,7 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
| 2075 | if (vol_info && vol_info->posix_paths == 0) | 2245 | if (vol_info && vol_info->posix_paths == 0) |
| 2076 | cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; | 2246 | cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; |
| 2077 | else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) { | 2247 | else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) { |
| 2078 | cFYI(1, ("negotiate posix pathnames")); | 2248 | cFYI(1, "negotiate posix pathnames"); |
| 2079 | if (sb) | 2249 | if (sb) |
| 2080 | CIFS_SB(sb)->mnt_cifs_flags |= | 2250 | CIFS_SB(sb)->mnt_cifs_flags |= |
| 2081 | CIFS_MOUNT_POSIX_PATHS; | 2251 | CIFS_MOUNT_POSIX_PATHS; |
| @@ -2090,39 +2260,38 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
| 2090 | if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) { | 2260 | if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) { |
| 2091 | if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) { | 2261 | if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) { |
| 2092 | CIFS_SB(sb)->rsize = 127 * 1024; | 2262 | CIFS_SB(sb)->rsize = 127 * 1024; |
| 2093 | cFYI(DBG2, | 2263 | cFYI(DBG2, "larger reads not supported by srv"); |
| 2094 | ("larger reads not supported by srv")); | ||
| 2095 | } | 2264 | } |
| 2096 | } | 2265 | } |
| 2097 | 2266 | ||
| 2098 | 2267 | ||
| 2099 | cFYI(1, ("Negotiate caps 0x%x", (int)cap)); | 2268 | cFYI(1, "Negotiate caps 0x%x", (int)cap); |
| 2100 | #ifdef CONFIG_CIFS_DEBUG2 | 2269 | #ifdef CONFIG_CIFS_DEBUG2 |
| 2101 | if (cap & CIFS_UNIX_FCNTL_CAP) | 2270 | if (cap & CIFS_UNIX_FCNTL_CAP) |
| 2102 | cFYI(1, ("FCNTL cap")); | 2271 | cFYI(1, "FCNTL cap"); |
| 2103 | if (cap & CIFS_UNIX_EXTATTR_CAP) | 2272 | if (cap & CIFS_UNIX_EXTATTR_CAP) |
| 2104 | cFYI(1, ("EXTATTR cap")); | 2273 | cFYI(1, "EXTATTR cap"); |
| 2105 | if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) | 2274 | if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) |
| 2106 | cFYI(1, ("POSIX path cap")); | 2275 | cFYI(1, "POSIX path cap"); |
| 2107 | if (cap & CIFS_UNIX_XATTR_CAP) | 2276 | if (cap & CIFS_UNIX_XATTR_CAP) |
| 2108 | cFYI(1, ("XATTR cap")); | 2277 | cFYI(1, "XATTR cap"); |
| 2109 | if (cap & CIFS_UNIX_POSIX_ACL_CAP) | 2278 | if (cap & CIFS_UNIX_POSIX_ACL_CAP) |
| 2110 | cFYI(1, ("POSIX ACL cap")); | 2279 | cFYI(1, "POSIX ACL cap"); |
| 2111 | if (cap & CIFS_UNIX_LARGE_READ_CAP) | 2280 | if (cap & CIFS_UNIX_LARGE_READ_CAP) |
| 2112 | cFYI(1, ("very large read cap")); | 2281 | cFYI(1, "very large read cap"); |
| 2113 | if (cap & CIFS_UNIX_LARGE_WRITE_CAP) | 2282 | if (cap & CIFS_UNIX_LARGE_WRITE_CAP) |
| 2114 | cFYI(1, ("very large write cap")); | 2283 | cFYI(1, "very large write cap"); |
| 2115 | #endif /* CIFS_DEBUG2 */ | 2284 | #endif /* CIFS_DEBUG2 */ |
| 2116 | if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) { | 2285 | if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) { |
| 2117 | if (vol_info == NULL) { | 2286 | if (vol_info == NULL) { |
| 2118 | cFYI(1, ("resetting capabilities failed")); | 2287 | cFYI(1, "resetting capabilities failed"); |
| 2119 | } else | 2288 | } else |
| 2120 | cERROR(1, ("Negotiating Unix capabilities " | 2289 | cERROR(1, "Negotiating Unix capabilities " |
| 2121 | "with the server failed. Consider " | 2290 | "with the server failed. Consider " |
| 2122 | "mounting with the Unix Extensions\n" | 2291 | "mounting with the Unix Extensions\n" |
| 2123 | "disabled, if problems are found, " | 2292 | "disabled, if problems are found, " |
| 2124 | "by specifying the nounix mount " | 2293 | "by specifying the nounix mount " |
| 2125 | "option.")); | 2294 | "option."); |
| 2126 | 2295 | ||
| 2127 | } | 2296 | } |
| 2128 | } | 2297 | } |
| @@ -2152,8 +2321,8 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info, | |||
| 2152 | struct cifs_sb_info *cifs_sb) | 2321 | struct cifs_sb_info *cifs_sb) |
| 2153 | { | 2322 | { |
| 2154 | if (pvolume_info->rsize > CIFSMaxBufSize) { | 2323 | if (pvolume_info->rsize > CIFSMaxBufSize) { |
| 2155 | cERROR(1, ("rsize %d too large, using MaxBufSize", | 2324 | cERROR(1, "rsize %d too large, using MaxBufSize", |
| 2156 | pvolume_info->rsize)); | 2325 | pvolume_info->rsize); |
| 2157 | cifs_sb->rsize = CIFSMaxBufSize; | 2326 | cifs_sb->rsize = CIFSMaxBufSize; |
| 2158 | } else if ((pvolume_info->rsize) && | 2327 | } else if ((pvolume_info->rsize) && |
| 2159 | (pvolume_info->rsize <= CIFSMaxBufSize)) | 2328 | (pvolume_info->rsize <= CIFSMaxBufSize)) |
| @@ -2162,8 +2331,8 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info, | |||
| 2162 | cifs_sb->rsize = CIFSMaxBufSize; | 2331 | cifs_sb->rsize = CIFSMaxBufSize; |
| 2163 | 2332 | ||
| 2164 | if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) { | 2333 | if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) { |
| 2165 | cERROR(1, ("wsize %d too large, using 4096 instead", | 2334 | cERROR(1, "wsize %d too large, using 4096 instead", |
| 2166 | pvolume_info->wsize)); | 2335 | pvolume_info->wsize); |
| 2167 | cifs_sb->wsize = 4096; | 2336 | cifs_sb->wsize = 4096; |
| 2168 | } else if (pvolume_info->wsize) | 2337 | } else if (pvolume_info->wsize) |
| 2169 | cifs_sb->wsize = pvolume_info->wsize; | 2338 | cifs_sb->wsize = pvolume_info->wsize; |
| @@ -2181,7 +2350,7 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info, | |||
| 2181 | if (cifs_sb->rsize < 2048) { | 2350 | if (cifs_sb->rsize < 2048) { |
| 2182 | cifs_sb->rsize = 2048; | 2351 | cifs_sb->rsize = 2048; |
| 2183 | /* Windows ME may prefer this */ | 2352 | /* Windows ME may prefer this */ |
| 2184 | cFYI(1, ("readsize set to minimum: 2048")); | 2353 | cFYI(1, "readsize set to minimum: 2048"); |
| 2185 | } | 2354 | } |
| 2186 | /* calculate prepath */ | 2355 | /* calculate prepath */ |
| 2187 | cifs_sb->prepath = pvolume_info->prepath; | 2356 | cifs_sb->prepath = pvolume_info->prepath; |
| @@ -2199,8 +2368,8 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info, | |||
| 2199 | cifs_sb->mnt_gid = pvolume_info->linux_gid; | 2368 | cifs_sb->mnt_gid = pvolume_info->linux_gid; |
| 2200 | cifs_sb->mnt_file_mode = pvolume_info->file_mode; | 2369 | cifs_sb->mnt_file_mode = pvolume_info->file_mode; |
| 2201 | cifs_sb->mnt_dir_mode = pvolume_info->dir_mode; | 2370 | cifs_sb->mnt_dir_mode = pvolume_info->dir_mode; |
| 2202 | cFYI(1, ("file mode: 0x%x dir mode: 0x%x", | 2371 | cFYI(1, "file mode: 0x%x dir mode: 0x%x", |
| 2203 | cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode)); | 2372 | cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode); |
| 2204 | 2373 | ||
| 2205 | if (pvolume_info->noperm) | 2374 | if (pvolume_info->noperm) |
| 2206 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM; | 2375 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM; |
| @@ -2229,13 +2398,13 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info, | |||
| 2229 | if (pvolume_info->dynperm) | 2398 | if (pvolume_info->dynperm) |
| 2230 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM; | 2399 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM; |
| 2231 | if (pvolume_info->direct_io) { | 2400 | if (pvolume_info->direct_io) { |
| 2232 | cFYI(1, ("mounting share using direct i/o")); | 2401 | cFYI(1, "mounting share using direct i/o"); |
| 2233 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; | 2402 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; |
| 2234 | } | 2403 | } |
| 2235 | 2404 | ||
| 2236 | if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm)) | 2405 | if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm)) |
| 2237 | cERROR(1, ("mount option dynperm ignored if cifsacl " | 2406 | cERROR(1, "mount option dynperm ignored if cifsacl " |
| 2238 | "mount option supported")); | 2407 | "mount option supported"); |
| 2239 | } | 2408 | } |
| 2240 | 2409 | ||
| 2241 | static int | 2410 | static int |
| @@ -2262,7 +2431,7 @@ cleanup_volume_info(struct smb_vol **pvolume_info) | |||
| 2262 | { | 2431 | { |
| 2263 | struct smb_vol *volume_info; | 2432 | struct smb_vol *volume_info; |
| 2264 | 2433 | ||
| 2265 | if (!pvolume_info && !*pvolume_info) | 2434 | if (!pvolume_info || !*pvolume_info) |
| 2266 | return; | 2435 | return; |
| 2267 | 2436 | ||
| 2268 | volume_info = *pvolume_info; | 2437 | volume_info = *pvolume_info; |
| @@ -2344,11 +2513,11 @@ try_mount_again: | |||
| 2344 | } | 2513 | } |
| 2345 | 2514 | ||
| 2346 | if (volume_info->nullauth) { | 2515 | if (volume_info->nullauth) { |
| 2347 | cFYI(1, ("null user")); | 2516 | cFYI(1, "null user"); |
| 2348 | volume_info->username = ""; | 2517 | volume_info->username = ""; |
| 2349 | } else if (volume_info->username) { | 2518 | } else if (volume_info->username) { |
| 2350 | /* BB fixme parse for domain name here */ | 2519 | /* BB fixme parse for domain name here */ |
| 2351 | cFYI(1, ("Username: %s", volume_info->username)); | 2520 | cFYI(1, "Username: %s", volume_info->username); |
| 2352 | } else { | 2521 | } else { |
| 2353 | cifserror("No username specified"); | 2522 | cifserror("No username specified"); |
| 2354 | /* In userspace mount helper we can get user name from alternate | 2523 | /* In userspace mount helper we can get user name from alternate |
| @@ -2357,20 +2526,20 @@ try_mount_again: | |||
| 2357 | goto out; | 2526 | goto out; |
| 2358 | } | 2527 | } |
| 2359 | 2528 | ||
| 2360 | |||
| 2361 | /* this is needed for ASCII cp to Unicode converts */ | 2529 | /* this is needed for ASCII cp to Unicode converts */ |
| 2362 | if (volume_info->iocharset == NULL) { | 2530 | if (volume_info->iocharset == NULL) { |
| 2363 | cifs_sb->local_nls = load_nls_default(); | 2531 | /* load_nls_default cannot return null */ |
| 2364 | /* load_nls_default can not return null */ | 2532 | volume_info->local_nls = load_nls_default(); |
| 2365 | } else { | 2533 | } else { |
| 2366 | cifs_sb->local_nls = load_nls(volume_info->iocharset); | 2534 | volume_info->local_nls = load_nls(volume_info->iocharset); |
| 2367 | if (cifs_sb->local_nls == NULL) { | 2535 | if (volume_info->local_nls == NULL) { |
| 2368 | cERROR(1, ("CIFS mount error: iocharset %s not found", | 2536 | cERROR(1, "CIFS mount error: iocharset %s not found", |
| 2369 | volume_info->iocharset)); | 2537 | volume_info->iocharset); |
| 2370 | rc = -ELIBACC; | 2538 | rc = -ELIBACC; |
| 2371 | goto out; | 2539 | goto out; |
| 2372 | } | 2540 | } |
| 2373 | } | 2541 | } |
| 2542 | cifs_sb->local_nls = volume_info->local_nls; | ||
| 2374 | 2543 | ||
| 2375 | /* get a reference to a tcp session */ | 2544 | /* get a reference to a tcp session */ |
| 2376 | srvTcp = cifs_get_tcp_session(volume_info); | 2545 | srvTcp = cifs_get_tcp_session(volume_info); |
| @@ -2379,148 +2548,30 @@ try_mount_again: | |||
| 2379 | goto out; | 2548 | goto out; |
| 2380 | } | 2549 | } |
| 2381 | 2550 | ||
| 2382 | pSesInfo = cifs_find_smb_ses(srvTcp, volume_info->username); | 2551 | /* get a reference to a SMB session */ |
| 2383 | if (pSesInfo) { | 2552 | pSesInfo = cifs_get_smb_ses(srvTcp, volume_info); |
| 2384 | cFYI(1, ("Existing smb sess found (status=%d)", | 2553 | if (IS_ERR(pSesInfo)) { |
| 2385 | pSesInfo->status)); | 2554 | rc = PTR_ERR(pSesInfo); |
| 2386 | /* | 2555 | pSesInfo = NULL; |
| 2387 | * The existing SMB session already has a reference to srvTcp, | 2556 | goto mount_fail_check; |
| 2388 | * so we can put back the extra one we got before | ||
| 2389 | */ | ||
| 2390 | cifs_put_tcp_session(srvTcp); | ||
| 2391 | |||
| 2392 | mutex_lock(&pSesInfo->session_mutex); | ||
| 2393 | if (pSesInfo->need_reconnect) { | ||
| 2394 | cFYI(1, ("Session needs reconnect")); | ||
| 2395 | rc = cifs_setup_session(xid, pSesInfo, | ||
| 2396 | cifs_sb->local_nls); | ||
| 2397 | } | ||
| 2398 | mutex_unlock(&pSesInfo->session_mutex); | ||
| 2399 | } else if (!rc) { | ||
| 2400 | cFYI(1, ("Existing smb sess not found")); | ||
| 2401 | pSesInfo = sesInfoAlloc(); | ||
| 2402 | if (pSesInfo == NULL) { | ||
| 2403 | rc = -ENOMEM; | ||
| 2404 | goto mount_fail_check; | ||
| 2405 | } | ||
| 2406 | |||
| 2407 | /* new SMB session uses our srvTcp ref */ | ||
| 2408 | pSesInfo->server = srvTcp; | ||
| 2409 | if (srvTcp->addr.sockAddr6.sin6_family == AF_INET6) | ||
| 2410 | sprintf(pSesInfo->serverName, "%pI6", | ||
| 2411 | &srvTcp->addr.sockAddr6.sin6_addr); | ||
| 2412 | else | ||
| 2413 | sprintf(pSesInfo->serverName, "%pI4", | ||
| 2414 | &srvTcp->addr.sockAddr.sin_addr.s_addr); | ||
| 2415 | |||
| 2416 | write_lock(&cifs_tcp_ses_lock); | ||
| 2417 | list_add(&pSesInfo->smb_ses_list, &srvTcp->smb_ses_list); | ||
| 2418 | write_unlock(&cifs_tcp_ses_lock); | ||
| 2419 | |||
| 2420 | /* volume_info->password freed at unmount */ | ||
| 2421 | if (volume_info->password) { | ||
| 2422 | pSesInfo->password = kstrdup(volume_info->password, | ||
| 2423 | GFP_KERNEL); | ||
| 2424 | if (!pSesInfo->password) { | ||
| 2425 | rc = -ENOMEM; | ||
| 2426 | goto mount_fail_check; | ||
| 2427 | } | ||
| 2428 | } | ||
| 2429 | if (volume_info->username) | ||
| 2430 | strncpy(pSesInfo->userName, volume_info->username, | ||
| 2431 | MAX_USERNAME_SIZE); | ||
| 2432 | if (volume_info->domainname) { | ||
| 2433 | int len = strlen(volume_info->domainname); | ||
| 2434 | pSesInfo->domainName = kmalloc(len + 1, GFP_KERNEL); | ||
| 2435 | if (pSesInfo->domainName) | ||
| 2436 | strcpy(pSesInfo->domainName, | ||
| 2437 | volume_info->domainname); | ||
| 2438 | } | ||
| 2439 | pSesInfo->linux_uid = volume_info->linux_uid; | ||
| 2440 | pSesInfo->overrideSecFlg = volume_info->secFlg; | ||
| 2441 | mutex_lock(&pSesInfo->session_mutex); | ||
| 2442 | |||
| 2443 | /* BB FIXME need to pass vol->secFlgs BB */ | ||
| 2444 | rc = cifs_setup_session(xid, pSesInfo, | ||
| 2445 | cifs_sb->local_nls); | ||
| 2446 | mutex_unlock(&pSesInfo->session_mutex); | ||
| 2447 | } | 2557 | } |
| 2448 | 2558 | ||
| 2449 | /* search for existing tcon to this server share */ | 2559 | setup_cifs_sb(volume_info, cifs_sb); |
| 2450 | if (!rc) { | 2560 | if (pSesInfo->capabilities & CAP_LARGE_FILES) |
| 2451 | setup_cifs_sb(volume_info, cifs_sb); | 2561 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 2452 | 2562 | else | |
| 2453 | tcon = cifs_find_tcon(pSesInfo, volume_info->UNC); | 2563 | sb->s_maxbytes = MAX_NON_LFS; |
| 2454 | if (tcon) { | ||
| 2455 | cFYI(1, ("Found match on UNC path")); | ||
| 2456 | /* existing tcon already has a reference */ | ||
| 2457 | cifs_put_smb_ses(pSesInfo); | ||
| 2458 | if (tcon->seal != volume_info->seal) | ||
| 2459 | cERROR(1, ("transport encryption setting " | ||
| 2460 | "conflicts with existing tid")); | ||
| 2461 | } else { | ||
| 2462 | tcon = tconInfoAlloc(); | ||
| 2463 | if (tcon == NULL) { | ||
| 2464 | rc = -ENOMEM; | ||
| 2465 | goto mount_fail_check; | ||
| 2466 | } | ||
| 2467 | |||
| 2468 | tcon->ses = pSesInfo; | ||
| 2469 | if (volume_info->password) { | ||
| 2470 | tcon->password = kstrdup(volume_info->password, | ||
| 2471 | GFP_KERNEL); | ||
| 2472 | if (!tcon->password) { | ||
| 2473 | rc = -ENOMEM; | ||
| 2474 | goto mount_fail_check; | ||
| 2475 | } | ||
| 2476 | } | ||
| 2477 | |||
| 2478 | if ((strchr(volume_info->UNC + 3, '\\') == NULL) | ||
| 2479 | && (strchr(volume_info->UNC + 3, '/') == NULL)) { | ||
| 2480 | cERROR(1, ("Missing share name")); | ||
| 2481 | rc = -ENODEV; | ||
| 2482 | goto mount_fail_check; | ||
| 2483 | } else { | ||
| 2484 | /* BB Do we need to wrap sesSem around | ||
| 2485 | * this TCon call and Unix SetFS as | ||
| 2486 | * we do on SessSetup and reconnect? */ | ||
| 2487 | rc = CIFSTCon(xid, pSesInfo, volume_info->UNC, | ||
| 2488 | tcon, cifs_sb->local_nls); | ||
| 2489 | cFYI(1, ("CIFS Tcon rc = %d", rc)); | ||
| 2490 | if (volume_info->nodfs) { | ||
| 2491 | tcon->Flags &= ~SMB_SHARE_IS_IN_DFS; | ||
| 2492 | cFYI(1, ("DFS disabled (%d)", | ||
| 2493 | tcon->Flags)); | ||
| 2494 | } | ||
| 2495 | } | ||
| 2496 | if (rc) | ||
| 2497 | goto remote_path_check; | ||
| 2498 | tcon->seal = volume_info->seal; | ||
| 2499 | write_lock(&cifs_tcp_ses_lock); | ||
| 2500 | list_add(&tcon->tcon_list, &pSesInfo->tcon_list); | ||
| 2501 | write_unlock(&cifs_tcp_ses_lock); | ||
| 2502 | } | ||
| 2503 | |||
| 2504 | /* we can have only one retry value for a connection | ||
| 2505 | to a share so for resources mounted more than once | ||
| 2506 | to the same server share the last value passed in | ||
| 2507 | for the retry flag is used */ | ||
| 2508 | tcon->retry = volume_info->retry; | ||
| 2509 | tcon->nocase = volume_info->nocase; | ||
| 2510 | tcon->local_lease = volume_info->local_lease; | ||
| 2511 | } | ||
| 2512 | if (pSesInfo) { | ||
| 2513 | if (pSesInfo->capabilities & CAP_LARGE_FILES) | ||
| 2514 | sb->s_maxbytes = MAX_LFS_FILESIZE; | ||
| 2515 | else | ||
| 2516 | sb->s_maxbytes = MAX_NON_LFS; | ||
| 2517 | } | ||
| 2518 | 2564 | ||
| 2519 | /* BB FIXME fix time_gran to be larger for LANMAN sessions */ | 2565 | /* BB FIXME fix time_gran to be larger for LANMAN sessions */ |
| 2520 | sb->s_time_gran = 100; | 2566 | sb->s_time_gran = 100; |
| 2521 | 2567 | ||
| 2522 | if (rc) | 2568 | /* search for existing tcon to this server share */ |
| 2569 | tcon = cifs_get_tcon(pSesInfo, volume_info); | ||
| 2570 | if (IS_ERR(tcon)) { | ||
| 2571 | rc = PTR_ERR(tcon); | ||
| 2572 | tcon = NULL; | ||
| 2523 | goto remote_path_check; | 2573 | goto remote_path_check; |
| 2574 | } | ||
| 2524 | 2575 | ||
| 2525 | cifs_sb->tcon = tcon; | 2576 | cifs_sb->tcon = tcon; |
| 2526 | 2577 | ||
| @@ -2544,7 +2595,7 @@ try_mount_again: | |||
| 2544 | 2595 | ||
| 2545 | if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) { | 2596 | if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) { |
| 2546 | cifs_sb->rsize = 1024 * 127; | 2597 | cifs_sb->rsize = 1024 * 127; |
| 2547 | cFYI(DBG2, ("no very large read support, rsize now 127K")); | 2598 | cFYI(DBG2, "no very large read support, rsize now 127K"); |
| 2548 | } | 2599 | } |
| 2549 | if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) | 2600 | if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) |
| 2550 | cifs_sb->wsize = min(cifs_sb->wsize, | 2601 | cifs_sb->wsize = min(cifs_sb->wsize, |
| @@ -2593,7 +2644,7 @@ remote_path_check: | |||
| 2593 | goto mount_fail_check; | 2644 | goto mount_fail_check; |
| 2594 | } | 2645 | } |
| 2595 | 2646 | ||
| 2596 | cFYI(1, ("Getting referral for: %s", full_path)); | 2647 | cFYI(1, "Getting referral for: %s", full_path); |
| 2597 | rc = get_dfs_path(xid, pSesInfo , full_path + 1, | 2648 | rc = get_dfs_path(xid, pSesInfo , full_path + 1, |
| 2598 | cifs_sb->local_nls, &num_referrals, &referrals, | 2649 | cifs_sb->local_nls, &num_referrals, &referrals, |
| 2599 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 2650 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| @@ -2707,7 +2758,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
| 2707 | by Samba (not sure whether other servers allow | 2758 | by Samba (not sure whether other servers allow |
| 2708 | NTLMv2 password here) */ | 2759 | NTLMv2 password here) */ |
| 2709 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | 2760 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
| 2710 | if ((extended_security & CIFSSEC_MAY_LANMAN) && | 2761 | if ((global_secflags & CIFSSEC_MAY_LANMAN) && |
| 2711 | (ses->server->secType == LANMAN)) | 2762 | (ses->server->secType == LANMAN)) |
| 2712 | calc_lanman_hash(tcon->password, ses->server->cryptKey, | 2763 | calc_lanman_hash(tcon->password, ses->server->cryptKey, |
| 2713 | ses->server->secMode & | 2764 | ses->server->secMode & |
| @@ -2778,13 +2829,13 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
| 2778 | if (length == 3) { | 2829 | if (length == 3) { |
| 2779 | if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') && | 2830 | if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') && |
| 2780 | (bcc_ptr[2] == 'C')) { | 2831 | (bcc_ptr[2] == 'C')) { |
| 2781 | cFYI(1, ("IPC connection")); | 2832 | cFYI(1, "IPC connection"); |
| 2782 | tcon->ipc = 1; | 2833 | tcon->ipc = 1; |
| 2783 | } | 2834 | } |
| 2784 | } else if (length == 2) { | 2835 | } else if (length == 2) { |
| 2785 | if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) { | 2836 | if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) { |
| 2786 | /* the most common case */ | 2837 | /* the most common case */ |
| 2787 | cFYI(1, ("disk share connection")); | 2838 | cFYI(1, "disk share connection"); |
| 2788 | } | 2839 | } |
| 2789 | } | 2840 | } |
| 2790 | bcc_ptr += length + 1; | 2841 | bcc_ptr += length + 1; |
| @@ -2797,7 +2848,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
| 2797 | bytes_left, is_unicode, | 2848 | bytes_left, is_unicode, |
| 2798 | nls_codepage); | 2849 | nls_codepage); |
| 2799 | 2850 | ||
| 2800 | cFYI(1, ("nativeFileSystem=%s", tcon->nativeFileSystem)); | 2851 | cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem); |
| 2801 | 2852 | ||
| 2802 | if ((smb_buffer_response->WordCount == 3) || | 2853 | if ((smb_buffer_response->WordCount == 3) || |
| 2803 | (smb_buffer_response->WordCount == 7)) | 2854 | (smb_buffer_response->WordCount == 7)) |
| @@ -2805,7 +2856,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
| 2805 | tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport); | 2856 | tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport); |
| 2806 | else | 2857 | else |
| 2807 | tcon->Flags = 0; | 2858 | tcon->Flags = 0; |
| 2808 | cFYI(1, ("Tcon flags: 0x%x ", tcon->Flags)); | 2859 | cFYI(1, "Tcon flags: 0x%x ", tcon->Flags); |
| 2809 | } else if ((rc == 0) && tcon == NULL) { | 2860 | } else if ((rc == 0) && tcon == NULL) { |
| 2810 | /* all we need to save for IPC$ connection */ | 2861 | /* all we need to save for IPC$ connection */ |
| 2811 | ses->ipc_tid = smb_buffer_response->Tid; | 2862 | ses->ipc_tid = smb_buffer_response->Tid; |
| @@ -2833,57 +2884,61 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) | |||
| 2833 | return rc; | 2884 | return rc; |
| 2834 | } | 2885 | } |
| 2835 | 2886 | ||
| 2836 | int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, | 2887 | int cifs_negotiate_protocol(unsigned int xid, struct cifsSesInfo *ses) |
| 2837 | struct nls_table *nls_info) | ||
| 2838 | { | 2888 | { |
| 2839 | int rc = 0; | 2889 | int rc = 0; |
| 2840 | int first_time = 0; | 2890 | struct TCP_Server_Info *server = ses->server; |
| 2841 | struct TCP_Server_Info *server = pSesInfo->server; | 2891 | |
| 2842 | 2892 | /* only send once per connect */ | |
| 2843 | /* what if server changes its buffer size after dropping the session? */ | 2893 | if (server->maxBuf != 0) |
| 2844 | if (server->maxBuf == 0) /* no need to send on reconnect */ { | 2894 | return 0; |
| 2845 | rc = CIFSSMBNegotiate(xid, pSesInfo); | 2895 | |
| 2846 | if (rc == -EAGAIN) { | 2896 | rc = CIFSSMBNegotiate(xid, ses); |
| 2847 | /* retry only once on 1st time connection */ | 2897 | if (rc == -EAGAIN) { |
| 2848 | rc = CIFSSMBNegotiate(xid, pSesInfo); | 2898 | /* retry only once on 1st time connection */ |
| 2849 | if (rc == -EAGAIN) | 2899 | rc = CIFSSMBNegotiate(xid, ses); |
| 2850 | rc = -EHOSTDOWN; | 2900 | if (rc == -EAGAIN) |
| 2851 | } | 2901 | rc = -EHOSTDOWN; |
| 2852 | if (rc == 0) { | 2902 | } |
| 2853 | spin_lock(&GlobalMid_Lock); | 2903 | if (rc == 0) { |
| 2854 | if (server->tcpStatus != CifsExiting) | 2904 | spin_lock(&GlobalMid_Lock); |
| 2855 | server->tcpStatus = CifsGood; | 2905 | if (server->tcpStatus != CifsExiting) |
| 2856 | else | 2906 | server->tcpStatus = CifsGood; |
| 2857 | rc = -EHOSTDOWN; | 2907 | else |
| 2858 | spin_unlock(&GlobalMid_Lock); | 2908 | rc = -EHOSTDOWN; |
| 2909 | spin_unlock(&GlobalMid_Lock); | ||
| 2859 | 2910 | ||
| 2860 | } | ||
| 2861 | first_time = 1; | ||
| 2862 | } | 2911 | } |
| 2863 | 2912 | ||
| 2864 | if (rc) | 2913 | return rc; |
| 2865 | goto ss_err_exit; | 2914 | } |
| 2915 | |||
| 2916 | |||
| 2917 | int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses, | ||
| 2918 | struct nls_table *nls_info) | ||
| 2919 | { | ||
| 2920 | int rc = 0; | ||
| 2921 | struct TCP_Server_Info *server = ses->server; | ||
| 2866 | 2922 | ||
| 2867 | pSesInfo->flags = 0; | 2923 | ses->flags = 0; |
| 2868 | pSesInfo->capabilities = server->capabilities; | 2924 | ses->capabilities = server->capabilities; |
| 2869 | if (linuxExtEnabled == 0) | 2925 | if (linuxExtEnabled == 0) |
| 2870 | pSesInfo->capabilities &= (~CAP_UNIX); | 2926 | ses->capabilities &= (~CAP_UNIX); |
| 2871 | 2927 | ||
| 2872 | cFYI(1, ("Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d", | 2928 | cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d", |
| 2873 | server->secMode, server->capabilities, server->timeAdj)); | 2929 | server->secMode, server->capabilities, server->timeAdj); |
| 2874 | 2930 | ||
| 2875 | rc = CIFS_SessSetup(xid, pSesInfo, first_time, nls_info); | 2931 | rc = CIFS_SessSetup(xid, ses, nls_info); |
| 2876 | if (rc) { | 2932 | if (rc) { |
| 2877 | cERROR(1, ("Send error in SessSetup = %d", rc)); | 2933 | cERROR(1, "Send error in SessSetup = %d", rc); |
| 2878 | } else { | 2934 | } else { |
| 2879 | cFYI(1, ("CIFS Session Established successfully")); | 2935 | cFYI(1, "CIFS Session Established successfully"); |
| 2880 | spin_lock(&GlobalMid_Lock); | 2936 | spin_lock(&GlobalMid_Lock); |
| 2881 | pSesInfo->status = CifsGood; | 2937 | ses->status = CifsGood; |
| 2882 | pSesInfo->need_reconnect = false; | 2938 | ses->need_reconnect = false; |
| 2883 | spin_unlock(&GlobalMid_Lock); | 2939 | spin_unlock(&GlobalMid_Lock); |
| 2884 | } | 2940 | } |
| 2885 | 2941 | ||
| 2886 | ss_err_exit: | ||
| 2887 | return rc; | 2942 | return rc; |
| 2888 | } | 2943 | } |
| 2889 | 2944 | ||
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index e9f7ecc2714b..391816b461ca 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
| @@ -73,7 +73,7 @@ cifs_bp_rename_retry: | |||
| 73 | namelen += (1 + temp->d_name.len); | 73 | namelen += (1 + temp->d_name.len); |
| 74 | temp = temp->d_parent; | 74 | temp = temp->d_parent; |
| 75 | if (temp == NULL) { | 75 | if (temp == NULL) { |
| 76 | cERROR(1, ("corrupt dentry")); | 76 | cERROR(1, "corrupt dentry"); |
| 77 | return NULL; | 77 | return NULL; |
| 78 | } | 78 | } |
| 79 | } | 79 | } |
| @@ -90,19 +90,18 @@ cifs_bp_rename_retry: | |||
| 90 | full_path[namelen] = dirsep; | 90 | full_path[namelen] = dirsep; |
| 91 | strncpy(full_path + namelen + 1, temp->d_name.name, | 91 | strncpy(full_path + namelen + 1, temp->d_name.name, |
| 92 | temp->d_name.len); | 92 | temp->d_name.len); |
| 93 | cFYI(0, ("name: %s", full_path + namelen)); | 93 | cFYI(0, "name: %s", full_path + namelen); |
| 94 | } | 94 | } |
| 95 | temp = temp->d_parent; | 95 | temp = temp->d_parent; |
| 96 | if (temp == NULL) { | 96 | if (temp == NULL) { |
| 97 | cERROR(1, ("corrupt dentry")); | 97 | cERROR(1, "corrupt dentry"); |
| 98 | kfree(full_path); | 98 | kfree(full_path); |
| 99 | return NULL; | 99 | return NULL; |
| 100 | } | 100 | } |
| 101 | } | 101 | } |
| 102 | if (namelen != pplen + dfsplen) { | 102 | if (namelen != pplen + dfsplen) { |
| 103 | cERROR(1, | 103 | cERROR(1, "did not end path lookup where expected namelen is %d", |
| 104 | ("did not end path lookup where expected namelen is %d", | 104 | namelen); |
| 105 | namelen)); | ||
| 106 | /* presumably this is only possible if racing with a rename | 105 | /* presumably this is only possible if racing with a rename |
| 107 | of one of the parent directories (we can not lock the dentries | 106 | of one of the parent directories (we can not lock the dentries |
| 108 | above us to prevent this, but retrying should be harmless) */ | 107 | above us to prevent this, but retrying should be harmless) */ |
| @@ -130,6 +129,12 @@ cifs_bp_rename_retry: | |||
| 130 | return full_path; | 129 | return full_path; |
| 131 | } | 130 | } |
| 132 | 131 | ||
| 132 | /* | ||
| 133 | * When called with struct file pointer set to NULL, there is no way we could | ||
| 134 | * update file->private_data, but getting it stuck on openFileList provides a | ||
| 135 | * way to access it from cifs_fill_filedata and thereby set file->private_data | ||
| 136 | * from cifs_open. | ||
| 137 | */ | ||
| 133 | struct cifsFileInfo * | 138 | struct cifsFileInfo * |
| 134 | cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, | 139 | cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, |
| 135 | struct file *file, struct vfsmount *mnt, unsigned int oflags) | 140 | struct file *file, struct vfsmount *mnt, unsigned int oflags) |
| @@ -173,7 +178,7 @@ cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, | |||
| 173 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { | 178 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { |
| 174 | pCifsInode->clientCanCacheAll = true; | 179 | pCifsInode->clientCanCacheAll = true; |
| 175 | pCifsInode->clientCanCacheRead = true; | 180 | pCifsInode->clientCanCacheRead = true; |
| 176 | cFYI(1, ("Exclusive Oplock inode %p", newinode)); | 181 | cFYI(1, "Exclusive Oplock inode %p", newinode); |
| 177 | } else if ((oplock & 0xF) == OPLOCK_READ) | 182 | } else if ((oplock & 0xF) == OPLOCK_READ) |
| 178 | pCifsInode->clientCanCacheRead = true; | 183 | pCifsInode->clientCanCacheRead = true; |
| 179 | } | 184 | } |
| @@ -183,16 +188,17 @@ cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, | |||
| 183 | } | 188 | } |
| 184 | 189 | ||
| 185 | int cifs_posix_open(char *full_path, struct inode **pinode, | 190 | int cifs_posix_open(char *full_path, struct inode **pinode, |
| 186 | struct vfsmount *mnt, int mode, int oflags, | 191 | struct vfsmount *mnt, struct super_block *sb, |
| 187 | __u32 *poplock, __u16 *pnetfid, int xid) | 192 | int mode, int oflags, |
| 193 | __u32 *poplock, __u16 *pnetfid, int xid) | ||
| 188 | { | 194 | { |
| 189 | int rc; | 195 | int rc; |
| 190 | FILE_UNIX_BASIC_INFO *presp_data; | 196 | FILE_UNIX_BASIC_INFO *presp_data; |
| 191 | __u32 posix_flags = 0; | 197 | __u32 posix_flags = 0; |
| 192 | struct cifs_sb_info *cifs_sb = CIFS_SB(mnt->mnt_sb); | 198 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
| 193 | struct cifs_fattr fattr; | 199 | struct cifs_fattr fattr; |
| 194 | 200 | ||
| 195 | cFYI(1, ("posix open %s", full_path)); | 201 | cFYI(1, "posix open %s", full_path); |
| 196 | 202 | ||
| 197 | presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); | 203 | presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); |
| 198 | if (presp_data == NULL) | 204 | if (presp_data == NULL) |
| @@ -242,7 +248,8 @@ int cifs_posix_open(char *full_path, struct inode **pinode, | |||
| 242 | 248 | ||
| 243 | /* get new inode and set it up */ | 249 | /* get new inode and set it up */ |
| 244 | if (*pinode == NULL) { | 250 | if (*pinode == NULL) { |
| 245 | *pinode = cifs_iget(mnt->mnt_sb, &fattr); | 251 | cifs_fill_uniqueid(sb, &fattr); |
| 252 | *pinode = cifs_iget(sb, &fattr); | ||
| 246 | if (!*pinode) { | 253 | if (!*pinode) { |
| 247 | rc = -ENOMEM; | 254 | rc = -ENOMEM; |
| 248 | goto posix_open_ret; | 255 | goto posix_open_ret; |
| @@ -251,7 +258,18 @@ int cifs_posix_open(char *full_path, struct inode **pinode, | |||
| 251 | cifs_fattr_to_inode(*pinode, &fattr); | 258 | cifs_fattr_to_inode(*pinode, &fattr); |
| 252 | } | 259 | } |
| 253 | 260 | ||
| 254 | cifs_new_fileinfo(*pinode, *pnetfid, NULL, mnt, oflags); | 261 | /* |
| 262 | * cifs_fill_filedata() takes care of setting cifsFileInfo pointer to | ||
| 263 | * file->private_data. | ||
| 264 | */ | ||
| 265 | if (mnt) { | ||
| 266 | struct cifsFileInfo *pfile_info; | ||
| 267 | |||
| 268 | pfile_info = cifs_new_fileinfo(*pinode, *pnetfid, NULL, mnt, | ||
| 269 | oflags); | ||
| 270 | if (pfile_info == NULL) | ||
| 271 | rc = -ENOMEM; | ||
| 272 | } | ||
| 255 | 273 | ||
| 256 | posix_open_ret: | 274 | posix_open_ret: |
| 257 | kfree(presp_data); | 275 | kfree(presp_data); |
| @@ -315,13 +333,14 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
| 315 | if (nd && (nd->flags & LOOKUP_OPEN)) | 333 | if (nd && (nd->flags & LOOKUP_OPEN)) |
| 316 | oflags = nd->intent.open.flags; | 334 | oflags = nd->intent.open.flags; |
| 317 | else | 335 | else |
| 318 | oflags = FMODE_READ; | 336 | oflags = FMODE_READ | SMB_O_CREAT; |
| 319 | 337 | ||
| 320 | if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) && | 338 | if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) && |
| 321 | (CIFS_UNIX_POSIX_PATH_OPS_CAP & | 339 | (CIFS_UNIX_POSIX_PATH_OPS_CAP & |
| 322 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { | 340 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { |
| 323 | rc = cifs_posix_open(full_path, &newinode, nd->path.mnt, | 341 | rc = cifs_posix_open(full_path, &newinode, |
| 324 | mode, oflags, &oplock, &fileHandle, xid); | 342 | nd ? nd->path.mnt : NULL, |
| 343 | inode->i_sb, mode, oflags, &oplock, &fileHandle, xid); | ||
| 325 | /* EIO could indicate that (posix open) operation is not | 344 | /* EIO could indicate that (posix open) operation is not |
| 326 | supported, despite what server claimed in capability | 345 | supported, despite what server claimed in capability |
| 327 | negotation. EREMOTE indicates DFS junction, which is not | 346 | negotation. EREMOTE indicates DFS junction, which is not |
| @@ -358,7 +377,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
| 358 | else if ((oflags & O_CREAT) == O_CREAT) | 377 | else if ((oflags & O_CREAT) == O_CREAT) |
| 359 | disposition = FILE_OPEN_IF; | 378 | disposition = FILE_OPEN_IF; |
| 360 | else | 379 | else |
| 361 | cFYI(1, ("Create flag not set in create function")); | 380 | cFYI(1, "Create flag not set in create function"); |
| 362 | } | 381 | } |
| 363 | 382 | ||
| 364 | /* BB add processing to set equivalent of mode - e.g. via CreateX with | 383 | /* BB add processing to set equivalent of mode - e.g. via CreateX with |
| @@ -394,7 +413,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
| 394 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 413 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 395 | } | 414 | } |
| 396 | if (rc) { | 415 | if (rc) { |
| 397 | cFYI(1, ("cifs_create returned 0x%x", rc)); | 416 | cFYI(1, "cifs_create returned 0x%x", rc); |
| 398 | goto cifs_create_out; | 417 | goto cifs_create_out; |
| 399 | } | 418 | } |
| 400 | 419 | ||
| @@ -457,15 +476,22 @@ cifs_create_set_dentry: | |||
| 457 | if (rc == 0) | 476 | if (rc == 0) |
| 458 | setup_cifs_dentry(tcon, direntry, newinode); | 477 | setup_cifs_dentry(tcon, direntry, newinode); |
| 459 | else | 478 | else |
| 460 | cFYI(1, ("Create worked, get_inode_info failed rc = %d", rc)); | 479 | cFYI(1, "Create worked, get_inode_info failed rc = %d", rc); |
| 461 | 480 | ||
| 462 | /* nfsd case - nfs srv does not set nd */ | 481 | /* nfsd case - nfs srv does not set nd */ |
| 463 | if ((nd == NULL) || (!(nd->flags & LOOKUP_OPEN))) { | 482 | if ((nd == NULL) || (!(nd->flags & LOOKUP_OPEN))) { |
| 464 | /* mknod case - do not leave file open */ | 483 | /* mknod case - do not leave file open */ |
| 465 | CIFSSMBClose(xid, tcon, fileHandle); | 484 | CIFSSMBClose(xid, tcon, fileHandle); |
| 466 | } else if (!(posix_create) && (newinode)) { | 485 | } else if (!(posix_create) && (newinode)) { |
| 467 | cifs_new_fileinfo(newinode, fileHandle, NULL, | 486 | struct cifsFileInfo *pfile_info; |
| 468 | nd->path.mnt, oflags); | 487 | /* |
| 488 | * cifs_fill_filedata() takes care of setting cifsFileInfo | ||
| 489 | * pointer to file->private_data. | ||
| 490 | */ | ||
| 491 | pfile_info = cifs_new_fileinfo(newinode, fileHandle, NULL, | ||
| 492 | nd->path.mnt, oflags); | ||
| 493 | if (pfile_info == NULL) | ||
| 494 | rc = -ENOMEM; | ||
| 469 | } | 495 | } |
| 470 | cifs_create_out: | 496 | cifs_create_out: |
| 471 | kfree(buf); | 497 | kfree(buf); |
| @@ -531,7 +557,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, | |||
| 531 | u16 fileHandle; | 557 | u16 fileHandle; |
| 532 | FILE_ALL_INFO *buf; | 558 | FILE_ALL_INFO *buf; |
| 533 | 559 | ||
| 534 | cFYI(1, ("sfu compat create special file")); | 560 | cFYI(1, "sfu compat create special file"); |
| 535 | 561 | ||
| 536 | buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); | 562 | buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); |
| 537 | if (buf == NULL) { | 563 | if (buf == NULL) { |
| @@ -616,8 +642,8 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 616 | 642 | ||
| 617 | xid = GetXid(); | 643 | xid = GetXid(); |
| 618 | 644 | ||
| 619 | cFYI(1, ("parent inode = 0x%p name is: %s and dentry = 0x%p", | 645 | cFYI(1, "parent inode = 0x%p name is: %s and dentry = 0x%p", |
| 620 | parent_dir_inode, direntry->d_name.name, direntry)); | 646 | parent_dir_inode, direntry->d_name.name, direntry); |
| 621 | 647 | ||
| 622 | /* check whether path exists */ | 648 | /* check whether path exists */ |
| 623 | 649 | ||
| @@ -632,7 +658,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 632 | int i; | 658 | int i; |
| 633 | for (i = 0; i < direntry->d_name.len; i++) | 659 | for (i = 0; i < direntry->d_name.len; i++) |
| 634 | if (direntry->d_name.name[i] == '\\') { | 660 | if (direntry->d_name.name[i] == '\\') { |
| 635 | cFYI(1, ("Invalid file name")); | 661 | cFYI(1, "Invalid file name"); |
| 636 | FreeXid(xid); | 662 | FreeXid(xid); |
| 637 | return ERR_PTR(-EINVAL); | 663 | return ERR_PTR(-EINVAL); |
| 638 | } | 664 | } |
| @@ -657,11 +683,11 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 657 | } | 683 | } |
| 658 | 684 | ||
| 659 | if (direntry->d_inode != NULL) { | 685 | if (direntry->d_inode != NULL) { |
| 660 | cFYI(1, ("non-NULL inode in lookup")); | 686 | cFYI(1, "non-NULL inode in lookup"); |
| 661 | } else { | 687 | } else { |
| 662 | cFYI(1, ("NULL inode in lookup")); | 688 | cFYI(1, "NULL inode in lookup"); |
| 663 | } | 689 | } |
| 664 | cFYI(1, ("Full path: %s inode = 0x%p", full_path, direntry->d_inode)); | 690 | cFYI(1, "Full path: %s inode = 0x%p", full_path, direntry->d_inode); |
| 665 | 691 | ||
| 666 | /* Posix open is only called (at lookup time) for file create now. | 692 | /* Posix open is only called (at lookup time) for file create now. |
| 667 | * For opens (rather than creates), because we do not know if it | 693 | * For opens (rather than creates), because we do not know if it |
| @@ -678,6 +704,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 678 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && | 704 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && |
| 679 | (nd->intent.open.flags & O_CREAT)) { | 705 | (nd->intent.open.flags & O_CREAT)) { |
| 680 | rc = cifs_posix_open(full_path, &newInode, nd->path.mnt, | 706 | rc = cifs_posix_open(full_path, &newInode, nd->path.mnt, |
| 707 | parent_dir_inode->i_sb, | ||
| 681 | nd->intent.open.create_mode, | 708 | nd->intent.open.create_mode, |
| 682 | nd->intent.open.flags, &oplock, | 709 | nd->intent.open.flags, &oplock, |
| 683 | &fileHandle, xid); | 710 | &fileHandle, xid); |
| @@ -723,7 +750,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 723 | /* if it was once a directory (but how can we tell?) we could do | 750 | /* if it was once a directory (but how can we tell?) we could do |
| 724 | shrink_dcache_parent(direntry); */ | 751 | shrink_dcache_parent(direntry); */ |
| 725 | } else if (rc != -EACCES) { | 752 | } else if (rc != -EACCES) { |
| 726 | cERROR(1, ("Unexpected lookup error %d", rc)); | 753 | cERROR(1, "Unexpected lookup error %d", rc); |
| 727 | /* We special case check for Access Denied - since that | 754 | /* We special case check for Access Denied - since that |
| 728 | is a common return code */ | 755 | is a common return code */ |
| 729 | } | 756 | } |
| @@ -742,8 +769,8 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd) | |||
| 742 | if (cifs_revalidate_dentry(direntry)) | 769 | if (cifs_revalidate_dentry(direntry)) |
| 743 | return 0; | 770 | return 0; |
| 744 | } else { | 771 | } else { |
| 745 | cFYI(1, ("neg dentry 0x%p name = %s", | 772 | cFYI(1, "neg dentry 0x%p name = %s", |
| 746 | direntry, direntry->d_name.name)); | 773 | direntry, direntry->d_name.name); |
| 747 | if (time_after(jiffies, direntry->d_time + HZ) || | 774 | if (time_after(jiffies, direntry->d_time + HZ) || |
| 748 | !lookupCacheEnabled) { | 775 | !lookupCacheEnabled) { |
| 749 | d_drop(direntry); | 776 | d_drop(direntry); |
| @@ -758,7 +785,7 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd) | |||
| 758 | { | 785 | { |
| 759 | int rc = 0; | 786 | int rc = 0; |
| 760 | 787 | ||
| 761 | cFYI(1, ("In cifs d_delete, name = %s", direntry->d_name.name)); | 788 | cFYI(1, "In cifs d_delete, name = %s", direntry->d_name.name); |
| 762 | 789 | ||
| 763 | return rc; | 790 | return rc; |
| 764 | } */ | 791 | } */ |
diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c index 6f8a0e3fb25b..4db2c5e7283f 100644 --- a/fs/cifs/dns_resolve.c +++ b/fs/cifs/dns_resolve.c | |||
| @@ -106,14 +106,14 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | |||
| 106 | /* search for server name delimiter */ | 106 | /* search for server name delimiter */ |
| 107 | len = strlen(unc); | 107 | len = strlen(unc); |
| 108 | if (len < 3) { | 108 | if (len < 3) { |
| 109 | cFYI(1, ("%s: unc is too short: %s", __func__, unc)); | 109 | cFYI(1, "%s: unc is too short: %s", __func__, unc); |
| 110 | return -EINVAL; | 110 | return -EINVAL; |
| 111 | } | 111 | } |
| 112 | len -= 2; | 112 | len -= 2; |
| 113 | name = memchr(unc+2, '\\', len); | 113 | name = memchr(unc+2, '\\', len); |
| 114 | if (!name) { | 114 | if (!name) { |
| 115 | cFYI(1, ("%s: probably server name is whole unc: %s", | 115 | cFYI(1, "%s: probably server name is whole unc: %s", |
| 116 | __func__, unc)); | 116 | __func__, unc); |
| 117 | } else { | 117 | } else { |
| 118 | len = (name - unc) - 2/* leading // */; | 118 | len = (name - unc) - 2/* leading // */; |
| 119 | } | 119 | } |
| @@ -127,8 +127,8 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | |||
| 127 | name[len] = 0; | 127 | name[len] = 0; |
| 128 | 128 | ||
| 129 | if (is_ip(name)) { | 129 | if (is_ip(name)) { |
| 130 | cFYI(1, ("%s: it is IP, skipping dns upcall: %s", | 130 | cFYI(1, "%s: it is IP, skipping dns upcall: %s", |
| 131 | __func__, name)); | 131 | __func__, name); |
| 132 | data = name; | 132 | data = name; |
| 133 | goto skip_upcall; | 133 | goto skip_upcall; |
| 134 | } | 134 | } |
| @@ -138,7 +138,7 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | |||
| 138 | len = rkey->type_data.x[0]; | 138 | len = rkey->type_data.x[0]; |
| 139 | data = rkey->payload.data; | 139 | data = rkey->payload.data; |
| 140 | } else { | 140 | } else { |
| 141 | cERROR(1, ("%s: unable to resolve: %s", __func__, name)); | 141 | cERROR(1, "%s: unable to resolve: %s", __func__, name); |
| 142 | goto out; | 142 | goto out; |
| 143 | } | 143 | } |
| 144 | 144 | ||
| @@ -148,10 +148,10 @@ skip_upcall: | |||
| 148 | if (*ip_addr) { | 148 | if (*ip_addr) { |
| 149 | memcpy(*ip_addr, data, len + 1); | 149 | memcpy(*ip_addr, data, len + 1); |
| 150 | if (!IS_ERR(rkey)) | 150 | if (!IS_ERR(rkey)) |
| 151 | cFYI(1, ("%s: resolved: %s to %s", __func__, | 151 | cFYI(1, "%s: resolved: %s to %s", __func__, |
| 152 | name, | 152 | name, |
| 153 | *ip_addr | 153 | *ip_addr |
| 154 | )); | 154 | ); |
| 155 | rc = 0; | 155 | rc = 0; |
| 156 | } else { | 156 | } else { |
| 157 | rc = -ENOMEM; | 157 | rc = -ENOMEM; |
diff --git a/fs/cifs/export.c b/fs/cifs/export.c index 6177f7cca16a..993f82045bf6 100644 --- a/fs/cifs/export.c +++ b/fs/cifs/export.c | |||
| @@ -49,7 +49,7 @@ | |||
| 49 | static struct dentry *cifs_get_parent(struct dentry *dentry) | 49 | static struct dentry *cifs_get_parent(struct dentry *dentry) |
| 50 | { | 50 | { |
| 51 | /* BB need to add code here eventually to enable export via NFSD */ | 51 | /* BB need to add code here eventually to enable export via NFSD */ |
| 52 | cFYI(1, ("get parent for %p", dentry)); | 52 | cFYI(1, "get parent for %p", dentry); |
| 53 | return ERR_PTR(-EACCES); | 53 | return ERR_PTR(-EACCES); |
| 54 | } | 54 | } |
| 55 | 55 | ||
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 9b11a8f56f3a..a83541ec9713 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * vfs operations that deal with files | 4 | * vfs operations that deal with files |
| 5 | * | 5 | * |
| 6 | * Copyright (C) International Business Machines Corp., 2002,2007 | 6 | * Copyright (C) International Business Machines Corp., 2002,2010 |
| 7 | * Author(s): Steve French (sfrench@us.ibm.com) | 7 | * Author(s): Steve French (sfrench@us.ibm.com) |
| 8 | * Jeremy Allison (jra@samba.org) | 8 | * Jeremy Allison (jra@samba.org) |
| 9 | * | 9 | * |
| @@ -108,8 +108,7 @@ static inline int cifs_get_disposition(unsigned int flags) | |||
| 108 | /* all arguments to this function must be checked for validity in caller */ | 108 | /* all arguments to this function must be checked for validity in caller */ |
| 109 | static inline int | 109 | static inline int |
| 110 | cifs_posix_open_inode_helper(struct inode *inode, struct file *file, | 110 | cifs_posix_open_inode_helper(struct inode *inode, struct file *file, |
| 111 | struct cifsInodeInfo *pCifsInode, | 111 | struct cifsInodeInfo *pCifsInode, __u32 oplock, |
| 112 | struct cifsFileInfo *pCifsFile, __u32 oplock, | ||
| 113 | u16 netfid) | 112 | u16 netfid) |
| 114 | { | 113 | { |
| 115 | 114 | ||
| @@ -136,15 +135,15 @@ cifs_posix_open_inode_helper(struct inode *inode, struct file *file, | |||
| 136 | if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) && | 135 | if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) && |
| 137 | (file->f_path.dentry->d_inode->i_size == | 136 | (file->f_path.dentry->d_inode->i_size == |
| 138 | (loff_t)le64_to_cpu(buf->EndOfFile))) { | 137 | (loff_t)le64_to_cpu(buf->EndOfFile))) { |
| 139 | cFYI(1, ("inode unchanged on server")); | 138 | cFYI(1, "inode unchanged on server"); |
| 140 | } else { | 139 | } else { |
| 141 | if (file->f_path.dentry->d_inode->i_mapping) { | 140 | if (file->f_path.dentry->d_inode->i_mapping) { |
| 142 | rc = filemap_write_and_wait(file->f_path.dentry->d_inode->i_mapping); | 141 | rc = filemap_write_and_wait(file->f_path.dentry->d_inode->i_mapping); |
| 143 | if (rc != 0) | 142 | if (rc != 0) |
| 144 | CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc; | 143 | CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc; |
| 145 | } | 144 | } |
| 146 | cFYI(1, ("invalidating remote inode since open detected it " | 145 | cFYI(1, "invalidating remote inode since open detected it " |
| 147 | "changed")); | 146 | "changed"); |
| 148 | invalidate_remote_inode(file->f_path.dentry->d_inode); | 147 | invalidate_remote_inode(file->f_path.dentry->d_inode); |
| 149 | } */ | 148 | } */ |
| 150 | 149 | ||
| @@ -152,8 +151,8 @@ psx_client_can_cache: | |||
| 152 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { | 151 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { |
| 153 | pCifsInode->clientCanCacheAll = true; | 152 | pCifsInode->clientCanCacheAll = true; |
| 154 | pCifsInode->clientCanCacheRead = true; | 153 | pCifsInode->clientCanCacheRead = true; |
| 155 | cFYI(1, ("Exclusive Oplock granted on inode %p", | 154 | cFYI(1, "Exclusive Oplock granted on inode %p", |
| 156 | file->f_path.dentry->d_inode)); | 155 | file->f_path.dentry->d_inode); |
| 157 | } else if ((oplock & 0xF) == OPLOCK_READ) | 156 | } else if ((oplock & 0xF) == OPLOCK_READ) |
| 158 | pCifsInode->clientCanCacheRead = true; | 157 | pCifsInode->clientCanCacheRead = true; |
| 159 | 158 | ||
| @@ -190,8 +189,8 @@ cifs_fill_filedata(struct file *file) | |||
| 190 | if (file->private_data != NULL) { | 189 | if (file->private_data != NULL) { |
| 191 | return pCifsFile; | 190 | return pCifsFile; |
| 192 | } else if ((file->f_flags & O_CREAT) && (file->f_flags & O_EXCL)) | 191 | } else if ((file->f_flags & O_CREAT) && (file->f_flags & O_EXCL)) |
| 193 | cERROR(1, ("could not find file instance for " | 192 | cERROR(1, "could not find file instance for " |
| 194 | "new file %p", file)); | 193 | "new file %p", file); |
| 195 | return NULL; | 194 | return NULL; |
| 196 | } | 195 | } |
| 197 | 196 | ||
| @@ -217,7 +216,7 @@ static inline int cifs_open_inode_helper(struct inode *inode, struct file *file, | |||
| 217 | if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) && | 216 | if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) && |
| 218 | (file->f_path.dentry->d_inode->i_size == | 217 | (file->f_path.dentry->d_inode->i_size == |
| 219 | (loff_t)le64_to_cpu(buf->EndOfFile))) { | 218 | (loff_t)le64_to_cpu(buf->EndOfFile))) { |
| 220 | cFYI(1, ("inode unchanged on server")); | 219 | cFYI(1, "inode unchanged on server"); |
| 221 | } else { | 220 | } else { |
| 222 | if (file->f_path.dentry->d_inode->i_mapping) { | 221 | if (file->f_path.dentry->d_inode->i_mapping) { |
| 223 | /* BB no need to lock inode until after invalidate | 222 | /* BB no need to lock inode until after invalidate |
| @@ -226,8 +225,8 @@ static inline int cifs_open_inode_helper(struct inode *inode, struct file *file, | |||
| 226 | if (rc != 0) | 225 | if (rc != 0) |
| 227 | CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc; | 226 | CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc; |
| 228 | } | 227 | } |
| 229 | cFYI(1, ("invalidating remote inode since open detected it " | 228 | cFYI(1, "invalidating remote inode since open detected it " |
| 230 | "changed")); | 229 | "changed"); |
| 231 | invalidate_remote_inode(file->f_path.dentry->d_inode); | 230 | invalidate_remote_inode(file->f_path.dentry->d_inode); |
| 232 | } | 231 | } |
| 233 | 232 | ||
| @@ -242,8 +241,8 @@ client_can_cache: | |||
| 242 | if ((*oplock & 0xF) == OPLOCK_EXCLUSIVE) { | 241 | if ((*oplock & 0xF) == OPLOCK_EXCLUSIVE) { |
| 243 | pCifsInode->clientCanCacheAll = true; | 242 | pCifsInode->clientCanCacheAll = true; |
| 244 | pCifsInode->clientCanCacheRead = true; | 243 | pCifsInode->clientCanCacheRead = true; |
| 245 | cFYI(1, ("Exclusive Oplock granted on inode %p", | 244 | cFYI(1, "Exclusive Oplock granted on inode %p", |
| 246 | file->f_path.dentry->d_inode)); | 245 | file->f_path.dentry->d_inode); |
| 247 | } else if ((*oplock & 0xF) == OPLOCK_READ) | 246 | } else if ((*oplock & 0xF) == OPLOCK_READ) |
| 248 | pCifsInode->clientCanCacheRead = true; | 247 | pCifsInode->clientCanCacheRead = true; |
| 249 | 248 | ||
| @@ -285,8 +284,8 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 285 | return rc; | 284 | return rc; |
| 286 | } | 285 | } |
| 287 | 286 | ||
| 288 | cFYI(1, ("inode = 0x%p file flags are 0x%x for %s", | 287 | cFYI(1, "inode = 0x%p file flags are 0x%x for %s", |
| 289 | inode, file->f_flags, full_path)); | 288 | inode, file->f_flags, full_path); |
| 290 | 289 | ||
| 291 | if (oplockEnabled) | 290 | if (oplockEnabled) |
| 292 | oplock = REQ_OPLOCK; | 291 | oplock = REQ_OPLOCK; |
| @@ -298,27 +297,29 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 298 | (CIFS_UNIX_POSIX_PATH_OPS_CAP & | 297 | (CIFS_UNIX_POSIX_PATH_OPS_CAP & |
| 299 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { | 298 | le64_to_cpu(tcon->fsUnixInfo.Capability))) { |
| 300 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); | 299 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); |
| 300 | oflags |= SMB_O_CREAT; | ||
| 301 | /* can not refresh inode info since size could be stale */ | 301 | /* can not refresh inode info since size could be stale */ |
| 302 | rc = cifs_posix_open(full_path, &inode, file->f_path.mnt, | 302 | rc = cifs_posix_open(full_path, &inode, file->f_path.mnt, |
| 303 | cifs_sb->mnt_file_mode /* ignored */, | 303 | inode->i_sb, |
| 304 | oflags, &oplock, &netfid, xid); | 304 | cifs_sb->mnt_file_mode /* ignored */, |
| 305 | oflags, &oplock, &netfid, xid); | ||
| 305 | if (rc == 0) { | 306 | if (rc == 0) { |
| 306 | cFYI(1, ("posix open succeeded")); | 307 | cFYI(1, "posix open succeeded"); |
| 307 | /* no need for special case handling of setting mode | 308 | /* no need for special case handling of setting mode |
| 308 | on read only files needed here */ | 309 | on read only files needed here */ |
| 309 | 310 | ||
| 310 | pCifsFile = cifs_fill_filedata(file); | 311 | pCifsFile = cifs_fill_filedata(file); |
| 311 | cifs_posix_open_inode_helper(inode, file, pCifsInode, | 312 | cifs_posix_open_inode_helper(inode, file, pCifsInode, |
| 312 | pCifsFile, oplock, netfid); | 313 | oplock, netfid); |
| 313 | goto out; | 314 | goto out; |
| 314 | } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | 315 | } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
| 315 | if (tcon->ses->serverNOS) | 316 | if (tcon->ses->serverNOS) |
| 316 | cERROR(1, ("server %s of type %s returned" | 317 | cERROR(1, "server %s of type %s returned" |
| 317 | " unexpected error on SMB posix open" | 318 | " unexpected error on SMB posix open" |
| 318 | ", disabling posix open support." | 319 | ", disabling posix open support." |
| 319 | " Check if server update available.", | 320 | " Check if server update available.", |
| 320 | tcon->ses->serverName, | 321 | tcon->ses->serverName, |
| 321 | tcon->ses->serverNOS)); | 322 | tcon->ses->serverNOS); |
| 322 | tcon->broken_posix_open = true; | 323 | tcon->broken_posix_open = true; |
| 323 | } else if ((rc != -EIO) && (rc != -EREMOTE) && | 324 | } else if ((rc != -EIO) && (rc != -EREMOTE) && |
| 324 | (rc != -EOPNOTSUPP)) /* path not found or net err */ | 325 | (rc != -EOPNOTSUPP)) /* path not found or net err */ |
| @@ -386,7 +387,7 @@ int cifs_open(struct inode *inode, struct file *file) | |||
| 386 | & CIFS_MOUNT_MAP_SPECIAL_CHR); | 387 | & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 387 | } | 388 | } |
| 388 | if (rc) { | 389 | if (rc) { |
| 389 | cFYI(1, ("cifs_open returned 0x%x", rc)); | 390 | cFYI(1, "cifs_open returned 0x%x", rc); |
| 390 | goto out; | 391 | goto out; |
| 391 | } | 392 | } |
| 392 | 393 | ||
| @@ -469,7 +470,7 @@ static int cifs_reopen_file(struct file *file, bool can_flush) | |||
| 469 | } | 470 | } |
| 470 | 471 | ||
| 471 | if (file->f_path.dentry == NULL) { | 472 | if (file->f_path.dentry == NULL) { |
| 472 | cERROR(1, ("no valid name if dentry freed")); | 473 | cERROR(1, "no valid name if dentry freed"); |
| 473 | dump_stack(); | 474 | dump_stack(); |
| 474 | rc = -EBADF; | 475 | rc = -EBADF; |
| 475 | goto reopen_error_exit; | 476 | goto reopen_error_exit; |
| @@ -477,7 +478,7 @@ static int cifs_reopen_file(struct file *file, bool can_flush) | |||
| 477 | 478 | ||
| 478 | inode = file->f_path.dentry->d_inode; | 479 | inode = file->f_path.dentry->d_inode; |
| 479 | if (inode == NULL) { | 480 | if (inode == NULL) { |
| 480 | cERROR(1, ("inode not valid")); | 481 | cERROR(1, "inode not valid"); |
| 481 | dump_stack(); | 482 | dump_stack(); |
| 482 | rc = -EBADF; | 483 | rc = -EBADF; |
| 483 | goto reopen_error_exit; | 484 | goto reopen_error_exit; |
| @@ -499,8 +500,8 @@ reopen_error_exit: | |||
| 499 | return rc; | 500 | return rc; |
| 500 | } | 501 | } |
| 501 | 502 | ||
| 502 | cFYI(1, ("inode = 0x%p file flags 0x%x for %s", | 503 | cFYI(1, "inode = 0x%p file flags 0x%x for %s", |
| 503 | inode, file->f_flags, full_path)); | 504 | inode, file->f_flags, full_path); |
| 504 | 505 | ||
| 505 | if (oplockEnabled) | 506 | if (oplockEnabled) |
| 506 | oplock = REQ_OPLOCK; | 507 | oplock = REQ_OPLOCK; |
| @@ -513,10 +514,11 @@ reopen_error_exit: | |||
| 513 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); | 514 | int oflags = (int) cifs_posix_convert_flags(file->f_flags); |
| 514 | /* can not refresh inode info since size could be stale */ | 515 | /* can not refresh inode info since size could be stale */ |
| 515 | rc = cifs_posix_open(full_path, NULL, file->f_path.mnt, | 516 | rc = cifs_posix_open(full_path, NULL, file->f_path.mnt, |
| 516 | cifs_sb->mnt_file_mode /* ignored */, | 517 | inode->i_sb, |
| 517 | oflags, &oplock, &netfid, xid); | 518 | cifs_sb->mnt_file_mode /* ignored */, |
| 519 | oflags, &oplock, &netfid, xid); | ||
| 518 | if (rc == 0) { | 520 | if (rc == 0) { |
| 519 | cFYI(1, ("posix reopen succeeded")); | 521 | cFYI(1, "posix reopen succeeded"); |
| 520 | goto reopen_success; | 522 | goto reopen_success; |
| 521 | } | 523 | } |
| 522 | /* fallthrough to retry open the old way on errors, especially | 524 | /* fallthrough to retry open the old way on errors, especially |
| @@ -537,8 +539,8 @@ reopen_error_exit: | |||
| 537 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 539 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 538 | if (rc) { | 540 | if (rc) { |
| 539 | mutex_unlock(&pCifsFile->fh_mutex); | 541 | mutex_unlock(&pCifsFile->fh_mutex); |
| 540 | cFYI(1, ("cifs_open returned 0x%x", rc)); | 542 | cFYI(1, "cifs_open returned 0x%x", rc); |
| 541 | cFYI(1, ("oplock: %d", oplock)); | 543 | cFYI(1, "oplock: %d", oplock); |
| 542 | } else { | 544 | } else { |
| 543 | reopen_success: | 545 | reopen_success: |
| 544 | pCifsFile->netfid = netfid; | 546 | pCifsFile->netfid = netfid; |
| @@ -570,8 +572,8 @@ reopen_success: | |||
| 570 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { | 572 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { |
| 571 | pCifsInode->clientCanCacheAll = true; | 573 | pCifsInode->clientCanCacheAll = true; |
| 572 | pCifsInode->clientCanCacheRead = true; | 574 | pCifsInode->clientCanCacheRead = true; |
| 573 | cFYI(1, ("Exclusive Oplock granted on inode %p", | 575 | cFYI(1, "Exclusive Oplock granted on inode %p", |
| 574 | file->f_path.dentry->d_inode)); | 576 | file->f_path.dentry->d_inode); |
| 575 | } else if ((oplock & 0xF) == OPLOCK_READ) { | 577 | } else if ((oplock & 0xF) == OPLOCK_READ) { |
| 576 | pCifsInode->clientCanCacheRead = true; | 578 | pCifsInode->clientCanCacheRead = true; |
| 577 | pCifsInode->clientCanCacheAll = false; | 579 | pCifsInode->clientCanCacheAll = false; |
| @@ -619,8 +621,7 @@ int cifs_close(struct inode *inode, struct file *file) | |||
| 619 | the struct would be in each open file, | 621 | the struct would be in each open file, |
| 620 | but this should give enough time to | 622 | but this should give enough time to |
| 621 | clear the socket */ | 623 | clear the socket */ |
| 622 | cFYI(DBG2, | 624 | cFYI(DBG2, "close delay, write pending"); |
| 623 | ("close delay, write pending")); | ||
| 624 | msleep(timeout); | 625 | msleep(timeout); |
| 625 | timeout *= 4; | 626 | timeout *= 4; |
| 626 | } | 627 | } |
| @@ -653,7 +654,7 @@ int cifs_close(struct inode *inode, struct file *file) | |||
| 653 | 654 | ||
| 654 | read_lock(&GlobalSMBSeslock); | 655 | read_lock(&GlobalSMBSeslock); |
| 655 | if (list_empty(&(CIFS_I(inode)->openFileList))) { | 656 | if (list_empty(&(CIFS_I(inode)->openFileList))) { |
| 656 | cFYI(1, ("closing last open instance for inode %p", inode)); | 657 | cFYI(1, "closing last open instance for inode %p", inode); |
| 657 | /* if the file is not open we do not know if we can cache info | 658 | /* if the file is not open we do not know if we can cache info |
| 658 | on this inode, much less write behind and read ahead */ | 659 | on this inode, much less write behind and read ahead */ |
| 659 | CIFS_I(inode)->clientCanCacheRead = false; | 660 | CIFS_I(inode)->clientCanCacheRead = false; |
| @@ -674,7 +675,7 @@ int cifs_closedir(struct inode *inode, struct file *file) | |||
| 674 | (struct cifsFileInfo *)file->private_data; | 675 | (struct cifsFileInfo *)file->private_data; |
| 675 | char *ptmp; | 676 | char *ptmp; |
| 676 | 677 | ||
| 677 | cFYI(1, ("Closedir inode = 0x%p", inode)); | 678 | cFYI(1, "Closedir inode = 0x%p", inode); |
| 678 | 679 | ||
| 679 | xid = GetXid(); | 680 | xid = GetXid(); |
| 680 | 681 | ||
| @@ -685,22 +686,22 @@ int cifs_closedir(struct inode *inode, struct file *file) | |||
| 685 | 686 | ||
| 686 | pTcon = cifs_sb->tcon; | 687 | pTcon = cifs_sb->tcon; |
| 687 | 688 | ||
| 688 | cFYI(1, ("Freeing private data in close dir")); | 689 | cFYI(1, "Freeing private data in close dir"); |
| 689 | write_lock(&GlobalSMBSeslock); | 690 | write_lock(&GlobalSMBSeslock); |
| 690 | if (!pCFileStruct->srch_inf.endOfSearch && | 691 | if (!pCFileStruct->srch_inf.endOfSearch && |
| 691 | !pCFileStruct->invalidHandle) { | 692 | !pCFileStruct->invalidHandle) { |
| 692 | pCFileStruct->invalidHandle = true; | 693 | pCFileStruct->invalidHandle = true; |
| 693 | write_unlock(&GlobalSMBSeslock); | 694 | write_unlock(&GlobalSMBSeslock); |
| 694 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); | 695 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); |
| 695 | cFYI(1, ("Closing uncompleted readdir with rc %d", | 696 | cFYI(1, "Closing uncompleted readdir with rc %d", |
| 696 | rc)); | 697 | rc); |
| 697 | /* not much we can do if it fails anyway, ignore rc */ | 698 | /* not much we can do if it fails anyway, ignore rc */ |
| 698 | rc = 0; | 699 | rc = 0; |
| 699 | } else | 700 | } else |
| 700 | write_unlock(&GlobalSMBSeslock); | 701 | write_unlock(&GlobalSMBSeslock); |
| 701 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; | 702 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; |
| 702 | if (ptmp) { | 703 | if (ptmp) { |
| 703 | cFYI(1, ("closedir free smb buf in srch struct")); | 704 | cFYI(1, "closedir free smb buf in srch struct"); |
| 704 | pCFileStruct->srch_inf.ntwrk_buf_start = NULL; | 705 | pCFileStruct->srch_inf.ntwrk_buf_start = NULL; |
| 705 | if (pCFileStruct->srch_inf.smallBuf) | 706 | if (pCFileStruct->srch_inf.smallBuf) |
| 706 | cifs_small_buf_release(ptmp); | 707 | cifs_small_buf_release(ptmp); |
| @@ -748,49 +749,49 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock) | |||
| 748 | rc = -EACCES; | 749 | rc = -EACCES; |
| 749 | xid = GetXid(); | 750 | xid = GetXid(); |
| 750 | 751 | ||
| 751 | cFYI(1, ("Lock parm: 0x%x flockflags: " | 752 | cFYI(1, "Lock parm: 0x%x flockflags: " |
| 752 | "0x%x flocktype: 0x%x start: %lld end: %lld", | 753 | "0x%x flocktype: 0x%x start: %lld end: %lld", |
| 753 | cmd, pfLock->fl_flags, pfLock->fl_type, pfLock->fl_start, | 754 | cmd, pfLock->fl_flags, pfLock->fl_type, pfLock->fl_start, |
| 754 | pfLock->fl_end)); | 755 | pfLock->fl_end); |
| 755 | 756 | ||
| 756 | if (pfLock->fl_flags & FL_POSIX) | 757 | if (pfLock->fl_flags & FL_POSIX) |
| 757 | cFYI(1, ("Posix")); | 758 | cFYI(1, "Posix"); |
| 758 | if (pfLock->fl_flags & FL_FLOCK) | 759 | if (pfLock->fl_flags & FL_FLOCK) |
| 759 | cFYI(1, ("Flock")); | 760 | cFYI(1, "Flock"); |
| 760 | if (pfLock->fl_flags & FL_SLEEP) { | 761 | if (pfLock->fl_flags & FL_SLEEP) { |
| 761 | cFYI(1, ("Blocking lock")); | 762 | cFYI(1, "Blocking lock"); |
| 762 | wait_flag = true; | 763 | wait_flag = true; |
| 763 | } | 764 | } |
| 764 | if (pfLock->fl_flags & FL_ACCESS) | 765 | if (pfLock->fl_flags & FL_ACCESS) |
| 765 | cFYI(1, ("Process suspended by mandatory locking - " | 766 | cFYI(1, "Process suspended by mandatory locking - " |
| 766 | "not implemented yet")); | 767 | "not implemented yet"); |
| 767 | if (pfLock->fl_flags & FL_LEASE) | 768 | if (pfLock->fl_flags & FL_LEASE) |
| 768 | cFYI(1, ("Lease on file - not implemented yet")); | 769 | cFYI(1, "Lease on file - not implemented yet"); |
| 769 | if (pfLock->fl_flags & | 770 | if (pfLock->fl_flags & |
| 770 | (~(FL_POSIX | FL_FLOCK | FL_SLEEP | FL_ACCESS | FL_LEASE))) | 771 | (~(FL_POSIX | FL_FLOCK | FL_SLEEP | FL_ACCESS | FL_LEASE))) |
| 771 | cFYI(1, ("Unknown lock flags 0x%x", pfLock->fl_flags)); | 772 | cFYI(1, "Unknown lock flags 0x%x", pfLock->fl_flags); |
| 772 | 773 | ||
| 773 | if (pfLock->fl_type == F_WRLCK) { | 774 | if (pfLock->fl_type == F_WRLCK) { |
| 774 | cFYI(1, ("F_WRLCK ")); | 775 | cFYI(1, "F_WRLCK "); |
| 775 | numLock = 1; | 776 | numLock = 1; |
| 776 | } else if (pfLock->fl_type == F_UNLCK) { | 777 | } else if (pfLock->fl_type == F_UNLCK) { |
| 777 | cFYI(1, ("F_UNLCK")); | 778 | cFYI(1, "F_UNLCK"); |
| 778 | numUnlock = 1; | 779 | numUnlock = 1; |
| 779 | /* Check if unlock includes more than | 780 | /* Check if unlock includes more than |
| 780 | one lock range */ | 781 | one lock range */ |
| 781 | } else if (pfLock->fl_type == F_RDLCK) { | 782 | } else if (pfLock->fl_type == F_RDLCK) { |
| 782 | cFYI(1, ("F_RDLCK")); | 783 | cFYI(1, "F_RDLCK"); |
| 783 | lockType |= LOCKING_ANDX_SHARED_LOCK; | 784 | lockType |= LOCKING_ANDX_SHARED_LOCK; |
| 784 | numLock = 1; | 785 | numLock = 1; |
| 785 | } else if (pfLock->fl_type == F_EXLCK) { | 786 | } else if (pfLock->fl_type == F_EXLCK) { |
| 786 | cFYI(1, ("F_EXLCK")); | 787 | cFYI(1, "F_EXLCK"); |
| 787 | numLock = 1; | 788 | numLock = 1; |
| 788 | } else if (pfLock->fl_type == F_SHLCK) { | 789 | } else if (pfLock->fl_type == F_SHLCK) { |
| 789 | cFYI(1, ("F_SHLCK")); | 790 | cFYI(1, "F_SHLCK"); |
| 790 | lockType |= LOCKING_ANDX_SHARED_LOCK; | 791 | lockType |= LOCKING_ANDX_SHARED_LOCK; |
| 791 | numLock = 1; | 792 | numLock = 1; |
| 792 | } else | 793 | } else |
| 793 | cFYI(1, ("Unknown type of lock")); | 794 | cFYI(1, "Unknown type of lock"); |
| 794 | 795 | ||
| 795 | cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); | 796 | cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); |
| 796 | tcon = cifs_sb->tcon; | 797 | tcon = cifs_sb->tcon; |
| @@ -833,8 +834,8 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock) | |||
| 833 | 0 /* wait flag */ ); | 834 | 0 /* wait flag */ ); |
| 834 | pfLock->fl_type = F_UNLCK; | 835 | pfLock->fl_type = F_UNLCK; |
| 835 | if (rc != 0) | 836 | if (rc != 0) |
| 836 | cERROR(1, ("Error unlocking previously locked " | 837 | cERROR(1, "Error unlocking previously locked " |
| 837 | "range %d during test of lock", rc)); | 838 | "range %d during test of lock", rc); |
| 838 | rc = 0; | 839 | rc = 0; |
| 839 | 840 | ||
| 840 | } else { | 841 | } else { |
| @@ -856,9 +857,9 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock) | |||
| 856 | 0 /* wait flag */); | 857 | 0 /* wait flag */); |
| 857 | pfLock->fl_type = F_RDLCK; | 858 | pfLock->fl_type = F_RDLCK; |
| 858 | if (rc != 0) | 859 | if (rc != 0) |
| 859 | cERROR(1, ("Error unlocking " | 860 | cERROR(1, "Error unlocking " |
| 860 | "previously locked range %d " | 861 | "previously locked range %d " |
| 861 | "during test of lock", rc)); | 862 | "during test of lock", rc); |
| 862 | rc = 0; | 863 | rc = 0; |
| 863 | } else { | 864 | } else { |
| 864 | pfLock->fl_type = F_WRLCK; | 865 | pfLock->fl_type = F_WRLCK; |
| @@ -923,9 +924,10 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock) | |||
| 923 | 1, 0, li->type, false); | 924 | 1, 0, li->type, false); |
| 924 | if (stored_rc) | 925 | if (stored_rc) |
| 925 | rc = stored_rc; | 926 | rc = stored_rc; |
| 926 | 927 | else { | |
| 927 | list_del(&li->llist); | 928 | list_del(&li->llist); |
| 928 | kfree(li); | 929 | kfree(li); |
| 930 | } | ||
| 929 | } | 931 | } |
| 930 | } | 932 | } |
| 931 | mutex_unlock(&fid->lock_mutex); | 933 | mutex_unlock(&fid->lock_mutex); |
| @@ -988,9 +990,8 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data, | |||
| 988 | 990 | ||
| 989 | pTcon = cifs_sb->tcon; | 991 | pTcon = cifs_sb->tcon; |
| 990 | 992 | ||
| 991 | /* cFYI(1, | 993 | /* cFYI(1, " write %d bytes to offset %lld of %s", write_size, |
| 992 | (" write %d bytes to offset %lld of %s", write_size, | 994 | *poffset, file->f_path.dentry->d_name.name); */ |
| 993 | *poffset, file->f_path.dentry->d_name.name)); */ | ||
| 994 | 995 | ||
| 995 | if (file->private_data == NULL) | 996 | if (file->private_data == NULL) |
| 996 | return -EBADF; | 997 | return -EBADF; |
| @@ -1091,8 +1092,8 @@ static ssize_t cifs_write(struct file *file, const char *write_data, | |||
| 1091 | 1092 | ||
| 1092 | pTcon = cifs_sb->tcon; | 1093 | pTcon = cifs_sb->tcon; |
| 1093 | 1094 | ||
| 1094 | cFYI(1, ("write %zd bytes to offset %lld of %s", write_size, | 1095 | cFYI(1, "write %zd bytes to offset %lld of %s", write_size, |
| 1095 | *poffset, file->f_path.dentry->d_name.name)); | 1096 | *poffset, file->f_path.dentry->d_name.name); |
| 1096 | 1097 | ||
| 1097 | if (file->private_data == NULL) | 1098 | if (file->private_data == NULL) |
| 1098 | return -EBADF; | 1099 | return -EBADF; |
| @@ -1233,7 +1234,7 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode) | |||
| 1233 | it being zero) during stress testcases so we need to check for it */ | 1234 | it being zero) during stress testcases so we need to check for it */ |
| 1234 | 1235 | ||
| 1235 | if (cifs_inode == NULL) { | 1236 | if (cifs_inode == NULL) { |
| 1236 | cERROR(1, ("Null inode passed to cifs_writeable_file")); | 1237 | cERROR(1, "Null inode passed to cifs_writeable_file"); |
| 1237 | dump_stack(); | 1238 | dump_stack(); |
| 1238 | return NULL; | 1239 | return NULL; |
| 1239 | } | 1240 | } |
| @@ -1277,7 +1278,7 @@ refind_writable: | |||
| 1277 | again. Note that it would be bad | 1278 | again. Note that it would be bad |
| 1278 | to hold up writepages here (rather than | 1279 | to hold up writepages here (rather than |
| 1279 | in caller) with continuous retries */ | 1280 | in caller) with continuous retries */ |
| 1280 | cFYI(1, ("wp failed on reopen file")); | 1281 | cFYI(1, "wp failed on reopen file"); |
| 1281 | read_lock(&GlobalSMBSeslock); | 1282 | read_lock(&GlobalSMBSeslock); |
| 1282 | /* can not use this handle, no write | 1283 | /* can not use this handle, no write |
| 1283 | pending on this one after all */ | 1284 | pending on this one after all */ |
| @@ -1353,7 +1354,7 @@ static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) | |||
| 1353 | else if (bytes_written < 0) | 1354 | else if (bytes_written < 0) |
| 1354 | rc = bytes_written; | 1355 | rc = bytes_written; |
| 1355 | } else { | 1356 | } else { |
| 1356 | cFYI(1, ("No writeable filehandles for inode")); | 1357 | cFYI(1, "No writeable filehandles for inode"); |
| 1357 | rc = -EIO; | 1358 | rc = -EIO; |
| 1358 | } | 1359 | } |
| 1359 | 1360 | ||
| @@ -1525,7 +1526,7 @@ retry: | |||
| 1525 | */ | 1526 | */ |
| 1526 | open_file = find_writable_file(CIFS_I(mapping->host)); | 1527 | open_file = find_writable_file(CIFS_I(mapping->host)); |
| 1527 | if (!open_file) { | 1528 | if (!open_file) { |
| 1528 | cERROR(1, ("No writable handles for inode")); | 1529 | cERROR(1, "No writable handles for inode"); |
| 1529 | rc = -EBADF; | 1530 | rc = -EBADF; |
| 1530 | } else { | 1531 | } else { |
| 1531 | long_op = cifs_write_timeout(cifsi, offset); | 1532 | long_op = cifs_write_timeout(cifsi, offset); |
| @@ -1538,8 +1539,8 @@ retry: | |||
| 1538 | cifs_update_eof(cifsi, offset, bytes_written); | 1539 | cifs_update_eof(cifsi, offset, bytes_written); |
| 1539 | 1540 | ||
| 1540 | if (rc || bytes_written < bytes_to_write) { | 1541 | if (rc || bytes_written < bytes_to_write) { |
| 1541 | cERROR(1, ("Write2 ret %d, wrote %d", | 1542 | cERROR(1, "Write2 ret %d, wrote %d", |
| 1542 | rc, bytes_written)); | 1543 | rc, bytes_written); |
| 1543 | /* BB what if continued retry is | 1544 | /* BB what if continued retry is |
| 1544 | requested via mount flags? */ | 1545 | requested via mount flags? */ |
| 1545 | if (rc == -ENOSPC) | 1546 | if (rc == -ENOSPC) |
| @@ -1600,7 +1601,7 @@ static int cifs_writepage(struct page *page, struct writeback_control *wbc) | |||
| 1600 | /* BB add check for wbc flags */ | 1601 | /* BB add check for wbc flags */ |
| 1601 | page_cache_get(page); | 1602 | page_cache_get(page); |
| 1602 | if (!PageUptodate(page)) | 1603 | if (!PageUptodate(page)) |
| 1603 | cFYI(1, ("ppw - page not up to date")); | 1604 | cFYI(1, "ppw - page not up to date"); |
| 1604 | 1605 | ||
| 1605 | /* | 1606 | /* |
| 1606 | * Set the "writeback" flag, and clear "dirty" in the radix tree. | 1607 | * Set the "writeback" flag, and clear "dirty" in the radix tree. |
| @@ -1629,8 +1630,8 @@ static int cifs_write_end(struct file *file, struct address_space *mapping, | |||
| 1629 | int rc; | 1630 | int rc; |
| 1630 | struct inode *inode = mapping->host; | 1631 | struct inode *inode = mapping->host; |
| 1631 | 1632 | ||
| 1632 | cFYI(1, ("write_end for page %p from pos %lld with %d bytes", | 1633 | cFYI(1, "write_end for page %p from pos %lld with %d bytes", |
| 1633 | page, pos, copied)); | 1634 | page, pos, copied); |
| 1634 | 1635 | ||
| 1635 | if (PageChecked(page)) { | 1636 | if (PageChecked(page)) { |
| 1636 | if (copied == len) | 1637 | if (copied == len) |
| @@ -1686,8 +1687,8 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync) | |||
| 1686 | 1687 | ||
| 1687 | xid = GetXid(); | 1688 | xid = GetXid(); |
| 1688 | 1689 | ||
| 1689 | cFYI(1, ("Sync file - name: %s datasync: 0x%x", | 1690 | cFYI(1, "Sync file - name: %s datasync: 0x%x", |
| 1690 | dentry->d_name.name, datasync)); | 1691 | dentry->d_name.name, datasync); |
| 1691 | 1692 | ||
| 1692 | rc = filemap_write_and_wait(inode->i_mapping); | 1693 | rc = filemap_write_and_wait(inode->i_mapping); |
| 1693 | if (rc == 0) { | 1694 | if (rc == 0) { |
| @@ -1711,7 +1712,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync) | |||
| 1711 | unsigned int rpages = 0; | 1712 | unsigned int rpages = 0; |
| 1712 | int rc = 0; | 1713 | int rc = 0; |
| 1713 | 1714 | ||
| 1714 | cFYI(1, ("sync page %p",page)); | 1715 | cFYI(1, "sync page %p", page); |
| 1715 | mapping = page->mapping; | 1716 | mapping = page->mapping; |
| 1716 | if (!mapping) | 1717 | if (!mapping) |
| 1717 | return 0; | 1718 | return 0; |
| @@ -1722,7 +1723,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync) | |||
| 1722 | /* fill in rpages then | 1723 | /* fill in rpages then |
| 1723 | result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */ | 1724 | result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */ |
| 1724 | 1725 | ||
| 1725 | /* cFYI(1, ("rpages is %d for sync page of Index %ld", rpages, index)); | 1726 | /* cFYI(1, "rpages is %d for sync page of Index %ld", rpages, index); |
| 1726 | 1727 | ||
| 1727 | #if 0 | 1728 | #if 0 |
| 1728 | if (rc < 0) | 1729 | if (rc < 0) |
| @@ -1756,7 +1757,7 @@ int cifs_flush(struct file *file, fl_owner_t id) | |||
| 1756 | CIFS_I(inode)->write_behind_rc = 0; | 1757 | CIFS_I(inode)->write_behind_rc = 0; |
| 1757 | } | 1758 | } |
| 1758 | 1759 | ||
| 1759 | cFYI(1, ("Flush inode %p file %p rc %d", inode, file, rc)); | 1760 | cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc); |
| 1760 | 1761 | ||
| 1761 | return rc; | 1762 | return rc; |
| 1762 | } | 1763 | } |
| @@ -1788,7 +1789,7 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data, | |||
| 1788 | open_file = (struct cifsFileInfo *)file->private_data; | 1789 | open_file = (struct cifsFileInfo *)file->private_data; |
| 1789 | 1790 | ||
| 1790 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) | 1791 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) |
| 1791 | cFYI(1, ("attempting read on write only file instance")); | 1792 | cFYI(1, "attempting read on write only file instance"); |
| 1792 | 1793 | ||
| 1793 | for (total_read = 0, current_offset = read_data; | 1794 | for (total_read = 0, current_offset = read_data; |
| 1794 | read_size > total_read; | 1795 | read_size > total_read; |
| @@ -1869,7 +1870,7 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size, | |||
| 1869 | open_file = (struct cifsFileInfo *)file->private_data; | 1870 | open_file = (struct cifsFileInfo *)file->private_data; |
| 1870 | 1871 | ||
| 1871 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) | 1872 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) |
| 1872 | cFYI(1, ("attempting read on write only file instance")); | 1873 | cFYI(1, "attempting read on write only file instance"); |
| 1873 | 1874 | ||
| 1874 | for (total_read = 0, current_offset = read_data; | 1875 | for (total_read = 0, current_offset = read_data; |
| 1875 | read_size > total_read; | 1876 | read_size > total_read; |
| @@ -1920,7 +1921,7 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 1920 | xid = GetXid(); | 1921 | xid = GetXid(); |
| 1921 | rc = cifs_revalidate_file(file); | 1922 | rc = cifs_revalidate_file(file); |
| 1922 | if (rc) { | 1923 | if (rc) { |
| 1923 | cFYI(1, ("Validation prior to mmap failed, error=%d", rc)); | 1924 | cFYI(1, "Validation prior to mmap failed, error=%d", rc); |
| 1924 | FreeXid(xid); | 1925 | FreeXid(xid); |
| 1925 | return rc; | 1926 | return rc; |
| 1926 | } | 1927 | } |
| @@ -1931,8 +1932,7 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 1931 | 1932 | ||
| 1932 | 1933 | ||
| 1933 | static void cifs_copy_cache_pages(struct address_space *mapping, | 1934 | static void cifs_copy_cache_pages(struct address_space *mapping, |
| 1934 | struct list_head *pages, int bytes_read, char *data, | 1935 | struct list_head *pages, int bytes_read, char *data) |
| 1935 | struct pagevec *plru_pvec) | ||
| 1936 | { | 1936 | { |
| 1937 | struct page *page; | 1937 | struct page *page; |
| 1938 | char *target; | 1938 | char *target; |
| @@ -1944,10 +1944,10 @@ static void cifs_copy_cache_pages(struct address_space *mapping, | |||
| 1944 | page = list_entry(pages->prev, struct page, lru); | 1944 | page = list_entry(pages->prev, struct page, lru); |
| 1945 | list_del(&page->lru); | 1945 | list_del(&page->lru); |
| 1946 | 1946 | ||
| 1947 | if (add_to_page_cache(page, mapping, page->index, | 1947 | if (add_to_page_cache_lru(page, mapping, page->index, |
| 1948 | GFP_KERNEL)) { | 1948 | GFP_KERNEL)) { |
| 1949 | page_cache_release(page); | 1949 | page_cache_release(page); |
| 1950 | cFYI(1, ("Add page cache failed")); | 1950 | cFYI(1, "Add page cache failed"); |
| 1951 | data += PAGE_CACHE_SIZE; | 1951 | data += PAGE_CACHE_SIZE; |
| 1952 | bytes_read -= PAGE_CACHE_SIZE; | 1952 | bytes_read -= PAGE_CACHE_SIZE; |
| 1953 | continue; | 1953 | continue; |
| @@ -1970,8 +1970,6 @@ static void cifs_copy_cache_pages(struct address_space *mapping, | |||
| 1970 | flush_dcache_page(page); | 1970 | flush_dcache_page(page); |
| 1971 | SetPageUptodate(page); | 1971 | SetPageUptodate(page); |
| 1972 | unlock_page(page); | 1972 | unlock_page(page); |
| 1973 | if (!pagevec_add(plru_pvec, page)) | ||
| 1974 | __pagevec_lru_add_file(plru_pvec); | ||
| 1975 | data += PAGE_CACHE_SIZE; | 1973 | data += PAGE_CACHE_SIZE; |
| 1976 | } | 1974 | } |
| 1977 | return; | 1975 | return; |
| @@ -1990,7 +1988,6 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 1990 | unsigned int read_size, i; | 1988 | unsigned int read_size, i; |
| 1991 | char *smb_read_data = NULL; | 1989 | char *smb_read_data = NULL; |
| 1992 | struct smb_com_read_rsp *pSMBr; | 1990 | struct smb_com_read_rsp *pSMBr; |
| 1993 | struct pagevec lru_pvec; | ||
| 1994 | struct cifsFileInfo *open_file; | 1991 | struct cifsFileInfo *open_file; |
| 1995 | int buf_type = CIFS_NO_BUFFER; | 1992 | int buf_type = CIFS_NO_BUFFER; |
| 1996 | 1993 | ||
| @@ -2004,8 +2001,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 2004 | cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); | 2001 | cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); |
| 2005 | pTcon = cifs_sb->tcon; | 2002 | pTcon = cifs_sb->tcon; |
| 2006 | 2003 | ||
| 2007 | pagevec_init(&lru_pvec, 0); | 2004 | cFYI(DBG2, "rpages: num pages %d", num_pages); |
| 2008 | cFYI(DBG2, ("rpages: num pages %d", num_pages)); | ||
| 2009 | for (i = 0; i < num_pages; ) { | 2005 | for (i = 0; i < num_pages; ) { |
| 2010 | unsigned contig_pages; | 2006 | unsigned contig_pages; |
| 2011 | struct page *tmp_page; | 2007 | struct page *tmp_page; |
| @@ -2038,8 +2034,8 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 2038 | /* Read size needs to be in multiples of one page */ | 2034 | /* Read size needs to be in multiples of one page */ |
| 2039 | read_size = min_t(const unsigned int, read_size, | 2035 | read_size = min_t(const unsigned int, read_size, |
| 2040 | cifs_sb->rsize & PAGE_CACHE_MASK); | 2036 | cifs_sb->rsize & PAGE_CACHE_MASK); |
| 2041 | cFYI(DBG2, ("rpages: read size 0x%x contiguous pages %d", | 2037 | cFYI(DBG2, "rpages: read size 0x%x contiguous pages %d", |
| 2042 | read_size, contig_pages)); | 2038 | read_size, contig_pages); |
| 2043 | rc = -EAGAIN; | 2039 | rc = -EAGAIN; |
| 2044 | while (rc == -EAGAIN) { | 2040 | while (rc == -EAGAIN) { |
| 2045 | if ((open_file->invalidHandle) && | 2041 | if ((open_file->invalidHandle) && |
| @@ -2066,14 +2062,14 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 2066 | } | 2062 | } |
| 2067 | } | 2063 | } |
| 2068 | if ((rc < 0) || (smb_read_data == NULL)) { | 2064 | if ((rc < 0) || (smb_read_data == NULL)) { |
| 2069 | cFYI(1, ("Read error in readpages: %d", rc)); | 2065 | cFYI(1, "Read error in readpages: %d", rc); |
| 2070 | break; | 2066 | break; |
| 2071 | } else if (bytes_read > 0) { | 2067 | } else if (bytes_read > 0) { |
| 2072 | task_io_account_read(bytes_read); | 2068 | task_io_account_read(bytes_read); |
| 2073 | pSMBr = (struct smb_com_read_rsp *)smb_read_data; | 2069 | pSMBr = (struct smb_com_read_rsp *)smb_read_data; |
| 2074 | cifs_copy_cache_pages(mapping, page_list, bytes_read, | 2070 | cifs_copy_cache_pages(mapping, page_list, bytes_read, |
| 2075 | smb_read_data + 4 /* RFC1001 hdr */ + | 2071 | smb_read_data + 4 /* RFC1001 hdr */ + |
| 2076 | le16_to_cpu(pSMBr->DataOffset), &lru_pvec); | 2072 | le16_to_cpu(pSMBr->DataOffset)); |
| 2077 | 2073 | ||
| 2078 | i += bytes_read >> PAGE_CACHE_SHIFT; | 2074 | i += bytes_read >> PAGE_CACHE_SHIFT; |
| 2079 | cifs_stats_bytes_read(pTcon, bytes_read); | 2075 | cifs_stats_bytes_read(pTcon, bytes_read); |
| @@ -2089,9 +2085,9 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 2089 | /* break; */ | 2085 | /* break; */ |
| 2090 | } | 2086 | } |
| 2091 | } else { | 2087 | } else { |
| 2092 | cFYI(1, ("No bytes read (%d) at offset %lld . " | 2088 | cFYI(1, "No bytes read (%d) at offset %lld . " |
| 2093 | "Cleaning remaining pages from readahead list", | 2089 | "Cleaning remaining pages from readahead list", |
| 2094 | bytes_read, offset)); | 2090 | bytes_read, offset); |
| 2095 | /* BB turn off caching and do new lookup on | 2091 | /* BB turn off caching and do new lookup on |
| 2096 | file size at server? */ | 2092 | file size at server? */ |
| 2097 | break; | 2093 | break; |
| @@ -2106,8 +2102,6 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 2106 | bytes_read = 0; | 2102 | bytes_read = 0; |
| 2107 | } | 2103 | } |
| 2108 | 2104 | ||
| 2109 | pagevec_lru_add_file(&lru_pvec); | ||
| 2110 | |||
| 2111 | /* need to free smb_read_data buf before exit */ | 2105 | /* need to free smb_read_data buf before exit */ |
| 2112 | if (smb_read_data) { | 2106 | if (smb_read_data) { |
| 2113 | if (buf_type == CIFS_SMALL_BUFFER) | 2107 | if (buf_type == CIFS_SMALL_BUFFER) |
| @@ -2136,7 +2130,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page, | |||
| 2136 | if (rc < 0) | 2130 | if (rc < 0) |
| 2137 | goto io_error; | 2131 | goto io_error; |
| 2138 | else | 2132 | else |
| 2139 | cFYI(1, ("Bytes read %d", rc)); | 2133 | cFYI(1, "Bytes read %d", rc); |
| 2140 | 2134 | ||
| 2141 | file->f_path.dentry->d_inode->i_atime = | 2135 | file->f_path.dentry->d_inode->i_atime = |
| 2142 | current_fs_time(file->f_path.dentry->d_inode->i_sb); | 2136 | current_fs_time(file->f_path.dentry->d_inode->i_sb); |
| @@ -2168,8 +2162,8 @@ static int cifs_readpage(struct file *file, struct page *page) | |||
| 2168 | return rc; | 2162 | return rc; |
| 2169 | } | 2163 | } |
| 2170 | 2164 | ||
| 2171 | cFYI(1, ("readpage %p at offset %d 0x%x\n", | 2165 | cFYI(1, "readpage %p at offset %d 0x%x\n", |
| 2172 | page, (int)offset, (int)offset)); | 2166 | page, (int)offset, (int)offset); |
| 2173 | 2167 | ||
| 2174 | rc = cifs_readpage_worker(file, page, &offset); | 2168 | rc = cifs_readpage_worker(file, page, &offset); |
| 2175 | 2169 | ||
| @@ -2239,7 +2233,7 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping, | |||
| 2239 | struct page *page; | 2233 | struct page *page; |
| 2240 | int rc = 0; | 2234 | int rc = 0; |
| 2241 | 2235 | ||
| 2242 | cFYI(1, ("write_begin from %lld len %d", (long long)pos, len)); | 2236 | cFYI(1, "write_begin from %lld len %d", (long long)pos, len); |
| 2243 | 2237 | ||
| 2244 | page = grab_cache_page_write_begin(mapping, index, flags); | 2238 | page = grab_cache_page_write_begin(mapping, index, flags); |
| 2245 | if (!page) { | 2239 | if (!page) { |
| @@ -2311,12 +2305,10 @@ cifs_oplock_break(struct slow_work *work) | |||
| 2311 | int rc, waitrc = 0; | 2305 | int rc, waitrc = 0; |
| 2312 | 2306 | ||
| 2313 | if (inode && S_ISREG(inode->i_mode)) { | 2307 | if (inode && S_ISREG(inode->i_mode)) { |
| 2314 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 2308 | if (cinode->clientCanCacheRead) |
| 2315 | if (cinode->clientCanCacheAll == 0) | ||
| 2316 | break_lease(inode, O_RDONLY); | 2309 | break_lease(inode, O_RDONLY); |
| 2317 | else if (cinode->clientCanCacheRead == 0) | 2310 | else |
| 2318 | break_lease(inode, O_WRONLY); | 2311 | break_lease(inode, O_WRONLY); |
| 2319 | #endif | ||
| 2320 | rc = filemap_fdatawrite(inode->i_mapping); | 2312 | rc = filemap_fdatawrite(inode->i_mapping); |
| 2321 | if (cinode->clientCanCacheRead == 0) { | 2313 | if (cinode->clientCanCacheRead == 0) { |
| 2322 | waitrc = filemap_fdatawait(inode->i_mapping); | 2314 | waitrc = filemap_fdatawait(inode->i_mapping); |
| @@ -2326,7 +2318,7 @@ cifs_oplock_break(struct slow_work *work) | |||
| 2326 | rc = waitrc; | 2318 | rc = waitrc; |
| 2327 | if (rc) | 2319 | if (rc) |
| 2328 | cinode->write_behind_rc = rc; | 2320 | cinode->write_behind_rc = rc; |
| 2329 | cFYI(1, ("Oplock flush inode %p rc %d", inode, rc)); | 2321 | cFYI(1, "Oplock flush inode %p rc %d", inode, rc); |
| 2330 | } | 2322 | } |
| 2331 | 2323 | ||
| 2332 | /* | 2324 | /* |
| @@ -2338,7 +2330,7 @@ cifs_oplock_break(struct slow_work *work) | |||
| 2338 | if (!cfile->closePend && !cfile->oplock_break_cancelled) { | 2330 | if (!cfile->closePend && !cfile->oplock_break_cancelled) { |
| 2339 | rc = CIFSSMBLock(0, cifs_sb->tcon, cfile->netfid, 0, 0, 0, 0, | 2331 | rc = CIFSSMBLock(0, cifs_sb->tcon, cfile->netfid, 0, 0, 0, 0, |
| 2340 | LOCKING_ANDX_OPLOCK_RELEASE, false); | 2332 | LOCKING_ANDX_OPLOCK_RELEASE, false); |
| 2341 | cFYI(1, ("Oplock release rc = %d", rc)); | 2333 | cFYI(1, "Oplock release rc = %d", rc); |
| 2342 | } | 2334 | } |
| 2343 | } | 2335 | } |
| 2344 | 2336 | ||
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 35ec11716213..62b324f26a56 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * fs/cifs/inode.c | 2 | * fs/cifs/inode.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) International Business Machines Corp., 2002,2008 | 4 | * Copyright (C) International Business Machines Corp., 2002,2010 |
| 5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
| 6 | * | 6 | * |
| 7 | * This library is free software; you can redistribute it and/or modify | 7 | * This library is free software; you can redistribute it and/or modify |
| @@ -86,30 +86,30 @@ cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr) | |||
| 86 | { | 86 | { |
| 87 | struct cifsInodeInfo *cifs_i = CIFS_I(inode); | 87 | struct cifsInodeInfo *cifs_i = CIFS_I(inode); |
| 88 | 88 | ||
| 89 | cFYI(1, ("%s: revalidating inode %llu", __func__, cifs_i->uniqueid)); | 89 | cFYI(1, "%s: revalidating inode %llu", __func__, cifs_i->uniqueid); |
| 90 | 90 | ||
| 91 | if (inode->i_state & I_NEW) { | 91 | if (inode->i_state & I_NEW) { |
| 92 | cFYI(1, ("%s: inode %llu is new", __func__, cifs_i->uniqueid)); | 92 | cFYI(1, "%s: inode %llu is new", __func__, cifs_i->uniqueid); |
| 93 | return; | 93 | return; |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | /* don't bother with revalidation if we have an oplock */ | 96 | /* don't bother with revalidation if we have an oplock */ |
| 97 | if (cifs_i->clientCanCacheRead) { | 97 | if (cifs_i->clientCanCacheRead) { |
| 98 | cFYI(1, ("%s: inode %llu is oplocked", __func__, | 98 | cFYI(1, "%s: inode %llu is oplocked", __func__, |
| 99 | cifs_i->uniqueid)); | 99 | cifs_i->uniqueid); |
| 100 | return; | 100 | return; |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | /* revalidate if mtime or size have changed */ | 103 | /* revalidate if mtime or size have changed */ |
| 104 | if (timespec_equal(&inode->i_mtime, &fattr->cf_mtime) && | 104 | if (timespec_equal(&inode->i_mtime, &fattr->cf_mtime) && |
| 105 | cifs_i->server_eof == fattr->cf_eof) { | 105 | cifs_i->server_eof == fattr->cf_eof) { |
| 106 | cFYI(1, ("%s: inode %llu is unchanged", __func__, | 106 | cFYI(1, "%s: inode %llu is unchanged", __func__, |
| 107 | cifs_i->uniqueid)); | 107 | cifs_i->uniqueid); |
| 108 | return; | 108 | return; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | cFYI(1, ("%s: invalidating inode %llu mapping", __func__, | 111 | cFYI(1, "%s: invalidating inode %llu mapping", __func__, |
| 112 | cifs_i->uniqueid)); | 112 | cifs_i->uniqueid); |
| 113 | cifs_i->invalid_mapping = true; | 113 | cifs_i->invalid_mapping = true; |
| 114 | } | 114 | } |
| 115 | 115 | ||
| @@ -137,15 +137,14 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) | |||
| 137 | inode->i_mode = fattr->cf_mode; | 137 | inode->i_mode = fattr->cf_mode; |
| 138 | 138 | ||
| 139 | cifs_i->cifsAttrs = fattr->cf_cifsattrs; | 139 | cifs_i->cifsAttrs = fattr->cf_cifsattrs; |
| 140 | cifs_i->uniqueid = fattr->cf_uniqueid; | ||
| 141 | 140 | ||
| 142 | if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL) | 141 | if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL) |
| 143 | cifs_i->time = 0; | 142 | cifs_i->time = 0; |
| 144 | else | 143 | else |
| 145 | cifs_i->time = jiffies; | 144 | cifs_i->time = jiffies; |
| 146 | 145 | ||
| 147 | cFYI(1, ("inode 0x%p old_time=%ld new_time=%ld", inode, | 146 | cFYI(1, "inode 0x%p old_time=%ld new_time=%ld", inode, |
| 148 | oldtime, cifs_i->time)); | 147 | oldtime, cifs_i->time); |
| 149 | 148 | ||
| 150 | cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING; | 149 | cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING; |
| 151 | 150 | ||
| @@ -170,6 +169,17 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) | |||
| 170 | cifs_set_ops(inode, fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL); | 169 | cifs_set_ops(inode, fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL); |
| 171 | } | 170 | } |
| 172 | 171 | ||
| 172 | void | ||
| 173 | cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr) | ||
| 174 | { | ||
| 175 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | ||
| 176 | |||
| 177 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) | ||
| 178 | return; | ||
| 179 | |||
| 180 | fattr->cf_uniqueid = iunique(sb, ROOT_I); | ||
| 181 | } | ||
| 182 | |||
| 173 | /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */ | 183 | /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */ |
| 174 | void | 184 | void |
| 175 | cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info, | 185 | cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info, |
| @@ -227,7 +237,7 @@ cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info, | |||
| 227 | /* safest to call it a file if we do not know */ | 237 | /* safest to call it a file if we do not know */ |
| 228 | fattr->cf_mode |= S_IFREG; | 238 | fattr->cf_mode |= S_IFREG; |
| 229 | fattr->cf_dtype = DT_REG; | 239 | fattr->cf_dtype = DT_REG; |
| 230 | cFYI(1, ("unknown type %d", le32_to_cpu(info->Type))); | 240 | cFYI(1, "unknown type %d", le32_to_cpu(info->Type)); |
| 231 | break; | 241 | break; |
| 232 | } | 242 | } |
| 233 | 243 | ||
| @@ -256,7 +266,7 @@ cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb) | |||
| 256 | { | 266 | { |
| 257 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | 267 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
| 258 | 268 | ||
| 259 | cFYI(1, ("creating fake fattr for DFS referral")); | 269 | cFYI(1, "creating fake fattr for DFS referral"); |
| 260 | 270 | ||
| 261 | memset(fattr, 0, sizeof(*fattr)); | 271 | memset(fattr, 0, sizeof(*fattr)); |
| 262 | fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU; | 272 | fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU; |
| @@ -305,7 +315,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
| 305 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | 315 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
| 306 | 316 | ||
| 307 | tcon = cifs_sb->tcon; | 317 | tcon = cifs_sb->tcon; |
| 308 | cFYI(1, ("Getting info on %s", full_path)); | 318 | cFYI(1, "Getting info on %s", full_path); |
| 309 | 319 | ||
| 310 | /* could have done a find first instead but this returns more info */ | 320 | /* could have done a find first instead but this returns more info */ |
| 311 | rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data, | 321 | rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data, |
| @@ -323,6 +333,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
| 323 | 333 | ||
| 324 | if (*pinode == NULL) { | 334 | if (*pinode == NULL) { |
| 325 | /* get new inode */ | 335 | /* get new inode */ |
| 336 | cifs_fill_uniqueid(sb, &fattr); | ||
| 326 | *pinode = cifs_iget(sb, &fattr); | 337 | *pinode = cifs_iget(sb, &fattr); |
| 327 | if (!*pinode) | 338 | if (!*pinode) |
| 328 | rc = -ENOMEM; | 339 | rc = -ENOMEM; |
| @@ -373,7 +384,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path, | |||
| 373 | &bytes_read, &pbuf, &buf_type); | 384 | &bytes_read, &pbuf, &buf_type); |
| 374 | if ((rc == 0) && (bytes_read >= 8)) { | 385 | if ((rc == 0) && (bytes_read >= 8)) { |
| 375 | if (memcmp("IntxBLK", pbuf, 8) == 0) { | 386 | if (memcmp("IntxBLK", pbuf, 8) == 0) { |
| 376 | cFYI(1, ("Block device")); | 387 | cFYI(1, "Block device"); |
| 377 | fattr->cf_mode |= S_IFBLK; | 388 | fattr->cf_mode |= S_IFBLK; |
| 378 | fattr->cf_dtype = DT_BLK; | 389 | fattr->cf_dtype = DT_BLK; |
| 379 | if (bytes_read == 24) { | 390 | if (bytes_read == 24) { |
| @@ -385,7 +396,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path, | |||
| 385 | fattr->cf_rdev = MKDEV(mjr, mnr); | 396 | fattr->cf_rdev = MKDEV(mjr, mnr); |
| 386 | } | 397 | } |
| 387 | } else if (memcmp("IntxCHR", pbuf, 8) == 0) { | 398 | } else if (memcmp("IntxCHR", pbuf, 8) == 0) { |
| 388 | cFYI(1, ("Char device")); | 399 | cFYI(1, "Char device"); |
| 389 | fattr->cf_mode |= S_IFCHR; | 400 | fattr->cf_mode |= S_IFCHR; |
| 390 | fattr->cf_dtype = DT_CHR; | 401 | fattr->cf_dtype = DT_CHR; |
| 391 | if (bytes_read == 24) { | 402 | if (bytes_read == 24) { |
| @@ -397,7 +408,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path, | |||
| 397 | fattr->cf_rdev = MKDEV(mjr, mnr); | 408 | fattr->cf_rdev = MKDEV(mjr, mnr); |
| 398 | } | 409 | } |
| 399 | } else if (memcmp("IntxLNK", pbuf, 7) == 0) { | 410 | } else if (memcmp("IntxLNK", pbuf, 7) == 0) { |
| 400 | cFYI(1, ("Symlink")); | 411 | cFYI(1, "Symlink"); |
| 401 | fattr->cf_mode |= S_IFLNK; | 412 | fattr->cf_mode |= S_IFLNK; |
| 402 | fattr->cf_dtype = DT_LNK; | 413 | fattr->cf_dtype = DT_LNK; |
| 403 | } else { | 414 | } else { |
| @@ -439,10 +450,10 @@ static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path, | |||
| 439 | else if (rc > 3) { | 450 | else if (rc > 3) { |
| 440 | mode = le32_to_cpu(*((__le32 *)ea_value)); | 451 | mode = le32_to_cpu(*((__le32 *)ea_value)); |
| 441 | fattr->cf_mode &= ~SFBITS_MASK; | 452 | fattr->cf_mode &= ~SFBITS_MASK; |
| 442 | cFYI(1, ("special bits 0%o org mode 0%o", mode, | 453 | cFYI(1, "special bits 0%o org mode 0%o", mode, |
| 443 | fattr->cf_mode)); | 454 | fattr->cf_mode); |
| 444 | fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode; | 455 | fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode; |
| 445 | cFYI(1, ("special mode bits 0%o", mode)); | 456 | cFYI(1, "special mode bits 0%o", mode); |
| 446 | } | 457 | } |
| 447 | 458 | ||
| 448 | return 0; | 459 | return 0; |
| @@ -548,11 +559,11 @@ int cifs_get_inode_info(struct inode **pinode, | |||
| 548 | struct cifs_fattr fattr; | 559 | struct cifs_fattr fattr; |
| 549 | 560 | ||
| 550 | pTcon = cifs_sb->tcon; | 561 | pTcon = cifs_sb->tcon; |
| 551 | cFYI(1, ("Getting info on %s", full_path)); | 562 | cFYI(1, "Getting info on %s", full_path); |
| 552 | 563 | ||
| 553 | if ((pfindData == NULL) && (*pinode != NULL)) { | 564 | if ((pfindData == NULL) && (*pinode != NULL)) { |
| 554 | if (CIFS_I(*pinode)->clientCanCacheRead) { | 565 | if (CIFS_I(*pinode)->clientCanCacheRead) { |
| 555 | cFYI(1, ("No need to revalidate cached inode sizes")); | 566 | cFYI(1, "No need to revalidate cached inode sizes"); |
| 556 | return rc; | 567 | return rc; |
| 557 | } | 568 | } |
| 558 | } | 569 | } |
| @@ -618,7 +629,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
| 618 | cifs_sb->mnt_cifs_flags & | 629 | cifs_sb->mnt_cifs_flags & |
| 619 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 630 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 620 | if (rc1 || !fattr.cf_uniqueid) { | 631 | if (rc1 || !fattr.cf_uniqueid) { |
| 621 | cFYI(1, ("GetSrvInodeNum rc %d", rc1)); | 632 | cFYI(1, "GetSrvInodeNum rc %d", rc1); |
| 622 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | 633 | fattr.cf_uniqueid = iunique(sb, ROOT_I); |
| 623 | cifs_autodisable_serverino(cifs_sb); | 634 | cifs_autodisable_serverino(cifs_sb); |
| 624 | } | 635 | } |
| @@ -634,13 +645,13 @@ int cifs_get_inode_info(struct inode **pinode, | |||
| 634 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { | 645 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { |
| 635 | tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid); | 646 | tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid); |
| 636 | if (tmprc) | 647 | if (tmprc) |
| 637 | cFYI(1, ("cifs_sfu_type failed: %d", tmprc)); | 648 | cFYI(1, "cifs_sfu_type failed: %d", tmprc); |
| 638 | } | 649 | } |
| 639 | 650 | ||
| 640 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 651 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
| 641 | /* fill in 0777 bits from ACL */ | 652 | /* fill in 0777 bits from ACL */ |
| 642 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { | 653 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { |
| 643 | cFYI(1, ("Getting mode bits from ACL")); | 654 | cFYI(1, "Getting mode bits from ACL"); |
| 644 | cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, pfid); | 655 | cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, pfid); |
| 645 | } | 656 | } |
| 646 | #endif | 657 | #endif |
| @@ -715,6 +726,16 @@ cifs_find_inode(struct inode *inode, void *opaque) | |||
| 715 | if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) | 726 | if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) |
| 716 | return 0; | 727 | return 0; |
| 717 | 728 | ||
| 729 | /* | ||
| 730 | * uh oh -- it's a directory. We can't use it since hardlinked dirs are | ||
| 731 | * verboten. Disable serverino and return it as if it were found, the | ||
| 732 | * caller can discard it, generate a uniqueid and retry the find | ||
| 733 | */ | ||
| 734 | if (S_ISDIR(inode->i_mode) && !list_empty(&inode->i_dentry)) { | ||
| 735 | fattr->cf_flags |= CIFS_FATTR_INO_COLLISION; | ||
| 736 | cifs_autodisable_serverino(CIFS_SB(inode->i_sb)); | ||
| 737 | } | ||
| 738 | |||
| 718 | return 1; | 739 | return 1; |
| 719 | } | 740 | } |
| 720 | 741 | ||
| @@ -734,15 +755,22 @@ cifs_iget(struct super_block *sb, struct cifs_fattr *fattr) | |||
| 734 | unsigned long hash; | 755 | unsigned long hash; |
| 735 | struct inode *inode; | 756 | struct inode *inode; |
| 736 | 757 | ||
| 737 | cFYI(1, ("looking for uniqueid=%llu", fattr->cf_uniqueid)); | 758 | retry_iget5_locked: |
| 759 | cFYI(1, "looking for uniqueid=%llu", fattr->cf_uniqueid); | ||
| 738 | 760 | ||
| 739 | /* hash down to 32-bits on 32-bit arch */ | 761 | /* hash down to 32-bits on 32-bit arch */ |
| 740 | hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid); | 762 | hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid); |
| 741 | 763 | ||
| 742 | inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr); | 764 | inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr); |
| 743 | |||
| 744 | /* we have fattrs in hand, update the inode */ | ||
| 745 | if (inode) { | 765 | if (inode) { |
| 766 | /* was there a problematic inode number collision? */ | ||
| 767 | if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) { | ||
| 768 | iput(inode); | ||
| 769 | fattr->cf_uniqueid = iunique(sb, ROOT_I); | ||
| 770 | fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION; | ||
| 771 | goto retry_iget5_locked; | ||
| 772 | } | ||
| 773 | |||
| 746 | cifs_fattr_to_inode(inode, fattr); | 774 | cifs_fattr_to_inode(inode, fattr); |
| 747 | if (sb->s_flags & MS_NOATIME) | 775 | if (sb->s_flags & MS_NOATIME) |
| 748 | inode->i_flags |= S_NOATIME | S_NOCMTIME; | 776 | inode->i_flags |= S_NOATIME | S_NOCMTIME; |
| @@ -780,7 +808,7 @@ struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino) | |||
| 780 | return ERR_PTR(-ENOMEM); | 808 | return ERR_PTR(-ENOMEM); |
| 781 | 809 | ||
| 782 | if (rc && cifs_sb->tcon->ipc) { | 810 | if (rc && cifs_sb->tcon->ipc) { |
| 783 | cFYI(1, ("ipc connection - fake read inode")); | 811 | cFYI(1, "ipc connection - fake read inode"); |
| 784 | inode->i_mode |= S_IFDIR; | 812 | inode->i_mode |= S_IFDIR; |
| 785 | inode->i_nlink = 2; | 813 | inode->i_nlink = 2; |
| 786 | inode->i_op = &cifs_ipc_inode_ops; | 814 | inode->i_op = &cifs_ipc_inode_ops; |
| @@ -842,7 +870,7 @@ cifs_set_file_info(struct inode *inode, struct iattr *attrs, int xid, | |||
| 842 | * server times. | 870 | * server times. |
| 843 | */ | 871 | */ |
| 844 | if (set_time && (attrs->ia_valid & ATTR_CTIME)) { | 872 | if (set_time && (attrs->ia_valid & ATTR_CTIME)) { |
| 845 | cFYI(1, ("CIFS - CTIME changed")); | 873 | cFYI(1, "CIFS - CTIME changed"); |
| 846 | info_buf.ChangeTime = | 874 | info_buf.ChangeTime = |
| 847 | cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime)); | 875 | cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime)); |
| 848 | } else | 876 | } else |
| @@ -877,8 +905,8 @@ cifs_set_file_info(struct inode *inode, struct iattr *attrs, int xid, | |||
| 877 | goto out; | 905 | goto out; |
| 878 | } | 906 | } |
| 879 | 907 | ||
| 880 | cFYI(1, ("calling SetFileInfo since SetPathInfo for " | 908 | cFYI(1, "calling SetFileInfo since SetPathInfo for " |
| 881 | "times not supported by this server")); | 909 | "times not supported by this server"); |
| 882 | rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, | 910 | rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, |
| 883 | SYNCHRONIZE | FILE_WRITE_ATTRIBUTES, | 911 | SYNCHRONIZE | FILE_WRITE_ATTRIBUTES, |
| 884 | CREATE_NOT_DIR, &netfid, &oplock, | 912 | CREATE_NOT_DIR, &netfid, &oplock, |
| @@ -1036,7 +1064,7 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) | |||
| 1036 | struct iattr *attrs = NULL; | 1064 | struct iattr *attrs = NULL; |
| 1037 | __u32 dosattr = 0, origattr = 0; | 1065 | __u32 dosattr = 0, origattr = 0; |
| 1038 | 1066 | ||
| 1039 | cFYI(1, ("cifs_unlink, dir=0x%p, dentry=0x%p", dir, dentry)); | 1067 | cFYI(1, "cifs_unlink, dir=0x%p, dentry=0x%p", dir, dentry); |
| 1040 | 1068 | ||
| 1041 | xid = GetXid(); | 1069 | xid = GetXid(); |
| 1042 | 1070 | ||
| @@ -1055,7 +1083,7 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) | |||
| 1055 | rc = CIFSPOSIXDelFile(xid, tcon, full_path, | 1083 | rc = CIFSPOSIXDelFile(xid, tcon, full_path, |
| 1056 | SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls, | 1084 | SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls, |
| 1057 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 1085 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 1058 | cFYI(1, ("posix del rc %d", rc)); | 1086 | cFYI(1, "posix del rc %d", rc); |
| 1059 | if ((rc == 0) || (rc == -ENOENT)) | 1087 | if ((rc == 0) || (rc == -ENOENT)) |
| 1060 | goto psx_del_no_retry; | 1088 | goto psx_del_no_retry; |
| 1061 | } | 1089 | } |
| @@ -1129,7 +1157,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
| 1129 | struct inode *newinode = NULL; | 1157 | struct inode *newinode = NULL; |
| 1130 | struct cifs_fattr fattr; | 1158 | struct cifs_fattr fattr; |
| 1131 | 1159 | ||
| 1132 | cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p", mode, inode)); | 1160 | cFYI(1, "In cifs_mkdir, mode = 0x%x inode = 0x%p", mode, inode); |
| 1133 | 1161 | ||
| 1134 | xid = GetXid(); | 1162 | xid = GetXid(); |
| 1135 | 1163 | ||
| @@ -1164,7 +1192,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
| 1164 | kfree(pInfo); | 1192 | kfree(pInfo); |
| 1165 | goto mkdir_retry_old; | 1193 | goto mkdir_retry_old; |
| 1166 | } else if (rc) { | 1194 | } else if (rc) { |
| 1167 | cFYI(1, ("posix mkdir returned 0x%x", rc)); | 1195 | cFYI(1, "posix mkdir returned 0x%x", rc); |
| 1168 | d_drop(direntry); | 1196 | d_drop(direntry); |
| 1169 | } else { | 1197 | } else { |
| 1170 | if (pInfo->Type == cpu_to_le32(-1)) { | 1198 | if (pInfo->Type == cpu_to_le32(-1)) { |
| @@ -1181,6 +1209,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
| 1181 | direntry->d_op = &cifs_dentry_ops; | 1209 | direntry->d_op = &cifs_dentry_ops; |
| 1182 | 1210 | ||
| 1183 | cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb); | 1211 | cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb); |
| 1212 | cifs_fill_uniqueid(inode->i_sb, &fattr); | ||
| 1184 | newinode = cifs_iget(inode->i_sb, &fattr); | 1213 | newinode = cifs_iget(inode->i_sb, &fattr); |
| 1185 | if (!newinode) { | 1214 | if (!newinode) { |
| 1186 | kfree(pInfo); | 1215 | kfree(pInfo); |
| @@ -1190,12 +1219,12 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
| 1190 | d_instantiate(direntry, newinode); | 1219 | d_instantiate(direntry, newinode); |
| 1191 | 1220 | ||
| 1192 | #ifdef CONFIG_CIFS_DEBUG2 | 1221 | #ifdef CONFIG_CIFS_DEBUG2 |
| 1193 | cFYI(1, ("instantiated dentry %p %s to inode %p", | 1222 | cFYI(1, "instantiated dentry %p %s to inode %p", |
| 1194 | direntry, direntry->d_name.name, newinode)); | 1223 | direntry, direntry->d_name.name, newinode); |
| 1195 | 1224 | ||
| 1196 | if (newinode->i_nlink != 2) | 1225 | if (newinode->i_nlink != 2) |
| 1197 | cFYI(1, ("unexpected number of links %d", | 1226 | cFYI(1, "unexpected number of links %d", |
| 1198 | newinode->i_nlink)); | 1227 | newinode->i_nlink); |
| 1199 | #endif | 1228 | #endif |
| 1200 | } | 1229 | } |
| 1201 | kfree(pInfo); | 1230 | kfree(pInfo); |
| @@ -1206,7 +1235,7 @@ mkdir_retry_old: | |||
| 1206 | rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls, | 1235 | rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls, |
| 1207 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 1236 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 1208 | if (rc) { | 1237 | if (rc) { |
| 1209 | cFYI(1, ("cifs_mkdir returned 0x%x", rc)); | 1238 | cFYI(1, "cifs_mkdir returned 0x%x", rc); |
| 1210 | d_drop(direntry); | 1239 | d_drop(direntry); |
| 1211 | } else { | 1240 | } else { |
| 1212 | mkdir_get_info: | 1241 | mkdir_get_info: |
| @@ -1309,7 +1338,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) | |||
| 1309 | char *full_path = NULL; | 1338 | char *full_path = NULL; |
| 1310 | struct cifsInodeInfo *cifsInode; | 1339 | struct cifsInodeInfo *cifsInode; |
| 1311 | 1340 | ||
| 1312 | cFYI(1, ("cifs_rmdir, inode = 0x%p", inode)); | 1341 | cFYI(1, "cifs_rmdir, inode = 0x%p", inode); |
| 1313 | 1342 | ||
| 1314 | xid = GetXid(); | 1343 | xid = GetXid(); |
| 1315 | 1344 | ||
| @@ -1511,6 +1540,11 @@ cifs_inode_needs_reval(struct inode *inode) | |||
| 1511 | if (time_after_eq(jiffies, cifs_i->time + HZ)) | 1540 | if (time_after_eq(jiffies, cifs_i->time + HZ)) |
| 1512 | return true; | 1541 | return true; |
| 1513 | 1542 | ||
| 1543 | /* hardlinked files w/ noserverino get "special" treatment */ | ||
| 1544 | if (!(CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) && | ||
| 1545 | S_ISREG(inode->i_mode) && inode->i_nlink != 1) | ||
| 1546 | return true; | ||
| 1547 | |||
| 1514 | return false; | 1548 | return false; |
| 1515 | } | 1549 | } |
| 1516 | 1550 | ||
| @@ -1577,9 +1611,9 @@ int cifs_revalidate_dentry(struct dentry *dentry) | |||
| 1577 | goto check_inval; | 1611 | goto check_inval; |
| 1578 | } | 1612 | } |
| 1579 | 1613 | ||
| 1580 | cFYI(1, ("Revalidate: %s inode 0x%p count %d dentry: 0x%p d_time %ld " | 1614 | cFYI(1, "Revalidate: %s inode 0x%p count %d dentry: 0x%p d_time %ld " |
| 1581 | "jiffies %ld", full_path, inode, inode->i_count.counter, | 1615 | "jiffies %ld", full_path, inode, inode->i_count.counter, |
| 1582 | dentry, dentry->d_time, jiffies)); | 1616 | dentry, dentry->d_time, jiffies); |
| 1583 | 1617 | ||
| 1584 | if (CIFS_SB(sb)->tcon->unix_ext) | 1618 | if (CIFS_SB(sb)->tcon->unix_ext) |
| 1585 | rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid); | 1619 | rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid); |
| @@ -1673,12 +1707,12 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs, | |||
| 1673 | rc = CIFSSMBSetFileSize(xid, pTcon, attrs->ia_size, nfid, | 1707 | rc = CIFSSMBSetFileSize(xid, pTcon, attrs->ia_size, nfid, |
| 1674 | npid, false); | 1708 | npid, false); |
| 1675 | cifsFileInfo_put(open_file); | 1709 | cifsFileInfo_put(open_file); |
| 1676 | cFYI(1, ("SetFSize for attrs rc = %d", rc)); | 1710 | cFYI(1, "SetFSize for attrs rc = %d", rc); |
| 1677 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | 1711 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
| 1678 | unsigned int bytes_written; | 1712 | unsigned int bytes_written; |
| 1679 | rc = CIFSSMBWrite(xid, pTcon, nfid, 0, attrs->ia_size, | 1713 | rc = CIFSSMBWrite(xid, pTcon, nfid, 0, attrs->ia_size, |
| 1680 | &bytes_written, NULL, NULL, 1); | 1714 | &bytes_written, NULL, NULL, 1); |
| 1681 | cFYI(1, ("Wrt seteof rc %d", rc)); | 1715 | cFYI(1, "Wrt seteof rc %d", rc); |
| 1682 | } | 1716 | } |
| 1683 | } else | 1717 | } else |
| 1684 | rc = -EINVAL; | 1718 | rc = -EINVAL; |
| @@ -1692,7 +1726,7 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs, | |||
| 1692 | false, cifs_sb->local_nls, | 1726 | false, cifs_sb->local_nls, |
| 1693 | cifs_sb->mnt_cifs_flags & | 1727 | cifs_sb->mnt_cifs_flags & |
| 1694 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 1728 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 1695 | cFYI(1, ("SetEOF by path (setattrs) rc = %d", rc)); | 1729 | cFYI(1, "SetEOF by path (setattrs) rc = %d", rc); |
| 1696 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | 1730 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
| 1697 | __u16 netfid; | 1731 | __u16 netfid; |
| 1698 | int oplock = 0; | 1732 | int oplock = 0; |
| @@ -1709,7 +1743,7 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs, | |||
| 1709 | attrs->ia_size, | 1743 | attrs->ia_size, |
| 1710 | &bytes_written, NULL, | 1744 | &bytes_written, NULL, |
| 1711 | NULL, 1); | 1745 | NULL, 1); |
| 1712 | cFYI(1, ("wrt seteof rc %d", rc)); | 1746 | cFYI(1, "wrt seteof rc %d", rc); |
| 1713 | CIFSSMBClose(xid, pTcon, netfid); | 1747 | CIFSSMBClose(xid, pTcon, netfid); |
| 1714 | } | 1748 | } |
| 1715 | } | 1749 | } |
| @@ -1737,8 +1771,8 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) | |||
| 1737 | struct cifs_unix_set_info_args *args = NULL; | 1771 | struct cifs_unix_set_info_args *args = NULL; |
| 1738 | struct cifsFileInfo *open_file; | 1772 | struct cifsFileInfo *open_file; |
| 1739 | 1773 | ||
| 1740 | cFYI(1, ("setattr_unix on file %s attrs->ia_valid=0x%x", | 1774 | cFYI(1, "setattr_unix on file %s attrs->ia_valid=0x%x", |
| 1741 | direntry->d_name.name, attrs->ia_valid)); | 1775 | direntry->d_name.name, attrs->ia_valid); |
| 1742 | 1776 | ||
| 1743 | xid = GetXid(); | 1777 | xid = GetXid(); |
| 1744 | 1778 | ||
| @@ -1868,8 +1902,8 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) | |||
| 1868 | 1902 | ||
| 1869 | xid = GetXid(); | 1903 | xid = GetXid(); |
| 1870 | 1904 | ||
| 1871 | cFYI(1, ("setattr on file %s attrs->iavalid 0x%x", | 1905 | cFYI(1, "setattr on file %s attrs->iavalid 0x%x", |
| 1872 | direntry->d_name.name, attrs->ia_valid)); | 1906 | direntry->d_name.name, attrs->ia_valid); |
| 1873 | 1907 | ||
| 1874 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) { | 1908 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) { |
| 1875 | /* check if we have permission to change attrs */ | 1909 | /* check if we have permission to change attrs */ |
| @@ -1926,7 +1960,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) | |||
| 1926 | attrs->ia_valid &= ~ATTR_MODE; | 1960 | attrs->ia_valid &= ~ATTR_MODE; |
| 1927 | 1961 | ||
| 1928 | if (attrs->ia_valid & ATTR_MODE) { | 1962 | if (attrs->ia_valid & ATTR_MODE) { |
| 1929 | cFYI(1, ("Mode changed to 0%o", attrs->ia_mode)); | 1963 | cFYI(1, "Mode changed to 0%o", attrs->ia_mode); |
| 1930 | mode = attrs->ia_mode; | 1964 | mode = attrs->ia_mode; |
| 1931 | } | 1965 | } |
| 1932 | 1966 | ||
| @@ -2012,7 +2046,7 @@ cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
| 2012 | #if 0 | 2046 | #if 0 |
| 2013 | void cifs_delete_inode(struct inode *inode) | 2047 | void cifs_delete_inode(struct inode *inode) |
| 2014 | { | 2048 | { |
| 2015 | cFYI(1, ("In cifs_delete_inode, inode = 0x%p", inode)); | 2049 | cFYI(1, "In cifs_delete_inode, inode = 0x%p", inode); |
| 2016 | /* may have to add back in if and when safe distributed caching of | 2050 | /* may have to add back in if and when safe distributed caching of |
| 2017 | directories added e.g. via FindNotify */ | 2051 | directories added e.g. via FindNotify */ |
| 2018 | } | 2052 | } |
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index f94650683a00..505926f1ee6b 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
| @@ -47,7 +47,7 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg) | |||
| 47 | 47 | ||
| 48 | xid = GetXid(); | 48 | xid = GetXid(); |
| 49 | 49 | ||
| 50 | cFYI(1, ("ioctl file %p cmd %u arg %lu", filep, command, arg)); | 50 | cFYI(1, "ioctl file %p cmd %u arg %lu", filep, command, arg); |
| 51 | 51 | ||
| 52 | cifs_sb = CIFS_SB(inode->i_sb); | 52 | cifs_sb = CIFS_SB(inode->i_sb); |
| 53 | 53 | ||
| @@ -64,12 +64,12 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg) | |||
| 64 | 64 | ||
| 65 | switch (command) { | 65 | switch (command) { |
| 66 | case CIFS_IOC_CHECKUMOUNT: | 66 | case CIFS_IOC_CHECKUMOUNT: |
| 67 | cFYI(1, ("User unmount attempted")); | 67 | cFYI(1, "User unmount attempted"); |
| 68 | if (cifs_sb->mnt_uid == current_uid()) | 68 | if (cifs_sb->mnt_uid == current_uid()) |
| 69 | rc = 0; | 69 | rc = 0; |
| 70 | else { | 70 | else { |
| 71 | rc = -EACCES; | 71 | rc = -EACCES; |
| 72 | cFYI(1, ("uids do not match")); | 72 | cFYI(1, "uids do not match"); |
| 73 | } | 73 | } |
| 74 | break; | 74 | break; |
| 75 | #ifdef CONFIG_CIFS_POSIX | 75 | #ifdef CONFIG_CIFS_POSIX |
| @@ -97,11 +97,11 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg) | |||
| 97 | /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, | 97 | /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, |
| 98 | extAttrBits, &ExtAttrMask);*/ | 98 | extAttrBits, &ExtAttrMask);*/ |
| 99 | } | 99 | } |
| 100 | cFYI(1, ("set flags not implemented yet")); | 100 | cFYI(1, "set flags not implemented yet"); |
| 101 | break; | 101 | break; |
| 102 | #endif /* CONFIG_CIFS_POSIX */ | 102 | #endif /* CONFIG_CIFS_POSIX */ |
| 103 | default: | 103 | default: |
| 104 | cFYI(1, ("unsupported ioctl")); | 104 | cFYI(1, "unsupported ioctl"); |
| 105 | break; | 105 | break; |
| 106 | } | 106 | } |
| 107 | 107 | ||
diff --git a/fs/cifs/link.c b/fs/cifs/link.c index c1a9d4236a8c..473ca8033656 100644 --- a/fs/cifs/link.c +++ b/fs/cifs/link.c | |||
| @@ -139,7 +139,7 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd) | |||
| 139 | if (!full_path) | 139 | if (!full_path) |
| 140 | goto out; | 140 | goto out; |
| 141 | 141 | ||
| 142 | cFYI(1, ("Full path: %s inode = 0x%p", full_path, inode)); | 142 | cFYI(1, "Full path: %s inode = 0x%p", full_path, inode); |
| 143 | 143 | ||
| 144 | rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, &target_path, | 144 | rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, &target_path, |
| 145 | cifs_sb->local_nls); | 145 | cifs_sb->local_nls); |
| @@ -178,8 +178,8 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) | |||
| 178 | return rc; | 178 | return rc; |
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | cFYI(1, ("Full path: %s", full_path)); | 181 | cFYI(1, "Full path: %s", full_path); |
| 182 | cFYI(1, ("symname is %s", symname)); | 182 | cFYI(1, "symname is %s", symname); |
| 183 | 183 | ||
| 184 | /* BB what if DFS and this volume is on different share? BB */ | 184 | /* BB what if DFS and this volume is on different share? BB */ |
| 185 | if (pTcon->unix_ext) | 185 | if (pTcon->unix_ext) |
| @@ -198,8 +198,8 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) | |||
| 198 | inode->i_sb, xid, NULL); | 198 | inode->i_sb, xid, NULL); |
| 199 | 199 | ||
| 200 | if (rc != 0) { | 200 | if (rc != 0) { |
| 201 | cFYI(1, ("Create symlink ok, getinodeinfo fail rc = %d", | 201 | cFYI(1, "Create symlink ok, getinodeinfo fail rc = %d", |
| 202 | rc)); | 202 | rc); |
| 203 | } else { | 203 | } else { |
| 204 | if (pTcon->nocase) | 204 | if (pTcon->nocase) |
| 205 | direntry->d_op = &cifs_ci_dentry_ops; | 205 | direntry->d_op = &cifs_ci_dentry_ops; |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index d1474996a812..1394aa37f26c 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
| @@ -51,7 +51,7 @@ _GetXid(void) | |||
| 51 | if (GlobalTotalActiveXid > GlobalMaxActiveXid) | 51 | if (GlobalTotalActiveXid > GlobalMaxActiveXid) |
| 52 | GlobalMaxActiveXid = GlobalTotalActiveXid; | 52 | GlobalMaxActiveXid = GlobalTotalActiveXid; |
| 53 | if (GlobalTotalActiveXid > 65000) | 53 | if (GlobalTotalActiveXid > 65000) |
| 54 | cFYI(1, ("warning: more than 65000 requests active")); | 54 | cFYI(1, "warning: more than 65000 requests active"); |
| 55 | xid = GlobalCurrentXid++; | 55 | xid = GlobalCurrentXid++; |
| 56 | spin_unlock(&GlobalMid_Lock); | 56 | spin_unlock(&GlobalMid_Lock); |
| 57 | return xid; | 57 | return xid; |
| @@ -88,7 +88,7 @@ void | |||
| 88 | sesInfoFree(struct cifsSesInfo *buf_to_free) | 88 | sesInfoFree(struct cifsSesInfo *buf_to_free) |
| 89 | { | 89 | { |
| 90 | if (buf_to_free == NULL) { | 90 | if (buf_to_free == NULL) { |
| 91 | cFYI(1, ("Null buffer passed to sesInfoFree")); | 91 | cFYI(1, "Null buffer passed to sesInfoFree"); |
| 92 | return; | 92 | return; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| @@ -126,7 +126,7 @@ void | |||
| 126 | tconInfoFree(struct cifsTconInfo *buf_to_free) | 126 | tconInfoFree(struct cifsTconInfo *buf_to_free) |
| 127 | { | 127 | { |
| 128 | if (buf_to_free == NULL) { | 128 | if (buf_to_free == NULL) { |
| 129 | cFYI(1, ("Null buffer passed to tconInfoFree")); | 129 | cFYI(1, "Null buffer passed to tconInfoFree"); |
| 130 | return; | 130 | return; |
| 131 | } | 131 | } |
| 132 | atomic_dec(&tconInfoAllocCount); | 132 | atomic_dec(&tconInfoAllocCount); |
| @@ -166,7 +166,7 @@ void | |||
| 166 | cifs_buf_release(void *buf_to_free) | 166 | cifs_buf_release(void *buf_to_free) |
| 167 | { | 167 | { |
| 168 | if (buf_to_free == NULL) { | 168 | if (buf_to_free == NULL) { |
| 169 | /* cFYI(1, ("Null buffer passed to cifs_buf_release"));*/ | 169 | /* cFYI(1, "Null buffer passed to cifs_buf_release");*/ |
| 170 | return; | 170 | return; |
| 171 | } | 171 | } |
| 172 | mempool_free(buf_to_free, cifs_req_poolp); | 172 | mempool_free(buf_to_free, cifs_req_poolp); |
| @@ -202,7 +202,7 @@ cifs_small_buf_release(void *buf_to_free) | |||
| 202 | { | 202 | { |
| 203 | 203 | ||
| 204 | if (buf_to_free == NULL) { | 204 | if (buf_to_free == NULL) { |
| 205 | cFYI(1, ("Null buffer passed to cifs_small_buf_release")); | 205 | cFYI(1, "Null buffer passed to cifs_small_buf_release"); |
| 206 | return; | 206 | return; |
| 207 | } | 207 | } |
| 208 | mempool_free(buf_to_free, cifs_sm_req_poolp); | 208 | mempool_free(buf_to_free, cifs_sm_req_poolp); |
| @@ -345,19 +345,19 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ , | |||
| 345 | /* with userid/password pairs found on the smb session */ | 345 | /* with userid/password pairs found on the smb session */ |
| 346 | /* for other target tcp/ip addresses BB */ | 346 | /* for other target tcp/ip addresses BB */ |
| 347 | if (current_fsuid() != treeCon->ses->linux_uid) { | 347 | if (current_fsuid() != treeCon->ses->linux_uid) { |
| 348 | cFYI(1, ("Multiuser mode and UID " | 348 | cFYI(1, "Multiuser mode and UID " |
| 349 | "did not match tcon uid")); | 349 | "did not match tcon uid"); |
| 350 | read_lock(&cifs_tcp_ses_lock); | 350 | read_lock(&cifs_tcp_ses_lock); |
| 351 | list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) { | 351 | list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) { |
| 352 | ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list); | 352 | ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list); |
| 353 | if (ses->linux_uid == current_fsuid()) { | 353 | if (ses->linux_uid == current_fsuid()) { |
| 354 | if (ses->server == treeCon->ses->server) { | 354 | if (ses->server == treeCon->ses->server) { |
| 355 | cFYI(1, ("found matching uid substitute right smb_uid")); | 355 | cFYI(1, "found matching uid substitute right smb_uid"); |
| 356 | buffer->Uid = ses->Suid; | 356 | buffer->Uid = ses->Suid; |
| 357 | break; | 357 | break; |
| 358 | } else { | 358 | } else { |
| 359 | /* BB eventually call cifs_setup_session here */ | 359 | /* BB eventually call cifs_setup_session here */ |
| 360 | cFYI(1, ("local UID found but no smb sess with this server exists")); | 360 | cFYI(1, "local UID found but no smb sess with this server exists"); |
| 361 | } | 361 | } |
| 362 | } | 362 | } |
| 363 | } | 363 | } |
| @@ -394,17 +394,16 @@ checkSMBhdr(struct smb_hdr *smb, __u16 mid) | |||
| 394 | if (smb->Command == SMB_COM_LOCKING_ANDX) | 394 | if (smb->Command == SMB_COM_LOCKING_ANDX) |
| 395 | return 0; | 395 | return 0; |
| 396 | else | 396 | else |
| 397 | cERROR(1, ("Received Request not response")); | 397 | cERROR(1, "Received Request not response"); |
| 398 | } | 398 | } |
| 399 | } else { /* bad signature or mid */ | 399 | } else { /* bad signature or mid */ |
| 400 | if (*(__le32 *) smb->Protocol != cpu_to_le32(0x424d53ff)) | 400 | if (*(__le32 *) smb->Protocol != cpu_to_le32(0x424d53ff)) |
| 401 | cERROR(1, | 401 | cERROR(1, "Bad protocol string signature header %x", |
| 402 | ("Bad protocol string signature header %x", | 402 | *(unsigned int *) smb->Protocol); |
| 403 | *(unsigned int *) smb->Protocol)); | ||
| 404 | if (mid != smb->Mid) | 403 | if (mid != smb->Mid) |
| 405 | cERROR(1, ("Mids do not match")); | 404 | cERROR(1, "Mids do not match"); |
| 406 | } | 405 | } |
| 407 | cERROR(1, ("bad smb detected. The Mid=%d", smb->Mid)); | 406 | cERROR(1, "bad smb detected. The Mid=%d", smb->Mid); |
| 408 | return 1; | 407 | return 1; |
| 409 | } | 408 | } |
| 410 | 409 | ||
| @@ -413,7 +412,7 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length) | |||
| 413 | { | 412 | { |
| 414 | __u32 len = smb->smb_buf_length; | 413 | __u32 len = smb->smb_buf_length; |
| 415 | __u32 clc_len; /* calculated length */ | 414 | __u32 clc_len; /* calculated length */ |
| 416 | cFYI(0, ("checkSMB Length: 0x%x, smb_buf_length: 0x%x", length, len)); | 415 | cFYI(0, "checkSMB Length: 0x%x, smb_buf_length: 0x%x", length, len); |
| 417 | 416 | ||
| 418 | if (length < 2 + sizeof(struct smb_hdr)) { | 417 | if (length < 2 + sizeof(struct smb_hdr)) { |
| 419 | if ((length >= sizeof(struct smb_hdr) - 1) | 418 | if ((length >= sizeof(struct smb_hdr) - 1) |
| @@ -437,15 +436,15 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length) | |||
| 437 | tmp[sizeof(struct smb_hdr)+1] = 0; | 436 | tmp[sizeof(struct smb_hdr)+1] = 0; |
| 438 | return 0; | 437 | return 0; |
| 439 | } | 438 | } |
| 440 | cERROR(1, ("rcvd invalid byte count (bcc)")); | 439 | cERROR(1, "rcvd invalid byte count (bcc)"); |
| 441 | } else { | 440 | } else { |
| 442 | cERROR(1, ("Length less than smb header size")); | 441 | cERROR(1, "Length less than smb header size"); |
| 443 | } | 442 | } |
| 444 | return 1; | 443 | return 1; |
| 445 | } | 444 | } |
| 446 | if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { | 445 | if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { |
| 447 | cERROR(1, ("smb length greater than MaxBufSize, mid=%d", | 446 | cERROR(1, "smb length greater than MaxBufSize, mid=%d", |
| 448 | smb->Mid)); | 447 | smb->Mid); |
| 449 | return 1; | 448 | return 1; |
| 450 | } | 449 | } |
| 451 | 450 | ||
| @@ -454,8 +453,8 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length) | |||
| 454 | clc_len = smbCalcSize_LE(smb); | 453 | clc_len = smbCalcSize_LE(smb); |
| 455 | 454 | ||
| 456 | if (4 + len != length) { | 455 | if (4 + len != length) { |
| 457 | cERROR(1, ("Length read does not match RFC1001 length %d", | 456 | cERROR(1, "Length read does not match RFC1001 length %d", |
| 458 | len)); | 457 | len); |
| 459 | return 1; | 458 | return 1; |
| 460 | } | 459 | } |
| 461 | 460 | ||
| @@ -466,8 +465,8 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length) | |||
| 466 | if (((4 + len) & 0xFFFF) == (clc_len & 0xFFFF)) | 465 | if (((4 + len) & 0xFFFF) == (clc_len & 0xFFFF)) |
| 467 | return 0; /* bcc wrapped */ | 466 | return 0; /* bcc wrapped */ |
| 468 | } | 467 | } |
| 469 | cFYI(1, ("Calculated size %d vs length %d mismatch for mid %d", | 468 | cFYI(1, "Calculated size %d vs length %d mismatch for mid %d", |
| 470 | clc_len, 4 + len, smb->Mid)); | 469 | clc_len, 4 + len, smb->Mid); |
| 471 | /* Windows XP can return a few bytes too much, presumably | 470 | /* Windows XP can return a few bytes too much, presumably |
| 472 | an illegal pad, at the end of byte range lock responses | 471 | an illegal pad, at the end of byte range lock responses |
| 473 | so we allow for that three byte pad, as long as actual | 472 | so we allow for that three byte pad, as long as actual |
| @@ -482,8 +481,8 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length) | |||
| 482 | if ((4+len > clc_len) && (len <= clc_len + 512)) | 481 | if ((4+len > clc_len) && (len <= clc_len + 512)) |
| 483 | return 0; | 482 | return 0; |
| 484 | else { | 483 | else { |
| 485 | cERROR(1, ("RFC1001 size %d bigger than SMB for Mid=%d", | 484 | cERROR(1, "RFC1001 size %d bigger than SMB for Mid=%d", |
| 486 | len, smb->Mid)); | 485 | len, smb->Mid); |
| 487 | return 1; | 486 | return 1; |
| 488 | } | 487 | } |
| 489 | } | 488 | } |
| @@ -501,7 +500,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 501 | struct cifsFileInfo *netfile; | 500 | struct cifsFileInfo *netfile; |
| 502 | int rc; | 501 | int rc; |
| 503 | 502 | ||
| 504 | cFYI(1, ("Checking for oplock break or dnotify response")); | 503 | cFYI(1, "Checking for oplock break or dnotify response"); |
| 505 | if ((pSMB->hdr.Command == SMB_COM_NT_TRANSACT) && | 504 | if ((pSMB->hdr.Command == SMB_COM_NT_TRANSACT) && |
| 506 | (pSMB->hdr.Flags & SMBFLG_RESPONSE)) { | 505 | (pSMB->hdr.Flags & SMBFLG_RESPONSE)) { |
| 507 | struct smb_com_transaction_change_notify_rsp *pSMBr = | 506 | struct smb_com_transaction_change_notify_rsp *pSMBr = |
| @@ -513,15 +512,15 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 513 | 512 | ||
| 514 | pnotify = (struct file_notify_information *) | 513 | pnotify = (struct file_notify_information *) |
| 515 | ((char *)&pSMBr->hdr.Protocol + data_offset); | 514 | ((char *)&pSMBr->hdr.Protocol + data_offset); |
| 516 | cFYI(1, ("dnotify on %s Action: 0x%x", | 515 | cFYI(1, "dnotify on %s Action: 0x%x", |
| 517 | pnotify->FileName, pnotify->Action)); | 516 | pnotify->FileName, pnotify->Action); |
| 518 | /* cifs_dump_mem("Rcvd notify Data: ",buf, | 517 | /* cifs_dump_mem("Rcvd notify Data: ",buf, |
| 519 | sizeof(struct smb_hdr)+60); */ | 518 | sizeof(struct smb_hdr)+60); */ |
| 520 | return true; | 519 | return true; |
| 521 | } | 520 | } |
| 522 | if (pSMBr->hdr.Status.CifsError) { | 521 | if (pSMBr->hdr.Status.CifsError) { |
| 523 | cFYI(1, ("notify err 0x%d", | 522 | cFYI(1, "notify err 0x%d", |
| 524 | pSMBr->hdr.Status.CifsError)); | 523 | pSMBr->hdr.Status.CifsError); |
| 525 | return true; | 524 | return true; |
| 526 | } | 525 | } |
| 527 | return false; | 526 | return false; |
| @@ -535,7 +534,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 535 | large dirty files cached on the client */ | 534 | large dirty files cached on the client */ |
| 536 | if ((NT_STATUS_INVALID_HANDLE) == | 535 | if ((NT_STATUS_INVALID_HANDLE) == |
| 537 | le32_to_cpu(pSMB->hdr.Status.CifsError)) { | 536 | le32_to_cpu(pSMB->hdr.Status.CifsError)) { |
| 538 | cFYI(1, ("invalid handle on oplock break")); | 537 | cFYI(1, "invalid handle on oplock break"); |
| 539 | return true; | 538 | return true; |
| 540 | } else if (ERRbadfid == | 539 | } else if (ERRbadfid == |
| 541 | le16_to_cpu(pSMB->hdr.Status.DosError.Error)) { | 540 | le16_to_cpu(pSMB->hdr.Status.DosError.Error)) { |
| @@ -547,8 +546,8 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 547 | if (pSMB->hdr.WordCount != 8) | 546 | if (pSMB->hdr.WordCount != 8) |
| 548 | return false; | 547 | return false; |
| 549 | 548 | ||
| 550 | cFYI(1, ("oplock type 0x%d level 0x%d", | 549 | cFYI(1, "oplock type 0x%d level 0x%d", |
| 551 | pSMB->LockType, pSMB->OplockLevel)); | 550 | pSMB->LockType, pSMB->OplockLevel); |
| 552 | if (!(pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE)) | 551 | if (!(pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE)) |
| 553 | return false; | 552 | return false; |
| 554 | 553 | ||
| @@ -579,15 +578,15 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 579 | return true; | 578 | return true; |
| 580 | } | 579 | } |
| 581 | 580 | ||
| 582 | cFYI(1, ("file id match, oplock break")); | 581 | cFYI(1, "file id match, oplock break"); |
| 583 | pCifsInode = CIFS_I(netfile->pInode); | 582 | pCifsInode = CIFS_I(netfile->pInode); |
| 584 | pCifsInode->clientCanCacheAll = false; | 583 | pCifsInode->clientCanCacheAll = false; |
| 585 | if (pSMB->OplockLevel == 0) | 584 | if (pSMB->OplockLevel == 0) |
| 586 | pCifsInode->clientCanCacheRead = false; | 585 | pCifsInode->clientCanCacheRead = false; |
| 587 | rc = slow_work_enqueue(&netfile->oplock_break); | 586 | rc = slow_work_enqueue(&netfile->oplock_break); |
| 588 | if (rc) { | 587 | if (rc) { |
| 589 | cERROR(1, ("failed to enqueue oplock " | 588 | cERROR(1, "failed to enqueue oplock " |
| 590 | "break: %d\n", rc)); | 589 | "break: %d\n", rc); |
| 591 | } else { | 590 | } else { |
| 592 | netfile->oplock_break_cancelled = false; | 591 | netfile->oplock_break_cancelled = false; |
| 593 | } | 592 | } |
| @@ -597,12 +596,12 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 597 | } | 596 | } |
| 598 | read_unlock(&GlobalSMBSeslock); | 597 | read_unlock(&GlobalSMBSeslock); |
| 599 | read_unlock(&cifs_tcp_ses_lock); | 598 | read_unlock(&cifs_tcp_ses_lock); |
| 600 | cFYI(1, ("No matching file for oplock break")); | 599 | cFYI(1, "No matching file for oplock break"); |
| 601 | return true; | 600 | return true; |
| 602 | } | 601 | } |
| 603 | } | 602 | } |
| 604 | read_unlock(&cifs_tcp_ses_lock); | 603 | read_unlock(&cifs_tcp_ses_lock); |
| 605 | cFYI(1, ("Can not process oplock break for non-existent connection")); | 604 | cFYI(1, "Can not process oplock break for non-existent connection"); |
| 606 | return true; | 605 | return true; |
| 607 | } | 606 | } |
| 608 | 607 | ||
| @@ -721,11 +720,11 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) | |||
| 721 | { | 720 | { |
| 722 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { | 721 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { |
| 723 | cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; | 722 | cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; |
| 724 | cERROR(1, ("Autodisabling the use of server inode numbers on " | 723 | cERROR(1, "Autodisabling the use of server inode numbers on " |
| 725 | "%s. This server doesn't seem to support them " | 724 | "%s. This server doesn't seem to support them " |
| 726 | "properly. Hardlinks will not be recognized on this " | 725 | "properly. Hardlinks will not be recognized on this " |
| 727 | "mount. Consider mounting with the \"noserverino\" " | 726 | "mount. Consider mounting with the \"noserverino\" " |
| 728 | "option to silence this message.", | 727 | "option to silence this message.", |
| 729 | cifs_sb->tcon->treeName)); | 728 | cifs_sb->tcon->treeName); |
| 730 | } | 729 | } |
| 731 | } | 730 | } |
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c index bd6d6895730d..d35d52889cb5 100644 --- a/fs/cifs/netmisc.c +++ b/fs/cifs/netmisc.c | |||
| @@ -149,7 +149,7 @@ cifs_inet_pton(const int address_family, const char *cp, void *dst) | |||
| 149 | else if (address_family == AF_INET6) | 149 | else if (address_family == AF_INET6) |
| 150 | ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL); | 150 | ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL); |
| 151 | 151 | ||
| 152 | cFYI(DBG2, ("address conversion returned %d for %s", ret, cp)); | 152 | cFYI(DBG2, "address conversion returned %d for %s", ret, cp); |
| 153 | if (ret > 0) | 153 | if (ret > 0) |
| 154 | ret = 1; | 154 | ret = 1; |
| 155 | return ret; | 155 | return ret; |
| @@ -870,8 +870,8 @@ map_smb_to_linux_error(struct smb_hdr *smb, int logErr) | |||
| 870 | } | 870 | } |
| 871 | /* else ERRHRD class errors or junk - return EIO */ | 871 | /* else ERRHRD class errors or junk - return EIO */ |
| 872 | 872 | ||
| 873 | cFYI(1, ("Mapping smb error code %d to POSIX err %d", | 873 | cFYI(1, "Mapping smb error code %d to POSIX err %d", |
| 874 | smberrcode, rc)); | 874 | smberrcode, rc); |
| 875 | 875 | ||
| 876 | /* generic corrective action e.g. reconnect SMB session on | 876 | /* generic corrective action e.g. reconnect SMB session on |
| 877 | * ERRbaduid could be added */ | 877 | * ERRbaduid could be added */ |
| @@ -940,20 +940,20 @@ struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 le_time, int offset) | |||
| 940 | SMB_TIME *st = (SMB_TIME *)&time; | 940 | SMB_TIME *st = (SMB_TIME *)&time; |
| 941 | SMB_DATE *sd = (SMB_DATE *)&date; | 941 | SMB_DATE *sd = (SMB_DATE *)&date; |
| 942 | 942 | ||
| 943 | cFYI(1, ("date %d time %d", date, time)); | 943 | cFYI(1, "date %d time %d", date, time); |
| 944 | 944 | ||
| 945 | sec = 2 * st->TwoSeconds; | 945 | sec = 2 * st->TwoSeconds; |
| 946 | min = st->Minutes; | 946 | min = st->Minutes; |
| 947 | if ((sec > 59) || (min > 59)) | 947 | if ((sec > 59) || (min > 59)) |
| 948 | cERROR(1, ("illegal time min %d sec %d", min, sec)); | 948 | cERROR(1, "illegal time min %d sec %d", min, sec); |
| 949 | sec += (min * 60); | 949 | sec += (min * 60); |
| 950 | sec += 60 * 60 * st->Hours; | 950 | sec += 60 * 60 * st->Hours; |
| 951 | if (st->Hours > 24) | 951 | if (st->Hours > 24) |
| 952 | cERROR(1, ("illegal hours %d", st->Hours)); | 952 | cERROR(1, "illegal hours %d", st->Hours); |
| 953 | days = sd->Day; | 953 | days = sd->Day; |
| 954 | month = sd->Month; | 954 | month = sd->Month; |
| 955 | if ((days > 31) || (month > 12)) { | 955 | if ((days > 31) || (month > 12)) { |
| 956 | cERROR(1, ("illegal date, month %d day: %d", month, days)); | 956 | cERROR(1, "illegal date, month %d day: %d", month, days); |
| 957 | if (month > 12) | 957 | if (month > 12) |
| 958 | month = 12; | 958 | month = 12; |
| 959 | } | 959 | } |
| @@ -979,7 +979,7 @@ struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 le_time, int offset) | |||
| 979 | 979 | ||
| 980 | ts.tv_sec = sec + offset; | 980 | ts.tv_sec = sec + offset; |
| 981 | 981 | ||
| 982 | /* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */ | 982 | /* cFYI(1, "sec after cnvrt dos to unix time %d",sec); */ |
| 983 | 983 | ||
| 984 | ts.tv_nsec = 0; | 984 | ts.tv_nsec = 0; |
| 985 | return ts; | 985 | return ts; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 18e0bc1fb593..daf1753af674 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -47,15 +47,15 @@ static void dump_cifs_file_struct(struct file *file, char *label) | |||
| 47 | if (file) { | 47 | if (file) { |
| 48 | cf = file->private_data; | 48 | cf = file->private_data; |
| 49 | if (cf == NULL) { | 49 | if (cf == NULL) { |
| 50 | cFYI(1, ("empty cifs private file data")); | 50 | cFYI(1, "empty cifs private file data"); |
| 51 | return; | 51 | return; |
| 52 | } | 52 | } |
| 53 | if (cf->invalidHandle) | 53 | if (cf->invalidHandle) |
| 54 | cFYI(1, ("invalid handle")); | 54 | cFYI(1, "invalid handle"); |
| 55 | if (cf->srch_inf.endOfSearch) | 55 | if (cf->srch_inf.endOfSearch) |
| 56 | cFYI(1, ("end of search")); | 56 | cFYI(1, "end of search"); |
| 57 | if (cf->srch_inf.emptyDir) | 57 | if (cf->srch_inf.emptyDir) |
| 58 | cFYI(1, ("empty dir")); | 58 | cFYI(1, "empty dir"); |
| 59 | } | 59 | } |
| 60 | } | 60 | } |
| 61 | #else | 61 | #else |
| @@ -76,7 +76,7 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name, | |||
| 76 | struct inode *inode; | 76 | struct inode *inode; |
| 77 | struct super_block *sb = parent->d_inode->i_sb; | 77 | struct super_block *sb = parent->d_inode->i_sb; |
| 78 | 78 | ||
| 79 | cFYI(1, ("For %s", name->name)); | 79 | cFYI(1, "For %s", name->name); |
| 80 | 80 | ||
| 81 | if (parent->d_op && parent->d_op->d_hash) | 81 | if (parent->d_op && parent->d_op->d_hash) |
| 82 | parent->d_op->d_hash(parent, name); | 82 | parent->d_op->d_hash(parent, name); |
| @@ -214,7 +214,7 @@ int get_symlink_reparse_path(char *full_path, struct cifs_sb_info *cifs_sb, | |||
| 214 | fid, | 214 | fid, |
| 215 | cifs_sb->local_nls); | 215 | cifs_sb->local_nls); |
| 216 | if (CIFSSMBClose(xid, ptcon, fid)) { | 216 | if (CIFSSMBClose(xid, ptcon, fid)) { |
| 217 | cFYI(1, ("Error closing temporary reparsepoint open)")); | 217 | cFYI(1, "Error closing temporary reparsepoint open"); |
| 218 | } | 218 | } |
| 219 | } | 219 | } |
| 220 | } | 220 | } |
| @@ -252,7 +252,7 @@ static int initiate_cifs_search(const int xid, struct file *file) | |||
| 252 | if (full_path == NULL) | 252 | if (full_path == NULL) |
| 253 | return -ENOMEM; | 253 | return -ENOMEM; |
| 254 | 254 | ||
| 255 | cFYI(1, ("Full path: %s start at: %lld", full_path, file->f_pos)); | 255 | cFYI(1, "Full path: %s start at: %lld", full_path, file->f_pos); |
| 256 | 256 | ||
| 257 | ffirst_retry: | 257 | ffirst_retry: |
| 258 | /* test for Unix extensions */ | 258 | /* test for Unix extensions */ |
| @@ -297,7 +297,7 @@ static int cifs_unicode_bytelen(char *str) | |||
| 297 | if (ustr[len] == 0) | 297 | if (ustr[len] == 0) |
| 298 | return len << 1; | 298 | return len << 1; |
| 299 | } | 299 | } |
| 300 | cFYI(1, ("Unicode string longer than PATH_MAX found")); | 300 | cFYI(1, "Unicode string longer than PATH_MAX found"); |
| 301 | return len << 1; | 301 | return len << 1; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| @@ -314,19 +314,18 @@ static char *nxt_dir_entry(char *old_entry, char *end_of_smb, int level) | |||
| 314 | pfData->FileNameLength; | 314 | pfData->FileNameLength; |
| 315 | } else | 315 | } else |
| 316 | new_entry = old_entry + le32_to_cpu(pDirInfo->NextEntryOffset); | 316 | new_entry = old_entry + le32_to_cpu(pDirInfo->NextEntryOffset); |
| 317 | cFYI(1, ("new entry %p old entry %p", new_entry, old_entry)); | 317 | cFYI(1, "new entry %p old entry %p", new_entry, old_entry); |
| 318 | /* validate that new_entry is not past end of SMB */ | 318 | /* validate that new_entry is not past end of SMB */ |
| 319 | if (new_entry >= end_of_smb) { | 319 | if (new_entry >= end_of_smb) { |
| 320 | cERROR(1, | 320 | cERROR(1, "search entry %p began after end of SMB %p old entry %p", |
| 321 | ("search entry %p began after end of SMB %p old entry %p", | 321 | new_entry, end_of_smb, old_entry); |
| 322 | new_entry, end_of_smb, old_entry)); | ||
| 323 | return NULL; | 322 | return NULL; |
| 324 | } else if (((level == SMB_FIND_FILE_INFO_STANDARD) && | 323 | } else if (((level == SMB_FIND_FILE_INFO_STANDARD) && |
| 325 | (new_entry + sizeof(FIND_FILE_STANDARD_INFO) > end_of_smb)) | 324 | (new_entry + sizeof(FIND_FILE_STANDARD_INFO) > end_of_smb)) |
| 326 | || ((level != SMB_FIND_FILE_INFO_STANDARD) && | 325 | || ((level != SMB_FIND_FILE_INFO_STANDARD) && |
| 327 | (new_entry + sizeof(FILE_DIRECTORY_INFO) > end_of_smb))) { | 326 | (new_entry + sizeof(FILE_DIRECTORY_INFO) > end_of_smb))) { |
| 328 | cERROR(1, ("search entry %p extends after end of SMB %p", | 327 | cERROR(1, "search entry %p extends after end of SMB %p", |
| 329 | new_entry, end_of_smb)); | 328 | new_entry, end_of_smb); |
| 330 | return NULL; | 329 | return NULL; |
| 331 | } else | 330 | } else |
| 332 | return new_entry; | 331 | return new_entry; |
| @@ -380,8 +379,8 @@ static int cifs_entry_is_dot(char *current_entry, struct cifsFileInfo *cfile) | |||
| 380 | filename = &pFindData->FileName[0]; | 379 | filename = &pFindData->FileName[0]; |
| 381 | len = pFindData->FileNameLength; | 380 | len = pFindData->FileNameLength; |
| 382 | } else { | 381 | } else { |
| 383 | cFYI(1, ("Unknown findfirst level %d", | 382 | cFYI(1, "Unknown findfirst level %d", |
| 384 | cfile->srch_inf.info_level)); | 383 | cfile->srch_inf.info_level); |
| 385 | } | 384 | } |
| 386 | 385 | ||
| 387 | if (filename) { | 386 | if (filename) { |
| @@ -481,7 +480,7 @@ static int cifs_save_resume_key(const char *current_entry, | |||
| 481 | len = (unsigned int)pFindData->FileNameLength; | 480 | len = (unsigned int)pFindData->FileNameLength; |
| 482 | cifsFile->srch_inf.resume_key = pFindData->ResumeKey; | 481 | cifsFile->srch_inf.resume_key = pFindData->ResumeKey; |
| 483 | } else { | 482 | } else { |
| 484 | cFYI(1, ("Unknown findfirst level %d", level)); | 483 | cFYI(1, "Unknown findfirst level %d", level); |
| 485 | return -EINVAL; | 484 | return -EINVAL; |
| 486 | } | 485 | } |
| 487 | cifsFile->srch_inf.resume_name_len = len; | 486 | cifsFile->srch_inf.resume_name_len = len; |
| @@ -525,7 +524,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 525 | is_dir_changed(file)) || | 524 | is_dir_changed(file)) || |
| 526 | (index_to_find < first_entry_in_buffer)) { | 525 | (index_to_find < first_entry_in_buffer)) { |
| 527 | /* close and restart search */ | 526 | /* close and restart search */ |
| 528 | cFYI(1, ("search backing up - close and restart search")); | 527 | cFYI(1, "search backing up - close and restart search"); |
| 529 | write_lock(&GlobalSMBSeslock); | 528 | write_lock(&GlobalSMBSeslock); |
| 530 | if (!cifsFile->srch_inf.endOfSearch && | 529 | if (!cifsFile->srch_inf.endOfSearch && |
| 531 | !cifsFile->invalidHandle) { | 530 | !cifsFile->invalidHandle) { |
| @@ -535,7 +534,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 535 | } else | 534 | } else |
| 536 | write_unlock(&GlobalSMBSeslock); | 535 | write_unlock(&GlobalSMBSeslock); |
| 537 | if (cifsFile->srch_inf.ntwrk_buf_start) { | 536 | if (cifsFile->srch_inf.ntwrk_buf_start) { |
| 538 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); | 537 | cFYI(1, "freeing SMB ff cache buf on search rewind"); |
| 539 | if (cifsFile->srch_inf.smallBuf) | 538 | if (cifsFile->srch_inf.smallBuf) |
| 540 | cifs_small_buf_release(cifsFile->srch_inf. | 539 | cifs_small_buf_release(cifsFile->srch_inf. |
| 541 | ntwrk_buf_start); | 540 | ntwrk_buf_start); |
| @@ -546,8 +545,8 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 546 | } | 545 | } |
| 547 | rc = initiate_cifs_search(xid, file); | 546 | rc = initiate_cifs_search(xid, file); |
| 548 | if (rc) { | 547 | if (rc) { |
| 549 | cFYI(1, ("error %d reinitiating a search on rewind", | 548 | cFYI(1, "error %d reinitiating a search on rewind", |
| 550 | rc)); | 549 | rc); |
| 551 | return rc; | 550 | return rc; |
| 552 | } | 551 | } |
| 553 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); | 552 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); |
| @@ -555,7 +554,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 555 | 554 | ||
| 556 | while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) && | 555 | while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) && |
| 557 | (rc == 0) && !cifsFile->srch_inf.endOfSearch) { | 556 | (rc == 0) && !cifsFile->srch_inf.endOfSearch) { |
| 558 | cFYI(1, ("calling findnext2")); | 557 | cFYI(1, "calling findnext2"); |
| 559 | rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, | 558 | rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, |
| 560 | &cifsFile->srch_inf); | 559 | &cifsFile->srch_inf); |
| 561 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); | 560 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); |
| @@ -575,7 +574,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 575 | first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry | 574 | first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry |
| 576 | - cifsFile->srch_inf.entries_in_buffer; | 575 | - cifsFile->srch_inf.entries_in_buffer; |
| 577 | pos_in_buf = index_to_find - first_entry_in_buffer; | 576 | pos_in_buf = index_to_find - first_entry_in_buffer; |
| 578 | cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf)); | 577 | cFYI(1, "found entry - pos_in_buf %d", pos_in_buf); |
| 579 | 578 | ||
| 580 | for (i = 0; (i < (pos_in_buf)) && (current_entry != NULL); i++) { | 579 | for (i = 0; (i < (pos_in_buf)) && (current_entry != NULL); i++) { |
| 581 | /* go entry by entry figuring out which is first */ | 580 | /* go entry by entry figuring out which is first */ |
| @@ -584,19 +583,19 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 584 | } | 583 | } |
| 585 | if ((current_entry == NULL) && (i < pos_in_buf)) { | 584 | if ((current_entry == NULL) && (i < pos_in_buf)) { |
| 586 | /* BB fixme - check if we should flag this error */ | 585 | /* BB fixme - check if we should flag this error */ |
| 587 | cERROR(1, ("reached end of buf searching for pos in buf" | 586 | cERROR(1, "reached end of buf searching for pos in buf" |
| 588 | " %d index to find %lld rc %d", | 587 | " %d index to find %lld rc %d", |
| 589 | pos_in_buf, index_to_find, rc)); | 588 | pos_in_buf, index_to_find, rc); |
| 590 | } | 589 | } |
| 591 | rc = 0; | 590 | rc = 0; |
| 592 | *ppCurrentEntry = current_entry; | 591 | *ppCurrentEntry = current_entry; |
| 593 | } else { | 592 | } else { |
| 594 | cFYI(1, ("index not in buffer - could not findnext into it")); | 593 | cFYI(1, "index not in buffer - could not findnext into it"); |
| 595 | return 0; | 594 | return 0; |
| 596 | } | 595 | } |
| 597 | 596 | ||
| 598 | if (pos_in_buf >= cifsFile->srch_inf.entries_in_buffer) { | 597 | if (pos_in_buf >= cifsFile->srch_inf.entries_in_buffer) { |
| 599 | cFYI(1, ("can not return entries pos_in_buf beyond last")); | 598 | cFYI(1, "can not return entries pos_in_buf beyond last"); |
| 600 | *num_to_ret = 0; | 599 | *num_to_ret = 0; |
| 601 | } else | 600 | } else |
| 602 | *num_to_ret = cifsFile->srch_inf.entries_in_buffer - pos_in_buf; | 601 | *num_to_ret = cifsFile->srch_inf.entries_in_buffer - pos_in_buf; |
| @@ -656,12 +655,12 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst, | |||
| 656 | /* one byte length, no name conversion */ | 655 | /* one byte length, no name conversion */ |
| 657 | len = (unsigned int)pFindData->FileNameLength; | 656 | len = (unsigned int)pFindData->FileNameLength; |
| 658 | } else { | 657 | } else { |
| 659 | cFYI(1, ("Unknown findfirst level %d", level)); | 658 | cFYI(1, "Unknown findfirst level %d", level); |
| 660 | return -EINVAL; | 659 | return -EINVAL; |
| 661 | } | 660 | } |
| 662 | 661 | ||
| 663 | if (len > max_len) { | 662 | if (len > max_len) { |
| 664 | cERROR(1, ("bad search response length %d past smb end", len)); | 663 | cERROR(1, "bad search response length %d past smb end", len); |
| 665 | return -EINVAL; | 664 | return -EINVAL; |
| 666 | } | 665 | } |
| 667 | 666 | ||
| @@ -754,7 +753,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir, | |||
| 754 | * case already. Why should we be clobbering other errors from it? | 753 | * case already. Why should we be clobbering other errors from it? |
| 755 | */ | 754 | */ |
| 756 | if (rc) { | 755 | if (rc) { |
| 757 | cFYI(1, ("filldir rc = %d", rc)); | 756 | cFYI(1, "filldir rc = %d", rc); |
| 758 | rc = -EOVERFLOW; | 757 | rc = -EOVERFLOW; |
| 759 | } | 758 | } |
| 760 | dput(tmp_dentry); | 759 | dput(tmp_dentry); |
| @@ -786,7 +785,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 786 | case 0: | 785 | case 0: |
| 787 | if (filldir(direntry, ".", 1, file->f_pos, | 786 | if (filldir(direntry, ".", 1, file->f_pos, |
| 788 | file->f_path.dentry->d_inode->i_ino, DT_DIR) < 0) { | 787 | file->f_path.dentry->d_inode->i_ino, DT_DIR) < 0) { |
| 789 | cERROR(1, ("Filldir for current dir failed")); | 788 | cERROR(1, "Filldir for current dir failed"); |
| 790 | rc = -ENOMEM; | 789 | rc = -ENOMEM; |
| 791 | break; | 790 | break; |
| 792 | } | 791 | } |
| @@ -794,7 +793,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 794 | case 1: | 793 | case 1: |
| 795 | if (filldir(direntry, "..", 2, file->f_pos, | 794 | if (filldir(direntry, "..", 2, file->f_pos, |
| 796 | file->f_path.dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) { | 795 | file->f_path.dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) { |
| 797 | cERROR(1, ("Filldir for parent dir failed")); | 796 | cERROR(1, "Filldir for parent dir failed"); |
| 798 | rc = -ENOMEM; | 797 | rc = -ENOMEM; |
| 799 | break; | 798 | break; |
| 800 | } | 799 | } |
| @@ -807,7 +806,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 807 | 806 | ||
| 808 | if (file->private_data == NULL) { | 807 | if (file->private_data == NULL) { |
| 809 | rc = initiate_cifs_search(xid, file); | 808 | rc = initiate_cifs_search(xid, file); |
| 810 | cFYI(1, ("initiate cifs search rc %d", rc)); | 809 | cFYI(1, "initiate cifs search rc %d", rc); |
| 811 | if (rc) { | 810 | if (rc) { |
| 812 | FreeXid(xid); | 811 | FreeXid(xid); |
| 813 | return rc; | 812 | return rc; |
| @@ -821,7 +820,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 821 | cifsFile = file->private_data; | 820 | cifsFile = file->private_data; |
| 822 | if (cifsFile->srch_inf.endOfSearch) { | 821 | if (cifsFile->srch_inf.endOfSearch) { |
| 823 | if (cifsFile->srch_inf.emptyDir) { | 822 | if (cifsFile->srch_inf.emptyDir) { |
| 824 | cFYI(1, ("End of search, empty dir")); | 823 | cFYI(1, "End of search, empty dir"); |
| 825 | rc = 0; | 824 | rc = 0; |
| 826 | break; | 825 | break; |
| 827 | } | 826 | } |
| @@ -833,16 +832,16 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 833 | rc = find_cifs_entry(xid, pTcon, file, | 832 | rc = find_cifs_entry(xid, pTcon, file, |
| 834 | ¤t_entry, &num_to_fill); | 833 | ¤t_entry, &num_to_fill); |
| 835 | if (rc) { | 834 | if (rc) { |
| 836 | cFYI(1, ("fce error %d", rc)); | 835 | cFYI(1, "fce error %d", rc); |
| 837 | goto rddir2_exit; | 836 | goto rddir2_exit; |
| 838 | } else if (current_entry != NULL) { | 837 | } else if (current_entry != NULL) { |
| 839 | cFYI(1, ("entry %lld found", file->f_pos)); | 838 | cFYI(1, "entry %lld found", file->f_pos); |
| 840 | } else { | 839 | } else { |
| 841 | cFYI(1, ("could not find entry")); | 840 | cFYI(1, "could not find entry"); |
| 842 | goto rddir2_exit; | 841 | goto rddir2_exit; |
| 843 | } | 842 | } |
| 844 | cFYI(1, ("loop through %d times filling dir for net buf %p", | 843 | cFYI(1, "loop through %d times filling dir for net buf %p", |
| 845 | num_to_fill, cifsFile->srch_inf.ntwrk_buf_start)); | 844 | num_to_fill, cifsFile->srch_inf.ntwrk_buf_start); |
| 846 | max_len = smbCalcSize((struct smb_hdr *) | 845 | max_len = smbCalcSize((struct smb_hdr *) |
| 847 | cifsFile->srch_inf.ntwrk_buf_start); | 846 | cifsFile->srch_inf.ntwrk_buf_start); |
| 848 | end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + max_len; | 847 | end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + max_len; |
| @@ -851,8 +850,8 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 851 | for (i = 0; (i < num_to_fill) && (rc == 0); i++) { | 850 | for (i = 0; (i < num_to_fill) && (rc == 0); i++) { |
| 852 | if (current_entry == NULL) { | 851 | if (current_entry == NULL) { |
| 853 | /* evaluate whether this case is an error */ | 852 | /* evaluate whether this case is an error */ |
| 854 | cERROR(1, ("past SMB end, num to fill %d i %d", | 853 | cERROR(1, "past SMB end, num to fill %d i %d", |
| 855 | num_to_fill, i)); | 854 | num_to_fill, i); |
| 856 | break; | 855 | break; |
| 857 | } | 856 | } |
| 858 | /* if buggy server returns . and .. late do | 857 | /* if buggy server returns . and .. late do |
| @@ -867,8 +866,8 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
| 867 | file->f_pos++; | 866 | file->f_pos++; |
| 868 | if (file->f_pos == | 867 | if (file->f_pos == |
| 869 | cifsFile->srch_inf.index_of_last_entry) { | 868 | cifsFile->srch_inf.index_of_last_entry) { |
| 870 | cFYI(1, ("last entry in buf at pos %lld %s", | 869 | cFYI(1, "last entry in buf at pos %lld %s", |
| 871 | file->f_pos, tmp_buf)); | 870 | file->f_pos, tmp_buf); |
| 872 | cifs_save_resume_key(current_entry, cifsFile); | 871 | cifs_save_resume_key(current_entry, cifsFile); |
| 873 | break; | 872 | break; |
| 874 | } else | 873 | } else |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 7c3fd7463f44..7707389bdf2c 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
| @@ -35,9 +35,11 @@ | |||
| 35 | extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8, | 35 | extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8, |
| 36 | unsigned char *p24); | 36 | unsigned char *p24); |
| 37 | 37 | ||
| 38 | /* Checks if this is the first smb session to be reconnected after | 38 | /* |
| 39 | the socket has been reestablished (so we know whether to use vc 0). | 39 | * Checks if this is the first smb session to be reconnected after |
| 40 | Called while holding the cifs_tcp_ses_lock, so do not block */ | 40 | * the socket has been reestablished (so we know whether to use vc 0). |
| 41 | * Called while holding the cifs_tcp_ses_lock, so do not block | ||
| 42 | */ | ||
| 41 | static bool is_first_ses_reconnect(struct cifsSesInfo *ses) | 43 | static bool is_first_ses_reconnect(struct cifsSesInfo *ses) |
| 42 | { | 44 | { |
| 43 | struct list_head *tmp; | 45 | struct list_head *tmp; |
| @@ -284,7 +286,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, | |||
| 284 | int len; | 286 | int len; |
| 285 | char *data = *pbcc_area; | 287 | char *data = *pbcc_area; |
| 286 | 288 | ||
| 287 | cFYI(1, ("bleft %d", bleft)); | 289 | cFYI(1, "bleft %d", bleft); |
| 288 | 290 | ||
| 289 | /* | 291 | /* |
| 290 | * Windows servers do not always double null terminate their final | 292 | * Windows servers do not always double null terminate their final |
| @@ -301,7 +303,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, | |||
| 301 | 303 | ||
| 302 | kfree(ses->serverOS); | 304 | kfree(ses->serverOS); |
| 303 | ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 305 | ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); |
| 304 | cFYI(1, ("serverOS=%s", ses->serverOS)); | 306 | cFYI(1, "serverOS=%s", ses->serverOS); |
| 305 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; | 307 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
| 306 | data += len; | 308 | data += len; |
| 307 | bleft -= len; | 309 | bleft -= len; |
| @@ -310,7 +312,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, | |||
| 310 | 312 | ||
| 311 | kfree(ses->serverNOS); | 313 | kfree(ses->serverNOS); |
| 312 | ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 314 | ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); |
| 313 | cFYI(1, ("serverNOS=%s", ses->serverNOS)); | 315 | cFYI(1, "serverNOS=%s", ses->serverNOS); |
| 314 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; | 316 | len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; |
| 315 | data += len; | 317 | data += len; |
| 316 | bleft -= len; | 318 | bleft -= len; |
| @@ -319,7 +321,7 @@ decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, | |||
| 319 | 321 | ||
| 320 | kfree(ses->serverDomain); | 322 | kfree(ses->serverDomain); |
| 321 | ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp); | 323 | ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp); |
| 322 | cFYI(1, ("serverDomain=%s", ses->serverDomain)); | 324 | cFYI(1, "serverDomain=%s", ses->serverDomain); |
| 323 | 325 | ||
| 324 | return; | 326 | return; |
| 325 | } | 327 | } |
| @@ -332,7 +334,7 @@ static int decode_ascii_ssetup(char **pbcc_area, int bleft, | |||
| 332 | int len; | 334 | int len; |
| 333 | char *bcc_ptr = *pbcc_area; | 335 | char *bcc_ptr = *pbcc_area; |
| 334 | 336 | ||
| 335 | cFYI(1, ("decode sessetup ascii. bleft %d", bleft)); | 337 | cFYI(1, "decode sessetup ascii. bleft %d", bleft); |
| 336 | 338 | ||
| 337 | len = strnlen(bcc_ptr, bleft); | 339 | len = strnlen(bcc_ptr, bleft); |
| 338 | if (len >= bleft) | 340 | if (len >= bleft) |
| @@ -344,7 +346,7 @@ static int decode_ascii_ssetup(char **pbcc_area, int bleft, | |||
| 344 | if (ses->serverOS) | 346 | if (ses->serverOS) |
| 345 | strncpy(ses->serverOS, bcc_ptr, len); | 347 | strncpy(ses->serverOS, bcc_ptr, len); |
| 346 | if (strncmp(ses->serverOS, "OS/2", 4) == 0) { | 348 | if (strncmp(ses->serverOS, "OS/2", 4) == 0) { |
| 347 | cFYI(1, ("OS/2 server")); | 349 | cFYI(1, "OS/2 server"); |
| 348 | ses->flags |= CIFS_SES_OS2; | 350 | ses->flags |= CIFS_SES_OS2; |
| 349 | } | 351 | } |
| 350 | 352 | ||
| @@ -373,7 +375,7 @@ static int decode_ascii_ssetup(char **pbcc_area, int bleft, | |||
| 373 | /* BB For newer servers which do not support Unicode, | 375 | /* BB For newer servers which do not support Unicode, |
| 374 | but thus do return domain here we could add parsing | 376 | but thus do return domain here we could add parsing |
| 375 | for it later, but it is not very important */ | 377 | for it later, but it is not very important */ |
| 376 | cFYI(1, ("ascii: bytes left %d", bleft)); | 378 | cFYI(1, "ascii: bytes left %d", bleft); |
| 377 | 379 | ||
| 378 | return rc; | 380 | return rc; |
| 379 | } | 381 | } |
| @@ -384,16 +386,16 @@ static int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len, | |||
| 384 | CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr; | 386 | CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr; |
| 385 | 387 | ||
| 386 | if (blob_len < sizeof(CHALLENGE_MESSAGE)) { | 388 | if (blob_len < sizeof(CHALLENGE_MESSAGE)) { |
| 387 | cERROR(1, ("challenge blob len %d too small", blob_len)); | 389 | cERROR(1, "challenge blob len %d too small", blob_len); |
| 388 | return -EINVAL; | 390 | return -EINVAL; |
| 389 | } | 391 | } |
| 390 | 392 | ||
| 391 | if (memcmp(pblob->Signature, "NTLMSSP", 8)) { | 393 | if (memcmp(pblob->Signature, "NTLMSSP", 8)) { |
| 392 | cERROR(1, ("blob signature incorrect %s", pblob->Signature)); | 394 | cERROR(1, "blob signature incorrect %s", pblob->Signature); |
| 393 | return -EINVAL; | 395 | return -EINVAL; |
| 394 | } | 396 | } |
| 395 | if (pblob->MessageType != NtLmChallenge) { | 397 | if (pblob->MessageType != NtLmChallenge) { |
| 396 | cERROR(1, ("Incorrect message type %d", pblob->MessageType)); | 398 | cERROR(1, "Incorrect message type %d", pblob->MessageType); |
| 397 | return -EINVAL; | 399 | return -EINVAL; |
| 398 | } | 400 | } |
| 399 | 401 | ||
| @@ -447,7 +449,7 @@ static void build_ntlmssp_negotiate_blob(unsigned char *pbuffer, | |||
| 447 | This function returns the length of the data in the blob */ | 449 | This function returns the length of the data in the blob */ |
| 448 | static int build_ntlmssp_auth_blob(unsigned char *pbuffer, | 450 | static int build_ntlmssp_auth_blob(unsigned char *pbuffer, |
| 449 | struct cifsSesInfo *ses, | 451 | struct cifsSesInfo *ses, |
| 450 | const struct nls_table *nls_cp, int first) | 452 | const struct nls_table *nls_cp, bool first) |
| 451 | { | 453 | { |
| 452 | AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer; | 454 | AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer; |
| 453 | __u32 flags; | 455 | __u32 flags; |
| @@ -546,7 +548,7 @@ static void setup_ntlmssp_neg_req(SESSION_SETUP_ANDX *pSMB, | |||
| 546 | 548 | ||
| 547 | static int setup_ntlmssp_auth_req(SESSION_SETUP_ANDX *pSMB, | 549 | static int setup_ntlmssp_auth_req(SESSION_SETUP_ANDX *pSMB, |
| 548 | struct cifsSesInfo *ses, | 550 | struct cifsSesInfo *ses, |
| 549 | const struct nls_table *nls, int first_time) | 551 | const struct nls_table *nls, bool first_time) |
| 550 | { | 552 | { |
| 551 | int bloblen; | 553 | int bloblen; |
| 552 | 554 | ||
| @@ -559,8 +561,8 @@ static int setup_ntlmssp_auth_req(SESSION_SETUP_ANDX *pSMB, | |||
| 559 | #endif | 561 | #endif |
| 560 | 562 | ||
| 561 | int | 563 | int |
| 562 | CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, | 564 | CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, |
| 563 | const struct nls_table *nls_cp) | 565 | const struct nls_table *nls_cp) |
| 564 | { | 566 | { |
| 565 | int rc = 0; | 567 | int rc = 0; |
| 566 | int wct; | 568 | int wct; |
| @@ -577,13 +579,18 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, | |||
| 577 | int bytes_remaining; | 579 | int bytes_remaining; |
| 578 | struct key *spnego_key = NULL; | 580 | struct key *spnego_key = NULL; |
| 579 | __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */ | 581 | __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */ |
| 582 | bool first_time; | ||
| 580 | 583 | ||
| 581 | if (ses == NULL) | 584 | if (ses == NULL) |
| 582 | return -EINVAL; | 585 | return -EINVAL; |
| 583 | 586 | ||
| 587 | read_lock(&cifs_tcp_ses_lock); | ||
| 588 | first_time = is_first_ses_reconnect(ses); | ||
| 589 | read_unlock(&cifs_tcp_ses_lock); | ||
| 590 | |||
| 584 | type = ses->server->secType; | 591 | type = ses->server->secType; |
| 585 | 592 | ||
| 586 | cFYI(1, ("sess setup type %d", type)); | 593 | cFYI(1, "sess setup type %d", type); |
| 587 | ssetup_ntlmssp_authenticate: | 594 | ssetup_ntlmssp_authenticate: |
| 588 | if (phase == NtLmChallenge) | 595 | if (phase == NtLmChallenge) |
| 589 | phase = NtLmAuthenticate; /* if ntlmssp, now final phase */ | 596 | phase = NtLmAuthenticate; /* if ntlmssp, now final phase */ |
| @@ -664,7 +671,7 @@ ssetup_ntlmssp_authenticate: | |||
| 664 | changed to do higher than lanman dialect and | 671 | changed to do higher than lanman dialect and |
| 665 | we reconnected would we ever calc signing_key? */ | 672 | we reconnected would we ever calc signing_key? */ |
| 666 | 673 | ||
| 667 | cFYI(1, ("Negotiating LANMAN setting up strings")); | 674 | cFYI(1, "Negotiating LANMAN setting up strings"); |
| 668 | /* Unicode not allowed for LANMAN dialects */ | 675 | /* Unicode not allowed for LANMAN dialects */ |
| 669 | ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); | 676 | ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); |
| 670 | #endif | 677 | #endif |
| @@ -744,7 +751,7 @@ ssetup_ntlmssp_authenticate: | |||
| 744 | unicode_ssetup_strings(&bcc_ptr, ses, nls_cp); | 751 | unicode_ssetup_strings(&bcc_ptr, ses, nls_cp); |
| 745 | } else | 752 | } else |
| 746 | ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); | 753 | ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); |
| 747 | } else if (type == Kerberos || type == MSKerberos) { | 754 | } else if (type == Kerberos) { |
| 748 | #ifdef CONFIG_CIFS_UPCALL | 755 | #ifdef CONFIG_CIFS_UPCALL |
| 749 | struct cifs_spnego_msg *msg; | 756 | struct cifs_spnego_msg *msg; |
| 750 | spnego_key = cifs_get_spnego_key(ses); | 757 | spnego_key = cifs_get_spnego_key(ses); |
| @@ -758,17 +765,17 @@ ssetup_ntlmssp_authenticate: | |||
| 758 | /* check version field to make sure that cifs.upcall is | 765 | /* check version field to make sure that cifs.upcall is |
| 759 | sending us a response in an expected form */ | 766 | sending us a response in an expected form */ |
| 760 | if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { | 767 | if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { |
| 761 | cERROR(1, ("incorrect version of cifs.upcall (expected" | 768 | cERROR(1, "incorrect version of cifs.upcall (expected" |
| 762 | " %d but got %d)", | 769 | " %d but got %d)", |
| 763 | CIFS_SPNEGO_UPCALL_VERSION, msg->version)); | 770 | CIFS_SPNEGO_UPCALL_VERSION, msg->version); |
| 764 | rc = -EKEYREJECTED; | 771 | rc = -EKEYREJECTED; |
| 765 | goto ssetup_exit; | 772 | goto ssetup_exit; |
| 766 | } | 773 | } |
| 767 | /* bail out if key is too long */ | 774 | /* bail out if key is too long */ |
| 768 | if (msg->sesskey_len > | 775 | if (msg->sesskey_len > |
| 769 | sizeof(ses->server->mac_signing_key.data.krb5)) { | 776 | sizeof(ses->server->mac_signing_key.data.krb5)) { |
| 770 | cERROR(1, ("Kerberos signing key too long (%u bytes)", | 777 | cERROR(1, "Kerberos signing key too long (%u bytes)", |
| 771 | msg->sesskey_len)); | 778 | msg->sesskey_len); |
| 772 | rc = -EOVERFLOW; | 779 | rc = -EOVERFLOW; |
| 773 | goto ssetup_exit; | 780 | goto ssetup_exit; |
| 774 | } | 781 | } |
| @@ -796,7 +803,7 @@ ssetup_ntlmssp_authenticate: | |||
| 796 | /* BB: is this right? */ | 803 | /* BB: is this right? */ |
| 797 | ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); | 804 | ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); |
| 798 | #else /* ! CONFIG_CIFS_UPCALL */ | 805 | #else /* ! CONFIG_CIFS_UPCALL */ |
| 799 | cERROR(1, ("Kerberos negotiated but upcall support disabled!")); | 806 | cERROR(1, "Kerberos negotiated but upcall support disabled!"); |
| 800 | rc = -ENOSYS; | 807 | rc = -ENOSYS; |
| 801 | goto ssetup_exit; | 808 | goto ssetup_exit; |
| 802 | #endif /* CONFIG_CIFS_UPCALL */ | 809 | #endif /* CONFIG_CIFS_UPCALL */ |
| @@ -804,12 +811,12 @@ ssetup_ntlmssp_authenticate: | |||
| 804 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 811 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
| 805 | if (type == RawNTLMSSP) { | 812 | if (type == RawNTLMSSP) { |
| 806 | if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) { | 813 | if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) { |
| 807 | cERROR(1, ("NTLMSSP requires Unicode support")); | 814 | cERROR(1, "NTLMSSP requires Unicode support"); |
| 808 | rc = -ENOSYS; | 815 | rc = -ENOSYS; |
| 809 | goto ssetup_exit; | 816 | goto ssetup_exit; |
| 810 | } | 817 | } |
| 811 | 818 | ||
| 812 | cFYI(1, ("ntlmssp session setup phase %d", phase)); | 819 | cFYI(1, "ntlmssp session setup phase %d", phase); |
| 813 | pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC; | 820 | pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC; |
| 814 | capabilities |= CAP_EXTENDED_SECURITY; | 821 | capabilities |= CAP_EXTENDED_SECURITY; |
| 815 | pSMB->req.Capabilities |= cpu_to_le32(capabilities); | 822 | pSMB->req.Capabilities |= cpu_to_le32(capabilities); |
| @@ -827,7 +834,7 @@ ssetup_ntlmssp_authenticate: | |||
| 827 | on the response (challenge) */ | 834 | on the response (challenge) */ |
| 828 | smb_buf->Uid = ses->Suid; | 835 | smb_buf->Uid = ses->Suid; |
| 829 | } else { | 836 | } else { |
| 830 | cERROR(1, ("invalid phase %d", phase)); | 837 | cERROR(1, "invalid phase %d", phase); |
| 831 | rc = -ENOSYS; | 838 | rc = -ENOSYS; |
| 832 | goto ssetup_exit; | 839 | goto ssetup_exit; |
| 833 | } | 840 | } |
| @@ -839,12 +846,12 @@ ssetup_ntlmssp_authenticate: | |||
| 839 | } | 846 | } |
| 840 | unicode_oslm_strings(&bcc_ptr, nls_cp); | 847 | unicode_oslm_strings(&bcc_ptr, nls_cp); |
| 841 | } else { | 848 | } else { |
| 842 | cERROR(1, ("secType %d not supported!", type)); | 849 | cERROR(1, "secType %d not supported!", type); |
| 843 | rc = -ENOSYS; | 850 | rc = -ENOSYS; |
| 844 | goto ssetup_exit; | 851 | goto ssetup_exit; |
| 845 | } | 852 | } |
| 846 | #else | 853 | #else |
| 847 | cERROR(1, ("secType %d not supported!", type)); | 854 | cERROR(1, "secType %d not supported!", type); |
| 848 | rc = -ENOSYS; | 855 | rc = -ENOSYS; |
| 849 | goto ssetup_exit; | 856 | goto ssetup_exit; |
| 850 | #endif | 857 | #endif |
| @@ -862,7 +869,7 @@ ssetup_ntlmssp_authenticate: | |||
| 862 | CIFS_STD_OP /* not long */ | CIFS_LOG_ERROR); | 869 | CIFS_STD_OP /* not long */ | CIFS_LOG_ERROR); |
| 863 | /* SMB request buf freed in SendReceive2 */ | 870 | /* SMB request buf freed in SendReceive2 */ |
| 864 | 871 | ||
| 865 | cFYI(1, ("ssetup rc from sendrecv2 is %d", rc)); | 872 | cFYI(1, "ssetup rc from sendrecv2 is %d", rc); |
| 866 | 873 | ||
| 867 | pSMB = (SESSION_SETUP_ANDX *)iov[0].iov_base; | 874 | pSMB = (SESSION_SETUP_ANDX *)iov[0].iov_base; |
| 868 | smb_buf = (struct smb_hdr *)iov[0].iov_base; | 875 | smb_buf = (struct smb_hdr *)iov[0].iov_base; |
| @@ -870,7 +877,7 @@ ssetup_ntlmssp_authenticate: | |||
| 870 | if ((type == RawNTLMSSP) && (smb_buf->Status.CifsError == | 877 | if ((type == RawNTLMSSP) && (smb_buf->Status.CifsError == |
| 871 | cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))) { | 878 | cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))) { |
| 872 | if (phase != NtLmNegotiate) { | 879 | if (phase != NtLmNegotiate) { |
| 873 | cERROR(1, ("Unexpected more processing error")); | 880 | cERROR(1, "Unexpected more processing error"); |
| 874 | goto ssetup_exit; | 881 | goto ssetup_exit; |
| 875 | } | 882 | } |
| 876 | /* NTLMSSP Negotiate sent now processing challenge (response) */ | 883 | /* NTLMSSP Negotiate sent now processing challenge (response) */ |
| @@ -882,14 +889,14 @@ ssetup_ntlmssp_authenticate: | |||
| 882 | 889 | ||
| 883 | if ((smb_buf->WordCount != 3) && (smb_buf->WordCount != 4)) { | 890 | if ((smb_buf->WordCount != 3) && (smb_buf->WordCount != 4)) { |
| 884 | rc = -EIO; | 891 | rc = -EIO; |
| 885 | cERROR(1, ("bad word count %d", smb_buf->WordCount)); | 892 | cERROR(1, "bad word count %d", smb_buf->WordCount); |
| 886 | goto ssetup_exit; | 893 | goto ssetup_exit; |
| 887 | } | 894 | } |
| 888 | action = le16_to_cpu(pSMB->resp.Action); | 895 | action = le16_to_cpu(pSMB->resp.Action); |
| 889 | if (action & GUEST_LOGIN) | 896 | if (action & GUEST_LOGIN) |
| 890 | cFYI(1, ("Guest login")); /* BB mark SesInfo struct? */ | 897 | cFYI(1, "Guest login"); /* BB mark SesInfo struct? */ |
| 891 | ses->Suid = smb_buf->Uid; /* UID left in wire format (le) */ | 898 | ses->Suid = smb_buf->Uid; /* UID left in wire format (le) */ |
| 892 | cFYI(1, ("UID = %d ", ses->Suid)); | 899 | cFYI(1, "UID = %d ", ses->Suid); |
| 893 | /* response can have either 3 or 4 word count - Samba sends 3 */ | 900 | /* response can have either 3 or 4 word count - Samba sends 3 */ |
| 894 | /* and lanman response is 3 */ | 901 | /* and lanman response is 3 */ |
| 895 | bytes_remaining = BCC(smb_buf); | 902 | bytes_remaining = BCC(smb_buf); |
| @@ -899,7 +906,7 @@ ssetup_ntlmssp_authenticate: | |||
| 899 | __u16 blob_len; | 906 | __u16 blob_len; |
| 900 | blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength); | 907 | blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength); |
| 901 | if (blob_len > bytes_remaining) { | 908 | if (blob_len > bytes_remaining) { |
| 902 | cERROR(1, ("bad security blob length %d", blob_len)); | 909 | cERROR(1, "bad security blob length %d", blob_len); |
| 903 | rc = -EINVAL; | 910 | rc = -EINVAL; |
| 904 | goto ssetup_exit; | 911 | goto ssetup_exit; |
| 905 | } | 912 | } |
| @@ -933,7 +940,7 @@ ssetup_exit: | |||
| 933 | } | 940 | } |
| 934 | kfree(str_area); | 941 | kfree(str_area); |
| 935 | if (resp_buf_type == CIFS_SMALL_BUFFER) { | 942 | if (resp_buf_type == CIFS_SMALL_BUFFER) { |
| 936 | cFYI(1, ("ssetup freeing small buf %p", iov[0].iov_base)); | 943 | cFYI(1, "ssetup freeing small buf %p", iov[0].iov_base); |
| 937 | cifs_small_buf_release(iov[0].iov_base); | 944 | cifs_small_buf_release(iov[0].iov_base); |
| 938 | } else if (resp_buf_type == CIFS_LARGE_BUFFER) | 945 | } else if (resp_buf_type == CIFS_LARGE_BUFFER) |
| 939 | cifs_buf_release(iov[0].iov_base); | 946 | cifs_buf_release(iov[0].iov_base); |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index ad081fe7eb18..82f78c4d6978 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include "cifs_debug.h" | 35 | #include "cifs_debug.h" |
| 36 | 36 | ||
| 37 | extern mempool_t *cifs_mid_poolp; | 37 | extern mempool_t *cifs_mid_poolp; |
| 38 | extern struct kmem_cache *cifs_oplock_cachep; | ||
| 39 | 38 | ||
| 40 | static struct mid_q_entry * | 39 | static struct mid_q_entry * |
| 41 | AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) | 40 | AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) |
| @@ -43,7 +42,7 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) | |||
| 43 | struct mid_q_entry *temp; | 42 | struct mid_q_entry *temp; |
| 44 | 43 | ||
| 45 | if (server == NULL) { | 44 | if (server == NULL) { |
| 46 | cERROR(1, ("Null TCP session in AllocMidQEntry")); | 45 | cERROR(1, "Null TCP session in AllocMidQEntry"); |
| 47 | return NULL; | 46 | return NULL; |
| 48 | } | 47 | } |
| 49 | 48 | ||
| @@ -55,7 +54,7 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) | |||
| 55 | temp->mid = smb_buffer->Mid; /* always LE */ | 54 | temp->mid = smb_buffer->Mid; /* always LE */ |
| 56 | temp->pid = current->pid; | 55 | temp->pid = current->pid; |
| 57 | temp->command = smb_buffer->Command; | 56 | temp->command = smb_buffer->Command; |
| 58 | cFYI(1, ("For smb_command %d", temp->command)); | 57 | cFYI(1, "For smb_command %d", temp->command); |
| 59 | /* do_gettimeofday(&temp->when_sent);*/ /* easier to use jiffies */ | 58 | /* do_gettimeofday(&temp->when_sent);*/ /* easier to use jiffies */ |
| 60 | /* when mid allocated can be before when sent */ | 59 | /* when mid allocated can be before when sent */ |
| 61 | temp->when_alloc = jiffies; | 60 | temp->when_alloc = jiffies; |
| @@ -140,7 +139,7 @@ smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) | |||
| 140 | total_len += iov[i].iov_len; | 139 | total_len += iov[i].iov_len; |
| 141 | 140 | ||
| 142 | smb_buffer->smb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length); | 141 | smb_buffer->smb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length); |
| 143 | cFYI(1, ("Sending smb: total_len %d", total_len)); | 142 | cFYI(1, "Sending smb: total_len %d", total_len); |
| 144 | dump_smb(smb_buffer, len); | 143 | dump_smb(smb_buffer, len); |
| 145 | 144 | ||
| 146 | i = 0; | 145 | i = 0; |
| @@ -168,9 +167,8 @@ smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) | |||
| 168 | reconnect which may clear the network problem. | 167 | reconnect which may clear the network problem. |
| 169 | */ | 168 | */ |
| 170 | if ((i >= 14) || (!server->noblocksnd && (i > 2))) { | 169 | if ((i >= 14) || (!server->noblocksnd && (i > 2))) { |
| 171 | cERROR(1, | 170 | cERROR(1, "sends on sock %p stuck for 15 seconds", |
| 172 | ("sends on sock %p stuck for 15 seconds", | 171 | ssocket); |
| 173 | ssocket)); | ||
| 174 | rc = -EAGAIN; | 172 | rc = -EAGAIN; |
| 175 | break; | 173 | break; |
| 176 | } | 174 | } |
| @@ -184,13 +182,13 @@ smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) | |||
| 184 | total_len = 0; | 182 | total_len = 0; |
| 185 | break; | 183 | break; |
| 186 | } else if (rc > total_len) { | 184 | } else if (rc > total_len) { |
| 187 | cERROR(1, ("sent %d requested %d", rc, total_len)); | 185 | cERROR(1, "sent %d requested %d", rc, total_len); |
| 188 | break; | 186 | break; |
| 189 | } | 187 | } |
| 190 | if (rc == 0) { | 188 | if (rc == 0) { |
| 191 | /* should never happen, letting socket clear before | 189 | /* should never happen, letting socket clear before |
| 192 | retrying is our only obvious option here */ | 190 | retrying is our only obvious option here */ |
| 193 | cERROR(1, ("tcp sent no data")); | 191 | cERROR(1, "tcp sent no data"); |
| 194 | msleep(500); | 192 | msleep(500); |
| 195 | continue; | 193 | continue; |
| 196 | } | 194 | } |
| @@ -213,8 +211,8 @@ smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) | |||
| 213 | } | 211 | } |
| 214 | 212 | ||
| 215 | if ((total_len > 0) && (total_len != smb_buf_length + 4)) { | 213 | if ((total_len > 0) && (total_len != smb_buf_length + 4)) { |
| 216 | cFYI(1, ("partial send (%d remaining), terminating session", | 214 | cFYI(1, "partial send (%d remaining), terminating session", |
| 217 | total_len)); | 215 | total_len); |
| 218 | /* If we have only sent part of an SMB then the next SMB | 216 | /* If we have only sent part of an SMB then the next SMB |
| 219 | could be taken as the remainder of this one. We need | 217 | could be taken as the remainder of this one. We need |
| 220 | to kill the socket so the server throws away the partial | 218 | to kill the socket so the server throws away the partial |
| @@ -223,7 +221,7 @@ smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) | |||
| 223 | } | 221 | } |
| 224 | 222 | ||
| 225 | if (rc < 0) { | 223 | if (rc < 0) { |
| 226 | cERROR(1, ("Error %d sending data on socket to server", rc)); | 224 | cERROR(1, "Error %d sending data on socket to server", rc); |
| 227 | } else | 225 | } else |
| 228 | rc = 0; | 226 | rc = 0; |
| 229 | 227 | ||
| @@ -296,7 +294,7 @@ static int allocate_mid(struct cifsSesInfo *ses, struct smb_hdr *in_buf, | |||
| 296 | } | 294 | } |
| 297 | 295 | ||
| 298 | if (ses->server->tcpStatus == CifsNeedReconnect) { | 296 | if (ses->server->tcpStatus == CifsNeedReconnect) { |
| 299 | cFYI(1, ("tcp session dead - return to caller to retry")); | 297 | cFYI(1, "tcp session dead - return to caller to retry"); |
| 300 | return -EAGAIN; | 298 | return -EAGAIN; |
| 301 | } | 299 | } |
| 302 | 300 | ||
| @@ -348,7 +346,7 @@ static int wait_for_response(struct cifsSesInfo *ses, | |||
| 348 | lrt += time_to_wait; | 346 | lrt += time_to_wait; |
| 349 | if (time_after(jiffies, lrt)) { | 347 | if (time_after(jiffies, lrt)) { |
| 350 | /* No replies for time_to_wait. */ | 348 | /* No replies for time_to_wait. */ |
| 351 | cERROR(1, ("server not responding")); | 349 | cERROR(1, "server not responding"); |
| 352 | return -1; | 350 | return -1; |
| 353 | } | 351 | } |
| 354 | } else { | 352 | } else { |
| @@ -379,7 +377,7 @@ SendReceiveNoRsp(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 379 | iov[0].iov_len = in_buf->smb_buf_length + 4; | 377 | iov[0].iov_len = in_buf->smb_buf_length + 4; |
| 380 | flags |= CIFS_NO_RESP; | 378 | flags |= CIFS_NO_RESP; |
| 381 | rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags); | 379 | rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags); |
| 382 | cFYI(DBG2, ("SendRcvNoRsp flags %d rc %d", flags, rc)); | 380 | cFYI(DBG2, "SendRcvNoRsp flags %d rc %d", flags, rc); |
| 383 | 381 | ||
| 384 | return rc; | 382 | return rc; |
| 385 | } | 383 | } |
| @@ -402,7 +400,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 402 | 400 | ||
| 403 | if ((ses == NULL) || (ses->server == NULL)) { | 401 | if ((ses == NULL) || (ses->server == NULL)) { |
| 404 | cifs_small_buf_release(in_buf); | 402 | cifs_small_buf_release(in_buf); |
| 405 | cERROR(1, ("Null session")); | 403 | cERROR(1, "Null session"); |
| 406 | return -EIO; | 404 | return -EIO; |
| 407 | } | 405 | } |
| 408 | 406 | ||
| @@ -471,7 +469,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 471 | else if (long_op == CIFS_BLOCKING_OP) | 469 | else if (long_op == CIFS_BLOCKING_OP) |
| 472 | timeout = 0x7FFFFFFF; /* large, but not so large as to wrap */ | 470 | timeout = 0x7FFFFFFF; /* large, but not so large as to wrap */ |
| 473 | else { | 471 | else { |
| 474 | cERROR(1, ("unknown timeout flag %d", long_op)); | 472 | cERROR(1, "unknown timeout flag %d", long_op); |
| 475 | rc = -EIO; | 473 | rc = -EIO; |
| 476 | goto out; | 474 | goto out; |
| 477 | } | 475 | } |
| @@ -490,8 +488,8 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 490 | spin_lock(&GlobalMid_Lock); | 488 | spin_lock(&GlobalMid_Lock); |
| 491 | 489 | ||
| 492 | if (midQ->resp_buf == NULL) { | 490 | if (midQ->resp_buf == NULL) { |
| 493 | cERROR(1, ("No response to cmd %d mid %d", | 491 | cERROR(1, "No response to cmd %d mid %d", |
| 494 | midQ->command, midQ->mid)); | 492 | midQ->command, midQ->mid); |
| 495 | if (midQ->midState == MID_REQUEST_SUBMITTED) { | 493 | if (midQ->midState == MID_REQUEST_SUBMITTED) { |
| 496 | if (ses->server->tcpStatus == CifsExiting) | 494 | if (ses->server->tcpStatus == CifsExiting) |
| 497 | rc = -EHOSTDOWN; | 495 | rc = -EHOSTDOWN; |
| @@ -504,7 +502,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 504 | if (rc != -EHOSTDOWN) { | 502 | if (rc != -EHOSTDOWN) { |
| 505 | if (midQ->midState == MID_RETRY_NEEDED) { | 503 | if (midQ->midState == MID_RETRY_NEEDED) { |
| 506 | rc = -EAGAIN; | 504 | rc = -EAGAIN; |
| 507 | cFYI(1, ("marking request for retry")); | 505 | cFYI(1, "marking request for retry"); |
| 508 | } else { | 506 | } else { |
| 509 | rc = -EIO; | 507 | rc = -EIO; |
| 510 | } | 508 | } |
| @@ -521,8 +519,8 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 521 | receive_len = midQ->resp_buf->smb_buf_length; | 519 | receive_len = midQ->resp_buf->smb_buf_length; |
| 522 | 520 | ||
| 523 | if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { | 521 | if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { |
| 524 | cERROR(1, ("Frame too large received. Length: %d Xid: %d", | 522 | cERROR(1, "Frame too large received. Length: %d Xid: %d", |
| 525 | receive_len, xid)); | 523 | receive_len, xid); |
| 526 | rc = -EIO; | 524 | rc = -EIO; |
| 527 | goto out; | 525 | goto out; |
| 528 | } | 526 | } |
| @@ -548,7 +546,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 548 | &ses->server->mac_signing_key, | 546 | &ses->server->mac_signing_key, |
| 549 | midQ->sequence_number+1); | 547 | midQ->sequence_number+1); |
| 550 | if (rc) { | 548 | if (rc) { |
| 551 | cERROR(1, ("Unexpected SMB signature")); | 549 | cERROR(1, "Unexpected SMB signature"); |
| 552 | /* BB FIXME add code to kill session */ | 550 | /* BB FIXME add code to kill session */ |
| 553 | } | 551 | } |
| 554 | } | 552 | } |
| @@ -569,7 +567,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 569 | DeleteMidQEntry */ | 567 | DeleteMidQEntry */ |
| 570 | } else { | 568 | } else { |
| 571 | rc = -EIO; | 569 | rc = -EIO; |
| 572 | cFYI(1, ("Bad MID state?")); | 570 | cFYI(1, "Bad MID state?"); |
| 573 | } | 571 | } |
| 574 | 572 | ||
| 575 | out: | 573 | out: |
| @@ -591,11 +589,11 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 591 | struct mid_q_entry *midQ; | 589 | struct mid_q_entry *midQ; |
| 592 | 590 | ||
| 593 | if (ses == NULL) { | 591 | if (ses == NULL) { |
| 594 | cERROR(1, ("Null smb session")); | 592 | cERROR(1, "Null smb session"); |
| 595 | return -EIO; | 593 | return -EIO; |
| 596 | } | 594 | } |
| 597 | if (ses->server == NULL) { | 595 | if (ses->server == NULL) { |
| 598 | cERROR(1, ("Null tcp session")); | 596 | cERROR(1, "Null tcp session"); |
| 599 | return -EIO; | 597 | return -EIO; |
| 600 | } | 598 | } |
| 601 | 599 | ||
| @@ -607,8 +605,8 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 607 | use ses->maxReq */ | 605 | use ses->maxReq */ |
| 608 | 606 | ||
| 609 | if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { | 607 | if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { |
| 610 | cERROR(1, ("Illegal length, greater than maximum frame, %d", | 608 | cERROR(1, "Illegal length, greater than maximum frame, %d", |
| 611 | in_buf->smb_buf_length)); | 609 | in_buf->smb_buf_length); |
| 612 | return -EIO; | 610 | return -EIO; |
| 613 | } | 611 | } |
| 614 | 612 | ||
| @@ -665,7 +663,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 665 | else if (long_op == CIFS_BLOCKING_OP) | 663 | else if (long_op == CIFS_BLOCKING_OP) |
| 666 | timeout = 0x7FFFFFFF; /* large but no so large as to wrap */ | 664 | timeout = 0x7FFFFFFF; /* large but no so large as to wrap */ |
| 667 | else { | 665 | else { |
| 668 | cERROR(1, ("unknown timeout flag %d", long_op)); | 666 | cERROR(1, "unknown timeout flag %d", long_op); |
| 669 | rc = -EIO; | 667 | rc = -EIO; |
| 670 | goto out; | 668 | goto out; |
| 671 | } | 669 | } |
| @@ -681,8 +679,8 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 681 | 679 | ||
| 682 | spin_lock(&GlobalMid_Lock); | 680 | spin_lock(&GlobalMid_Lock); |
| 683 | if (midQ->resp_buf == NULL) { | 681 | if (midQ->resp_buf == NULL) { |
| 684 | cERROR(1, ("No response for cmd %d mid %d", | 682 | cERROR(1, "No response for cmd %d mid %d", |
| 685 | midQ->command, midQ->mid)); | 683 | midQ->command, midQ->mid); |
| 686 | if (midQ->midState == MID_REQUEST_SUBMITTED) { | 684 | if (midQ->midState == MID_REQUEST_SUBMITTED) { |
| 687 | if (ses->server->tcpStatus == CifsExiting) | 685 | if (ses->server->tcpStatus == CifsExiting) |
| 688 | rc = -EHOSTDOWN; | 686 | rc = -EHOSTDOWN; |
| @@ -695,7 +693,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 695 | if (rc != -EHOSTDOWN) { | 693 | if (rc != -EHOSTDOWN) { |
| 696 | if (midQ->midState == MID_RETRY_NEEDED) { | 694 | if (midQ->midState == MID_RETRY_NEEDED) { |
| 697 | rc = -EAGAIN; | 695 | rc = -EAGAIN; |
| 698 | cFYI(1, ("marking request for retry")); | 696 | cFYI(1, "marking request for retry"); |
| 699 | } else { | 697 | } else { |
| 700 | rc = -EIO; | 698 | rc = -EIO; |
| 701 | } | 699 | } |
| @@ -712,8 +710,8 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 712 | receive_len = midQ->resp_buf->smb_buf_length; | 710 | receive_len = midQ->resp_buf->smb_buf_length; |
| 713 | 711 | ||
| 714 | if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { | 712 | if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { |
| 715 | cERROR(1, ("Frame too large received. Length: %d Xid: %d", | 713 | cERROR(1, "Frame too large received. Length: %d Xid: %d", |
| 716 | receive_len, xid)); | 714 | receive_len, xid); |
| 717 | rc = -EIO; | 715 | rc = -EIO; |
| 718 | goto out; | 716 | goto out; |
| 719 | } | 717 | } |
| @@ -736,7 +734,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 736 | &ses->server->mac_signing_key, | 734 | &ses->server->mac_signing_key, |
| 737 | midQ->sequence_number+1); | 735 | midQ->sequence_number+1); |
| 738 | if (rc) { | 736 | if (rc) { |
| 739 | cERROR(1, ("Unexpected SMB signature")); | 737 | cERROR(1, "Unexpected SMB signature"); |
| 740 | /* BB FIXME add code to kill session */ | 738 | /* BB FIXME add code to kill session */ |
| 741 | } | 739 | } |
| 742 | } | 740 | } |
| @@ -753,7 +751,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 753 | BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); | 751 | BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); |
| 754 | } else { | 752 | } else { |
| 755 | rc = -EIO; | 753 | rc = -EIO; |
| 756 | cERROR(1, ("Bad MID state?")); | 754 | cERROR(1, "Bad MID state?"); |
| 757 | } | 755 | } |
| 758 | 756 | ||
| 759 | out: | 757 | out: |
| @@ -824,13 +822,13 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 824 | struct cifsSesInfo *ses; | 822 | struct cifsSesInfo *ses; |
| 825 | 823 | ||
| 826 | if (tcon == NULL || tcon->ses == NULL) { | 824 | if (tcon == NULL || tcon->ses == NULL) { |
| 827 | cERROR(1, ("Null smb session")); | 825 | cERROR(1, "Null smb session"); |
| 828 | return -EIO; | 826 | return -EIO; |
| 829 | } | 827 | } |
| 830 | ses = tcon->ses; | 828 | ses = tcon->ses; |
| 831 | 829 | ||
| 832 | if (ses->server == NULL) { | 830 | if (ses->server == NULL) { |
| 833 | cERROR(1, ("Null tcp session")); | 831 | cERROR(1, "Null tcp session"); |
| 834 | return -EIO; | 832 | return -EIO; |
| 835 | } | 833 | } |
| 836 | 834 | ||
| @@ -842,8 +840,8 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 842 | use ses->maxReq */ | 840 | use ses->maxReq */ |
| 843 | 841 | ||
| 844 | if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { | 842 | if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { |
| 845 | cERROR(1, ("Illegal length, greater than maximum frame, %d", | 843 | cERROR(1, "Illegal length, greater than maximum frame, %d", |
| 846 | in_buf->smb_buf_length)); | 844 | in_buf->smb_buf_length); |
| 847 | return -EIO; | 845 | return -EIO; |
| 848 | } | 846 | } |
| 849 | 847 | ||
| @@ -933,8 +931,8 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 933 | spin_unlock(&GlobalMid_Lock); | 931 | spin_unlock(&GlobalMid_Lock); |
| 934 | receive_len = midQ->resp_buf->smb_buf_length; | 932 | receive_len = midQ->resp_buf->smb_buf_length; |
| 935 | } else { | 933 | } else { |
| 936 | cERROR(1, ("No response for cmd %d mid %d", | 934 | cERROR(1, "No response for cmd %d mid %d", |
| 937 | midQ->command, midQ->mid)); | 935 | midQ->command, midQ->mid); |
| 938 | if (midQ->midState == MID_REQUEST_SUBMITTED) { | 936 | if (midQ->midState == MID_REQUEST_SUBMITTED) { |
| 939 | if (ses->server->tcpStatus == CifsExiting) | 937 | if (ses->server->tcpStatus == CifsExiting) |
| 940 | rc = -EHOSTDOWN; | 938 | rc = -EHOSTDOWN; |
| @@ -947,7 +945,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 947 | if (rc != -EHOSTDOWN) { | 945 | if (rc != -EHOSTDOWN) { |
| 948 | if (midQ->midState == MID_RETRY_NEEDED) { | 946 | if (midQ->midState == MID_RETRY_NEEDED) { |
| 949 | rc = -EAGAIN; | 947 | rc = -EAGAIN; |
| 950 | cFYI(1, ("marking request for retry")); | 948 | cFYI(1, "marking request for retry"); |
| 951 | } else { | 949 | } else { |
| 952 | rc = -EIO; | 950 | rc = -EIO; |
| 953 | } | 951 | } |
| @@ -958,8 +956,8 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 958 | } | 956 | } |
| 959 | 957 | ||
| 960 | if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { | 958 | if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { |
| 961 | cERROR(1, ("Frame too large received. Length: %d Xid: %d", | 959 | cERROR(1, "Frame too large received. Length: %d Xid: %d", |
| 962 | receive_len, xid)); | 960 | receive_len, xid); |
| 963 | rc = -EIO; | 961 | rc = -EIO; |
| 964 | goto out; | 962 | goto out; |
| 965 | } | 963 | } |
| @@ -968,7 +966,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 968 | 966 | ||
| 969 | if ((out_buf == NULL) || (midQ->midState != MID_RESPONSE_RECEIVED)) { | 967 | if ((out_buf == NULL) || (midQ->midState != MID_RESPONSE_RECEIVED)) { |
| 970 | rc = -EIO; | 968 | rc = -EIO; |
| 971 | cERROR(1, ("Bad MID state?")); | 969 | cERROR(1, "Bad MID state?"); |
| 972 | goto out; | 970 | goto out; |
| 973 | } | 971 | } |
| 974 | 972 | ||
| @@ -986,7 +984,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 986 | &ses->server->mac_signing_key, | 984 | &ses->server->mac_signing_key, |
| 987 | midQ->sequence_number+1); | 985 | midQ->sequence_number+1); |
| 988 | if (rc) { | 986 | if (rc) { |
| 989 | cERROR(1, ("Unexpected SMB signature")); | 987 | cERROR(1, "Unexpected SMB signature"); |
| 990 | /* BB FIXME add code to kill session */ | 988 | /* BB FIXME add code to kill session */ |
| 991 | } | 989 | } |
| 992 | } | 990 | } |
diff --git a/fs/cifs/xattr.c b/fs/cifs/xattr.c index f555ce077d4f..a1509207bfa6 100644 --- a/fs/cifs/xattr.c +++ b/fs/cifs/xattr.c | |||
| @@ -70,12 +70,12 @@ int cifs_removexattr(struct dentry *direntry, const char *ea_name) | |||
| 70 | return rc; | 70 | return rc; |
| 71 | } | 71 | } |
| 72 | if (ea_name == NULL) { | 72 | if (ea_name == NULL) { |
| 73 | cFYI(1, ("Null xattr names not supported")); | 73 | cFYI(1, "Null xattr names not supported"); |
| 74 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) | 74 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) |
| 75 | && (strncmp(ea_name, CIFS_XATTR_OS2_PREFIX, 4))) { | 75 | && (strncmp(ea_name, CIFS_XATTR_OS2_PREFIX, 4))) { |
| 76 | cFYI(1, | 76 | cFYI(1, |
| 77 | ("illegal xattr request %s (only user namespace supported)", | 77 | "illegal xattr request %s (only user namespace supported)", |
| 78 | ea_name)); | 78 | ea_name); |
| 79 | /* BB what if no namespace prefix? */ | 79 | /* BB what if no namespace prefix? */ |
| 80 | /* Should we just pass them to server, except for | 80 | /* Should we just pass them to server, except for |
| 81 | system and perhaps security prefixes? */ | 81 | system and perhaps security prefixes? */ |
| @@ -131,19 +131,19 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, | |||
| 131 | search server for EAs or streams to | 131 | search server for EAs or streams to |
| 132 | returns as xattrs */ | 132 | returns as xattrs */ |
| 133 | if (value_size > MAX_EA_VALUE_SIZE) { | 133 | if (value_size > MAX_EA_VALUE_SIZE) { |
| 134 | cFYI(1, ("size of EA value too large")); | 134 | cFYI(1, "size of EA value too large"); |
| 135 | kfree(full_path); | 135 | kfree(full_path); |
| 136 | FreeXid(xid); | 136 | FreeXid(xid); |
| 137 | return -EOPNOTSUPP; | 137 | return -EOPNOTSUPP; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | if (ea_name == NULL) { | 140 | if (ea_name == NULL) { |
| 141 | cFYI(1, ("Null xattr names not supported")); | 141 | cFYI(1, "Null xattr names not supported"); |
| 142 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) == 0) { | 142 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) == 0) { |
| 143 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) | 143 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) |
| 144 | goto set_ea_exit; | 144 | goto set_ea_exit; |
| 145 | if (strncmp(ea_name, CIFS_XATTR_DOS_ATTRIB, 14) == 0) | 145 | if (strncmp(ea_name, CIFS_XATTR_DOS_ATTRIB, 14) == 0) |
| 146 | cFYI(1, ("attempt to set cifs inode metadata")); | 146 | cFYI(1, "attempt to set cifs inode metadata"); |
| 147 | 147 | ||
| 148 | ea_name += 5; /* skip past user. prefix */ | 148 | ea_name += 5; /* skip past user. prefix */ |
| 149 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, ea_value, | 149 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, ea_value, |
| @@ -169,9 +169,9 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, | |||
| 169 | ACL_TYPE_ACCESS, cifs_sb->local_nls, | 169 | ACL_TYPE_ACCESS, cifs_sb->local_nls, |
| 170 | cifs_sb->mnt_cifs_flags & | 170 | cifs_sb->mnt_cifs_flags & |
| 171 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 171 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 172 | cFYI(1, ("set POSIX ACL rc %d", rc)); | 172 | cFYI(1, "set POSIX ACL rc %d", rc); |
| 173 | #else | 173 | #else |
| 174 | cFYI(1, ("set POSIX ACL not supported")); | 174 | cFYI(1, "set POSIX ACL not supported"); |
| 175 | #endif | 175 | #endif |
| 176 | } else if (strncmp(ea_name, POSIX_ACL_XATTR_DEFAULT, | 176 | } else if (strncmp(ea_name, POSIX_ACL_XATTR_DEFAULT, |
| 177 | strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) { | 177 | strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) { |
| @@ -182,13 +182,13 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, | |||
| 182 | ACL_TYPE_DEFAULT, cifs_sb->local_nls, | 182 | ACL_TYPE_DEFAULT, cifs_sb->local_nls, |
| 183 | cifs_sb->mnt_cifs_flags & | 183 | cifs_sb->mnt_cifs_flags & |
| 184 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 184 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 185 | cFYI(1, ("set POSIX default ACL rc %d", rc)); | 185 | cFYI(1, "set POSIX default ACL rc %d", rc); |
| 186 | #else | 186 | #else |
| 187 | cFYI(1, ("set default POSIX ACL not supported")); | 187 | cFYI(1, "set default POSIX ACL not supported"); |
| 188 | #endif | 188 | #endif |
| 189 | } else { | 189 | } else { |
| 190 | cFYI(1, ("illegal xattr request %s (only user namespace" | 190 | cFYI(1, "illegal xattr request %s (only user namespace" |
| 191 | " supported)", ea_name)); | 191 | " supported)", ea_name); |
| 192 | /* BB what if no namespace prefix? */ | 192 | /* BB what if no namespace prefix? */ |
| 193 | /* Should we just pass them to server, except for | 193 | /* Should we just pass them to server, except for |
| 194 | system and perhaps security prefixes? */ | 194 | system and perhaps security prefixes? */ |
| @@ -235,13 +235,13 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
| 235 | /* return dos attributes as pseudo xattr */ | 235 | /* return dos attributes as pseudo xattr */ |
| 236 | /* return alt name if available as pseudo attr */ | 236 | /* return alt name if available as pseudo attr */ |
| 237 | if (ea_name == NULL) { | 237 | if (ea_name == NULL) { |
| 238 | cFYI(1, ("Null xattr names not supported")); | 238 | cFYI(1, "Null xattr names not supported"); |
| 239 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) == 0) { | 239 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) == 0) { |
| 240 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) | 240 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) |
| 241 | goto get_ea_exit; | 241 | goto get_ea_exit; |
| 242 | 242 | ||
| 243 | if (strncmp(ea_name, CIFS_XATTR_DOS_ATTRIB, 14) == 0) { | 243 | if (strncmp(ea_name, CIFS_XATTR_DOS_ATTRIB, 14) == 0) { |
| 244 | cFYI(1, ("attempt to query cifs inode metadata")); | 244 | cFYI(1, "attempt to query cifs inode metadata"); |
| 245 | /* revalidate/getattr then populate from inode */ | 245 | /* revalidate/getattr then populate from inode */ |
| 246 | } /* BB add else when above is implemented */ | 246 | } /* BB add else when above is implemented */ |
| 247 | ea_name += 5; /* skip past user. prefix */ | 247 | ea_name += 5; /* skip past user. prefix */ |
| @@ -287,7 +287,7 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
| 287 | } | 287 | } |
| 288 | #endif /* EXPERIMENTAL */ | 288 | #endif /* EXPERIMENTAL */ |
| 289 | #else | 289 | #else |
| 290 | cFYI(1, ("query POSIX ACL not supported yet")); | 290 | cFYI(1, "query POSIX ACL not supported yet"); |
| 291 | #endif /* CONFIG_CIFS_POSIX */ | 291 | #endif /* CONFIG_CIFS_POSIX */ |
| 292 | } else if (strncmp(ea_name, POSIX_ACL_XATTR_DEFAULT, | 292 | } else if (strncmp(ea_name, POSIX_ACL_XATTR_DEFAULT, |
| 293 | strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) { | 293 | strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) { |
| @@ -299,18 +299,18 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
| 299 | cifs_sb->mnt_cifs_flags & | 299 | cifs_sb->mnt_cifs_flags & |
| 300 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 300 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 301 | #else | 301 | #else |
| 302 | cFYI(1, ("query POSIX default ACL not supported yet")); | 302 | cFYI(1, "query POSIX default ACL not supported yet"); |
| 303 | #endif | 303 | #endif |
| 304 | } else if (strncmp(ea_name, | 304 | } else if (strncmp(ea_name, |
| 305 | CIFS_XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0) { | 305 | CIFS_XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0) { |
| 306 | cFYI(1, ("Trusted xattr namespace not supported yet")); | 306 | cFYI(1, "Trusted xattr namespace not supported yet"); |
| 307 | } else if (strncmp(ea_name, | 307 | } else if (strncmp(ea_name, |
| 308 | CIFS_XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) == 0) { | 308 | CIFS_XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) == 0) { |
| 309 | cFYI(1, ("Security xattr namespace not supported yet")); | 309 | cFYI(1, "Security xattr namespace not supported yet"); |
| 310 | } else | 310 | } else |
| 311 | cFYI(1, | 311 | cFYI(1, |
| 312 | ("illegal xattr request %s (only user namespace supported)", | 312 | "illegal xattr request %s (only user namespace supported)", |
| 313 | ea_name)); | 313 | ea_name); |
| 314 | 314 | ||
| 315 | /* We could add an additional check for streams ie | 315 | /* We could add an additional check for streams ie |
| 316 | if proc/fs/cifs/streamstoxattr is set then | 316 | if proc/fs/cifs/streamstoxattr is set then |
diff --git a/fs/compat.c b/fs/compat.c index 4b6ed03cc478..05448730f840 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1531,8 +1531,6 @@ int compat_do_execve(char * filename, | |||
| 1531 | if (retval < 0) | 1531 | if (retval < 0) |
| 1532 | goto out; | 1532 | goto out; |
| 1533 | 1533 | ||
| 1534 | current->stack_start = current->mm->start_stack; | ||
| 1535 | |||
| 1536 | /* execve succeeded */ | 1534 | /* execve succeeded */ |
| 1537 | current->fs->in_exec = 0; | 1535 | current->fs->in_exec = 0; |
| 1538 | current->in_execve = 0; | 1536 | current->in_execve = 0; |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 8e48b52205aa..0b502f80c691 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
| @@ -645,6 +645,7 @@ static void detach_groups(struct config_group *group) | |||
| 645 | 645 | ||
| 646 | configfs_detach_group(sd->s_element); | 646 | configfs_detach_group(sd->s_element); |
| 647 | child->d_inode->i_flags |= S_DEAD; | 647 | child->d_inode->i_flags |= S_DEAD; |
| 648 | dont_mount(child); | ||
| 648 | 649 | ||
| 649 | mutex_unlock(&child->d_inode->i_mutex); | 650 | mutex_unlock(&child->d_inode->i_mutex); |
| 650 | 651 | ||
| @@ -840,6 +841,7 @@ static int configfs_attach_item(struct config_item *parent_item, | |||
| 840 | mutex_lock(&dentry->d_inode->i_mutex); | 841 | mutex_lock(&dentry->d_inode->i_mutex); |
| 841 | configfs_remove_dir(item); | 842 | configfs_remove_dir(item); |
| 842 | dentry->d_inode->i_flags |= S_DEAD; | 843 | dentry->d_inode->i_flags |= S_DEAD; |
| 844 | dont_mount(dentry); | ||
| 843 | mutex_unlock(&dentry->d_inode->i_mutex); | 845 | mutex_unlock(&dentry->d_inode->i_mutex); |
| 844 | d_delete(dentry); | 846 | d_delete(dentry); |
| 845 | } | 847 | } |
| @@ -882,6 +884,7 @@ static int configfs_attach_group(struct config_item *parent_item, | |||
| 882 | if (ret) { | 884 | if (ret) { |
| 883 | configfs_detach_item(item); | 885 | configfs_detach_item(item); |
| 884 | dentry->d_inode->i_flags |= S_DEAD; | 886 | dentry->d_inode->i_flags |= S_DEAD; |
| 887 | dont_mount(dentry); | ||
| 885 | } | 888 | } |
| 886 | configfs_adjust_dir_dirent_depth_after_populate(sd); | 889 | configfs_adjust_dir_dirent_depth_after_populate(sd); |
| 887 | mutex_unlock(&dentry->d_inode->i_mutex); | 890 | mutex_unlock(&dentry->d_inode->i_mutex); |
| @@ -1725,6 +1728,7 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys) | |||
| 1725 | mutex_unlock(&configfs_symlink_mutex); | 1728 | mutex_unlock(&configfs_symlink_mutex); |
| 1726 | configfs_detach_group(&group->cg_item); | 1729 | configfs_detach_group(&group->cg_item); |
| 1727 | dentry->d_inode->i_flags |= S_DEAD; | 1730 | dentry->d_inode->i_flags |= S_DEAD; |
| 1731 | dont_mount(dentry); | ||
| 1728 | mutex_unlock(&dentry->d_inode->i_mutex); | 1732 | mutex_unlock(&dentry->d_inode->i_mutex); |
| 1729 | 1733 | ||
| 1730 | d_delete(dentry); | 1734 | d_delete(dentry); |
| @@ -1387,8 +1387,6 @@ int do_execve(char * filename, | |||
| 1387 | if (retval < 0) | 1387 | if (retval < 0) |
| 1388 | goto out; | 1388 | goto out; |
| 1389 | 1389 | ||
| 1390 | current->stack_start = current->mm->start_stack; | ||
| 1391 | |||
| 1392 | /* execve succeeded */ | 1390 | /* execve succeeded */ |
| 1393 | current->fs->in_exec = 0; | 1391 | current->fs->in_exec = 0; |
| 1394 | current->in_execve = 0; | 1392 | current->in_execve = 0; |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 157382fa6256..b66832ac33ac 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -446,10 +446,8 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 446 | /* initialize the mount flag and determine the default error handler */ | 446 | /* initialize the mount flag and determine the default error handler */ |
| 447 | flag = JFS_ERR_REMOUNT_RO; | 447 | flag = JFS_ERR_REMOUNT_RO; |
| 448 | 448 | ||
| 449 | if (!parse_options((char *) data, sb, &newLVSize, &flag)) { | 449 | if (!parse_options((char *) data, sb, &newLVSize, &flag)) |
| 450 | kfree(sbi); | 450 | goto out_kfree; |
| 451 | return -EINVAL; | ||
| 452 | } | ||
| 453 | sbi->flag = flag; | 451 | sbi->flag = flag; |
| 454 | 452 | ||
| 455 | #ifdef CONFIG_JFS_POSIX_ACL | 453 | #ifdef CONFIG_JFS_POSIX_ACL |
| @@ -458,7 +456,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 458 | 456 | ||
| 459 | if (newLVSize) { | 457 | if (newLVSize) { |
| 460 | printk(KERN_ERR "resize option for remount only\n"); | 458 | printk(KERN_ERR "resize option for remount only\n"); |
| 461 | return -EINVAL; | 459 | goto out_kfree; |
| 462 | } | 460 | } |
| 463 | 461 | ||
| 464 | /* | 462 | /* |
| @@ -478,7 +476,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 478 | inode = new_inode(sb); | 476 | inode = new_inode(sb); |
| 479 | if (inode == NULL) { | 477 | if (inode == NULL) { |
| 480 | ret = -ENOMEM; | 478 | ret = -ENOMEM; |
| 481 | goto out_kfree; | 479 | goto out_unload; |
| 482 | } | 480 | } |
| 483 | inode->i_ino = 0; | 481 | inode->i_ino = 0; |
| 484 | inode->i_nlink = 1; | 482 | inode->i_nlink = 1; |
| @@ -550,9 +548,10 @@ out_mount_failed: | |||
| 550 | make_bad_inode(sbi->direct_inode); | 548 | make_bad_inode(sbi->direct_inode); |
| 551 | iput(sbi->direct_inode); | 549 | iput(sbi->direct_inode); |
| 552 | sbi->direct_inode = NULL; | 550 | sbi->direct_inode = NULL; |
| 553 | out_kfree: | 551 | out_unload: |
| 554 | if (sbi->nls_tab) | 552 | if (sbi->nls_tab) |
| 555 | unload_nls(sbi->nls_tab); | 553 | unload_nls(sbi->nls_tab); |
| 554 | out_kfree: | ||
| 556 | kfree(sbi); | 555 | kfree(sbi); |
| 557 | return ret; | 556 | return ret; |
| 558 | } | 557 | } |
diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 243c00071f76..9bd2ce2a3040 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c | |||
| @@ -303,6 +303,11 @@ static void bdev_put_device(struct super_block *sb) | |||
| 303 | close_bdev_exclusive(logfs_super(sb)->s_bdev, FMODE_READ|FMODE_WRITE); | 303 | close_bdev_exclusive(logfs_super(sb)->s_bdev, FMODE_READ|FMODE_WRITE); |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | static int bdev_can_write_buf(struct super_block *sb, u64 ofs) | ||
| 307 | { | ||
| 308 | return 0; | ||
| 309 | } | ||
| 310 | |||
| 306 | static const struct logfs_device_ops bd_devops = { | 311 | static const struct logfs_device_ops bd_devops = { |
| 307 | .find_first_sb = bdev_find_first_sb, | 312 | .find_first_sb = bdev_find_first_sb, |
| 308 | .find_last_sb = bdev_find_last_sb, | 313 | .find_last_sb = bdev_find_last_sb, |
| @@ -310,6 +315,7 @@ static const struct logfs_device_ops bd_devops = { | |||
| 310 | .readpage = bdev_readpage, | 315 | .readpage = bdev_readpage, |
| 311 | .writeseg = bdev_writeseg, | 316 | .writeseg = bdev_writeseg, |
| 312 | .erase = bdev_erase, | 317 | .erase = bdev_erase, |
| 318 | .can_write_buf = bdev_can_write_buf, | ||
| 313 | .sync = bdev_sync, | 319 | .sync = bdev_sync, |
| 314 | .put_device = bdev_put_device, | 320 | .put_device = bdev_put_device, |
| 315 | }; | 321 | }; |
diff --git a/fs/logfs/dev_mtd.c b/fs/logfs/dev_mtd.c index cafb6ef2e05b..a85d47d13e4b 100644 --- a/fs/logfs/dev_mtd.c +++ b/fs/logfs/dev_mtd.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/completion.h> | 9 | #include <linux/completion.h> |
| 10 | #include <linux/mount.h> | 10 | #include <linux/mount.h> |
| 11 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
| 12 | #include <linux/slab.h> | ||
| 12 | 13 | ||
| 13 | #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) | 14 | #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) |
| 14 | 15 | ||
| @@ -126,7 +127,8 @@ static int mtd_readpage(void *_sb, struct page *page) | |||
| 126 | 127 | ||
| 127 | err = mtd_read(sb, page->index << PAGE_SHIFT, PAGE_SIZE, | 128 | err = mtd_read(sb, page->index << PAGE_SHIFT, PAGE_SIZE, |
| 128 | page_address(page)); | 129 | page_address(page)); |
| 129 | if (err == -EUCLEAN) { | 130 | if (err == -EUCLEAN || err == -EBADMSG) { |
| 131 | /* -EBADMSG happens regularly on power failures */ | ||
| 130 | err = 0; | 132 | err = 0; |
| 131 | /* FIXME: force GC this segment */ | 133 | /* FIXME: force GC this segment */ |
| 132 | } | 134 | } |
| @@ -233,12 +235,32 @@ static void mtd_put_device(struct super_block *sb) | |||
| 233 | put_mtd_device(logfs_super(sb)->s_mtd); | 235 | put_mtd_device(logfs_super(sb)->s_mtd); |
| 234 | } | 236 | } |
| 235 | 237 | ||
| 238 | static int mtd_can_write_buf(struct super_block *sb, u64 ofs) | ||
| 239 | { | ||
| 240 | struct logfs_super *super = logfs_super(sb); | ||
| 241 | void *buf; | ||
| 242 | int err; | ||
| 243 | |||
| 244 | buf = kmalloc(super->s_writesize, GFP_KERNEL); | ||
| 245 | if (!buf) | ||
| 246 | return -ENOMEM; | ||
| 247 | err = mtd_read(sb, ofs, super->s_writesize, buf); | ||
| 248 | if (err) | ||
| 249 | goto out; | ||
| 250 | if (memchr_inv(buf, 0xff, super->s_writesize)) | ||
| 251 | err = -EIO; | ||
| 252 | kfree(buf); | ||
| 253 | out: | ||
| 254 | return err; | ||
| 255 | } | ||
| 256 | |||
| 236 | static const struct logfs_device_ops mtd_devops = { | 257 | static const struct logfs_device_ops mtd_devops = { |
| 237 | .find_first_sb = mtd_find_first_sb, | 258 | .find_first_sb = mtd_find_first_sb, |
| 238 | .find_last_sb = mtd_find_last_sb, | 259 | .find_last_sb = mtd_find_last_sb, |
| 239 | .readpage = mtd_readpage, | 260 | .readpage = mtd_readpage, |
| 240 | .writeseg = mtd_writeseg, | 261 | .writeseg = mtd_writeseg, |
| 241 | .erase = mtd_erase, | 262 | .erase = mtd_erase, |
| 263 | .can_write_buf = mtd_can_write_buf, | ||
| 242 | .sync = mtd_sync, | 264 | .sync = mtd_sync, |
| 243 | .put_device = mtd_put_device, | 265 | .put_device = mtd_put_device, |
| 244 | }; | 266 | }; |
| @@ -250,5 +272,7 @@ int logfs_get_sb_mtd(struct file_system_type *type, int flags, | |||
| 250 | const struct logfs_device_ops *devops = &mtd_devops; | 272 | const struct logfs_device_ops *devops = &mtd_devops; |
| 251 | 273 | ||
| 252 | mtd = get_mtd_device(NULL, mtdnr); | 274 | mtd = get_mtd_device(NULL, mtdnr); |
| 275 | if (IS_ERR(mtd)) | ||
| 276 | return PTR_ERR(mtd); | ||
| 253 | return logfs_get_sb_device(type, flags, mtd, NULL, devops, mnt); | 277 | return logfs_get_sb_device(type, flags, mtd, NULL, devops, mnt); |
| 254 | } | 278 | } |
diff --git a/fs/logfs/file.c b/fs/logfs/file.c index 370f367a933e..0de524071870 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c | |||
| @@ -161,7 +161,17 @@ static int logfs_writepage(struct page *page, struct writeback_control *wbc) | |||
| 161 | 161 | ||
| 162 | static void logfs_invalidatepage(struct page *page, unsigned long offset) | 162 | static void logfs_invalidatepage(struct page *page, unsigned long offset) |
| 163 | { | 163 | { |
| 164 | move_page_to_btree(page); | 164 | struct logfs_block *block = logfs_block(page); |
| 165 | |||
| 166 | if (block->reserved_bytes) { | ||
| 167 | struct super_block *sb = page->mapping->host->i_sb; | ||
| 168 | struct logfs_super *super = logfs_super(sb); | ||
| 169 | |||
| 170 | super->s_dirty_pages -= block->reserved_bytes; | ||
| 171 | block->ops->free_block(sb, block); | ||
| 172 | BUG_ON(bitmap_weight(block->alias_map, LOGFS_BLOCK_FACTOR)); | ||
| 173 | } else | ||
| 174 | move_page_to_btree(page); | ||
| 165 | BUG_ON(PagePrivate(page) || page->private); | 175 | BUG_ON(PagePrivate(page) || page->private); |
| 166 | } | 176 | } |
| 167 | 177 | ||
| @@ -212,10 +222,8 @@ int logfs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
| 212 | int logfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 222 | int logfs_fsync(struct file *file, struct dentry *dentry, int datasync) |
| 213 | { | 223 | { |
| 214 | struct super_block *sb = dentry->d_inode->i_sb; | 224 | struct super_block *sb = dentry->d_inode->i_sb; |
| 215 | struct logfs_super *super = logfs_super(sb); | ||
| 216 | 225 | ||
| 217 | /* FIXME: write anchor */ | 226 | logfs_write_anchor(sb); |
| 218 | super->s_devops->sync(sb); | ||
| 219 | return 0; | 227 | return 0; |
| 220 | } | 228 | } |
| 221 | 229 | ||
diff --git a/fs/logfs/gc.c b/fs/logfs/gc.c index 76c242fbe1b0..caa4419285dc 100644 --- a/fs/logfs/gc.c +++ b/fs/logfs/gc.c | |||
| @@ -122,7 +122,7 @@ static void logfs_cleanse_block(struct super_block *sb, u64 ofs, u64 ino, | |||
| 122 | logfs_safe_iput(inode, cookie); | 122 | logfs_safe_iput(inode, cookie); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | static u32 logfs_gc_segment(struct super_block *sb, u32 segno, u8 dist) | 125 | static u32 logfs_gc_segment(struct super_block *sb, u32 segno) |
| 126 | { | 126 | { |
| 127 | struct logfs_super *super = logfs_super(sb); | 127 | struct logfs_super *super = logfs_super(sb); |
| 128 | struct logfs_segment_header sh; | 128 | struct logfs_segment_header sh; |
| @@ -401,7 +401,7 @@ static int __logfs_gc_once(struct super_block *sb, struct gc_candidate *cand) | |||
| 401 | segno, (u64)segno << super->s_segshift, | 401 | segno, (u64)segno << super->s_segshift, |
| 402 | dist, no_free_segments(sb), valid, | 402 | dist, no_free_segments(sb), valid, |
| 403 | super->s_free_bytes); | 403 | super->s_free_bytes); |
| 404 | cleaned = logfs_gc_segment(sb, segno, dist); | 404 | cleaned = logfs_gc_segment(sb, segno); |
| 405 | log_gc("GC segment #%02x complete - now %x valid\n", segno, | 405 | log_gc("GC segment #%02x complete - now %x valid\n", segno, |
| 406 | valid - cleaned); | 406 | valid - cleaned); |
| 407 | BUG_ON(cleaned != valid); | 407 | BUG_ON(cleaned != valid); |
| @@ -632,38 +632,31 @@ static int check_area(struct super_block *sb, int i) | |||
| 632 | { | 632 | { |
| 633 | struct logfs_super *super = logfs_super(sb); | 633 | struct logfs_super *super = logfs_super(sb); |
| 634 | struct logfs_area *area = super->s_area[i]; | 634 | struct logfs_area *area = super->s_area[i]; |
| 635 | struct logfs_object_header oh; | 635 | gc_level_t gc_level; |
| 636 | u32 cleaned, valid, ec; | ||
| 636 | u32 segno = area->a_segno; | 637 | u32 segno = area->a_segno; |
| 637 | u32 ofs = area->a_used_bytes; | 638 | u64 ofs = dev_ofs(sb, area->a_segno, area->a_written_bytes); |
| 638 | __be32 crc; | ||
| 639 | int err; | ||
| 640 | 639 | ||
| 641 | if (!area->a_is_open) | 640 | if (!area->a_is_open) |
| 642 | return 0; | 641 | return 0; |
| 643 | 642 | ||
| 644 | for (ofs = area->a_used_bytes; | 643 | if (super->s_devops->can_write_buf(sb, ofs) == 0) |
| 645 | ofs <= super->s_segsize - sizeof(oh); | 644 | return 0; |
| 646 | ofs += (u32)be16_to_cpu(oh.len) + sizeof(oh)) { | ||
| 647 | err = wbuf_read(sb, dev_ofs(sb, segno, ofs), sizeof(oh), &oh); | ||
| 648 | if (err) | ||
| 649 | return err; | ||
| 650 | |||
| 651 | if (!memchr_inv(&oh, 0xff, sizeof(oh))) | ||
| 652 | break; | ||
| 653 | 645 | ||
| 654 | crc = logfs_crc32(&oh, sizeof(oh) - 4, 4); | 646 | printk(KERN_INFO"LogFS: Possibly incomplete write at %llx\n", ofs); |
| 655 | if (crc != oh.crc) { | 647 | /* |
| 656 | printk(KERN_INFO "interrupted header at %llx\n", | 648 | * The device cannot write back the write buffer. Most likely the |
| 657 | dev_ofs(sb, segno, ofs)); | 649 | * wbuf was already written out and the system crashed at some point |
| 658 | return 0; | 650 | * before the journal commit happened. In that case we wouldn't have |
| 659 | } | 651 | * to do anything. But if the crash happened before the wbuf was |
| 660 | } | 652 | * written out correctly, we must GC this segment. So assume the |
| 661 | if (ofs != area->a_used_bytes) { | 653 | * worst and always do the GC run. |
| 662 | printk(KERN_INFO "%x bytes unaccounted data found at %llx\n", | 654 | */ |
| 663 | ofs - area->a_used_bytes, | 655 | area->a_is_open = 0; |
| 664 | dev_ofs(sb, segno, area->a_used_bytes)); | 656 | valid = logfs_valid_bytes(sb, segno, &ec, &gc_level); |
| 665 | area->a_used_bytes = ofs; | 657 | cleaned = logfs_gc_segment(sb, segno); |
| 666 | } | 658 | if (cleaned != valid) |
| 659 | return -EIO; | ||
| 667 | return 0; | 660 | return 0; |
| 668 | } | 661 | } |
| 669 | 662 | ||
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index 14ed27274da2..755a92e8daa7 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
| @@ -193,6 +193,7 @@ static void logfs_init_inode(struct super_block *sb, struct inode *inode) | |||
| 193 | inode->i_ctime = CURRENT_TIME; | 193 | inode->i_ctime = CURRENT_TIME; |
| 194 | inode->i_mtime = CURRENT_TIME; | 194 | inode->i_mtime = CURRENT_TIME; |
| 195 | inode->i_nlink = 1; | 195 | inode->i_nlink = 1; |
| 196 | li->li_refcount = 1; | ||
| 196 | INIT_LIST_HEAD(&li->li_freeing_list); | 197 | INIT_LIST_HEAD(&li->li_freeing_list); |
| 197 | 198 | ||
| 198 | for (i = 0; i < LOGFS_EMBEDDED_FIELDS; i++) | 199 | for (i = 0; i < LOGFS_EMBEDDED_FIELDS; i++) |
| @@ -326,7 +327,7 @@ static void logfs_set_ino_generation(struct super_block *sb, | |||
| 326 | u64 ino; | 327 | u64 ino; |
| 327 | 328 | ||
| 328 | mutex_lock(&super->s_journal_mutex); | 329 | mutex_lock(&super->s_journal_mutex); |
| 329 | ino = logfs_seek_hole(super->s_master_inode, super->s_last_ino); | 330 | ino = logfs_seek_hole(super->s_master_inode, super->s_last_ino + 1); |
| 330 | super->s_last_ino = ino; | 331 | super->s_last_ino = ino; |
| 331 | super->s_inos_till_wrap--; | 332 | super->s_inos_till_wrap--; |
| 332 | if (super->s_inos_till_wrap < 0) { | 333 | if (super->s_inos_till_wrap < 0) { |
| @@ -386,8 +387,7 @@ static void logfs_init_once(void *_li) | |||
| 386 | 387 | ||
| 387 | static int logfs_sync_fs(struct super_block *sb, int wait) | 388 | static int logfs_sync_fs(struct super_block *sb, int wait) |
| 388 | { | 389 | { |
| 389 | /* FIXME: write anchor */ | 390 | logfs_write_anchor(sb); |
| 390 | logfs_super(sb)->s_devops->sync(sb); | ||
| 391 | return 0; | 391 | return 0; |
| 392 | } | 392 | } |
| 393 | 393 | ||
diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c index fb0a613f885b..4b0e0616b357 100644 --- a/fs/logfs/journal.c +++ b/fs/logfs/journal.c | |||
| @@ -132,10 +132,9 @@ static int read_area(struct super_block *sb, struct logfs_je_area *a) | |||
| 132 | 132 | ||
| 133 | ofs = dev_ofs(sb, area->a_segno, area->a_written_bytes); | 133 | ofs = dev_ofs(sb, area->a_segno, area->a_written_bytes); |
| 134 | if (super->s_writesize > 1) | 134 | if (super->s_writesize > 1) |
| 135 | logfs_buf_recover(area, ofs, a + 1, super->s_writesize); | 135 | return logfs_buf_recover(area, ofs, a + 1, super->s_writesize); |
| 136 | else | 136 | else |
| 137 | logfs_buf_recover(area, ofs, NULL, 0); | 137 | return logfs_buf_recover(area, ofs, NULL, 0); |
| 138 | return 0; | ||
| 139 | } | 138 | } |
| 140 | 139 | ||
| 141 | static void *unpack(void *from, void *to) | 140 | static void *unpack(void *from, void *to) |
| @@ -245,7 +244,7 @@ static int read_je(struct super_block *sb, u64 ofs) | |||
| 245 | read_erasecount(sb, unpack(jh, scratch)); | 244 | read_erasecount(sb, unpack(jh, scratch)); |
| 246 | break; | 245 | break; |
| 247 | case JE_AREA: | 246 | case JE_AREA: |
| 248 | read_area(sb, unpack(jh, scratch)); | 247 | err = read_area(sb, unpack(jh, scratch)); |
| 249 | break; | 248 | break; |
| 250 | case JE_OBJ_ALIAS: | 249 | case JE_OBJ_ALIAS: |
| 251 | err = logfs_load_object_aliases(sb, unpack(jh, scratch), | 250 | err = logfs_load_object_aliases(sb, unpack(jh, scratch), |
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h index 0a3df1a0c936..93b55f337245 100644 --- a/fs/logfs/logfs.h +++ b/fs/logfs/logfs.h | |||
| @@ -144,6 +144,7 @@ struct logfs_area_ops { | |||
| 144 | * @erase: erase one segment | 144 | * @erase: erase one segment |
| 145 | * @read: read from the device | 145 | * @read: read from the device |
| 146 | * @erase: erase part of the device | 146 | * @erase: erase part of the device |
| 147 | * @can_write_buf: decide whether wbuf can be written to ofs | ||
| 147 | */ | 148 | */ |
| 148 | struct logfs_device_ops { | 149 | struct logfs_device_ops { |
| 149 | struct page *(*find_first_sb)(struct super_block *sb, u64 *ofs); | 150 | struct page *(*find_first_sb)(struct super_block *sb, u64 *ofs); |
| @@ -153,6 +154,7 @@ struct logfs_device_ops { | |||
| 153 | void (*writeseg)(struct super_block *sb, u64 ofs, size_t len); | 154 | void (*writeseg)(struct super_block *sb, u64 ofs, size_t len); |
| 154 | int (*erase)(struct super_block *sb, loff_t ofs, size_t len, | 155 | int (*erase)(struct super_block *sb, loff_t ofs, size_t len, |
| 155 | int ensure_write); | 156 | int ensure_write); |
| 157 | int (*can_write_buf)(struct super_block *sb, u64 ofs); | ||
| 156 | void (*sync)(struct super_block *sb); | 158 | void (*sync)(struct super_block *sb); |
| 157 | void (*put_device)(struct super_block *sb); | 159 | void (*put_device)(struct super_block *sb); |
| 158 | }; | 160 | }; |
| @@ -394,6 +396,7 @@ struct logfs_super { | |||
| 394 | int s_lock_count; | 396 | int s_lock_count; |
| 395 | mempool_t *s_block_pool; /* struct logfs_block pool */ | 397 | mempool_t *s_block_pool; /* struct logfs_block pool */ |
| 396 | mempool_t *s_shadow_pool; /* struct logfs_shadow pool */ | 398 | mempool_t *s_shadow_pool; /* struct logfs_shadow pool */ |
| 399 | struct list_head s_writeback_list; /* writeback pages */ | ||
| 397 | /* | 400 | /* |
| 398 | * Space accounting: | 401 | * Space accounting: |
| 399 | * - s_used_bytes specifies space used to store valid data objects. | 402 | * - s_used_bytes specifies space used to store valid data objects. |
| @@ -598,19 +601,19 @@ void freeseg(struct super_block *sb, u32 segno); | |||
| 598 | int logfs_init_areas(struct super_block *sb); | 601 | int logfs_init_areas(struct super_block *sb); |
| 599 | void logfs_cleanup_areas(struct super_block *sb); | 602 | void logfs_cleanup_areas(struct super_block *sb); |
| 600 | int logfs_open_area(struct logfs_area *area, size_t bytes); | 603 | int logfs_open_area(struct logfs_area *area, size_t bytes); |
| 601 | void __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, | 604 | int __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, |
| 602 | int use_filler); | 605 | int use_filler); |
| 603 | 606 | ||
| 604 | static inline void logfs_buf_write(struct logfs_area *area, u64 ofs, | 607 | static inline int logfs_buf_write(struct logfs_area *area, u64 ofs, |
| 605 | void *buf, size_t len) | 608 | void *buf, size_t len) |
| 606 | { | 609 | { |
| 607 | __logfs_buf_write(area, ofs, buf, len, 0); | 610 | return __logfs_buf_write(area, ofs, buf, len, 0); |
| 608 | } | 611 | } |
| 609 | 612 | ||
| 610 | static inline void logfs_buf_recover(struct logfs_area *area, u64 ofs, | 613 | static inline int logfs_buf_recover(struct logfs_area *area, u64 ofs, |
| 611 | void *buf, size_t len) | 614 | void *buf, size_t len) |
| 612 | { | 615 | { |
| 613 | __logfs_buf_write(area, ofs, buf, len, 1); | 616 | return __logfs_buf_write(area, ofs, buf, len, 1); |
| 614 | } | 617 | } |
| 615 | 618 | ||
| 616 | /* super.c */ | 619 | /* super.c */ |
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index 3159db6958e5..0718d112a1a5 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c | |||
| @@ -892,6 +892,8 @@ u64 logfs_seek_hole(struct inode *inode, u64 bix) | |||
| 892 | return bix; | 892 | return bix; |
| 893 | else if (li->li_data[INDIRECT_INDEX] & LOGFS_FULLY_POPULATED) | 893 | else if (li->li_data[INDIRECT_INDEX] & LOGFS_FULLY_POPULATED) |
| 894 | bix = maxbix(li->li_height); | 894 | bix = maxbix(li->li_height); |
| 895 | else if (bix >= maxbix(li->li_height)) | ||
| 896 | return bix; | ||
| 895 | else { | 897 | else { |
| 896 | bix = seek_holedata_loop(inode, bix, 0); | 898 | bix = seek_holedata_loop(inode, bix, 0); |
| 897 | if (bix < maxbix(li->li_height)) | 899 | if (bix < maxbix(li->li_height)) |
| @@ -1093,17 +1095,25 @@ static int logfs_reserve_bytes(struct inode *inode, int bytes) | |||
| 1093 | int get_page_reserve(struct inode *inode, struct page *page) | 1095 | int get_page_reserve(struct inode *inode, struct page *page) |
| 1094 | { | 1096 | { |
| 1095 | struct logfs_super *super = logfs_super(inode->i_sb); | 1097 | struct logfs_super *super = logfs_super(inode->i_sb); |
| 1098 | struct logfs_block *block = logfs_block(page); | ||
| 1096 | int ret; | 1099 | int ret; |
| 1097 | 1100 | ||
| 1098 | if (logfs_block(page) && logfs_block(page)->reserved_bytes) | 1101 | if (block && block->reserved_bytes) |
| 1099 | return 0; | 1102 | return 0; |
| 1100 | 1103 | ||
| 1101 | logfs_get_wblocks(inode->i_sb, page, WF_LOCK); | 1104 | logfs_get_wblocks(inode->i_sb, page, WF_LOCK); |
| 1102 | ret = logfs_reserve_bytes(inode, 6 * LOGFS_MAX_OBJECTSIZE); | 1105 | while ((ret = logfs_reserve_bytes(inode, 6 * LOGFS_MAX_OBJECTSIZE)) && |
| 1106 | !list_empty(&super->s_writeback_list)) { | ||
| 1107 | block = list_entry(super->s_writeback_list.next, | ||
| 1108 | struct logfs_block, alias_list); | ||
| 1109 | block->ops->write_block(block); | ||
| 1110 | } | ||
| 1103 | if (!ret) { | 1111 | if (!ret) { |
| 1104 | alloc_data_block(inode, page); | 1112 | alloc_data_block(inode, page); |
| 1105 | logfs_block(page)->reserved_bytes += 6 * LOGFS_MAX_OBJECTSIZE; | 1113 | block = logfs_block(page); |
| 1114 | block->reserved_bytes += 6 * LOGFS_MAX_OBJECTSIZE; | ||
| 1106 | super->s_dirty_pages += 6 * LOGFS_MAX_OBJECTSIZE; | 1115 | super->s_dirty_pages += 6 * LOGFS_MAX_OBJECTSIZE; |
| 1116 | list_move_tail(&block->alias_list, &super->s_writeback_list); | ||
| 1107 | } | 1117 | } |
| 1108 | logfs_put_wblocks(inode->i_sb, page, WF_LOCK); | 1118 | logfs_put_wblocks(inode->i_sb, page, WF_LOCK); |
| 1109 | return ret; | 1119 | return ret; |
| @@ -1861,7 +1871,7 @@ int logfs_truncate(struct inode *inode, u64 target) | |||
| 1861 | size = target; | 1871 | size = target; |
| 1862 | 1872 | ||
| 1863 | logfs_get_wblocks(sb, NULL, 1); | 1873 | logfs_get_wblocks(sb, NULL, 1); |
| 1864 | err = __logfs_truncate(inode, target); | 1874 | err = __logfs_truncate(inode, size); |
| 1865 | if (!err) | 1875 | if (!err) |
| 1866 | err = __logfs_write_inode(inode, 0); | 1876 | err = __logfs_write_inode(inode, 0); |
| 1867 | logfs_put_wblocks(sb, NULL, 1); | 1877 | logfs_put_wblocks(sb, NULL, 1); |
| @@ -2249,6 +2259,7 @@ int logfs_init_rw(struct super_block *sb) | |||
| 2249 | int min_fill = 3 * super->s_no_blocks; | 2259 | int min_fill = 3 * super->s_no_blocks; |
| 2250 | 2260 | ||
| 2251 | INIT_LIST_HEAD(&super->s_object_alias); | 2261 | INIT_LIST_HEAD(&super->s_object_alias); |
| 2262 | INIT_LIST_HEAD(&super->s_writeback_list); | ||
| 2252 | mutex_init(&super->s_write_mutex); | 2263 | mutex_init(&super->s_write_mutex); |
| 2253 | super->s_block_pool = mempool_create_kmalloc_pool(min_fill, | 2264 | super->s_block_pool = mempool_create_kmalloc_pool(min_fill, |
| 2254 | sizeof(struct logfs_block)); | 2265 | sizeof(struct logfs_block)); |
diff --git a/fs/logfs/segment.c b/fs/logfs/segment.c index f77ce2b470ba..a9657afb70ad 100644 --- a/fs/logfs/segment.c +++ b/fs/logfs/segment.c | |||
| @@ -67,7 +67,7 @@ static struct page *get_mapping_page(struct super_block *sb, pgoff_t index, | |||
| 67 | return page; | 67 | return page; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | void __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, | 70 | int __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, |
| 71 | int use_filler) | 71 | int use_filler) |
| 72 | { | 72 | { |
| 73 | pgoff_t index = ofs >> PAGE_SHIFT; | 73 | pgoff_t index = ofs >> PAGE_SHIFT; |
| @@ -81,8 +81,10 @@ void __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, | |||
| 81 | copylen = min((ulong)len, PAGE_SIZE - offset); | 81 | copylen = min((ulong)len, PAGE_SIZE - offset); |
| 82 | 82 | ||
| 83 | page = get_mapping_page(area->a_sb, index, use_filler); | 83 | page = get_mapping_page(area->a_sb, index, use_filler); |
| 84 | SetPageUptodate(page); | 84 | if (IS_ERR(page)) |
| 85 | return PTR_ERR(page); | ||
| 85 | BUG_ON(!page); /* FIXME: reserve a pool */ | 86 | BUG_ON(!page); /* FIXME: reserve a pool */ |
| 87 | SetPageUptodate(page); | ||
| 86 | memcpy(page_address(page) + offset, buf, copylen); | 88 | memcpy(page_address(page) + offset, buf, copylen); |
| 87 | SetPagePrivate(page); | 89 | SetPagePrivate(page); |
| 88 | page_cache_release(page); | 90 | page_cache_release(page); |
| @@ -92,6 +94,7 @@ void __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len, | |||
| 92 | offset = 0; | 94 | offset = 0; |
| 93 | index++; | 95 | index++; |
| 94 | } while (len); | 96 | } while (len); |
| 97 | return 0; | ||
| 95 | } | 98 | } |
| 96 | 99 | ||
| 97 | static void pad_partial_page(struct logfs_area *area) | 100 | static void pad_partial_page(struct logfs_area *area) |
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index 5866ee6e1327..d651e10a1e9c 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c | |||
| @@ -138,10 +138,14 @@ static int logfs_sb_set(struct super_block *sb, void *_super) | |||
| 138 | sb->s_fs_info = super; | 138 | sb->s_fs_info = super; |
| 139 | sb->s_mtd = super->s_mtd; | 139 | sb->s_mtd = super->s_mtd; |
| 140 | sb->s_bdev = super->s_bdev; | 140 | sb->s_bdev = super->s_bdev; |
| 141 | #ifdef CONFIG_BLOCK | ||
| 141 | if (sb->s_bdev) | 142 | if (sb->s_bdev) |
| 142 | sb->s_bdi = &bdev_get_queue(sb->s_bdev)->backing_dev_info; | 143 | sb->s_bdi = &bdev_get_queue(sb->s_bdev)->backing_dev_info; |
| 144 | #endif | ||
| 145 | #ifdef CONFIG_MTD | ||
| 143 | if (sb->s_mtd) | 146 | if (sb->s_mtd) |
| 144 | sb->s_bdi = sb->s_mtd->backing_dev_info; | 147 | sb->s_bdi = sb->s_mtd->backing_dev_info; |
| 148 | #endif | ||
| 145 | return 0; | 149 | return 0; |
| 146 | } | 150 | } |
| 147 | 151 | ||
| @@ -333,27 +337,27 @@ static int logfs_get_sb_final(struct super_block *sb, struct vfsmount *mnt) | |||
| 333 | goto fail; | 337 | goto fail; |
| 334 | 338 | ||
| 335 | sb->s_root = d_alloc_root(rootdir); | 339 | sb->s_root = d_alloc_root(rootdir); |
| 336 | if (!sb->s_root) | 340 | if (!sb->s_root) { |
| 337 | goto fail2; | 341 | iput(rootdir); |
| 342 | goto fail; | ||
| 343 | } | ||
| 338 | 344 | ||
| 339 | super->s_erase_page = alloc_pages(GFP_KERNEL, 0); | 345 | super->s_erase_page = alloc_pages(GFP_KERNEL, 0); |
| 340 | if (!super->s_erase_page) | 346 | if (!super->s_erase_page) |
| 341 | goto fail2; | 347 | goto fail; |
| 342 | memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); | 348 | memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); |
| 343 | 349 | ||
| 344 | /* FIXME: check for read-only mounts */ | 350 | /* FIXME: check for read-only mounts */ |
| 345 | err = logfs_make_writeable(sb); | 351 | err = logfs_make_writeable(sb); |
| 346 | if (err) | 352 | if (err) |
| 347 | goto fail3; | 353 | goto fail1; |
| 348 | 354 | ||
| 349 | log_super("LogFS: Finished mounting\n"); | 355 | log_super("LogFS: Finished mounting\n"); |
| 350 | simple_set_mnt(mnt, sb); | 356 | simple_set_mnt(mnt, sb); |
| 351 | return 0; | 357 | return 0; |
| 352 | 358 | ||
| 353 | fail3: | 359 | fail1: |
| 354 | __free_page(super->s_erase_page); | 360 | __free_page(super->s_erase_page); |
| 355 | fail2: | ||
| 356 | iput(rootdir); | ||
| 357 | fail: | 361 | fail: |
| 358 | iput(logfs_super(sb)->s_master_inode); | 362 | iput(logfs_super(sb)->s_master_inode); |
| 359 | return -EIO; | 363 | return -EIO; |
| @@ -382,7 +386,7 @@ static struct page *find_super_block(struct super_block *sb) | |||
| 382 | if (!first || IS_ERR(first)) | 386 | if (!first || IS_ERR(first)) |
| 383 | return NULL; | 387 | return NULL; |
| 384 | last = super->s_devops->find_last_sb(sb, &super->s_sb_ofs[1]); | 388 | last = super->s_devops->find_last_sb(sb, &super->s_sb_ofs[1]); |
| 385 | if (!last || IS_ERR(first)) { | 389 | if (!last || IS_ERR(last)) { |
| 386 | page_cache_release(first); | 390 | page_cache_release(first); |
| 387 | return NULL; | 391 | return NULL; |
| 388 | } | 392 | } |
| @@ -413,7 +417,7 @@ static int __logfs_read_sb(struct super_block *sb) | |||
| 413 | 417 | ||
| 414 | page = find_super_block(sb); | 418 | page = find_super_block(sb); |
| 415 | if (!page) | 419 | if (!page) |
| 416 | return -EIO; | 420 | return -EINVAL; |
| 417 | 421 | ||
| 418 | ds = page_address(page); | 422 | ds = page_address(page); |
| 419 | super->s_size = be64_to_cpu(ds->ds_filesystem_size); | 423 | super->s_size = be64_to_cpu(ds->ds_filesystem_size); |
diff --git a/fs/namei.c b/fs/namei.c index a7dce91a7e42..b86b96fe1dc3 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1641,7 +1641,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | |||
| 1641 | if (nd->last.name[nd->last.len]) { | 1641 | if (nd->last.name[nd->last.len]) { |
| 1642 | if (open_flag & O_CREAT) | 1642 | if (open_flag & O_CREAT) |
| 1643 | goto exit; | 1643 | goto exit; |
| 1644 | nd->flags |= LOOKUP_DIRECTORY; | 1644 | nd->flags |= LOOKUP_DIRECTORY | LOOKUP_FOLLOW; |
| 1645 | } | 1645 | } |
| 1646 | 1646 | ||
| 1647 | /* just plain open? */ | 1647 | /* just plain open? */ |
| @@ -1830,6 +1830,8 @@ reval: | |||
| 1830 | } | 1830 | } |
| 1831 | if (open_flag & O_DIRECTORY) | 1831 | if (open_flag & O_DIRECTORY) |
| 1832 | nd.flags |= LOOKUP_DIRECTORY; | 1832 | nd.flags |= LOOKUP_DIRECTORY; |
| 1833 | if (!(open_flag & O_NOFOLLOW)) | ||
| 1834 | nd.flags |= LOOKUP_FOLLOW; | ||
| 1833 | filp = do_last(&nd, &path, open_flag, acc_mode, mode, pathname); | 1835 | filp = do_last(&nd, &path, open_flag, acc_mode, mode, pathname); |
| 1834 | while (unlikely(!filp)) { /* trailing symlink */ | 1836 | while (unlikely(!filp)) { /* trailing symlink */ |
| 1835 | struct path holder; | 1837 | struct path holder; |
| @@ -1837,7 +1839,7 @@ reval: | |||
| 1837 | void *cookie; | 1839 | void *cookie; |
| 1838 | error = -ELOOP; | 1840 | error = -ELOOP; |
| 1839 | /* S_ISDIR part is a temporary automount kludge */ | 1841 | /* S_ISDIR part is a temporary automount kludge */ |
| 1840 | if ((open_flag & O_NOFOLLOW) && !S_ISDIR(inode->i_mode)) | 1842 | if (!(nd.flags & LOOKUP_FOLLOW) && !S_ISDIR(inode->i_mode)) |
| 1841 | goto exit_dput; | 1843 | goto exit_dput; |
| 1842 | if (count++ == 32) | 1844 | if (count++ == 32) |
| 1843 | goto exit_dput; | 1845 | goto exit_dput; |
| @@ -2174,8 +2176,10 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 2174 | error = security_inode_rmdir(dir, dentry); | 2176 | error = security_inode_rmdir(dir, dentry); |
| 2175 | if (!error) { | 2177 | if (!error) { |
| 2176 | error = dir->i_op->rmdir(dir, dentry); | 2178 | error = dir->i_op->rmdir(dir, dentry); |
| 2177 | if (!error) | 2179 | if (!error) { |
| 2178 | dentry->d_inode->i_flags |= S_DEAD; | 2180 | dentry->d_inode->i_flags |= S_DEAD; |
| 2181 | dont_mount(dentry); | ||
| 2182 | } | ||
| 2179 | } | 2183 | } |
| 2180 | } | 2184 | } |
| 2181 | mutex_unlock(&dentry->d_inode->i_mutex); | 2185 | mutex_unlock(&dentry->d_inode->i_mutex); |
| @@ -2259,7 +2263,7 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry) | |||
| 2259 | if (!error) { | 2263 | if (!error) { |
| 2260 | error = dir->i_op->unlink(dir, dentry); | 2264 | error = dir->i_op->unlink(dir, dentry); |
| 2261 | if (!error) | 2265 | if (!error) |
| 2262 | dentry->d_inode->i_flags |= S_DEAD; | 2266 | dont_mount(dentry); |
| 2263 | } | 2267 | } |
| 2264 | } | 2268 | } |
| 2265 | mutex_unlock(&dentry->d_inode->i_mutex); | 2269 | mutex_unlock(&dentry->d_inode->i_mutex); |
| @@ -2570,17 +2574,20 @@ static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry, | |||
| 2570 | return error; | 2574 | return error; |
| 2571 | 2575 | ||
| 2572 | target = new_dentry->d_inode; | 2576 | target = new_dentry->d_inode; |
| 2573 | if (target) { | 2577 | if (target) |
| 2574 | mutex_lock(&target->i_mutex); | 2578 | mutex_lock(&target->i_mutex); |
| 2575 | dentry_unhash(new_dentry); | ||
| 2576 | } | ||
| 2577 | if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry)) | 2579 | if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry)) |
| 2578 | error = -EBUSY; | 2580 | error = -EBUSY; |
| 2579 | else | 2581 | else { |
| 2582 | if (target) | ||
| 2583 | dentry_unhash(new_dentry); | ||
| 2580 | error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); | 2584 | error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); |
| 2585 | } | ||
| 2581 | if (target) { | 2586 | if (target) { |
| 2582 | if (!error) | 2587 | if (!error) { |
| 2583 | target->i_flags |= S_DEAD; | 2588 | target->i_flags |= S_DEAD; |
| 2589 | dont_mount(new_dentry); | ||
| 2590 | } | ||
| 2584 | mutex_unlock(&target->i_mutex); | 2591 | mutex_unlock(&target->i_mutex); |
| 2585 | if (d_unhashed(new_dentry)) | 2592 | if (d_unhashed(new_dentry)) |
| 2586 | d_rehash(new_dentry); | 2593 | d_rehash(new_dentry); |
| @@ -2612,7 +2619,7 @@ static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry, | |||
| 2612 | error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); | 2619 | error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); |
| 2613 | if (!error) { | 2620 | if (!error) { |
| 2614 | if (target) | 2621 | if (target) |
| 2615 | target->i_flags |= S_DEAD; | 2622 | dont_mount(new_dentry); |
| 2616 | if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) | 2623 | if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) |
| 2617 | d_move(old_dentry, new_dentry); | 2624 | d_move(old_dentry, new_dentry); |
| 2618 | } | 2625 | } |
diff --git a/fs/namespace.c b/fs/namespace.c index 8174c8ab5c70..f20cb57d1067 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -1432,7 +1432,7 @@ static int graft_tree(struct vfsmount *mnt, struct path *path) | |||
| 1432 | 1432 | ||
| 1433 | err = -ENOENT; | 1433 | err = -ENOENT; |
| 1434 | mutex_lock(&path->dentry->d_inode->i_mutex); | 1434 | mutex_lock(&path->dentry->d_inode->i_mutex); |
| 1435 | if (IS_DEADDIR(path->dentry->d_inode)) | 1435 | if (cant_mount(path->dentry)) |
| 1436 | goto out_unlock; | 1436 | goto out_unlock; |
| 1437 | 1437 | ||
| 1438 | err = security_sb_check_sb(mnt, path); | 1438 | err = security_sb_check_sb(mnt, path); |
| @@ -1623,7 +1623,7 @@ static int do_move_mount(struct path *path, char *old_name) | |||
| 1623 | 1623 | ||
| 1624 | err = -ENOENT; | 1624 | err = -ENOENT; |
| 1625 | mutex_lock(&path->dentry->d_inode->i_mutex); | 1625 | mutex_lock(&path->dentry->d_inode->i_mutex); |
| 1626 | if (IS_DEADDIR(path->dentry->d_inode)) | 1626 | if (cant_mount(path->dentry)) |
| 1627 | goto out1; | 1627 | goto out1; |
| 1628 | 1628 | ||
| 1629 | if (d_unlinked(path->dentry)) | 1629 | if (d_unlinked(path->dentry)) |
| @@ -2234,7 +2234,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root, | |||
| 2234 | if (!check_mnt(root.mnt)) | 2234 | if (!check_mnt(root.mnt)) |
| 2235 | goto out2; | 2235 | goto out2; |
| 2236 | error = -ENOENT; | 2236 | error = -ENOENT; |
| 2237 | if (IS_DEADDIR(new.dentry->d_inode)) | 2237 | if (cant_mount(old.dentry)) |
| 2238 | goto out2; | 2238 | goto out2; |
| 2239 | if (d_unlinked(new.dentry)) | 2239 | if (d_unlinked(new.dentry)) |
| 2240 | goto out2; | 2240 | goto out2; |
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index 1afb0a10229f..e27960cd76ab 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/path.h> /* struct path */ | 28 | #include <linux/path.h> /* struct path */ |
| 29 | #include <linux/slab.h> /* kmem_* */ | 29 | #include <linux/slab.h> /* kmem_* */ |
| 30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
| 31 | #include <linux/sched.h> | ||
| 31 | 32 | ||
| 32 | #include "inotify.h" | 33 | #include "inotify.h" |
| 33 | 34 | ||
| @@ -146,6 +147,7 @@ static void inotify_free_group_priv(struct fsnotify_group *group) | |||
| 146 | idr_for_each(&group->inotify_data.idr, idr_callback, group); | 147 | idr_for_each(&group->inotify_data.idr, idr_callback, group); |
| 147 | idr_remove_all(&group->inotify_data.idr); | 148 | idr_remove_all(&group->inotify_data.idr); |
| 148 | idr_destroy(&group->inotify_data.idr); | 149 | idr_destroy(&group->inotify_data.idr); |
| 150 | free_uid(group->inotify_data.user); | ||
| 149 | } | 151 | } |
| 150 | 152 | ||
| 151 | void inotify_free_event_priv(struct fsnotify_event_private_data *fsn_event_priv) | 153 | void inotify_free_event_priv(struct fsnotify_event_private_data *fsn_event_priv) |
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 472cdf29ef82..e46ca685b9be 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c | |||
| @@ -546,21 +546,24 @@ retry: | |||
| 546 | if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL))) | 546 | if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL))) |
| 547 | goto out_err; | 547 | goto out_err; |
| 548 | 548 | ||
| 549 | /* we are putting the mark on the idr, take a reference */ | ||
| 550 | fsnotify_get_mark(&tmp_ientry->fsn_entry); | ||
| 551 | |||
| 549 | spin_lock(&group->inotify_data.idr_lock); | 552 | spin_lock(&group->inotify_data.idr_lock); |
| 550 | ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, | 553 | ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, |
| 551 | group->inotify_data.last_wd+1, | 554 | group->inotify_data.last_wd+1, |
| 552 | &tmp_ientry->wd); | 555 | &tmp_ientry->wd); |
| 553 | spin_unlock(&group->inotify_data.idr_lock); | 556 | spin_unlock(&group->inotify_data.idr_lock); |
| 554 | if (ret) { | 557 | if (ret) { |
| 558 | /* we didn't get on the idr, drop the idr reference */ | ||
| 559 | fsnotify_put_mark(&tmp_ientry->fsn_entry); | ||
| 560 | |||
| 555 | /* idr was out of memory allocate and try again */ | 561 | /* idr was out of memory allocate and try again */ |
| 556 | if (ret == -EAGAIN) | 562 | if (ret == -EAGAIN) |
| 557 | goto retry; | 563 | goto retry; |
| 558 | goto out_err; | 564 | goto out_err; |
| 559 | } | 565 | } |
| 560 | 566 | ||
| 561 | /* we put the mark on the idr, take a reference */ | ||
| 562 | fsnotify_get_mark(&tmp_ientry->fsn_entry); | ||
| 563 | |||
| 564 | /* we are on the idr, now get on the inode */ | 567 | /* we are on the idr, now get on the inode */ |
| 565 | ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode); | 568 | ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode); |
| 566 | if (ret) { | 569 | if (ret) { |
| @@ -578,16 +581,13 @@ retry: | |||
| 578 | /* return the watch descriptor for this new entry */ | 581 | /* return the watch descriptor for this new entry */ |
| 579 | ret = tmp_ientry->wd; | 582 | ret = tmp_ientry->wd; |
| 580 | 583 | ||
| 581 | /* match the ref from fsnotify_init_markentry() */ | ||
| 582 | fsnotify_put_mark(&tmp_ientry->fsn_entry); | ||
| 583 | |||
| 584 | /* if this mark added a new event update the group mask */ | 584 | /* if this mark added a new event update the group mask */ |
| 585 | if (mask & ~group->mask) | 585 | if (mask & ~group->mask) |
| 586 | fsnotify_recalc_group_mask(group); | 586 | fsnotify_recalc_group_mask(group); |
| 587 | 587 | ||
| 588 | out_err: | 588 | out_err: |
| 589 | if (ret < 0) | 589 | /* match the ref from fsnotify_init_markentry() */ |
| 590 | kmem_cache_free(inotify_inode_mark_cachep, tmp_ientry); | 590 | fsnotify_put_mark(&tmp_ientry->fsn_entry); |
| 591 | 591 | ||
| 592 | return ret; | 592 | return ret; |
| 593 | } | 593 | } |
diff --git a/fs/proc/array.c b/fs/proc/array.c index e51f2ec2c5e5..885ab5513ac5 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
| @@ -81,7 +81,6 @@ | |||
| 81 | #include <linux/pid_namespace.h> | 81 | #include <linux/pid_namespace.h> |
| 82 | #include <linux/ptrace.h> | 82 | #include <linux/ptrace.h> |
| 83 | #include <linux/tracehook.h> | 83 | #include <linux/tracehook.h> |
| 84 | #include <linux/swapops.h> | ||
| 85 | 84 | ||
| 86 | #include <asm/pgtable.h> | 85 | #include <asm/pgtable.h> |
| 87 | #include <asm/processor.h> | 86 | #include <asm/processor.h> |
| @@ -495,7 +494,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
| 495 | rsslim, | 494 | rsslim, |
| 496 | mm ? mm->start_code : 0, | 495 | mm ? mm->start_code : 0, |
| 497 | mm ? mm->end_code : 0, | 496 | mm ? mm->end_code : 0, |
| 498 | (permitted && mm) ? task->stack_start : 0, | 497 | (permitted && mm) ? mm->start_stack : 0, |
| 499 | esp, | 498 | esp, |
| 500 | eip, | 499 | eip, |
| 501 | /* The signal information here is obsolete. | 500 | /* The signal information here is obsolete. |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 070553427dd5..47f5b145f56e 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
| @@ -247,25 +247,6 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma) | |||
| 247 | } else if (vma->vm_start <= mm->start_stack && | 247 | } else if (vma->vm_start <= mm->start_stack && |
| 248 | vma->vm_end >= mm->start_stack) { | 248 | vma->vm_end >= mm->start_stack) { |
| 249 | name = "[stack]"; | 249 | name = "[stack]"; |
| 250 | } else { | ||
| 251 | unsigned long stack_start; | ||
| 252 | struct proc_maps_private *pmp; | ||
| 253 | |||
| 254 | pmp = m->private; | ||
| 255 | stack_start = pmp->task->stack_start; | ||
| 256 | |||
| 257 | if (vma->vm_start <= stack_start && | ||
| 258 | vma->vm_end >= stack_start) { | ||
| 259 | pad_len_spaces(m, len); | ||
| 260 | seq_printf(m, | ||
| 261 | "[threadstack:%08lx]", | ||
| 262 | #ifdef CONFIG_STACK_GROWSUP | ||
| 263 | vma->vm_end - stack_start | ||
| 264 | #else | ||
| 265 | stack_start - vma->vm_start | ||
| 266 | #endif | ||
| 267 | ); | ||
| 268 | } | ||
| 269 | } | 250 | } |
| 270 | } else { | 251 | } else { |
| 271 | name = "[vdso]"; | 252 | name = "[vdso]"; |
diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index 4e50286a4cc3..1dabed286b4c 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c | |||
| @@ -164,8 +164,8 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_ | |||
| 164 | name, de->name)) | 164 | name, de->name)) |
| 165 | goto found; | 165 | goto found; |
| 166 | } | 166 | } |
| 167 | dir_put_page(page); | ||
| 167 | } | 168 | } |
| 168 | dir_put_page(page); | ||
| 169 | 169 | ||
| 170 | if (++n >= npages) | 170 | if (++n >= npages) |
| 171 | n = 0; | 171 | n = 0; |
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index c99c64dc5f3d..c33749f95b32 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | * Atomically reads the value of @v. Note that the guaranteed | 33 | * Atomically reads the value of @v. Note that the guaranteed |
| 34 | * useful range of an atomic_t is only 24 bits. | 34 | * useful range of an atomic_t is only 24 bits. |
| 35 | */ | 35 | */ |
| 36 | #define atomic_read(v) ((v)->counter) | 36 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
| 37 | 37 | ||
| 38 | /** | 38 | /** |
| 39 | * atomic_set - set atomic variable | 39 | * atomic_set - set atomic variable |
diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h index e694263445f7..69206957b72c 100644 --- a/include/asm-generic/dma-mapping-common.h +++ b/include/asm-generic/dma-mapping-common.h | |||
| @@ -131,7 +131,7 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, | |||
| 131 | debug_dma_sync_single_range_for_cpu(dev, addr, offset, size, dir); | 131 | debug_dma_sync_single_range_for_cpu(dev, addr, offset, size, dir); |
| 132 | 132 | ||
| 133 | } else | 133 | } else |
| 134 | dma_sync_single_for_cpu(dev, addr, size, dir); | 134 | dma_sync_single_for_cpu(dev, addr + offset, size, dir); |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | static inline void dma_sync_single_range_for_device(struct device *dev, | 137 | static inline void dma_sync_single_range_for_device(struct device *dev, |
| @@ -148,7 +148,7 @@ static inline void dma_sync_single_range_for_device(struct device *dev, | |||
| 148 | debug_dma_sync_single_range_for_device(dev, addr, offset, size, dir); | 148 | debug_dma_sync_single_range_for_device(dev, addr, offset, size, dir); |
| 149 | 149 | ||
| 150 | } else | 150 | } else |
| 151 | dma_sync_single_for_device(dev, addr, size, dir); | 151 | dma_sync_single_for_device(dev, addr + offset, size, dir); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | static inline void | 154 | static inline void |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 30b93b2a01a4..eebb617c17d8 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -186,6 +186,8 @@ d_iput: no no no yes | |||
| 186 | 186 | ||
| 187 | #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x0080 /* Parent inode is watched by some fsnotify listener */ | 187 | #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x0080 /* Parent inode is watched by some fsnotify listener */ |
| 188 | 188 | ||
| 189 | #define DCACHE_CANT_MOUNT 0x0100 | ||
| 190 | |||
| 189 | extern spinlock_t dcache_lock; | 191 | extern spinlock_t dcache_lock; |
| 190 | extern seqlock_t rename_lock; | 192 | extern seqlock_t rename_lock; |
| 191 | 193 | ||
| @@ -358,6 +360,18 @@ static inline int d_unlinked(struct dentry *dentry) | |||
| 358 | return d_unhashed(dentry) && !IS_ROOT(dentry); | 360 | return d_unhashed(dentry) && !IS_ROOT(dentry); |
| 359 | } | 361 | } |
| 360 | 362 | ||
| 363 | static inline int cant_mount(struct dentry *dentry) | ||
| 364 | { | ||
| 365 | return (dentry->d_flags & DCACHE_CANT_MOUNT); | ||
| 366 | } | ||
| 367 | |||
| 368 | static inline void dont_mount(struct dentry *dentry) | ||
| 369 | { | ||
| 370 | spin_lock(&dentry->d_lock); | ||
| 371 | dentry->d_flags |= DCACHE_CANT_MOUNT; | ||
| 372 | spin_unlock(&dentry->d_lock); | ||
| 373 | } | ||
| 374 | |||
| 361 | static inline struct dentry *dget_parent(struct dentry *dentry) | 375 | static inline struct dentry *dget_parent(struct dentry *dentry) |
| 362 | { | 376 | { |
| 363 | struct dentry *ret; | 377 | struct dentry *ret; |
diff --git a/include/linux/if_link.h b/include/linux/if_link.h index c9bf92cd7653..d94963b379d9 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h | |||
| @@ -79,10 +79,7 @@ enum { | |||
| 79 | IFLA_NET_NS_PID, | 79 | IFLA_NET_NS_PID, |
| 80 | IFLA_IFALIAS, | 80 | IFLA_IFALIAS, |
| 81 | IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ | 81 | IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ |
| 82 | IFLA_VF_MAC, /* Hardware queue specific attributes */ | 82 | IFLA_VFINFO_LIST, |
| 83 | IFLA_VF_VLAN, | ||
| 84 | IFLA_VF_TX_RATE, /* TX Bandwidth Allocation */ | ||
| 85 | IFLA_VFINFO, | ||
| 86 | __IFLA_MAX | 83 | __IFLA_MAX |
| 87 | }; | 84 | }; |
| 88 | 85 | ||
| @@ -203,6 +200,24 @@ enum macvlan_mode { | |||
| 203 | 200 | ||
| 204 | /* SR-IOV virtual function managment section */ | 201 | /* SR-IOV virtual function managment section */ |
| 205 | 202 | ||
| 203 | enum { | ||
| 204 | IFLA_VF_INFO_UNSPEC, | ||
| 205 | IFLA_VF_INFO, | ||
| 206 | __IFLA_VF_INFO_MAX, | ||
| 207 | }; | ||
| 208 | |||
| 209 | #define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) | ||
| 210 | |||
| 211 | enum { | ||
| 212 | IFLA_VF_UNSPEC, | ||
| 213 | IFLA_VF_MAC, /* Hardware queue specific attributes */ | ||
| 214 | IFLA_VF_VLAN, | ||
| 215 | IFLA_VF_TX_RATE, /* TX Bandwidth Allocation */ | ||
| 216 | __IFLA_VF_MAX, | ||
| 217 | }; | ||
| 218 | |||
| 219 | #define IFLA_VF_MAX (__IFLA_VF_MAX - 1) | ||
| 220 | |||
| 206 | struct ifla_vf_mac { | 221 | struct ifla_vf_mac { |
| 207 | __u32 vf; | 222 | __u32 vf; |
| 208 | __u8 mac[32]; /* MAX_ADDR_LEN */ | 223 | __u8 mac[32]; /* MAX_ADDR_LEN */ |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index f58e9d836f32..56fde4364e4c 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
| @@ -474,4 +474,13 @@ struct platform_device_id { | |||
| 474 | __attribute__((aligned(sizeof(kernel_ulong_t)))); | 474 | __attribute__((aligned(sizeof(kernel_ulong_t)))); |
| 475 | }; | 475 | }; |
| 476 | 476 | ||
| 477 | struct zorro_device_id { | ||
| 478 | __u32 id; /* Device ID or ZORRO_WILDCARD */ | ||
| 479 | kernel_ulong_t driver_data; /* Data private to the driver */ | ||
| 480 | }; | ||
| 481 | |||
| 482 | #define ZORRO_WILDCARD (0xffffffff) /* not official */ | ||
| 483 | |||
| 484 | #define ZORRO_DEVICE_MODALIAS_FMT "zorro:i%08X" | ||
| 485 | |||
| 477 | #endif /* LINUX_MOD_DEVICETABLE_H */ | 486 | #endif /* LINUX_MOD_DEVICETABLE_H */ |
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 212da17d06af..5417944d3687 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h | |||
| @@ -44,12 +44,14 @@ extern int platform_get_irq_byname(struct platform_device *, const char *); | |||
| 44 | extern int platform_add_devices(struct platform_device **, int); | 44 | extern int platform_add_devices(struct platform_device **, int); |
| 45 | 45 | ||
| 46 | extern struct platform_device *platform_device_register_simple(const char *, int id, | 46 | extern struct platform_device *platform_device_register_simple(const char *, int id, |
| 47 | struct resource *, unsigned int); | 47 | const struct resource *, unsigned int); |
| 48 | extern struct platform_device *platform_device_register_data(struct device *, | 48 | extern struct platform_device *platform_device_register_data(struct device *, |
| 49 | const char *, int, const void *, size_t); | 49 | const char *, int, const void *, size_t); |
| 50 | 50 | ||
| 51 | extern struct platform_device *platform_device_alloc(const char *name, int id); | 51 | extern struct platform_device *platform_device_alloc(const char *name, int id); |
| 52 | extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num); | 52 | extern int platform_device_add_resources(struct platform_device *pdev, |
| 53 | const struct resource *res, | ||
| 54 | unsigned int num); | ||
| 53 | extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size); | 55 | extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size); |
| 54 | extern int platform_device_add(struct platform_device *pdev); | 56 | extern int platform_device_add(struct platform_device *pdev); |
| 55 | extern void platform_device_del(struct platform_device *pdev); | 57 | extern void platform_device_del(struct platform_device *pdev); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index dad7f668ebf7..2b7b81df78b3 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1497,7 +1497,6 @@ struct task_struct { | |||
| 1497 | /* bitmask of trace recursion */ | 1497 | /* bitmask of trace recursion */ |
| 1498 | unsigned long trace_recursion; | 1498 | unsigned long trace_recursion; |
| 1499 | #endif /* CONFIG_TRACING */ | 1499 | #endif /* CONFIG_TRACING */ |
| 1500 | unsigned long stack_start; | ||
| 1501 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */ | 1500 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */ |
| 1502 | struct memcg_batch_info { | 1501 | struct memcg_batch_info { |
| 1503 | int do_batch; /* incremented when batch uncharge started */ | 1502 | int do_batch; /* incremented when batch uncharge started */ |
diff --git a/include/linux/types.h b/include/linux/types.h index c42724f8c802..23d237a075e2 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
| @@ -188,12 +188,12 @@ typedef u32 phys_addr_t; | |||
| 188 | typedef phys_addr_t resource_size_t; | 188 | typedef phys_addr_t resource_size_t; |
| 189 | 189 | ||
| 190 | typedef struct { | 190 | typedef struct { |
| 191 | volatile int counter; | 191 | int counter; |
| 192 | } atomic_t; | 192 | } atomic_t; |
| 193 | 193 | ||
| 194 | #ifdef CONFIG_64BIT | 194 | #ifdef CONFIG_64BIT |
| 195 | typedef struct { | 195 | typedef struct { |
| 196 | volatile long counter; | 196 | long counter; |
| 197 | } atomic64_t; | 197 | } atomic64_t; |
| 198 | #endif | 198 | #endif |
| 199 | 199 | ||
diff --git a/include/linux/zorro.h b/include/linux/zorro.h index 913bfc226dda..7bf9db525e9e 100644 --- a/include/linux/zorro.h +++ b/include/linux/zorro.h | |||
| @@ -38,8 +38,6 @@ | |||
| 38 | typedef __u32 zorro_id; | 38 | typedef __u32 zorro_id; |
| 39 | 39 | ||
| 40 | 40 | ||
| 41 | #define ZORRO_WILDCARD (0xffffffff) /* not official */ | ||
| 42 | |||
| 43 | /* Include the ID list */ | 41 | /* Include the ID list */ |
| 44 | #include <linux/zorro_ids.h> | 42 | #include <linux/zorro_ids.h> |
| 45 | 43 | ||
| @@ -116,6 +114,7 @@ struct ConfigDev { | |||
| 116 | 114 | ||
| 117 | #include <linux/init.h> | 115 | #include <linux/init.h> |
| 118 | #include <linux/ioport.h> | 116 | #include <linux/ioport.h> |
| 117 | #include <linux/mod_devicetable.h> | ||
| 119 | 118 | ||
| 120 | #include <asm/zorro.h> | 119 | #include <asm/zorro.h> |
| 121 | 120 | ||
| @@ -142,29 +141,10 @@ struct zorro_dev { | |||
| 142 | * Zorro bus | 141 | * Zorro bus |
| 143 | */ | 142 | */ |
| 144 | 143 | ||
| 145 | struct zorro_bus { | ||
| 146 | struct list_head devices; /* list of devices on this bus */ | ||
| 147 | unsigned int num_resources; /* number of resources */ | ||
| 148 | struct resource resources[4]; /* address space routed to this bus */ | ||
| 149 | struct device dev; | ||
| 150 | char name[10]; | ||
| 151 | }; | ||
| 152 | |||
| 153 | extern struct zorro_bus zorro_bus; /* single Zorro bus */ | ||
| 154 | extern struct bus_type zorro_bus_type; | 144 | extern struct bus_type zorro_bus_type; |
| 155 | 145 | ||
| 156 | 146 | ||
| 157 | /* | 147 | /* |
| 158 | * Zorro device IDs | ||
| 159 | */ | ||
| 160 | |||
| 161 | struct zorro_device_id { | ||
| 162 | zorro_id id; /* Device ID or ZORRO_WILDCARD */ | ||
| 163 | unsigned long driver_data; /* Data private to the driver */ | ||
| 164 | }; | ||
| 165 | |||
| 166 | |||
| 167 | /* | ||
| 168 | * Zorro device drivers | 148 | * Zorro device drivers |
| 169 | */ | 149 | */ |
| 170 | 150 | ||
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 851c813adb3a..61d73e37d543 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h | |||
| @@ -279,6 +279,7 @@ int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype, | |||
| 279 | /* 2nd level prototypes */ | 279 | /* 2nd level prototypes */ |
| 280 | void sctp_generate_t3_rtx_event(unsigned long peer); | 280 | void sctp_generate_t3_rtx_event(unsigned long peer); |
| 281 | void sctp_generate_heartbeat_event(unsigned long peer); | 281 | void sctp_generate_heartbeat_event(unsigned long peer); |
| 282 | void sctp_generate_proto_unreach_event(unsigned long peer); | ||
| 282 | 283 | ||
| 283 | void sctp_ootb_pkt_free(struct sctp_packet *); | 284 | void sctp_ootb_pkt_free(struct sctp_packet *); |
| 284 | 285 | ||
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 597f8e27aaf6..219043a67bf7 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -1010,6 +1010,9 @@ struct sctp_transport { | |||
| 1010 | /* Heartbeat timer is per destination. */ | 1010 | /* Heartbeat timer is per destination. */ |
| 1011 | struct timer_list hb_timer; | 1011 | struct timer_list hb_timer; |
| 1012 | 1012 | ||
| 1013 | /* Timer to handle ICMP proto unreachable envets */ | ||
| 1014 | struct timer_list proto_unreach_timer; | ||
| 1015 | |||
| 1013 | /* Since we're using per-destination retransmission timers | 1016 | /* Since we're using per-destination retransmission timers |
| 1014 | * (see above), we're also using per-destination "transmitted" | 1017 | * (see above), we're also using per-destination "transmitted" |
| 1015 | * queues. This probably ought to be a private struct | 1018 | * queues. This probably ought to be a private struct |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 75be5a28815d..aa04b9a5093b 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -1197,30 +1197,15 @@ extern int tcp_v4_md5_do_del(struct sock *sk, | |||
| 1197 | extern struct tcp_md5sig_pool * __percpu *tcp_alloc_md5sig_pool(struct sock *); | 1197 | extern struct tcp_md5sig_pool * __percpu *tcp_alloc_md5sig_pool(struct sock *); |
| 1198 | extern void tcp_free_md5sig_pool(void); | 1198 | extern void tcp_free_md5sig_pool(void); |
| 1199 | 1199 | ||
| 1200 | extern struct tcp_md5sig_pool *__tcp_get_md5sig_pool(int cpu); | 1200 | extern struct tcp_md5sig_pool *tcp_get_md5sig_pool(void); |
| 1201 | extern void __tcp_put_md5sig_pool(void); | 1201 | extern void tcp_put_md5sig_pool(void); |
| 1202 | |||
| 1202 | extern int tcp_md5_hash_header(struct tcp_md5sig_pool *, struct tcphdr *); | 1203 | extern int tcp_md5_hash_header(struct tcp_md5sig_pool *, struct tcphdr *); |
| 1203 | extern int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *, struct sk_buff *, | 1204 | extern int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *, struct sk_buff *, |
| 1204 | unsigned header_len); | 1205 | unsigned header_len); |
| 1205 | extern int tcp_md5_hash_key(struct tcp_md5sig_pool *hp, | 1206 | extern int tcp_md5_hash_key(struct tcp_md5sig_pool *hp, |
| 1206 | struct tcp_md5sig_key *key); | 1207 | struct tcp_md5sig_key *key); |
| 1207 | 1208 | ||
| 1208 | static inline | ||
| 1209 | struct tcp_md5sig_pool *tcp_get_md5sig_pool(void) | ||
| 1210 | { | ||
| 1211 | int cpu = get_cpu(); | ||
| 1212 | struct tcp_md5sig_pool *ret = __tcp_get_md5sig_pool(cpu); | ||
| 1213 | if (!ret) | ||
| 1214 | put_cpu(); | ||
| 1215 | return ret; | ||
| 1216 | } | ||
| 1217 | |||
| 1218 | static inline void tcp_put_md5sig_pool(void) | ||
| 1219 | { | ||
| 1220 | __tcp_put_md5sig_pool(); | ||
| 1221 | put_cpu(); | ||
| 1222 | } | ||
| 1223 | |||
| 1224 | /* write queue abstraction */ | 1209 | /* write queue abstraction */ |
| 1225 | static inline void tcp_write_queue_purge(struct sock *sk) | 1210 | static inline void tcp_write_queue_purge(struct sock *sk) |
| 1226 | { | 1211 | { |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 722b0130aa94..59a009dc54a8 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -158,7 +158,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
| 158 | u->mq_bytes + mq_bytes > | 158 | u->mq_bytes + mq_bytes > |
| 159 | task_rlimit(p, RLIMIT_MSGQUEUE)) { | 159 | task_rlimit(p, RLIMIT_MSGQUEUE)) { |
| 160 | spin_unlock(&mq_lock); | 160 | spin_unlock(&mq_lock); |
| 161 | kfree(info->messages); | 161 | /* mqueue_delete_inode() releases info->messages */ |
| 162 | goto out_inode; | 162 | goto out_inode; |
| 163 | } | 163 | } |
| 164 | u->mq_bytes += mq_bytes; | 164 | u->mq_bytes += mq_bytes; |
diff --git a/kernel/acct.c b/kernel/acct.c index 24f8c81fc48d..e4c0e1fee9b0 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
| @@ -353,17 +353,18 @@ restart: | |||
| 353 | 353 | ||
| 354 | void acct_exit_ns(struct pid_namespace *ns) | 354 | void acct_exit_ns(struct pid_namespace *ns) |
| 355 | { | 355 | { |
| 356 | struct bsd_acct_struct *acct; | 356 | struct bsd_acct_struct *acct = ns->bacct; |
| 357 | 357 | ||
| 358 | spin_lock(&acct_lock); | 358 | if (acct == NULL) |
| 359 | acct = ns->bacct; | 359 | return; |
| 360 | if (acct != NULL) { | ||
| 361 | if (acct->file != NULL) | ||
| 362 | acct_file_reopen(acct, NULL, NULL); | ||
| 363 | 360 | ||
| 364 | kfree(acct); | 361 | del_timer_sync(&acct->timer); |
| 365 | } | 362 | spin_lock(&acct_lock); |
| 363 | if (acct->file != NULL) | ||
| 364 | acct_file_reopen(acct, NULL, NULL); | ||
| 366 | spin_unlock(&acct_lock); | 365 | spin_unlock(&acct_lock); |
| 366 | |||
| 367 | kfree(acct); | ||
| 367 | } | 368 | } |
| 368 | 369 | ||
| 369 | /* | 370 | /* |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 3a53c771e503..6d870f2d1228 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -4435,7 +4435,15 @@ __setup("cgroup_disable=", cgroup_disable); | |||
| 4435 | */ | 4435 | */ |
| 4436 | unsigned short css_id(struct cgroup_subsys_state *css) | 4436 | unsigned short css_id(struct cgroup_subsys_state *css) |
| 4437 | { | 4437 | { |
| 4438 | struct css_id *cssid = rcu_dereference(css->id); | 4438 | struct css_id *cssid; |
| 4439 | |||
| 4440 | /* | ||
| 4441 | * This css_id() can return correct value when somone has refcnt | ||
| 4442 | * on this or this is under rcu_read_lock(). Once css->id is allocated, | ||
| 4443 | * it's unchanged until freed. | ||
| 4444 | */ | ||
| 4445 | cssid = rcu_dereference_check(css->id, | ||
| 4446 | rcu_read_lock_held() || atomic_read(&css->refcnt)); | ||
| 4439 | 4447 | ||
| 4440 | if (cssid) | 4448 | if (cssid) |
| 4441 | return cssid->id; | 4449 | return cssid->id; |
| @@ -4445,7 +4453,10 @@ EXPORT_SYMBOL_GPL(css_id); | |||
| 4445 | 4453 | ||
| 4446 | unsigned short css_depth(struct cgroup_subsys_state *css) | 4454 | unsigned short css_depth(struct cgroup_subsys_state *css) |
| 4447 | { | 4455 | { |
| 4448 | struct css_id *cssid = rcu_dereference(css->id); | 4456 | struct css_id *cssid; |
| 4457 | |||
| 4458 | cssid = rcu_dereference_check(css->id, | ||
| 4459 | rcu_read_lock_held() || atomic_read(&css->refcnt)); | ||
| 4449 | 4460 | ||
| 4450 | if (cssid) | 4461 | if (cssid) |
| 4451 | return cssid->depth; | 4462 | return cssid->depth; |
| @@ -4453,15 +4464,36 @@ unsigned short css_depth(struct cgroup_subsys_state *css) | |||
| 4453 | } | 4464 | } |
| 4454 | EXPORT_SYMBOL_GPL(css_depth); | 4465 | EXPORT_SYMBOL_GPL(css_depth); |
| 4455 | 4466 | ||
| 4467 | /** | ||
| 4468 | * css_is_ancestor - test "root" css is an ancestor of "child" | ||
| 4469 | * @child: the css to be tested. | ||
| 4470 | * @root: the css supporsed to be an ancestor of the child. | ||
| 4471 | * | ||
| 4472 | * Returns true if "root" is an ancestor of "child" in its hierarchy. Because | ||
| 4473 | * this function reads css->id, this use rcu_dereference() and rcu_read_lock(). | ||
| 4474 | * But, considering usual usage, the csses should be valid objects after test. | ||
| 4475 | * Assuming that the caller will do some action to the child if this returns | ||
| 4476 | * returns true, the caller must take "child";s reference count. | ||
| 4477 | * If "child" is valid object and this returns true, "root" is valid, too. | ||
| 4478 | */ | ||
| 4479 | |||
| 4456 | bool css_is_ancestor(struct cgroup_subsys_state *child, | 4480 | bool css_is_ancestor(struct cgroup_subsys_state *child, |
| 4457 | const struct cgroup_subsys_state *root) | 4481 | const struct cgroup_subsys_state *root) |
| 4458 | { | 4482 | { |
| 4459 | struct css_id *child_id = rcu_dereference(child->id); | 4483 | struct css_id *child_id; |
| 4460 | struct css_id *root_id = rcu_dereference(root->id); | 4484 | struct css_id *root_id; |
| 4485 | bool ret = true; | ||
| 4461 | 4486 | ||
| 4462 | if (!child_id || !root_id || (child_id->depth < root_id->depth)) | 4487 | rcu_read_lock(); |
| 4463 | return false; | 4488 | child_id = rcu_dereference(child->id); |
| 4464 | return child_id->stack[root_id->depth] == root_id->id; | 4489 | root_id = rcu_dereference(root->id); |
| 4490 | if (!child_id | ||
| 4491 | || !root_id | ||
| 4492 | || (child_id->depth < root_id->depth) | ||
| 4493 | || (child_id->stack[root_id->depth] != root_id->id)) | ||
| 4494 | ret = false; | ||
| 4495 | rcu_read_unlock(); | ||
| 4496 | return ret; | ||
| 4465 | } | 4497 | } |
| 4466 | 4498 | ||
| 4467 | static void __free_css_id_cb(struct rcu_head *head) | 4499 | static void __free_css_id_cb(struct rcu_head *head) |
diff --git a/kernel/fork.c b/kernel/fork.c index 44b0791b0a2e..4c14942a0ee3 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1114,8 +1114,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
| 1114 | 1114 | ||
| 1115 | p->bts = NULL; | 1115 | p->bts = NULL; |
| 1116 | 1116 | ||
| 1117 | p->stack_start = stack_start; | ||
| 1118 | |||
| 1119 | /* Perform scheduler related setup. Assign this task to a CPU. */ | 1117 | /* Perform scheduler related setup. Assign this task to a CPU. */ |
| 1120 | sched_fork(p, clone_flags); | 1118 | sched_fork(p, clone_flags); |
| 1121 | 1119 | ||
diff --git a/kernel/kexec.c b/kernel/kexec.c index 87ebe8adc474..474a84715eac 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -1134,11 +1134,9 @@ int crash_shrink_memory(unsigned long new_size) | |||
| 1134 | 1134 | ||
| 1135 | free_reserved_phys_range(end, crashk_res.end); | 1135 | free_reserved_phys_range(end, crashk_res.end); |
| 1136 | 1136 | ||
| 1137 | if (start == end) { | 1137 | if (start == end) |
| 1138 | crashk_res.end = end; | ||
| 1139 | release_resource(&crashk_res); | 1138 | release_resource(&crashk_res); |
| 1140 | } else | 1139 | crashk_res.end = end - 1; |
| 1141 | crashk_res.end = end - 1; | ||
| 1142 | 1140 | ||
| 1143 | unlock: | 1141 | unlock: |
| 1144 | mutex_unlock(&kexec_mutex); | 1142 | mutex_unlock(&kexec_mutex); |
diff --git a/kernel/profile.c b/kernel/profile.c index a55d3a367ae8..dfadc5b729f1 100644 --- a/kernel/profile.c +++ b/kernel/profile.c | |||
| @@ -127,8 +127,10 @@ int __ref profile_init(void) | |||
| 127 | return 0; | 127 | return 0; |
| 128 | 128 | ||
| 129 | prof_buffer = vmalloc(buffer_bytes); | 129 | prof_buffer = vmalloc(buffer_bytes); |
| 130 | if (prof_buffer) | 130 | if (prof_buffer) { |
| 131 | memset(prof_buffer, 0, buffer_bytes); | ||
| 131 | return 0; | 132 | return 0; |
| 133 | } | ||
| 132 | 134 | ||
| 133 | free_cpumask_var(prof_cpu_mask); | 135 | free_cpumask_var(prof_cpu_mask); |
| 134 | return -ENOMEM; | 136 | return -ENOMEM; |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 42ad8ae729a0..2f0f50b450a3 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
| 15 | #include <linux/highmem.h> | 15 | #include <linux/highmem.h> |
| 16 | #include <linux/pagemap.h> | 16 | #include <linux/pagemap.h> |
| 17 | #include <linux/smp_lock.h> | ||
| 18 | #include <linux/ptrace.h> | 17 | #include <linux/ptrace.h> |
| 19 | #include <linux/security.h> | 18 | #include <linux/security.h> |
| 20 | #include <linux/signal.h> | 19 | #include <linux/signal.h> |
| @@ -666,10 +665,6 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data) | |||
| 666 | struct task_struct *child; | 665 | struct task_struct *child; |
| 667 | long ret; | 666 | long ret; |
| 668 | 667 | ||
| 669 | /* | ||
| 670 | * This lock_kernel fixes a subtle race with suid exec | ||
| 671 | */ | ||
| 672 | lock_kernel(); | ||
| 673 | if (request == PTRACE_TRACEME) { | 668 | if (request == PTRACE_TRACEME) { |
| 674 | ret = ptrace_traceme(); | 669 | ret = ptrace_traceme(); |
| 675 | if (!ret) | 670 | if (!ret) |
| @@ -703,7 +698,6 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data) | |||
| 703 | out_put_task_struct: | 698 | out_put_task_struct: |
| 704 | put_task_struct(child); | 699 | put_task_struct(child); |
| 705 | out: | 700 | out: |
| 706 | unlock_kernel(); | ||
| 707 | return ret; | 701 | return ret; |
| 708 | } | 702 | } |
| 709 | 703 | ||
| @@ -813,10 +807,6 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | |||
| 813 | struct task_struct *child; | 807 | struct task_struct *child; |
| 814 | long ret; | 808 | long ret; |
| 815 | 809 | ||
| 816 | /* | ||
| 817 | * This lock_kernel fixes a subtle race with suid exec | ||
| 818 | */ | ||
| 819 | lock_kernel(); | ||
| 820 | if (request == PTRACE_TRACEME) { | 810 | if (request == PTRACE_TRACEME) { |
| 821 | ret = ptrace_traceme(); | 811 | ret = ptrace_traceme(); |
| 822 | goto out; | 812 | goto out; |
| @@ -846,7 +836,6 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | |||
| 846 | out_put_task_struct: | 836 | out_put_task_struct: |
| 847 | put_task_struct(child); | 837 | put_task_struct(child); |
| 848 | out: | 838 | out: |
| 849 | unlock_kernel(); | ||
| 850 | return ret; | 839 | return ret; |
| 851 | } | 840 | } |
| 852 | #endif /* CONFIG_COMPAT */ | 841 | #endif /* CONFIG_COMPAT */ |
diff --git a/lib/btree.c b/lib/btree.c index 41859a820218..c9c6f0351526 100644 --- a/lib/btree.c +++ b/lib/btree.c | |||
| @@ -95,7 +95,8 @@ static unsigned long *btree_node_alloc(struct btree_head *head, gfp_t gfp) | |||
| 95 | unsigned long *node; | 95 | unsigned long *node; |
| 96 | 96 | ||
| 97 | node = mempool_alloc(head->mempool, gfp); | 97 | node = mempool_alloc(head->mempool, gfp); |
| 98 | memset(node, 0, NODESIZE); | 98 | if (likely(node)) |
| 99 | memset(node, 0, NODESIZE); | ||
| 99 | return node; | 100 | return node; |
| 100 | } | 101 | } |
| 101 | 102 | ||
diff --git a/lib/debugobjects.c b/lib/debugobjects.c index b862b30369ff..bf007a43c053 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c | |||
| @@ -774,7 +774,7 @@ static int __init fixup_free(void *addr, enum debug_obj_state state) | |||
| 774 | } | 774 | } |
| 775 | } | 775 | } |
| 776 | 776 | ||
| 777 | static int | 777 | static int __init |
| 778 | check_results(void *addr, enum debug_obj_state state, int fixups, int warnings) | 778 | check_results(void *addr, enum debug_obj_state state, int fixups, int warnings) |
| 779 | { | 779 | { |
| 780 | struct debug_bucket *db; | 780 | struct debug_bucket *db; |
| @@ -917,7 +917,7 @@ void __init debug_objects_early_init(void) | |||
| 917 | /* | 917 | /* |
| 918 | * Convert the statically allocated objects to dynamic ones: | 918 | * Convert the statically allocated objects to dynamic ones: |
| 919 | */ | 919 | */ |
| 920 | static int debug_objects_replace_static_objects(void) | 920 | static int __init debug_objects_replace_static_objects(void) |
| 921 | { | 921 | { |
| 922 | struct debug_bucket *db = obj_hash; | 922 | struct debug_bucket *db = obj_hash; |
| 923 | struct hlist_node *node, *tmp; | 923 | struct hlist_node *node, *tmp; |
diff --git a/lib/rwsem.c b/lib/rwsem.c index 3e3365e5665e..ceba8e28807a 100644 --- a/lib/rwsem.c +++ b/lib/rwsem.c | |||
| @@ -136,9 +136,10 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) | |||
| 136 | out: | 136 | out: |
| 137 | return sem; | 137 | return sem; |
| 138 | 138 | ||
| 139 | /* undo the change to count, but check for a transition 1->0 */ | 139 | /* undo the change to the active count, but check for a transition |
| 140 | * 1->0 */ | ||
| 140 | undo: | 141 | undo: |
| 141 | if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem) != 0) | 142 | if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem) & RWSEM_ACTIVE_MASK) |
| 142 | goto out; | 143 | goto out; |
| 143 | goto try_again; | 144 | goto try_again; |
| 144 | } | 145 | } |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ffbdfc86aedf..4c9e6bbf3772 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -1039,7 +1039,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, | |||
| 1039 | page = alloc_buddy_huge_page(h, vma, addr); | 1039 | page = alloc_buddy_huge_page(h, vma, addr); |
| 1040 | if (!page) { | 1040 | if (!page) { |
| 1041 | hugetlb_put_quota(inode->i_mapping, chg); | 1041 | hugetlb_put_quota(inode->i_mapping, chg); |
| 1042 | return ERR_PTR(-VM_FAULT_OOM); | 1042 | return ERR_PTR(-VM_FAULT_SIGBUS); |
| 1043 | } | 1043 | } |
| 1044 | } | 1044 | } |
| 1045 | 1045 | ||
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 0f711c213d2e..8a79a6f0f029 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -811,12 +811,10 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem) | |||
| 811 | * enabled in "curr" and "curr" is a child of "mem" in *cgroup* | 811 | * enabled in "curr" and "curr" is a child of "mem" in *cgroup* |
| 812 | * hierarchy(even if use_hierarchy is disabled in "mem"). | 812 | * hierarchy(even if use_hierarchy is disabled in "mem"). |
| 813 | */ | 813 | */ |
| 814 | rcu_read_lock(); | ||
| 815 | if (mem->use_hierarchy) | 814 | if (mem->use_hierarchy) |
| 816 | ret = css_is_ancestor(&curr->css, &mem->css); | 815 | ret = css_is_ancestor(&curr->css, &mem->css); |
| 817 | else | 816 | else |
| 818 | ret = (curr == mem); | 817 | ret = (curr == mem); |
| 819 | rcu_read_unlock(); | ||
| 820 | css_put(&curr->css); | 818 | css_put(&curr->css); |
| 821 | return ret; | 819 | return ret; |
| 822 | } | 820 | } |
| @@ -1603,7 +1601,6 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, | |||
| 1603 | * There is a small race that "from" or "to" can be | 1601 | * There is a small race that "from" or "to" can be |
| 1604 | * freed by rmdir, so we use css_tryget(). | 1602 | * freed by rmdir, so we use css_tryget(). |
| 1605 | */ | 1603 | */ |
| 1606 | rcu_read_lock(); | ||
| 1607 | from = mc.from; | 1604 | from = mc.from; |
| 1608 | to = mc.to; | 1605 | to = mc.to; |
| 1609 | if (from && css_tryget(&from->css)) { | 1606 | if (from && css_tryget(&from->css)) { |
| @@ -1624,7 +1621,6 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, | |||
| 1624 | do_continue = (to == mem_over_limit); | 1621 | do_continue = (to == mem_over_limit); |
| 1625 | css_put(&to->css); | 1622 | css_put(&to->css); |
| 1626 | } | 1623 | } |
| 1627 | rcu_read_unlock(); | ||
| 1628 | if (do_continue) { | 1624 | if (do_continue) { |
| 1629 | DEFINE_WAIT(wait); | 1625 | DEFINE_WAIT(wait); |
| 1630 | prepare_to_wait(&mc.waitq, &wait, | 1626 | prepare_to_wait(&mc.waitq, &wait, |
| @@ -2314,9 +2310,7 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout) | |||
| 2314 | 2310 | ||
| 2315 | /* record memcg information */ | 2311 | /* record memcg information */ |
| 2316 | if (do_swap_account && swapout && memcg) { | 2312 | if (do_swap_account && swapout && memcg) { |
| 2317 | rcu_read_lock(); | ||
| 2318 | swap_cgroup_record(ent, css_id(&memcg->css)); | 2313 | swap_cgroup_record(ent, css_id(&memcg->css)); |
| 2319 | rcu_read_unlock(); | ||
| 2320 | mem_cgroup_get(memcg); | 2314 | mem_cgroup_get(memcg); |
| 2321 | } | 2315 | } |
| 2322 | if (swapout && memcg) | 2316 | if (swapout && memcg) |
| @@ -2373,10 +2367,8 @@ static int mem_cgroup_move_swap_account(swp_entry_t entry, | |||
| 2373 | { | 2367 | { |
| 2374 | unsigned short old_id, new_id; | 2368 | unsigned short old_id, new_id; |
| 2375 | 2369 | ||
| 2376 | rcu_read_lock(); | ||
| 2377 | old_id = css_id(&from->css); | 2370 | old_id = css_id(&from->css); |
| 2378 | new_id = css_id(&to->css); | 2371 | new_id = css_id(&to->css); |
| 2379 | rcu_read_unlock(); | ||
| 2380 | 2372 | ||
| 2381 | if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) { | 2373 | if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) { |
| 2382 | mem_cgroup_swap_statistics(from, false); | 2374 | mem_cgroup_swap_statistics(from, false); |
| @@ -4044,16 +4036,11 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, | |||
| 4044 | put_page(page); | 4036 | put_page(page); |
| 4045 | } | 4037 | } |
| 4046 | /* throught */ | 4038 | /* throught */ |
| 4047 | if (ent.val && do_swap_account && !ret) { | 4039 | if (ent.val && do_swap_account && !ret && |
| 4048 | unsigned short id; | 4040 | css_id(&mc.from->css) == lookup_swap_cgroup(ent)) { |
| 4049 | rcu_read_lock(); | 4041 | ret = MC_TARGET_SWAP; |
| 4050 | id = css_id(&mc.from->css); | 4042 | if (target) |
| 4051 | rcu_read_unlock(); | 4043 | target->ent = ent; |
| 4052 | if (id == lookup_swap_cgroup(ent)) { | ||
| 4053 | ret = MC_TARGET_SWAP; | ||
| 4054 | if (target) | ||
| 4055 | target->ent = ent; | ||
| 4056 | } | ||
| 4057 | } | 4044 | } |
| 4058 | return ret; | 4045 | return ret; |
| 4059 | } | 4046 | } |
| @@ -336,14 +336,13 @@ vma_address(struct page *page, struct vm_area_struct *vma) | |||
| 336 | 336 | ||
| 337 | /* | 337 | /* |
| 338 | * At what user virtual address is page expected in vma? | 338 | * At what user virtual address is page expected in vma? |
| 339 | * checking that the page matches the vma. | 339 | * Caller should check the page is actually part of the vma. |
| 340 | */ | 340 | */ |
| 341 | unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | 341 | unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) |
| 342 | { | 342 | { |
| 343 | if (PageAnon(page)) { | 343 | if (PageAnon(page)) |
| 344 | if (vma->anon_vma != page_anon_vma(page)) | 344 | ; |
| 345 | return -EFAULT; | 345 | else if (page->mapping && !(vma->vm_flags & VM_NONLINEAR)) { |
| 346 | } else if (page->mapping && !(vma->vm_flags & VM_NONLINEAR)) { | ||
| 347 | if (!vma->vm_file || | 346 | if (!vma->vm_file || |
| 348 | vma->vm_file->f_mapping != page->mapping) | 347 | vma->vm_file->f_mapping != page->mapping) |
| 349 | return -EFAULT; | 348 | return -EFAULT; |
diff --git a/net/core/dev.c b/net/core/dev.c index f769098774b7..264137fce3a2 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1451,7 +1451,7 @@ static inline void net_timestamp(struct sk_buff *skb) | |||
| 1451 | * | 1451 | * |
| 1452 | * return values: | 1452 | * return values: |
| 1453 | * NET_RX_SUCCESS (no congestion) | 1453 | * NET_RX_SUCCESS (no congestion) |
| 1454 | * NET_RX_DROP (packet was dropped) | 1454 | * NET_RX_DROP (packet was dropped, but freed) |
| 1455 | * | 1455 | * |
| 1456 | * dev_forward_skb can be used for injecting an skb from the | 1456 | * dev_forward_skb can be used for injecting an skb from the |
| 1457 | * start_xmit function of one device into the receive queue | 1457 | * start_xmit function of one device into the receive queue |
| @@ -1465,12 +1465,11 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | |||
| 1465 | { | 1465 | { |
| 1466 | skb_orphan(skb); | 1466 | skb_orphan(skb); |
| 1467 | 1467 | ||
| 1468 | if (!(dev->flags & IFF_UP)) | 1468 | if (!(dev->flags & IFF_UP) || |
| 1469 | return NET_RX_DROP; | 1469 | (skb->len > (dev->mtu + dev->hard_header_len))) { |
| 1470 | 1470 | kfree_skb(skb); | |
| 1471 | if (skb->len > (dev->mtu + dev->hard_header_len)) | ||
| 1472 | return NET_RX_DROP; | 1471 | return NET_RX_DROP; |
| 1473 | 1472 | } | |
| 1474 | skb_set_dev(skb, dev); | 1473 | skb_set_dev(skb, dev); |
| 1475 | skb->tstamp.tv64 = 0; | 1474 | skb->tstamp.tv64 = 0; |
| 1476 | skb->pkt_type = PACKET_HOST; | 1475 | skb->pkt_type = PACKET_HOST; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index fe776c9ddeca..31e85d327aa2 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -602,12 +602,19 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a, | |||
| 602 | a->tx_compressed = b->tx_compressed; | 602 | a->tx_compressed = b->tx_compressed; |
| 603 | }; | 603 | }; |
| 604 | 604 | ||
| 605 | /* All VF info */ | ||
| 605 | static inline int rtnl_vfinfo_size(const struct net_device *dev) | 606 | static inline int rtnl_vfinfo_size(const struct net_device *dev) |
| 606 | { | 607 | { |
| 607 | if (dev->dev.parent && dev_is_pci(dev->dev.parent)) | 608 | if (dev->dev.parent && dev_is_pci(dev->dev.parent)) { |
| 608 | return dev_num_vf(dev->dev.parent) * | 609 | |
| 609 | sizeof(struct ifla_vf_info); | 610 | int num_vfs = dev_num_vf(dev->dev.parent); |
| 610 | else | 611 | size_t size = nlmsg_total_size(sizeof(struct nlattr)); |
| 612 | size += nlmsg_total_size(num_vfs * sizeof(struct nlattr)); | ||
| 613 | size += num_vfs * (sizeof(struct ifla_vf_mac) + | ||
| 614 | sizeof(struct ifla_vf_vlan) + | ||
| 615 | sizeof(struct ifla_vf_tx_rate)); | ||
| 616 | return size; | ||
| 617 | } else | ||
| 611 | return 0; | 618 | return 0; |
| 612 | } | 619 | } |
| 613 | 620 | ||
| @@ -629,7 +636,7 @@ static inline size_t if_nlmsg_size(const struct net_device *dev) | |||
| 629 | + nla_total_size(1) /* IFLA_OPERSTATE */ | 636 | + nla_total_size(1) /* IFLA_OPERSTATE */ |
| 630 | + nla_total_size(1) /* IFLA_LINKMODE */ | 637 | + nla_total_size(1) /* IFLA_LINKMODE */ |
| 631 | + nla_total_size(4) /* IFLA_NUM_VF */ | 638 | + nla_total_size(4) /* IFLA_NUM_VF */ |
| 632 | + nla_total_size(rtnl_vfinfo_size(dev)) /* IFLA_VFINFO */ | 639 | + rtnl_vfinfo_size(dev) /* IFLA_VFINFO_LIST */ |
| 633 | + rtnl_link_get_size(dev); /* IFLA_LINKINFO */ | 640 | + rtnl_link_get_size(dev); /* IFLA_LINKINFO */ |
| 634 | } | 641 | } |
| 635 | 642 | ||
| @@ -700,14 +707,37 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
| 700 | 707 | ||
| 701 | if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent) { | 708 | if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent) { |
| 702 | int i; | 709 | int i; |
| 703 | struct ifla_vf_info ivi; | ||
| 704 | 710 | ||
| 705 | NLA_PUT_U32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)); | 711 | struct nlattr *vfinfo, *vf; |
| 706 | for (i = 0; i < dev_num_vf(dev->dev.parent); i++) { | 712 | int num_vfs = dev_num_vf(dev->dev.parent); |
| 713 | |||
| 714 | NLA_PUT_U32(skb, IFLA_NUM_VF, num_vfs); | ||
| 715 | vfinfo = nla_nest_start(skb, IFLA_VFINFO_LIST); | ||
| 716 | if (!vfinfo) | ||
| 717 | goto nla_put_failure; | ||
| 718 | for (i = 0; i < num_vfs; i++) { | ||
| 719 | struct ifla_vf_info ivi; | ||
| 720 | struct ifla_vf_mac vf_mac; | ||
| 721 | struct ifla_vf_vlan vf_vlan; | ||
| 722 | struct ifla_vf_tx_rate vf_tx_rate; | ||
| 707 | if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi)) | 723 | if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi)) |
| 708 | break; | 724 | break; |
| 709 | NLA_PUT(skb, IFLA_VFINFO, sizeof(ivi), &ivi); | 725 | vf_mac.vf = vf_vlan.vf = vf_tx_rate.vf = ivi.vf; |
| 726 | memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac)); | ||
| 727 | vf_vlan.vlan = ivi.vlan; | ||
| 728 | vf_vlan.qos = ivi.qos; | ||
| 729 | vf_tx_rate.rate = ivi.tx_rate; | ||
| 730 | vf = nla_nest_start(skb, IFLA_VF_INFO); | ||
| 731 | if (!vf) { | ||
| 732 | nla_nest_cancel(skb, vfinfo); | ||
| 733 | goto nla_put_failure; | ||
| 734 | } | ||
| 735 | NLA_PUT(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac); | ||
| 736 | NLA_PUT(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan); | ||
| 737 | NLA_PUT(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate), &vf_tx_rate); | ||
| 738 | nla_nest_end(skb, vf); | ||
| 710 | } | 739 | } |
| 740 | nla_nest_end(skb, vfinfo); | ||
| 711 | } | 741 | } |
| 712 | if (dev->rtnl_link_ops) { | 742 | if (dev->rtnl_link_ops) { |
| 713 | if (rtnl_link_fill(skb, dev) < 0) | 743 | if (rtnl_link_fill(skb, dev) < 0) |
| @@ -769,12 +799,7 @@ const struct nla_policy ifla_policy[IFLA_MAX+1] = { | |||
| 769 | [IFLA_LINKINFO] = { .type = NLA_NESTED }, | 799 | [IFLA_LINKINFO] = { .type = NLA_NESTED }, |
| 770 | [IFLA_NET_NS_PID] = { .type = NLA_U32 }, | 800 | [IFLA_NET_NS_PID] = { .type = NLA_U32 }, |
| 771 | [IFLA_IFALIAS] = { .type = NLA_STRING, .len = IFALIASZ-1 }, | 801 | [IFLA_IFALIAS] = { .type = NLA_STRING, .len = IFALIASZ-1 }, |
| 772 | [IFLA_VF_MAC] = { .type = NLA_BINARY, | 802 | [IFLA_VFINFO_LIST] = {. type = NLA_NESTED }, |
| 773 | .len = sizeof(struct ifla_vf_mac) }, | ||
| 774 | [IFLA_VF_VLAN] = { .type = NLA_BINARY, | ||
| 775 | .len = sizeof(struct ifla_vf_vlan) }, | ||
| 776 | [IFLA_VF_TX_RATE] = { .type = NLA_BINARY, | ||
| 777 | .len = sizeof(struct ifla_vf_tx_rate) }, | ||
| 778 | }; | 803 | }; |
| 779 | EXPORT_SYMBOL(ifla_policy); | 804 | EXPORT_SYMBOL(ifla_policy); |
| 780 | 805 | ||
| @@ -783,6 +808,19 @@ static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { | |||
| 783 | [IFLA_INFO_DATA] = { .type = NLA_NESTED }, | 808 | [IFLA_INFO_DATA] = { .type = NLA_NESTED }, |
| 784 | }; | 809 | }; |
| 785 | 810 | ||
| 811 | static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = { | ||
| 812 | [IFLA_VF_INFO] = { .type = NLA_NESTED }, | ||
| 813 | }; | ||
| 814 | |||
| 815 | static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { | ||
| 816 | [IFLA_VF_MAC] = { .type = NLA_BINARY, | ||
| 817 | .len = sizeof(struct ifla_vf_mac) }, | ||
| 818 | [IFLA_VF_VLAN] = { .type = NLA_BINARY, | ||
| 819 | .len = sizeof(struct ifla_vf_vlan) }, | ||
| 820 | [IFLA_VF_TX_RATE] = { .type = NLA_BINARY, | ||
| 821 | .len = sizeof(struct ifla_vf_tx_rate) }, | ||
| 822 | }; | ||
| 823 | |||
| 786 | struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]) | 824 | struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]) |
| 787 | { | 825 | { |
| 788 | struct net *net; | 826 | struct net *net; |
| @@ -812,6 +850,52 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[]) | |||
| 812 | return 0; | 850 | return 0; |
| 813 | } | 851 | } |
| 814 | 852 | ||
| 853 | static int do_setvfinfo(struct net_device *dev, struct nlattr *attr) | ||
| 854 | { | ||
| 855 | int rem, err = -EINVAL; | ||
| 856 | struct nlattr *vf; | ||
| 857 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 858 | |||
| 859 | nla_for_each_nested(vf, attr, rem) { | ||
| 860 | switch (nla_type(vf)) { | ||
| 861 | case IFLA_VF_MAC: { | ||
| 862 | struct ifla_vf_mac *ivm; | ||
| 863 | ivm = nla_data(vf); | ||
| 864 | err = -EOPNOTSUPP; | ||
| 865 | if (ops->ndo_set_vf_mac) | ||
| 866 | err = ops->ndo_set_vf_mac(dev, ivm->vf, | ||
| 867 | ivm->mac); | ||
| 868 | break; | ||
| 869 | } | ||
| 870 | case IFLA_VF_VLAN: { | ||
| 871 | struct ifla_vf_vlan *ivv; | ||
| 872 | ivv = nla_data(vf); | ||
| 873 | err = -EOPNOTSUPP; | ||
| 874 | if (ops->ndo_set_vf_vlan) | ||
| 875 | err = ops->ndo_set_vf_vlan(dev, ivv->vf, | ||
| 876 | ivv->vlan, | ||
| 877 | ivv->qos); | ||
| 878 | break; | ||
| 879 | } | ||
| 880 | case IFLA_VF_TX_RATE: { | ||
| 881 | struct ifla_vf_tx_rate *ivt; | ||
| 882 | ivt = nla_data(vf); | ||
| 883 | err = -EOPNOTSUPP; | ||
| 884 | if (ops->ndo_set_vf_tx_rate) | ||
| 885 | err = ops->ndo_set_vf_tx_rate(dev, ivt->vf, | ||
| 886 | ivt->rate); | ||
| 887 | break; | ||
| 888 | } | ||
| 889 | default: | ||
| 890 | err = -EINVAL; | ||
| 891 | break; | ||
| 892 | } | ||
| 893 | if (err) | ||
| 894 | break; | ||
| 895 | } | ||
| 896 | return err; | ||
| 897 | } | ||
| 898 | |||
| 815 | static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | 899 | static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, |
| 816 | struct nlattr **tb, char *ifname, int modified) | 900 | struct nlattr **tb, char *ifname, int modified) |
| 817 | { | 901 | { |
| @@ -942,40 +1026,17 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
| 942 | write_unlock_bh(&dev_base_lock); | 1026 | write_unlock_bh(&dev_base_lock); |
| 943 | } | 1027 | } |
| 944 | 1028 | ||
| 945 | if (tb[IFLA_VF_MAC]) { | 1029 | if (tb[IFLA_VFINFO_LIST]) { |
| 946 | struct ifla_vf_mac *ivm; | 1030 | struct nlattr *attr; |
| 947 | ivm = nla_data(tb[IFLA_VF_MAC]); | 1031 | int rem; |
| 948 | err = -EOPNOTSUPP; | 1032 | nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) { |
| 949 | if (ops->ndo_set_vf_mac) | 1033 | if (nla_type(attr) != IFLA_VF_INFO) |
| 950 | err = ops->ndo_set_vf_mac(dev, ivm->vf, ivm->mac); | 1034 | goto errout; |
| 951 | if (err < 0) | 1035 | err = do_setvfinfo(dev, attr); |
| 952 | goto errout; | 1036 | if (err < 0) |
| 953 | modified = 1; | 1037 | goto errout; |
| 954 | } | 1038 | modified = 1; |
| 955 | 1039 | } | |
| 956 | if (tb[IFLA_VF_VLAN]) { | ||
| 957 | struct ifla_vf_vlan *ivv; | ||
| 958 | ivv = nla_data(tb[IFLA_VF_VLAN]); | ||
| 959 | err = -EOPNOTSUPP; | ||
| 960 | if (ops->ndo_set_vf_vlan) | ||
| 961 | err = ops->ndo_set_vf_vlan(dev, ivv->vf, | ||
| 962 | ivv->vlan, | ||
| 963 | ivv->qos); | ||
| 964 | if (err < 0) | ||
| 965 | goto errout; | ||
| 966 | modified = 1; | ||
| 967 | } | ||
| 968 | err = 0; | ||
| 969 | |||
| 970 | if (tb[IFLA_VF_TX_RATE]) { | ||
| 971 | struct ifla_vf_tx_rate *ivt; | ||
| 972 | ivt = nla_data(tb[IFLA_VF_TX_RATE]); | ||
| 973 | err = -EOPNOTSUPP; | ||
| 974 | if (ops->ndo_set_vf_tx_rate) | ||
| 975 | err = ops->ndo_set_vf_tx_rate(dev, ivt->vf, ivt->rate); | ||
| 976 | if (err < 0) | ||
| 977 | goto errout; | ||
| 978 | modified = 1; | ||
| 979 | } | 1040 | } |
| 980 | err = 0; | 1041 | err = 0; |
| 981 | 1042 | ||
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 6e747065c202..80769f1f9fab 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
| @@ -661,13 +661,13 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | |||
| 661 | #endif | 661 | #endif |
| 662 | #endif | 662 | #endif |
| 663 | 663 | ||
| 664 | #ifdef CONFIG_FDDI | 664 | #if defined(CONFIG_FDDI) || defined(CONFIG_FDDI_MODULE) |
| 665 | case ARPHRD_FDDI: | 665 | case ARPHRD_FDDI: |
| 666 | arp->ar_hrd = htons(ARPHRD_ETHER); | 666 | arp->ar_hrd = htons(ARPHRD_ETHER); |
| 667 | arp->ar_pro = htons(ETH_P_IP); | 667 | arp->ar_pro = htons(ETH_P_IP); |
| 668 | break; | 668 | break; |
| 669 | #endif | 669 | #endif |
| 670 | #ifdef CONFIG_TR | 670 | #if defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) |
| 671 | case ARPHRD_IEEE802_TR: | 671 | case ARPHRD_IEEE802_TR: |
| 672 | arp->ar_hrd = htons(ARPHRD_IEEE802); | 672 | arp->ar_hrd = htons(ARPHRD_IEEE802); |
| 673 | arp->ar_pro = htons(ETH_P_IP); | 673 | arp->ar_pro = htons(ETH_P_IP); |
| @@ -1051,7 +1051,7 @@ static int arp_req_set(struct net *net, struct arpreq *r, | |||
| 1051 | return -EINVAL; | 1051 | return -EINVAL; |
| 1052 | } | 1052 | } |
| 1053 | switch (dev->type) { | 1053 | switch (dev->type) { |
| 1054 | #ifdef CONFIG_FDDI | 1054 | #if defined(CONFIG_FDDI) || defined(CONFIG_FDDI_MODULE) |
| 1055 | case ARPHRD_FDDI: | 1055 | case ARPHRD_FDDI: |
| 1056 | /* | 1056 | /* |
| 1057 | * According to RFC 1390, FDDI devices should accept ARP | 1057 | * According to RFC 1390, FDDI devices should accept ARP |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 9d4f6d1340a4..ec19a890c9a0 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -754,7 +754,8 @@ ipmr_cache_unresolved(struct net *net, vifi_t vifi, struct sk_buff *skb) | |||
| 754 | c->next = mfc_unres_queue; | 754 | c->next = mfc_unres_queue; |
| 755 | mfc_unres_queue = c; | 755 | mfc_unres_queue = c; |
| 756 | 756 | ||
| 757 | mod_timer(&ipmr_expire_timer, c->mfc_un.unres.expires); | 757 | if (atomic_read(&net->ipv4.cache_resolve_queue_len) == 1) |
| 758 | mod_timer(&ipmr_expire_timer, c->mfc_un.unres.expires); | ||
| 758 | } | 759 | } |
| 759 | 760 | ||
| 760 | /* | 761 | /* |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0f8caf64caa3..296150b2a62f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2839,7 +2839,6 @@ static void __tcp_free_md5sig_pool(struct tcp_md5sig_pool * __percpu *pool) | |||
| 2839 | if (p->md5_desc.tfm) | 2839 | if (p->md5_desc.tfm) |
| 2840 | crypto_free_hash(p->md5_desc.tfm); | 2840 | crypto_free_hash(p->md5_desc.tfm); |
| 2841 | kfree(p); | 2841 | kfree(p); |
| 2842 | p = NULL; | ||
| 2843 | } | 2842 | } |
| 2844 | } | 2843 | } |
| 2845 | free_percpu(pool); | 2844 | free_percpu(pool); |
| @@ -2937,25 +2936,40 @@ retry: | |||
| 2937 | 2936 | ||
| 2938 | EXPORT_SYMBOL(tcp_alloc_md5sig_pool); | 2937 | EXPORT_SYMBOL(tcp_alloc_md5sig_pool); |
| 2939 | 2938 | ||
| 2940 | struct tcp_md5sig_pool *__tcp_get_md5sig_pool(int cpu) | 2939 | |
| 2940 | /** | ||
| 2941 | * tcp_get_md5sig_pool - get md5sig_pool for this user | ||
| 2942 | * | ||
| 2943 | * We use percpu structure, so if we succeed, we exit with preemption | ||
| 2944 | * and BH disabled, to make sure another thread or softirq handling | ||
| 2945 | * wont try to get same context. | ||
| 2946 | */ | ||
| 2947 | struct tcp_md5sig_pool *tcp_get_md5sig_pool(void) | ||
| 2941 | { | 2948 | { |
| 2942 | struct tcp_md5sig_pool * __percpu *p; | 2949 | struct tcp_md5sig_pool * __percpu *p; |
| 2943 | spin_lock_bh(&tcp_md5sig_pool_lock); | 2950 | |
| 2951 | local_bh_disable(); | ||
| 2952 | |||
| 2953 | spin_lock(&tcp_md5sig_pool_lock); | ||
| 2944 | p = tcp_md5sig_pool; | 2954 | p = tcp_md5sig_pool; |
| 2945 | if (p) | 2955 | if (p) |
| 2946 | tcp_md5sig_users++; | 2956 | tcp_md5sig_users++; |
| 2947 | spin_unlock_bh(&tcp_md5sig_pool_lock); | 2957 | spin_unlock(&tcp_md5sig_pool_lock); |
| 2948 | return (p ? *per_cpu_ptr(p, cpu) : NULL); | 2958 | |
| 2949 | } | 2959 | if (p) |
| 2960 | return *per_cpu_ptr(p, smp_processor_id()); | ||
| 2950 | 2961 | ||
| 2951 | EXPORT_SYMBOL(__tcp_get_md5sig_pool); | 2962 | local_bh_enable(); |
| 2963 | return NULL; | ||
| 2964 | } | ||
| 2965 | EXPORT_SYMBOL(tcp_get_md5sig_pool); | ||
| 2952 | 2966 | ||
| 2953 | void __tcp_put_md5sig_pool(void) | 2967 | void tcp_put_md5sig_pool(void) |
| 2954 | { | 2968 | { |
| 2969 | local_bh_enable(); | ||
| 2955 | tcp_free_md5sig_pool(); | 2970 | tcp_free_md5sig_pool(); |
| 2956 | } | 2971 | } |
| 2957 | 2972 | EXPORT_SYMBOL(tcp_put_md5sig_pool); | |
| 2958 | EXPORT_SYMBOL(__tcp_put_md5sig_pool); | ||
| 2959 | 2973 | ||
| 2960 | int tcp_md5_hash_header(struct tcp_md5sig_pool *hp, | 2974 | int tcp_md5_hash_header(struct tcp_md5sig_pool *hp, |
| 2961 | struct tcphdr *th) | 2975 | struct tcphdr *th) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 8fef859db35d..c36522a0f113 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1527,6 +1527,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
| 1527 | 1527 | ||
| 1528 | uh = udp_hdr(skb); | 1528 | uh = udp_hdr(skb); |
| 1529 | ulen = ntohs(uh->len); | 1529 | ulen = ntohs(uh->len); |
| 1530 | saddr = ip_hdr(skb)->saddr; | ||
| 1531 | daddr = ip_hdr(skb)->daddr; | ||
| 1532 | |||
| 1530 | if (ulen > skb->len) | 1533 | if (ulen > skb->len) |
| 1531 | goto short_packet; | 1534 | goto short_packet; |
| 1532 | 1535 | ||
| @@ -1540,9 +1543,6 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
| 1540 | if (udp4_csum_init(skb, uh, proto)) | 1543 | if (udp4_csum_init(skb, uh, proto)) |
| 1541 | goto csum_error; | 1544 | goto csum_error; |
| 1542 | 1545 | ||
| 1543 | saddr = ip_hdr(skb)->saddr; | ||
| 1544 | daddr = ip_hdr(skb)->daddr; | ||
| 1545 | |||
| 1546 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) | 1546 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) |
| 1547 | return __udp4_lib_mcast_deliver(net, skb, uh, | 1547 | return __udp4_lib_mcast_deliver(net, skb, uh, |
| 1548 | saddr, daddr, udptable); | 1548 | saddr, daddr, udptable); |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 622dc7939a1b..61573885e451 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
| @@ -222,6 +222,8 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, | |||
| 222 | if (!skb) | 222 | if (!skb) |
| 223 | return; | 223 | return; |
| 224 | 224 | ||
| 225 | skb->protocol = htons(ETH_P_IPV6); | ||
| 226 | |||
| 225 | serr = SKB_EXT_ERR(skb); | 227 | serr = SKB_EXT_ERR(skb); |
| 226 | serr->ee.ee_errno = err; | 228 | serr->ee.ee_errno = err; |
| 227 | serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6; | 229 | serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6; |
| @@ -255,6 +257,8 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info) | |||
| 255 | if (!skb) | 257 | if (!skb) |
| 256 | return; | 258 | return; |
| 257 | 259 | ||
| 260 | skb->protocol = htons(ETH_P_IPV6); | ||
| 261 | |||
| 258 | skb_put(skb, sizeof(struct ipv6hdr)); | 262 | skb_put(skb, sizeof(struct ipv6hdr)); |
| 259 | skb_reset_network_header(skb); | 263 | skb_reset_network_header(skb); |
| 260 | iph = ipv6_hdr(skb); | 264 | iph = ipv6_hdr(skb); |
| @@ -319,7 +323,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | |||
| 319 | sin->sin6_flowinfo = 0; | 323 | sin->sin6_flowinfo = 0; |
| 320 | sin->sin6_port = serr->port; | 324 | sin->sin6_port = serr->port; |
| 321 | sin->sin6_scope_id = 0; | 325 | sin->sin6_scope_id = 0; |
| 322 | if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { | 326 | if (skb->protocol == htons(ETH_P_IPV6)) { |
| 323 | ipv6_addr_copy(&sin->sin6_addr, | 327 | ipv6_addr_copy(&sin->sin6_addr, |
| 324 | (struct in6_addr *)(nh + serr->addr_offset)); | 328 | (struct in6_addr *)(nh + serr->addr_offset)); |
| 325 | if (np->sndflow) | 329 | if (np->sndflow) |
| @@ -341,7 +345,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | |||
| 341 | sin->sin6_family = AF_INET6; | 345 | sin->sin6_family = AF_INET6; |
| 342 | sin->sin6_flowinfo = 0; | 346 | sin->sin6_flowinfo = 0; |
| 343 | sin->sin6_scope_id = 0; | 347 | sin->sin6_scope_id = 0; |
| 344 | if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { | 348 | if (skb->protocol == htons(ETH_P_IPV6)) { |
| 345 | ipv6_addr_copy(&sin->sin6_addr, &ipv6_hdr(skb)->saddr); | 349 | ipv6_addr_copy(&sin->sin6_addr, &ipv6_hdr(skb)->saddr); |
| 346 | if (np->rxopt.all) | 350 | if (np->rxopt.all) |
| 347 | datagram_recv_ctl(sk, msg, skb); | 351 | datagram_recv_ctl(sk, msg, skb); |
diff --git a/net/llc/llc_sap.c b/net/llc/llc_sap.c index a432f0ec051c..94e7fca75b85 100644 --- a/net/llc/llc_sap.c +++ b/net/llc/llc_sap.c | |||
| @@ -31,7 +31,7 @@ static int llc_mac_header_len(unsigned short devtype) | |||
| 31 | case ARPHRD_ETHER: | 31 | case ARPHRD_ETHER: |
| 32 | case ARPHRD_LOOPBACK: | 32 | case ARPHRD_LOOPBACK: |
| 33 | return sizeof(struct ethhdr); | 33 | return sizeof(struct ethhdr); |
| 34 | #ifdef CONFIG_TR | 34 | #if defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) |
| 35 | case ARPHRD_IEEE802_TR: | 35 | case ARPHRD_IEEE802_TR: |
| 36 | return sizeof(struct trh_hdr); | 36 | return sizeof(struct trh_hdr); |
| 37 | #endif | 37 | #endif |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 4aefa6dc3091..875c8dec940a 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -2030,7 +2030,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2030 | continue; | 2030 | continue; |
| 2031 | 2031 | ||
| 2032 | if (wk->type != IEEE80211_WORK_DIRECT_PROBE && | 2032 | if (wk->type != IEEE80211_WORK_DIRECT_PROBE && |
| 2033 | wk->type != IEEE80211_WORK_AUTH) | 2033 | wk->type != IEEE80211_WORK_AUTH && |
| 2034 | wk->type != IEEE80211_WORK_ASSOC) | ||
| 2034 | continue; | 2035 | continue; |
| 2035 | 2036 | ||
| 2036 | if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) | 2037 | if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) |
diff --git a/net/sctp/input.c b/net/sctp/input.c index 2a570184e5a9..ea2192444ce6 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
| @@ -440,11 +440,25 @@ void sctp_icmp_proto_unreachable(struct sock *sk, | |||
| 440 | { | 440 | { |
| 441 | SCTP_DEBUG_PRINTK("%s\n", __func__); | 441 | SCTP_DEBUG_PRINTK("%s\n", __func__); |
| 442 | 442 | ||
| 443 | sctp_do_sm(SCTP_EVENT_T_OTHER, | 443 | if (sock_owned_by_user(sk)) { |
| 444 | SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH), | 444 | if (timer_pending(&t->proto_unreach_timer)) |
| 445 | asoc->state, asoc->ep, asoc, t, | 445 | return; |
| 446 | GFP_ATOMIC); | 446 | else { |
| 447 | if (!mod_timer(&t->proto_unreach_timer, | ||
| 448 | jiffies + (HZ/20))) | ||
| 449 | sctp_association_hold(asoc); | ||
| 450 | } | ||
| 451 | |||
| 452 | } else { | ||
| 453 | if (timer_pending(&t->proto_unreach_timer) && | ||
| 454 | del_timer(&t->proto_unreach_timer)) | ||
| 455 | sctp_association_put(asoc); | ||
| 447 | 456 | ||
| 457 | sctp_do_sm(SCTP_EVENT_T_OTHER, | ||
| 458 | SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH), | ||
| 459 | asoc->state, asoc->ep, asoc, t, | ||
| 460 | GFP_ATOMIC); | ||
| 461 | } | ||
| 448 | } | 462 | } |
| 449 | 463 | ||
| 450 | /* Common lookup code for icmp/icmpv6 error handler. */ | 464 | /* Common lookup code for icmp/icmpv6 error handler. */ |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index d5ae450b6f02..eb1f42f45fdd 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
| @@ -397,6 +397,41 @@ out_unlock: | |||
| 397 | sctp_transport_put(transport); | 397 | sctp_transport_put(transport); |
| 398 | } | 398 | } |
| 399 | 399 | ||
| 400 | /* Handle the timeout of the ICMP protocol unreachable timer. Trigger | ||
| 401 | * the correct state machine transition that will close the association. | ||
| 402 | */ | ||
| 403 | void sctp_generate_proto_unreach_event(unsigned long data) | ||
| 404 | { | ||
| 405 | struct sctp_transport *transport = (struct sctp_transport *) data; | ||
| 406 | struct sctp_association *asoc = transport->asoc; | ||
| 407 | |||
| 408 | sctp_bh_lock_sock(asoc->base.sk); | ||
| 409 | if (sock_owned_by_user(asoc->base.sk)) { | ||
| 410 | SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__); | ||
| 411 | |||
| 412 | /* Try again later. */ | ||
| 413 | if (!mod_timer(&transport->proto_unreach_timer, | ||
| 414 | jiffies + (HZ/20))) | ||
| 415 | sctp_association_hold(asoc); | ||
| 416 | goto out_unlock; | ||
| 417 | } | ||
| 418 | |||
| 419 | /* Is this structure just waiting around for us to actually | ||
| 420 | * get destroyed? | ||
| 421 | */ | ||
| 422 | if (asoc->base.dead) | ||
| 423 | goto out_unlock; | ||
| 424 | |||
| 425 | sctp_do_sm(SCTP_EVENT_T_OTHER, | ||
| 426 | SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH), | ||
| 427 | asoc->state, asoc->ep, asoc, transport, GFP_ATOMIC); | ||
| 428 | |||
| 429 | out_unlock: | ||
| 430 | sctp_bh_unlock_sock(asoc->base.sk); | ||
| 431 | sctp_association_put(asoc); | ||
| 432 | } | ||
| 433 | |||
| 434 | |||
| 400 | /* Inject a SACK Timeout event into the state machine. */ | 435 | /* Inject a SACK Timeout event into the state machine. */ |
| 401 | static void sctp_generate_sack_event(unsigned long data) | 436 | static void sctp_generate_sack_event(unsigned long data) |
| 402 | { | 437 | { |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index be4d63d5a5cc..165d54e07fcd 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
| @@ -108,6 +108,8 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
| 108 | (unsigned long)peer); | 108 | (unsigned long)peer); |
| 109 | setup_timer(&peer->hb_timer, sctp_generate_heartbeat_event, | 109 | setup_timer(&peer->hb_timer, sctp_generate_heartbeat_event, |
| 110 | (unsigned long)peer); | 110 | (unsigned long)peer); |
| 111 | setup_timer(&peer->proto_unreach_timer, | ||
| 112 | sctp_generate_proto_unreach_event, (unsigned long)peer); | ||
| 111 | 113 | ||
| 112 | /* Initialize the 64-bit random nonce sent with heartbeat. */ | 114 | /* Initialize the 64-bit random nonce sent with heartbeat. */ |
| 113 | get_random_bytes(&peer->hb_nonce, sizeof(peer->hb_nonce)); | 115 | get_random_bytes(&peer->hb_nonce, sizeof(peer->hb_nonce)); |
| @@ -171,6 +173,10 @@ void sctp_transport_free(struct sctp_transport *transport) | |||
| 171 | del_timer(&transport->T3_rtx_timer)) | 173 | del_timer(&transport->T3_rtx_timer)) |
| 172 | sctp_transport_put(transport); | 174 | sctp_transport_put(transport); |
| 173 | 175 | ||
| 176 | /* Delete the ICMP proto unreachable timer if it's active. */ | ||
| 177 | if (timer_pending(&transport->proto_unreach_timer) && | ||
| 178 | del_timer(&transport->proto_unreach_timer)) | ||
| 179 | sctp_association_put(transport->asoc); | ||
| 174 | 180 | ||
| 175 | sctp_transport_put(transport); | 181 | sctp_transport_put(transport); |
| 176 | } | 182 | } |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 220213e603db..df90f31d14bf 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -796,6 +796,16 @@ static int do_platform_entry(const char *filename, | |||
| 796 | return 1; | 796 | return 1; |
| 797 | } | 797 | } |
| 798 | 798 | ||
| 799 | /* Looks like: zorro:iN. */ | ||
| 800 | static int do_zorro_entry(const char *filename, struct zorro_device_id *id, | ||
| 801 | char *alias) | ||
| 802 | { | ||
| 803 | id->id = TO_NATIVE(id->id); | ||
| 804 | strcpy(alias, "zorro:"); | ||
| 805 | ADD(alias, "i", id->id != ZORRO_WILDCARD, id->id); | ||
| 806 | return 1; | ||
| 807 | } | ||
| 808 | |||
| 799 | /* Ignore any prefix, eg. some architectures prepend _ */ | 809 | /* Ignore any prefix, eg. some architectures prepend _ */ |
| 800 | static inline int sym_is(const char *symbol, const char *name) | 810 | static inline int sym_is(const char *symbol, const char *name) |
| 801 | { | 811 | { |
| @@ -943,6 +953,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
| 943 | do_table(symval, sym->st_size, | 953 | do_table(symval, sym->st_size, |
| 944 | sizeof(struct platform_device_id), "platform", | 954 | sizeof(struct platform_device_id), "platform", |
| 945 | do_platform_entry, mod); | 955 | do_platform_entry, mod); |
| 956 | else if (sym_is(symname, "__mod_zorro_device_table")) | ||
| 957 | do_table(symval, sym->st_size, | ||
| 958 | sizeof(struct zorro_device_id), "zorro", | ||
| 959 | do_zorro_entry, mod); | ||
| 946 | free(zeros); | 960 | free(zeros); |
| 947 | } | 961 | } |
| 948 | 962 | ||
diff --git a/security/min_addr.c b/security/min_addr.c index e86f297522bf..f728728f193b 100644 --- a/security/min_addr.c +++ b/security/min_addr.c | |||
| @@ -33,7 +33,7 @@ int mmap_min_addr_handler(struct ctl_table *table, int write, | |||
| 33 | { | 33 | { |
| 34 | int ret; | 34 | int ret; |
| 35 | 35 | ||
| 36 | if (!capable(CAP_SYS_RAWIO)) | 36 | if (write && !capable(CAP_SYS_RAWIO)) |
| 37 | return -EPERM; | 37 | return -EPERM; |
| 38 | 38 | ||
| 39 | ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); | 39 | ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 872887624030..20b5982c996b 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
| @@ -36,6 +36,9 @@ | |||
| 36 | #include <sound/timer.h> | 36 | #include <sound/timer.h> |
| 37 | #include <sound/minors.h> | 37 | #include <sound/minors.h> |
| 38 | #include <asm/io.h> | 38 | #include <asm/io.h> |
| 39 | #if defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT) | ||
| 40 | #include <dma-coherence.h> | ||
| 41 | #endif | ||
| 39 | 42 | ||
| 40 | /* | 43 | /* |
| 41 | * Compatibility | 44 | * Compatibility |
| @@ -3184,6 +3187,10 @@ static int snd_pcm_default_mmap(struct snd_pcm_substream *substream, | |||
| 3184 | substream->runtime->dma_area, | 3187 | substream->runtime->dma_area, |
| 3185 | substream->runtime->dma_addr, | 3188 | substream->runtime->dma_addr, |
| 3186 | area->vm_end - area->vm_start); | 3189 | area->vm_end - area->vm_start); |
| 3190 | #elif defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT) | ||
| 3191 | if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV && | ||
| 3192 | !plat_device_is_coherent(substream->dma_buffer.dev.dev)) | ||
| 3193 | area->vm_page_prot = pgprot_noncached(area->vm_page_prot); | ||
| 3187 | #endif /* ARCH_HAS_DMA_MMAP_COHERENT */ | 3194 | #endif /* ARCH_HAS_DMA_MMAP_COHERENT */ |
| 3188 | /* mmap with fault handler */ | 3195 | /* mmap with fault handler */ |
| 3189 | area->vm_ops = &snd_pcm_vm_ops_data_fault; | 3196 | area->vm_ops = &snd_pcm_vm_ops_data_fault; |
diff --git a/sound/oss/dmasound/dmasound_paula.c b/sound/oss/dmasound/dmasound_paula.c index bb14e4c67e89..87910e992133 100644 --- a/sound/oss/dmasound/dmasound_paula.c +++ b/sound/oss/dmasound/dmasound_paula.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/ioport.h> | 21 | #include <linux/ioport.h> |
| 22 | #include <linux/soundcard.h> | 22 | #include <linux/soundcard.h> |
| 23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
| 24 | #include <linux/platform_device.h> | ||
| 24 | 25 | ||
| 25 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
| 26 | #include <asm/setup.h> | 27 | #include <asm/setup.h> |
| @@ -710,31 +711,41 @@ static MACHINE machAmiga = { | |||
| 710 | /*** Config & Setup **********************************************************/ | 711 | /*** Config & Setup **********************************************************/ |
| 711 | 712 | ||
| 712 | 713 | ||
| 713 | static int __init dmasound_paula_init(void) | 714 | static int __init amiga_audio_probe(struct platform_device *pdev) |
| 714 | { | 715 | { |
| 715 | int err; | 716 | dmasound.mach = machAmiga; |
| 716 | 717 | dmasound.mach.default_hard = def_hard ; | |
| 717 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_AUDIO)) { | 718 | dmasound.mach.default_soft = def_soft ; |
| 718 | if (!request_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40, | 719 | return dmasound_init(); |
| 719 | "dmasound [Paula]")) | ||
| 720 | return -EBUSY; | ||
| 721 | dmasound.mach = machAmiga; | ||
| 722 | dmasound.mach.default_hard = def_hard ; | ||
| 723 | dmasound.mach.default_soft = def_soft ; | ||
| 724 | err = dmasound_init(); | ||
| 725 | if (err) | ||
| 726 | release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40); | ||
| 727 | return err; | ||
| 728 | } else | ||
| 729 | return -ENODEV; | ||
| 730 | } | 720 | } |
| 731 | 721 | ||
| 732 | static void __exit dmasound_paula_cleanup(void) | 722 | static int __exit amiga_audio_remove(struct platform_device *pdev) |
| 733 | { | 723 | { |
| 734 | dmasound_deinit(); | 724 | dmasound_deinit(); |
| 735 | release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40); | 725 | return 0; |
| 726 | } | ||
| 727 | |||
| 728 | static struct platform_driver amiga_audio_driver = { | ||
| 729 | .remove = __exit_p(amiga_audio_remove), | ||
| 730 | .driver = { | ||
| 731 | .name = "amiga-audio", | ||
| 732 | .owner = THIS_MODULE, | ||
| 733 | }, | ||
| 734 | }; | ||
| 735 | |||
| 736 | static int __init amiga_audio_init(void) | ||
| 737 | { | ||
| 738 | return platform_driver_probe(&amiga_audio_driver, amiga_audio_probe); | ||
| 736 | } | 739 | } |
| 737 | 740 | ||
| 738 | module_init(dmasound_paula_init); | 741 | module_init(amiga_audio_init); |
| 739 | module_exit(dmasound_paula_cleanup); | 742 | |
| 743 | static void __exit amiga_audio_exit(void) | ||
| 744 | { | ||
| 745 | platform_driver_unregister(&amiga_audio_driver); | ||
| 746 | } | ||
| 747 | |||
| 748 | module_exit(amiga_audio_exit); | ||
| 749 | |||
| 740 | MODULE_LICENSE("GPL"); | 750 | MODULE_LICENSE("GPL"); |
| 751 | MODULE_ALIAS("platform:amiga-audio"); | ||
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 56e52071c769..feabb44c7ca4 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -1197,9 +1197,10 @@ static int patch_cxt5045(struct hda_codec *codec) | |||
| 1197 | case 0x103c: | 1197 | case 0x103c: |
| 1198 | case 0x1631: | 1198 | case 0x1631: |
| 1199 | case 0x1734: | 1199 | case 0x1734: |
| 1200 | /* HP, Packard Bell, & Fujitsu-Siemens laptops have really bad | 1200 | case 0x17aa: |
| 1201 | * sound over 0dB on NID 0x17. Fix max PCM level to 0 dB | 1201 | /* HP, Packard Bell, Fujitsu-Siemens & Lenovo laptops have |
| 1202 | * (originally it has 0x2b steps with 0dB offset 0x14) | 1202 | * really bad sound over 0dB on NID 0x17. Fix max PCM level to |
| 1203 | * 0 dB (originally it has 0x2b steps with 0dB offset 0x14) | ||
| 1203 | */ | 1204 | */ |
| 1204 | snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, | 1205 | snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, |
| 1205 | (0x14 << AC_AMPCAP_OFFSET_SHIFT) | | 1206 | (0x14 << AC_AMPCAP_OFFSET_SHIFT) | |
| @@ -2846,6 +2847,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 2846 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 2847 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
| 2847 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 2848 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
| 2848 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | 2849 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
| 2850 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), | ||
| 2849 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), | 2851 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), |
| 2850 | {} | 2852 | {} |
| 2851 | }; | 2853 | }; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7404dba16f83..886d8e46bb37 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -17871,7 +17871,6 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
| 17871 | ALC662_3ST_6ch_DIG), | 17871 | ALC662_3ST_6ch_DIG), |
| 17872 | SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", | 17872 | SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", |
| 17873 | ALC663_ASUS_H13), | 17873 | ALC663_ASUS_H13), |
| 17874 | SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG), | ||
| 17875 | {} | 17874 | {} |
| 17876 | }; | 17875 | }; |
| 17877 | 17876 | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7fb7d017a347..a0e06d82da1f 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -104,6 +104,7 @@ enum { | |||
| 104 | STAC_DELL_M4_2, | 104 | STAC_DELL_M4_2, |
| 105 | STAC_DELL_M4_3, | 105 | STAC_DELL_M4_3, |
| 106 | STAC_HP_M4, | 106 | STAC_HP_M4, |
| 107 | STAC_HP_DV4, | ||
| 107 | STAC_HP_DV5, | 108 | STAC_HP_DV5, |
| 108 | STAC_HP_HDX, | 109 | STAC_HP_HDX, |
| 109 | STAC_HP_DV4_1222NR, | 110 | STAC_HP_DV4_1222NR, |
| @@ -1544,11 +1545,9 @@ static unsigned int alienware_m17x_pin_configs[13] = { | |||
| 1544 | 0x904601b0, | 1545 | 0x904601b0, |
| 1545 | }; | 1546 | }; |
| 1546 | 1547 | ||
| 1547 | static unsigned int intel_dg45id_pin_configs[14] = { | 1548 | static unsigned int intel_dg45id_pin_configs[13] = { |
| 1548 | 0x02214230, 0x02A19240, 0x01013214, 0x01014210, | 1549 | 0x02214230, 0x02A19240, 0x01013214, 0x01014210, |
| 1549 | 0x01A19250, 0x01011212, 0x01016211, 0x40f000f0, | 1550 | 0x01A19250, 0x01011212, 0x01016211 |
| 1550 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x014510A0, | ||
| 1551 | 0x074510B0, 0x40f000f0 | ||
| 1552 | }; | 1551 | }; |
| 1553 | 1552 | ||
| 1554 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | 1553 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { |
| @@ -1693,6 +1692,7 @@ static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | |||
| 1693 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, | 1692 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, |
| 1694 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, | 1693 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, |
| 1695 | [STAC_HP_M4] = NULL, | 1694 | [STAC_HP_M4] = NULL, |
| 1695 | [STAC_HP_DV4] = NULL, | ||
| 1696 | [STAC_HP_DV5] = NULL, | 1696 | [STAC_HP_DV5] = NULL, |
| 1697 | [STAC_HP_HDX] = NULL, | 1697 | [STAC_HP_HDX] = NULL, |
| 1698 | [STAC_HP_DV4_1222NR] = NULL, | 1698 | [STAC_HP_DV4_1222NR] = NULL, |
| @@ -1705,6 +1705,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { | |||
| 1705 | [STAC_DELL_M4_2] = "dell-m4-2", | 1705 | [STAC_DELL_M4_2] = "dell-m4-2", |
| 1706 | [STAC_DELL_M4_3] = "dell-m4-3", | 1706 | [STAC_DELL_M4_3] = "dell-m4-3", |
| 1707 | [STAC_HP_M4] = "hp-m4", | 1707 | [STAC_HP_M4] = "hp-m4", |
| 1708 | [STAC_HP_DV4] = "hp-dv4", | ||
| 1708 | [STAC_HP_DV5] = "hp-dv5", | 1709 | [STAC_HP_DV5] = "hp-dv5", |
| 1709 | [STAC_HP_HDX] = "hp-hdx", | 1710 | [STAC_HP_HDX] = "hp-hdx", |
| 1710 | [STAC_HP_DV4_1222NR] = "hp-dv4-1222nr", | 1711 | [STAC_HP_DV4_1222NR] = "hp-dv4-1222nr", |
| @@ -1723,7 +1724,7 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
| 1723 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, | 1724 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, |
| 1724 | "HP", STAC_HP_DV5), | 1725 | "HP", STAC_HP_DV5), |
| 1725 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, | 1726 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0, |
| 1726 | "HP dv4-7", STAC_HP_DV5), | 1727 | "HP dv4-7", STAC_HP_DV4), |
| 1727 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600, | 1728 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600, |
| 1728 | "HP dv4-7", STAC_HP_DV5), | 1729 | "HP dv4-7", STAC_HP_DV5), |
| 1729 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610, | 1730 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610, |
| @@ -4768,6 +4769,9 @@ static void set_hp_led_gpio(struct hda_codec *codec) | |||
| 4768 | struct sigmatel_spec *spec = codec->spec; | 4769 | struct sigmatel_spec *spec = codec->spec; |
| 4769 | unsigned int gpio; | 4770 | unsigned int gpio; |
| 4770 | 4771 | ||
| 4772 | if (spec->gpio_led) | ||
| 4773 | return; | ||
| 4774 | |||
| 4771 | gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP); | 4775 | gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP); |
| 4772 | gpio &= AC_GPIO_IO_COUNT; | 4776 | gpio &= AC_GPIO_IO_COUNT; |
| 4773 | if (gpio > 3) | 4777 | if (gpio > 3) |
| @@ -5677,6 +5681,9 @@ again: | |||
| 5677 | spec->num_smuxes = 1; | 5681 | spec->num_smuxes = 1; |
| 5678 | spec->num_dmuxes = 1; | 5682 | spec->num_dmuxes = 1; |
| 5679 | /* fallthrough */ | 5683 | /* fallthrough */ |
| 5684 | case STAC_HP_DV4: | ||
| 5685 | spec->gpio_led = 0x01; | ||
| 5686 | /* fallthrough */ | ||
| 5680 | case STAC_HP_DV5: | 5687 | case STAC_HP_DV5: |
| 5681 | snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); | 5688 | snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); |
| 5682 | stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN); | 5689 | stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN); |
| @@ -5690,6 +5697,7 @@ again: | |||
| 5690 | spec->num_dmics = 1; | 5697 | spec->num_dmics = 1; |
| 5691 | spec->num_dmuxes = 1; | 5698 | spec->num_dmuxes = 1; |
| 5692 | spec->num_smuxes = 1; | 5699 | spec->num_smuxes = 1; |
| 5700 | spec->gpio_led = 0x08; | ||
| 5693 | break; | 5701 | break; |
| 5694 | } | 5702 | } |
| 5695 | 5703 | ||
| @@ -5746,7 +5754,8 @@ again: | |||
| 5746 | } | 5754 | } |
| 5747 | 5755 | ||
| 5748 | /* enable bass on HP dv7 */ | 5756 | /* enable bass on HP dv7 */ |
| 5749 | if (spec->board_config == STAC_HP_DV5) { | 5757 | if (spec->board_config == STAC_HP_DV4 || |
| 5758 | spec->board_config == STAC_HP_DV5) { | ||
| 5750 | unsigned int cap; | 5759 | unsigned int cap; |
| 5751 | cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP); | 5760 | cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP); |
| 5752 | cap &= AC_GPIO_IO_COUNT; | 5761 | cap &= AC_GPIO_IO_COUNT; |
diff --git a/sound/pci/ice1712/maya44.c b/sound/pci/ice1712/maya44.c index 3e1c20ae2f1c..726fd4b92e19 100644 --- a/sound/pci/ice1712/maya44.c +++ b/sound/pci/ice1712/maya44.c | |||
| @@ -347,7 +347,7 @@ static int maya_gpio_sw_put(struct snd_kcontrol *kcontrol, | |||
| 347 | 347 | ||
| 348 | /* known working input slots (0-4) */ | 348 | /* known working input slots (0-4) */ |
| 349 | #define MAYA_LINE_IN 1 /* in-2 */ | 349 | #define MAYA_LINE_IN 1 /* in-2 */ |
| 350 | #define MAYA_MIC_IN 4 /* in-5 */ | 350 | #define MAYA_MIC_IN 3 /* in-4 */ |
| 351 | 351 | ||
| 352 | static void wm8776_select_input(struct snd_maya44 *chip, int idx, int line) | 352 | static void wm8776_select_input(struct snd_maya44 *chip, int idx, int line) |
| 353 | { | 353 | { |
| @@ -393,8 +393,8 @@ static int maya_rec_src_put(struct snd_kcontrol *kcontrol, | |||
| 393 | int changed; | 393 | int changed; |
| 394 | 394 | ||
| 395 | mutex_lock(&chip->mutex); | 395 | mutex_lock(&chip->mutex); |
| 396 | changed = maya_set_gpio_bits(chip->ice, GPIO_MIC_RELAY, | 396 | changed = maya_set_gpio_bits(chip->ice, 1 << GPIO_MIC_RELAY, |
| 397 | sel ? GPIO_MIC_RELAY : 0); | 397 | sel ? (1 << GPIO_MIC_RELAY) : 0); |
| 398 | wm8776_select_input(chip, 0, sel ? MAYA_MIC_IN : MAYA_LINE_IN); | 398 | wm8776_select_input(chip, 0, sel ? MAYA_MIC_IN : MAYA_LINE_IN); |
| 399 | mutex_unlock(&chip->mutex); | 399 | mutex_unlock(&chip->mutex); |
| 400 | return changed; | 400 | return changed; |
diff --git a/sound/pci/oxygen/xonar_cs43xx.c b/sound/pci/oxygen/xonar_cs43xx.c index 16c226bfcd2b..7c4986b27f2b 100644 --- a/sound/pci/oxygen/xonar_cs43xx.c +++ b/sound/pci/oxygen/xonar_cs43xx.c | |||
| @@ -56,6 +56,7 @@ | |||
| 56 | #include <sound/pcm_params.h> | 56 | #include <sound/pcm_params.h> |
| 57 | #include <sound/tlv.h> | 57 | #include <sound/tlv.h> |
| 58 | #include "xonar.h" | 58 | #include "xonar.h" |
| 59 | #include "cm9780.h" | ||
| 59 | #include "cs4398.h" | 60 | #include "cs4398.h" |
| 60 | #include "cs4362a.h" | 61 | #include "cs4362a.h" |
| 61 | 62 | ||
| @@ -172,6 +173,8 @@ static void xonar_d1_init(struct oxygen *chip) | |||
| 172 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, | 173 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, |
| 173 | GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); | 174 | GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); |
| 174 | 175 | ||
| 176 | oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); | ||
| 177 | |||
| 175 | xonar_init_cs53x1(chip); | 178 | xonar_init_cs53x1(chip); |
| 176 | xonar_enable_output(chip); | 179 | xonar_enable_output(chip); |
| 177 | 180 | ||
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 3b8b6387c47c..f1411e9cdf47 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -563,6 +563,9 @@ static int __cmd_record(int argc, const char **argv) | |||
| 563 | 563 | ||
| 564 | err = event__synthesize_kernel_mmap(process_synthesized_event, | 564 | err = event__synthesize_kernel_mmap(process_synthesized_event, |
| 565 | session, "_text"); | 565 | session, "_text"); |
| 566 | if (err < 0) | ||
| 567 | err = event__synthesize_kernel_mmap(process_synthesized_event, | ||
| 568 | session, "_stext"); | ||
| 566 | if (err < 0) { | 569 | if (err < 0) { |
| 567 | pr_err("Couldn't record kernel reference relocation symbol.\n"); | 570 | pr_err("Couldn't record kernel reference relocation symbol.\n"); |
| 568 | return err; | 571 | return err; |
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index 9b3c20f42f98..613c9cc90570 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c | |||
| @@ -1925,7 +1925,7 @@ void *raw_field_ptr(struct event *event, const char *name, void *data) | |||
| 1925 | if (!field) | 1925 | if (!field) |
| 1926 | return NULL; | 1926 | return NULL; |
| 1927 | 1927 | ||
| 1928 | if (field->flags & FIELD_IS_STRING) { | 1928 | if (field->flags & FIELD_IS_DYNAMIC) { |
| 1929 | int offset; | 1929 | int offset; |
| 1930 | 1930 | ||
| 1931 | offset = *(int *)(data + field->offset); | 1931 | offset = *(int *)(data + field->offset); |
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 03a5eb22da2b..7c79c1d76d0c 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
| @@ -197,7 +197,7 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | |||
| 197 | union kvm_ioapic_redirect_entry entry; | 197 | union kvm_ioapic_redirect_entry entry; |
| 198 | int ret = 1; | 198 | int ret = 1; |
| 199 | 199 | ||
| 200 | mutex_lock(&ioapic->lock); | 200 | spin_lock(&ioapic->lock); |
| 201 | if (irq >= 0 && irq < IOAPIC_NUM_PINS) { | 201 | if (irq >= 0 && irq < IOAPIC_NUM_PINS) { |
| 202 | entry = ioapic->redirtbl[irq]; | 202 | entry = ioapic->redirtbl[irq]; |
| 203 | level ^= entry.fields.polarity; | 203 | level ^= entry.fields.polarity; |
| @@ -214,7 +214,7 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | |||
| 214 | } | 214 | } |
| 215 | trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); | 215 | trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); |
| 216 | } | 216 | } |
| 217 | mutex_unlock(&ioapic->lock); | 217 | spin_unlock(&ioapic->lock); |
| 218 | 218 | ||
| 219 | return ret; | 219 | return ret; |
| 220 | } | 220 | } |
| @@ -238,9 +238,9 @@ static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int vector, | |||
| 238 | * is dropped it will be put into irr and will be delivered | 238 | * is dropped it will be put into irr and will be delivered |
| 239 | * after ack notifier returns. | 239 | * after ack notifier returns. |
| 240 | */ | 240 | */ |
| 241 | mutex_unlock(&ioapic->lock); | 241 | spin_unlock(&ioapic->lock); |
| 242 | kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i); | 242 | kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i); |
| 243 | mutex_lock(&ioapic->lock); | 243 | spin_lock(&ioapic->lock); |
| 244 | 244 | ||
| 245 | if (trigger_mode != IOAPIC_LEVEL_TRIG) | 245 | if (trigger_mode != IOAPIC_LEVEL_TRIG) |
| 246 | continue; | 246 | continue; |
| @@ -259,9 +259,9 @@ void kvm_ioapic_update_eoi(struct kvm *kvm, int vector, int trigger_mode) | |||
| 259 | smp_rmb(); | 259 | smp_rmb(); |
| 260 | if (!test_bit(vector, ioapic->handled_vectors)) | 260 | if (!test_bit(vector, ioapic->handled_vectors)) |
| 261 | return; | 261 | return; |
| 262 | mutex_lock(&ioapic->lock); | 262 | spin_lock(&ioapic->lock); |
| 263 | __kvm_ioapic_update_eoi(ioapic, vector, trigger_mode); | 263 | __kvm_ioapic_update_eoi(ioapic, vector, trigger_mode); |
| 264 | mutex_unlock(&ioapic->lock); | 264 | spin_unlock(&ioapic->lock); |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | static inline struct kvm_ioapic *to_ioapic(struct kvm_io_device *dev) | 267 | static inline struct kvm_ioapic *to_ioapic(struct kvm_io_device *dev) |
| @@ -287,7 +287,7 @@ static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len, | |||
| 287 | ASSERT(!(addr & 0xf)); /* check alignment */ | 287 | ASSERT(!(addr & 0xf)); /* check alignment */ |
| 288 | 288 | ||
| 289 | addr &= 0xff; | 289 | addr &= 0xff; |
| 290 | mutex_lock(&ioapic->lock); | 290 | spin_lock(&ioapic->lock); |
| 291 | switch (addr) { | 291 | switch (addr) { |
| 292 | case IOAPIC_REG_SELECT: | 292 | case IOAPIC_REG_SELECT: |
| 293 | result = ioapic->ioregsel; | 293 | result = ioapic->ioregsel; |
| @@ -301,7 +301,7 @@ static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len, | |||
| 301 | result = 0; | 301 | result = 0; |
| 302 | break; | 302 | break; |
| 303 | } | 303 | } |
| 304 | mutex_unlock(&ioapic->lock); | 304 | spin_unlock(&ioapic->lock); |
| 305 | 305 | ||
| 306 | switch (len) { | 306 | switch (len) { |
| 307 | case 8: | 307 | case 8: |
| @@ -338,7 +338,7 @@ static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, | |||
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | addr &= 0xff; | 340 | addr &= 0xff; |
| 341 | mutex_lock(&ioapic->lock); | 341 | spin_lock(&ioapic->lock); |
| 342 | switch (addr) { | 342 | switch (addr) { |
| 343 | case IOAPIC_REG_SELECT: | 343 | case IOAPIC_REG_SELECT: |
| 344 | ioapic->ioregsel = data; | 344 | ioapic->ioregsel = data; |
| @@ -356,7 +356,7 @@ static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len, | |||
| 356 | default: | 356 | default: |
| 357 | break; | 357 | break; |
| 358 | } | 358 | } |
| 359 | mutex_unlock(&ioapic->lock); | 359 | spin_unlock(&ioapic->lock); |
| 360 | return 0; | 360 | return 0; |
| 361 | } | 361 | } |
| 362 | 362 | ||
| @@ -386,7 +386,7 @@ int kvm_ioapic_init(struct kvm *kvm) | |||
| 386 | ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL); | 386 | ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL); |
| 387 | if (!ioapic) | 387 | if (!ioapic) |
| 388 | return -ENOMEM; | 388 | return -ENOMEM; |
| 389 | mutex_init(&ioapic->lock); | 389 | spin_lock_init(&ioapic->lock); |
| 390 | kvm->arch.vioapic = ioapic; | 390 | kvm->arch.vioapic = ioapic; |
| 391 | kvm_ioapic_reset(ioapic); | 391 | kvm_ioapic_reset(ioapic); |
| 392 | kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops); | 392 | kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops); |
| @@ -419,9 +419,9 @@ int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) | |||
| 419 | if (!ioapic) | 419 | if (!ioapic) |
| 420 | return -EINVAL; | 420 | return -EINVAL; |
| 421 | 421 | ||
| 422 | mutex_lock(&ioapic->lock); | 422 | spin_lock(&ioapic->lock); |
| 423 | memcpy(state, ioapic, sizeof(struct kvm_ioapic_state)); | 423 | memcpy(state, ioapic, sizeof(struct kvm_ioapic_state)); |
| 424 | mutex_unlock(&ioapic->lock); | 424 | spin_unlock(&ioapic->lock); |
| 425 | return 0; | 425 | return 0; |
| 426 | } | 426 | } |
| 427 | 427 | ||
| @@ -431,9 +431,9 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) | |||
| 431 | if (!ioapic) | 431 | if (!ioapic) |
| 432 | return -EINVAL; | 432 | return -EINVAL; |
| 433 | 433 | ||
| 434 | mutex_lock(&ioapic->lock); | 434 | spin_lock(&ioapic->lock); |
| 435 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); | 435 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); |
| 436 | update_handled_vectors(ioapic); | 436 | update_handled_vectors(ioapic); |
| 437 | mutex_unlock(&ioapic->lock); | 437 | spin_unlock(&ioapic->lock); |
| 438 | return 0; | 438 | return 0; |
| 439 | } | 439 | } |
diff --git a/virt/kvm/ioapic.h b/virt/kvm/ioapic.h index 8a751b78a430..0b190c34ccc3 100644 --- a/virt/kvm/ioapic.h +++ b/virt/kvm/ioapic.h | |||
| @@ -45,7 +45,7 @@ struct kvm_ioapic { | |||
| 45 | struct kvm_io_device dev; | 45 | struct kvm_io_device dev; |
| 46 | struct kvm *kvm; | 46 | struct kvm *kvm; |
| 47 | void (*ack_notifier)(void *opaque, int irq); | 47 | void (*ack_notifier)(void *opaque, int irq); |
| 48 | struct mutex lock; | 48 | spinlock_t lock; |
| 49 | DECLARE_BITMAP(handled_vectors, 256); | 49 | DECLARE_BITMAP(handled_vectors, 256); |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
