diff options
Diffstat (limited to 'lib/fault-inject.c')
| -rw-r--r-- | lib/fault-inject.c | 22 | 
1 files changed, 14 insertions, 8 deletions
| diff --git a/lib/fault-inject.c b/lib/fault-inject.c index 1421818c9ef7..6cff320c4eb4 100644 --- a/lib/fault-inject.c +++ b/lib/fault-inject.c @@ -71,7 +71,7 @@ static bool fail_stacktrace(struct fault_attr *attr)  	int n, nr_entries;  	bool found = (attr->require_start == 0 && attr->require_end == ULONG_MAX); -	if (depth == 0) +	if (depth == 0 || (found && !attr->reject_start && !attr->reject_end))  		return found;  	nr_entries = stack_trace_save(entries, depth, 1); @@ -102,10 +102,16 @@ static inline bool fail_stacktrace(struct fault_attr *attr)  bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)  { +	bool stack_checked = false; +  	if (in_task()) {  		unsigned int fail_nth = READ_ONCE(current->fail_nth);  		if (fail_nth) { +			if (!fail_stacktrace(attr)) +				return false; + +			stack_checked = true;  			fail_nth--;  			WRITE_ONCE(current->fail_nth, fail_nth);  			if (!fail_nth) @@ -125,6 +131,9 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)  	if (atomic_read(&attr->times) == 0)  		return false; +	if (!stack_checked && !fail_stacktrace(attr)) +		return false; +  	if (atomic_read(&attr->space) > size) {  		atomic_sub(size, &attr->space);  		return false; @@ -139,9 +148,6 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)  	if (attr->probability <= get_random_u32_below(100))  		return false; -	if (!fail_stacktrace(attr)) -		return false; -  fail:  	if (!(flags & FAULT_NOWARN))  		fail_dump(attr); @@ -226,10 +232,10 @@ struct dentry *fault_create_debugfs_attr(const char *name,  #ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER  	debugfs_create_stacktrace_depth("stacktrace-depth", mode, dir,  					&attr->stacktrace_depth); -	debugfs_create_ul("require-start", mode, dir, &attr->require_start); -	debugfs_create_ul("require-end", mode, dir, &attr->require_end); -	debugfs_create_ul("reject-start", mode, dir, &attr->reject_start); -	debugfs_create_ul("reject-end", mode, dir, &attr->reject_end); +	debugfs_create_xul("require-start", mode, dir, &attr->require_start); +	debugfs_create_xul("require-end", mode, dir, &attr->require_end); +	debugfs_create_xul("reject-start", mode, dir, &attr->reject_start); +	debugfs_create_xul("reject-end", mode, dir, &attr->reject_end);  #endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */  	attr->dname = dget(dir); |