?sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}(hhparenthuba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget#/translations/zh_CN/core-api/errseqmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}(hhhh2ubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}(hhhhFubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}(hhhhZubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}(hhhhnubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}(hhhhubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/sp_SP/core-api/errseqmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hThe errseq_t datatypeh]hThe errseq_t datatype}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh=/var/lib/git/docbuild/linux/Documentation/core-api/errseq.rsthKubh paragraph)}(hAn errseq_t is a way of recording errors in one place, and allowing any number of "subscribers" to tell whether it has changed since a previous point where it was sampled.h]hAn errseq_t is a way of recording errors in one place, and allowing any number of “subscribers” to tell whether it has changed since a previous point where it was sampled.}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hThe initial use case for this is tracking errors for file synchronization syscalls (fsync, fdatasync, msync and sync_file_range), but it may be usable in other situations.h]hThe initial use case for this is tracking errors for file synchronization syscalls (fsync, fdatasync, msync and sync_file_range), but it may be usable in other situations.}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hXIt's implemented as an unsigned 32-bit value. The low order bits are designated to hold an error code (between 1 and MAX_ERRNO). The upper bits are used as a counter. This is done with atomics instead of locking so that these functions can be called from any context.h]hXIt’s implemented as an unsigned 32-bit value. The low order bits are designated to hold an error code (between 1 and MAX_ERRNO). The upper bits are used as a counter. This is done with atomics instead of locking so that these functions can be called from any context.}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hNote that there is a risk of collisions if new errors are being recorded frequently, since we have so few bits to use as a counter.h]hNote that there is a risk of collisions if new errors are being recorded frequently, since we have so few bits to use as a counter.}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX To mitigate this, the bit between the error value and counter is used as a flag to tell whether the value has been sampled since a new value was recorded. That allows us to avoid bumping the counter if no one has sampled it since the last time an error was recorded.h]hX To mitigate this, the bit between the error value and counter is used as a flag to tell whether the value has been sampled since a new value was recorded. That allows us to avoid bumping the counter if no one has sampled it since the last time an error was recorded.}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h;Thus we end up with a value that looks something like this:h]h;Thus we end up with a value that looks something like this:}(hjhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthK&uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(h31..13h]h31..13}(hjHhjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjCubah}(h]h ]h"]h$]h&]uh1jAhj>ubjB)}(hhh]h)}(h12h]h12}(hj_hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubah}(h]h ]h"]h$]h&]uh1jAhj>ubjB)}(hhh]h)}(h11..0h]h11..0}(hjvhjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjqubah}(h]h ]h"]h$]h&]uh1jAhj>ubeh}(h]h ]h"]h$]h&]uh1j<hj9ubj=)}(hhh](jB)}(hhh]h)}(hcounterh]hcounter}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jAhjubjB)}(hhh]h)}(hSFh]hSF}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jAhjubjB)}(hhh]h)}(herrnoh]herrno}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jAhjubeh}(h]h ]h"]h$]h&]uh1j<hj9ubeh}(h]h ]h"]h$]h&]uh1j7hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1j hhhhhhhNubh)}(hXThe general idea is for "watchers" to sample an errseq_t value and keep it as a running cursor. That value can later be used to tell whether any new errors have occurred since that sampling was done, and atomically record the state at the time that it was checked. This allows us to record errors in one place, and then have a number of "watchers" that can tell whether the value has changed since they last checked it.h]hXThe general idea is for “watchers” to sample an errseq_t value and keep it as a running cursor. That value can later be used to tell whether any new errors have occurred since that sampling was done, and atomically record the state at the time that it was checked. This allows us to record errors in one place, and then have a number of “watchers” that can tell whether the value has changed since they last checked it.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hhhhubh)}(hXA new errseq_t should always be zeroed out. An errseq_t value of all zeroes is the special (but common) case where there has never been an error. An all zero value thus serves as the "epoch" if one wishes to know whether there has ever been an error set since it was first initialized.h]hX"A new errseq_t should always be zeroed out. An errseq_t value of all zeroes is the special (but common) case where there has never been an error. An all zero value thus serves as the “epoch” if one wishes to know whether there has ever been an error set since it was first initialized.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hhhhubh)}(hhh](h)}(h API usageh]h API usage}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhK/ubh)}(hXLet me tell you a story about a worker drone. Now, he's a good worker overall, but the company is a little...management heavy. He has to report to 77 supervisors today, and tomorrow the "big boss" is coming in from out of town and he's sure to test the poor fellow too.h]hXLet me tell you a story about a worker drone. Now, he’s a good worker overall, but the company is a little...management heavy. He has to report to 77 supervisors today, and tomorrow the “big boss” is coming in from out of town and he’s sure to test the poor fellow too.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hj hhubh)}(hXThey're all handing him work to do -- so much he can't keep track of who handed him what, but that's not really a big problem. The supervisors just want to know when he's finished all of the work they've handed him so far and whether he made any mistakes since they last asked.h]hX They’re all handing him work to do -- so much he can’t keep track of who handed him what, but that’s not really a big problem. The supervisors just want to know when he’s finished all of the work they’ve handed him so far and whether he made any mistakes since they last asked.}(hj,hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hj hhubh)}(hHe might have made the mistake on work they didn't actually hand him, but he can't keep track of things at that level of detail, all he can remember is the most recent mistake that he made.h]hHe might have made the mistake on work they didn’t actually hand him, but he can’t keep track of things at that level of detail, all he can remember is the most recent mistake that he made.}(hj:hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hj hhubh)}(h(Here's our worker_drone representation::h]h)Here’s our worker_drone representation:}(h'Here's our worker_drone representation:hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hj hhubh literal_block)}(hSstruct worker_drone { errseq_t wd_err; /* for recording errors */ };h]hSstruct worker_drone { errseq_t wd_err; /* for recording errors */ };}(hhhjWubah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jUhhhKAhj hhubh)}(h;Every day, the worker_drone starts out with a blank slate::h]h:Every day, the worker_drone starts out with a blank slate:}(h:Every day, the worker_drone starts out with a blank slate:hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhj hhubjV)}(h1struct worker_drone wd; wd.wd_err = (errseq_t)0;h]h1struct worker_drone wd; wd.wd_err = (errseq_t)0;}(hhhjvubah}(h]h ]h"]h$]h&]jejfuh1jUhhhKGhj hhubh)}(hThe supervisors come in and get an initial read for the day. They don't care about anything that happened before their watch begins::h]hThe supervisors come in and get an initial read for the day. They don’t care about anything that happened before their watch begins:}(hThe supervisors come in and get an initial read for the day. They don't care about anything that happened before their watch begins:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhj hhubjV)}(hXstruct supervisor { errseq_t s_wd_err; /* private "cursor" for wd_err */ spinlock_t s_wd_err_lock; /* protects s_wd_err */ } struct supervisor su; su.s_wd_err = errseq_sample(&wd.wd_err); spin_lock_init(&su.s_wd_err_lock);h]hXstruct supervisor { errseq_t s_wd_err; /* private "cursor" for wd_err */ spinlock_t s_wd_err_lock; /* protects s_wd_err */ } struct supervisor su; su.s_wd_err = errseq_sample(&wd.wd_err); spin_lock_init(&su.s_wd_err_lock);}(hhhjubah}(h]h ]h"]h$]h&]jejfuh1jUhhhKNhj hhubh)}(hNow they start handing him tasks to do. Every few minutes they ask him to finish up all of the work they've handed him so far. Then they ask him whether he made any mistakes on any of it::h]hNow they start handing him tasks to do. Every few minutes they ask him to finish up all of the work they’ve handed him so far. Then they ask him whether he made any mistakes on any of it:}(hNow they start handing him tasks to do. Every few minutes they ask him to finish up all of the work they've handed him so far. Then they ask him whether he made any mistakes on any of it:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhj hhubjV)}(hyspin_lock(&su.su_wd_err_lock); err = errseq_check_and_advance(&wd.wd_err, &su.s_wd_err); spin_unlock(&su.su_wd_err_lock);h]hyspin_lock(&su.su_wd_err_lock); err = errseq_check_and_advance(&wd.wd_err, &su.s_wd_err); spin_unlock(&su.su_wd_err_lock);}(hhhjubah}(h]h ]h"]h$]h&]jejfuh1jUhhhK\hj hhubh)}(h.Up to this point, that just keeps returning 0.h]h.Up to this point, that just keeps returning 0.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hj hhubh)}(hNow, the owners of this company are quite miserly and have given him substandard equipment with which to do his job. Occasionally it glitches and he makes a mistake. He sighs a heavy sigh, and marks it down::h]hNow, the owners of this company are quite miserly and have given him substandard equipment with which to do his job. Occasionally it glitches and he makes a mistake. He sighs a heavy sigh, and marks it down:}(hNow, the owners of this company are quite miserly and have given him substandard equipment with which to do his job. Occasionally it glitches and he makes a mistake. He sighs a heavy sigh, and marks it down:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhj hhubjV)}(herrseq_set(&wd.wd_err, -EIO);h]herrseq_set(&wd.wd_err, -EIO);}(hhhjubah}(h]h ]h"]h$]h&]jejfuh1jUhhhKghj hhubh)}(h...and then gets back to work. The supervisors eventually poll again and they each get the error when they next check. Subsequent calls will return 0, until another error is recorded, at which point it's reported to each of them once.h]h...and then gets back to work. The supervisors eventually poll again and they each get the error when they next check. Subsequent calls will return 0, until another error is recorded, at which point it’s reported to each of them once.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihj hhubh)}(hNote that the supervisors can't tell how many mistakes he made, only whether one was made since they last checked, and the latest value recorded.h]hNote that the supervisors can’t tell how many mistakes he made, only whether one was made since they last checked, and the latest value recorded.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhj hhubh)}(hOccasionally the big boss comes in for a spot check and asks the worker to do a one-off job for him. He's not really watching the worker full-time like the supervisors, but he does need to know whether a mistake occurred while his job was processing.h]hOccasionally the big boss comes in for a spot check and asks the worker to do a one-off job for him. He’s not really watching the worker full-time like the supervisors, but he does need to know whether a mistake occurred while his job was processing.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhj hhubh)}(hvHe can just sample the current errseq_t in the worker, and then use that to tell whether an error has occurred later::h]huHe can just sample the current errseq_t in the worker, and then use that to tell whether an error has occurred later:}(huHe can just sample the current errseq_t in the worker, and then use that to tell whether an error has occurred later:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhj hhubjV)}(herrseq_t since = errseq_sample(&wd.wd_err); /* submit some work and wait for it to complete */ err = errseq_check(&wd.wd_err, since);h]herrseq_t since = errseq_sample(&wd.wd_err); /* submit some work and wait for it to complete */ err = errseq_check(&wd.wd_err, since);}(hhhj"ubah}(h]h ]h"]h$]h&]jejfuh1jUhhhKzhj hhubh)}(hSince he's just going to discard "since" after that point, he doesn't need to advance it here. He also doesn't need any locking since it's not usable by anyone else.h]hSince he’s just going to discard “since” after that point, he doesn’t need to advance it here. He also doesn’t need any locking since it’s not usable by anyone else.}(hj2hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hj hhubeh}(h] api-usageah ]h"] api usageah$]h&]uh1hhhhhhhhK/ubh)}(hhh](h)}(h#Serializing errseq_t cursor updatesh]h#Serializing errseq_t cursor updates}(hjKhjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhhhhhKubh)}(hX1Note that the errseq_t API does not protect the errseq_t cursor during a check_and_advance_operation. Only the canonical error code is handled atomically. In a situation where more than one task might be using the same errseq_t cursor at the same time, it's important to serialize updates to that cursor.h]hX3Note that the errseq_t API does not protect the errseq_t cursor during a check_and_advance_operation. Only the canonical error code is handled atomically. In a situation where more than one task might be using the same errseq_t cursor at the same time, it’s important to serialize updates to that cursor.}(hjYhjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubh)}(hIf that's not done, then it's possible for the cursor to go backward in which case the same error could be reported more than once.h]hIf that’s not done, then it’s possible for the cursor to go backward in which case the same error could be reported more than once.}(hjghjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubh)}(hBecause of this, it's often advantageous to first do an errseq_check to see if anything has changed, and only later do an errseq_check_and_advance after taking the lock. e.g.::h]hBecause of this, it’s often advantageous to first do an errseq_check to see if anything has changed, and only later do an errseq_check_and_advance after taking the lock. e.g.:}(hBecause of this, it's often advantageous to first do an errseq_check to see if anything has changed, and only later do an errseq_check_and_advance after taking the lock. e.g.:hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubjV)}(hXif (errseq_check(&wd.wd_err, READ_ONCE(su.s_wd_err)) { /* su.s_wd_err is protected by s_wd_err_lock */ spin_lock(&su.s_wd_err_lock); err = errseq_check_and_advance(&wd.wd_err, &su.s_wd_err); spin_unlock(&su.s_wd_err_lock); }h]hXif (errseq_check(&wd.wd_err, READ_ONCE(su.s_wd_err)) { /* su.s_wd_err is protected by s_wd_err_lock */ spin_lock(&su.s_wd_err_lock); err = errseq_check_and_advance(&wd.wd_err, &su.s_wd_err); spin_unlock(&su.s_wd_err_lock); }}(hhhjubah}(h]h ]h"]h$]h&]jejfuh1jUhhhKhjFhhubh)}(hiThat avoids the spinlock in the common case where nothing has changed since the last time it was checked.h]hiThat avoids the spinlock in the common case where nothing has changed since the last time it was checked.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubeh}(h]#serializing-errseq-t-cursor-updatesah ]h"]#serializing errseq_t cursor updatesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Functionsh]h Functions}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleerrseq_set (C function) c.errseq_sethNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(h-errseq_t errseq_set (errseq_t *eseq, int err)h]hdesc_signature_line)}(h,errseq_t errseq_set(errseq_t *eseq, int err)h](h)}(hhh]h desc_sig_name)}(herrseq_th]herrseq_t}(hhhjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}j errseq_setsb c.errseq_setasbuh1hhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK/ubhdesc_sig_space)}(h h]h }(hhhj hhhNhNubah}(h]h ]wah"]h$]h&]uh1j hjhhhj hK/ubh desc_name)}(h errseq_seth]j)}(hjh]h errseq_set}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jejfuh1jhjhhhj hK/ubhdesc_parameterlist)}(h(errseq_t *eseq, int err)h](hdesc_parameter)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjGmodnameN classnameNjj)}j]j c.errseq_setasbuh1hhj>ubj )}(h h]h }(hhhjchhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj>ubhdesc_sig_punctuation)}(h*h]h*}(hhhjshhhNhNubah}(h]h ]pah"]h$]h&]uh1jqhj>ubj)}(heseqh]heseq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hj8ubj=)}(hint errh](hdesc_sig_keyword_type)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjubj )}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(herrh]herr}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hj8ubeh}(h]h ]h"]h$]h&]jejfuh1j6hjhhhj hK/ubeh}(h]h ]h"]h$]h&]jejf add_permalinkuh1jsphinx_line_type declaratorhjhhhj hK/ubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multilineuh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK;hjhhubh desc_content)}(hhh]h)}(h"set a errseq_t for later reportingh]h"set a errseq_t for later reporting}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK.hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hK/ubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindexuh1jhhhjhNhNubh container)}(hX**Parameters** ``errseq_t *eseq`` errseq_t field that should be set ``int err`` error to set (must be between -1 and -MAX_ERRNO) **Description** This function sets the error in **eseq**, and increments the sequence counter if the last sequence was sampled at some point in the past. Any error set will always overwrite an existing error. **Return** The previous value, primarily for debugging purposes. The return value should not be used as a previously sampled value in later calls as it will not have the SEEN flag set.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK2hjubhdefinition_list)}(hhh](hdefinition_list_item)}(h5``errseq_t *eseq`` errseq_t field that should be set h](hterm)}(h``errseq_t *eseq``h]hliteral)}(hj<h]herrseq_t *eseq}(hhhj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hj:ubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK/hj4ubh definition)}(hhh]h)}(h!errseq_t field that should be seth]h!errseq_t field that should be set}(hj[hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShK/hjVubah}(h]h ]h"]h$]h&]uh1jThj4ubeh}(h]h ]h"]h$]h&]uh1j2hjShK/hj/ubj3)}(h=``int err`` error to set (must be between -1 and -MAX_ERRNO) h](j9)}(h ``int err``h]j?)}(hjyh]hint err}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hjwubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK0hjsubjU)}(hhh]h)}(h0error to set (must be between -1 and -MAX_ERRNO)h]h0error to set (must be between -1 and -MAX_ERRNO)}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK0hjubah}(h]h ]h"]h$]h&]uh1jThjsubeh}(h]h ]h"]h$]h&]uh1j2hjhK0hj/ubeh}(h]h ]h"]h$]h&]uh1j-hjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK2hjubh)}(hThis function sets the error in **eseq**, and increments the sequence counter if the last sequence was sampled at some point in the past.h](h This function sets the error in }(h This function sets the error in hjhhhNhNubj)}(h**eseq**h]heseq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubha, and increments the sequence counter if the last sequence was sampled at some point in the past.}(ha, and increments the sequence counter if the last sequence was sampled at some point in the past.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK2hjubh)}(h6Any error set will always overwrite an existing error.h]h6Any error set will always overwrite an existing error.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK5hjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK7hjubh)}(hThe previous value, primarily for debugging purposes. The return value should not be used as a previously sampled value in later calls as it will not have the SEEN flag set.h]hThe previous value, primarily for debugging purposes. The return value should not be used as a previously sampled value in later calls as it will not have the SEEN flag set.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK7hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jerrseq_sample (C function)c.errseq_samplehNtauh1jhjhhhNhNubj)}(hhh](j)}(h'errseq_t errseq_sample (errseq_t *eseq)h]j)}(h&errseq_t errseq_sample(errseq_t *eseq)h](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjHmodnameN classnameNjj)}j]j)}j errseq_samplesbc.errseq_sampleasbuh1hhj?hhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKqubj )}(h h]h }(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj?hhhjghKqubj)}(h errseq_sampleh]j)}(hjdh]h errseq_sample}(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](j1j2eh"]h$]h&]jejfuh1jhj?hhhjghKqubj7)}(h(errseq_t *eseq)h]j=)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jbc.errseq_sampleasbuh1hhjubj )}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubjr)}(hjuh]h*}(hhhjhhhNhNubah}(h]h ]j~ah"]h$]h&]uh1jqhjubj)}(heseqh]heseq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hjubah}(h]h ]h"]h$]h&]jejfuh1j6hj?hhhjghKqubeh}(h]h ]h"]h$]h&]jejfjuh1jjjhj;hhhjghKqubah}(h]j6ah ](jjeh"]h$]h&]juh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK{hj8hhubj)}(hhh]h)}(hGrab current errseq_t value.h]hGrab current errseq_t value.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKphjhhubah}(h]h ]h"]h$]h&]uh1jhj8hhhjghKqubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj uh1jhhhjhNhNubj)}(hX**Parameters** ``errseq_t *eseq`` Pointer to errseq_t to be sampled. **Description** 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.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKthjubj.)}(hhh]j3)}(h6``errseq_t *eseq`` Pointer to errseq_t to be sampled. h](j9)}(h``errseq_t *eseq``h]j?)}(hj=h]herrseq_t *eseq}(hhhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hj;ubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKqhj7ubjU)}(hhh]h)}(h"Pointer to errseq_t to be sampled.h]h"Pointer to errseq_t to be sampled.}(hjXhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhKqhjSubah}(h]h ]h"]h$]h&]uh1jThj7ubeh}(h]h ]h"]h$]h&]uh1j2hjRhKqhj4ubah}(h]h ]h"]h$]h&]uh1j-hjubh)}(h**Description**h]j)}(hjxh]h Description}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKshjubh)}(hThis 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.h](hThis 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 }(hThis 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 hjhhhNhNubj)}(h**eseq**h]heseq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhO, the caller of this function will see it the next time it checks for an error.}(hO, the caller of this function will see it the next time it checks for an error.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKshjubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKxhjubh)}(h Any context.h]h Any context.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKxhjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKzhjubh)}(hThe current errseq value.h]hThe current errseq value.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKyhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jerrseq_check (C function)c.errseq_checkhNtauh1jhjhhhNhNubj)}(hhh](j)}(h1int errseq_check (errseq_t *eseq, errseq_t since)h]j)}(h0int errseq_check(errseq_t *eseq, errseq_t since)h](j)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKubj )}(h h]h }(hhhj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhj-hKubj)}(h errseq_checkh]j)}(h errseq_checkh]h errseq_check}(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](j1j2eh"]h$]h&]jejfuh1jhjhhhj-hKubj7)}(h (errseq_t *eseq, errseq_t since)h](j=)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjamodnameN classnameNjj)}j]j)}jjBsbc.errseq_checkasbuh1hhjXubj )}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjXubjr)}(hjuh]h*}(hhhjhhhNhNubah}(h]h ]j~ah"]h$]h&]uh1jqhjXubj)}(heseqh]heseq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hjTubj=)}(herrseq_t sinceh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j{c.errseq_checkasbuh1hhjubj )}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hsinceh]hsince}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hjTubeh}(h]h ]h"]h$]h&]jejfuh1j6hjhhhj-hKubeh}(h]h ]h"]h$]h&]jejfjuh1jjjhjhhhj-hKubah}(h]jah ](jjeh"]h$]h&]juh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjhhubj)}(hhh]h)}(h6Has an error occurred since a particular sample point?h]h6Has an error occurred since a particular sample point?}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj-hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj j% j j% j uh1jhhhjhNhNubj)}(hX**Parameters** ``errseq_t *eseq`` Pointer to errseq_t value to be checked. ``errseq_t since`` Previously-sampled errseq_t from which to check. **Description** Grab the value that eseq points to, and see if it has changed **since** the given value was sampled. The **since** value is not advanced, so there is no need to mark the value as seen. **Return** The latest error set in the errseq_t or 0 if it hasn't changed.h](h)}(h**Parameters**h]j)}(hj/ h]h Parameters}(hhhj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj- ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj) ubj.)}(hhh](j3)}(h<``errseq_t *eseq`` Pointer to errseq_t value to be checked. h](j9)}(h``errseq_t *eseq``h]j?)}(hjN h]herrseq_t *eseq}(hhhjP hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hjL ubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjH ubjU)}(hhh]h)}(h(Pointer to errseq_t value to be checked.h]h(Pointer to errseq_t value to be checked.}(hji hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc hKhjd ubah}(h]h ]h"]h$]h&]uh1jThjH ubeh}(h]h ]h"]h$]h&]uh1j2hjc hKhjE ubj3)}(hD``errseq_t since`` Previously-sampled errseq_t from which to check. h](j9)}(h``errseq_t since``h]j?)}(hj h]herrseq_t since}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hj ubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj ubjU)}(hhh]h)}(h0Previously-sampled errseq_t from which to check.h]h0Previously-sampled errseq_t from which to check.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j2hj hKhjE ubeh}(h]h ]h"]h$]h&]uh1j-hj) ubh)}(h**Description**h]j)}(hj h]h Description}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj) ubh)}(hGrab the value that eseq points to, and see if it has changed **since** the given value was sampled. The **since** value is not advanced, so there is no need to mark the value as seen.h](h>Grab the value that eseq points to, and see if it has changed }(h>Grab the value that eseq points to, and see if it has changed hj hhhNhNubj)}(h **since**h]hsince}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh" the given value was sampled. The }(h" the given value was sampled. The hj hhhNhNubj)}(h **since**h]hsince}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhF value is not advanced, so there is no need to mark the value as seen.}(hF value is not advanced, so there is no need to mark the value as seen.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj) ubh)}(h **Return**h]j)}(hj h]hReturn}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj) ubh)}(h?The latest error set in the errseq_t or 0 if it hasn't changed.h]hAThe latest error set in the errseq_t or 0 if it hasn’t changed.}(hj( hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj) ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%errseq_check_and_advance (C function)c.errseq_check_and_advancehNtauh1jhjhhhNhNubj)}(hhh](j)}(h>int errseq_check_and_advance (errseq_t *eseq, errseq_t *since)h]j)}(h=int errseq_check_and_advance(errseq_t *eseq, errseq_t *since)h](j)}(hinth]hint}(hhhjU hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ hhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKubj )}(h h]h }(hhhjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjQ hhhjc hKubj)}(herrseq_check_and_advanceh]j)}(herrseq_check_and_advanceh]herrseq_check_and_advance}(hhhjv hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr ubah}(h]h ](j1j2eh"]h$]h&]jejfuh1jhjQ hhhjc hKubj7)}(h!(errseq_t *eseq, errseq_t *since)h](j=)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjx sbc.errseq_check_and_advanceasbuh1hhj ubj )}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubjr)}(hjuh]h*}(hhhj hhhNhNubah}(h]h ]j~ah"]h$]h&]uh1jqhj ubj)}(heseqh]heseq}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hj ubj=)}(herrseq_t *sinceh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.errseq_check_and_advanceasbuh1hhj ubj )}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubjr)}(hjuh]h*}(hhhj hhhNhNubah}(h]h ]j~ah"]h$]h&]uh1jqhj ubj)}(hsinceh]hsince}(hhhj% hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjejfuh1j<hj ubeh}(h]h ]h"]h$]h&]jejfuh1j6hjQ hhhjc hKubeh}(h]h ]h"]h$]h&]jejfjuh1jjjhjM hhhjc hKubah}(h]jH ah ](jjeh"]h$]h&]juh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjJ hhubj)}(hhh]h)}(h/Check an errseq_t and advance to current value.h]h/Check an errseq_t and advance to current value.}(hjR hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjM hhubah}(h]h ]h"]h$]h&]uh1jhjJ hhhjc hKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jh j jh j uh1jhhhjhNhNubj)}(hXH**Parameters** ``errseq_t *eseq`` Pointer to value being checked and reported. ``errseq_t *since`` Pointer to previously-sampled errseq_t to check against and advance. **Description** Grab the eseq value, and see whether it matches the value that **since** points to. If it does, then just return 0. If it doesn't, then the value has changed. Set the "seen" flag, and try to swap it into place as the new eseq value. Then, set that value as the new "since" value, and return whatever the error portion is set to. Note that no locking is provided here for concurrent updates to the "since" value. The caller must provide that if necessary. Because of this, callers may want to do a lockless errseq_check before taking the lock and calling this. **Return** Negative errno if one has been stored, or 0 if no new error has occurred.h](h)}(h**Parameters**h]j)}(hjr h]h Parameters}(hhhjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubj.)}(hhh](j3)}(h@``errseq_t *eseq`` Pointer to value being checked and reported. h](j9)}(h``errseq_t *eseq``h]j?)}(hj h]herrseq_t *eseq}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hj ubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj ubjU)}(hhh]h)}(h,Pointer to value being checked and reported.h]h,Pointer to value being checked and reported.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j2hj hKhj ubj3)}(hY``errseq_t *since`` Pointer to previously-sampled errseq_t to check against and advance. h](j9)}(h``errseq_t *since``h]j?)}(hj h]herrseq_t *since}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1j>hj ubah}(h]h ]h"]h$]h&]uh1j8hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj ubjU)}(hhh]h)}(hDPointer to previously-sampled errseq_t to check against and advance.h]hDPointer to previously-sampled errseq_t to check against and advance.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]uh1j2hj hKhj ubeh}(h]h ]h"]h$]h&]uh1j-hjl ubh)}(h**Description**h]j)}(hj h]h Description}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubh)}(hsGrab the eseq value, and see whether it matches the value that **since** points to. If it does, then just return 0.h](h?Grab the eseq value, and see whether it matches the value that }(h?Grab the eseq value, and see whether it matches the value that hj hhhNhNubj)}(h **since**h]hsince}(hhhj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh+ points to. If it does, then just return 0.}(h+ points to. If it does, then just return 0.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubh)}(hIf it doesn't, then the value has changed. Set the "seen" flag, and try to swap it into place as the new eseq value. Then, set that value as the new "since" value, and return whatever the error portion is set to.h]hIf it doesn’t, then the value has changed. Set the “seen” flag, and try to swap it into place as the new eseq value. Then, set that value as the new “since” value, and return whatever the error portion is set to.}(hj@ hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubh)}(hNote that no locking is provided here for concurrent updates to the "since" value. The caller must provide that if necessary. Because of this, callers may want to do a lockless errseq_check before taking the lock and calling this.h]hNote that no locking is provided here for concurrent updates to the “since” value. The caller must provide that if necessary. Because of this, callers may want to do a lockless errseq_check before taking the lock and calling this.}(hjO hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubh)}(h **Return**h]j)}(hj^ h]hReturn}(hhhj` hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubh)}(hINegative errno if one has been stored, or 0 if no new error has occurred.h]hINegative errno if one has been stored, or 0 if no new error has occurred.}(hjv hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjl ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubeh}(h] functionsah ]h"] functionsah$]h&]uh1hhhhhhhhKubeh}(h]the-errseq-t-datatypeah ]h"]the errseq_t datatypeah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjAfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingUTF-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confapep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacefile_insertion_enabled raw_enabledKline_length_limitM'syntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_link embed_imagesenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j j jCj@jjj j u nametypes}(j NjCNjNj Nuh}(j hj@j jjFj jjjj6j;jjjH jM u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.