Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] bitops: use non atomic operations for minix_*_bit() and ext2_*_bit()

Bitmap functions for the minix filesystem and the ext2 filesystem except
ext2_set_bit_atomic() and ext2_clear_bit_atomic() do not require the atomic
guarantees.

But these are defined by using atomic bit operations on several architectures.
(cris, frv, h8300, ia64, m32r, m68k, m68knommu, mips, s390, sh, sh64, sparc,
sparc64, v850, and xtensa)

This patch switches to non atomic bit operation.

Signed-off-by: Akinobu Mita <mita@miraclelinux.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Akinobu Mita and committed by
Linus Torvalds
67b0ad57 72b61a3c

+60 -72
+4 -4
include/asm-cris/bitops.h
··· 352 352 #define find_first_bit(addr, size) \ 353 353 find_next_bit((addr), (size), 0) 354 354 355 - #define ext2_set_bit test_and_set_bit 355 + #define ext2_set_bit __test_and_set_bit 356 356 #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) 357 - #define ext2_clear_bit test_and_clear_bit 357 + #define ext2_clear_bit __test_and_clear_bit 358 358 #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) 359 359 #define ext2_test_bit test_bit 360 360 #define ext2_find_first_zero_bit find_first_zero_bit 361 361 #define ext2_find_next_zero_bit find_next_zero_bit 362 362 363 363 /* Bitmap functions for the minix filesystem. */ 364 - #define minix_set_bit(nr,addr) test_and_set_bit(nr,addr) 365 - #define minix_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 364 + #define minix_set_bit(nr,addr) __test_and_set_bit(nr,addr) 365 + #define minix_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 366 366 #define minix_test_bit(nr,addr) test_bit(nr,addr) 367 367 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 368 368
+7 -7
include/asm-frv/bitops.h
··· 259 259 #define hweight16(x) generic_hweight16(x) 260 260 #define hweight8(x) generic_hweight8(x) 261 261 262 - #define ext2_set_bit(nr, addr) test_and_set_bit ((nr) ^ 0x18, (addr)) 263 - #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 0x18, (addr)) 262 + #define ext2_set_bit(nr, addr) __test_and_set_bit ((nr) ^ 0x18, (addr)) 263 + #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 0x18, (addr)) 264 264 265 - #define ext2_set_bit_atomic(lock,nr,addr) ext2_set_bit((nr), addr) 266 - #define ext2_clear_bit_atomic(lock,nr,addr) ext2_clear_bit((nr), addr) 265 + #define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit ((nr) ^ 0x18, (addr)) 266 + #define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr) ^ 0x18, (addr)) 267 267 268 268 static inline int ext2_test_bit(int nr, const volatile void * addr) 269 269 { ··· 331 331 } 332 332 333 333 /* Bitmap functions for the minix filesystem. */ 334 - #define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr) 335 - #define minix_set_bit(nr,addr) ext2_set_bit(nr,addr) 336 - #define minix_test_and_clear_bit(nr,addr) ext2_clear_bit(nr,addr) 334 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit ((nr) ^ 0x18, (addr)) 335 + #define minix_set_bit(nr,addr) __set_bit((nr) ^ 0x18, (addr)) 336 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit((nr) ^ 0x18, (addr)) 337 337 #define minix_test_bit(nr,addr) ext2_test_bit(nr,addr) 338 338 #define minix_find_first_zero_bit(addr,size) ext2_find_first_zero_bit(addr,size) 339 339
+3 -3
include/asm-h8300/bitops.h
··· 397 397 } 398 398 399 399 /* Bitmap functions for the minix filesystem. */ 400 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 401 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 402 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 400 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 401 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 402 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 403 403 #define minix_test_bit(nr,addr) test_bit(nr,addr) 404 404 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 405 405
+5 -5
include/asm-ia64/bitops.h
··· 394 394 395 395 #define __clear_bit(nr, addr) clear_bit(nr, addr) 396 396 397 - #define ext2_set_bit test_and_set_bit 397 + #define ext2_set_bit __test_and_set_bit 398 398 #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) 399 - #define ext2_clear_bit test_and_clear_bit 399 + #define ext2_clear_bit __test_and_clear_bit 400 400 #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) 401 401 #define ext2_test_bit test_bit 402 402 #define ext2_find_first_zero_bit find_first_zero_bit 403 403 #define ext2_find_next_zero_bit find_next_zero_bit 404 404 405 405 /* Bitmap functions for the minix filesystem. */ 406 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 407 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 408 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 406 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 407 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 408 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 409 409 #define minix_test_bit(nr,addr) test_bit(nr,addr) 410 410 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 411 411
+1 -1
include/asm-m32r/bitops.h
··· 575 575 */ 576 576 577 577 #ifdef __LITTLE_ENDIAN__ 578 - #define ext2_set_bit test_and_set_bit 578 + #define ext2_set_bit __test_and_set_bit 579 579 #define ext2_clear_bit __test_and_clear_bit 580 580 #define ext2_test_bit test_bit 581 581 #define ext2_find_first_zero_bit find_first_zero_bit
+5 -5
include/asm-m68k/bitops.h
··· 365 365 return ((p - addr) << 4) + (res ^ 31); 366 366 } 367 367 368 - #define minix_test_and_set_bit(nr, addr) test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) 369 - #define minix_set_bit(nr,addr) set_bit((nr) ^ 16, (unsigned long *)(addr)) 370 - #define minix_test_and_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) 368 + #define minix_test_and_set_bit(nr, addr) __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) 369 + #define minix_set_bit(nr,addr) __set_bit((nr) ^ 16, (unsigned long *)(addr)) 370 + #define minix_test_and_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) 371 371 372 372 static inline int minix_test_bit(int nr, const void *vaddr) 373 373 { ··· 377 377 378 378 /* Bitmap functions for the ext2 filesystem. */ 379 379 380 - #define ext2_set_bit(nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) 380 + #define ext2_set_bit(nr, addr) __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) 381 381 #define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) 382 - #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) 382 + #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) 383 383 #define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) 384 384 385 385 static inline int ext2_test_bit(int nr, const void *vaddr)
+3 -3
include/asm-m68knommu/bitops.h
··· 476 476 } 477 477 478 478 /* Bitmap functions for the minix filesystem. */ 479 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 480 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 481 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 479 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 480 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 481 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 482 482 #define minix_test_bit(nr,addr) test_bit(nr,addr) 483 483 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 484 484
+3 -3
include/asm-mips/bitops.h
··· 962 962 * FIXME: These assume that Minix uses the native byte/bitorder. 963 963 * This limits the Minix filesystem's value for data exchange very much. 964 964 */ 965 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 966 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 967 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 965 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 966 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 967 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 968 968 #define minix_test_bit(nr,addr) test_bit(nr,addr) 969 969 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 970 970
+5 -5
include/asm-s390/bitops.h
··· 871 871 */ 872 872 873 873 #define ext2_set_bit(nr, addr) \ 874 - test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 874 + __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 875 875 #define ext2_set_bit_atomic(lock, nr, addr) \ 876 876 test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 877 877 #define ext2_clear_bit(nr, addr) \ 878 - test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 878 + __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 879 879 #define ext2_clear_bit_atomic(lock, nr, addr) \ 880 880 test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 881 881 #define ext2_test_bit(nr, addr) \ ··· 1014 1014 /* Bitmap functions for the minix filesystem. */ 1015 1015 /* FIXME !!! */ 1016 1016 #define minix_test_and_set_bit(nr,addr) \ 1017 - test_and_set_bit(nr,(unsigned long *)addr) 1017 + __test_and_set_bit(nr,(unsigned long *)addr) 1018 1018 #define minix_set_bit(nr,addr) \ 1019 - set_bit(nr,(unsigned long *)addr) 1019 + __set_bit(nr,(unsigned long *)addr) 1020 1020 #define minix_test_and_clear_bit(nr,addr) \ 1021 - test_and_clear_bit(nr,(unsigned long *)addr) 1021 + __test_and_clear_bit(nr,(unsigned long *)addr) 1022 1022 #define minix_test_bit(nr,addr) \ 1023 1023 test_bit(nr,(unsigned long *)addr) 1024 1024 #define minix_find_first_zero_bit(addr,size) \
+5 -11
include/asm-sh/bitops.h
··· 339 339 } 340 340 341 341 #ifdef __LITTLE_ENDIAN__ 342 - #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr)) 343 - #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr)) 342 + #define ext2_set_bit(nr, addr) __test_and_set_bit((nr), (addr)) 343 + #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr)) 344 344 #define ext2_test_bit(nr, addr) test_bit((nr), (addr)) 345 345 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size)) 346 346 #define ext2_find_next_zero_bit(addr, size, offset) \ ··· 349 349 static __inline__ int ext2_set_bit(int nr, volatile void * addr) 350 350 { 351 351 int mask, retval; 352 - unsigned long flags; 353 352 volatile unsigned char *ADDR = (unsigned char *) addr; 354 353 355 354 ADDR += nr >> 3; 356 355 mask = 1 << (nr & 0x07); 357 - local_irq_save(flags); 358 356 retval = (mask & *ADDR) != 0; 359 357 *ADDR |= mask; 360 - local_irq_restore(flags); 361 358 return retval; 362 359 } 363 360 364 361 static __inline__ int ext2_clear_bit(int nr, volatile void * addr) 365 362 { 366 363 int mask, retval; 367 - unsigned long flags; 368 364 volatile unsigned char *ADDR = (unsigned char *) addr; 369 365 370 366 ADDR += nr >> 3; 371 367 mask = 1 << (nr & 0x07); 372 - local_irq_save(flags); 373 368 retval = (mask & *ADDR) != 0; 374 369 *ADDR &= ~mask; 375 - local_irq_restore(flags); 376 370 return retval; 377 371 } 378 372 ··· 453 459 }) 454 460 455 461 /* Bitmap functions for the minix filesystem. */ 456 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 457 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 458 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 462 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 463 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 464 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 459 465 #define minix_test_bit(nr,addr) test_bit(nr,addr) 460 466 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 461 467
+5 -11
include/asm-sh64/bitops.h
··· 382 382 #define hweight8(x) generic_hweight8(x) 383 383 384 384 #ifdef __LITTLE_ENDIAN__ 385 - #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr)) 386 - #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr)) 385 + #define ext2_set_bit(nr, addr) __test_and_set_bit((nr), (addr)) 386 + #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr)) 387 387 #define ext2_test_bit(nr, addr) test_bit((nr), (addr)) 388 388 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size)) 389 389 #define ext2_find_next_zero_bit(addr, size, offset) \ ··· 392 392 static __inline__ int ext2_set_bit(int nr, volatile void * addr) 393 393 { 394 394 int mask, retval; 395 - unsigned long flags; 396 395 volatile unsigned char *ADDR = (unsigned char *) addr; 397 396 398 397 ADDR += nr >> 3; 399 398 mask = 1 << (nr & 0x07); 400 - local_irq_save(flags); 401 399 retval = (mask & *ADDR) != 0; 402 400 *ADDR |= mask; 403 - local_irq_restore(flags); 404 401 return retval; 405 402 } 406 403 407 404 static __inline__ int ext2_clear_bit(int nr, volatile void * addr) 408 405 { 409 406 int mask, retval; 410 - unsigned long flags; 411 407 volatile unsigned char *ADDR = (unsigned char *) addr; 412 408 413 409 ADDR += nr >> 3; 414 410 mask = 1 << (nr & 0x07); 415 - local_irq_save(flags); 416 411 retval = (mask & *ADDR) != 0; 417 412 *ADDR &= ~mask; 418 - local_irq_restore(flags); 419 413 return retval; 420 414 } 421 415 ··· 496 502 }) 497 503 498 504 /* Bitmap functions for the minix filesystem. */ 499 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 500 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 501 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 505 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 506 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 507 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 502 508 #define minix_test_bit(nr,addr) test_bit(nr,addr) 503 509 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 504 510
+3 -3
include/asm-sparc/bitops.h
··· 523 523 524 524 /* Bitmap functions for the minix filesystem. */ 525 525 #define minix_test_and_set_bit(nr,addr) \ 526 - test_and_set_bit((nr),(unsigned long *)(addr)) 526 + __test_and_set_bit((nr),(unsigned long *)(addr)) 527 527 #define minix_set_bit(nr,addr) \ 528 - set_bit((nr),(unsigned long *)(addr)) 528 + __set_bit((nr),(unsigned long *)(addr)) 529 529 #define minix_test_and_clear_bit(nr,addr) \ 530 - test_and_clear_bit((nr),(unsigned long *)(addr)) 530 + __test_and_clear_bit((nr),(unsigned long *)(addr)) 531 531 #define minix_test_bit(nr,addr) \ 532 532 test_bit((nr),(unsigned long *)(addr)) 533 533 #define minix_find_first_zero_bit(addr,size) \
+3 -3
include/asm-sparc64/bitops.h
··· 280 280 281 281 /* Bitmap functions for the minix filesystem. */ 282 282 #define minix_test_and_set_bit(nr,addr) \ 283 - test_and_set_bit((nr),(unsigned long *)(addr)) 283 + __test_and_set_bit((nr),(unsigned long *)(addr)) 284 284 #define minix_set_bit(nr,addr) \ 285 - set_bit((nr),(unsigned long *)(addr)) 285 + __set_bit((nr),(unsigned long *)(addr)) 286 286 #define minix_test_and_clear_bit(nr,addr) \ 287 - test_and_clear_bit((nr),(unsigned long *)(addr)) 287 + __test_and_clear_bit((nr),(unsigned long *)(addr)) 288 288 #define minix_test_bit(nr,addr) \ 289 289 test_bit((nr),(unsigned long *)(addr)) 290 290 #define minix_find_first_zero_bit(addr,size) \
+5 -5
include/asm-v850/bitops.h
··· 336 336 #define hweight16(x) generic_hweight16 (x) 337 337 #define hweight8(x) generic_hweight8 (x) 338 338 339 - #define ext2_set_bit test_and_set_bit 339 + #define ext2_set_bit __test_and_set_bit 340 340 #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) 341 - #define ext2_clear_bit test_and_clear_bit 341 + #define ext2_clear_bit __test_and_clear_bit 342 342 #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) 343 343 #define ext2_test_bit test_bit 344 344 #define ext2_find_first_zero_bit find_first_zero_bit 345 345 #define ext2_find_next_zero_bit find_next_zero_bit 346 346 347 347 /* Bitmap functions for the minix filesystem. */ 348 - #define minix_test_and_set_bit test_and_set_bit 349 - #define minix_set_bit set_bit 350 - #define minix_test_and_clear_bit test_and_clear_bit 348 + #define minix_test_and_set_bit __test_and_set_bit 349 + #define minix_set_bit __set_bit 350 + #define minix_test_and_clear_bit __test_and_clear_bit 351 351 #define minix_test_bit test_bit 352 352 #define minix_find_first_zero_bit find_first_zero_bit 353 353
+3 -3
include/asm-xtensa/bitops.h
··· 436 436 437 437 /* Bitmap functions for the minix filesystem. */ 438 438 439 - #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 440 - #define minix_set_bit(nr,addr) set_bit(nr,addr) 441 - #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 439 + #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) 440 + #define minix_set_bit(nr,addr) __set_bit(nr,addr) 441 + #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) 442 442 #define minix_test_bit(nr,addr) test_bit(nr,addr) 443 443 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 444 444