diff options
Diffstat (limited to 'lib/errseq.c')
| -rw-r--r-- | lib/errseq.c | 23 | 
1 files changed, 9 insertions, 14 deletions
| diff --git a/lib/errseq.c b/lib/errseq.c index df782418b333..81f9e33aa7e7 100644 --- a/lib/errseq.c +++ b/lib/errseq.c @@ -111,27 +111,22 @@ EXPORT_SYMBOL(errseq_set);   * errseq_sample() - Grab current errseq_t value.   * @eseq: Pointer to errseq_t to be sampled.   * - * This function allows callers to sample an errseq_t value, marking it as - * "seen" if required. + * This function allows callers to initialise their errseq_t variable. + * If the error has been "seen", new callers will not see an old error. + * If there is an unseen error in @eseq, the caller of this function will + * see it the next time it checks for an error.   * + * Context: Any context.   * Return: The current errseq value.   */  errseq_t errseq_sample(errseq_t *eseq)  {  	errseq_t old = READ_ONCE(*eseq); -	errseq_t new = old; -	/* -	 * For the common case of no errors ever having been set, we can skip -	 * marking the SEEN bit. Once an error has been set, the value will -	 * never go back to zero. -	 */ -	if (old != 0) { -		new |= ERRSEQ_SEEN; -		if (old != new) -			cmpxchg(eseq, old, new); -	} -	return new; +	/* If nobody has seen this error yet, then we can be the first. */ +	if (!(old & ERRSEQ_SEEN)) +		old = 0; +	return old;  }  EXPORT_SYMBOL(errseq_sample); | 
