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/buffermodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/filesystems/buffermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/filesystems/buffermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/filesystems/buffermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/filesystems/buffermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/filesystems/buffermodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h Buffer Headsh]h Buffer Heads}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh@/var/lib/git/docbuild/linux/Documentation/filesystems/buffer.rsthKubh paragraph)}(hLinux uses buffer heads to maintain state about individual filesystem blocks. Buffer heads are deprecated and new filesystems should use iomap instead.h]hLinux uses buffer heads to maintain state about individual filesystem blocks. Buffer heads are deprecated and new filesystems should use iomap instead.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Functionsh]h Functions}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlebrelse (C function)c.brelsehNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(h$void brelse (struct buffer_head *bh)h]hdesc_signature_line)}(h#void brelse(struct buffer_head *bh)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hhhhhNhNubah}(h]h ]ktah"]h$]h&]uh1hhhhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMCubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1j hhhhhj hMCubh desc_name)}(hbrelseh]h desc_sig_name)}(hbrelseh]hbrelse}(hj%hhhNhNubah}(h]h ]nah"]h$]h&]uh1j#hjubah}(h]h ](sig-namedescnameeh"]h$]h&] xml:spacepreserveuh1jhhhhhj hMCubhdesc_parameterlist)}(h(struct buffer_head *bh)h]hdesc_parameter)}(hstruct buffer_head *bhh](hdesc_sig_keyword)}(hstructh]hstruct}(hjLhhhNhNubah}(h]h ]kah"]h$]h&]uh1jJhjFubj )}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjFubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjlhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjiubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjnmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj'sbc.brelseasbuh1hhjFubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjFubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjFubj$)}(hbhh]hbh}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjFubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj@ubah}(h]h ]h"]h$]h&]j<j=uh1j>hhhhhj hMCubeh}(h]h ]h"]h$]h&]j<j= add_permalinkuh1hsphinx_line_type declaratorhhhhhj hMCubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhj hMChhhhubh desc_content)}(hhh]h)}(hRelease a buffer.h]hRelease a buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhM4hjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhj hMCubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1hhhhhhNhNubh container)}(hX%**Parameters** ``struct buffer_head *bh`` The buffer to release. **Description** Decrement a buffer_head's reference count. If **bh** is NULL, this function is a no-op. If all buffers on a folio have zero reference count, are clean and unlocked, and if the folio is unlocked and not under writeback then try_to_free_buffers() may strip the buffers from the folio in preparation for freeing it (sometimes, rarely, buffers are removed from a folio but it ends up not being freed, and buffers may later be reattached). **Context** Any context.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhM8hj ubhdefinition_list)}(hhh]hdefinition_list_item)}(h2``struct buffer_head *bh`` The buffer to release. h](hterm)}(h``struct buffer_head *bh``h]hliteral)}(hj9h]hstruct buffer_head *bh}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj7ubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhM5hj1ubh definition)}(hhh]h)}(hThe buffer to release.h]hThe buffer to release.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhM5hjSubah}(h]h ]h"]h$]h&]uh1jQhj1ubeh}(h]h ]h"]h$]h&]uh1j/hjPhM5hj,ubah}(h]h ]h"]h$]h&]uh1j*hj ubh)}(h**Description**h]j)}(hjxh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhM7hj ubh)}(hXDecrement a buffer_head's reference count. If **bh** is NULL, this function is a no-op.h](h1Decrement a buffer_head’s reference count. If }(hjhhhNhNubj)}(h**bh**h]hbh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# is NULL, this function is a no-op.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhM7hj ubh)}(hXZIf all buffers on a folio have zero reference count, are clean and unlocked, and if the folio is unlocked and not under writeback then try_to_free_buffers() may strip the buffers from the folio in preparation for freeing it (sometimes, rarely, buffers are removed from a folio but it ends up not being freed, and buffers may later be reattached).h]hXZIf all buffers on a folio have zero reference count, are clean and unlocked, and if the folio is unlocked and not under writeback then try_to_free_buffers() may strip the buffers from the folio in preparation for freeing it (sometimes, rarely, buffers are removed from a folio but it ends up not being freed, and buffers may later be reattached).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhM:hj ubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMAhj ubh)}(h Any context.h]h Any context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMAhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hbforget (C function) c.bforgethNtauh1hhhhhhNhNubh)}(hhh](h)}(h%void bforget (struct buffer_head *bh)h]h)}(h$void bforget(struct buffer_head *bh)h](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMSubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMSubj)}(hbforgeth]j$)}(hbforgeth]hbforget}(hj&hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj"ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMSubj?)}(h(struct buffer_head *bh)h]jE)}(hstruct buffer_head *bhh](jK)}(hjNh]hstruct}(hjBhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj>ubj )}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj>ubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hj`hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjbmodnameN classnameNjj)}j]j)}jj(sb c.bforgetasbuh1hhj>ubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj>ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj$)}(hbhh]hbh}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj>ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj:ubah}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMSubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMSubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMShjhhubj)}(hhh]h)}(h#Discard any dirty data in a buffer.h]h#Discard any dirty data in a buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMJhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMSubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjj uh1hhhhhhNhNubj )}(hX.**Parameters** ``struct buffer_head *bh`` The buffer to forget. **Description** Call this function instead of brelse() if the data written to a buffer no longer needs to be written back. It will clear the buffer's dirty flag so writeback of this buffer will be skipped. **Context** Any context.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMNhjubj+)}(hhh]j0)}(h1``struct buffer_head *bh`` The buffer to forget. h](j6)}(h``struct buffer_head *bh``h]j<)}(hjh]hstruct buffer_head *bh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMKhjubjR)}(hhh]h)}(hThe buffer to forget.h]hThe buffer to forget.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMKhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMKhjubah}(h]h ]h"]h$]h&]uh1j*hjubh)}(h**Description**h]j)}(hjAh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMMhjubh)}(hCall this function instead of brelse() if the data written to a buffer no longer needs to be written back. It will clear the buffer's dirty flag so writeback of this buffer will be skipped.h]hCall this function instead of brelse() if the data written to a buffer no longer needs to be written back. It will clear the buffer’s dirty flag so writeback of this buffer will be skipped.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMMhjubh)}(h **Context**h]j)}(hjhh]hContext}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMQhjubh)}(h Any context.h]h Any context.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMQhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__bread (C function) c.__breadhNtauh1hhhhhhNhNubh)}(hhh](h)}(hWstruct buffer_head * __bread (struct block_device *bdev, sector_t block, unsigned size)h]h)}(hUstruct buffer_head *__bread(struct block_device *bdev, sector_t block, unsigned size)h](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}j__breadsb c.__breadasbuh1hhjhhhjhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h__breadh]j$)}(hjh]h__bread}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMubj?)}(h:(struct block_device *bdev, sector_t block, unsigned size)h](jE)}(hstruct block_device *bdevh](jK)}(hjNh]hstruct}(hj'hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj#ubj )}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubh)}(hhh]j$)}(h block_deviceh]h block_device}(hjEhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjGmodnameN classnameNjj)}j]j c.__breadasbuh1hhj#ubj )}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj$)}(hbdevh]hbdev}(hj~hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj#ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(hsector_t blockh](h)}(hhh]j$)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.__breadasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hblockh]hblock}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(h unsigned sizeh](h)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]h)}(h Read a block.h]h Read a block.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj"hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=jjj uh1hhhhhhNhNubj )}(hX=**Parameters** ``struct block_device *bdev`` The block device to read from. ``sector_t block`` Block number in units of block size. ``unsigned size`` The block size of this device in bytes. **Description** Read a specified block, and return the buffer head that refers to it. The memory is allocated from the movable area so that it can be migrated. The returned buffer head has its refcount increased. The caller should call brelse() when it has finished with the buffer. **Context** May sleep waiting for I/O. **Return** NULL if the block was unreadable.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubj+)}(hhh](j0)}(h=``struct block_device *bdev`` The block device to read from. h](j6)}(h``struct block_device *bdev``h]j<)}(hjfh]hstruct block_device *bdev}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjdubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj`ubjR)}(hhh]h)}(hThe block device to read from.h]hThe block device to read from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj|ubah}(h]h ]h"]h$]h&]uh1jQhj`ubeh}(h]h ]h"]h$]h&]uh1j/hj{hMhj]ubj0)}(h8``sector_t block`` Block number in units of block size. h](j6)}(h``sector_t block``h]j<)}(hjh]hsector_t block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjubjR)}(hhh]h)}(h$Block number in units of block size.h]h$Block number in units of block size.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhj]ubj0)}(h:``unsigned size`` The block size of this device in bytes. h](j6)}(h``unsigned size``h]j<)}(hjh]h unsigned size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjubjR)}(hhh]h)}(h'The block size of this device in bytes.h]h'The block size of this device in bytes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhj]ubeh}(h]h ]h"]h$]h&]uh1j*hjAubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubh)}(hX Read a specified block, and return the buffer head that refers to it. The memory is allocated from the movable area so that it can be migrated. The returned buffer head has its refcount increased. The caller should call brelse() when it has finished with the buffer.h]hX Read a specified block, and return the buffer head that refers to it. The memory is allocated from the movable area so that it can be migrated. The returned buffer head has its refcount increased. The caller should call brelse() when it has finished with the buffer.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubh)}(h **Context**h]j)}(hj:h]hContext}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubh)}(hMay sleep waiting for I/O.h]hMay sleep waiting for I/O.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubh)}(h **Return**h]j)}(hjah]hReturn}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubh)}(h!NULL if the block was unreadable.h]h!NULL if the block was unreadable.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hget_nth_bh (C function) c.get_nth_bhhNtauh1hhhhhhNhNubh)}(hhh](h)}(hLstruct buffer_head * get_nth_bh (struct buffer_head *bh, unsigned int count)h]h)}(hJstruct buffer_head *get_nth_bh(struct buffer_head *bh, unsigned int count)h](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}j get_nth_bhsb c.get_nth_bhasbuh1hhjhhhjhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h get_nth_bhh]j$)}(hjh]h get_nth_bh}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMubj?)}(h,(struct buffer_head *bh, unsigned int count)h](jE)}(hstruct buffer_head *bhh](jK)}(hjNh]hstruct}(hj hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hj>hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj;ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@modnameN classnameNjj)}j]j c.get_nth_bhasbuh1hhjubj )}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hbhh]hbh}(hjwhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(hunsigned int counth](h)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]h)}(h2Get a reference on the n'th buffer after this one.h]h4Get a reference on the n’th buffer after this one.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct buffer_head *bh`` The buffer to start counting from. ``unsigned int count`` How many buffers to skip. **Description** This is primarily useful for finding the nth buffer in a folio; in that case you pass the head buffer and the byte offset in the folio divided by the block size. It can be used for other purposes, but it will wrap at the end of the folio rather than returning NULL or proceeding to the next folio for you. **Return** The requested buffer with an elevated refcount.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj ubj+)}(hhh](j0)}(h>``struct buffer_head *bh`` The buffer to start counting from. h](j6)}(h``struct buffer_head *bh``h]j<)}(hj3 h]hstruct buffer_head *bh}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj1 ubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj- ubjR)}(hhh]h)}(h"The buffer to start counting from.h]h"The buffer to start counting from.}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjH hMhjI ubah}(h]h ]h"]h$]h&]uh1jQhj- ubeh}(h]h ]h"]h$]h&]uh1j/hjH hMhj* ubj0)}(h1``unsigned int count`` How many buffers to skip. h](j6)}(h``unsigned int count``h]j<)}(hjl h]hunsigned int count}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjj ubah}(h]h ]h"]h$]h&]uh1j5h^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhjf ubjR)}(hhh]h)}(hHow many buffers to skip.h]hHow many buffers to skip.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jQhjf ubeh}(h]h ]h"]h$]h&]uh1j/hj hMhj* ubeh}(h]h ]h"]h$]h&]uh1j*hj ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj ubh)}(hX2This is primarily useful for finding the nth buffer in a folio; in that case you pass the head buffer and the byte offset in the folio divided by the block size. It can be used for other purposes, but it will wrap at the end of the folio rather than returning NULL or proceeding to the next folio for you.h]hX2This is primarily useful for finding the nth buffer in a folio; in that case you pass the head buffer and the byte offset in the folio divided by the block size. It can be used for other purposes, but it will wrap at the end of the folio rather than returning NULL or proceeding to the next folio for you.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj ubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj ubh)}(h/The requested buffer with an elevated refcount.h]h/The requested buffer with an elevated refcount.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:10: ./include/linux/buffer_head.hhMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!sync_mapping_buffers (C function)c.sync_mapping_buffershNtauh1hhhhhhNhNubh)}(hhh](h)}(h8int sync_mapping_buffers (struct address_space *mapping)h]h)}(h7int sync_mapping_buffers(struct address_space *mapping)h](h)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMCubj )}(h h]h }(hj" hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj hhhj! hMCubj)}(hsync_mapping_buffersh]j$)}(hsync_mapping_buffersh]hsync_mapping_buffers}(hj4 hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj0 ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhj hhhj! hMCubj?)}(h(struct address_space *mapping)h]jE)}(hstruct address_space *mappingh](jK)}(hjNh]hstruct}(hjP hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjL ubj )}(h h]h }(hj] hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjL ubh)}(hhh]j$)}(h address_spaceh]h address_space}(hjn hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjk ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjp modnameN classnameNjj)}j]j)}jj6 sbc.sync_mapping_buffersasbuh1hhjL ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjL ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL ubj$)}(hmappingh]hmapping}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjL ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjH ubah}(h]h ]h"]h$]h&]j<j=uh1j>hj hhhj! hMCubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhj hhhj! hMCubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj! hMChj hhubj)}(hhh]h)}(h6write out & wait upon a mapping's "associated" buffersh]hi_private_list, and waits upon that I/O. Basically, this is a convenience function for fsync(). **mapping** is a file or directory which needs those buffers to be written for a successful fsync().h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM=hj ubj+)}(hhh]j0)}(hP``struct address_space *mapping`` the mapping which wants those buffers written h](j6)}(h!``struct address_space *mapping``h]j<)}(hj h]hstruct address_space *mapping}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM:hj ubjR)}(hhh]h)}(h-the mapping which wants those buffers writtenh]h-the mapping which wants those buffers written}(hj- hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj) hM:hj* ubah}(h]h ]h"]h$]h&]uh1jQhj ubeh}(h]h ]h"]h$]h&]uh1j/hj) hM:hj ubah}(h]h ]h"]h$]h&]uh1j*hj ubh)}(h**Description**h]j)}(hjO h]h Description}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM<hj ubh)}(hSStarts I/O against the buffers at mapping->i_private_list, and waits upon that I/O.h]hSStarts I/O against the buffers at mapping->i_private_list, and waits upon that I/O.}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM<hj ubh)}(hBasically, this is a convenience function for fsync(). **mapping** is a file or directory which needs those buffers to be written for a successful fsync().h](h7Basically, this is a convenience function for fsync(). }(hjt hhhNhNubj)}(h **mapping**h]hmapping}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt ubhY is a file or directory which needs those buffers to be written for a successful fsync().}(hjt hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM?hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*generic_buffers_fsync_noflush (C function)c.generic_buffers_fsync_noflushhNtauh1hhhhhhNhNubh)}(hhh](h)}(h^int generic_buffers_fsync_noflush (struct file *file, loff_t start, loff_t end, bool datasync)h]h)}(h]int generic_buffers_fsync_noflush(struct file *file, loff_t start, loff_t end, bool datasync)h](h)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM\ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj hhhj hM\ubj)}(hgeneric_buffers_fsync_noflushh]j$)}(hgeneric_buffers_fsync_noflushh]hgeneric_buffers_fsync_noflush}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhj hhhj hM\ubj?)}(h<(struct file *file, loff_t start, loff_t end, bool datasync)h](jE)}(hstruct file *fileh](jK)}(hjNh]hstruct}(hj hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubh)}(hhh]j$)}(hfileh]hfile}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jj sbc.generic_buffers_fsync_noflushasbuh1hhj ubj )}(h h]h }(hj0 hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj)}(hjh]h*}(hj> hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj$)}(hfileh]hfile}(hjK hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj ubjE)}(h loff_t starth](h)}(hhh]j$)}(hloff_th]hloff_t}(hjg hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjd ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetji modnameN classnameNjj)}j]j, c.generic_buffers_fsync_noflushasbuh1hhj` ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj` ubj$)}(hstarth]hstart}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj` ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj ubjE)}(h loff_t endh](h)}(hhh]j$)}(hloff_th]hloff_t}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j, c.generic_buffers_fsync_noflushasbuh1hhj ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj$)}(hendh]hend}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj ubjE)}(h bool datasynch](h)}(hboolh]hbool}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj$)}(hdatasynch]hdatasync}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj ubeh}(h]h ]h"]h$]h&]j<j=uh1j>hj hhhj hM\ubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhj hhhj hM\ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hM\hj hhubj)}(hhh]h)}(hMgeneric buffer fsync implementation for simple filesystems with no inode lockh]hMgeneric buffer fsync implementation for simple filesystems with no inode lock}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMPhj7 hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjR jjR jjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct file *file`` file to synchronize ``loff_t start`` start offset in bytes ``loff_t end`` end offset in bytes (inclusive) ``bool datasync`` only synchronize essential metadata if true **Description** This is a generic implementation of the fsync method for simple filesystems which track all non-inode metadata in the buffers list hanging off the address_space structure.h](h)}(h**Parameters**h]j)}(hj\ h]h Parameters}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMThjV ubj+)}(hhh](j0)}(h*``struct file *file`` file to synchronize h](j6)}(h``struct file *file``h]j<)}(hj{ h]hstruct file *file}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjy ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMShju ubjR)}(hhh]h)}(hfile to synchronizeh]hfile to synchronize}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMShj ubah}(h]h ]h"]h$]h&]uh1jQhju ubeh}(h]h ]h"]h$]h&]uh1j/hj hMShjr ubj0)}(h'``loff_t start`` start offset in bytes h](j6)}(h``loff_t start``h]j<)}(hj h]h loff_t start}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMThj ubjR)}(hhh]h)}(hstart offset in bytesh]hstart offset in bytes}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMThj ubah}(h]h ]h"]h$]h&]uh1jQhj ubeh}(h]h ]h"]h$]h&]uh1j/hj hMThjr ubj0)}(h/``loff_t end`` end offset in bytes (inclusive) h](j6)}(h``loff_t end``h]j<)}(hj h]h loff_t end}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMUhj ubjR)}(hhh]h)}(hend offset in bytes (inclusive)h]hend offset in bytes (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMUhjubah}(h]h ]h"]h$]h&]uh1jQhj ubeh}(h]h ]h"]h$]h&]uh1j/hjhMUhjr ubj0)}(h>``bool datasync`` only synchronize essential metadata if true h](j6)}(h``bool datasync``h]j<)}(hj&h]h bool datasync}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj$ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMVhj ubjR)}(hhh]h)}(h+only synchronize essential metadata if trueh]h+only synchronize essential metadata if true}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMVhj<ubah}(h]h ]h"]h$]h&]uh1jQhj ubeh}(h]h ]h"]h$]h&]uh1j/hj;hMVhjr ubeh}(h]h ]h"]h$]h&]uh1j*hjV ubh)}(h**Description**h]j)}(hjah]h Description}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMXhjV ubh)}(hThis is a generic implementation of the fsync method for simple filesystems which track all non-inode metadata in the buffers list hanging off the address_space structure.h]hThis is a generic implementation of the fsync method for simple filesystems which track all non-inode metadata in the buffers list hanging off the address_space structure.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMXhjV ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"generic_buffers_fsync (C function)c.generic_buffers_fsynchNtauh1hhhhhhNhNubh)}(hhh](h)}(hVint generic_buffers_fsync (struct file *file, loff_t start, loff_t end, bool datasync)h]h)}(hUint generic_buffers_fsync(struct file *file, loff_t start, loff_t end, bool datasync)h](h)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjhhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubj)}(hgeneric_buffers_fsynch]j$)}(hgeneric_buffers_fsynch]hgeneric_buffers_fsync}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMubj?)}(h<(struct file *file, loff_t start, loff_t end, bool datasync)h](jE)}(hstruct file *fileh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.generic_buffers_fsyncasbuh1hhjubj )}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hfileh]hfile}(hj<hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(h loff_t starth](h)}(hhh]j$)}(hloff_th]hloff_t}(hjXhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjUubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjZmodnameN classnameNjj)}j]jc.generic_buffers_fsyncasbuh1hhjQubj )}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjQubj$)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjQubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(h loff_t endh](h)}(hhh]j$)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.generic_buffers_fsyncasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hendh]hend}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(h bool datasynch](h)}(hj h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hdatasynch]hdatasync}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]h)}(hMgeneric buffer fsync implementation for simple filesystems with no inode lockh]hMgeneric buffer fsync implementation for simple filesystems with no inode lock}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM{hj'hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjBjjBjjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct file *file`` file to synchronize ``loff_t start`` start offset in bytes ``loff_t end`` end offset in bytes (inclusive) ``bool datasync`` only synchronize essential metadata if true **Description** This is a generic implementation of the fsync method for simple filesystems which track all non-inode metadata in the buffers list hanging off the address_space structure. This also makes sure that a device cache flush operation is called at the end.h](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjFubj+)}(hhh](j0)}(h*``struct file *file`` file to synchronize h](j6)}(h``struct file *file``h]j<)}(hjkh]hstruct file *file}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjiubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM~hjeubjR)}(hhh]h)}(hfile to synchronizeh]hfile to synchronize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM~hjubah}(h]h ]h"]h$]h&]uh1jQhjeubeh}(h]h ]h"]h$]h&]uh1j/hjhM~hjbubj0)}(h'``loff_t start`` start offset in bytes h](j6)}(h``loff_t start``h]j<)}(hjh]h loff_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(hstart offset in bytesh]hstart offset in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjbubj0)}(h/``loff_t end`` end offset in bytes (inclusive) h](j6)}(h``loff_t end``h]j<)}(hjh]h loff_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(hend offset in bytes (inclusive)h]hend offset in bytes (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjbubj0)}(h>``bool datasync`` only synchronize essential metadata if true h](j6)}(h``bool datasync``h]j<)}(hjh]h bool datasync}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(h+only synchronize essential metadata if trueh]h+only synchronize essential metadata if true}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj,ubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hj+hMhjbubeh}(h]h ]h"]h$]h&]uh1j*hjFubh)}(h**Description**h]j)}(hjQh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjFubh)}(hThis is a generic implementation of the fsync method for simple filesystems which track all non-inode metadata in the buffers list hanging off the address_space structure. This also makes sure that a device cache flush operation is called at the end.h]hThis is a generic implementation of the fsync method for simple filesystems which track all non-inode metadata in the buffers list hanging off the address_space structure. This also makes sure that a device cache flush operation is called at the end.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hblock_dirty_folio (C function)c.block_dirty_foliohNtauh1hhhhhhNhNubh)}(hhh](h)}(hKbool block_dirty_folio (struct address_space *mapping, struct folio *folio)h]h)}(hJbool block_dirty_folio(struct address_space *mapping, struct folio *folio)h](h)}(hj h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjhhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubj)}(hblock_dirty_folioh]j$)}(hblock_dirty_folioh]hblock_dirty_folio}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMubj?)}(h4(struct address_space *mapping, struct folio *folio)h](jE)}(hstruct address_space *mappingh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.block_dirty_folioasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hmappingh]hmapping}(hj+hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(hstruct folio *folioh](jK)}(hjNh]hstruct}(hjDhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj@ubj )}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj@ubh)}(hhh]j$)}(hfolioh]hfolio}(hjbhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj_ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjdmodnameN classnameNjj)}j]j c.block_dirty_folioasbuh1hhj@ubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj@ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj$)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj@ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]h)}(hMark a folio as dirty.h]hMark a folio as dirty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct address_space *mapping`` The address space containing this folio. ``struct folio *folio`` The folio to mark dirty. **Description** Filesystems which use buffer_heads can use this function as their ->dirty_folio implementation. Some filesystems need to do a little work before calling this function. Filesystems which do not use buffer_heads should call filemap_dirty_folio() instead. If the folio has buffers, the uptodate buffers are set dirty, to preserve dirty-state coherency between the folio and the buffers. Buffers added to a dirty folio are created dirty. The buffers are dirtied before the folio is dirtied. There's a small race window in which writeback may see the folio cleanness but not the buffer dirtiness. That's fine. If this code were to set the folio dirty before the buffers, writeback could clear the folio dirty flag, see a bunch of clean buffers and we'd end up with dirty buffers/clean folio on the dirty folio list. We use i_private_lock to lock against try_to_free_buffers() while using the folio's buffer list. This also prevents clean buffers being added to the folio after it was set dirty. **Context** May only be called from process context. Does not sleep. Caller must ensure that **folio** cannot be truncated during this call, typically by holding the folio lock or having a page in the folio mapped and holding the page table lock. **Return** True if the folio was dirtied; false if it was already dirtied.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubj+)}(hhh](j0)}(hK``struct address_space *mapping`` The address space containing this folio. h](j6)}(h!``struct address_space *mapping``h]j<)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(h(The address space containing this folio.h]h(The address space containing this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjubj0)}(h1``struct folio *folio`` The folio to mark dirty. h](j6)}(h``struct folio *folio``h]j<)}(hj?h]hstruct folio *folio}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj=ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj9ubjR)}(hhh]h)}(hThe folio to mark dirty.h]hThe folio to mark dirty.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjUubah}(h]h ]h"]h$]h&]uh1jQhj9ubeh}(h]h ]h"]h$]h&]uh1j/hjThMhjubeh}(h]h ]h"]h$]h&]uh1j*hjubh)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hFilesystems which use buffer_heads can use this function as their ->dirty_folio implementation. Some filesystems need to do a little work before calling this function. Filesystems which do not use buffer_heads should call filemap_dirty_folio() instead.h]hFilesystems which use buffer_heads can use this function as their ->dirty_folio implementation. Some filesystems need to do a little work before calling this function. Filesystems which do not use buffer_heads should call filemap_dirty_folio() instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hIf the folio has buffers, the uptodate buffers are set dirty, to preserve dirty-state coherency between the folio and the buffers. Buffers added to a dirty folio are created dirty.h]hIf the folio has buffers, the uptodate buffers are set dirty, to preserve dirty-state coherency between the folio and the buffers. Buffers added to a dirty folio are created dirty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hX{The buffers are dirtied before the folio is dirtied. There's a small race window in which writeback may see the folio cleanness but not the buffer dirtiness. That's fine. If this code were to set the folio dirty before the buffers, writeback could clear the folio dirty flag, see a bunch of clean buffers and we'd end up with dirty buffers/clean folio on the dirty folio list.h]hXThe buffers are dirtied before the folio is dirtied. There’s a small race window in which writeback may see the folio cleanness but not the buffer dirtiness. That’s fine. If this code were to set the folio dirty before the buffers, writeback could clear the folio dirty flag, see a bunch of clean buffers and we’d end up with dirty buffers/clean folio on the dirty folio list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hWe use i_private_lock to lock against try_to_free_buffers() while using the folio's buffer list. This also prevents clean buffers being added to the folio after it was set dirty.h]hWe use i_private_lock to lock against try_to_free_buffers() while using the folio’s buffer list. This also prevents clean buffers being added to the folio after it was set dirty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hMay only be called from process context. Does not sleep. Caller must ensure that **folio** cannot be truncated during this call, typically by holding the folio lock or having a page in the folio mapped and holding the page table lock.h](hRMay only be called from process context. Does not sleep. Caller must ensure that }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh cannot be truncated during this call, typically by holding the folio lock or having a page in the folio mapped and holding the page table lock.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(h?True if the folio was dirtied; false if it was already dirtied.h]h?True if the folio was dirtied; false if it was already dirtied.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmark_buffer_dirty (C function)c.mark_buffer_dirtyhNtauh1hhhhhhNhNubh)}(hhh](h)}(h/void mark_buffer_dirty (struct buffer_head *bh)h]h)}(h.void mark_buffer_dirty(struct buffer_head *bh)h](h)}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjHhhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hj[hhhNhNubah}(h]h ]Ijah"]h$]h&]uh1j hjHhhhjZhMubj)}(hmark_buffer_dirtyh]j$)}(hmark_buffer_dirtyh]hmark_buffer_dirty}(hjmhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjiubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjHhhhjZhMubj?)}(h(struct buffer_head *bh)h]jE)}(hstruct buffer_head *bhh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjosbc.mark_buffer_dirtyasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hbhh]hbh}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubah}(h]h ]h"]h$]h&]j<j=uh1j>hjHhhhjZhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjDhhhjZhMubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1hhjZhMhjAhhubj)}(hhh]h)}(h&mark a buffer_head as needing writeouth]h&mark a buffer_head as needing writeout}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$jj$jjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct buffer_head *bh`` the buffer_head to mark dirty **Description** mark_buffer_dirty() will set the dirty bit against the buffer, then set its backing page dirty, then tag the page as dirty in the page cache and then attach the address_space's inode to its superblock's dirty inode list. mark_buffer_dirty() is atomic. It takes bh->b_folio->mapping->i_private_lock, i_pages lock and mapping->host->i_lock.h](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj(ubj+)}(hhh]j0)}(h9``struct buffer_head *bh`` the buffer_head to mark dirty h](j6)}(h``struct buffer_head *bh``h]j<)}(hjMh]hstruct buffer_head *bh}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjKubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjGubjR)}(hhh]h)}(hthe buffer_head to mark dirtyh]hthe buffer_head to mark dirty}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjcubah}(h]h ]h"]h$]h&]uh1jQhjGubeh}(h]h ]h"]h$]h&]uh1j/hjbhMhjDubah}(h]h ]h"]h$]h&]uh1j*hj(ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj(ubh)}(hmark_buffer_dirty() will set the dirty bit against the buffer, then set its backing page dirty, then tag the page as dirty in the page cache and then attach the address_space's inode to its superblock's dirty inode list.h]hmark_buffer_dirty() will set the dirty bit against the buffer, then set its backing page dirty, then tag the page as dirty in the page cache and then attach the address_space’s inode to its superblock’s dirty inode list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj(ubh)}(hvmark_buffer_dirty() is atomic. It takes bh->b_folio->mapping->i_private_lock, i_pages lock and mapping->host->i_lock.h]hvmark_buffer_dirty() is atomic. It takes bh->b_folio->mapping->i_private_lock, i_pages lock and mapping->host->i_lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__brelse (C function) c.__brelsehNtauh1hhhhhhNhNubh)}(hhh](h)}(h&void __brelse (struct buffer_head *bh)h]h)}(h%void __brelse(struct buffer_head *bh)h](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjhhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubj)}(h__brelseh]j$)}(h__brelseh]h__brelse}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMubj?)}(h(struct buffer_head *bh)h]jE)}(hstruct buffer_head *bhh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hj7hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj4ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj9modnameN classnameNjj)}j]j)}jjsb c.__brelseasbuh1hhjubj )}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hbhh]hbh}(hjrhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubah}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]h)}(hRelease a buffer.h]hRelease a buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjj uh1hhhhhhNhNubj )}(h**Parameters** ``struct buffer_head *bh`` The buffer to release. **Description** This variant of brelse() can be called if **bh** is guaranteed to not be NULL.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubj+)}(hhh]j0)}(h2``struct buffer_head *bh`` The buffer to release. h](j6)}(h``struct buffer_head *bh``h]j<)}(hjh]hstruct buffer_head *bh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(hThe buffer to release.h]hThe buffer to release.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjubah}(h]h ]h"]h$]h&]uh1j*hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hNThis variant of brelse() can be called if **bh** is guaranteed to not be NULL.h](h*This variant of brelse() can be called if }(hj.hhhNhNubj)}(h**bh**h]hbh}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh is guaranteed to not be NULL.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__bforget (C function) c.__bforgethNtauh1hhhhhhNhNubh)}(hhh](h)}(h'void __bforget (struct buffer_head *bh)h]h)}(h&void __bforget(struct buffer_head *bh)h](h)}(hvoidh]hvoid}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjkhhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjkhhhj}hMubj)}(h __bforgeth]j$)}(h __bforgeth]h __bforget}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjkhhhj}hMubj?)}(h(struct buffer_head *bh)h]jE)}(hstruct buffer_head *bhh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsb c.__bforgetasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hbhh]hbh}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubah}(h]h ]h"]h$]h&]j<j=uh1j>hjkhhhj}hMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjghhhj}hMubah}(h]jbah ](jjeh"]h$]h&]jj)jhuh1hhj}hMhjdhhubj)}(hhh]h)}(h#Discard any dirty data in a buffer.h]h#Discard any dirty data in a buffer.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj,hhubah}(h]h ]h"]h$]h&]uh1jhjdhhhj}hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjGjjGjjj uh1hhhhhhNhNubj )}(h**Parameters** ``struct buffer_head *bh`` The buffer to forget. **Description** This variant of bforget() can be called if **bh** is guaranteed to not be NULL.h](h)}(h**Parameters**h]j)}(hjQh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjKubj+)}(hhh]j0)}(h1``struct buffer_head *bh`` The buffer to forget. h](j6)}(h``struct buffer_head *bh``h]j<)}(hjph]hstruct buffer_head *bh}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjnubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjjubjR)}(hhh]h)}(hThe buffer to forget.h]hThe buffer to forget.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjgubah}(h]h ]h"]h$]h&]uh1j*hjKubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjKubh)}(hOThis variant of bforget() can be called if **bh** is guaranteed to not be NULL.h](h+This variant of bforget() can be called if }(hjhhhNhNubj)}(h**bh**h]hbh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is guaranteed to not be NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hbdev_getblk (C function) c.bdev_getblkhNtauh1hhhhhhNhNubh)}(hhh](h)}(hfstruct buffer_head * bdev_getblk (struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp)h]h)}(hdstruct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp)h](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hj!hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj#modnameN classnameNjj)}j]j)}j bdev_getblksb c.bdev_getblkasbuh1hhjhhhjhMubj )}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhMubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h bdev_getblkh]j$)}(hj?h]h bdev_getblk}(hjahhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj]ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjhhhjhMubj?)}(hE(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp)h](jE)}(hstruct block_device *bdevh](jK)}(hjNh]hstruct}(hj|hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjxubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjxubh)}(hhh]j$)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j= c.bdev_getblkasbuh1hhjxubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjxubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj$)}(hbdevh]hbdev}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjxubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjtubjE)}(hsector_t blockh](h)}(hhh]j$)}(hsector_th]hsector_t}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j= c.bdev_getblkasbuh1hhjubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hblockh]hblock}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjtubjE)}(h unsigned sizeh](h)}(hunsignedh]hunsigned}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj0ubj )}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj0ubj$)}(hsizeh]hsize}(hjPhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj0ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjtubjE)}(h gfp_t gfph](h)}(hhh]j$)}(hgfp_th]hgfp_t}(hjlhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjiubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjnmodnameN classnameNjj)}j]j= c.bdev_getblkasbuh1hhjeubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjeubj$)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjeubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjtubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjhhhjhMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]h)}(h3Get a buffer_head in a block device's buffer cache.h]h5Get a buffer_head in a block device’s buffer cache.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjj uh1hhhhhhNhNubj )}(hXG**Parameters** ``struct block_device *bdev`` The block device. ``sector_t block`` The block number. ``unsigned size`` The size of buffer_heads for this **bdev**. ``gfp_t gfp`` The memory allocation flags to use. **Description** The returned buffer head has its reference count incremented, but is not locked. The caller should call brelse() when it has finished with the buffer. The buffer may not be uptodate. If needed, the caller can bring it uptodate either by reading it or overwriting it. **Return** The buffer head, or NULL if memory could not be allocated.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubj+)}(hhh](j0)}(h0``struct block_device *bdev`` The block device. h](j6)}(h``struct block_device *bdev``h]j<)}(hjh]hstruct block_device *bdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(hThe block device.h]hThe block device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjubj0)}(h%``sector_t block`` The block number. h](j6)}(h``sector_t block``h]j<)}(hj<h]hsector_t block}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj:ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj6ubjR)}(hhh]h)}(hThe block number.h]hThe block number.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jQhj6ubeh}(h]h ]h"]h$]h&]uh1j/hjQhMhjubj0)}(h>``unsigned size`` The size of buffer_heads for this **bdev**. h](j6)}(h``unsigned size``h]j<)}(hjuh]h unsigned size}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjsubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjoubjR)}(hhh]h)}(h+The size of buffer_heads for this **bdev**.h](h"The size of buffer_heads for this }(hjhhhNhNubj)}(h**bdev**h]hbdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjoubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjubj0)}(h2``gfp_t gfp`` The memory allocation flags to use. h](j6)}(h ``gfp_t gfp``h]j<)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(h#The memory allocation flags to use.h]h#The memory allocation flags to use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhjubeh}(h]h ]h"]h$]h&]uh1j*hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(hX The returned buffer head has its reference count incremented, but is not locked. The caller should call brelse() when it has finished with the buffer. The buffer may not be uptodate. If needed, the caller can bring it uptodate either by reading it or overwriting it.h]hX The returned buffer head has its reference count incremented, but is not locked. The caller should call brelse() when it has finished with the buffer. The buffer may not be uptodate. If needed, the caller can bring it uptodate either by reading it or overwriting it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(h **Return**h]j)}(hj"h]hReturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubh)}(h:The buffer head, or NULL if memory could not be allocated.h]h:The buffer head, or NULL if memory could not be allocated.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__bread_gfp (C function) c.__bread_gfphNtauh1hhhhhhNhNubh)}(hhh](h)}(hfstruct buffer_head * __bread_gfp (struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp)h]h)}(hdstruct buffer_head *__bread_gfp(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp)h](jK)}(hjNh]hstruct}(hjghhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjchhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjchhhjthMubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}j __bread_gfpsb c.__bread_gfpasbuh1hhjchhhjthMubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjchhhjthMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjthMubj)}(h __bread_gfph]j$)}(hjh]h __bread_gfp}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjchhhjthMubj?)}(hE(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp)h](jE)}(hstruct block_device *bdevh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubh)}(hhh]j$)}(h block_deviceh]h block_device}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.__bread_gfpasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj$)}(hbdevh]hbdev}(hj8hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(hsector_t blockh](h)}(hhh]j$)}(hsector_th]hsector_t}(hjThhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjQubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjVmodnameN classnameNjj)}j]j c.__bread_gfpasbuh1hhjMubj )}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjMubj$)}(hblockh]hblock}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjMubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(h unsigned sizeh](h)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubjE)}(h gfp_t gfph](h)}(hhh]j$)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.__bread_gfpasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj$)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjchhhjthMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhj_hhhjthMubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1hhjthMhj\hhubj)}(hhh]h)}(h Read a block.h]h Read a block.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj$hhubah}(h]h ]h"]h$]h&]uh1jhj\hhhjthMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjj uh1hhhhhhNhNubj )}(hXs**Parameters** ``struct block_device *bdev`` The block device to read from. ``sector_t block`` Block number in units of block size. ``unsigned size`` The block size of this device in bytes. ``gfp_t gfp`` Not page allocation flags; see below. **Description** You are not expected to call this function. You should use one of sb_bread(), sb_bread_unmovable() or __bread(). Read a specified block, and return the buffer head that refers to it. If **gfp** is 0, the memory will be allocated using the block device's default GFP flags. If **gfp** is __GFP_MOVABLE, the memory may be allocated from a movable area. Do not pass in a complete set of GFP flags. The returned buffer head has its refcount increased. The caller should call brelse() when it has finished with the buffer. **Context** May sleep waiting for I/O. **Return** NULL if the block was unreadable.h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubj+)}(hhh](j0)}(h=``struct block_device *bdev`` The block device to read from. h](j6)}(h``struct block_device *bdev``h]j<)}(hjhh]hstruct block_device *bdev}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjfubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjbubjR)}(hhh]h)}(hThe block device to read from.h]hThe block device to read from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMhj~ubah}(h]h ]h"]h$]h&]uh1jQhjbubeh}(h]h ]h"]h$]h&]uh1j/hj}hMhj_ubj0)}(h8``sector_t block`` Block number in units of block size. h](j6)}(h``sector_t block``h]j<)}(hjh]hsector_t block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(h$Block number in units of block size.h]h$Block number in units of block size.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhj_ubj0)}(h:``unsigned size`` The block size of this device in bytes. h](j6)}(h``unsigned size``h]j<)}(hjh]h unsigned size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjubjR)}(hhh]h)}(h'The block size of this device in bytes.h]h'The block size of this device in bytes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1j/hjhMhj_ubj0)}(h4``gfp_t gfp`` Not page allocation flags; see below. h](j6)}(h ``gfp_t gfp``h]j<)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj ubjR)}(hhh]h)}(h%Not page allocation flags; see below.h]h%Not page allocation flags; see below.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1jQhj ubeh}(h]h ]h"]h$]h&]uh1j/hj(hMhj_ubeh}(h]h ]h"]h$]h&]uh1j*hjCubh)}(h**Description**h]j)}(hjNh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(hqYou are not expected to call this function. You should use one of sb_bread(), sb_bread_unmovable() or __bread().h]hqYou are not expected to call this function. You should use one of sb_bread(), sb_bread_unmovable() or __bread().}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(hXRead a specified block, and return the buffer head that refers to it. If **gfp** is 0, the memory will be allocated using the block device's default GFP flags. If **gfp** is __GFP_MOVABLE, the memory may be allocated from a movable area. Do not pass in a complete set of GFP flags.h](hIRead a specified block, and return the buffer head that refers to it. If }(hjshhhNhNubj)}(h**gfp**h]hgfp}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubhV is 0, the memory will be allocated using the block device’s default GFP flags. If }(hjshhhNhNubj)}(h**gfp**h]hgfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubhp is __GFP_MOVABLE, the memory may be allocated from a movable area. Do not pass in a complete set of GFP flags.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(h{The returned buffer head has its refcount increased. The caller should call brelse() when it has finished with the buffer.h]h{The returned buffer head has its refcount increased. The caller should call brelse() when it has finished with the buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(hMay sleep waiting for I/O.h]hMay sleep waiting for I/O.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubh)}(h!NULL if the block was unreadable.h]h!NULL if the block was unreadable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#block_invalidate_folio (C function)c.block_invalidate_foliohNtauh1hhhhhhNhNubh)}(hhh](h)}(hOvoid block_invalidate_folio (struct folio *folio, size_t offset, size_t length)h]h)}(hNvoid block_invalidate_folio(struct folio *folio, size_t offset, size_t length)h](h)}(hvoidh]hvoid}(hj# hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMdubj )}(h h]h }(hj2 hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj hhhj1 hMdubj)}(hblock_invalidate_folioh]j$)}(hblock_invalidate_folioh]hblock_invalidate_folio}(hjD hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj@ ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhj hhhj1 hMdubj?)}(h3(struct folio *folio, size_t offset, size_t length)h](jE)}(hstruct folio *folioh](jK)}(hjNh]hstruct}(hj` hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj\ ubj )}(h h]h }(hjm hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj\ ubh)}(hhh]j$)}(hfolioh]hfolio}(hj~ hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj{ ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjF sbc.block_invalidate_folioasbuh1hhj\ ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj\ ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ ubj$)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj\ ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjX ubjE)}(h size_t offseth](h)}(hhh]j$)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.block_invalidate_folioasbuh1hhj ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj$)}(hoffseth]hoffset}(hj!hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjX ubjE)}(h size_t lengthh](h)}(hhh]j$)}(hsize_th]hsize_t}(hj!hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj!modnameN classnameNjj)}j]j c.block_invalidate_folioasbuh1hhj!ubj )}(h h]h }(hj;!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj!ubj$)}(hlengthh]hlength}(hjI!hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj!ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhjX ubeh}(h]h ]h"]h$]h&]j<j=uh1j>hj hhhj1 hMdubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhj hhhj1 hMdubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj1 hMdhj hhubj)}(hhh]h)}(h0Invalidate part or all of a buffer-backed folio.h]h0Invalidate part or all of a buffer-backed folio.}(hjs!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMVhjp!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj1 hMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjj uh1hhhhhhNhNubj )}(hXe**Parameters** ``struct folio *folio`` The folio which is affected. ``size_t offset`` start of the range to invalidate ``size_t length`` length of the range to invalidate **Description** block_invalidate_folio() is called when all or part of the folio has been invalidated by a truncate operation. block_invalidate_folio() does not have to release all buffers, but it must ensure that no dirty buffer is left outside **offset** and that no I/O is underway against any of the blocks which are outside the truncation point. Because the caller is about to free (and possibly reuse) those blocks on-disk.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMZhj!ubj+)}(hhh](j0)}(h5``struct folio *folio`` The folio which is affected. h](j6)}(h``struct folio *folio``h]j<)}(hj!h]hstruct folio *folio}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj!ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMWhj!ubjR)}(hhh]h)}(hThe folio which is affected.h]hThe folio which is affected.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMWhj!ubah}(h]h ]h"]h$]h&]uh1jQhj!ubeh}(h]h ]h"]h$]h&]uh1j/hj!hMWhj!ubj0)}(h3``size_t offset`` start of the range to invalidate h](j6)}(h``size_t offset``h]j<)}(hj!h]h size_t offset}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj!ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMXhj!ubjR)}(hhh]h)}(h start of the range to invalidateh]h start of the range to invalidate}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMXhj"ubah}(h]h ]h"]h$]h&]uh1jQhj!ubeh}(h]h ]h"]h$]h&]uh1j/hj"hMXhj!ubj0)}(h4``size_t length`` length of the range to invalidate h](j6)}(h``size_t length``h]j<)}(hj&"h]h size_t length}(hj("hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj$"ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMYhj "ubjR)}(hhh]h)}(h!length of the range to invalidateh]h!length of the range to invalidate}(hj?"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;"hMYhj<"ubah}(h]h ]h"]h$]h&]uh1jQhj "ubeh}(h]h ]h"]h$]h&]uh1j/hj;"hMYhj!ubeh}(h]h ]h"]h$]h&]uh1j*hj!ubh)}(h**Description**h]j)}(hja"h]h Description}(hjc"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_"ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM[hj!ubh)}(hnblock_invalidate_folio() is called when all or part of the folio has been invalidated by a truncate operation.h]hnblock_invalidate_folio() is called when all or part of the folio has been invalidated by a truncate operation.}(hjw"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM[hj!ubh)}(hX/block_invalidate_folio() does not have to release all buffers, but it must ensure that no dirty buffer is left outside **offset** and that no I/O is underway against any of the blocks which are outside the truncation point. Because the caller is about to free (and possibly reuse) those blocks on-disk.h](hwblock_invalidate_folio() does not have to release all buffers, but it must ensure that no dirty buffer is left outside }(hj"hhhNhNubj)}(h **offset**h]hoffset}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh and that no I/O is underway against any of the blocks which are outside the truncation point. Because the caller is about to free (and possibly reuse) those blocks on-disk.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM^hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hclean_bdev_aliases (C function)c.clean_bdev_aliaseshNtauh1hhhhhhNhNubh)}(hhh](h)}(hQvoid clean_bdev_aliases (struct block_device *bdev, sector_t block, sector_t len)h]h)}(hPvoid clean_bdev_aliases(struct block_device *bdev, sector_t block, sector_t len)h](h)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj"hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMubj )}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj"hhhj"hMubj)}(hclean_bdev_aliasesh]j$)}(hclean_bdev_aliasesh]hclean_bdev_aliases}(hj"hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj"ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhj"hhhj"hMubj?)}(h9(struct block_device *bdev, sector_t block, sector_t len)h](jE)}(hstruct block_device *bdevh](jK)}(hjNh]hstruct}(hj#hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj#ubj )}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubh)}(hhh]j$)}(h block_deviceh]h block_device}(hj"#hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$#modnameN classnameNjj)}j]j)}jj"sbc.clean_bdev_aliasesasbuh1hhj#ubj )}(h h]h }(hjB#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubj)}(hjh]h*}(hjP#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj$)}(hbdevh]hbdev}(hj]#hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj#ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj"ubjE)}(hsector_t blockh](h)}(hhh]j$)}(hsector_th]hsector_t}(hjy#hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjv#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj{#modnameN classnameNjj)}j]j>#c.clean_bdev_aliasesasbuh1hhjr#ubj )}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjr#ubj$)}(hblockh]hblock}(hj#hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjr#ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj"ubjE)}(h sector_t lenh](h)}(hhh]j$)}(hsector_th]hsector_t}(hj#hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj#modnameN classnameNjj)}j]j>#c.clean_bdev_aliasesasbuh1hhj#ubj )}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubj$)}(hlenh]hlen}(hj#hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj#ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj"ubeh}(h]h ]h"]h$]h&]j<j=uh1j>hj"hhhj"hMubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhj"hhhj"hMubah}(h]j"ah ](jjeh"]h$]h&]jj)jhuh1hhj"hMhj"hhubj)}(hhh]h)}(h(clean a range of buffers in block deviceh]h(clean a range of buffers in block device}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj$hhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj"hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/$jj/$jjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct block_device *bdev`` Block device to clean buffers in ``sector_t block`` Start of a range of blocks to clean ``sector_t len`` Number of blocks to clean **Description** We are taking a range of blocks for data and we don't want writeback of any buffer-cache aliases starting from return from this function and until the moment when something will explicitly mark the buffer dirty (hopefully that will not happen until we will free that block ;-) We don't even need to mark it not-uptodate - nobody can expect anything from a newly allocated buffer anyway. We used to use unmap_buffer() for such invalidation, but that was wrong. We definitely don't want to mark the alias unmapped, for example - it would confuse anyone who might pick it with bread() afterwards... Also.. Note that bforget() doesn't lock the buffer. So there can be writeout I/O going on against recently-freed buffers. We don't wait on that I/O in bforget() - it's more efficient to wait on the I/O only if we really need to. That happens here.h](h)}(h**Parameters**h]j)}(hj9$h]h Parameters}(hj;$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7$ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj3$ubj+)}(hhh](j0)}(h?``struct block_device *bdev`` Block device to clean buffers in h](j6)}(h``struct block_device *bdev``h]j<)}(hjX$h]hstruct block_device *bdev}(hjZ$hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjV$ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhjR$ubjR)}(hhh]h)}(h Block device to clean buffers inh]h Block device to clean buffers in}(hjq$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm$hMhjn$ubah}(h]h ]h"]h$]h&]uh1jQhjR$ubeh}(h]h ]h"]h$]h&]uh1j/hjm$hMhjO$ubj0)}(h7``sector_t block`` Start of a range of blocks to clean h](j6)}(h``sector_t block``h]j<)}(hj$h]hsector_t block}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj$ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj$ubjR)}(hhh]h)}(h#Start of a range of blocks to cleanh]h#Start of a range of blocks to clean}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jQhj$ubeh}(h]h ]h"]h$]h&]uh1j/hj$hMhjO$ubj0)}(h+``sector_t len`` Number of blocks to clean h](j6)}(h``sector_t len``h]j<)}(hj$h]h sector_t len}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj$ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj$ubjR)}(hhh]h)}(hNumber of blocks to cleanh]hNumber of blocks to clean}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jQhj$ubeh}(h]h ]h"]h$]h&]uh1j/hj$hMhjO$ubeh}(h]h ]h"]h$]h&]uh1j*hj3$ubh)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj3$ubh)}(hXSWe are taking a range of blocks for data and we don't want writeback of any buffer-cache aliases starting from return from this function and until the moment when something will explicitly mark the buffer dirty (hopefully that will not happen until we will free that block ;-) We don't even need to mark it not-uptodate - nobody can expect anything from a newly allocated buffer anyway. We used to use unmap_buffer() for such invalidation, but that was wrong. We definitely don't want to mark the alias unmapped, for example - it would confuse anyone who might pick it with bread() afterwards...h]hXYWe are taking a range of blocks for data and we don’t want writeback of any buffer-cache aliases starting from return from this function and until the moment when something will explicitly mark the buffer dirty (hopefully that will not happen until we will free that block ;-) We don’t even need to mark it not-uptodate - nobody can expect anything from a newly allocated buffer anyway. We used to use unmap_buffer() for such invalidation, but that was wrong. We definitely don’t want to mark the alias unmapped, for example - it would confuse anyone who might pick it with bread() afterwards...}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj3$ubh)}(hAlso.. Note that bforget() doesn't lock the buffer. So there can be writeout I/O going on against recently-freed buffers. We don't wait on that I/O in bforget() - it's more efficient to wait on the I/O only if we really need to. That happens here.h]hXAlso.. Note that bforget() doesn’t lock the buffer. So there can be writeout I/O going on against recently-freed buffers. We don’t wait on that I/O in bforget() - it’s more efficient to wait on the I/O only if we really need to. That happens here.}(hj*%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMhj3$ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h try_to_free_buffers (C function)c.try_to_free_buffershNtauh1hhhhhhNhNubh)}(hhh](h)}(h.bool try_to_free_buffers (struct folio *folio)h]h)}(h-bool try_to_free_buffers(struct folio *folio)h](h)}(hj h]hbool}(hjY%hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjU%hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM ubj )}(h h]h }(hjg%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjU%hhhjf%hM ubj)}(htry_to_free_buffersh]j$)}(htry_to_free_buffersh]htry_to_free_buffers}(hjy%hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hju%ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjU%hhhjf%hM ubj?)}(h(struct folio *folio)h]jE)}(hstruct folio *folioh](jK)}(hjNh]hstruct}(hj%hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj%ubj )}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj%ubh)}(hhh]j$)}(hfolioh]hfolio}(hj%hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj%ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj%modnameN classnameNjj)}j]j)}jj{%sbc.try_to_free_buffersasbuh1hhj%ubj )}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj%ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj$)}(hfolioh]hfolio}(hj%hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj%ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj%ubah}(h]h ]h"]h$]h&]j<j=uh1j>hjU%hhhjf%hM ubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjQ%hhhjf%hM ubah}(h]jL%ah ](jjeh"]h$]h&]jj)jhuh1hhjf%hM hjN%hhubj)}(hhh]h)}(h'Release buffers attached to this folio.h]h'Release buffers attached to this folio.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMm hj&hhubah}(h]h ]h"]h$]h&]uh1jhjN%hhhjf%hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0&jj0&jjj uh1hhhhhhNhNubj )}(hX**Parameters** ``struct folio *folio`` The folio. **Description** If any buffers are in use (dirty, under writeback, elevated refcount), no buffers will be freed. If the folio is dirty but all the buffers are clean then we need to be sure to mark the folio clean as well. This is because the folio may be against a block device, and a later reattachment of buffers to a dirty folio will set *all* buffers dirty. Which would corrupt filesystem data on the same device. The same applies to regular filesystem folios: if all the buffers are clean then we set the folio clean and proceed. To do that, we require total exclusion from block_dirty_folio(). That is obtained with i_private_lock. Exclusion against try_to_free_buffers may be obtained by either locking the folio or by holding its mapping's i_private_lock. **Context** Process context. **folio** must be locked. Will not sleep. **Return** true if all buffers attached to this folio were freed.h](h)}(h**Parameters**h]j)}(hj:&h]h Parameters}(hj<&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8&ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMq hj4&ubj+)}(hhh]j0)}(h#``struct folio *folio`` The folio. h](j6)}(h``struct folio *folio``h]j<)}(hjY&h]hstruct folio *folio}(hj[&hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjW&ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMn hjS&ubjR)}(hhh]h)}(h The folio.h]h The folio.}(hjr&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjn&hMn hjo&ubah}(h]h ]h"]h$]h&]uh1jQhjS&ubeh}(h]h ]h"]h$]h&]uh1j/hjn&hMn hjP&ubah}(h]h ]h"]h$]h&]uh1j*hj4&ubh)}(h**Description**h]j)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMp hj4&ubh)}(h`If any buffers are in use (dirty, under writeback, elevated refcount), no buffers will be freed.h]h`If any buffers are in use (dirty, under writeback, elevated refcount), no buffers will be freed.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMp hj4&ubh)}(hX2If the folio is dirty but all the buffers are clean then we need to be sure to mark the folio clean as well. This is because the folio may be against a block device, and a later reattachment of buffers to a dirty folio will set *all* buffers dirty. Which would corrupt filesystem data on the same device.h](hIf the folio is dirty but all the buffers are clean then we need to be sure to mark the folio clean as well. This is because the folio may be against a block device, and a later reattachment of buffers to a dirty folio will set }(hj&hhhNhNubhemphasis)}(h*all*h]hall}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj&ubhH buffers dirty. Which would corrupt filesystem data on the same device.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMs hj4&ubh)}(hThe same applies to regular filesystem folios: if all the buffers are clean then we set the folio clean and proceed. To do that, we require total exclusion from block_dirty_folio(). That is obtained with i_private_lock.h]hThe same applies to regular filesystem folios: if all the buffers are clean then we set the folio clean and proceed. To do that, we require total exclusion from block_dirty_folio(). That is obtained with i_private_lock.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chMy hj4&ubh)}(h}Exclusion against try_to_free_buffers may be obtained by either locking the folio or by holding its mapping's i_private_lock.h]hExclusion against try_to_free_buffers may be obtained by either locking the folio or by holding its mapping’s i_private_lock.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM~ hj4&ubh)}(h **Context**h]j)}(hj&h]hContext}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hj4&ubh)}(hhjv'hhhj'hM ubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjr'hhhj'hM ubah}(h]jm'ah ](jjeh"]h$]h&]jj)jhuh1hhj'hM hjo'hhubj)}(hhh]h)}(h#Test whether the buffer is uptodateh]h#Test whether the buffer is uptodate}(hj:(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hj7(hhubah}(h]h ]h"]h$]h&]uh1jhjo'hhhj'hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjR(jjR(jjj uh1hhhhhhNhNubj )}(h**Parameters** ``struct buffer_head *bh`` struct buffer_head **Description** Return true if the buffer is up-to-date and false, with the buffer locked, if not.h](h)}(h**Parameters**h]j)}(hj\(h]h Parameters}(hj^(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ(ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjV(ubj+)}(hhh]j0)}(h.``struct buffer_head *bh`` struct buffer_head h](j6)}(h``struct buffer_head *bh``h]j<)}(hj{(h]hstruct buffer_head *bh}(hj}(hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjy(ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hju(ubjR)}(hhh]h)}(hstruct buffer_headh]hstruct buffer_head}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hM hj(ubah}(h]h ]h"]h$]h&]uh1jQhju(ubeh}(h]h ]h"]h$]h&]uh1j/hj(hM hjr(ubah}(h]h ]h"]h$]h&]uh1j*hjV(ubh)}(h**Description**h]j)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjV(ubh)}(hRReturn true if the buffer is up-to-date and false, with the buffer locked, if not.Eh]hRReturn true if the buffer is up-to-date and false, with the buffer locked, if not.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjV(ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__bh_read (C function) c.__bh_readhNtauh1hhhhhhNhNubh)}(hhh](h)}(hEint __bh_read (struct buffer_head *bh, blk_opf_t op_flags, bool wait)h]h)}(hDint __bh_read(struct buffer_head *bh, blk_opf_t op_flags, bool wait)h](h)}(hinth]hint}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj(hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM ubj )}(h h]h }(hj )hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj(hhhj )hM ubj)}(h __bh_readh]j$)}(h __bh_readh]h __bh_read}(hj)hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj)ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhj(hhhj )hM ubj?)}(h7(struct buffer_head *bh, blk_opf_t op_flags, bool wait)h](jE)}(hstruct buffer_head *bhh](jK)}(hjNh]hstruct}(hj8)hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj4)ubj )}(h h]h }(hjE)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4)ubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hjV)hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjS)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjX)modnameN classnameNjj)}j]j)}jj)sb c.__bh_readasbuh1hhj4)ubj )}(h h]h }(hjv)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4)ubj$)}(hbhh]hbh}(hj)hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj4)ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj0)ubjE)}(hblk_opf_t op_flagsh](h)}(hhh]j$)}(h blk_opf_th]h blk_opf_t}(hj)hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj)modnameN classnameNjj)}j]jr) c.__bh_readasbuh1hhj)ubj )}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj)ubj$)}(hop_flagsh]hop_flags}(hj)hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj)ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj0)ubjE)}(h bool waith](h)}(hj h]hbool}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj)ubj )}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj)ubj$)}(hwaith]hwait}(hj *hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj)ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj0)ubeh}(h]h ]h"]h$]h&]j<j=uh1j>hj(hhhj )hM ubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhj(hhhj )hM ubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1hhj )hM hj(hhubj)}(hhh]h)}(hSubmit read for a locked bufferh]hSubmit read for a locked buffer}(hj7*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hj4*hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj )hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjO*jjO*jjj uh1hhhhhhNhNubj )}(h**Parameters** ``struct buffer_head *bh`` struct buffer_head ``blk_opf_t op_flags`` appending REQ_OP_* flags besides REQ_OP_READ ``bool wait`` wait until reading finish **Description** Returns zero on success or don't wait, and -EIO on error.h](h)}(h**Parameters**h]j)}(hjY*h]h Parameters}(hj[*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW*ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjS*ubj+)}(hhh](j0)}(h.``struct buffer_head *bh`` struct buffer_head h](j6)}(h``struct buffer_head *bh``h]j<)}(hjx*h]hstruct buffer_head *bh}(hjz*hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjv*ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjr*ubjR)}(hhh]h)}(hstruct buffer_headh]hstruct buffer_head}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hM hj*ubah}(h]h ]h"]h$]h&]uh1jQhjr*ubeh}(h]h ]h"]h$]h&]uh1j/hj*hM hjo*ubj0)}(hD``blk_opf_t op_flags`` appending REQ_OP_* flags besides REQ_OP_READ h](j6)}(h``blk_opf_t op_flags``h]j<)}(hj*h]hblk_opf_t op_flags}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj*ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hj*ubjR)}(hhh]h)}(h,appending REQ_OP_* flags besides REQ_OP_READh]h,appending REQ_OP_* flags besides REQ_OP_READ}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hM hj*ubah}(h]h ]h"]h$]h&]uh1jQhj*ubeh}(h]h ]h"]h$]h&]uh1j/hj*hM hjo*ubj0)}(h(``bool wait`` wait until reading finish h](j6)}(h ``bool wait``h]j<)}(hj*h]h bool wait}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj*ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hj*ubjR)}(hhh]h)}(hwait until reading finishh]hwait until reading finish}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hM hj+ubah}(h]h ]h"]h$]h&]uh1jQhj*ubeh}(h]h ]h"]h$]h&]uh1j/hj*hM hjo*ubeh}(h]h ]h"]h$]h&]uh1j*hjS*ubh)}(h**Description**h]j)}(hj%+h]h Description}(hj'+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#+ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjS*ubh)}(h9Returns zero on success or don't wait, and -EIO on error.h]h;Returns zero on success or don’t wait, and -EIO on error.}(hj;+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM hjS*ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__bh_read_batch (C function)c.__bh_read_batchhNtauh1hhhhhhNhNubh)}(hhh](h)}(h]void __bh_read_batch (int nr, struct buffer_head *bhs[], blk_opf_t op_flags, bool force_lock)h]h)}(h\void __bh_read_batch(int nr, struct buffer_head *bhs[], blk_opf_t op_flags, bool force_lock)h](h)}(hvoidh]hvoid}(hjj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhjf+hhhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM5 ubj )}(h h]h }(hjy+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjf+hhhjx+hM5 ubj)}(h__bh_read_batchh]j$)}(h__bh_read_batchh]h__bh_read_batch}(hj+hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj+ubah}(h]h ](j7j8eh"]h$]h&]j<j=uh1jhjf+hhhjx+hM5 ubj?)}(hH(int nr, struct buffer_head *bhs[], blk_opf_t op_flags, bool force_lock)h](jE)}(hint nrh](h)}(hinth]hint}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj+ubj )}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubj$)}(hnrh]hnr}(hj+hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj+ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj+ubjE)}(hstruct buffer_head *bhs[]h](jK)}(hjNh]hstruct}(hj+hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj+ubj )}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubh)}(hhh]j$)}(h buffer_headh]h buffer_head}(hj+hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj+ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj+modnameN classnameNjj)}j]j)}jj+sbc.__bh_read_batchasbuh1hhj+ubj )}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubj)}(hjh]h*}(hj(,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj$)}(hbhsh]hbhs}(hj5,hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj+ubj)}(h[h]h[}(hjC,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h]h]h]}(hjQ,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj+ubjE)}(hblk_opf_t op_flagsh](h)}(hhh]j$)}(h blk_opf_th]h blk_opf_t}(hjm,hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjo,modnameN classnameNjj)}j]j,c.__bh_read_batchasbuh1hhjf,ubj )}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjf,ubj$)}(hop_flagsh]hop_flags}(hj,hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hjf,ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj+ubjE)}(hbool force_lockh](h)}(hj h]hbool}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1hhj,ubj )}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj,ubj$)}(h force_lockh]h force_lock}(hj,hhhNhNubah}(h]h ]j0ah"]h$]h&]uh1j#hj,ubeh}(h]h ]h"]h$]h&]noemphj<j=uh1jDhj+ubeh}(h]h ]h"]h$]h&]j<j=uh1j>hjf+hhhjx+hM5 ubeh}(h]h ]h"]h$]h&]j<j=juh1hjjhjb+hhhjx+hM5 ubah}(h]j]+ah ](jjeh"]h$]h&]jj)jhuh1hhjx+hM5 hj_+hhubj)}(hhh]h)}(h+Submit read for a batch of unlocked buffersh]h+Submit read for a batch of unlocked buffers}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM, hj,hhubah}(h]h ]h"]h$]h&]uh1jhj_+hhhjx+hM5 ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjj uh1hhhhhhNhNubj )}(hX**Parameters** ``int nr`` entry number of the buffer batch ``struct buffer_head *bhs[]`` a batch of struct buffer_head ``blk_opf_t op_flags`` appending REQ_OP_* flags besides REQ_OP_READ ``bool force_lock`` force to get a lock on the buffer if set, otherwise drops any buffer that cannot lock. **Description** Returns zero on success or don't wait, and -EIO on error.h](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM0 hj-ubj+)}(hhh](j0)}(h,``int nr`` entry number of the buffer batch h](j6)}(h ``int nr``h]j<)}(hj8-h]hint nr}(hj:-hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj6-ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM- hj2-ubjR)}(hhh]h)}(h entry number of the buffer batchh]h entry number of the buffer batch}(hjQ-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM-hM- hjN-ubah}(h]h ]h"]h$]h&]uh1jQhj2-ubeh}(h]h ]h"]h$]h&]uh1j/hjM-hM- hj/-ubj0)}(h<``struct buffer_head *bhs[]`` a batch of struct buffer_head h](j6)}(h``struct buffer_head *bhs[]``h]j<)}(hjq-h]hstruct buffer_head *bhs[]}(hjs-hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hjo-ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM. hjk-ubjR)}(hhh]h)}(ha batch of struct buffer_headh]ha batch of struct buffer_head}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM. hj-ubah}(h]h ]h"]h$]h&]uh1jQhjk-ubeh}(h]h ]h"]h$]h&]uh1j/hj-hM. hj/-ubj0)}(hD``blk_opf_t op_flags`` appending REQ_OP_* flags besides REQ_OP_READ h](j6)}(h``blk_opf_t op_flags``h]j<)}(hj-h]hblk_opf_t op_flags}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj-ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM/ hj-ubjR)}(hhh]h)}(h,appending REQ_OP_* flags besides REQ_OP_READh]h,appending REQ_OP_* flags besides REQ_OP_READ}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM/ hj-ubah}(h]h ]h"]h$]h&]uh1jQhj-ubeh}(h]h ]h"]h$]h&]uh1j/hj-hM/ hj/-ubj0)}(hk``bool force_lock`` force to get a lock on the buffer if set, otherwise drops any buffer that cannot lock. h](j6)}(h``bool force_lock``h]j<)}(hj-h]hbool force_lock}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j;hj-ubah}(h]h ]h"]h$]h&]uh1j5hN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM1 hj-ubjR)}(hhh]h)}(hVforce to get a lock on the buffer if set, otherwise drops any buffer that cannot lock.h]hVforce to get a lock on the buffer if set, otherwise drops any buffer that cannot lock.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM0 hj-ubah}(h]h ]h"]h$]h&]uh1jQhj-ubeh}(h]h ]h"]h$]h&]uh1j/hj-hM1 hj/-ubeh}(h]h ]h"]h$]h&]uh1j*hj-ubh)}(h**Description**h]j)}(hj.h]h Description}(hj!.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM3 hj-ubh)}(h9Returns zero on success or don't wait, and -EIO on error.h]h;Returns zero on success or don’t wait, and -EIO on error.}(hj5.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhN/var/lib/git/docbuild/linux/Documentation/filesystems/buffer:11: ./fs/buffer.chM3 hj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubeh}(h] functionsah ]h"] functionsah$]h&]uh1hhhhhhhhKubeh}(h] buffer-headsah ]h"] buffer headsah$]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_handlerj~.error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jX.jU.jP.jM.u nametypes}(jX.jP.uh}(jU.hjM.hhhjjjjjjj j j j jjjjj?jDjjjbjgjjjZj_j j j"j"jL%jQ%jm'jr'j(j(j]+jb+u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.