sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget#/translations/zh_CN/core-api/errseqmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/core-api/errseqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(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}(hhhhhNhNubah}(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.}(hhhhhNhNubah}(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.}(hhhhhNhNubah}(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.}(hhhhhNhNubah}(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.}(hhhhhNhNubah}(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.}(hhhhhNhNubah}(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:}(hhhhhNhNubah}(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}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjCubah}(h]h ]h"]h$]h&]uh1jAhj>ubjB)}(hhh]h)}(h12h]h12}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubah}(h]h ]h"]h$]h&]uh1jAhj>ubjB)}(hhh]h)}(h11..0h]h11..0}(hjthhhNhNubah}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jAhjubjB)}(hhh]h)}(hSFh]hSF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jAhjubjB)}(hhh]h)}(herrnoh]herrno}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hhhhubh)}(hhh](h)}(h API usageh]h API usage}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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*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.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hj hhubh)}(h(Here's our worker_drone representation::h]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 */ };}hjVsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jThhhKAhj 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:}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhj hhubjU)}(h1struct worker_drone wd; wd.wd_err = (errseq_t)0;h]h1struct worker_drone wd; wd.wd_err = (errseq_t)0;}hjtsbah}(h]h ]h"]h$]h&]jdjeuh1jThhhKGhj 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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhj hhubjU)}(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);}hjsbah}(h]h ]h"]h$]h&]jdjeuh1jThhhKNhj 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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhj hhubjU)}(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);}hjsbah}(h]h ]h"]h$]h&]jdjeuh1jThhhK\hj hhubh)}(h.Up to this point, that just keeps returning 0.h]h.Up to this point, that just keeps returning 0.}(hjhhhNhNubah}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhj hhubjU)}(herrseq_set(&wd.wd_err, -EIO);h]herrseq_set(&wd.wd_err, -EIO);}hjsbah}(h]h ]h"]h$]h&]jdjeuh1jThhhKghj 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.}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhj hhubjU)}(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);}hjsbah}(h]h ]h"]h$]h&]jdjeuh1jThhhKzhj 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.}(hj*hhhNhNubah}(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}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hhhhhKubh)}(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.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj@hhubh)}(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.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj@hhubh)}(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.:}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj@hhubjU)}(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); }}hj{sbah}(h]h ]h"]h$]h&]jdjeuh1jThhhKhj@hhubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj@hhubeh}(h]#serializing-errseq-t-cursor-updatesah ]h"]#serializing errseq_t cursor updatesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Functionsh]h Functions}(hjhhhNhNubah}(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}(hjhhhNhNubah}(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 }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhK;ubh desc_name)}(h errseq_seth]j)}(hjh]h errseq_set}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jdjeuh1jhjhhhjhK;ubhdesc_parameterlist)}(h(errseq_t *eseq, int err)h](hdesc_parameter)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@modnameN classnameNjj)}j]j c.errseq_setasbuh1hhj7ubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubhdesc_sig_punctuation)}(h*h]h*}(hjlhhhNhNubah}(h]h ]pah"]h$]h&]uh1jjhj7ubj)}(heseqh]heseq}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hj1ubj6)}(hint errh](hdesc_sig_keyword_type)}(hinth]hint}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(herrh]herr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hj1ubeh}(h]h ]h"]h$]h&]jdjeuh1j/hjhhhjhK;ubeh}(h]h ]h"]h$]h&]jdje add_permalinkuh1jsphinx_line_type declaratorhjhhhjhK;ubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhK;hjhhubh desc_content)}(hhh]h)}(h"set a errseq_t for later reportingh]h"set a errseq_t for later reporting}(hjhhhNhNubah}(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&]uh1jhjhhhjhK;ubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhNhNubh 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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK2hj ubhdefinition_list)}(hhh](hdefinition_list_item)}(h5``errseq_t *eseq`` errseq_t field that should be set h](hterm)}(h``errseq_t *eseq``h]hliteral)}(hj8h]herrseq_t *eseq}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK/hj0ubh definition)}(hhh]h)}(h!errseq_t field that should be seth]h!errseq_t field that should be set}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhK/hjRubah}(h]h ]h"]h$]h&]uh1jPhj0ubeh}(h]h ]h"]h$]h&]uh1j.hjOhK/hj+ubj/)}(h=``int err`` error to set (must be between -1 and -MAX_ERRNO) h](j5)}(h ``int err``h]j;)}(hjuh]hint err}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjsubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK0hjoubjQ)}(hhh]h)}(h0error to set (must be between -1 and -MAX_ERRNO)h]h0error to set (must be between -1 and -MAX_ERRNO)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK0hjubah}(h]h ]h"]h$]h&]uh1jPhjoubeh}(h]h ]h"]h$]h&]uh1j.hjhK0hj+ubeh}(h]h ]h"]h$]h&]uh1j)hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK2hj ubh)}(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 }(hjhhhNhNubj)}(h**eseq**h]heseq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubha, 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.chK2hj ubh)}(h6Any error set will always overwrite an existing error.h]h6Any error set will always overwrite an existing error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK5hj ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK7hj ubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK7hj ubeh}(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}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjBmodnameN classnameNjj)}j]j)}j errseq_samplesbc.errseq_sampleasbuh1hhj9hhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chK{ubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhjahK{ubj)}(h errseq_sampleh]j)}(hj^h]h errseq_sample}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](j*j+eh"]h$]h&]jdjeuh1jhj9hhhjahK{ubj0)}(h(errseq_t *eseq)h]j6)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j\c.errseq_sampleasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjk)}(hjnh]h*}(hjhhhNhNubah}(h]h ]jwah"]h$]h&]uh1jjhjubj)}(heseqh]heseq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hjubah}(h]h ]h"]h$]h&]jdjeuh1j/hj9hhhjahK{ubeh}(h]h ]h"]h$]h&]jdjejuh1jjjhj5hhhjahK{ubah}(h]j0ah ](jjeh"]h$]h&]jj)jhuh1jhjahK{hj2hhubj)}(hhh]h)}(hGrab current errseq_t value.h]hGrab current errseq_t value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKphjhhubah}(h]h ]h"]h$]h&]uh1jhj2hhhjahK{ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj )}(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}(hjhhhNhNubah}(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]j/)}(h6``errseq_t *eseq`` Pointer to errseq_t to be sampled. h](j5)}(h``errseq_t *eseq``h]j;)}(hj6h]herrseq_t *eseq}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj4ubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKqhj0ubjQ)}(hhh]h)}(h"Pointer to errseq_t to be sampled.h]h"Pointer to errseq_t to be sampled.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhKqhjLubah}(h]h ]h"]h$]h&]uh1jPhj0ubeh}(h]h ]h"]h$]h&]uh1j.hjKhKqhj-ubah}(h]h ]h"]h$]h&]uh1j)hjubh)}(h**Description**h]j)}(hjqh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(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 }(hjhhhNhNubj)}(h**eseq**h]heseq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhO, 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}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj$hKubj)}(h errseq_checkh]j)}(h errseq_checkh]h errseq_check}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ](j*j+eh"]h$]h&]jdjeuh1jhjhhhj$hKubj0)}(h (errseq_t *eseq, errseq_t since)h](j6)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjXmodnameN classnameNjj)}j]j)}jj9sbc.errseq_checkasbuh1hhjOubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubjk)}(hjnh]h*}(hjhhhNhNubah}(h]h ]jwah"]h$]h&]uh1jjhjOubj)}(heseqh]heseq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hjKubj6)}(herrseq_t sinceh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jrc.errseq_checkasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsinceh]hsince}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hjKubeh}(h]h ]h"]h$]h&]jdjeuh1j/hjhhhj$hKubeh}(h]h ]h"]h$]h&]jdjejuh1jjjhjhhhj$hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj$hKhj hhubj)}(hhh]h)}(h6Has an error occurred since a particular sample point?h]h6Has an error occurred since a particular sample point?}(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&]uh1jhj hhhj$hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj )}(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}(hj' 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](j/)}(h<``errseq_t *eseq`` Pointer to errseq_t value to be checked. h](j5)}(h``errseq_t *eseq``h]j;)}(hjD h]herrseq_t *eseq}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjB ubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj> ubjQ)}(hhh]h)}(h(Pointer to errseq_t value to be checked.h]h(Pointer to errseq_t value to be checked.}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjY hKhjZ ubah}(h]h ]h"]h$]h&]uh1jPhj> ubeh}(h]h ]h"]h$]h&]uh1j.hjY hKhj; ubj/)}(hD``errseq_t since`` Previously-sampled errseq_t from which to check. h](j5)}(h``errseq_t since``h]j;)}(hj} h]herrseq_t since}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj{ ubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhjw ubjQ)}(hhh]h)}(h0Previously-sampled errseq_t from which to check.h]h0Previously-sampled errseq_t from which to check.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jPhjw ubeh}(h]h ]h"]h$]h&]uh1j.hj hKhj; ubeh}(h]h ]h"]h$]h&]uh1j)hj ubh)}(h**Description**h]j)}(hj h]h Description}(hj 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 }(hj hhhNhNubj)}(h **since**h]hsince}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh" the given value was sampled. The }(hj hhhNhNubj)}(h **since**h]hsince}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhF 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}(hj 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 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}(hjH hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD hhhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKubj)}(h h]h }(hjW hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD hhhjV hKubj)}(herrseq_check_and_advanceh]j)}(herrseq_check_and_advanceh]herrseq_check_and_advance}(hji hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje ubah}(h]h ](j*j+eh"]h$]h&]jdjeuh1jhjD hhhjV hKubj0)}(h!(errseq_t *eseq, errseq_t *since)h](j6)}(herrseq_t *eseqh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjk sbc.errseq_check_and_advanceasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjk)}(hjnh]h*}(hj hhhNhNubah}(h]h ]jwah"]h$]h&]uh1jjhj ubj)}(heseqh]heseq}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hj} ubj6)}(herrseq_t *sinceh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hj 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 }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjk)}(hjnh]h*}(hj hhhNhNubah}(h]h ]jwah"]h$]h&]uh1jjhj ubj)}(hsinceh]hsince}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjdjeuh1j5hj} ubeh}(h]h ]h"]h$]h&]jdjeuh1j/hjD hhhjV hKubeh}(h]h ]h"]h$]h&]jdjejuh1jjjhj@ hhhjV hKubah}(h]j; ah ](jjeh"]h$]h&]jj)jhuh1jhjV hKhj= hhubj)}(hhh]h)}(h/Check an errseq_t and advance to current value.h]h/Check an errseq_t and advance to current value.}(hjB 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&]uh1jhj= hhhjV hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjZ jjZ jjjuh1jhhhjhNhNubj )}(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)}(hjd h]h Parameters}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj^ ubj*)}(hhh](j/)}(h@``errseq_t *eseq`` Pointer to value being checked and reported. h](j5)}(h``errseq_t *eseq``h]j;)}(hj h]herrseq_t *eseq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj} ubjQ)}(hhh]h)}(h,Pointer to value being checked and reported.h]h,Pointer to value being checked and reported.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jPhj} ubeh}(h]h ]h"]h$]h&]uh1j.hj hKhjz ubj/)}(hY``errseq_t *since`` Pointer to previously-sampled errseq_t to check against and advance. h](j5)}(h``errseq_t *since``h]j;)}(hj h]herrseq_t *since}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]uh1j4hM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj ubjQ)}(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 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jPhj ubeh}(h]h ]h"]h$]h&]uh1j.hj hKhjz ubeh}(h]h ]h"]h$]h&]uh1j)hj^ ubh)}(h**Description**h]j)}(hj h]h Description}(hj 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)}(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 }(hj hhhNhNubj)}(h **since**h]hsince}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh+ 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.chKhj^ 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. hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj^ 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.}(hj= hhhNhNubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj^ ubh)}(h **Return**h]j)}(hjN h]hReturn}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL ubah}(h]h ]h"]h$]h&]uh1hhM/var/lib/git/docbuild/linux/Documentation/core-api/errseq:159: ./lib/errseq.chKhj^ 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.}(hjd 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 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.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_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_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j j j=j:jjj j| u nametypes}(j j=jj uh}(j hj:j jj@j| jjjj0j5j jj; j@ 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.