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/filesystems/journallingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/filesystems/journallingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/filesystems/journallingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/filesystems/journallingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/filesystems/journallingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/filesystems/journallingmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hThe Linux Journalling APIh]hThe Linux Journalling API}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhE/var/lib/git/docbuild/linux/Documentation/filesystems/journalling.rsthKubh)}(hhh](h)}(hOverviewh]hOverview}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hDetailsh]hDetails}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXBThe journalling layer is easy to use. You need to first of all create a journal_t data structure. There are two calls to do this dependent on how you decide to allocate the physical media on which the journal resides. The jbd2_journal_init_inode() call is for journals stored in filesystem inodes, or the jbd2_journal_init_dev() call can be used for journal stored on a raw device (in a continuous range of blocks). A journal_t is a typedef for a struct pointer, so when you are finally finished make sure you call jbd2_journal_destroy() on it to free up any used kernel memory.h]hXBThe journalling layer is easy to use. You need to first of all create a journal_t data structure. There are two calls to do this dependent on how you decide to allocate the physical media on which the journal resides. The jbd2_journal_init_inode() call is for journals stored in filesystem inodes, or the jbd2_journal_init_dev() call can be used for journal stored on a raw device (in a continuous range of blocks). A journal_t is a typedef for a struct pointer, so when you are finally finished make sure you call jbd2_journal_destroy() on it to free up any used kernel memory.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hX Once you have got your journal_t object you need to 'mount' or load the journal file. The journalling layer expects the space for the journal was already allocated and initialized properly by the userspace tools. When loading the journal you must call jbd2_journal_load() to process journal contents. If the client file system detects the journal contents does not need to be processed (or even need not have valid contents), it may call jbd2_journal_wipe() to clear the journal contents before calling jbd2_journal_load().h]hXOnce you have got your journal_t object you need to ‘mount’ or load the journal file. The journalling layer expects the space for the journal was already allocated and initialized properly by the userspace tools. When loading the journal you must call jbd2_journal_load() to process journal contents. If the client file system detects the journal contents does not need to be processed (or even need not have valid contents), it may call jbd2_journal_wipe() to clear the journal contents before calling jbd2_journal_load().}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX1Note that jbd2_journal_wipe(..,0) calls jbd2_journal_skip_recovery() for you if it detects any outstanding transactions in the journal and similarly jbd2_journal_load() will call jbd2_journal_recover() if necessary. I would advise reading ext4_load_journal() in fs/ext4/super.c for examples on this stage.h]hX1Note that jbd2_journal_wipe(..,0) calls jbd2_journal_skip_recovery() for you if it detects any outstanding transactions in the journal and similarly jbd2_journal_load() will call jbd2_journal_recover() if necessary. I would advise reading ext4_load_journal() in fs/ext4/super.c for examples on this stage.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hKNow you can go ahead and start modifying the underlying filesystem. Almost.h]hKNow you can go ahead and start modifying the underlying filesystem. Almost.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hhhhubh)}(hX`You still need to actually journal your filesystem changes, this is done by wrapping them into transactions. Additionally you also need to wrap the modification of each of the buffers with calls to the journal layer, so it knows what the modifications you are actually making are. To do this use jbd2_journal_start() which returns a transaction handle.h]hX`You still need to actually journal your filesystem changes, this is done by wrapping them into transactions. Additionally you also need to wrap the modification of each of the buffers with calls to the journal layer, so it knows what the modifications you are actually making are. To do this use jbd2_journal_start() which returns a transaction handle.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hhhhubh)}(hXjbd2_journal_start() and its counterpart jbd2_journal_stop(), which indicates the end of a transaction are nestable calls, so you can reenter a transaction if necessary, but remember you must call jbd2_journal_stop() the same number of times as jbd2_journal_start() before the transaction is completed (or more accurately leaves the update phase). Ext4/VFS makes use of this feature to simplify handling of inode dirtying, quota support, etc.h]hXjbd2_journal_start() and its counterpart jbd2_journal_stop(), which indicates the end of a transaction are nestable calls, so you can reenter a transaction if necessary, but remember you must call jbd2_journal_stop() the same number of times as jbd2_journal_start() before the transaction is completed (or more accurately leaves the update phase). Ext4/VFS makes use of this feature to simplify handling of inode dirtying, quota support, etc.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hhhhubh)}(hXInside each transaction you need to wrap the modifications to the individual buffers (blocks). Before you start to modify a buffer you need to call jbd2_journal_get_create_access() / jbd2_journal_get_write_access() / jbd2_journal_get_undo_access() as appropriate, this allows the journalling layer to copy the unmodified data if it needs to. After all the buffer may be part of a previously uncommitted transaction. At this point you are at last ready to modify a buffer, and once you are have done so you need to call jbd2_journal_dirty_metadata(). Or if you've asked for access to a buffer you now know is now longer required to be pushed back on the device you can call jbd2_journal_forget() in much the same way as you might have used bforget() in the past.h]hXInside each transaction you need to wrap the modifications to the individual buffers (blocks). Before you start to modify a buffer you need to call jbd2_journal_get_create_access() / jbd2_journal_get_write_access() / jbd2_journal_get_undo_access() as appropriate, this allows the journalling layer to copy the unmodified data if it needs to. After all the buffer may be part of a previously uncommitted transaction. At this point you are at last ready to modify a buffer, and once you are have done so you need to call jbd2_journal_dirty_metadata(). Or if you’ve asked for access to a buffer you now know is now longer required to be pushed back on the device you can call jbd2_journal_forget() in much the same way as you might have used bforget() in the past.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hhhhubh)}(h`A jbd2_journal_flush() may be called at any time to commit and checkpoint all your transactions.h]h`A jbd2_journal_flush() may be called at any time to commit and checkpoint all your transactions.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhhhhubh)}(h{Then at umount time , in your put_super() you can then call jbd2_journal_destroy() to clean up your in-core journal object.h]h{Then at umount time , in your put_super() you can then call jbd2_journal_destroy() to clean up your in-core journal object.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhhhhubh)}(hXHUnfortunately there a couple of ways the journal layer can cause a deadlock. The first thing to note is that each task can only have a single outstanding transaction at any one time, remember nothing commits until the outermost jbd2_journal_stop(). This means you must complete the transaction at the end of each file/inode/address etc. operation you perform, so that the journalling system isn't re-entered on another journal. Since transactions can't be nested/batched across differing journals, and another filesystem other than yours (say ext4) may be modified in a later syscall.h]hXLUnfortunately there a couple of ways the journal layer can cause a deadlock. The first thing to note is that each task can only have a single outstanding transaction at any one time, remember nothing commits until the outermost jbd2_journal_stop(). This means you must complete the transaction at the end of each file/inode/address etc. operation you perform, so that the journalling system isn’t re-entered on another journal. Since transactions can’t be nested/batched across differing journals, and another filesystem other than yours (say ext4) may be modified in a later syscall.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhhhhubh)}(hXThe second case to bear in mind is that jbd2_journal_start() can block if there isn't enough space in the journal for your transaction (based on the passed nblocks param) - when it blocks it merely(!) needs to wait for transactions to complete and be committed from other tasks, so essentially we are waiting for jbd2_journal_stop(). So to avoid deadlocks you must treat jbd2_journal_start() / jbd2_journal_stop() as if they were semaphores and include them in your semaphore ordering rules to prevent deadlocks. Note that jbd2_journal_extend() has similar blocking behaviour to jbd2_journal_start() so you can deadlock here just as easily as on jbd2_journal_start().h]hXThe second case to bear in mind is that jbd2_journal_start() can block if there isn’t enough space in the journal for your transaction (based on the passed nblocks param) - when it blocks it merely(!) needs to wait for transactions to complete and be committed from other tasks, so essentially we are waiting for jbd2_journal_stop(). So to avoid deadlocks you must treat jbd2_journal_start() / jbd2_journal_stop() as if they were semaphores and include them in your semaphore ordering rules to prevent deadlocks. Note that jbd2_journal_extend() has similar blocking behaviour to jbd2_journal_start() so you can deadlock here just as easily as on jbd2_journal_start().}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhhhhubh)}(hTry to reserve the right number of blocks the first time. ;-). This will be the maximum number of blocks you are going to touch in this transaction. I advise having a look at at least ext4_jbd.h to see the basis on which ext4 uses to make these decisions.h]hTry to reserve the right number of blocks the first time. ;-). This will be the maximum number of blocks you are going to touch in this transaction. I advise having a look at at least ext4_jbd.h to see the basis on which ext4 uses to make these decisions.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hhhhubh)}(hXQAnother wriggle to watch out for is your on-disk block allocation strategy. Why? Because, if you do a delete, you need to ensure you haven't reused any of the freed blocks until the transaction freeing these blocks commits. If you reused these blocks and crash happens, there is no way to restore the contents of the reallocated blocks at the end of the last fully committed transaction. One simple way of doing this is to mark blocks as free in internal in-memory block allocation structures only after the transaction freeing them commits. Ext4 uses journal commit callback for this purpose.h]hXSAnother wriggle to watch out for is your on-disk block allocation strategy. Why? Because, if you do a delete, you need to ensure you haven’t reused any of the freed blocks until the transaction freeing these blocks commits. If you reused these blocks and crash happens, there is no way to restore the contents of the reallocated blocks at the end of the last fully committed transaction. One simple way of doing this is to mark blocks as free in internal in-memory block allocation structures only after the transaction freeing them commits. Ext4 uses journal commit callback for this purpose.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchhhhubh)}(hXrWith journal commit callbacks you can ask the journalling layer to call a callback function when the transaction is finally committed to disk, so that you can do some of your own management. You ask the journalling layer for calling the callback by simply setting ``journal->j_commit_callback`` function pointer and that function is called after each transaction commit.h](hXWith journal commit callbacks you can ask the journalling layer to call a callback function when the transaction is finally committed to disk, so that you can do some of your own management. You ask the journalling layer for calling the callback by simply setting }(hjhhhNhNubhliteral)}(h``journal->j_commit_callback``h]hjournal->j_commit_callback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhL function pointer and that function is called after each transaction commit.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKmhhhhubh)}(hJBD2 also provides a way to block all transaction updates via jbd2_journal_lock_updates() / jbd2_journal_unlock_updates(). Ext4 uses this when it wants a window with a clean and stable fs for a moment. E.g.h]hJBD2 also provides a way to block all transaction updates via jbd2_journal_lock_updates() / jbd2_journal_unlock_updates(). Ext4 uses this when it wants a window with a clean and stable fs for a moment. E.g.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthhhhubh literal_block)}(hjbd2_journal_lock_updates() //stop new stuff happening.. jbd2_journal_flush() // checkpoint everything. ..do stuff on stable fs jbd2_journal_unlock_updates() // carry on with filesystem use.h]hjbd2_journal_lock_updates() //stop new stuff happening.. jbd2_journal_flush() // checkpoint everything. ..do stuff on stable fs jbd2_journal_unlock_updates() // carry on with filesystem use.}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK|hhhhubh)}(hThe opportunities for abuse and DOS attacks with this should be obvious, if you allow unprivileged userspace to trigger codepaths containing these calls.h]hThe opportunities for abuse and DOS attacks with this should be obvious, if you allow unprivileged userspace to trigger codepaths containing these calls.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]detailsah ]h"]detailsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Fast commitsh]h Fast commits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hJBD2 to also allows you to perform file-system specific delta commits known as fast commits. In order to use fast commits, you will need to set following callbacks that perform corresponding work:h]hJBD2 to also allows you to perform file-system specific delta commits known as fast commits. In order to use fast commits, you will need to set following callbacks that perform corresponding work:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h\`journal->j_fc_cleanup_cb`: Cleanup function called after every full commit and fast commit.h](htitle_reference)}(h`journal->j_fc_cleanup_cb`h]hjournal->j_fc_cleanup_cb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhB: Cleanup function called after every full commit and fast commit.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hS`journal->j_fc_replay_cb`: Replay function called for replay of fast commit blocks.h](j )}(h`journal->j_fc_replay_cb`h]hjournal->j_fc_replay_cb}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj&ubh:: Replay function called for replay of fast commit blocks.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXcFile system is free to perform fast commits as and when it wants as long as it gets permission from JBD2 to do so by calling the function :c:func:`jbd2_fc_begin_commit()`. Once a fast commit is done, the client file system should tell JBD2 about it by calling :c:func:`jbd2_fc_end_commit()`. If the file system wants JBD2 to perform a full commit immediately after stopping the fast commit it can do so by calling :c:func:`jbd2_fc_end_commit_fallback()`. This is useful if fast commit operation fails for some reason and the only way to guarantee consistency is for JBD2 to perform the full traditional commit.h](hFile system is free to perform fast commits as and when it wants as long as it gets permission from JBD2 to do so by calling the function }(hjBhhhNhNubh)}(h :c:func:`jbd2_fc_begin_commit()`h]j)}(hjLh]hjbd2_fc_begin_commit()}(hjNhhhNhNubah}(h]h ](xrefcc-funceh"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]refdocfilesystems/journalling refdomainjYreftypefunc refexplicitrefwarn reftargetjbd2_fc_begin_commituh1hhhhKhjBubh[. Once a fast commit is done, the client file system should tell JBD2 about it by calling }(hjBhhhNhNubh)}(h:c:func:`jbd2_fc_end_commit()`h]j)}(hjsh]hjbd2_fc_end_commit()}(hjuhhhNhNubah}(h]h ](jXjYc-funceh"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]refdocje refdomainjYreftypefunc refexplicitrefwarnjkjbd2_fc_end_commituh1hhhhKhjBubh|. If the file system wants JBD2 to perform a full commit immediately after stopping the fast commit it can do so by calling }(hjBhhhNhNubh)}(h':c:func:`jbd2_fc_end_commit_fallback()`h]j)}(hjh]hjbd2_fc_end_commit_fallback()}(hjhhhNhNubah}(h]h ](jXjYc-funceh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocje refdomainjYreftypefunc refexplicitrefwarnjkjbd2_fc_end_commit_fallbackuh1hhhhKhjBubh. This is useful if fast commit operation fails for some reason and the only way to guarantee consistency is for JBD2 to perform the full traditional commit.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hJBD2 helper functions to manage fast commit buffers. File system can use :c:func:`jbd2_fc_get_buf()` and :c:func:`jbd2_fc_wait_bufs()` to allocate and wait on IO completion of fast commit buffers.h](hIJBD2 helper functions to manage fast commit buffers. File system can use }(hjhhhNhNubh)}(h:c:func:`jbd2_fc_get_buf()`h]j)}(hjh]hjbd2_fc_get_buf()}(hjhhhNhNubah}(h]h ](jXjYc-funceh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocje refdomainjYreftypefunc refexplicitrefwarnjkjbd2_fc_get_bufuh1hhhhKhjubh and }(hjhhhNhNubh)}(h:c:func:`jbd2_fc_wait_bufs()`h]j)}(hjh]hjbd2_fc_wait_bufs()}(hjhhhNhNubah}(h]h ](jXjYc-funceh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocje refdomainjYreftypefunc refexplicitrefwarnjkjbd2_fc_wait_bufsuh1hhhhKhjubh> to allocate and wait on IO completion of fast commit buffers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hCurrently, only Ext4 implements fast commits. For details of its implementation of fast commits, please refer to the top level comments in fs/ext4/fast_commit.c.h]hCurrently, only Ext4 implements fast commits. For details of its implementation of fast commits, please refer to the top level comments in fs/ext4/fast_commit.c.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] fast-commitsah ]h"] fast commitsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSummaryh]hSummary}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hhhhhKubh)}(hUsing the journal is a matter of wrapping the different context changes, being each mount, each modification (transaction) and each changed buffer to tell the journalling layer about them.h]hUsing the journal is a matter of wrapping the different context changes, being each mount, each modification (transaction) and each changed buffer to tell the journalling layer about them.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj'hhubeh}(h]summaryah ]h"]summaryah$]h&]uh1hhhhhhhhKubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Data Typesh]h Data Types}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhhhhhKubh)}(hThe journalling layer uses typedefs to 'hide' the concrete definitions of the structures used. As a client of the JBD2 layer you can just rely on the using the pointer as a magic cookie of some sort. Obviously the hiding is not enforced as this is 'C'.h]hXThe journalling layer uses typedefs to ‘hide’ the concrete definitions of the structures used. As a client of the JBD2 layer you can just rely on the using the pointer as a magic cookie of some sort. Obviously the hiding is not enforced as this is ‘C’.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjVhhubh)}(hhh](h)}(h Structuresh]h Structures}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlehandle_t (C type) c.handle_thNtauh1jhjuhhhNhNubhdesc)}(hhh](hdesc_signature)}(hhandle_th]hdesc_signature_line)}(h type handle_th](hdesc_sig_keyword)}(htypeh]htype}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(hhandle_th]h desc_sig_name)}(hjh]hhandle_t}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(hTThe handle_t type represents a single atomic update being performed by some process.h]hTThe handle_t type represents a single atomic update being performed by some process.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jYtypeeh"]h$]h&]domainjYobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjuhNhNubh)}(h**Description**h]hstrong)}(hj&h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj$ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKMhjuhhubh)}(hAll filesystem modifications made by the process go through this handle. Recursive operations (such as quota operations) are gathered into a single update.h]hAll filesystem modifications made by the process go through this handle. Recursive operations (such as quota operations) are gathered into a single update.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKLhjuhhubh)}(hXThe buffer credits field is used to account for journaled buffers being modified by the running process. To ensure that there is enough log space for all outstanding operations, we need to limit the number of outstanding buffers possible at any time. When the operation completes, any buffer credits not used are credited back to the transaction, so that at all times we know how many buffers the outstanding updates on a transaction might possibly touch.h]hXThe buffer credits field is used to account for journaled buffers being modified by the running process. To ensure that there is enough log space for all outstanding operations, we need to limit the number of outstanding buffers possible at any time. When the operation completes, any buffer credits not used are credited back to the transaction, so that at all times we know how many buffers the outstanding updates on a transaction might possibly touch.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKPhjuhhubh)}(hThis is an opaque datatype.h]hThis is an opaque datatype.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKXhjuhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjournal_t (C type) c.journal_thNtauh1jhjuhhhNhNubj)}(hhh](j)}(h journal_th]j)}(htype journal_th](j)}(hjh]htype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhK]ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK]ubj)}(h journal_th]j)}(hj~h]h journal_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhK]ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj|hhhjhK]ubah}(h]jwah ](jjeh"]h$]h&]jj)jhuh1jhjhK]hjyhhubj)}(hhh]h)}(hXThe journal_t maintains all of the journaling state information for a single filesystem.h]hXThe journal_t maintains all of the journaling state information for a single filesystem.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhK_hjhhubah}(h]h ]h"]h$]h&]uh1jhjyhhhjhK]ubeh}(h]h ](jYtypeeh"]h$]h&]jjYjjj jj!j"j#uh1jhhhjuhNhNubh)}(h**Description**h]j))}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKahjuhhubh)}(h8journal_t is linked to from the fs superblock structure.h]h8journal_t is linked to from the fs superblock structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhK`hjuhhubh)}(hWe use the journal_t to keep track of all outstanding transaction activity on the filesystem, and to manage the state of the log writing process.h]hWe use the journal_t to keep track of all outstanding transaction activity on the filesystem, and to manage the state of the log writing process.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKbhjuhhubh)}(hThis is an opaque datatype.h]hThis is an opaque datatype.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKfhjuhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_inode (C struct) c.jbd2_inodehNtauh1jhjuhhhNhNubj)}(hhh](j)}(h jbd2_inodeh]j)}(hstruct jbd2_inodeh](j)}(hstructh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhKkubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhjNhKkubj)}(h jbd2_inodeh]j)}(hj:h]h jbd2_inode}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj<hhhjNhKkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj8hhhjNhKkubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1jhjNhKkhj5hhubj)}(hhh]h)}(hThe jbd_inode type is the structure linking inodes in ordered mode present in a transaction so that we can sync them during commit.h]hThe jbd_inode type is the structure linking inodes in ordered mode present in a transaction so that we can sync them during commit.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj5hhhjNhKkubeh}(h]h ](jYstructeh"]h$]h&]jjYjjj jj!j"j#uh1jhhhjuhNhNubh container)}(hX**Definition**:: struct jbd2_inode { transaction_t *i_transaction; transaction_t *i_next_transaction; struct list_head i_list; struct inode *i_vfs_inode; unsigned long i_flags; loff_t i_dirty_start; loff_t i_dirty_end; }; **Members** ``i_transaction`` Which transaction does this inode belong to? Either the running transaction or the committing one. [j_list_lock] ``i_next_transaction`` Pointer to the running transaction modifying inode's data in case there is already a committing transaction touching it. [j_list_lock] ``i_list`` List of inodes in the i_transaction [j_list_lock] ``i_vfs_inode`` VFS inode this inode belongs to [constant for lifetime of structure] ``i_flags`` Flags of inode [j_list_lock] ``i_dirty_start`` Offset in bytes where the dirty range for this inode starts. [j_list_lock] ``i_dirty_end`` Inclusive offset in bytes where the dirty range for this inode ends. [j_list_lock]h](h)}(h**Definition**::h](j))}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hstruct jbd2_inode { transaction_t *i_transaction; transaction_t *i_next_transaction; struct list_head i_list; struct inode *i_vfs_inode; unsigned long i_flags; loff_t i_dirty_start; loff_t i_dirty_end; };h]hstruct jbd2_inode { transaction_t *i_transaction; transaction_t *i_next_transaction; struct list_head i_list; struct inode *i_vfs_inode; unsigned long i_flags; loff_t i_dirty_start; loff_t i_dirty_end; };}hjsbah}(h]h ]h"]h$]h&]jjuh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubh)}(h **Members**h]j))}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubhdefinition_list)}(hhh](hdefinition_list_item)}(h``i_transaction`` Which transaction does this inode belong to? Either the running transaction or the committing one. [j_list_lock] h](hterm)}(h``i_transaction``h]j)}(hjh]h i_transaction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubh definition)}(hhh]h)}(hpWhich transaction does this inode belong to? Either the running transaction or the committing one. [j_list_lock]h]hpWhich transaction does this inode belong to? Either the running transaction or the committing one. [j_list_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(h``i_next_transaction`` Pointer to the running transaction modifying inode's data in case there is already a committing transaction touching it. [j_list_lock] h](j)}(h``i_next_transaction``h]j)}(hj4h]hi_next_transaction}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj.ubj)}(hhh]h)}(hPointer to the running transaction modifying inode's data in case there is already a committing transaction touching it. [j_list_lock]h]hPointer to the running transaction modifying inode’s data in case there is already a committing transaction touching it. [j_list_lock]}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjubj)}(h=``i_list`` List of inodes in the i_transaction [j_list_lock] h](j)}(h ``i_list``h]j)}(hjnh]hi_list}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjhubj)}(hhh]h)}(h1List of inodes in the i_transaction [j_list_lock]h]h1List of inodes in the i_transaction [j_list_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hU``i_vfs_inode`` VFS inode this inode belongs to [constant for lifetime of structure] h](j)}(h``i_vfs_inode``h]j)}(hjh]h i_vfs_inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hDVFS inode this inode belongs to [constant for lifetime of structure]h]hDVFS inode this inode belongs to [constant for lifetime of structure]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h)``i_flags`` Flags of inode [j_list_lock] h](j)}(h ``i_flags``h]j)}(hjh]hi_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hFlags of inode [j_list_lock]h]hFlags of inode [j_list_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h]``i_dirty_start`` Offset in bytes where the dirty range for this inode starts. [j_list_lock] h](j)}(h``i_dirty_start``h]j)}(hjh]h i_dirty_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hJOffset in bytes where the dirty range for this inode starts. [j_list_lock]h]hJOffset in bytes where the dirty range for this inode starts. [j_list_lock]}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj/ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj.hMhjubj)}(hb``i_dirty_end`` Inclusive offset in bytes where the dirty range for this inode ends. [j_list_lock]h](j)}(h``i_dirty_end``h]j)}(hjSh]h i_dirty_end}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjMubj)}(hhh]h)}(hRInclusive offset in bytes where the dirty range for this inode ends. [j_list_lock]h]hRInclusive offset in bytes where the dirty range for this inode ends. [j_list_lock]}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjuhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_handle (C struct)c.jbd2_journal_handlehNtauh1jhjuhhhNhNubj)}(hhh](j)}(hjbd2_journal_handleh]j)}(hstruct jbd2_journal_handleh](j)}(hjBh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hjbd2_journal_handleh]j)}(hjh]hjbd2_journal_handle}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hKThe jbd2_journal_handle type is the concrete type associated with handle_t.h]hKThe jbd2_journal_handle type is the concrete type associated with handle_t.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jYstructeh"]h$]h&]jjYjjj jj!j"j#uh1jhhhjuhNhNubj)}(hX**Definition**:: struct jbd2_journal_handle { union { transaction_t *h_transaction; journal_t *h_journal; }; handle_t *h_rsv_handle; int h_total_credits; int h_revoke_credits; int h_revoke_credits_requested; int h_ref; int h_err; unsigned int h_sync: 1; unsigned int h_reserved: 1; unsigned int h_aborted: 1; unsigned int h_type: 8; unsigned int h_line_no: 16; unsigned long h_start_jiffies; unsigned int h_requested_credits; unsigned int saved_alloc_context; }; **Members** ``{unnamed_union}`` anonymous ``h_transaction`` Which compound transaction is this update a part of? ``h_journal`` Which journal handle belongs to - used iff h_reserved set. ``h_rsv_handle`` Handle reserved for finishing the logical operation. ``h_total_credits`` Number of remaining buffers we are allowed to add to journal. These are dirty buffers and revoke descriptor blocks. ``h_revoke_credits`` Number of remaining revoke records available for handle ``h_revoke_credits_requested`` Holds **h_revoke_credits** after handle is started. ``h_ref`` Reference count on this handle. ``h_err`` Field for caller's use to track errors through large fs operations. ``h_sync`` Flag for sync-on-close. ``h_reserved`` Flag for handle for reserved credits. ``h_aborted`` Flag indicating fatal error on handle. ``h_type`` For handle statistics. ``h_line_no`` For handle statistics. ``h_start_jiffies`` Handle Start time. ``h_requested_credits`` Holds **h_total_credits** after handle is started. ``saved_alloc_context`` Saved context while transaction is open.h](h)}(h**Definition**::h](j))}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hXZstruct jbd2_journal_handle { union { transaction_t *h_transaction; journal_t *h_journal; }; handle_t *h_rsv_handle; int h_total_credits; int h_revoke_credits; int h_revoke_credits_requested; int h_ref; int h_err; unsigned int h_sync: 1; unsigned int h_reserved: 1; unsigned int h_aborted: 1; unsigned int h_type: 8; unsigned int h_line_no: 16; unsigned long h_start_jiffies; unsigned int h_requested_credits; unsigned int saved_alloc_context; };h]hXZstruct jbd2_journal_handle { union { transaction_t *h_transaction; journal_t *h_journal; }; handle_t *h_rsv_handle; int h_total_credits; int h_revoke_credits; int h_revoke_credits_requested; int h_ref; int h_err; unsigned int h_sync: 1; unsigned int h_reserved: 1; unsigned int h_aborted: 1; unsigned int h_type: 8; unsigned int h_line_no: 16; unsigned long h_start_jiffies; unsigned int h_requested_credits; unsigned int saved_alloc_context; };}hj+sbah}(h]h ]h"]h$]h&]jjuh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubh)}(h **Members**h]j))}(hj<h]hMembers}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj:ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh](j)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]j)}(hj[h]h{unnamed_union}}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjUubj)}(hhh]h)}(h anonymoush]h anonymous}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphMhjqubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjphMhjRubj)}(hG``h_transaction`` Which compound transaction is this update a part of? h](j)}(h``h_transaction``h]j)}(hjh]h h_transaction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h4Which compound transaction is this update a part of?h]h4Which compound transaction is this update a part of?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjRubj)}(hI``h_journal`` Which journal handle belongs to - used iff h_reserved set. h](j)}(h ``h_journal``h]j)}(hjh]h h_journal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h:Which journal handle belongs to - used iff h_reserved set.h]h:Which journal handle belongs to - used iff h_reserved set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjRubj)}(hF``h_rsv_handle`` Handle reserved for finishing the logical operation. h](j)}(h``h_rsv_handle``h]j)}(hj h]h h_rsv_handle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h4Handle reserved for finishing the logical operation.h]h4Handle reserved for finishing the logical operation.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(h``h_total_credits`` Number of remaining buffers we are allowed to add to journal. These are dirty buffers and revoke descriptor blocks. h](j)}(h``h_total_credits``h]j)}(hj? h]hh_total_credits}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj= ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj9 ubj)}(hhh]h)}(hsNumber of remaining buffers we are allowed to add to journal. These are dirty buffers and revoke descriptor blocks.h]hsNumber of remaining buffers we are allowed to add to journal. These are dirty buffers and revoke descriptor blocks.}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjU ubah}(h]h ]h"]h$]h&]uh1jhj9 ubeh}(h]h ]h"]h$]h&]uh1jhjT hMhjRubj)}(hM``h_revoke_credits`` Number of remaining revoke records available for handle h](j)}(h``h_revoke_credits``h]j)}(hjy h]hh_revoke_credits}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjs ubj)}(hhh]h)}(h7Number of remaining revoke records available for handleh]h7Number of remaining revoke records available for handle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjs ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(hS``h_revoke_credits_requested`` Holds **h_revoke_credits** after handle is started. h](j)}(h``h_revoke_credits_requested``h]j)}(hj h]hh_revoke_credits_requested}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h3Holds **h_revoke_credits** after handle is started.h](hHolds }(hj hhhNhNubj))}(h**h_revoke_credits**h]hh_revoke_credits}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubh after handle is started.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(h*``h_ref`` Reference count on this handle. h](j)}(h ``h_ref``h]j)}(hj h]hh_ref}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(hReference count on this handle.h]hReference count on this handle.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(hN``h_err`` Field for caller's use to track errors through large fs operations. h](j)}(h ``h_err``h]j)}(hj6 h]hh_err}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4 ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj0 ubj)}(hhh]h)}(hCField for caller's use to track errors through large fs operations.h]hEField for caller’s use to track errors through large fs operations.}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK hMhjL ubah}(h]h ]h"]h$]h&]uh1jhj0 ubeh}(h]h ]h"]h$]h&]uh1jhjK hMhjRubj)}(h#``h_sync`` Flag for sync-on-close. h](j)}(h ``h_sync``h]j)}(hjo h]hh_sync}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhji ubj)}(hhh]h)}(hFlag for sync-on-close.h]hFlag for sync-on-close.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhji ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(h5``h_reserved`` Flag for handle for reserved credits. h](j)}(h``h_reserved``h]j)}(hj h]h h_reserved}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h%Flag for handle for reserved credits.h]h%Flag for handle for reserved credits.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(h5``h_aborted`` Flag indicating fatal error on handle. h](j)}(h ``h_aborted``h]j)}(hj h]h h_aborted}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h&Flag indicating fatal error on handle.h]h&Flag indicating fatal error on handle.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(h"``h_type`` For handle statistics. h](j)}(h ``h_type``h]j)}(hj h]hh_type}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(hFor handle statistics.h]hFor handle statistics.}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/ hMhj0 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj/ hMhjRubj)}(h%``h_line_no`` For handle statistics. h](j)}(h ``h_line_no``h]j)}(hjS h]h h_line_no}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjM ubj)}(hhh]h)}(hFor handle statistics.h]hFor handle statistics.}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh hMhji ubah}(h]h ]h"]h$]h&]uh1jhjM ubeh}(h]h ]h"]h$]h&]uh1jhjh hMhjRubj)}(h'``h_start_jiffies`` Handle Start time. h](j)}(h``h_start_jiffies``h]j)}(hj h]hh_start_jiffies}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(hHandle Start time.h]hHandle Start time.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(hK``h_requested_credits`` Holds **h_total_credits** after handle is started. h](j)}(h``h_requested_credits``h]j)}(hj h]hh_requested_credits}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h2Holds **h_total_credits** after handle is started.h](hHolds }(hj hhhNhNubj))}(h**h_total_credits**h]hh_total_credits}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubh after handle is started.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjRubj)}(h@``saved_alloc_context`` Saved context while transaction is open.h](j)}(h``saved_alloc_context``h]j)}(hj h]hsaved_alloc_context}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h(Saved context while transaction is open.h]h(Saved context while transaction is open.}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj& ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj% hMhjRubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjuhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjournal_s (C struct) c.journal_shNtauh1jhjuhhhNhNubj)}(hhh](j)}(h journal_sh]j)}(hstruct journal_sh](j)}(hjBh]hstruct}(hjj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf hhh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMubj)}(h h]h }(hjx hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf hhhjw hMubj)}(h journal_sh]j)}(hjd h]h journal_s}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjf hhhjw hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjb hhhjw hMubah}(h]j] ah ](jjeh"]h$]h&]jj)jhuh1jhjw hMhj_ hhubj)}(hhh]h)}(hBThe journal_s type is the concrete type associated with journal_t.h]hBThe journal_s type is the concrete type associated with journal_t.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj hhubah}(h]h ]h"]h$]h&]uh1jhj_ hhhjw hMubeh}(h]h ](jYstructeh"]h$]h&]jjYjj j j j!j"j#uh1jhhhjuhNhNubj)}(hX,**Definition**:: struct journal_s { unsigned long j_flags; int j_errno; struct mutex j_abort_mutex; struct buffer_head *j_sb_buffer; journal_superblock_t *j_superblock; rwlock_t j_state_lock; int j_barrier_count; struct mutex j_barrier; transaction_t *j_running_transaction; transaction_t *j_committing_transaction; transaction_t *j_checkpoint_transactions; wait_queue_head_t j_wait_transaction_locked; wait_queue_head_t j_wait_done_commit; wait_queue_head_t j_wait_commit; wait_queue_head_t j_wait_updates; wait_queue_head_t j_wait_reserved; wait_queue_head_t j_fc_wait; struct mutex j_checkpoint_mutex; struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH]; struct shrinker *j_shrinker; struct percpu_counter j_checkpoint_jh_count; transaction_t *j_shrink_transaction; unsigned long j_head; unsigned long j_tail; unsigned long j_free; unsigned long j_first; unsigned long j_last; unsigned long j_fc_first; unsigned long j_fc_off; unsigned long j_fc_last; struct block_device *j_dev; int j_blocksize; unsigned long long j_blk_offset; char j_devname[BDEVNAME_SIZE+24]; struct block_device *j_fs_dev; errseq_t j_fs_dev_wb_err; unsigned int j_total_len; atomic_t j_reserved_credits; spinlock_t j_list_lock; struct inode *j_inode; tid_t j_tail_sequence; tid_t j_transaction_sequence; tid_t j_commit_sequence; tid_t j_commit_request; __u8 j_uuid[16]; struct task_struct *j_task; int j_max_transaction_buffers; int j_revoke_records_per_block; int j_transaction_overhead_buffers; unsigned long j_commit_interval; struct timer_list j_commit_timer; spinlock_t j_revoke_lock; struct jbd2_revoke_table_s *j_revoke; struct jbd2_revoke_table_s *j_revoke_table[2]; struct buffer_head **j_wbuf; struct buffer_head **j_fc_wbuf; int j_wbufsize; int j_fc_wbufsize; pid_t j_last_sync_writer; u64 j_average_commit_time; u32 j_min_batch_time; u32 j_max_batch_time; void (*j_commit_callback)(journal_t *, transaction_t *); int (*j_submit_inode_data_buffers) (struct jbd2_inode *); int (*j_finish_inode_data_buffers) (struct jbd2_inode *); spinlock_t j_history_lock; struct proc_dir_entry *j_proc_entry; struct transaction_stats_s j_stats; unsigned int j_failed_commit; void *j_private; __u32 j_csum_seed; #ifdef CONFIG_DEBUG_LOCK_ALLOC; struct lockdep_map j_trans_commit_map; #endif; void (*j_fc_cleanup_callback)(struct journal_s *journal, int full, tid_t tid); int (*j_fc_replay_callback)(struct journal_s *journal,struct buffer_head *bh,enum passtype pass, int off, tid_t expected_commit_id); int (*j_bmap)(struct journal_s *journal, sector_t *block); }; **Members** ``j_flags`` General journaling state flags [j_state_lock, no lock for quick racy checks] ``j_errno`` Is there an outstanding uncleared error on the journal (from a prior abort)? [j_state_lock] ``j_abort_mutex`` Lock the whole aborting procedure. ``j_sb_buffer`` The first part of the superblock buffer. ``j_superblock`` The second part of the superblock buffer. ``j_state_lock`` Protect the various scalars in the journal. ``j_barrier_count`` Number of processes waiting to create a barrier lock [j_state_lock, no lock for quick racy checks] ``j_barrier`` The barrier lock itself. ``j_running_transaction`` Transactions: The current running transaction... [j_state_lock, no lock for quick racy checks] [caller holding open handle] ``j_committing_transaction`` the transaction we are pushing to disk [j_state_lock] [caller holding open handle] ``j_checkpoint_transactions`` ... and a linked circular list of all transactions waiting for checkpointing. [j_list_lock] ``j_wait_transaction_locked`` Wait queue for waiting for a locked transaction to start committing, or for a barrier lock to be released. ``j_wait_done_commit`` Wait queue for waiting for commit to complete. ``j_wait_commit`` Wait queue to trigger commit. ``j_wait_updates`` Wait queue to wait for updates to complete. ``j_wait_reserved`` Wait queue to wait for reserved buffer credits to drop. ``j_fc_wait`` Wait queue to wait for completion of async fast commits. ``j_checkpoint_mutex`` Semaphore for locking against concurrent checkpoints. ``j_chkpt_bhs`` List of buffer heads used by the checkpoint routine. This was moved from jbd2_log_do_checkpoint() to reduce stack usage. Access to this array is controlled by the **j_checkpoint_mutex**. [j_checkpoint_mutex] ``j_shrinker`` Journal head shrinker, reclaim buffer's journal head which has been written back. ``j_checkpoint_jh_count`` Number of journal buffers on the checkpoint list. [j_list_lock] ``j_shrink_transaction`` Record next transaction will shrink on the checkpoint list. [j_list_lock] ``j_head`` Journal head: identifies the first unused block in the journal. [j_state_lock] ``j_tail`` Journal tail: identifies the oldest still-used block in the journal. [j_state_lock] ``j_free`` Journal free: how many free blocks are there in the journal? [j_state_lock] ``j_first`` The block number of the first usable block in the journal [j_state_lock]. ``j_last`` The block number one beyond the last usable block in the journal [j_state_lock]. ``j_fc_first`` The block number of the first fast commit block in the journal [j_state_lock]. ``j_fc_off`` Number of fast commit blocks currently allocated. Accessed only during fast commit. Currently only process can do fast commit, so this field is not protected by any lock. ``j_fc_last`` The block number one beyond the last fast commit block in the journal [j_state_lock]. ``j_dev`` Device where we store the journal. ``j_blocksize`` Block size for the location where we store the journal. ``j_blk_offset`` Starting block offset into the device where we store the journal. ``j_devname`` Journal device name. ``j_fs_dev`` Device which holds the client fs. For internal journal this will be equal to j_dev. ``j_fs_dev_wb_err`` Records the errseq of the client fs's backing block device. ``j_total_len`` Total maximum capacity of the journal region on disk. ``j_reserved_credits`` Number of buffers reserved from the running transaction. ``j_list_lock`` Protects the buffer lists and internal buffer state. ``j_inode`` Optional inode where we store the journal. If present, all journal block numbers are mapped into this inode via bmap(). ``j_tail_sequence`` Sequence number of the oldest transaction in the log [j_state_lock] ``j_transaction_sequence`` Sequence number of the next transaction to grant [j_state_lock] ``j_commit_sequence`` Sequence number of the most recently committed transaction [j_state_lock, no lock for quick racy checks] ``j_commit_request`` Sequence number of the most recent transaction wanting commit [j_state_lock, no lock for quick racy checks] ``j_uuid`` Journal uuid: identifies the object (filesystem, LVM volume etc) backed by this journal. This will eventually be replaced by an array of uuids, allowing us to index multiple devices within a single journal and to perform atomic updates across them. ``j_task`` Pointer to the current commit thread for this journal. ``j_max_transaction_buffers`` Maximum number of metadata buffers to allow in a single compound commit transaction. ``j_revoke_records_per_block`` Number of revoke records that fit in one descriptor block. ``j_transaction_overhead_buffers`` Number of blocks each transaction needs for its own bookkeeping ``j_commit_interval`` What is the maximum transaction lifetime before we begin a commit? ``j_commit_timer`` The timer used to wakeup the commit thread. ``j_revoke_lock`` Protect the revoke table. ``j_revoke`` The revoke table - maintains the list of revoked blocks in the current transaction. ``j_revoke_table`` Alternate revoke tables for j_revoke. ``j_wbuf`` Array of bhs for jbd2_journal_commit_transaction. ``j_fc_wbuf`` Array of fast commit bhs for fast commit. Accessed only during a fast commit. Currently only process can do fast commit, so this field is not protected by any lock. ``j_wbufsize`` Size of **j_wbuf** array. ``j_fc_wbufsize`` Size of **j_fc_wbuf** array. ``j_last_sync_writer`` The pid of the last person to run a synchronous operation through the journal. ``j_average_commit_time`` The average amount of time in nanoseconds it takes to commit a transaction to disk. [j_state_lock] ``j_min_batch_time`` Minimum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds. ``j_max_batch_time`` Maximum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds. ``j_commit_callback`` This function is called when a transaction is closed. ``j_submit_inode_data_buffers`` This function is called for all inodes associated with the committing transaction marked with JI_WRITE_DATA flag before we start to write out the transaction to the journal. ``j_finish_inode_data_buffers`` This function is called for all inodes associated with the committing transaction marked with JI_WAIT_DATA flag after we have written the transaction to the journal but before we write out the commit block. ``j_history_lock`` Protect the transactions statistics history. ``j_proc_entry`` procfs entry for the jbd statistics directory. ``j_stats`` Overall statistics. ``j_failed_commit`` Failed journal commit ID. ``j_private`` An opaque pointer to fs-private information. ext3 puts its superblock pointer here. ``j_csum_seed`` Precomputed journal UUID checksum for seeding other checksums. ``j_trans_commit_map`` Lockdep entity to track transaction commit dependencies. Handles hold this "lock" for read, when we wait for commit, we acquire the "lock" for writing. This matches the properties of jbd2 journalling where the running transaction has to wait for all handles to be dropped to commit that transaction and also acquiring a handle may require transaction commit to finish. ``j_fc_cleanup_callback`` Clean-up after fast commit or full commit. JBD2 calls this function after every commit operation. ``j_fc_replay_callback`` File-system specific function that performs replay of a fast commit. JBD2 calls this function for each fast commit block found in the journal. This function should return JBD2_FC_REPLAY_CONTINUE to indicate that the block was processed correctly and more fast commit replay should continue. Return value of JBD2_FC_REPLAY_STOP indicates the end of replay (no more blocks remaining). A negative return value indicates error. ``j_bmap`` Bmap function that should be used instead of the generic VFS bmap function.h](h)}(h**Definition**::h](j))}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hX struct journal_s { unsigned long j_flags; int j_errno; struct mutex j_abort_mutex; struct buffer_head *j_sb_buffer; journal_superblock_t *j_superblock; rwlock_t j_state_lock; int j_barrier_count; struct mutex j_barrier; transaction_t *j_running_transaction; transaction_t *j_committing_transaction; transaction_t *j_checkpoint_transactions; wait_queue_head_t j_wait_transaction_locked; wait_queue_head_t j_wait_done_commit; wait_queue_head_t j_wait_commit; wait_queue_head_t j_wait_updates; wait_queue_head_t j_wait_reserved; wait_queue_head_t j_fc_wait; struct mutex j_checkpoint_mutex; struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH]; struct shrinker *j_shrinker; struct percpu_counter j_checkpoint_jh_count; transaction_t *j_shrink_transaction; unsigned long j_head; unsigned long j_tail; unsigned long j_free; unsigned long j_first; unsigned long j_last; unsigned long j_fc_first; unsigned long j_fc_off; unsigned long j_fc_last; struct block_device *j_dev; int j_blocksize; unsigned long long j_blk_offset; char j_devname[BDEVNAME_SIZE+24]; struct block_device *j_fs_dev; errseq_t j_fs_dev_wb_err; unsigned int j_total_len; atomic_t j_reserved_credits; spinlock_t j_list_lock; struct inode *j_inode; tid_t j_tail_sequence; tid_t j_transaction_sequence; tid_t j_commit_sequence; tid_t j_commit_request; __u8 j_uuid[16]; struct task_struct *j_task; int j_max_transaction_buffers; int j_revoke_records_per_block; int j_transaction_overhead_buffers; unsigned long j_commit_interval; struct timer_list j_commit_timer; spinlock_t j_revoke_lock; struct jbd2_revoke_table_s *j_revoke; struct jbd2_revoke_table_s *j_revoke_table[2]; struct buffer_head **j_wbuf; struct buffer_head **j_fc_wbuf; int j_wbufsize; int j_fc_wbufsize; pid_t j_last_sync_writer; u64 j_average_commit_time; u32 j_min_batch_time; u32 j_max_batch_time; void (*j_commit_callback)(journal_t *, transaction_t *); int (*j_submit_inode_data_buffers) (struct jbd2_inode *); int (*j_finish_inode_data_buffers) (struct jbd2_inode *); spinlock_t j_history_lock; struct proc_dir_entry *j_proc_entry; struct transaction_stats_s j_stats; unsigned int j_failed_commit; void *j_private; __u32 j_csum_seed; #ifdef CONFIG_DEBUG_LOCK_ALLOC; struct lockdep_map j_trans_commit_map; #endif; void (*j_fc_cleanup_callback)(struct journal_s *journal, int full, tid_t tid); int (*j_fc_replay_callback)(struct journal_s *journal,struct buffer_head *bh,enum passtype pass, int off, tid_t expected_commit_id); int (*j_bmap)(struct journal_s *journal, sector_t *block); };h]hX struct journal_s { unsigned long j_flags; int j_errno; struct mutex j_abort_mutex; struct buffer_head *j_sb_buffer; journal_superblock_t *j_superblock; rwlock_t j_state_lock; int j_barrier_count; struct mutex j_barrier; transaction_t *j_running_transaction; transaction_t *j_committing_transaction; transaction_t *j_checkpoint_transactions; wait_queue_head_t j_wait_transaction_locked; wait_queue_head_t j_wait_done_commit; wait_queue_head_t j_wait_commit; wait_queue_head_t j_wait_updates; wait_queue_head_t j_wait_reserved; wait_queue_head_t j_fc_wait; struct mutex j_checkpoint_mutex; struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH]; struct shrinker *j_shrinker; struct percpu_counter j_checkpoint_jh_count; transaction_t *j_shrink_transaction; unsigned long j_head; unsigned long j_tail; unsigned long j_free; unsigned long j_first; unsigned long j_last; unsigned long j_fc_first; unsigned long j_fc_off; unsigned long j_fc_last; struct block_device *j_dev; int j_blocksize; unsigned long long j_blk_offset; char j_devname[BDEVNAME_SIZE+24]; struct block_device *j_fs_dev; errseq_t j_fs_dev_wb_err; unsigned int j_total_len; atomic_t j_reserved_credits; spinlock_t j_list_lock; struct inode *j_inode; tid_t j_tail_sequence; tid_t j_transaction_sequence; tid_t j_commit_sequence; tid_t j_commit_request; __u8 j_uuid[16]; struct task_struct *j_task; int j_max_transaction_buffers; int j_revoke_records_per_block; int j_transaction_overhead_buffers; unsigned long j_commit_interval; struct timer_list j_commit_timer; spinlock_t j_revoke_lock; struct jbd2_revoke_table_s *j_revoke; struct jbd2_revoke_table_s *j_revoke_table[2]; struct buffer_head **j_wbuf; struct buffer_head **j_fc_wbuf; int j_wbufsize; int j_fc_wbufsize; pid_t j_last_sync_writer; u64 j_average_commit_time; u32 j_min_batch_time; u32 j_max_batch_time; void (*j_commit_callback)(journal_t *, transaction_t *); int (*j_submit_inode_data_buffers) (struct jbd2_inode *); int (*j_finish_inode_data_buffers) (struct jbd2_inode *); spinlock_t j_history_lock; struct proc_dir_entry *j_proc_entry; struct transaction_stats_s j_stats; unsigned int j_failed_commit; void *j_private; __u32 j_csum_seed; #ifdef CONFIG_DEBUG_LOCK_ALLOC; struct lockdep_map j_trans_commit_map; #endif; void (*j_fc_cleanup_callback)(struct journal_s *journal, int full, tid_t tid); int (*j_fc_replay_callback)(struct journal_s *journal,struct buffer_head *bh,enum passtype pass, int off, tid_t expected_commit_id); int (*j_bmap)(struct journal_s *journal, sector_t *block); };}hj sbah}(h]h ]h"]h$]h&]jjuh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubh)}(h **Members**h]j))}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM9hj ubj)}(hhh](j)}(hY``j_flags`` General journaling state flags [j_state_lock, no lock for quick racy checks] h](j)}(h ``j_flags``h]j)}(hj h]hj_flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(hLGeneral journaling state flags [j_state_lock, no lock for quick racy checks]h]hLGeneral journaling state flags [j_state_lock, no lock for quick racy checks]}(hj2 hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj/ ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj. hMhj ubj)}(hh``j_errno`` Is there an outstanding uncleared error on the journal (from a prior abort)? [j_state_lock] h](j)}(h ``j_errno``h]j)}(hjS h]hj_errno}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjM ubj)}(hhh]h)}(h[Is there an outstanding uncleared error on the journal (from a prior abort)? [j_state_lock]h]h[Is there an outstanding uncleared error on the journal (from a prior abort)? [j_state_lock]}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhji ubah}(h]h ]h"]h$]h&]uh1jhjM ubeh}(h]h ]h"]h$]h&]uh1jhjh hMhj ubj)}(h5``j_abort_mutex`` Lock the whole aborting procedure. h](j)}(h``j_abort_mutex``h]j)}(hj h]h j_abort_mutex}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h"Lock the whole aborting procedure.h]h"Lock the whole aborting procedure.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h9``j_sb_buffer`` The first part of the superblock buffer. h](j)}(h``j_sb_buffer``h]j)}(hj h]h j_sb_buffer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h(The first part of the superblock buffer.h]h(The first part of the superblock buffer.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h;``j_superblock`` The second part of the superblock buffer. h](j)}(h``j_superblock``h]j)}(hj h]h j_superblock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj ubj)}(hhh]h)}(h)The second part of the superblock buffer.h]h)The second part of the superblock buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h=``j_state_lock`` Protect the various scalars in the journal. h](j)}(h``j_state_lock``h]j)}(hj8h]h j_state_lock}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj2ubj)}(hhh]h)}(h+Protect the various scalars in the journal.h]h+Protect the various scalars in the journal.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMhj ubj)}(hw``j_barrier_count`` Number of processes waiting to create a barrier lock [j_state_lock, no lock for quick racy checks] h](j)}(h``j_barrier_count``h]j)}(hjqh]hj_barrier_count}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM hjkubj)}(hhh]h)}(hbNumber of processes waiting to create a barrier lock [j_state_lock, no lock for quick racy checks]h]hbNumber of processes waiting to create a barrier lock [j_state_lock, no lock for quick racy checks]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM hjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhM hj ubj)}(h'``j_barrier`` The barrier lock itself. h](j)}(h ``j_barrier``h]j)}(hjh]h j_barrier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hThe barrier lock itself.h]hThe barrier lock itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h``j_running_transaction`` Transactions: The current running transaction... [j_state_lock, no lock for quick racy checks] [caller holding open handle] h](j)}(h``j_running_transaction``h]j)}(hjh]hj_running_transaction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h{Transactions: The current running transaction... [j_state_lock, no lock for quick racy checks] [caller holding open handle]h]h{Transactions: The current running transaction... [j_state_lock, no lock for quick racy checks] [caller holding open handle]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hp``j_committing_transaction`` the transaction we are pushing to disk [j_state_lock] [caller holding open handle] h](j)}(h``j_committing_transaction``h]j)}(hjh]hj_committing_transaction}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM#hjubj)}(hhh]h)}(hRthe transaction we are pushing to disk [j_state_lock] [caller holding open handle]h]hRthe transaction we are pushing to disk [j_state_lock] [caller holding open handle]}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM"hj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hM#hj ubj)}(hz``j_checkpoint_transactions`` ... and a linked circular list of all transactions waiting for checkpointing. [j_list_lock] h](j)}(h``j_checkpoint_transactions``h]j)}(hjXh]hj_checkpoint_transactions}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM+hjRubj)}(hhh]h)}(h[... and a linked circular list of all transactions waiting for checkpointing. [j_list_lock]h]h[... and a linked circular list of all transactions waiting for checkpointing. [j_list_lock]}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM*hjnubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jhjmhM+hj ubj)}(h``j_wait_transaction_locked`` Wait queue for waiting for a locked transaction to start committing, or for a barrier lock to be released. h](j)}(h``j_wait_transaction_locked``h]j)}(hjh]hj_wait_transaction_locked}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM3hjubj)}(hhh]h)}(hjWait queue for waiting for a locked transaction to start committing, or for a barrier lock to be released.h]hjWait queue for waiting for a locked transaction to start committing, or for a barrier lock to be released.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM2hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM3hj ubj)}(hF``j_wait_done_commit`` Wait queue for waiting for commit to complete. h](j)}(h``j_wait_done_commit``h]j)}(hjh]hj_wait_done_commit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM:hjubj)}(hhh]h)}(h.Wait queue for waiting for commit to complete.h]h.Wait queue for waiting for commit to complete.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM:hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM:hj ubj)}(h0``j_wait_commit`` Wait queue to trigger commit. h](j)}(h``j_wait_commit``h]j)}(hjh]h j_wait_commit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM?hjubj)}(hhh]h)}(hWait queue to trigger commit.h]hWait queue to trigger commit.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM?hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM?hj ubj)}(h?``j_wait_updates`` Wait queue to wait for updates to complete. h](j)}(h``j_wait_updates``h]j)}(hj>h]hj_wait_updates}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMDhj8ubj)}(hhh]h)}(h+Wait queue to wait for updates to complete.h]h+Wait queue to wait for updates to complete.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMDhjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjShMDhj ubj)}(hL``j_wait_reserved`` Wait queue to wait for reserved buffer credits to drop. h](j)}(h``j_wait_reserved``h]j)}(hjwh]hj_wait_reserved}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMIhjqubj)}(hhh]h)}(h7Wait queue to wait for reserved buffer credits to drop.h]h7Wait queue to wait for reserved buffer credits to drop.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMIhjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjhMIhj ubj)}(hG``j_fc_wait`` Wait queue to wait for completion of async fast commits. h](j)}(h ``j_fc_wait``h]j)}(hjh]h j_fc_wait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMPhjubj)}(hhh]h)}(h8Wait queue to wait for completion of async fast commits.h]h8Wait queue to wait for completion of async fast commits.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMPhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMPhj ubj)}(hM``j_checkpoint_mutex`` Semaphore for locking against concurrent checkpoints. h](j)}(h``j_checkpoint_mutex``h]j)}(hjh]hj_checkpoint_mutex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMWhjubj)}(hhh]h)}(h5Semaphore for locking against concurrent checkpoints.h]h5Semaphore for locking against concurrent checkpoints.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMWhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMWhj ubj)}(h``j_chkpt_bhs`` List of buffer heads used by the checkpoint routine. This was moved from jbd2_log_do_checkpoint() to reduce stack usage. Access to this array is controlled by the **j_checkpoint_mutex**. [j_checkpoint_mutex] h](j)}(h``j_chkpt_bhs``h]j)}(hj"h]h j_chkpt_bhs}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMahjubj)}(hhh]h)}(hList of buffer heads used by the checkpoint routine. This was moved from jbd2_log_do_checkpoint() to reduce stack usage. Access to this array is controlled by the **j_checkpoint_mutex**. [j_checkpoint_mutex]h](hList of buffer heads used by the checkpoint routine. This was moved from jbd2_log_do_checkpoint() to reduce stack usage. Access to this array is controlled by the }(hj;hhhNhNubj))}(h**j_checkpoint_mutex**h]hj_checkpoint_mutex}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj;ubh. [j_checkpoint_mutex]}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM^hj8ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj7hMahj ubj)}(ha``j_shrinker`` Journal head shrinker, reclaim buffer's journal head which has been written back. h](j)}(h``j_shrinker``h]j)}(hjnh]h j_shrinker}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMihjhubj)}(hhh]h)}(hQJournal head shrinker, reclaim buffer's journal head which has been written back.h]hSJournal head shrinker, reclaim buffer’s journal head which has been written back.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhMihj ubj)}(hZ``j_checkpoint_jh_count`` Number of journal buffers on the checkpoint list. [j_list_lock] h](j)}(h``j_checkpoint_jh_count``h]j)}(hjh]hj_checkpoint_jh_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMphjubj)}(hhh]h)}(h?Number of journal buffers on the checkpoint list. [j_list_lock]h]h?Number of journal buffers on the checkpoint list. [j_list_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMphj ubj)}(hc``j_shrink_transaction`` Record next transaction will shrink on the checkpoint list. [j_list_lock] h](j)}(h``j_shrink_transaction``h]j)}(hjh]hj_shrink_transaction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMxhjubj)}(hhh]h)}(hIRecord next transaction will shrink on the checkpoint list. [j_list_lock]h]hIRecord next transaction will shrink on the checkpoint list. [j_list_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMwhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMxhj ubj)}(hZ``j_head`` Journal head: identifies the first unused block in the journal. [j_state_lock] h](j)}(h ``j_head``h]j)}(hjh]hj_head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hNJournal head: identifies the first unused block in the journal. [j_state_lock]h]hNJournal head: identifies the first unused block in the journal. [j_state_lock]}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj ubj)}(h_``j_tail`` Journal tail: identifies the oldest still-used block in the journal. [j_state_lock] h](j)}(h ``j_tail``h]j)}(hjUh]hj_tail}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjOubj)}(hhh]h)}(hSJournal tail: identifies the oldest still-used block in the journal. [j_state_lock]h]hSJournal tail: identifies the oldest still-used block in the journal. [j_state_lock]}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjjhMhj ubj)}(hW``j_free`` Journal free: how many free blocks are there in the journal? [j_state_lock] h](j)}(h ``j_free``h]j)}(hjh]hj_free}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hKJournal free: how many free blocks are there in the journal? [j_state_lock]h]hKJournal free: how many free blocks are there in the journal? [j_state_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hV``j_first`` The block number of the first usable block in the journal [j_state_lock]. h](j)}(h ``j_first``h]j)}(hjh]hj_first}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hIThe block number of the first usable block in the journal [j_state_lock].h]hIThe block number of the first usable block in the journal [j_state_lock].}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h\``j_last`` The block number one beyond the last usable block in the journal [j_state_lock]. h](j)}(h ``j_last``h]j)}(hjh]hj_last}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hPThe block number one beyond the last usable block in the journal [j_state_lock].h]hPThe block number one beyond the last usable block in the journal [j_state_lock].}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h^``j_fc_first`` The block number of the first fast commit block in the journal [j_state_lock]. h](j)}(h``j_fc_first``h]j)}(hj=h]h j_fc_first}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj7ubj)}(hhh]h)}(hNThe block number of the first fast commit block in the journal [j_state_lock].h]hNThe block number of the first fast commit block in the journal [j_state_lock].}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjSubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhMhj ubj)}(h``j_fc_off`` Number of fast commit blocks currently allocated. Accessed only during fast commit. Currently only process can do fast commit, so this field is not protected by any lock. h](j)}(h ``j_fc_off``h]j)}(hjwh]hj_fc_off}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjqubj)}(hhh]h)}(hNumber of fast commit blocks currently allocated. Accessed only during fast commit. Currently only process can do fast commit, so this field is not protected by any lock.h]hNumber of fast commit blocks currently allocated. Accessed only during fast commit. Currently only process can do fast commit, so this field is not protected by any lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hd``j_fc_last`` The block number one beyond the last fast commit block in the journal [j_state_lock]. h](j)}(h ``j_fc_last``h]j)}(hjh]h j_fc_last}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hUThe block number one beyond the last fast commit block in the journal [j_state_lock].h]hUThe block number one beyond the last fast commit block in the journal [j_state_lock].}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h-``j_dev`` Device where we store the journal. h](j)}(h ``j_dev``h]j)}(hjh]hj_dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h"Device where we store the journal.h]h"Device where we store the journal.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hH``j_blocksize`` Block size for the location where we store the journal. h](j)}(h``j_blocksize``h]j)}(hj$h]h j_blocksize}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h7Block size for the location where we store the journal.h]h7Block size for the location where we store the journal.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMhj:ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj9hMhj ubj)}(hS``j_blk_offset`` Starting block offset into the device where we store the journal. h](j)}(h``j_blk_offset``h]j)}(hj]h]h j_blk_offset}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjWubj)}(hhh]h)}(hAStarting block offset into the device where we store the journal.h]hAStarting block offset into the device where we store the journal.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhMhjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjrhMhj ubj)}(h#``j_devname`` Journal device name. h](j)}(h ``j_devname``h]j)}(hjh]h j_devname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hJournal device name.h]hJournal device name.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hb``j_fs_dev`` Device which holds the client fs. For internal journal this will be equal to j_dev. h](j)}(h ``j_fs_dev``h]j)}(hjh]hj_fs_dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hTDevice which holds the client fs. For internal journal this will be equal to j_dev.h]hTDevice which holds the client fs. For internal journal this will be equal to j_dev.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hP``j_fs_dev_wb_err`` Records the errseq of the client fs's backing block device. h](j)}(h``j_fs_dev_wb_err``h]j)}(hj h]hj_fs_dev_wb_err}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h;Records the errseq of the client fs's backing block device.h]h=Records the errseq of the client fs’s backing block device.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hF``j_total_len`` Total maximum capacity of the journal region on disk. h](j)}(h``j_total_len``h]j)}(hjBh]h j_total_len}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj<ubj)}(hhh]h)}(h5Total maximum capacity of the journal region on disk.h]h5Total maximum capacity of the journal region on disk.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjXubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhMhj ubj)}(hP``j_reserved_credits`` Number of buffers reserved from the running transaction. h](j)}(h``j_reserved_credits``h]j)}(hj{h]hj_reserved_credits}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjuubj)}(hhh]h)}(h8Number of buffers reserved from the running transaction.h]h8Number of buffers reserved from the running transaction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hE``j_list_lock`` Protects the buffer lists and internal buffer state. h](j)}(h``j_list_lock``h]j)}(hjh]h j_list_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h4Protects the buffer lists and internal buffer state.h]h4Protects the buffer lists and internal buffer state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h``j_inode`` Optional inode where we store the journal. If present, all journal block numbers are mapped into this inode via bmap(). h](j)}(h ``j_inode``h]j)}(hjh]hj_inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hxOptional inode where we store the journal. If present, all journal block numbers are mapped into this inode via bmap().h]hxOptional inode where we store the journal. If present, all journal block numbers are mapped into this inode via bmap().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hX``j_tail_sequence`` Sequence number of the oldest transaction in the log [j_state_lock] h](j)}(h``j_tail_sequence``h]j)}(hj'h]hj_tail_sequence}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj!ubj)}(hhh]h)}(hCSequence number of the oldest transaction in the log [j_state_lock]h]hCSequence number of the oldest transaction in the log [j_state_lock]}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj ubj)}(h[``j_transaction_sequence`` Sequence number of the next transaction to grant [j_state_lock] h](j)}(h``j_transaction_sequence``h]j)}(hj`h]hj_transaction_sequence}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjZubj)}(hhh]h)}(h?Sequence number of the next transaction to grant [j_state_lock]h]h?Sequence number of the next transaction to grant [j_state_lock]}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhj ubj)}(h``j_commit_sequence`` Sequence number of the most recently committed transaction [j_state_lock, no lock for quick racy checks] h](j)}(h``j_commit_sequence``h]j)}(hjh]hj_commit_sequence}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM hjubj)}(hhh]h)}(hhSequence number of the most recently committed transaction [j_state_lock, no lock for quick racy checks]h]hhSequence number of the most recently committed transaction [j_state_lock, no lock for quick racy checks]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj ubj)}(h``j_commit_request`` Sequence number of the most recent transaction wanting commit [j_state_lock, no lock for quick racy checks] h](j)}(h``j_commit_request``h]j)}(hjh]hj_commit_request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hkSequence number of the most recent transaction wanting commit [j_state_lock, no lock for quick racy checks]h]hkSequence number of the most recent transaction wanting commit [j_state_lock, no lock for quick racy checks]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hX``j_uuid`` Journal uuid: identifies the object (filesystem, LVM volume etc) backed by this journal. This will eventually be replaced by an array of uuids, allowing us to index multiple devices within a single journal and to perform atomic updates across them. h](j)}(h ``j_uuid``h]j)}(hj h]hj_uuid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hJournal uuid: identifies the object (filesystem, LVM volume etc) backed by this journal. This will eventually be replaced by an array of uuids, allowing us to index multiple devices within a single journal and to perform atomic updates across them.h]hJournal uuid: identifies the object (filesystem, LVM volume etc) backed by this journal. This will eventually be replaced by an array of uuids, allowing us to index multiple devices within a single journal and to perform atomic updates across them.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj#ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj"hMhj ubj)}(hB``j_task`` Pointer to the current commit thread for this journal. h](j)}(h ``j_task``h]j)}(hjGh]hj_task}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM&hjAubj)}(hhh]h)}(h6Pointer to the current commit thread for this journal.h]h6Pointer to the current commit thread for this journal.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM&hj]ubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhj\hM&hj ubj)}(hs``j_max_transaction_buffers`` Maximum number of metadata buffers to allow in a single compound commit transaction. h](j)}(h``j_max_transaction_buffers``h]j)}(hjh]hj_max_transaction_buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM,hjzubj)}(hhh]h)}(hTMaximum number of metadata buffers to allow in a single compound commit transaction.h]hTMaximum number of metadata buffers to allow in a single compound commit transaction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM+hjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhjhM,hj ubj)}(hZ``j_revoke_records_per_block`` Number of revoke records that fit in one descriptor block. h](j)}(h``j_revoke_records_per_block``h]j)}(hjh]hj_revoke_records_per_block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM3hjubj)}(hhh]h)}(h:Number of revoke records that fit in one descriptor block.h]h:Number of revoke records that fit in one descriptor block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM3hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM3hj ubj)}(hc``j_transaction_overhead_buffers`` Number of blocks each transaction needs for its own bookkeeping h](j)}(h"``j_transaction_overhead_buffers``h]j)}(hjh]hj_transaction_overhead_buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM:hjubj)}(hhh]h)}(h?Number of blocks each transaction needs for its own bookkeepingh]h?Number of blocks each transaction needs for its own bookkeeping}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM:hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM:hj ubj)}(hY``j_commit_interval`` What is the maximum transaction lifetime before we begin a commit? h](j)}(h``j_commit_interval``h]j)}(hj,h]hj_commit_interval}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMAhj&ubj)}(hhh]h)}(hBWhat is the maximum transaction lifetime before we begin a commit?h]hBWhat is the maximum transaction lifetime before we begin a commit?}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMAhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhMAhj ubj)}(h?``j_commit_timer`` The timer used to wakeup the commit thread. h](j)}(h``j_commit_timer``h]j)}(hjeh]hj_commit_timer}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMHhj_ubj)}(hhh]h)}(h+The timer used to wakeup the commit thread.h]h+The timer used to wakeup the commit thread.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMHhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMHhj ubj)}(h,``j_revoke_lock`` Protect the revoke table. h](j)}(h``j_revoke_lock``h]j)}(hjh]h j_revoke_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMMhjubj)}(hhh]h)}(hProtect the revoke table.h]hProtect the revoke table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhj ubj)}(ha``j_revoke`` The revoke table - maintains the list of revoked blocks in the current transaction. h](j)}(h ``j_revoke``h]j)}(hjh]hj_revoke}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMShjubj)}(hhh]h)}(hSThe revoke table - maintains the list of revoked blocks in the current transaction.h]hSThe revoke table - maintains the list of revoked blocks in the current transaction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMRhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMShj ubj)}(h9``j_revoke_table`` Alternate revoke tables for j_revoke. h](j)}(h``j_revoke_table``h]j)}(hjh]hj_revoke_table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMZhj ubj)}(hhh]h)}(h%Alternate revoke tables for j_revoke.h]h%Alternate revoke tables for j_revoke.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMZhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMZhj ubj)}(h=``j_wbuf`` Array of bhs for jbd2_journal_commit_transaction. h](j)}(h ``j_wbuf``h]j)}(hjJh]hj_wbuf}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhM_hjDubj)}(hhh]h)}(h1Array of bhs for jbd2_journal_commit_transaction.h]h1Array of bhs for jbd2_journal_commit_transaction.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM_hj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj_hM_hj ubj)}(h``j_fc_wbuf`` Array of fast commit bhs for fast commit. Accessed only during a fast commit. Currently only process can do fast commit, so this field is not protected by any lock. h](j)}(h ``j_fc_wbuf``h]j)}(hjh]h j_fc_wbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMfhj}ubj)}(hhh]h)}(hArray of fast commit bhs for fast commit. Accessed only during a fast commit. Currently only process can do fast commit, so this field is not protected by any lock.h]hArray of fast commit bhs for fast commit. Accessed only during a fast commit. Currently only process can do fast commit, so this field is not protected by any lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMdhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMfhj ubj)}(h)``j_wbufsize`` Size of **j_wbuf** array. h](j)}(h``j_wbufsize``h]j)}(hjh]h j_wbufsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMkhjubj)}(hhh]h)}(hSize of **j_wbuf** array.h](hSize of }(hjhhhNhNubj))}(h **j_wbuf**h]hj_wbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubh array.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMkhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMkhj ubj)}(h/``j_fc_wbufsize`` Size of **j_fc_wbuf** array. h](j)}(h``j_fc_wbufsize``h]j)}(hjh]h j_fc_wbufsize}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMrhjubj)}(hhh]h)}(hSize of **j_fc_wbuf** array.h](hSize of }(hj!hhhNhNubj))}(h **j_fc_wbuf**h]h j_fc_wbuf}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj!ubh array.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMrhj ubj)}(hf``j_last_sync_writer`` The pid of the last person to run a synchronous operation through the journal. h](j)}(h``j_last_sync_writer``h]j)}(hjSh]hj_last_sync_writer}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMzhjMubj)}(hhh]h)}(hNThe pid of the last person to run a synchronous operation through the journal.h]hNThe pid of the last person to run a synchronous operation through the journal.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMyhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMzhj ubj)}(h}``j_average_commit_time`` The average amount of time in nanoseconds it takes to commit a transaction to disk. [j_state_lock] h](j)}(h``j_average_commit_time``h]j)}(hjh]hj_average_commit_time}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hbThe average amount of time in nanoseconds it takes to commit a transaction to disk. [j_state_lock]h]hbThe average amount of time in nanoseconds it takes to commit a transaction to disk. [j_state_lock]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h``j_min_batch_time`` Minimum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds. h](j)}(h``j_min_batch_time``h]j)}(hjh]hj_min_batch_time}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hMinimum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds.h]hMinimum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h``j_max_batch_time`` Maximum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds. h](j)}(h``j_max_batch_time``h]j)}(hjh]hj_max_batch_time}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hMaximum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds.h]hMaximum time that we should wait for additional filesystem operations to get batched into a synchronous handle in microseconds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hL``j_commit_callback`` This function is called when a transaction is closed. h](j)}(h``j_commit_callback``h]j)}(hj;h]hj_commit_callback}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj5ubj)}(hhh]h)}(h5This function is called when a transaction is closed.h]h5This function is called when a transaction is closed.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMhjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhMhj ubj)}(h``j_submit_inode_data_buffers`` This function is called for all inodes associated with the committing transaction marked with JI_WRITE_DATA flag before we start to write out the transaction to the journal. h](j)}(h``j_submit_inode_data_buffers``h]j)}(hjth]hj_submit_inode_data_buffers}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjnubj)}(hhh]h)}(hThis function is called for all inodes associated with the committing transaction marked with JI_WRITE_DATA flag before we start to write out the transaction to the journal.h]hThis function is called for all inodes associated with the committing transaction marked with JI_WRITE_DATA flag before we start to write out the transaction to the journal.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h``j_finish_inode_data_buffers`` This function is called for all inodes associated with the committing transaction marked with JI_WAIT_DATA flag after we have written the transaction to the journal but before we write out the commit block. h](j)}(h``j_finish_inode_data_buffers``h]j)}(hjh]hj_finish_inode_data_buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hThis function is called for all inodes associated with the committing transaction marked with JI_WAIT_DATA flag after we have written the transaction to the journal but before we write out the commit block.h]hThis function is called for all inodes associated with the committing transaction marked with JI_WAIT_DATA flag after we have written the transaction to the journal but before we write out the commit block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h@``j_history_lock`` Protect the transactions statistics history. h](j)}(h``j_history_lock``h]j)}(hjh]hj_history_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h,Protect the transactions statistics history.h]h,Protect the transactions statistics history.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h@``j_proc_entry`` procfs entry for the jbd statistics directory. h](j)}(h``j_proc_entry``h]j)}(hj!h]h j_proc_entry}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h.procfs entry for the jbd statistics directory.h]h.procfs entry for the jbd statistics directory.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhj ubj)}(h ``j_stats`` Overall statistics. h](j)}(h ``j_stats``h]j)}(hjZh]hj_stats}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjTubj)}(hhh]h)}(hOverall statistics.h]hOverall statistics.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohMhj ubj)}(h.``j_failed_commit`` Failed journal commit ID. h](j)}(h``j_failed_commit``h]j)}(hjh]hj_failed_commit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hFailed journal commit ID.h]hFailed journal commit ID.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hc``j_private`` An opaque pointer to fs-private information. ext3 puts its superblock pointer here. h](j)}(h ``j_private``h]j)}(hjh]h j_private}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hTAn opaque pointer to fs-private information. ext3 puts its superblock pointer here.h]hTAn opaque pointer to fs-private information. ext3 puts its superblock pointer here.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hO``j_csum_seed`` Precomputed journal UUID checksum for seeding other checksums. h](j)}(h``j_csum_seed``h]j)}(hjh]h j_csum_seed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(h>Precomputed journal UUID checksum for seeding other checksums.h]h>Precomputed journal UUID checksum for seeding other checksums.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hX``j_trans_commit_map`` Lockdep entity to track transaction commit dependencies. Handles hold this "lock" for read, when we wait for commit, we acquire the "lock" for writing. This matches the properties of jbd2 journalling where the running transaction has to wait for all handles to be dropped to commit that transaction and also acquiring a handle may require transaction commit to finish. h](j)}(h``j_trans_commit_map``h]j)}(hj?h]hj_trans_commit_map}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhj9ubj)}(hhh]h)}(hXpLockdep entity to track transaction commit dependencies. Handles hold this "lock" for read, when we wait for commit, we acquire the "lock" for writing. This matches the properties of jbd2 journalling where the running transaction has to wait for all handles to be dropped to commit that transaction and also acquiring a handle may require transaction commit to finish.h]hXxLockdep entity to track transaction commit dependencies. Handles hold this “lock” for read, when we wait for commit, we acquire the “lock” for writing. This matches the properties of jbd2 journalling where the running transaction has to wait for all handles to be dropped to commit that transaction and also acquiring a handle may require transaction commit to finish.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjUubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhjThMhj ubj)}(h|``j_fc_cleanup_callback`` Clean-up after fast commit or full commit. JBD2 calls this function after every commit operation. h](j)}(h``j_fc_cleanup_callback``h]j)}(hjyh]hj_fc_cleanup_callback}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjsubj)}(hhh]h)}(haClean-up after fast commit or full commit. JBD2 calls this function after every commit operation.h]haClean-up after fast commit or full commit. JBD2 calls this function after every commit operation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hX``j_fc_replay_callback`` File-system specific function that performs replay of a fast commit. JBD2 calls this function for each fast commit block found in the journal. This function should return JBD2_FC_REPLAY_CONTINUE to indicate that the block was processed correctly and more fast commit replay should continue. Return value of JBD2_FC_REPLAY_STOP indicates the end of replay (no more blocks remaining). A negative return value indicates error. h](j)}(h``j_fc_replay_callback``h]j)}(hjh]hj_fc_replay_callback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hXFile-system specific function that performs replay of a fast commit. JBD2 calls this function for each fast commit block found in the journal. This function should return JBD2_FC_REPLAY_CONTINUE to indicate that the block was processed correctly and more fast commit replay should continue. Return value of JBD2_FC_REPLAY_STOP indicates the end of replay (no more blocks remaining). A negative return value indicates error.h]hXFile-system specific function that performs replay of a fast commit. JBD2 calls this function for each fast commit block found in the journal. This function should return JBD2_FC_REPLAY_CONTINUE to indicate that the block was processed correctly and more fast commit replay should continue. Return value of JBD2_FC_REPLAY_STOP indicates the end of replay (no more blocks remaining). A negative return value indicates error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(hV``j_bmap`` Bmap function that should be used instead of the generic VFS bmap function.h](j)}(h ``j_bmap``h]j)}(hjh]hj_bmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:182: ./include/linux/jbd2.hhMhjubj)}(hhh]h)}(hKBmap function that should be used instead of the generic VFS bmap function.h]hKBmap function that should be used instead of the generic VFS bmap function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjuhhhNhNubeh}(h] structuresah ]h"] structuresah$]h&]uh1hhjVhhhhhKubeh}(h] data-typesah ]h"] data typesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Functionsh]h Functions}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hhhhhKubh)}(hThe functions here are split into two groups those that affect a journal as a whole, and those which are used to manage transactionsh]hThe functions here are split into two groups those that affect a journal as a whole, and those which are used to manage transactions}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj=hhubh)}(hhh](h)}(h Journal Levelh]h Journal Level}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hhhhhKubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j-jbd2_journal_force_commit_nested (C function)"c.jbd2_journal_force_commit_nestedhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h9int jbd2_journal_force_commit_nested (journal_t *journal)h]j)}(h8int jbd2_journal_force_commit_nested(journal_t *journal)h](hdesc_sig_keyword_type)}(hinth]hint}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h jbd2_journal_force_commit_nestedh]j)}(h jbd2_journal_force_commit_nestedh]h jbd2_journal_force_commit_nested}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubhdesc_parameterlist)}(h(journal_t *journal)h]hdesc_parameter)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjYreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjsb"c.jbd2_journal_force_commit_nestedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjubj)}(hjournalh]hjournal}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj~hhhjhMubah}(h]jyah ](jjeh"]h$]h&]jj)jhuh1jhjhMhj{hhubj)}(hhh]h)}(hNForce and wait upon a commit if the calling process is not within transaction.h]hNForce and wait upon a commit if the calling process is not within transaction.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj;hhubah}(h]h ]h"]h$]h&]uh1jhj{hhhjhMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjVj jVj!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` journal to force Returns true if progress was made. **Description** This is used for forcing out undo-protected data which contains bitmaps, when the fs is running out of space.h](h)}(h**Parameters**h]j))}(hj`h]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj^ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjZubj)}(hhh]j)}(hK``journal_t *journal`` journal to force Returns true if progress was made. h](j)}(h``journal_t *journal``h]j)}(hjh]hjournal_t *journal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjyubj)}(hhh]h)}(h3journal to force Returns true if progress was made.h]h3journal to force Returns true if progress was made.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubh)}(h**Description**h]j))}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjZubh)}(hmThis is used for forcing out undo-protected data which contains bitmaps, when the fs is running out of space.h]hmThis is used for forcing out undo-protected data which contains bitmaps, when the fs is running out of space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&jbd2_journal_force_commit (C function)c.jbd2_journal_force_commithNtauh1jhj\hhhNhNubj)}(hhh](j)}(h2int jbd2_journal_force_commit (journal_t *journal)h]j)}(h1int jbd2_journal_force_commit(journal_t *journal)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM*ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hM*ubj)}(hjbd2_journal_force_commith]j)}(hjbd2_journal_force_commith]hjbd2_journal_force_commit}(hj! hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj hM*ubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj@ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj= ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjB modnameN classnameNjj)}j]j)}jj# sbc.jbd2_journal_force_commitasbuh1hhj9 ubj)}(h h]h }(hj` hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9 ubj)}(hjh]h*}(hjn hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9 ubj)}(hjournalh]hjournal}(hj{ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9 ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj5 ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hM*ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hM*ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hM*hjhhubj)}(hhh]h)}(h"force any uncommitted transactionsh]h"force any uncommitted transactions}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM$hj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hM*ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj j j j!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` journal to force **Description** Caller want unconditional commit. We can only force the running transaction if we don't have an active handle, otherwise, we will deadlock.h](h)}(h**Parameters**h]j))}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM(hj ubj)}(hhh]j)}(h(``journal_t *journal`` journal to force h](j)}(h``journal_t *journal``h]j)}(hj h]hjournal_t *journal}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM%hj ubj)}(hhh]h)}(hjournal to forceh]hjournal to force}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM%hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM%hj ubah}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j))}(hj!!h]h Description}(hj#!hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj!ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM'hj ubh)}(hCaller want unconditional commit. We can only force the running transaction if we don't have an active handle, otherwise, we will deadlock.h]hCaller want unconditional commit. We can only force the running transaction if we don’t have an active handle, otherwise, we will deadlock.}(hj7!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM'hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"jbd2_journal_init_dev (C function)c.jbd2_journal_init_devhNtauh1jhj\hhhNhNubj)}(hhh](j)}(hjournal_t * jbd2_journal_init_dev (struct block_device *bdev, struct block_device *fs_dev, unsigned long long start, int len, int blocksize)h]j)}(hjournal_t *jbd2_journal_init_dev(struct block_device *bdev, struct block_device *fs_dev, unsigned long long start, int len, int blocksize)h](h)}(hhh]j)}(h journal_th]h journal_t}(hji!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf!ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjk!modnameN classnameNjj)}j]j)}jjbd2_journal_init_devsbc.jbd2_journal_init_devasbuh1hhjb!hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMkubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb!hhhj!hMkubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb!hhhj!hMkubj)}(hjbd2_journal_init_devh]j)}(hj!h]hjbd2_journal_init_dev}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjb!hhhj!hMkubj)}(hj(struct block_device *bdev, struct block_device *fs_dev, unsigned long long start, int len, int blocksize)h](j)}(hstruct block_device *bdevh](j)}(hjBh]hstruct}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubh)}(hhh]j)}(h block_deviceh]h block_device}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj!modnameN classnameNjj)}j]j!c.jbd2_journal_init_devasbuh1hhj!ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hbdevh]hbdev}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(hstruct block_device *fs_devh](j)}(hjBh]hstruct}(hj5"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1"ubj)}(h h]h }(hjB"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1"ubh)}(hhh]j)}(h block_deviceh]h block_device}(hjS"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP"ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjU"modnameN classnameNjj)}j]j!c.jbd2_journal_init_devasbuh1hhj1"ubj)}(h h]h }(hjq"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1"ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1"ubj)}(hfs_devh]hfs_dev}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(hunsigned long long starth](j)}(hunsignedh]hunsigned}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hlongh]hlong}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hlongh]hlong}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hstarth]hstart}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(hint lenh](j)}(hinth]hint}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hj #hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hlenh]hlen}(hj.#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubj)}(h int blocksizeh](j)}(hinth]hint}(hjG#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC#ubj)}(h h]h }(hjU#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC#ubj)}(h blocksizeh]h blocksize}(hjc#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC#ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj!ubeh}(h]h ]h"]h$]h&]jjuh1jhjb!hhhj!hMkubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj^!hhhj!hMkubah}(h]jY!ah ](jjeh"]h$]h&]jj)jhuh1jhj!hMkhj[!hhubj)}(hhh]h)}(h+creates and initialises a journal structureh]h+creates and initialises a journal structure}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM^hj#hhubah}(h]h ]h"]h$]h&]uh1jhj[!hhhj!hMkubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj#j j#j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``struct block_device *bdev`` Block device on which to create the journal ``struct block_device *fs_dev`` Device which hold journalled filesystem for this journal. ``unsigned long long start`` Block nr Start of journal. ``int len`` Length of the journal in blocks. ``int blocksize`` blocksize of journalling device **Return** a newly created journal_t * jbd2_journal_init_dev creates a journal which maps a fixed contiguous range of blocks on an arbitrary block device.h](h)}(h**Parameters**h]j))}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj#ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMbhj#ubj)}(hhh](j)}(hJ``struct block_device *bdev`` Block device on which to create the journal h](j)}(h``struct block_device *bdev``h]j)}(hj#h]hstruct block_device *bdev}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM_hj#ubj)}(hhh]h)}(h+Block device on which to create the journalh]h+Block device on which to create the journal}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM_hj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hM_hj#ubj)}(hZ``struct block_device *fs_dev`` Device which hold journalled filesystem for this journal. h](j)}(h``struct block_device *fs_dev``h]j)}(hj$h]hstruct block_device *fs_dev}(hj $hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM`hj$ubj)}(hhh]h)}(h9Device which hold journalled filesystem for this journal.h]h9Device which hold journalled filesystem for this journal.}(hj $hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hM`hj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hM`hj#ubj)}(h8``unsigned long long start`` Block nr Start of journal. h](j)}(h``unsigned long long start``h]j)}(hj@$h]hunsigned long long start}(hjB$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>$ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMahj:$ubj)}(hhh]h)}(hBlock nr Start of journal.h]hBlock nr Start of journal.}(hjY$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU$hMahjV$ubah}(h]h ]h"]h$]h&]uh1jhj:$ubeh}(h]h ]h"]h$]h&]uh1jhjU$hMahj#ubj)}(h-``int len`` Length of the journal in blocks. h](j)}(h ``int len``h]j)}(hjy$h]hint len}(hj{$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw$ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMbhjs$ubj)}(hhh]h)}(h Length of the journal in blocks.h]h Length of the journal in blocks.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMbhj$ubah}(h]h ]h"]h$]h&]uh1jhjs$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMbhj#ubj)}(h2``int blocksize`` blocksize of journalling device h](j)}(h``int blocksize``h]j)}(hj$h]h int blocksize}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMchj$ubj)}(hhh]h)}(hblocksize of journalling deviceh]hblocksize of journalling device}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMchj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMchj#ubeh}(h]h ]h"]h$]h&]uh1jhj#ubh)}(h **Return**h]j))}(hj$h]hReturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj$ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMehj#ubh)}(ha newly created journal_t *h]ha newly created journal_t *}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMehj#ubh block_quote)}(hsjbd2_journal_init_dev creates a journal which maps a fixed contiguous range of blocks on an arbitrary block device.h]h)}(hsjbd2_journal_init_dev creates a journal which maps a fixed contiguous range of blocks on an arbitrary block device.h]hsjbd2_journal_init_dev creates a journal which maps a fixed contiguous range of blocks on an arbitrary block device.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMghj%ubah}(h]h ]h"]h$]h&]uh1j%hj&%hMghj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$jbd2_journal_init_inode (C function)c.jbd2_journal_init_inodehNtauh1jhj\hhhNhNubj)}(hhh](j)}(h9journal_t * jbd2_journal_init_inode (struct inode *inode)h]j)}(h7journal_t *jbd2_journal_init_inode(struct inode *inode)h](h)}(hhh]j)}(h journal_th]h journal_t}(hjP%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM%ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjR%modnameN classnameNjj)}j]j)}jjbd2_journal_init_inodesbc.jbd2_journal_init_inodeasbuh1hhjI%hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hjr%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI%hhhjq%hMubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI%hhhjq%hMubj)}(hjbd2_journal_init_inodeh]j)}(hjn%h]hjbd2_journal_init_inode}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjI%hhhjq%hMubj)}(h(struct inode *inode)h]j)}(hstruct inode *inodeh](j)}(hjBh]hstruct}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hhh]j)}(hinodeh]hinode}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj%modnameN classnameNjj)}j]jl%c.jbd2_journal_init_inodeasbuh1hhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hinodeh]hinode}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj%ubah}(h]h ]h"]h$]h&]jjuh1jhjI%hhhjq%hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjE%hhhjq%hMubah}(h]j@%ah ](jjeh"]h$]h&]jj)jhuh1jhjq%hMhjB%hhubj)}(hhh]h)}(h(creates a journal which maps to a inode.h]h(creates a journal which maps to a inode.}(hj-&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM~hj*&hhubah}(h]h ]h"]h$]h&]uh1jhjB%hhhjq%hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjE&j jE&j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``struct inode *inode`` An inode to create the journal in **Description** jbd2_journal_init_inode creates a journal which maps an on-disk inode as the journal. The inode must exist already, must support bmap() and must have all data blocks preallocated.h](h)}(h**Parameters**h]j))}(hjO&h]h Parameters}(hjQ&hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjM&ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjI&ubj)}(hhh]j)}(h:``struct inode *inode`` An inode to create the journal in h](j)}(h``struct inode *inode``h]j)}(hjn&h]hstruct inode *inode}(hjp&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl&ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjh&ubj)}(hhh]h)}(h!An inode to create the journal inh]h!An inode to create the journal in}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj&ubah}(h]h ]h"]h$]h&]uh1jhjh&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhje&ubah}(h]h ]h"]h$]h&]uh1jhjI&ubh)}(h**Description**h]j))}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj&ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjI&ubh)}(hjbd2_journal_init_inode creates a journal which maps an on-disk inode as the journal. The inode must exist already, must support bmap() and must have all data blocks preallocated.h]hjbd2_journal_init_inode creates a journal which maps an on-disk inode as the journal. The inode must exist already, must support bmap() and must have all data blocks preallocated.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjI&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)jbd2_journal_update_sb_errno (C function)c.jbd2_journal_update_sb_errnohNtauh1jhj\hhhNhNubj)}(hhh](j)}(h6void jbd2_journal_update_sb_errno (journal_t *journal)h]j)}(h5void jbd2_journal_update_sb_errno(journal_t *journal)h](j)}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhj&hMubj)}(hjbd2_journal_update_sb_errnoh]j)}(hjbd2_journal_update_sb_errnoh]hjbd2_journal_update_sb_errno}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 'ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj&hhhj&hMubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj.'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+'ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj0'modnameN classnameNjj)}j]j)}jj'sbc.jbd2_journal_update_sb_errnoasbuh1hhj''ubj)}(h h]h }(hjN'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj''ubj)}(hjh]h*}(hj\'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj''ubj)}(hjournalh]hjournal}(hji'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj''ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj#'ubah}(h]h ]h"]h$]h&]jjuh1jhj&hhhj&hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj&hhhj&hMubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj&hMhj&hhubj)}(hhh]h)}(hUpdate error in the journal.h]hUpdate error in the journal.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj'hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj&hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj'j j'j!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` The journal to update. **Description** Update a journal's errno. Write updated superblock to disk waiting for IO to complete.h](h)}(h**Parameters**h]j))}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj'ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj'ubj)}(hhh]j)}(h.``journal_t *journal`` The journal to update. h](j)}(h``journal_t *journal``h]j)}(hj'h]hjournal_t *journal}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj'ubj)}(hhh]h)}(hThe journal to update.h]hThe journal to update.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubh)}(h**Description**h]j))}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj (ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj'ubh)}(hWUpdate a journal's errno. Write updated superblock to disk waiting for IO to complete.h]hYUpdate a journal’s errno. Write updated superblock to disk waiting for IO to complete.}(hj%(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_load (C function)c.jbd2_journal_loadhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h*int jbd2_journal_load (journal_t *journal)h]j)}(h)int jbd2_journal_load(journal_t *journal)h](j)}(hinth]hint}(hjT(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP(hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hjc(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP(hhhjb(hMubj)}(hjbd2_journal_loadh]j)}(hjbd2_journal_loadh]hjbd2_journal_load}(hju(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq(ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjP(hhhjb(hMubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj(modnameN classnameNjj)}j]j)}jjw(sbc.jbd2_journal_loadasbuh1hhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hjournalh]hjournal}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj(ubah}(h]h ]h"]h$]h&]jjuh1jhjP(hhhjb(hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjL(hhhjb(hMubah}(h]jG(ah ](jjeh"]h$]h&]jj)jhuh1jhjb(hMhjI(hhubj)}(hhh]h)}(hRead journal from disk.h]hRead journal from disk.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj(hhubah}(h]h ]h"]h$]h&]uh1jhjI(hhhjb(hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj)j j)j!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` Journal to act on. **Description** Given a journal_t structure which tells us which disk blocks contain a journal, read the journal from disk to initialise the in-memory structures.h](h)}(h**Parameters**h]j))}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj)ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj)ubj)}(hhh]j)}(h*``journal_t *journal`` Journal to act on. h](j)}(h``journal_t *journal``h]j)}(hj:)h]hjournal_t *journal}(hj<)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8)ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj4)ubj)}(hhh]h)}(hJournal to act on.h]hJournal to act on.}(hjS)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO)hM hjP)ubah}(h]h ]h"]h$]h&]uh1jhj4)ubeh}(h]h ]h"]h$]h&]uh1jhjO)hM hj1)ubah}(h]h ]h"]h$]h&]uh1jhj)ubh)}(h**Description**h]j))}(hju)h]h Description}(hjw)hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjs)ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj)ubh)}(hGiven a journal_t structure which tells us which disk blocks contain a journal, read the journal from disk to initialise the in-memory structures.h]hGiven a journal_t structure which tells us which disk blocks contain a journal, read the journal from disk to initialise the in-memory structures.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!jbd2_journal_destroy (C function)c.jbd2_journal_destroyhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h-int jbd2_journal_destroy (journal_t *journal)h]j)}(h,int jbd2_journal_destroy(journal_t *journal)h](j)}(hinth]hint}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMFubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhj)hMFubj)}(hjbd2_journal_destroyh]j)}(hjbd2_journal_destroyh]hjbd2_journal_destroy}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj)hhhj)hMFubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj)modnameN classnameNjj)}j]j)}jj)sbc.jbd2_journal_destroyasbuh1hhj)ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjh]h*}(hj(*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjournalh]hjournal}(hj5*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj)ubah}(h]h ]h"]h$]h&]jjuh1jhj)hhhj)hMFubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj)hhhj)hMFubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhj)hMFhj)hhubj)}(hhh]h)}(hRelease a journal_t structure.h]hRelease a journal_t structure.}(hj_*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM?hj\*hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj)hMFubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjw*j jw*j!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` Journal to act on. **Description** Release a journal_t structure once it is no longer in use by the journaled object. Return <0 if we couldn't clean up the journal.h](h)}(h**Parameters**h]j))}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj*ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMChj{*ubj)}(hhh]j)}(h*``journal_t *journal`` Journal to act on. h](j)}(h``journal_t *journal``h]j)}(hj*h]hjournal_t *journal}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM@hj*ubj)}(hhh]h)}(hJournal to act on.h]hJournal to act on.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hM@hj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hM@hj*ubah}(h]h ]h"]h$]h&]uh1jhj{*ubh)}(h**Description**h]j))}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj*ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMBhj{*ubh)}(hRelease a journal_t structure once it is no longer in use by the journaled object. Return <0 if we couldn't clean up the journal.h]hRelease a journal_t structure once it is no longer in use by the journaled object. Return <0 if we couldn’t clean up the journal.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMBhj{*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j-jbd2_journal_check_used_features (C function)"c.jbd2_journal_check_used_featureshNtauh1jhj\hhhNhNubj)}(hhh](j)}(hyint jbd2_journal_check_used_features (journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h]j)}(hxint jbd2_journal_check_used_features(journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h](j)}(hinth]hint}(hj +hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hj/+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhj.+hMubj)}(h jbd2_journal_check_used_featuresh]j)}(h jbd2_journal_check_used_featuresh]h jbd2_journal_check_used_features}(hjA+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=+ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj+hhhj.+hMubj)}(hT(journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj`+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]+ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjb+modnameN classnameNjj)}j]j)}jjC+sb"c.jbd2_journal_check_used_featuresasbuh1hhjY+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY+ubj)}(hjournalh]hjournal}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU+ubj)}(hunsigned long compath](j)}(hunsignedh]hunsigned}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hlongh]hlong}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hcompath]hcompat}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU+ubj)}(hunsigned long roh](j)}(hunsignedh]hunsigned}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hlongh]hlong}(hj!,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj/,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hroh]hro}(hj=,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU+ubj)}(hunsigned long incompath](j)}(hunsignedh]hunsigned}(hjV,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR,ubj)}(h h]h }(hjd,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR,ubj)}(hlongh]hlong}(hjr,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR,ubj)}(hincompath]hincompat}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR,ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjU+ubeh}(h]h ]h"]h$]h&]jjuh1jhj+hhhj.+hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+hhhj.+hMubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1jhj.+hMhj+hhubj)}(hhh]h)}(h%Check if features specified are used.h]h%Check if features specified are used.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj,hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj.+hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj,j j,j!j"j#uh1jhhhj\hNhNubj)}(hXp**Parameters** ``journal_t *journal`` Journal to check. ``unsigned long compat`` bitmask of compatible features ``unsigned long ro`` bitmask of features that force read-only mount ``unsigned long incompat`` bitmask of incompatible features **Description** Check whether the journal uses all of a given set of features. Return true (non-zero) if it does.h](h)}(h**Parameters**h]j))}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj,ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj,ubj)}(hhh](j)}(h)``journal_t *journal`` Journal to check. h](j)}(h``journal_t *journal``h]j)}(hj,h]hjournal_t *journal}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj,ubj)}(hhh]h)}(hJournal to check.h]hJournal to check.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj,ubj)}(h8``unsigned long compat`` bitmask of compatible features h](j)}(h``unsigned long compat``h]j)}(hj2-h]hunsigned long compat}(hj4-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0-ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj,-ubj)}(hhh]h)}(hbitmask of compatible featuresh]hbitmask of compatible features}(hjK-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG-hMhjH-ubah}(h]h ]h"]h$]h&]uh1jhj,-ubeh}(h]h ]h"]h$]h&]uh1jhjG-hMhj,ubj)}(hD``unsigned long ro`` bitmask of features that force read-only mount h](j)}(h``unsigned long ro``h]j)}(hjk-h]hunsigned long ro}(hjm-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji-ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhje-ubj)}(hhh]h)}(h.bitmask of features that force read-only mounth]h.bitmask of features that force read-only mount}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jhje-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj,ubj)}(h<``unsigned long incompat`` bitmask of incompatible features h](j)}(h``unsigned long incompat``h]j)}(hj-h]hunsigned long incompat}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj-ubj)}(hhh]h)}(h bitmask of incompatible featuresh]h bitmask of incompatible features}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,ubh)}(h**Description**h]j))}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj-ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj,ubh)}(hbCheck whether the journal uses all of a given set of features. Return true (non-zero) if it does.h]hbCheck whether the journal uses all of a given set of features. Return true (non-zero) if it does.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j2jbd2_journal_check_available_features (C function)'c.jbd2_journal_check_available_featureshNtauh1jhj\hhhNhNubj)}(hhh](j)}(h~int jbd2_journal_check_available_features (journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h]j)}(h}int jbd2_journal_check_available_features(journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h](j)}(hinth]hint}(hj$.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj .hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hj3.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj .hhhj2.hMubj)}(h%jbd2_journal_check_available_featuresh]j)}(h%jbd2_journal_check_available_featuresh]h%jbd2_journal_check_available_features}(hjE.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA.ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj .hhhj2.hMubj)}(hT(journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hjd.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja.ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjf.modnameN classnameNjj)}j]j)}jjG.sb'c.jbd2_journal_check_available_featuresasbuh1hhj].ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj].ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj].ubj)}(hjournalh]hjournal}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj].ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjY.ubj)}(hunsigned long compath](j)}(hunsignedh]hunsigned}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hlongh]hlong}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hcompath]hcompat}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjY.ubj)}(hunsigned long roh](j)}(hunsignedh]hunsigned}(hj /hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hlongh]hlong}(hj%/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(h h]h }(hj3/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hroh]hro}(hjA/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjY.ubj)}(hunsigned long incompath](j)}(hunsignedh]hunsigned}(hjZ/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV/ubj)}(h h]h }(hjh/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV/ubj)}(hlongh]hlong}(hjv/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV/ubj)}(hincompath]hincompat}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV/ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjY.ubeh}(h]h ]h"]h$]h&]jjuh1jhj .hhhj2.hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj.hhhj2.hMubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1jhj2.hMhj.hhubj)}(hhh]h)}(h&Check feature set in journalling layerh]h&Check feature set in journalling layer}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj/hhubah}(h]h ]h"]h$]h&]uh1jhj.hhhj2.hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj/j j/j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``journal_t *journal`` Journal to check. ``unsigned long compat`` bitmask of compatible features ``unsigned long ro`` bitmask of features that force read-only mount ``unsigned long incompat`` bitmask of incompatible features **Description** Check whether the journaling code supports the use of all of a given set of features on this journal. Return trueh](h)}(h**Parameters**h]j))}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj/ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj/ubj)}(hhh](j)}(h)``journal_t *journal`` Journal to check. h](j)}(h``journal_t *journal``h]j)}(hj/h]hjournal_t *journal}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj/ubj)}(hhh]h)}(hJournal to check.h]hJournal to check.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj/ubj)}(h8``unsigned long compat`` bitmask of compatible features h](j)}(h``unsigned long compat``h]j)}(hj60h]hunsigned long compat}(hj80hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj40ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj00ubj)}(hhh]h)}(hbitmask of compatible featuresh]hbitmask of compatible features}(hjO0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK0hMhjL0ubah}(h]h ]h"]h$]h&]uh1jhj00ubeh}(h]h ]h"]h$]h&]uh1jhjK0hMhj/ubj)}(hD``unsigned long ro`` bitmask of features that force read-only mount h](j)}(h``unsigned long ro``h]j)}(hjo0h]hunsigned long ro}(hjq0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm0ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhji0ubj)}(hhh]h)}(h.bitmask of features that force read-only mounth]h.bitmask of features that force read-only mount}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jhji0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj/ubj)}(h<``unsigned long incompat`` bitmask of incompatible features h](j)}(h``unsigned long incompat``h]j)}(hj0h]hunsigned long incompat}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj0ubj)}(hhh]h)}(h bitmask of incompatible featuresh]h bitmask of incompatible features}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/ubh)}(h**Description**h]j))}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj0ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj/ubh)}(hrCheck whether the journaling code supports the use of all of a given set of features on this journal. Return trueh]hrCheck whether the journaling code supports the use of all of a given set of features on this journal. Return true}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&jbd2_journal_set_features (C function)c.jbd2_journal_set_featureshNtauh1jhj\hhhNhNubj)}(hhh](j)}(hrint jbd2_journal_set_features (journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h]j)}(hqint jbd2_journal_set_features(journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h](j)}(hinth]hint}(hj(1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$1hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMubj)}(h h]h }(hj71hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$1hhhj61hMubj)}(hjbd2_journal_set_featuresh]j)}(hjbd2_journal_set_featuresh]hjbd2_journal_set_features}(hjI1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE1ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj$1hhhj61hMubj)}(hT(journal_t *journal, unsigned long compat, unsigned long ro, unsigned long incompat)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hjh1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje1ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjj1modnameN classnameNjj)}j]j)}jjK1sbc.jbd2_journal_set_featuresasbuh1hhja1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja1ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja1ubj)}(hjournalh]hjournal}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]1ubj)}(hunsigned long compath](j)}(hunsignedh]hunsigned}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hlongh]hlong}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hcompath]hcompat}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]1ubj)}(hunsigned long roh](j)}(hunsignedh]hunsigned}(hj 2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubj)}(hlongh]hlong}(hj)2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubj)}(h h]h }(hj72hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubj)}(hroh]hro}(hjE2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]1ubj)}(hunsigned long incompath](j)}(hunsignedh]hunsigned}(hj^2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(h h]h }(hjl2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(hlongh]hlong}(hjz2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(hincompath]hincompat}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]1ubeh}(h]h ]h"]h$]h&]jjuh1jhj$1hhhj61hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj 1hhhj61hMubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj61hMhj1hhubj)}(hhh]h)}(h.Mark a given journal feature in the superblockh]h.Mark a given journal feature in the superblock}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj2hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj61hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj2j j2j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``journal_t *journal`` Journal to act on. ``unsigned long compat`` bitmask of compatible features ``unsigned long ro`` bitmask of features that force read-only mount ``unsigned long incompat`` bitmask of incompatible features **Description** Mark a given journal feature as present on the superblock. Returns true if the requested features could be set.h](h)}(h**Parameters**h]j))}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj2ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj2ubj)}(hhh](j)}(h*``journal_t *journal`` Journal to act on. h](j)}(h``journal_t *journal``h]j)}(hj3h]hjournal_t *journal}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj2ubj)}(hhh]h)}(hJournal to act on.h]hJournal to act on.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj2ubj)}(h8``unsigned long compat`` bitmask of compatible features h](j)}(h``unsigned long compat``h]j)}(hj:3h]hunsigned long compat}(hj<3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj83ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj43ubj)}(hhh]h)}(hbitmask of compatible featuresh]hbitmask of compatible features}(hjS3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO3hMhjP3ubah}(h]h ]h"]h$]h&]uh1jhj43ubeh}(h]h ]h"]h$]h&]uh1jhjO3hMhj2ubj)}(hD``unsigned long ro`` bitmask of features that force read-only mount h](j)}(h``unsigned long ro``h]j)}(hjs3h]hunsigned long ro}(hju3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq3ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhjm3ubj)}(hhh]h)}(h.bitmask of features that force read-only mounth]h.bitmask of features that force read-only mount}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhjm3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj2ubj)}(h<``unsigned long incompat`` bitmask of incompatible features h](j)}(h``unsigned long incompat``h]j)}(hj3h]hunsigned long incompat}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj3ubj)}(hhh]h)}(h bitmask of incompatible featuresh]h bitmask of incompatible features}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2ubh)}(h**Description**h]j))}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj3ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj2ubh)}(hpMark a given journal feature as present on the superblock. Returns true if the requested features could be set.h]hpMark a given journal feature as present on the superblock. Returns true if the requested features could be set.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_flush (C function)c.jbd2_journal_flushhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h?int jbd2_journal_flush (journal_t *journal, unsigned int flags)h]j)}(h>int jbd2_journal_flush(journal_t *journal, unsigned int flags)h](j)}(hinth]hint}(hj,4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(4hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMd ubj)}(h h]h }(hj;4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(4hhhj:4hMd ubj)}(hjbd2_journal_flushh]j)}(hjbd2_journal_flushh]hjbd2_journal_flush}(hjM4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI4ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj(4hhhj:4hMd ubj)}(h((journal_t *journal, unsigned int flags)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hjl4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji4ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjn4modnameN classnameNjj)}j]j)}jjO4sbc.jbd2_journal_flushasbuh1hhje4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje4ubj)}(hjournalh]hjournal}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhja4ubj)}(hunsigned int flagsh](j)}(hunsignedh]hunsigned}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hinth]hint}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hflagsh]hflags}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhja4ubeh}(h]h ]h"]h$]h&]jjuh1jhj(4hhhj:4hMd ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj$4hhhj:4hMd ubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhj:4hMd hj!4hhubj)}(hhh]h)}(h Flush journalh]h Flush journal}(hj"5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMW hj5hhubah}(h]h ]h"]h$]h&]uh1jhj!4hhhj:4hMd ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj:5j j:5j!j"j#uh1jhhhj\hNhNubj)}(hXI**Parameters** ``journal_t *journal`` Journal to act on. ``unsigned int flags`` optional operation on the journal blocks after the flush (see below) **Description** Flush all data for a given journal to disk and empty the journal. Filesystems can use this when remounting readonly to ensure that recovery does not need to happen on remount. Optionally, a discard or zeroout can be issued on the journal blocks after flushing. flags: JBD2_JOURNAL_FLUSH_DISCARD: issues discards for the journal blocks JBD2_JOURNAL_FLUSH_ZEROOUT: issues zeroouts for the journal blocksh](h)}(h**Parameters**h]j))}(hjD5h]h Parameters}(hjF5hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjB5ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM[ hj>5ubj)}(hhh](j)}(h*``journal_t *journal`` Journal to act on. h](j)}(h``journal_t *journal``h]j)}(hjc5h]hjournal_t *journal}(hje5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja5ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMX hj]5ubj)}(hhh]h)}(hJournal to act on.h]hJournal to act on.}(hj|5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx5hMX hjy5ubah}(h]h ]h"]h$]h&]uh1jhj]5ubeh}(h]h ]h"]h$]h&]uh1jhjx5hMX hjZ5ubj)}(h\``unsigned int flags`` optional operation on the journal blocks after the flush (see below) h](j)}(h``unsigned int flags``h]j)}(hj5h]hunsigned int flags}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMY hj5ubj)}(hhh]h)}(hDoptional operation on the journal blocks after the flush (see below)h]hDoptional operation on the journal blocks after the flush (see below)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMY hj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMY hjZ5ubeh}(h]h ]h"]h$]h&]uh1jhj>5ubh)}(h**Description**h]j))}(hj5h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj5ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM[ hj>5ubh)}(hXFlush all data for a given journal to disk and empty the journal. Filesystems can use this when remounting readonly to ensure that recovery does not need to happen on remount. Optionally, a discard or zeroout can be issued on the journal blocks after flushing.h]hXFlush all data for a given journal to disk and empty the journal. Filesystems can use this when remounting readonly to ensure that recovery does not need to happen on remount. Optionally, a discard or zeroout can be issued on the journal blocks after flushing.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM[ hj>5ubj)}(hhh]j)}(hflags: JBD2_JOURNAL_FLUSH_DISCARD: issues discards for the journal blocks JBD2_JOURNAL_FLUSH_ZEROOUT: issues zeroouts for the journal blocksh](j)}(hflags:h]hflags:}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMa hj5ubj)}(hhh]h)}(hJBD2_JOURNAL_FLUSH_DISCARD: issues discards for the journal blocks JBD2_JOURNAL_FLUSH_ZEROOUT: issues zeroouts for the journal blocksh]hJBD2_JOURNAL_FLUSH_DISCARD: issues discards for the journal blocks JBD2_JOURNAL_FLUSH_ZEROOUT: issues zeroouts for the journal blocks}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMa hj6ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj6hMa hj5ubah}(h]h ]h"]h$]h&]uh1jhj>5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_wipe (C function)c.jbd2_journal_wipehNtauh1jhj\hhhNhNubj)}(hhh](j)}(h5int jbd2_journal_wipe (journal_t *journal, int write)h]j)}(h4int jbd2_journal_wipe(journal_t *journal, int write)h](j)}(hinth]hint}(hjU6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ6hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM ubj)}(h h]h }(hjd6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ6hhhjc6hM ubj)}(hjbd2_journal_wipeh]j)}(hjbd2_journal_wipeh]hjbd2_journal_wipe}(hjv6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr6ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjQ6hhhjc6hM ubj)}(h(journal_t *journal, int write)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj6modnameN classnameNjj)}j]j)}jjx6sbc.jbd2_journal_wipeasbuh1hhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjournalh]hjournal}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubj)}(h int writeh](j)}(hinth]hint}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hwriteh]hwrite}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj6ubeh}(h]h ]h"]h$]h&]jjuh1jhjQ6hhhjc6hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjM6hhhjc6hM ubah}(h]jH6ah ](jjeh"]h$]h&]jj)jhuh1jhjc6hM hjJ6hhubj)}(hhh]h)}(hWipe journal contentsh]hWipe journal contents}(hj/7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj,7hhubah}(h]h ]h"]h$]h&]uh1jhjJ6hhhjc6hM ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjG7j jG7j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``journal_t *journal`` Journal to act on. ``int write`` flag (see below) **Description** Wipe out all of the contents of a journal, safely. This will produce a warning if the journal contains any valid recovery information. Must be called between journal_init_*() and jbd2_journal_load(). If 'write' is non-zero, then we wipe out the journal on disk; otherwise we merely suppress recovery.h](h)}(h**Parameters**h]j))}(hjQ7h]h Parameters}(hjS7hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjO7ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hjK7ubj)}(hhh](j)}(h*``journal_t *journal`` Journal to act on. h](j)}(h``journal_t *journal``h]j)}(hjp7h]hjournal_t *journal}(hjr7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn7ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hjj7ubj)}(hhh]h)}(hJournal to act on.h]hJournal to act on.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hM hj7ubah}(h]h ]h"]h$]h&]uh1jhjj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hM hjg7ubj)}(h``int write`` flag (see below) h](j)}(h ``int write``h]j)}(hj7h]h int write}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj7ubj)}(hhh]h)}(hflag (see below)h]hflag (see below)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hM hj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hM hjg7ubeh}(h]h ]h"]h$]h&]uh1jhjK7ubh)}(h**Description**h]j))}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj7ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hjK7ubh)}(hWipe out all of the contents of a journal, safely. This will produce a warning if the journal contains any valid recovery information. Must be called between journal_init_*() and jbd2_journal_load().h]hWipe out all of the contents of a journal, safely. This will produce a warning if the journal contains any valid recovery information. Must be called between journal_init_*() and jbd2_journal_load().}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hjK7ubh)}(hdIf 'write' is non-zero, then we wipe out the journal on disk; otherwise we merely suppress recovery.h]hhIf ‘write’ is non-zero, then we wipe out the journal on disk; otherwise we merely suppress recovery.}(hj 8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hjK7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_abort (C function)c.jbd2_journal_aborthNtauh1jhj\hhhNhNubj)}(hhh](j)}(h7void jbd2_journal_abort (journal_t *journal, int errno)h]j)}(h6void jbd2_journal_abort(journal_t *journal, int errno)h](j)}(hvoidh]hvoid}(hj88hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj48hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM ubj)}(h h]h }(hjG8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj48hhhjF8hM ubj)}(hjbd2_journal_aborth]j)}(hjbd2_journal_aborth]hjbd2_journal_abort}(hjY8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU8ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj48hhhjF8hM ubj)}(h(journal_t *journal, int errno)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hjx8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju8ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjz8modnameN classnameNjj)}j]j)}jj[8sbc.jbd2_journal_abortasbuh1hhjq8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq8ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq8ubj)}(hjournalh]hjournal}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjm8ubj)}(h int errnoh](j)}(hinth]hint}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(herrnoh]herrno}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjm8ubeh}(h]h ]h"]h$]h&]jjuh1jhj48hhhjF8hM ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj08hhhjF8hM ubah}(h]j+8ah ](jjeh"]h$]h&]jj)jhuh1jhjF8hM hj-8hhubj)}(hhh]h)}(h!Shutdown the journal immediately.h]h!Shutdown the journal immediately.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj9hhubah}(h]h ]h"]h$]h&]uh1jhj-8hhhjF8hM ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj*9j j*9j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``journal_t *journal`` the journal to shutdown. ``int errno`` an error number to record in the journal indicating the reason for the shutdown. **Description** Perform a complete, immediate shutdown of the ENTIRE journal (not of a single transaction). This operation cannot be undone without closing and reopening the journal. The jbd2_journal_abort function is intended to support higher level error recovery mechanisms such as the ext2/ext3 remount-readonly error mode. Journal abort has very specific semantics. Any existing dirty, unjournaled buffers in the main filesystem will still be written to disk by bdflush, but the journaling mechanism will be suspended immediately and no further transaction commits will be honoured. Any dirty, journaled buffers will be written back to disk without hitting the journal. Atomicity cannot be guaranteed on an aborted filesystem, but we _do_ attempt to leave as much data as possible behind for fsck to use for cleanup. Any attempt to get a new transaction handle on a journal which is in ABORT state will just result in an -EROFS error return. A jbd2_journal_stop on an existing handle will return -EIO if we have entered abort state during the update. Recursive transactions are not disturbed by journal abort until the final jbd2_journal_stop, which will receive the -EIO error. Finally, the jbd2_journal_abort call allows the caller to supply an errno which will be recorded (if possible) in the journal superblock. This allows a client to record failure conditions in the middle of a transaction without having to complete the transaction to record the failure to disk. ext3_error, for example, now uses this functionality.h](h)}(h**Parameters**h]j))}(hj49h]h Parameters}(hj69hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj29ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubj)}(hhh](j)}(h0``journal_t *journal`` the journal to shutdown. h](j)}(h``journal_t *journal``h]j)}(hjS9h]hjournal_t *journal}(hjU9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ9ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hjM9ubj)}(hhh]h)}(hthe journal to shutdown.h]hthe journal to shutdown.}(hjl9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh9hM hji9ubah}(h]h ]h"]h$]h&]uh1jhjM9ubeh}(h]h ]h"]h$]h&]uh1jhjh9hM hjJ9ubj)}(h_``int errno`` an error number to record in the journal indicating the reason for the shutdown. h](j)}(h ``int errno``h]j)}(hj9h]h int errno}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj9ubj)}(hhh]h)}(hPan error number to record in the journal indicating the reason for the shutdown.h]hPan error number to record in the journal indicating the reason for the shutdown.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM hjJ9ubeh}(h]h ]h"]h$]h&]uh1jhj.9ubh)}(h**Description**h]j))}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj9ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hPerform a complete, immediate shutdown of the ENTIRE journal (not of a single transaction). This operation cannot be undone without closing and reopening the journal.h]hPerform a complete, immediate shutdown of the ENTIRE journal (not of a single transaction). This operation cannot be undone without closing and reopening the journal.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hThe jbd2_journal_abort function is intended to support higher level error recovery mechanisms such as the ext2/ext3 remount-readonly error mode.h]hThe jbd2_journal_abort function is intended to support higher level error recovery mechanisms such as the ext2/ext3 remount-readonly error mode.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hXJournal abort has very specific semantics. Any existing dirty, unjournaled buffers in the main filesystem will still be written to disk by bdflush, but the journaling mechanism will be suspended immediately and no further transaction commits will be honoured.h]hXJournal abort has very specific semantics. Any existing dirty, unjournaled buffers in the main filesystem will still be written to disk by bdflush, but the journaling mechanism will be suspended immediately and no further transaction commits will be honoured.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hAny dirty, journaled buffers will be written back to disk without hitting the journal. Atomicity cannot be guaranteed on an aborted filesystem, but we _do_ attempt to leave as much data as possible behind for fsck to use for cleanup.h]hAny dirty, journaled buffers will be written back to disk without hitting the journal. Atomicity cannot be guaranteed on an aborted filesystem, but we _do_ attempt to leave as much data as possible behind for fsck to use for cleanup.}(hj :hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hAny attempt to get a new transaction handle on a journal which is in ABORT state will just result in an -EROFS error return. A jbd2_journal_stop on an existing handle will return -EIO if we have entered abort state during the update.h]hAny attempt to get a new transaction handle on a journal which is in ABORT state will just result in an -EROFS error return. A jbd2_journal_stop on an existing handle will return -EIO if we have entered abort state during the update.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hRecursive transactions are not disturbed by journal abort until the final jbd2_journal_stop, which will receive the -EIO error.h]hRecursive transactions are not disturbed by journal abort until the final jbd2_journal_stop, which will receive the -EIO error.}(hj):hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubh)}(hX\Finally, the jbd2_journal_abort call allows the caller to supply an errno which will be recorded (if possible) in the journal superblock. This allows a client to record failure conditions in the middle of a transaction without having to complete the transaction to record the failure to disk. ext3_error, for example, now uses this functionality.h]hX\Finally, the jbd2_journal_abort call allows the caller to supply an errno which will be recorded (if possible) in the journal superblock. This allows a client to record failure conditions in the middle of a transaction without having to complete the transaction to record the failure to disk. ext3_error, for example, now uses this functionality.}(hj8:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM hj.9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_errno (C function)c.jbd2_journal_errnohNtauh1jhj\hhhNhNubj)}(hhh](j)}(h+int jbd2_journal_errno (journal_t *journal)h]j)}(h*int jbd2_journal_errno(journal_t *journal)h](j)}(hinth]hint}(hjg:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc:hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM4 ubj)}(h h]h }(hjv:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc:hhhju:hM4 ubj)}(hjbd2_journal_errnoh]j)}(hjbd2_journal_errnoh]hjbd2_journal_errno}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjc:hhhju:hM4 ubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj:modnameN classnameNjj)}j]j)}jj:sbc.jbd2_journal_errnoasbuh1hhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hjournalh]hjournal}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj:ubah}(h]h ]h"]h$]h&]jjuh1jhjc:hhhju:hM4 ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_:hhhju:hM4 ubah}(h]jZ:ah ](jjeh"]h$]h&]jj)jhuh1jhju:hM4 hj\:hhubj)}(hhh]h)}(h"returns the journal's error state.h]h$returns the journal’s error state.}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM* hj ;hhubah}(h]h ]h"]h$]h&]uh1jhj\:hhhju:hM4 ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj$;j j$;j!j"j#uh1jhhhj\hNhNubj)}(hX<**Parameters** ``journal_t *journal`` journal to examine. **Description** This is the errno number set with jbd2_journal_abort(), the last time the journal was mounted - if the journal was stopped without calling abort this will be 0. If the journal has been aborted on this mount time -EROFS will be returned.h](h)}(h**Parameters**h]j))}(hj.;h]h Parameters}(hj0;hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj,;ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM. hj(;ubj)}(hhh]j)}(h+``journal_t *journal`` journal to examine. h](j)}(h``journal_t *journal``h]j)}(hjM;h]hjournal_t *journal}(hjO;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK;ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM+ hjG;ubj)}(hhh]h)}(hjournal to examine.h]hjournal to examine.}(hjf;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb;hM+ hjc;ubah}(h]h ]h"]h$]h&]uh1jhjG;ubeh}(h]h ]h"]h$]h&]uh1jhjb;hM+ hjD;ubah}(h]h ]h"]h$]h&]uh1jhj(;ubh)}(h**Description**h]j))}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj;ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM- hj(;ubh)}(hThis is the errno number set with jbd2_journal_abort(), the last time the journal was mounted - if the journal was stopped without calling abort this will be 0.h]hThis is the errno number set with jbd2_journal_abort(), the last time the journal was mounted - if the journal was stopped without calling abort this will be 0.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM- hj(;ubh)}(hKIf the journal has been aborted on this mount time -EROFS will be returned.h]hKIf the journal has been aborted on this mount time -EROFS will be returned.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM1 hj(;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#jbd2_journal_clear_err (C function)c.jbd2_journal_clear_errhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h/int jbd2_journal_clear_err (journal_t *journal)h]j)}(h.int jbd2_journal_clear_err(journal_t *journal)h](j)}(hinth]hint}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMH ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhj;hMH ubj)}(hjbd2_journal_clear_errh]j)}(hjbd2_journal_clear_errh]hjbd2_journal_clear_err}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj;hhhj;hMH ubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj<modnameN classnameNjj)}j]j)}jj;sbc.jbd2_journal_clear_errasbuh1hhj<ubj)}(h h]h }(hj<<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]h*}(hjJ<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjournalh]hjournal}(hjW<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj<ubah}(h]h ]h"]h$]h&]jjuh1jhj;hhhj;hMH ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj;hhhj;hMH ubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj;hMH hj;hhubj)}(hhh]h)}(h clears the journal's error stateh]h"clears the journal’s error state}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMB hj~<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj;hMH ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj<j j<j!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` journal to act on. **Description** An error must be cleared or acked to take a FS out of readonly mode.h](h)}(h**Parameters**h]j))}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj<ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMF hj<ubj)}(hhh]j)}(h*``journal_t *journal`` journal to act on. h](j)}(h``journal_t *journal``h]j)}(hj<h]hjournal_t *journal}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMC hj<ubj)}(hhh]h)}(hjournal to act on.h]hjournal to act on.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMC hj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMC hj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubh)}(h**Description**h]j))}(hj<h]h Description}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj<ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chME hj<ubh)}(hDAn error must be cleared or acked to take a FS out of readonly mode.h]hDAn error must be cleared or acked to take a FS out of readonly mode.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chME hj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!jbd2_journal_ack_err (C function)c.jbd2_journal_ack_errhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h.void jbd2_journal_ack_err (journal_t *journal)h]j)}(h-void jbd2_journal_ack_err(journal_t *journal)h](j)}(hvoidh]hvoid}(hjB=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>=hhhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chM\ ubj)}(h h]h }(hjQ=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>=hhhjP=hM\ ubj)}(hjbd2_journal_ack_errh]j)}(hjbd2_journal_ack_errh]hjbd2_journal_ack_err}(hjc=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_=ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj>=hhhjP=hM\ ubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj=modnameN classnameNjj)}j]j)}jje=sbc.jbd2_journal_ack_errasbuh1hhj{=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{=ubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{=ubj)}(hjournalh]hjournal}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{=ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjw=ubah}(h]h ]h"]h$]h&]jjuh1jhj>=hhhjP=hM\ ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj:=hhhjP=hM\ ubah}(h]j5=ah ](jjeh"]h$]h&]jj)jhuh1jhjP=hM\ hj7=hhubj)}(hhh]h)}(hAck journal err.h]hAck journal err.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMV hj=hhubah}(h]h ]h"]h$]h&]uh1jhj7=hhhjP=hM\ ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj=j j=j!j"j#uh1jhhhj\hNhNubj)}(h**Parameters** ``journal_t *journal`` journal to act on. **Description** An error must be cleared or acked to take a FS out of readonly mode.h](h)}(h**Parameters**h]j))}(hj >h]h Parameters}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj>ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMZ hj>ubj)}(hhh]j)}(h*``journal_t *journal`` journal to act on. h](j)}(h``journal_t *journal``h]j)}(hj(>h]hjournal_t *journal}(hj*>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&>ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMW hj">ubj)}(hhh]h)}(hjournal to act on.h]hjournal to act on.}(hjA>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=>hMW hj>>ubah}(h]h ]h"]h$]h&]uh1jhj">ubeh}(h]h ]h"]h$]h&]uh1jhj=>hMW hj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubh)}(h**Description**h]j))}(hjc>h]h Description}(hje>hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hja>ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMY hj>ubh)}(hDAn error must be cleared or acked to take a FS out of readonly mode.h]hDAn error must be cleared or acked to take a FS out of readonly mode.}(hjy>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:194: ./fs/jbd2/journal.chMY hj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!jbd2_journal_recover (C function)c.jbd2_journal_recoverhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h-int jbd2_journal_recover (journal_t *journal)h]j)}(h,int jbd2_journal_recover(journal_t *journal)h](j)}(hinth]hint}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhj>hMubj)}(hjbd2_journal_recoverh]j)}(hjbd2_journal_recoverh]hjbd2_journal_recover}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj>hhhj>hMubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj>modnameN classnameNjj)}j]j)}jj>sbc.jbd2_journal_recoverasbuh1hhj>ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hjournalh]hjournal}(hj#?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj>ubah}(h]h ]h"]h$]h&]jjuh1jhj>hhhj>hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj>hhhj>hMubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhj>hMhj>hhubj)}(hhh]h)}(hrecovers a on-disk journalh]hrecovers a on-disk journal}(hjM?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhjJ?hhubah}(h]h ]h"]h$]h&]uh1jhj>hhhj>hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjje?j je?j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``journal_t *journal`` the journal to recover **Description** The primary function for recovering the log contents when mounting a journaled device. Recovery is done in three passes. In the first pass, we look for the end of the log. In the second, we assemble the list of revoke blocks. In the third and final pass, we replay any un-revoked blocks in the log.h](h)}(h**Parameters**h]j))}(hjo?h]h Parameters}(hjq?hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjm?ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhji?ubj)}(hhh]j)}(h.``journal_t *journal`` the journal to recover h](j)}(h``journal_t *journal``h]j)}(hj?h]hjournal_t *journal}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhj?ubj)}(hhh]h)}(hthe journal to recoverh]hthe journal to recover}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jhji?ubh)}(h**Description**h]j))}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj?ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhji?ubh)}(hVThe primary function for recovering the log contents when mounting a journaled device.h]hVThe primary function for recovering the log contents when mounting a journaled device.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhji?ubh)}(hRecovery is done in three passes. In the first pass, we look for the end of the log. In the second, we assemble the list of revoke blocks. In the third and final pass, we replay any un-revoked blocks in the log.h]hRecovery is done in three passes. In the first pass, we look for the end of the log. In the second, we assemble the list of revoke blocks. In the third and final pass, we replay any un-revoked blocks in the log.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhji?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj\hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'jbd2_journal_skip_recovery (C function)c.jbd2_journal_skip_recoveryhNtauh1jhj\hhhNhNubj)}(hhh](j)}(h3int jbd2_journal_skip_recovery (journal_t *journal)h]j)}(h2int jbd2_journal_skip_recovery(journal_t *journal)h](j)}(hinth]hint}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chMhubj)}(h h]h }(hj,@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj+@hMhubj)}(hjbd2_journal_skip_recoveryh]j)}(hjbd2_journal_skip_recoveryh]hjbd2_journal_skip_recovery}(hj>@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:@ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj@hhhj+@hMhubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj]@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ@ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj_@modnameN classnameNjj)}j]j)}jj@@sbc.jbd2_journal_skip_recoveryasbuh1hhjV@ubj)}(h h]h }(hj}@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV@ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV@ubj)}(hjournalh]hjournal}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV@ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjR@ubah}(h]h ]h"]h$]h&]jjuh1jhj@hhhj+@hMhubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@hhhj+@hMhubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1jhj+@hMhhj@hhubj)}(hhh]h)}(h&Start journal and wipe exiting recordsh]h&Start journal and wipe exiting records}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chM\hj@hhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj+@hMhubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj@j j@j!j"j#uh1jhhhj\hNhNubj)}(hX**Parameters** ``journal_t *journal`` journal to startup **Description** Locate any valid recovery information from the journal and set up the journal structures in memory to ignore it (presumably because the caller has evidence that it is out of date). This function doesn't appear to be exported.. We perform one pass over the journal to allow us to tell the user how much recovery information is being erased, and to let us initialise the journal transaction sequence numbers to the next unused ID.h](h)}(h**Parameters**h]j))}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj@ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chM`hj@ubj)}(hhh]j)}(h*``journal_t *journal`` journal to startup h](j)}(h``journal_t *journal``h]j)}(hjAh]hjournal_t *journal}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:197: ./fs/jbd2/recovery.chM]hj@ubj)}(hhh]h)}(hjournal to startuph]hjournal to startup}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhM]hjAubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhjAhM]hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubh)}(h**Description**h]j))}(hj>Ah]h Description}(hj@AhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj 0, we also create another handle with rsv_blocks reserved blocks in the journal. This handle is stored in h_rsv_handle. It is not attached to any particular transaction and thus doesn't block transaction commit. If the caller uses this reserved handle, it has to set h_rsv_handle to NULL as otherwise jbd2_journal_stop() on the parent handle will dispose the reserved one. Reserved handle has to be converted to a normal handle using jbd2_journal_start_reserved() before it can be used. Return a pointer to a newly allocated handle, or an ERR_PTR() value on failure.h](h)}(h**Parameters**h]j))}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjBubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hjBubj)}(hhh](j)}(h8``journal_t *journal`` Journal to start transaction on. h](j)}(h``journal_t *journal``h]j)}(hjBh]hjournal_t *journal}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hjBubj)}(hhh]h)}(h Journal to start transaction on.h]h Journal to start transaction on.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhM hjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjBhM hjBubj)}(h7``int nblocks`` number of block buffer we might modify h](j)}(h``int nblocks``h]j)}(hjCh]h int nblocks}(hj!ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hjCubj)}(hhh]h)}(h&number of block buffer we might modifyh]h&number of block buffer we might modify}(hj8ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ChM hj5Cubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj4ChM hjBubeh}(h]h ]h"]h$]h&]uh1jhjBubh)}(h**Description**h]j))}(hjZCh]h Description}(hj\ChhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjXCubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hjBubh)}(hXWe make sure that the transaction can guarantee at least nblocks of modified buffers in the log. We block until the log can guarantee that much space. Additionally, if rsv_blocks > 0, we also create another handle with rsv_blocks reserved blocks in the journal. This handle is stored in h_rsv_handle. It is not attached to any particular transaction and thus doesn't block transaction commit. If the caller uses this reserved handle, it has to set h_rsv_handle to NULL as otherwise jbd2_journal_stop() on the parent handle will dispose the reserved one. Reserved handle has to be converted to a normal handle using jbd2_journal_start_reserved() before it can be used.h]hXWe make sure that the transaction can guarantee at least nblocks of modified buffers in the log. We block until the log can guarantee that much space. Additionally, if rsv_blocks > 0, we also create another handle with rsv_blocks reserved blocks in the journal. This handle is stored in h_rsv_handle. It is not attached to any particular transaction and thus doesn’t block transaction commit. If the caller uses this reserved handle, it has to set h_rsv_handle to NULL as otherwise jbd2_journal_stop() on the parent handle will dispose the reserved one. Reserved handle has to be converted to a normal handle using jbd2_journal_start_reserved() before it can be used.}(hjpChhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hjBubh)}(hOReturn a pointer to a newly allocated handle, or an ERR_PTR() value on failure.h]hOReturn a pointer to a newly allocated handle, or an ERR_PTR() value on failure.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(jbd2_journal_start_reserved (C function)c.jbd2_journal_start_reservedhNtauh1jhjAhhhNhNubj)}(hhh](j)}(h[int jbd2_journal_start_reserved (handle_t *handle, unsigned int type, unsigned int line_no)h]j)}(hZint jbd2_journal_start_reserved(handle_t *handle, unsigned int type, unsigned int line_no)h](j)}(hinth]hint}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMDubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjChMDubj)}(hjbd2_journal_start_reservedh]j)}(hjbd2_journal_start_reservedh]hjbd2_journal_start_reserved}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jhjChhhjChMDubj)}(h;(handle_t *handle, unsigned int type, unsigned int line_no)h](j)}(hhandle_t *handleh](h)}(hhh]j)}(hhandle_th]hhandle_t}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjCmodnameN classnameNjj)}j]j)}jjCsbc.jbd2_journal_start_reservedasbuh1hhjCubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hhandleh]hhandle}(hj)DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hunsigned int typeh](j)}(hunsignedh]hunsigned}(hjBDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Dubj)}(h h]h }(hjPDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Dubj)}(hinth]hint}(hj^DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Dubj)}(h h]h }(hjlDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Dubj)}(htypeh]htype}(hjzDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Dubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubj)}(hunsigned int line_noh](j)}(hunsignedh]hunsigned}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hinth]hint}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hline_noh]hline_no}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjCubeh}(h]h ]h"]h$]h&]jjuh1jhjChhhjChMDubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjChhhjChMDubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhjChMDhjChhubj)}(hhh]h)}(hstart reserved handleh]hstart reserved handle}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM7hjDhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChMDubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj Ej j Ej!j"j#uh1jhhhjAhNhNubj)}(hXM**Parameters** ``handle_t *handle`` handle to start ``unsigned int type`` for handle statistics ``unsigned int line_no`` for handle statistics **Description** Start handle that has been previously reserved with jbd2_journal_reserve(). This attaches **handle** to the running transaction (or creates one if there's not transaction running). Unlike jbd2_journal_start() this function cannot block on journal commit, checkpointing, or similar stuff. It can block on memory allocation or frozen journal though. Return 0 on success, non-zero on error - handle is freed in that case.h](h)}(h**Parameters**h]j))}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjEubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM;hjEubj)}(hhh](j)}(h%``handle_t *handle`` handle to start h](j)}(h``handle_t *handle``h]j)}(hj6Eh]hhandle_t *handle}(hj8EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4Eubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM8hj0Eubj)}(hhh]h)}(hhandle to starth]hhandle to start}(hjOEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKEhM8hjLEubah}(h]h ]h"]h$]h&]uh1jhj0Eubeh}(h]h ]h"]h$]h&]uh1jhjKEhM8hj-Eubj)}(h,``unsigned int type`` for handle statistics h](j)}(h``unsigned int type``h]j)}(hjoEh]hunsigned int type}(hjqEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmEubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM9hjiEubj)}(hhh]h)}(hfor handle statisticsh]hfor handle statistics}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhM9hjEubah}(h]h ]h"]h$]h&]uh1jhjiEubeh}(h]h ]h"]h$]h&]uh1jhjEhM9hj-Eubj)}(h/``unsigned int line_no`` for handle statistics h](j)}(h``unsigned int line_no``h]j)}(hjEh]hunsigned int line_no}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM:hjEubj)}(hhh]h)}(hfor handle statisticsh]hfor handle statistics}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhM:hjEubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhjEhM:hj-Eubeh}(h]h ]h"]h$]h&]uh1jhjEubh)}(h**Description**h]j))}(hjEh]h Description}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjEubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM<hjEubh)}(hX[Start handle that has been previously reserved with jbd2_journal_reserve(). This attaches **handle** to the running transaction (or creates one if there's not transaction running). Unlike jbd2_journal_start() this function cannot block on journal commit, checkpointing, or similar stuff. It can block on memory allocation or frozen journal though.h](hZStart handle that has been previously reserved with jbd2_journal_reserve(). This attaches }(hjEhhhNhNubj))}(h **handle**h]hhandle}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjEubh to the running transaction (or creates one if there’s not transaction running). Unlike jbd2_journal_start() this function cannot block on journal commit, checkpointing, or similar stuff. It can block on memory allocation or frozen journal though.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM<hjEubh)}(hFReturn 0 on success, non-zero on error - handle is freed in that case.h]hFReturn 0 on success, non-zero on error - handle is freed in that case.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMBhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j jbd2_journal_extend (C function)c.jbd2_journal_extendhNtauh1jhjAhhhNhNubj)}(hhh](j)}(hKint jbd2_journal_extend (handle_t *handle, int nblocks, int revoke_records)h]j)}(hJint jbd2_journal_extend(handle_t *handle, int nblocks, int revoke_records)h](j)}(hinth]hint}(hjIFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEFhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMubj)}(h h]h }(hjXFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEFhhhjWFhMubj)}(hjbd2_journal_extendh]j)}(hjbd2_journal_extendh]hjbd2_journal_extend}(hjjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfFubah}(h]h ](jjeh"]h$]h&]jjuh1jhjEFhhhjWFhMubj)}(h3(handle_t *handle, int nblocks, int revoke_records)h](j)}(hhandle_t *handleh](h)}(hhh]j)}(hhandle_th]hhandle_t}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjFmodnameN classnameNjj)}j]j)}jjlFsbc.jbd2_journal_extendasbuh1hhjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hhandleh]hhandle}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~Fubj)}(h int nblocksh](j)}(hinth]hint}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hnblocksh]hnblocks}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~Fubj)}(hint revoke_recordsh](j)}(hinth]hint}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(h h]h }(hj GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hrevoke_recordsh]hrevoke_records}(hj.GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj~Fubeh}(h]h ]h"]h$]h&]jjuh1jhjEFhhhjWFhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjAFhhhjWFhMubah}(h]jFhhubj)}(hhh]h)}(hextend buffer credits.h]hextend buffer credits.}(hjXGhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMmhjUGhhubah}(h]h ]h"]h$]h&]uh1jhj>FhhhjWFhMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjpGj jpGj!j"j#uh1jhhhjAhNhNubj)}(hX**Parameters** ``handle_t *handle`` handle to 'extend' ``int nblocks`` nr blocks to try to extend by. ``int revoke_records`` number of revoke records to try to extend by. **Description** Some transactions, such as large extends and truncates, can be done atomically all at once or in several stages. The operation requests a credit for a number of buffer modifications in advance, but can extend its credit if it needs more. jbd2_journal_extend tries to give the running handle more buffer credits. It does not guarantee that allocation - this is a best-effort only. The calling process MUST be able to deal cleanly with a failure to extend here. Return 0 on success, non-zero on failure. return code < 0 implies an error return code > 0 implies normal transaction-full status.h](h)}(h**Parameters**h]j))}(hjzGh]h Parameters}(hj|GhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjxGubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMqhjtGubj)}(hhh](j)}(h(``handle_t *handle`` handle to 'extend' h](j)}(h``handle_t *handle``h]j)}(hjGh]hhandle_t *handle}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMnhjGubj)}(hhh]h)}(hhandle to 'extend'h]hhandle to ‘extend’}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMnhjGubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjGhMnhjGubj)}(h/``int nblocks`` nr blocks to try to extend by. h](j)}(h``int nblocks``h]j)}(hjGh]h int nblocks}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMohjGubj)}(hhh]h)}(hnr blocks to try to extend by.h]hnr blocks to try to extend by.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMohjGubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjGhMohjGubj)}(hE``int revoke_records`` number of revoke records to try to extend by. h](j)}(h``int revoke_records``h]j)}(hj Hh]hint revoke_records}(hj HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Hubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMphjHubj)}(hhh]h)}(h-number of revoke records to try to extend by.h]h-number of revoke records to try to extend by.}(hj$HhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj HhMphj!Hubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhj HhMphjGubeh}(h]h ]h"]h$]h&]uh1jhjtGubh)}(h**Description**h]j))}(hjFHh]h Description}(hjHHhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjDHubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMrhjtGubh)}(hSome transactions, such as large extends and truncates, can be done atomically all at once or in several stages. The operation requests a credit for a number of buffer modifications in advance, but can extend its credit if it needs more.h]hSome transactions, such as large extends and truncates, can be done atomically all at once or in several stages. The operation requests a credit for a number of buffer modifications in advance, but can extend its credit if it needs more.}(hj\HhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMrhjtGubh)}(hjbd2_journal_extend tries to give the running handle more buffer credits. It does not guarantee that allocation - this is a best-effort only. The calling process MUST be able to deal cleanly with a failure to extend here.h]hjbd2_journal_extend tries to give the running handle more buffer credits. It does not guarantee that allocation - this is a best-effort only. The calling process MUST be able to deal cleanly with a failure to extend here.}(hjkHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMwhjtGubh)}(h)Return 0 on success, non-zero on failure.h]h)Return 0 on success, non-zero on failure.}(hjzHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM|hjtGubh)}(hXreturn code < 0 implies an error return code > 0 implies normal transaction-full status.h]hXreturn code < 0 implies an error return code > 0 implies normal transaction-full status.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM~hjtGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"jbd2__journal_restart (C function)c.jbd2__journal_restarthNtauh1jhjAhhhNhNubj)}(hhh](j)}(h]int jbd2__journal_restart (handle_t *handle, int nblocks, int revoke_records, gfp_t gfp_mask)h]j)}(h\int jbd2__journal_restart(handle_t *handle, int nblocks, int revoke_records, gfp_t gfp_mask)h](j)}(hinth]hint}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHhhhjHhMubj)}(hjbd2__journal_restarth]j)}(hjbd2__journal_restarth]hjbd2__journal_restart}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jhjHhhhjHhMubj)}(hC(handle_t *handle, int nblocks, int revoke_records, gfp_t gfp_mask)h](j)}(hhandle_t *handleh](h)}(hhh]j)}(hhandle_th]hhandle_t}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjHmodnameN classnameNjj)}j]j)}jjHsbc.jbd2__journal_restartasbuh1hhjHubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hjh]h*}(hj&IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hhandleh]hhandle}(hj3IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(h int nblocksh](j)}(hinth]hint}(hjLIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHIubj)}(h h]h }(hjZIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHIubj)}(hnblocksh]hnblocks}(hjhIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hint revoke_recordsh](j)}(hinth]hint}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Iubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Iubj)}(hrevoke_recordsh]hrevoke_records}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}Iubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubj)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjImodnameN classnameNjj)}j]jIc.jbd2__journal_restartasbuh1hhjIubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hgfp_maskh]hgfp_mask}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjHubeh}(h]h ]h"]h$]h&]jjuh1jhjHhhhjHhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhjHhMubah}(h]jHah ](jjeh"]h$]h&]jj)jhuh1jhjHhMhjHhhubj)}(hhh]h)}(hrestart a handle .h]hrestart a handle .}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj Jhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjHhMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj'Jj j'Jj!j"j#uh1jhhhjAhNhNubj)}(hX**Parameters** ``handle_t *handle`` handle to restart ``int nblocks`` nr credits requested ``int revoke_records`` number of revoke record credits requested ``gfp_t gfp_mask`` memory allocation flags (for start_this_handle) **Description** Restart a handle for a multi-transaction filesystem operation. If the jbd2_journal_extend() call above fails to grant new buffer credits to a running handle, a call to jbd2_journal_restart will commit the handle's transaction so far and reattach the handle to a new transaction capable of guaranteeing the requested number of credits. We preserve reserved handle if there's any attached to the passed in handle.h](h)}(h**Parameters**h]j))}(hj1Jh]h Parameters}(hj3JhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj/Jubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj+Jubj)}(hhh](j)}(h'``handle_t *handle`` handle to restart h](j)}(h``handle_t *handle``h]j)}(hjPJh]hhandle_t *handle}(hjRJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNJubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjJJubj)}(hhh]h)}(hhandle to restarth]hhandle to restart}(hjiJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjeJhMhjfJubah}(h]h ]h"]h$]h&]uh1jhjJJubeh}(h]h ]h"]h$]h&]uh1jhjeJhMhjGJubj)}(h%``int nblocks`` nr credits requested h](j)}(h``int nblocks``h]j)}(hjJh]h int nblocks}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjJubj)}(hhh]h)}(hnr credits requestedh]hnr credits requested}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjGJubj)}(hA``int revoke_records`` number of revoke record credits requested h](j)}(h``int revoke_records``h]j)}(hjJh]hint revoke_records}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjJubj)}(hhh]h)}(h)number of revoke record credits requestedh]h)number of revoke record credits requested}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjGJubj)}(hC``gfp_t gfp_mask`` memory allocation flags (for start_this_handle) h](j)}(h``gfp_t gfp_mask``h]j)}(hjJh]hgfp_t gfp_mask}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjJubj)}(hhh]h)}(h/memory allocation flags (for start_this_handle)h]h/memory allocation flags (for start_this_handle)}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMhjKubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjKhMhjGJubeh}(h]h ]h"]h$]h&]uh1jhj+Jubh)}(h**Description**h]j))}(hj6Kh]h Description}(hj8KhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj4Kubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj+Jubh)}(h>Restart a handle for a multi-transaction filesystem operation.h]h>Restart a handle for a multi-transaction filesystem operation.}(hjLKhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj+Jubh)}(hX\If the jbd2_journal_extend() call above fails to grant new buffer credits to a running handle, a call to jbd2_journal_restart will commit the handle's transaction so far and reattach the handle to a new transaction capable of guaranteeing the requested number of credits. We preserve reserved handle if there's any attached to the passed in handle.h]hX`If the jbd2_journal_extend() call above fails to grant new buffer credits to a running handle, a call to jbd2_journal_restart will commit the handle’s transaction so far and reattach the handle to a new transaction capable of guaranteeing the requested number of credits. We preserve reserved handle if there’s any attached to the passed in handle.}(hj[KhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj+Jubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&jbd2_journal_lock_updates (C function)c.jbd2_journal_lock_updateshNtauh1jhjAhhhNhNubj)}(hhh](j)}(h3void jbd2_journal_lock_updates (journal_t *journal)h]j)}(h2void jbd2_journal_lock_updates(journal_t *journal)h](j)}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM[ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKhhhjKhM[ubj)}(hjbd2_journal_lock_updatesh]j)}(hjbd2_journal_lock_updatesh]hjbd2_journal_lock_updates}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jjuh1jhjKhhhjKhM[ubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjKmodnameN classnameNjj)}j]j)}jjKsbc.jbd2_journal_lock_updatesasbuh1hhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hjournalh]hjournal}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjKubah}(h]h ]h"]h$]h&]jjuh1jhjKhhhjKhM[ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjKhhhjKhM[ubah}(h]j}Kah ](jjeh"]h$]h&]jj)jhuh1jhjKhM[hjKhhubj)}(hhh]h)}(h establish a transaction barrier.h]h establish a transaction barrier.}(hj/LhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMRhj,Lhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjKhM[ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjGLj jGLj!j"j#uh1jhhhjAhNhNubj)}(hXJ**Parameters** ``journal_t *journal`` Journal to establish a barrier on. **Description** This locks out any further updates from being started, and blocks until all existing updates have completed, returning only once the journal is in a quiescent state with no updates running. The journal lock should not be held on entry.h](h)}(h**Parameters**h]j))}(hjQLh]h Parameters}(hjSLhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjOLubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMVhjKLubj)}(hhh]j)}(h:``journal_t *journal`` Journal to establish a barrier on. h](j)}(h``journal_t *journal``h]j)}(hjpLh]hjournal_t *journal}(hjrLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnLubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMShjjLubj)}(hhh]h)}(h"Journal to establish a barrier on.h]h"Journal to establish a barrier on.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMShjLubah}(h]h ]h"]h$]h&]uh1jhjjLubeh}(h]h ]h"]h$]h&]uh1jhjLhMShjgLubah}(h]h ]h"]h$]h&]uh1jhjKLubh)}(h**Description**h]j))}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjLubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMUhjKLubh)}(hThis locks out any further updates from being started, and blocks until all existing updates have completed, returning only once the journal is in a quiescent state with no updates running.h]hThis locks out any further updates from being started, and blocks until all existing updates have completed, returning only once the journal is in a quiescent state with no updates running.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMUhjKLubh)}(h-The journal lock should not be held on entry.h]h-The journal lock should not be held on entry.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMYhjKLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(jbd2_journal_unlock_updates (C function)c.jbd2_journal_unlock_updateshNtauh1jhjAhhhNhNubj)}(hhh](j)}(h5void jbd2_journal_unlock_updates (journal_t *journal)h]j)}(h4void jbd2_journal_unlock_updates(journal_t *journal)h](j)}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhj MhMubj)}(hjbd2_journal_unlock_updatesh]j)}(hjbd2_journal_unlock_updatesh]hjbd2_journal_unlock_updates}(hj MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1jhjLhhhj MhMubj)}(h(journal_t *journal)h]j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj?MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPh]hReturn}(hj@PhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjhjTubj)}(hhh]h)}(h transactionh]h transaction}(hj:ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ThM>hj7Tubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhj6ThM>hjTubj)}(h*``struct buffer_head *bh`` buffer to undo h](j)}(h``struct buffer_head *bh``h]j)}(hjZTh]hstruct buffer_head *bh}(hj\ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXTubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM?hjTTubj)}(hhh]h)}(hbuffer to undoh]hbuffer to undo}(hjsThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoThM?hjpTubah}(h]h ]h"]h$]h&]uh1jhjTTubeh}(h]h ]h"]h$]h&]uh1jhjoThM?hjTubeh}(h]h ]h"]h$]h&]uh1jhjSubh)}(h**Description**h]j))}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjTubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMAhjSubh)}(hXlSometimes there is a need to distinguish between metadata which has been committed to disk and that which has not. The ext3fs code uses this for freeing and allocating space, we have to make sure that we do not reuse freed space until the deallocation has been committed, since if we overwrote that space we would make the delete un-rewindable in case of a crash.h]hXlSometimes there is a need to distinguish between metadata which has been committed to disk and that which has not. The ext3fs code uses this for freeing and allocating space, we have to make sure that we do not reuse freed space until the deallocation has been committed, since if we overwrote that space we would make the delete un-rewindable in case of a crash.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMAhjSubh)}(hXQTo deal with that, jbd2_journal_get_undo_access requests write access to a buffer for parts of non-rewindable operations such as delete operations on the bitmaps. The journaling code must keep a copy of the buffer's contents prior to the undo_access call until such time as we know that the buffer has definitely been committed to disk.h]hXSTo deal with that, jbd2_journal_get_undo_access requests write access to a buffer for parts of non-rewindable operations such as delete operations on the bitmaps. The journaling code must keep a copy of the buffer’s contents prior to the undo_access call until such time as we know that the buffer has definitely been committed to disk.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMHhjSubh)}(hWe never need to know which transaction the committed data is part of, buffers touched here are guaranteed to be dirtied later and so will be committed to a new transaction in due course, at which point we can discard the old committed data pointer.h]hWe never need to know which transaction the committed data is part of, buffers touched here are guaranteed to be dirtied later and so will be committed to a new transaction in due course, at which point we can discard the old committed data pointer.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMNhjSubh)}(h%Returns error number or 0 on success.h]h%Returns error number or 0 on success.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMShjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&jbd2_journal_set_triggers (C function)c.jbd2_journal_set_triggershNtauh1jhjAhhhNhNubj)}(hhh](j)}(h^void jbd2_journal_set_triggers (struct buffer_head *bh, struct jbd2_buffer_trigger_type *type)h]j)}(h]void jbd2_journal_set_triggers(struct buffer_head *bh, struct jbd2_buffer_trigger_type *type)h](j)}(hvoidh]hvoid}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjUhMubj)}(hjbd2_journal_set_triggersh]j)}(hjbd2_journal_set_triggersh]hjbd2_journal_set_triggers}(hj(UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$Uubah}(h]h ](jjeh"]h$]h&]jjuh1jhjUhhhjUhMubj)}(h?(struct buffer_head *bh, struct jbd2_buffer_trigger_type *type)h](j)}(hstruct buffer_head *bhh](j)}(hjBh]hstruct}(hjDUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Uubj)}(h h]h }(hjQUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Uubh)}(hhh]j)}(h buffer_headh]h buffer_head}(hjbUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_Uubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjdUmodnameN classnameNjj)}j]j)}jj*Usbc.jbd2_journal_set_triggersasbuh1hhj@Uubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Uubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Uubj)}(hbhh]hbh}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Uubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjqXubh)}(h%Returns error number or 0 on success.h]h%Returns error number or 0 on success.}(hjMYhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjqXubh)}(hXSpecial care needs to be taken if the buffer already belongs to the current committing transaction (in which case we should have frozen data present for that commit). In that case, we don't relink the buffer: that only gets done when the old transaction finally completes its commit.h]hXSpecial care needs to be taken if the buffer already belongs to the current committing transaction (in which case we should have frozen data present for that commit). In that case, we don’t relink the buffer: that only gets done when the old transaction finally completes its commit.}(hj\YhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhjqXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j jbd2_journal_forget (C function)c.jbd2_journal_forgethNtauh1jhjAhhhNhNubj)}(hhh](j)}(hBint jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)h]j)}(hAint jbd2_journal_forget(handle_t *handle, struct buffer_head *bh)h](j)}(hinth]hint}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMuubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhjYhMuubj)}(hjbd2_journal_forgeth]j)}(hjbd2_journal_forgeth]hjbd2_journal_forget}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1jhjYhhhjYhMuubj)}(h*(handle_t *handle, struct buffer_head *bh)h](j)}(hhandle_t *handleh](h)}(hhh]j)}(hhandle_th]hhandle_t}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjYmodnameN classnameNjj)}j]j)}jjYsbc.jbd2_journal_forgetasbuh1hhjYubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hhandleh]hhandle}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubj)}(hstruct buffer_head *bhh](j)}(hjBh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(h h]h }(hj,ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubh)}(hhh]j)}(h buffer_headh]h buffer_head}(hj=ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:Zubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj?ZmodnameN classnameNjj)}j]jYc.jbd2_journal_forgetasbuh1hhjZubj)}(h h]h }(hj[ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hjh]h*}(hjiZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hbhh]hbh}(hjvZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1jhjYubeh}(h]h ]h"]h$]h&]jjuh1jhjYhhhjYhMuubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjYhhhjYhMuubah}(h]j~Yah ](jjeh"]h$]h&]jj)jhuh1jhjYhMuhjYhhubj)}(hhh]h)}(h,bforget() for potentially-journaled buffers.h]h,bforget() for potentially-journaled buffers.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMehjZhhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjYhMuubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjZj jZj!j"j#uh1jhhhjAhNhNubj)}(hX**Parameters** ``handle_t *handle`` transaction handle ``struct buffer_head *bh`` bh to 'forget' **Description** We can only do the bforget if there are no commits pending against the buffer. If the buffer is dirty in the current running transaction we can safely unlink it. bh may not be a journalled buffer at all - it may be a non-JBD buffer which came off the hashtable. Check for this. Decrements bh->b_count by one. Allow this call even if the handle has aborted --- it may be part of the caller's cleanup after an abort.h](h)}(h**Parameters**h]j))}(hjZh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjZubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMihjZubj)}(hhh](j)}(h(``handle_t *handle`` transaction handle h](j)}(h``handle_t *handle``h]j)}(hjZh]hhandle_t *handle}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMfhjZubj)}(hhh]h)}(htransaction handleh]htransaction handle}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMfhjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhMfhjZubj)}(h*``struct buffer_head *bh`` bh to 'forget' h](j)}(h``struct buffer_head *bh``h]j)}(hj[h]hstruct buffer_head *bh}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMghj[ubj)}(hhh]h)}(hbh to 'forget'h]hbh to ‘forget’}(hj3[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/[hMghj0[ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhj/[hMghjZubeh}(h]h ]h"]h$]h&]uh1jhjZubh)}(h**Description**h]j))}(hjU[h]h Description}(hjW[hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjS[ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMihjZubh)}(hWe can only do the bforget if there are no commits pending against the buffer. If the buffer is dirty in the current running transaction we can safely unlink it.h]hWe can only do the bforget if there are no commits pending against the buffer. If the buffer is dirty in the current running transaction we can safely unlink it.}(hjk[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMihjZubh)}(htbh may not be a journalled buffer at all - it may be a non-JBD buffer which came off the hashtable. Check for this.h]htbh may not be a journalled buffer at all - it may be a non-JBD buffer which came off the hashtable. Check for this.}(hjz[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMmhjZubh)}(hDecrements bh->b_count by one.h]hDecrements bh->b_count by one.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMphjZubh)}(hiAllow this call even if the handle has aborted --- it may be part of the caller's cleanup after an abort.h]hkAllow this call even if the handle has aborted --- it may be part of the caller’s cleanup after an abort.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMrhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jjbd2_journal_stop (C function)c.jbd2_journal_stophNtauh1jhjAhhhNhNubj)}(hhh](j)}(h(int jbd2_journal_stop (handle_t *handle)h]j)}(h'int jbd2_journal_stop(handle_t *handle)h](j)}(hinth]hint}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[hhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[hhhj[hMubj)}(hjbd2_journal_stoph]j)}(hjbd2_journal_stoph]hjbd2_journal_stop}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj[hhhj[hMubj)}(h(handle_t *handle)h]j)}(hhandle_t *handleh](h)}(hhh]j)}(hhandle_th]hhandle_t}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj \modnameN classnameNjj)}j]j)}jj[sbc.jbd2_journal_stopasbuh1hhj\ubj)}(h h]h }(hj'\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hjh]h*}(hj5\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hhandleh]hhandle}(hjB\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj[ubah}(h]h ]h"]h$]h&]jjuh1jhj[hhhj[hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj[hhhj[hMubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1jhj[hMhj[hhubj)}(hhh]h)}(hcomplete a transactionh]hcomplete a transaction}(hjl\hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hji\hhubah}(h]h ]h"]h$]h&]uh1jhj[hhhj[hMubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjj\j j\j!j"j#uh1jhhhjAhNhNubj)}(hX?**Parameters** ``handle_t *handle`` transaction to complete. **Description** All done for a particular handle. There is not much action needed here. We just return any remaining buffer credits to the transaction and remove the handle. The only complication is that we need to start a commit operation if the filesystem is marked for synchronous update. jbd2_journal_stop itself will not usually return an error, but it may do so in unusual circumstances. In particular, expect it to return -EIO if a jbd2_journal_abort has been executed since the transaction began.h](h)}(h**Parameters**h]j))}(hj\h]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj\ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj\ubj)}(hhh]j)}(h.``handle_t *handle`` transaction to complete. h](j)}(h``handle_t *handle``h]j)}(hj\h]hhandle_t *handle}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj\ubj)}(hhh]h)}(htransaction to complete.h]htransaction to complete.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubh)}(h**Description**h]j))}(hj\h]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj\ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj\ubh)}(h!All done for a particular handle.h]h!All done for a particular handle.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj\ubh)}(hThere is not much action needed here. We just return any remaining buffer credits to the transaction and remove the handle. The only complication is that we need to start a commit operation if the filesystem is marked for synchronous update.h]hThere is not much action needed here. We just return any remaining buffer credits to the transaction and remove the handle. The only complication is that we need to start a commit operation if the filesystem is marked for synchronous update.}(hj ]hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj\ubh)}(hjbd2_journal_stop itself will not usually return an error, but it may do so in unusual circumstances. In particular, expect it to return -EIO if a jbd2_journal_abort has been executed since the transaction began.h]hjbd2_journal_stop itself will not usually return an error, but it may do so in unusual circumstances. In particular, expect it to return -EIO if a jbd2_journal_abort has been executed since the transaction began.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j-jbd2_journal_try_to_free_buffers (C function)"c.jbd2_journal_try_to_free_buffershNtauh1jhjAhhhNhNubj)}(hhh](j)}(hObool jbd2_journal_try_to_free_buffers (journal_t *journal, struct folio *folio)h]j)}(hNbool jbd2_journal_try_to_free_buffers(journal_t *journal, struct folio *folio)h](j)}(hboolh]hbool}(hjK]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG]hhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM@ubj)}(h h]h }(hjZ]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG]hhhjY]hM@ubj)}(h jbd2_journal_try_to_free_buffersh]j)}(h jbd2_journal_try_to_free_buffersh]h jbd2_journal_try_to_free_buffers}(hjl]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh]ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjG]hhhjY]hM@ubj)}(h)(journal_t *journal, struct folio *folio)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj]modnameN classnameNjj)}j]j)}jjn]sb"c.jbd2_journal_try_to_free_buffersasbuh1hhj]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hjournalh]hjournal}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubj)}(hstruct folio *folioh](j)}(hjBh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubh)}(hhh]j)}(hfolioh]hfolio}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj]modnameN classnameNjj)}j]j]"c.jbd2_journal_try_to_free_buffersasbuh1hhj]ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hjh]h*}(hj)^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hfolioh]hfolio}(hj6^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj]ubeh}(h]h ]h"]h$]h&]jjuh1jhjG]hhhjY]hM@ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjC]hhhjY]hM@ubah}(h]j>]ah ](jjeh"]h$]h&]jj)jhuh1jhjY]hM@hj@]hhubj)}(hhh]h)}(htry to free page buffers.h]htry to free page buffers.}(hj`^hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMhj]^hhubah}(h]h ]h"]h$]h&]uh1jhj@]hhhjY]hM@ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjx^j jx^j!j"j#uh1jhhhjAhNhNubj)}(hX**Parameters** ``journal_t *journal`` journal for operation ``struct folio *folio`` Folio to detach data from. **Description** For all the buffers on this page, if they are fully written out ordered data, move them onto BUF_CLEAN so try_to_free_buffers() can reap them. This function returns non-zero if we wish try_to_free_buffers() to be called. We do this if the page is releasable by try_to_free_buffers(). We also do it if the page has locked or dirty buffers and the caller wants us to perform sync or async writeout. This complicates JBD locking somewhat. We aren't protected by the BKL here. We wish to remove the buffer from its committing or running transaction's ->t_datalist via __jbd2_journal_unfile_buffer. This may *change* the value of transaction_t->t_datalist, so anyone who looks at t_datalist needs to lock against this function. Even worse, someone may be doing a jbd2_journal_dirty_data on this buffer. So we need to lock against that. jbd2_journal_dirty_data() will come out of the lock with the buffer dirty, which makes it ineligible for release here. Who else is affected by this? hmm... Really the only contender is do_get_write_access() - it could be looking at the buffer while journal_try_to_free_buffer() is changing its state. But that cannot happen because we never reallocate freed data as metadata while the data is part of a transaction. Yes? Return false on failure, true on successh](h)}(h**Parameters**h]j))}(hj^h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj^ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM#hj|^ubj)}(hhh](j)}(h-``journal_t *journal`` journal for operation h](j)}(h``journal_t *journal``h]j)}(hj^h]hjournal_t *journal}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM hj^ubj)}(hhh]h)}(hjournal for operationh]hjournal for operation}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM hj^ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM hj^ubj)}(h3``struct folio *folio`` Folio to detach data from. h](j)}(h``struct folio *folio``h]j)}(hj^h]hstruct folio *folio}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM!hj^ubj)}(hhh]h)}(hFolio to detach data from.h]hFolio to detach data from.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM!hj^ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM!hj^ubeh}(h]h ]h"]h$]h&]uh1jhj|^ubh)}(h**Description**h]j))}(hj_h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj_ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM#hj|^ubh)}(hFor all the buffers on this page, if they are fully written out ordered data, move them onto BUF_CLEAN so try_to_free_buffers() can reap them.h]hFor all the buffers on this page, if they are fully written out ordered data, move them onto BUF_CLEAN so try_to_free_buffers() can reap them.}(hj+_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM#hj|^ubh)}(hThis function returns non-zero if we wish try_to_free_buffers() to be called. We do this if the page is releasable by try_to_free_buffers(). We also do it if the page has locked or dirty buffers and the caller wants us to perform sync or async writeout.h]hThis function returns non-zero if we wish try_to_free_buffers() to be called. We do this if the page is releasable by try_to_free_buffers(). We also do it if the page has locked or dirty buffers and the caller wants us to perform sync or async writeout.}(hj:_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM'hj|^ubh)}(hThis complicates JBD locking somewhat. We aren't protected by the BKL here. We wish to remove the buffer from its committing or running transaction's ->t_datalist via __jbd2_journal_unfile_buffer.h]hThis complicates JBD locking somewhat. We aren’t protected by the BKL here. We wish to remove the buffer from its committing or running transaction’s ->t_datalist via __jbd2_journal_unfile_buffer.}(hjI_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM,hj|^ubh)}(hThis may *change* the value of transaction_t->t_datalist, so anyone who looks at t_datalist needs to lock against this function.h](h This may }(hjX_hhhNhNubhemphasis)}(h*change*h]hchange}(hjb_hhhNhNubah}(h]h ]h"]h$]h&]uh1j`_hjX_ubho the value of transaction_t->t_datalist, so anyone who looks at t_datalist needs to lock against this function.}(hjX_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM0hj|^ubh)}(hEven worse, someone may be doing a jbd2_journal_dirty_data on this buffer. So we need to lock against that. jbd2_journal_dirty_data() will come out of the lock with the buffer dirty, which makes it ineligible for release here.h]hEven worse, someone may be doing a jbd2_journal_dirty_data on this buffer. So we need to lock against that. jbd2_journal_dirty_data() will come out of the lock with the buffer dirty, which makes it ineligible for release here.}(hj{_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM3hj|^ubh)}(hX1Who else is affected by this? hmm... Really the only contender is do_get_write_access() - it could be looking at the buffer while journal_try_to_free_buffer() is changing its state. But that cannot happen because we never reallocate freed data as metadata while the data is part of a transaction. Yes?h]hX1Who else is affected by this? hmm... Really the only contender is do_get_write_access() - it could be looking at the buffer while journal_try_to_free_buffer() is changing its state. But that cannot happen because we never reallocate freed data as metadata while the data is part of a transaction. Yes?}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM8hj|^ubh)}(h(Return false on failure, true on successh]h(Return false on failure, true on success}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chM>hj|^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*jbd2_journal_invalidate_folio (C function)c.jbd2_journal_invalidate_foliohNtauh1jhjAhhhNhNubj)}(hhh](j)}(hiint jbd2_journal_invalidate_folio (journal_t *journal, struct folio *folio, size_t offset, size_t length)h]j)}(hhint jbd2_journal_invalidate_folio(journal_t *journal, struct folio *folio, size_t offset, size_t length)h](j)}(hinth]hint}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMm ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhj_hMm ubj)}(hjbd2_journal_invalidate_folioh]j)}(hjbd2_journal_invalidate_folioh]hjbd2_journal_invalidate_folio}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj_hhhj_hMm ubj)}(hG(journal_t *journal, struct folio *folio, size_t offset, size_t length)h](j)}(hjournal_t *journalh](h)}(hhh]j)}(h journal_th]h journal_t}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj `modnameN classnameNjj)}j]j)}jj_sbc.jbd2_journal_invalidate_folioasbuh1hhj`ubj)}(h h]h }(hj(`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hjh]h*}(hj6`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hjournalh]hjournal}(hjC`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(hstruct folio *folioh](j)}(hjBh]hstruct}(hj\`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX`ubj)}(h h]h }(hji`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX`ubh)}(hhh]j)}(hfolioh]hfolio}(hjz`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw`ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj|`modnameN classnameNjj)}j]j$`c.jbd2_journal_invalidate_folioasbuh1hhjX`ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX`ubj)}(hjh]h*}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX`ubj)}(hfolioh]hfolio}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(h size_t offseth](h)}(hhh]j)}(hsize_th]hsize_t}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetj`modnameN classnameNjj)}j]j$`c.jbd2_journal_invalidate_folioasbuh1hhj`ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hoffseth]hoffset}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubj)}(h size_t lengthh](h)}(hhh]j)}(hsize_th]hsize_t}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&] refdomainjYreftypej reftargetjamodnameN classnameNjj)}j]j$`c.jbd2_journal_invalidate_folioasbuh1hhjaubj)}(h h]h }(hj5ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hlengthh]hlength}(hjCahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1jhj_ubeh}(h]h ]h"]h$]h&]jjuh1jhj_hhhj_hMm ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj_hhhj_hMm ubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhj_hMm hj_hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj_hhhj_hMm ubeh}(h]h ](jYfunctioneh"]h$]h&]jjYjjvaj jvaj!j"j#uh1jhhhjAhNhNubj)}(hX**Parameters** ``journal_t *journal`` journal to use for flush... ``struct folio *folio`` folio to flush ``size_t offset`` start of the range to invalidate ``size_t length`` length of the range to invalidate **Description** Reap page buffers containing data after in the specified range in page. Can return -EBUSY if buffers are part of the committing transaction and the page is straddling i_size. Caller then has to wait for current commit and try again.h](h)}(h**Parameters**h]j))}(hjah]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j(hj~aubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMe hjzaubj)}(hhh](j)}(h3``journal_t *journal`` journal to use for flush... h](j)}(h``journal_t *journal``h]j)}(hjah]hjournal_t *journal}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMc hjaubj)}(hhh]h)}(hjournal to use for flush...h]hjournal to use for flush...}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMc hjaubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjahMc hjaubj)}(h'``struct folio *folio`` folio to flush h](j)}(h``struct folio *folio``h]j)}(hjah]hstruct folio *folio}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMd hjaubj)}(hhh]h)}(hfolio to flushh]hfolio to flush}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMd hjaubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjahMd hjaubj)}(h3``size_t offset`` start of the range to invalidate h](j)}(h``size_t offset``h]j)}(hjbh]h size_t offset}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMe hj bubj)}(hhh]h)}(h start of the range to invalidateh]h start of the range to invalidate}(hj*bhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&bhMe hj'bubah}(h]h ]h"]h$]h&]uh1jhj bubeh}(h]h ]h"]h$]h&]uh1jhj&bhMe hjaubj)}(h4``size_t length`` length of the range to invalidate h](j)}(h``size_t length``h]j)}(hjJbh]h size_t length}(hjLbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHbubah}(h]h ]h"]h$]h&]uh1jh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMf hjDbubj)}(hhh]h)}(h!length of the range to invalidateh]h!length of the range to invalidate}(hjcbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_bhMf hj`bubah}(h]h ]h"]h$]h&]uh1jhjDbubeh}(h]h ]h"]h$]h&]uh1jhj_bhMf hjaubeh}(h]h ]h"]h$]h&]uh1jhjzaubh)}(h**Description**h]j))}(hjbh]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j(hjbubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMh hjzaubh)}(hReap page buffers containing data after in the specified range in page. Can return -EBUSY if buffers are part of the committing transaction and the page is straddling i_size. Caller then has to wait for current commit and try again.h]hReap page buffers containing data after in the specified range in page. Can return -EBUSY if buffers are part of the committing transaction and the page is straddling i_size. Caller then has to wait for current commit and try again.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/journalling:203: ./fs/jbd2/transaction.chMh hjzaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAhhhNhNubeh}(h]transaction-levelah ]h"]transaction levelah$]h&]uh1hhj=hhhhhKubeh}(h] functionsah ]h"] functionsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSee alsoh]hSee also}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhhhhhKubh)}(h`Journaling the Linux ext2fs Filesystem, LinuxExpo 98, Stephen Tweedie `__h]h reference)}(hjbh]hEJournaling the Linux ext2fs Filesystem, LinuxExpo 98, Stephen Tweedie}(hjbhhhNhNubah}(h]h ]h"]h$]h&]nameEJournaling the Linux ext2fs Filesystem, LinuxExpo 98, Stephen TweedierefuriGhttp://kernel.org/pub/linux/kernel/people/sct/ext3/journal-design.ps.gzuh1jbhjbubah}(h]h ]h"]h$]h&]uh1hhhhKhjbhhubh)}(h`Ext3 Journalling FileSystem, OLS 2000, Dr. Stephen Tweedie `__h]jb)}(hjbh]h:Ext3 Journalling FileSystem, OLS 2000, Dr. Stephen Tweedie}(hjbhhhNhNubah}(h]h ]h"]h$]h&]name:Ext3 Journalling FileSystem, OLS 2000, Dr. Stephen TweediejbFhttp://olstrans.sourceforge.net/release/OLS2000-ext3/OLS2000-ext3.htmluh1jbhjbubah}(h]h ]h"]h$]h&]uh1hhhhKhjbhhubeh}(h]see-alsoah ]h"]see alsoah$]h&]uh1hhhhhhhhKubeh}(h]the-linux-journalling-apiah ]h"]the linux journalling apiah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_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_handlerjj>j@j@jbjAjAjAjCjCj]jC]j_j_j cjbu 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.