* Lustre is a trademark of Oracle Corporation, Inc.
*/
+#include <linux/random.h>
#include <libcfs/libcfs.h>
unsigned long cfs_fail_loc = 0;
/* Fail 1/cfs_fail_val times */
if (cfs_fail_loc & CFS_FAIL_RAND) {
- if (cfs_fail_val < 2 || cfs_rand() % cfs_fail_val > 0)
+ if (cfs_fail_val < 2 || prandom_u32_max(cfs_fail_val) > 0)
return 0;
}
int __cfs_fail_timeout_set(__u32 id, __u32 value, int ms, int set)
{
+ ktime_t till = ktime_add_ms(ktime_get(), ms);
int ret = 0;
ret = __cfs_fail_check_set(id, value, set);
if (ret && likely(ms > 0)) {
- CERROR("cfs_fail_timeout id %x sleeping for %dms\n",
- id, ms);
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(cfs_time_seconds(ms) / 1000);
- set_current_state(TASK_RUNNING);
- CERROR("cfs_fail_timeout id %x awake\n", id);
+ CERROR("cfs_fail_timeout id %x sleeping for %dms\n", id, ms);
+ while (ktime_before(ktime_get(), till)) {
+ schedule_timeout_uninterruptible(cfs_time_seconds(1)
+ / 10);
+ set_current_state(TASK_RUNNING);
+ if (!cfs_fail_loc) {
+ CERROR("cfs_fail_timeout interrupted\n");
+ break;
+ }
+ }
+ if (cfs_fail_loc)
+ CERROR("cfs_fail_timeout id %x awake\n", id);
}
return ret;
}