Commit 213510c3 authored by Zizhi Wo's avatar Zizhi Wo
Browse files

fscache: add a memory barrier for FSCACHE_VOLUME_CREATING

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IB5UKT



--------------------------------

In fscache_create_volume(), there is a missing memory barrier between the
bit-clearing operation and the wake-up operation. This may cause a
situation where, after a wake-up, the bit-clearing operation hasn't been
detected yet, leading to an indefinite wait. The triggering process is as
follows:

cookie1                 cookie2                  volume_work
fscache_perform_lookup
  fscache_create_volume
			fscache_perform_lookup
			  fscache_create_volume
        					 cachefiles_acquire_volume
						   clear_and_wake_up_bit
    test_and_set_bit
                            test_and_set_bit
                              goto maybe_wait
      goto no_wait

In the above process, cookie1 and cookie2 has the same volume. When cookie1
enters the -no_wait- process, it will clear the bit and wake up the waiting
process. If a barrier is missing, it may cause cookie2 to remain in the
-wait- process indefinitely.

In commit 3288666c ("fscache: Use clear_and_wake_up_bit() in
fscache_create_volume_work()"), barriers were added to similar operations
in fscache_create_volume_work(), but fscache_create_volume() was missed.

By combining the clear and wake operations into clear_and_wake_up_bit() to
fix this issue.

Fixes: bfa22da3 ("fscache: Provide and use cache methods to lookup/create/free a volume")
Signed-off-by: default avatarZizhi Wo <wozizhi@huawei.com>
parent 46064348
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -322,8 +322,7 @@ void fscache_create_volume(struct fscache_volume *volume, bool wait)
	}
	return;
no_wait:
	clear_bit_unlock(FSCACHE_VOLUME_CREATING, &volume->flags);
	wake_up_bit(&volume->flags, FSCACHE_VOLUME_CREATING);
	clear_and_wake_up_bit(FSCACHE_VOLUME_CREATING, &volume->flags);
}

/*