diff options
Diffstat (limited to 'lib/errseq.c')
| -rw-r--r-- | lib/errseq.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/errseq.c b/lib/errseq.c index 93e9b94358dc..13a2581c5a87 100644 --- a/lib/errseq.c +++ b/lib/errseq.c @@ -34,11 +34,14 @@   */  /* The low bits are designated for error code (max of MAX_ERRNO) */ -#define ERRSEQ_SHIFT		ilog2(MAX_ERRNO + 1) +#define ERRSEQ_SHIFT		(ilog2(MAX_ERRNO) + 1)  /* This bit is used as a flag to indicate whether the value has been seen */  #define ERRSEQ_SEEN		(1 << ERRSEQ_SHIFT) +/* Leverage macro ERRSEQ_SEEN to define errno mask macro here */ +#define ERRNO_MASK		(ERRSEQ_SEEN - 1) +  /* The lowest bit of the counter */  #define ERRSEQ_CTR_INC		(1 << (ERRSEQ_SHIFT + 1)) @@ -60,8 +63,6 @@ errseq_t errseq_set(errseq_t *eseq, int err)  {  	errseq_t cur, old; -	/* MAX_ERRNO must be able to serve as a mask */ -	BUILD_BUG_ON_NOT_POWER_OF_2(MAX_ERRNO + 1);  	/*  	 * Ensure the error code actually fits where we want it to go. If it @@ -79,7 +80,7 @@ errseq_t errseq_set(errseq_t *eseq, int err)  		errseq_t new;  		/* Clear out error bits and set new error */ -		new = (old & ~(MAX_ERRNO|ERRSEQ_SEEN)) | -err; +		new = (old & ~(ERRNO_MASK | ERRSEQ_SEEN)) | -err;  		/* Only increment if someone has looked at it */  		if (old & ERRSEQ_SEEN) @@ -148,7 +149,7 @@ int errseq_check(errseq_t *eseq, errseq_t since)  	if (likely(cur == since))  		return 0; -	return -(cur & MAX_ERRNO); +	return -(cur & ERRNO_MASK);  }  EXPORT_SYMBOL(errseq_check); @@ -200,7 +201,7 @@ int errseq_check_and_advance(errseq_t *eseq, errseq_t *since)  		if (new != old)  			cmpxchg(eseq, old, new);  		*since = new; -		err = -(new & MAX_ERRNO); +		err = -(new & ERRNO_MASK);  	}  	return err;  }  | 
