Explorar el Código

JFS is missing a memory barrier

JFS is missing a memory barrier needed to close the critical section before
clearing the lock bit. Use lock bitops for this.

unlock_page() has a second barrier after clearing the lock, which is
required because it checks whether the waitqueue is active without locks.
Such a barrier is not required here because the waitqueue spinlock is
always taken (something to think about if performance is an issue).

Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
Nick Piggin hace 17 años
padre
commit
54af6233d1
Se han modificado 1 ficheros con 2 adiciones y 2 borrados
  1. 2 2
      fs/jfs/jfs_metapage.c

+ 2 - 2
fs/jfs/jfs_metapage.c

@@ -39,11 +39,11 @@ static struct {
 #endif
 #endif
 
 
 #define metapage_locked(mp) test_bit(META_locked, &(mp)->flag)
 #define metapage_locked(mp) test_bit(META_locked, &(mp)->flag)
-#define trylock_metapage(mp) test_and_set_bit(META_locked, &(mp)->flag)
+#define trylock_metapage(mp) test_and_set_bit_lock(META_locked, &(mp)->flag)
 
 
 static inline void unlock_metapage(struct metapage *mp)
 static inline void unlock_metapage(struct metapage *mp)
 {
 {
-	clear_bit(META_locked, &mp->flag);
+	clear_bit_unlock(META_locked, &mp->flag);
 	wake_up(&mp->wait);
 	wake_up(&mp->wait);
 }
 }