Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

docs-rst: convert filesystems book to ReST

Use pandoc to convert documentation to ReST by calling
Documentation/sphinx/tmplcvt script.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

+328 -382
+1 -1
Documentation/DocBook/Makefile
··· 8 8 9 9 DOCBOOKS := z8530book.xml \ 10 10 networking.xml \ 11 - filesystems.xml lsm.xml \ 11 + lsm.xml \ 12 12 libata.xml mtdnand.xml librs.xml rapidio.xml \ 13 13 s390-drivers.xml scsi.xml \ 14 14 sh.xml w1.xml
-381
Documentation/DocBook/filesystems.tmpl
··· 1 - <?xml version="1.0" encoding="UTF-8"?> 2 - <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 3 - "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> 4 - 5 - <book id="Linux-filesystems-API"> 6 - <bookinfo> 7 - <title>Linux Filesystems API</title> 8 - 9 - <legalnotice> 10 - <para> 11 - This documentation is free software; you can redistribute 12 - it and/or modify it under the terms of the GNU General Public 13 - License as published by the Free Software Foundation; either 14 - version 2 of the License, or (at your option) any later 15 - version. 16 - </para> 17 - 18 - <para> 19 - This program is distributed in the hope that it will be 20 - useful, but WITHOUT ANY WARRANTY; without even the implied 21 - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 22 - See the GNU General Public License for more details. 23 - </para> 24 - 25 - <para> 26 - You should have received a copy of the GNU General Public 27 - License along with this program; if not, write to the Free 28 - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 29 - MA 02111-1307 USA 30 - </para> 31 - 32 - <para> 33 - For more details see the file COPYING in the source 34 - distribution of Linux. 35 - </para> 36 - </legalnotice> 37 - </bookinfo> 38 - 39 - <toc></toc> 40 - 41 - <chapter id="vfs"> 42 - <title>The Linux VFS</title> 43 - <sect1 id="the_filesystem_types"><title>The Filesystem types</title> 44 - !Iinclude/linux/fs.h 45 - </sect1> 46 - <sect1 id="the_directory_cache"><title>The Directory Cache</title> 47 - !Efs/dcache.c 48 - !Iinclude/linux/dcache.h 49 - </sect1> 50 - <sect1 id="inode_handling"><title>Inode Handling</title> 51 - !Efs/inode.c 52 - !Efs/bad_inode.c 53 - </sect1> 54 - <sect1 id="registration_and_superblocks"><title>Registration and Superblocks</title> 55 - !Efs/super.c 56 - </sect1> 57 - <sect1 id="file_locks"><title>File Locks</title> 58 - !Efs/locks.c 59 - !Ifs/locks.c 60 - </sect1> 61 - <sect1 id="other_functions"><title>Other Functions</title> 62 - !Efs/mpage.c 63 - !Efs/namei.c 64 - !Efs/buffer.c 65 - !Eblock/bio.c 66 - !Efs/seq_file.c 67 - !Efs/filesystems.c 68 - !Efs/fs-writeback.c 69 - !Efs/block_dev.c 70 - </sect1> 71 - </chapter> 72 - 73 - <chapter id="proc"> 74 - <title>The proc filesystem</title> 75 - 76 - <sect1 id="sysctl_interface"><title>sysctl interface</title> 77 - !Ekernel/sysctl.c 78 - </sect1> 79 - 80 - <sect1 id="proc_filesystem_interface"><title>proc filesystem interface</title> 81 - !Ifs/proc/base.c 82 - </sect1> 83 - </chapter> 84 - 85 - <chapter id="fs_events"> 86 - <title>Events based on file descriptors</title> 87 - !Efs/eventfd.c 88 - </chapter> 89 - 90 - <chapter id="sysfs"> 91 - <title>The Filesystem for Exporting Kernel Objects</title> 92 - !Efs/sysfs/file.c 93 - !Efs/sysfs/symlink.c 94 - </chapter> 95 - 96 - <chapter id="debugfs"> 97 - <title>The debugfs filesystem</title> 98 - 99 - <sect1 id="debugfs_interface"><title>debugfs interface</title> 100 - !Efs/debugfs/inode.c 101 - !Efs/debugfs/file.c 102 - </sect1> 103 - </chapter> 104 - 105 - <chapter id="LinuxJDBAPI"> 106 - <chapterinfo> 107 - <title>The Linux Journalling API</title> 108 - 109 - <authorgroup> 110 - <author> 111 - <firstname>Roger</firstname> 112 - <surname>Gammans</surname> 113 - <affiliation> 114 - <address> 115 - <email>rgammans@computer-surgery.co.uk</email> 116 - </address> 117 - </affiliation> 118 - </author> 119 - </authorgroup> 120 - 121 - <authorgroup> 122 - <author> 123 - <firstname>Stephen</firstname> 124 - <surname>Tweedie</surname> 125 - <affiliation> 126 - <address> 127 - <email>sct@redhat.com</email> 128 - </address> 129 - </affiliation> 130 - </author> 131 - </authorgroup> 132 - 133 - <copyright> 134 - <year>2002</year> 135 - <holder>Roger Gammans</holder> 136 - </copyright> 137 - </chapterinfo> 138 - 139 - <title>The Linux Journalling API</title> 140 - 141 - <sect1 id="journaling_overview"> 142 - <title>Overview</title> 143 - <sect2 id="journaling_details"> 144 - <title>Details</title> 145 - <para> 146 - The journalling layer is easy to use. You need to 147 - first of all create a journal_t data structure. There are 148 - two calls to do this dependent on how you decide to allocate the physical 149 - media on which the journal resides. The jbd2_journal_init_inode() call 150 - is for journals stored in filesystem inodes, or the jbd2_journal_init_dev() 151 - call can be used for journal stored on a raw device (in a continuous range 152 - of blocks). A journal_t is a typedef for a struct pointer, so when 153 - you are finally finished make sure you call jbd2_journal_destroy() on it 154 - to free up any used kernel memory. 155 - </para> 156 - 157 - <para> 158 - Once you have got your journal_t object you need to 'mount' or load the journal 159 - file. The journalling layer expects the space for the journal was already 160 - allocated and initialized properly by the userspace tools. When loading the 161 - journal you must call jbd2_journal_load() to process journal contents. If the 162 - client file system detects the journal contents does not need to be processed 163 - (or even need not have valid contents), it may call jbd2_journal_wipe() to 164 - clear the journal contents before calling jbd2_journal_load(). 165 - </para> 166 - 167 - <para> 168 - Note that jbd2_journal_wipe(..,0) calls jbd2_journal_skip_recovery() for you if 169 - it detects any outstanding transactions in the journal and similarly 170 - jbd2_journal_load() will call jbd2_journal_recover() if necessary. I would 171 - advise reading ext4_load_journal() in fs/ext4/super.c for examples on this 172 - stage. 173 - </para> 174 - 175 - <para> 176 - Now you can go ahead and start modifying the underlying 177 - filesystem. Almost. 178 - </para> 179 - 180 - <para> 181 - 182 - You still need to actually journal your filesystem changes, this 183 - is done by wrapping them into transactions. Additionally you 184 - also need to wrap the modification of each of the buffers 185 - with calls to the journal layer, so it knows what the modifications 186 - you are actually making are. To do this use jbd2_journal_start() which 187 - returns a transaction handle. 188 - </para> 189 - 190 - <para> 191 - jbd2_journal_start() 192 - and its counterpart jbd2_journal_stop(), which indicates the end of a 193 - transaction are nestable calls, so you can reenter a transaction if necessary, 194 - but remember you must call jbd2_journal_stop() the same number of times as 195 - jbd2_journal_start() before the transaction is completed (or more accurately 196 - leaves the update phase). Ext4/VFS makes use of this feature to simplify 197 - handling of inode dirtying, quota support, etc. 198 - </para> 199 - 200 - <para> 201 - Inside each transaction you need to wrap the modifications to the 202 - individual buffers (blocks). Before you start to modify a buffer you 203 - need to call jbd2_journal_get_{create,write,undo}_access() as appropriate, 204 - this allows the journalling layer to copy the unmodified data if it 205 - needs to. After all the buffer may be part of a previously uncommitted 206 - transaction. 207 - At this point you are at last ready to modify a buffer, and once 208 - you are have done so you need to call jbd2_journal_dirty_{meta,}data(). 209 - Or if you've asked for access to a buffer you now know is now longer 210 - required to be pushed back on the device you can call jbd2_journal_forget() 211 - in much the same way as you might have used bforget() in the past. 212 - </para> 213 - 214 - <para> 215 - A jbd2_journal_flush() may be called at any time to commit and checkpoint 216 - all your transactions. 217 - </para> 218 - 219 - <para> 220 - Then at umount time , in your put_super() you can then call jbd2_journal_destroy() 221 - to clean up your in-core journal object. 222 - </para> 223 - 224 - <para> 225 - Unfortunately there a couple of ways the journal layer can cause a deadlock. 226 - The first thing to note is that each task can only have 227 - a single outstanding transaction at any one time, remember nothing 228 - commits until the outermost jbd2_journal_stop(). This means 229 - you must complete the transaction at the end of each file/inode/address 230 - etc. operation you perform, so that the journalling system isn't re-entered 231 - on another journal. Since transactions can't be nested/batched 232 - across differing journals, and another filesystem other than 233 - yours (say ext4) may be modified in a later syscall. 234 - </para> 235 - 236 - <para> 237 - The second case to bear in mind is that jbd2_journal_start() can 238 - block if there isn't enough space in the journal for your transaction 239 - (based on the passed nblocks param) - when it blocks it merely(!) needs to 240 - wait for transactions to complete and be committed from other tasks, 241 - so essentially we are waiting for jbd2_journal_stop(). So to avoid 242 - deadlocks you must treat jbd2_journal_start/stop() as if they 243 - were semaphores and include them in your semaphore ordering rules to prevent 244 - deadlocks. Note that jbd2_journal_extend() has similar blocking behaviour to 245 - jbd2_journal_start() so you can deadlock here just as easily as on 246 - jbd2_journal_start(). 247 - </para> 248 - 249 - <para> 250 - Try to reserve the right number of blocks the first time. ;-). This will 251 - be the maximum number of blocks you are going to touch in this transaction. 252 - I advise having a look at at least ext4_jbd.h to see the basis on which 253 - ext4 uses to make these decisions. 254 - </para> 255 - 256 - <para> 257 - Another wriggle to watch out for is your on-disk block allocation strategy. 258 - Why? Because, if you do a delete, you need to ensure you haven't reused any 259 - of the freed blocks until the transaction freeing these blocks commits. If you 260 - reused these blocks and crash happens, there is no way to restore the contents 261 - of the reallocated blocks at the end of the last fully committed transaction. 262 - 263 - One simple way of doing this is to mark blocks as free in internal in-memory 264 - block allocation structures only after the transaction freeing them commits. 265 - Ext4 uses journal commit callback for this purpose. 266 - </para> 267 - 268 - <para> 269 - With journal commit callbacks you can ask the journalling layer to call a 270 - callback function when the transaction is finally committed to disk, so that 271 - you can do some of your own management. You ask the journalling layer for 272 - calling the callback by simply setting journal->j_commit_callback function 273 - pointer and that function is called after each transaction commit. You can also 274 - use transaction->t_private_list for attaching entries to a transaction that 275 - need processing when the transaction commits. 276 - </para> 277 - 278 - <para> 279 - JBD2 also provides a way to block all transaction updates via 280 - jbd2_journal_{un,}lock_updates(). Ext4 uses this when it wants a window with a 281 - clean and stable fs for a moment. E.g. 282 - </para> 283 - 284 - <programlisting> 285 - 286 - jbd2_journal_lock_updates() //stop new stuff happening.. 287 - jbd2_journal_flush() // checkpoint everything. 288 - ..do stuff on stable fs 289 - jbd2_journal_unlock_updates() // carry on with filesystem use. 290 - </programlisting> 291 - 292 - <para> 293 - The opportunities for abuse and DOS attacks with this should be obvious, 294 - if you allow unprivileged userspace to trigger codepaths containing these 295 - calls. 296 - </para> 297 - 298 - </sect2> 299 - 300 - <sect2 id="jbd_summary"> 301 - <title>Summary</title> 302 - <para> 303 - Using the journal is a matter of wrapping the different context changes, 304 - being each mount, each modification (transaction) and each changed buffer 305 - to tell the journalling layer about them. 306 - </para> 307 - 308 - </sect2> 309 - 310 - </sect1> 311 - 312 - <sect1 id="data_types"> 313 - <title>Data Types</title> 314 - <para> 315 - The journalling layer uses typedefs to 'hide' the concrete definitions 316 - of the structures used. As a client of the JBD2 layer you can 317 - just rely on the using the pointer as a magic cookie of some sort. 318 - 319 - Obviously the hiding is not enforced as this is 'C'. 320 - </para> 321 - <sect2 id="structures"><title>Structures</title> 322 - !Iinclude/linux/jbd2.h 323 - </sect2> 324 - </sect1> 325 - 326 - <sect1 id="functions"> 327 - <title>Functions</title> 328 - <para> 329 - The functions here are split into two groups those that 330 - affect a journal as a whole, and those which are used to 331 - manage transactions 332 - </para> 333 - <sect2 id="journal_level"><title>Journal Level</title> 334 - !Efs/jbd2/journal.c 335 - !Ifs/jbd2/recovery.c 336 - </sect2> 337 - <sect2 id="transaction_level"><title>Transasction Level</title> 338 - !Efs/jbd2/transaction.c 339 - </sect2> 340 - </sect1> 341 - <sect1 id="see_also"> 342 - <title>See also</title> 343 - <para> 344 - <citation> 345 - <ulink url="http://kernel.org/pub/linux/kernel/people/sct/ext3/journal-design.ps.gz"> 346 - Journaling the Linux ext2fs Filesystem, LinuxExpo 98, Stephen Tweedie 347 - </ulink> 348 - </citation> 349 - </para> 350 - <para> 351 - <citation> 352 - <ulink url="http://olstrans.sourceforge.net/release/OLS2000-ext3/OLS2000-ext3.html"> 353 - Ext3 Journalling FileSystem, OLS 2000, Dr. Stephen Tweedie 354 - </ulink> 355 - </citation> 356 - </para> 357 - </sect1> 358 - 359 - </chapter> 360 - 361 - <chapter id="splice"> 362 - <title>splice API</title> 363 - <para> 364 - splice is a method for moving blocks of data around inside the 365 - kernel, without continually transferring them between the kernel 366 - and user space. 367 - </para> 368 - !Ffs/splice.c 369 - </chapter> 370 - 371 - <chapter id="pipes"> 372 - <title>pipes API</title> 373 - <para> 374 - Pipe interfaces are all for in-kernel (builtin image) use. 375 - They are not exported for use by modules. 376 - </para> 377 - !Iinclude/linux/pipe_fs_i.h 378 - !Ffs/pipe.c 379 - </chapter> 380 - 381 - </book>
+2
Documentation/conf.py
··· 359 359 'The kernel development community', 'manual'), 360 360 ('driver-api/index', 'driver-api.tex', 'The kernel driver API manual', 361 361 'The kernel development community', 'manual'), 362 + ('filesystems/index', 'filesystems.tex', 'Linux Filesystems API', 363 + 'The kernel development community', 'manual'), 362 364 ('gpu/index', 'gpu.tex', 'Linux GPU Driver Developer\'s Guide', 363 365 'The kernel development community', 'manual'), 364 366 ('input/index', 'linux-input.tex', 'The Linux input driver subsystem',
+10
Documentation/filesystems/conf.py
··· 1 + # -*- coding: utf-8; mode: python -*- 2 + 3 + project = "Linux Filesystems API" 4 + 5 + tags.add("subproject") 6 + 7 + latex_documents = [ 8 + ('index', 'filesystems.tex', project, 9 + 'The kernel development community', 'manual'), 10 + ]
+314
Documentation/filesystems/index.rst
··· 1 + ===================== 2 + Linux Filesystems API 3 + ===================== 4 + 5 + The Linux VFS 6 + ============= 7 + 8 + The Filesystem types 9 + -------------------- 10 + 11 + .. kernel-doc:: include/linux/fs.h 12 + :internal: 13 + 14 + The Directory Cache 15 + ------------------- 16 + 17 + .. kernel-doc:: fs/dcache.c 18 + :export: 19 + 20 + .. kernel-doc:: include/linux/dcache.h 21 + :internal: 22 + 23 + Inode Handling 24 + -------------- 25 + 26 + .. kernel-doc:: fs/inode.c 27 + :export: 28 + 29 + .. kernel-doc:: fs/bad_inode.c 30 + :export: 31 + 32 + Registration and Superblocks 33 + ---------------------------- 34 + 35 + .. kernel-doc:: fs/super.c 36 + :export: 37 + 38 + File Locks 39 + ---------- 40 + 41 + .. kernel-doc:: fs/locks.c 42 + :export: 43 + 44 + .. kernel-doc:: fs/locks.c 45 + :internal: 46 + 47 + Other Functions 48 + --------------- 49 + 50 + .. kernel-doc:: fs/mpage.c 51 + :export: 52 + 53 + .. kernel-doc:: fs/namei.c 54 + :export: 55 + 56 + .. kernel-doc:: fs/buffer.c 57 + :export: 58 + 59 + .. kernel-doc:: block/bio.c 60 + :export: 61 + 62 + .. kernel-doc:: fs/seq_file.c 63 + :export: 64 + 65 + .. kernel-doc:: fs/filesystems.c 66 + :export: 67 + 68 + .. kernel-doc:: fs/fs-writeback.c 69 + :export: 70 + 71 + .. kernel-doc:: fs/block_dev.c 72 + :export: 73 + 74 + The proc filesystem 75 + =================== 76 + 77 + sysctl interface 78 + ---------------- 79 + 80 + .. kernel-doc:: kernel/sysctl.c 81 + :export: 82 + 83 + proc filesystem interface 84 + ------------------------- 85 + 86 + .. kernel-doc:: fs/proc/base.c 87 + :internal: 88 + 89 + Events based on file descriptors 90 + ================================ 91 + 92 + .. kernel-doc:: fs/eventfd.c 93 + :export: 94 + 95 + The Filesystem for Exporting Kernel Objects 96 + =========================================== 97 + 98 + .. kernel-doc:: fs/sysfs/file.c 99 + :export: 100 + 101 + .. kernel-doc:: fs/sysfs/symlink.c 102 + :export: 103 + 104 + The debugfs filesystem 105 + ====================== 106 + 107 + debugfs interface 108 + ----------------- 109 + 110 + .. kernel-doc:: fs/debugfs/inode.c 111 + :export: 112 + 113 + .. kernel-doc:: fs/debugfs/file.c 114 + :export: 115 + 116 + The Linux Journalling API 117 + ========================= 118 + 119 + Overview 120 + -------- 121 + 122 + Details 123 + ~~~~~~~ 124 + 125 + The journalling layer is easy to use. You need to first of all create a 126 + journal_t data structure. There are two calls to do this dependent on 127 + how you decide to allocate the physical media on which the journal 128 + resides. The jbd2_journal_init_inode() call is for journals stored in 129 + filesystem inodes, or the jbd2_journal_init_dev() call can be used 130 + for journal stored on a raw device (in a continuous range of blocks). A 131 + journal_t is a typedef for a struct pointer, so when you are finally 132 + finished make sure you call jbd2_journal_destroy() on it to free up 133 + any used kernel memory. 134 + 135 + Once you have got your journal_t object you need to 'mount' or load the 136 + journal file. The journalling layer expects the space for the journal 137 + was already allocated and initialized properly by the userspace tools. 138 + When loading the journal you must call jbd2_journal_load() to process 139 + journal contents. If the client file system detects the journal contents 140 + does not need to be processed (or even need not have valid contents), it 141 + may call jbd2_journal_wipe() to clear the journal contents before 142 + calling jbd2_journal_load(). 143 + 144 + Note that jbd2_journal_wipe(..,0) calls 145 + jbd2_journal_skip_recovery() for you if it detects any outstanding 146 + transactions in the journal and similarly jbd2_journal_load() will 147 + call jbd2_journal_recover() if necessary. I would advise reading 148 + ext4_load_journal() in fs/ext4/super.c for examples on this stage. 149 + 150 + Now you can go ahead and start modifying the underlying filesystem. 151 + Almost. 152 + 153 + You still need to actually journal your filesystem changes, this is done 154 + by wrapping them into transactions. Additionally you also need to wrap 155 + the modification of each of the buffers with calls to the journal layer, 156 + so it knows what the modifications you are actually making are. To do 157 + this use jbd2_journal_start() which returns a transaction handle. 158 + 159 + jbd2_journal_start() and its counterpart jbd2_journal_stop(), which 160 + indicates the end of a transaction are nestable calls, so you can 161 + reenter a transaction if necessary, but remember you must call 162 + jbd2_journal_stop() the same number of times as jbd2_journal_start() 163 + before the transaction is completed (or more accurately leaves the 164 + update phase). Ext4/VFS makes use of this feature to simplify handling 165 + of inode dirtying, quota support, etc. 166 + 167 + Inside each transaction you need to wrap the modifications to the 168 + individual buffers (blocks). Before you start to modify a buffer you 169 + need to call jbd2_journal_get_{create,write,undo}_access() as 170 + appropriate, this allows the journalling layer to copy the unmodified 171 + data if it needs to. After all the buffer may be part of a previously 172 + uncommitted transaction. At this point you are at last ready to modify a 173 + buffer, and once you are have done so you need to call 174 + jbd2_journal_dirty_{meta,}data(). Or if you've asked for access to a 175 + buffer you now know is now longer required to be pushed back on the 176 + device you can call jbd2_journal_forget() in much the same way as you 177 + might have used bforget() in the past. 178 + 179 + A jbd2_journal_flush() may be called at any time to commit and 180 + checkpoint all your transactions. 181 + 182 + Then at umount time , in your put_super() you can then call 183 + jbd2_journal_destroy() to clean up your in-core journal object. 184 + 185 + Unfortunately there a couple of ways the journal layer can cause a 186 + deadlock. The first thing to note is that each task can only have a 187 + single outstanding transaction at any one time, remember nothing commits 188 + until the outermost jbd2_journal_stop(). This means you must complete 189 + the transaction at the end of each file/inode/address etc. operation you 190 + perform, so that the journalling system isn't re-entered on another 191 + journal. Since transactions can't be nested/batched across differing 192 + journals, and another filesystem other than yours (say ext4) may be 193 + modified in a later syscall. 194 + 195 + The second case to bear in mind is that jbd2_journal_start() can block 196 + if there isn't enough space in the journal for your transaction (based 197 + on the passed nblocks param) - when it blocks it merely(!) needs to wait 198 + for transactions to complete and be committed from other tasks, so 199 + essentially we are waiting for jbd2_journal_stop(). So to avoid 200 + deadlocks you must treat jbd2_journal_start/stop() as if they were 201 + semaphores and include them in your semaphore ordering rules to prevent 202 + deadlocks. Note that jbd2_journal_extend() has similar blocking 203 + behaviour to jbd2_journal_start() so you can deadlock here just as 204 + easily as on jbd2_journal_start(). 205 + 206 + Try to reserve the right number of blocks the first time. ;-). This will 207 + be the maximum number of blocks you are going to touch in this 208 + transaction. I advise having a look at at least ext4_jbd.h to see the 209 + basis on which ext4 uses to make these decisions. 210 + 211 + Another wriggle to watch out for is your on-disk block allocation 212 + strategy. Why? Because, if you do a delete, you need to ensure you 213 + haven't reused any of the freed blocks until the transaction freeing 214 + these blocks commits. If you reused these blocks and crash happens, 215 + there is no way to restore the contents of the reallocated blocks at the 216 + end of the last fully committed transaction. One simple way of doing 217 + this is to mark blocks as free in internal in-memory block allocation 218 + structures only after the transaction freeing them commits. Ext4 uses 219 + journal commit callback for this purpose. 220 + 221 + With journal commit callbacks you can ask the journalling layer to call 222 + a callback function when the transaction is finally committed to disk, 223 + so that you can do some of your own management. You ask the journalling 224 + layer for calling the callback by simply setting 225 + journal->j_commit_callback function pointer and that function is 226 + called after each transaction commit. You can also use 227 + transaction->t_private_list for attaching entries to a transaction 228 + that need processing when the transaction commits. 229 + 230 + JBD2 also provides a way to block all transaction updates via 231 + jbd2_journal_{un,}lock_updates(). Ext4 uses this when it wants a 232 + window with a clean and stable fs for a moment. E.g. 233 + 234 + :: 235 + 236 + 237 + jbd2_journal_lock_updates() //stop new stuff happening.. 238 + jbd2_journal_flush() // checkpoint everything. 239 + ..do stuff on stable fs 240 + jbd2_journal_unlock_updates() // carry on with filesystem use. 241 + 242 + The opportunities for abuse and DOS attacks with this should be obvious, 243 + if you allow unprivileged userspace to trigger codepaths containing 244 + these calls. 245 + 246 + Summary 247 + ~~~~~~~ 248 + 249 + Using the journal is a matter of wrapping the different context changes, 250 + being each mount, each modification (transaction) and each changed 251 + buffer to tell the journalling layer about them. 252 + 253 + Data Types 254 + ---------- 255 + 256 + The journalling layer uses typedefs to 'hide' the concrete definitions 257 + of the structures used. As a client of the JBD2 layer you can just rely 258 + on the using the pointer as a magic cookie of some sort. Obviously the 259 + hiding is not enforced as this is 'C'. 260 + 261 + Structures 262 + ~~~~~~~~~~ 263 + 264 + .. kernel-doc:: include/linux/jbd2.h 265 + :internal: 266 + 267 + Functions 268 + --------- 269 + 270 + The functions here are split into two groups those that affect a journal 271 + as a whole, and those which are used to manage transactions 272 + 273 + Journal Level 274 + ~~~~~~~~~~~~~ 275 + 276 + .. kernel-doc:: fs/jbd2/journal.c 277 + :export: 278 + 279 + .. kernel-doc:: fs/jbd2/recovery.c 280 + :internal: 281 + 282 + Transasction Level 283 + ~~~~~~~~~~~~~~~~~~ 284 + 285 + .. kernel-doc:: fs/jbd2/transaction.c 286 + :export: 287 + 288 + See also 289 + -------- 290 + 291 + `Journaling the Linux ext2fs Filesystem, LinuxExpo 98, Stephen 292 + Tweedie <http://kernel.org/pub/linux/kernel/people/sct/ext3/journal-design.ps.gz>`__ 293 + 294 + `Ext3 Journalling FileSystem, OLS 2000, Dr. Stephen 295 + Tweedie <http://olstrans.sourceforge.net/release/OLS2000-ext3/OLS2000-ext3.html>`__ 296 + 297 + splice API 298 + ========== 299 + 300 + splice is a method for moving blocks of data around inside the kernel, 301 + without continually transferring them between the kernel and user space. 302 + 303 + .. kernel-doc:: fs/splice.c 304 + 305 + pipes API 306 + ========= 307 + 308 + Pipe interfaces are all for in-kernel (builtin image) use. They are not 309 + exported for use by modules. 310 + 311 + .. kernel-doc:: include/linux/pipe_fs_i.h 312 + :internal: 313 + 314 + .. kernel-doc:: fs/pipe.c
+1
Documentation/index.rst
··· 73 73 security/index 74 74 sound/index 75 75 crypto/index 76 + filesystems/index 76 77 77 78 Korean translations 78 79 -------------------