mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
errseq infrastructure fix for v4.17
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJa55HYAAoJEAAOaEEZVoIVbr4QAICUweu5RqbcNm6/zGZkYJvP Cmk9bRhqluM3sx7RpDpsgde12z5j6qt+MbS1k+uZ7+V5gsO25jYuQYNGs6io6IEL WzO81HsMmqqqV30MI0/S4ffaYDtqTfJdKkbWvvV7aoFUZpz5oHNjqQM30hSRzy+i 1e6EfxtzUvaavekCvVCqQoDwXWMp1jaxCIFPNiIY82NPmszovydaZiZORL6qRXIM x/n3gWLJv2c0iRr6PBLIwKVOqPmdWwsmgSXTvP5/IH6LuQOZjmfHCJaxA8HZeFyz WvVTaH7aGtYp/pZt6UzvUlCXXcDKVYR4RmCfHW5+OXBsRQPfkSWKRguDXsvedrHe vQN7csCR47AwBsGtli6EF/VzwQnbCLjxOJ8kxVItPHlplYWeRsQCNw0JT9i6wB2k OIuRwekQTYUTXAHYm7XM21wS+JJbcTfANIfmmmfIrcF/Z/Zard5/UuCPSaKcizTy +qVhYE7m+cNYvARgxYrDvCXO7fnef6fj+cC4DrPmqfkvaJfd4U61Yls7QDi9NuO9 DNehjrWOR1ZLlI98aHjs65tilVFA++k2YdR8283ZqXE1tksUI3w/JvBa/h/H/9lr F290fgEe31yMAv3ky0QKm3Glr5Qu9I6AOSWWIHCmW7w6CkFB/K/1iKgy3h2g6rPL 3cMUf/uV4mA9RzAhSgx3 =pLgb -----END PGP SIGNATURE----- Merge tag 'errseq-v4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux Pull errseq infrastructure fix from Jeff Layton: "The PostgreSQL developers recently had a spirited discussion about the writeback error handling in Linux, and reached out to us about a behavoir change to the code that bit them when the errseq_t changes were merged. When we changed to using errseq_t for tracking writeback errors, we lost the ability for an application to see a writeback error that occurred before the open on which the fsync was issued. This was problematic for PostgreSQL which offloads fsync calls to a completely separate process from the DB writers. This patch restores that ability. If the errseq_t value in the inode does not have the SEEN flag set, then we just return 0 for the sample. That ensures that any recorded error is always delivered at least once. Note that we might still lose the error if the inode gets evicted from the cache before anything can reopen it, but that was the case before errseq_t was merged. At LSF/MM we had some discussion about keeping inodes with unreported writeback errors around in the cache for longer (possibly indefinitely), but that's really a separate problem" * tag 'errseq-v4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux: errseq: Always report a writeback error once
This commit is contained in:
commit
fff75eb2a0
1 changed files with 9 additions and 14 deletions
23
lib/errseq.c
23
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue