diff options
Diffstat (limited to 'Documentation/filesystems')
-rw-r--r-- | Documentation/filesystems/Locking | 5 | ||||
-rw-r--r-- | Documentation/filesystems/ext3.txt | 6 | ||||
-rw-r--r-- | Documentation/filesystems/gfs2-glocks.txt | 119 | ||||
-rw-r--r-- | Documentation/filesystems/gfs2.txt | 9 | ||||
-rw-r--r-- | Documentation/filesystems/nfs/pnfs.txt | 2 | ||||
-rw-r--r-- | Documentation/filesystems/porting | 16 | ||||
-rw-r--r-- | Documentation/filesystems/proc.txt | 25 | ||||
-rw-r--r-- | Documentation/filesystems/qnx6.txt | 28 | ||||
-rw-r--r-- | Documentation/filesystems/vfs.txt | 17 |
9 files changed, 187 insertions, 40 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 4fca82e5276..8e2da1e06e3 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -60,8 +60,8 @@ ata *); | |||
60 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); | 60 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); |
61 | ssize_t (*listxattr) (struct dentry *, char *, size_t); | 61 | ssize_t (*listxattr) (struct dentry *, char *, size_t); |
62 | int (*removexattr) (struct dentry *, const char *); | 62 | int (*removexattr) (struct dentry *, const char *); |
63 | void (*truncate_range)(struct inode *, loff_t, loff_t); | ||
64 | int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); | 63 | int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); |
64 | void (*update_time)(struct inode *, struct timespec *, int); | ||
65 | 65 | ||
66 | locking rules: | 66 | locking rules: |
67 | all may block | 67 | all may block |
@@ -87,8 +87,9 @@ setxattr: yes | |||
87 | getxattr: no | 87 | getxattr: no |
88 | listxattr: no | 88 | listxattr: no |
89 | removexattr: yes | 89 | removexattr: yes |
90 | truncate_range: yes | ||
91 | fiemap: no | 90 | fiemap: no |
91 | update_time: no | ||
92 | |||
92 | Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on | 93 | Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on |
93 | victim. | 94 | victim. |
94 | cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem. | 95 | cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem. |
diff --git a/Documentation/filesystems/ext3.txt b/Documentation/filesystems/ext3.txt index b100adc38ad..293855e9500 100644 --- a/Documentation/filesystems/ext3.txt +++ b/Documentation/filesystems/ext3.txt | |||
@@ -59,9 +59,9 @@ commit=nrsec (*) Ext3 can be told to sync all its data and metadata | |||
59 | Setting it to very large values will improve | 59 | Setting it to very large values will improve |
60 | performance. | 60 | performance. |
61 | 61 | ||
62 | barrier=<0(*)|1> This enables/disables the use of write barriers in | 62 | barrier=<0|1(*)> This enables/disables the use of write barriers in |
63 | barrier the jbd code. barrier=0 disables, barrier=1 enables. | 63 | barrier (*) the jbd code. barrier=0 disables, barrier=1 enables. |
64 | nobarrier (*) This also requires an IO stack which can support | 64 | nobarrier This also requires an IO stack which can support |
65 | barriers, and if jbd gets an error on a barrier | 65 | barriers, and if jbd gets an error on a barrier |
66 | write, it will disable again with a warning. | 66 | write, it will disable again with a warning. |
67 | Write barriers enforce proper on-disk ordering | 67 | Write barriers enforce proper on-disk ordering |
diff --git a/Documentation/filesystems/gfs2-glocks.txt b/Documentation/filesystems/gfs2-glocks.txt index 0494f78d87e..fcc79957be6 100644 --- a/Documentation/filesystems/gfs2-glocks.txt +++ b/Documentation/filesystems/gfs2-glocks.txt | |||
@@ -61,7 +61,9 @@ go_unlock | Called on the final local unlock of a lock | |||
61 | go_dump | Called to print content of object for debugfs file, or on | 61 | go_dump | Called to print content of object for debugfs file, or on |
62 | | error to dump glock to the log. | 62 | | error to dump glock to the log. |
63 | go_type | The type of the glock, LM_TYPE_..... | 63 | go_type | The type of the glock, LM_TYPE_..... |
64 | go_min_hold_time | The minimum hold time | 64 | go_callback | Called if the DLM sends a callback to drop this lock |
65 | go_flags | GLOF_ASPACE is set, if the glock has an address space | ||
66 | | associated with it | ||
65 | 67 | ||
66 | The minimum hold time for each lock is the time after a remote lock | 68 | The minimum hold time for each lock is the time after a remote lock |
67 | grant for which we ignore remote demote requests. This is in order to | 69 | grant for which we ignore remote demote requests. This is in order to |
@@ -89,6 +91,7 @@ go_demote_ok | Sometimes | Yes | |||
89 | go_lock | Yes | No | 91 | go_lock | Yes | No |
90 | go_unlock | Yes | No | 92 | go_unlock | Yes | No |
91 | go_dump | Sometimes | Yes | 93 | go_dump | Sometimes | Yes |
94 | go_callback | Sometimes (N/A) | Yes | ||
92 | 95 | ||
93 | N.B. Operations must not drop either the bit lock or the spinlock | 96 | N.B. Operations must not drop either the bit lock or the spinlock |
94 | if its held on entry. go_dump and do_demote_ok must never block. | 97 | if its held on entry. go_dump and do_demote_ok must never block. |
@@ -111,4 +114,118 @@ itself (locking order as above), and the other, known as the iopen | |||
111 | glock is used in conjunction with the i_nlink field in the inode to | 114 | glock is used in conjunction with the i_nlink field in the inode to |
112 | determine the lifetime of the inode in question. Locking of inodes | 115 | determine the lifetime of the inode in question. Locking of inodes |
113 | is on a per-inode basis. Locking of rgrps is on a per rgrp basis. | 116 | is on a per-inode basis. Locking of rgrps is on a per rgrp basis. |
117 | In general we prefer to lock local locks prior to cluster locks. | ||
118 | |||
119 | Glock Statistics | ||
120 | ------------------ | ||
121 | |||
122 | The stats are divided into two sets: those relating to the | ||
123 | super block and those relating to an individual glock. The | ||
124 | super block stats are done on a per cpu basis in order to | ||
125 | try and reduce the overhead of gathering them. They are also | ||
126 | further divided by glock type. All timings are in nanoseconds. | ||
127 | |||
128 | In the case of both the super block and glock statistics, | ||
129 | the same information is gathered in each case. The super | ||
130 | block timing statistics are used to provide default values for | ||
131 | the glock timing statistics, so that newly created glocks | ||
132 | should have, as far as possible, a sensible starting point. | ||
133 | The per-glock counters are initialised to zero when the | ||
134 | glock is created. The per-glock statistics are lost when | ||
135 | the glock is ejected from memory. | ||
136 | |||
137 | The statistics are divided into three pairs of mean and | ||
138 | variance, plus two counters. The mean/variance pairs are | ||
139 | smoothed exponential estimates and the algorithm used is | ||
140 | one which will be very familiar to those used to calculation | ||
141 | of round trip times in network code. See "TCP/IP Illustrated, | ||
142 | Volume 1", W. Richard Stevens, sect 21.3, "Round-Trip Time Measurement", | ||
143 | p. 299 and onwards. Also, Volume 2, Sect. 25.10, p. 838 and onwards. | ||
144 | Unlike the TCP/IP Illustrated case, the mean and variance are | ||
145 | not scaled, but are in units of integer nanoseconds. | ||
146 | |||
147 | The three pairs of mean/variance measure the following | ||
148 | things: | ||
149 | |||
150 | 1. DLM lock time (non-blocking requests) | ||
151 | 2. DLM lock time (blocking requests) | ||
152 | 3. Inter-request time (again to the DLM) | ||
153 | |||
154 | A non-blocking request is one which will complete right | ||
155 | away, whatever the state of the DLM lock in question. That | ||
156 | currently means any requests when (a) the current state of | ||
157 | the lock is exclusive, i.e. a lock demotion (b) the requested | ||
158 | state is either null or unlocked (again, a demotion) or (c) the | ||
159 | "try lock" flag is set. A blocking request covers all the other | ||
160 | lock requests. | ||
161 | |||
162 | There are two counters. The first is there primarily to show | ||
163 | how many lock requests have been made, and thus how much data | ||
164 | has gone into the mean/variance calculations. The other counter | ||
165 | is counting queuing of holders at the top layer of the glock | ||
166 | code. Hopefully that number will be a lot larger than the number | ||
167 | of dlm lock requests issued. | ||
168 | |||
169 | So why gather these statistics? There are several reasons | ||
170 | we'd like to get a better idea of these timings: | ||
171 | |||
172 | 1. To be able to better set the glock "min hold time" | ||
173 | 2. To spot performance issues more easily | ||
174 | 3. To improve the algorithm for selecting resource groups for | ||
175 | allocation (to base it on lock wait time, rather than blindly | ||
176 | using a "try lock") | ||
177 | |||
178 | Due to the smoothing action of the updates, a step change in | ||
179 | some input quantity being sampled will only fully be taken | ||
180 | into account after 8 samples (or 4 for the variance) and this | ||
181 | needs to be carefully considered when interpreting the | ||
182 | results. | ||
183 | |||
184 | Knowing both the time it takes a lock request to complete and | ||
185 | the average time between lock requests for a glock means we | ||
186 | can compute the total percentage of the time for which the | ||
187 | node is able to use a glock vs. time that the rest of the | ||
188 | cluster has its share. That will be very useful when setting | ||
189 | the lock min hold time. | ||
190 | |||
191 | Great care has been taken to ensure that we | ||
192 | measure exactly the quantities that we want, as accurately | ||
193 | as possible. There are always inaccuracies in any | ||
194 | measuring system, but I hope this is as accurate as we | ||
195 | can reasonably make it. | ||
196 | |||
197 | Per sb stats can be found here: | ||
198 | /sys/kernel/debug/gfs2/<fsname>/sbstats | ||
199 | Per glock stats can be found here: | ||
200 | /sys/kernel/debug/gfs2/<fsname>/glstats | ||
201 | |||
202 | Assuming that debugfs is mounted on /sys/kernel/debug and also | ||
203 | that <fsname> is replaced with the name of the gfs2 filesystem | ||
204 | in question. | ||
205 | |||
206 | The abbreviations used in the output as are follows: | ||
207 | |||
208 | srtt - Smoothed round trip time for non-blocking dlm requests | ||
209 | srttvar - Variance estimate for srtt | ||
210 | srttb - Smoothed round trip time for (potentially) blocking dlm requests | ||
211 | srttvarb - Variance estimate for srttb | ||
212 | sirt - Smoothed inter-request time (for dlm requests) | ||
213 | sirtvar - Variance estimate for sirt | ||
214 | dlm - Number of dlm requests made (dcnt in glstats file) | ||
215 | queue - Number of glock requests queued (qcnt in glstats file) | ||
216 | |||
217 | The sbstats file contains a set of these stats for each glock type (so 8 lines | ||
218 | for each type) and for each cpu (one column per cpu). The glstats file contains | ||
219 | a set of these stats for each glock in a similar format to the glocks file, but | ||
220 | using the format mean/variance for each of the timing stats. | ||
221 | |||
222 | The gfs2_glock_lock_time tracepoint prints out the current values of the stats | ||
223 | for the glock in question, along with some addition information on each dlm | ||
224 | reply that is received: | ||
225 | |||
226 | status - The status of the dlm request | ||
227 | flags - The dlm request flags | ||
228 | tdiff - The time taken by this specific request | ||
229 | (remaining fields as per above list) | ||
230 | |||
114 | 231 | ||
diff --git a/Documentation/filesystems/gfs2.txt b/Documentation/filesystems/gfs2.txt index 4cda926628a..cc4f2306609 100644 --- a/Documentation/filesystems/gfs2.txt +++ b/Documentation/filesystems/gfs2.txt | |||
@@ -1,7 +1,7 @@ | |||
1 | Global File System | 1 | Global File System |
2 | ------------------ | 2 | ------------------ |
3 | 3 | ||
4 | http://sources.redhat.com/cluster/wiki/ | 4 | https://fedorahosted.org/cluster/wiki/HomePage |
5 | 5 | ||
6 | GFS is a cluster file system. It allows a cluster of computers to | 6 | GFS is a cluster file system. It allows a cluster of computers to |
7 | simultaneously use a block device that is shared between them (with FC, | 7 | simultaneously use a block device that is shared between them (with FC, |
@@ -30,7 +30,8 @@ needed, simply: | |||
30 | 30 | ||
31 | If you are using Fedora, you need to install the gfs2-utils package | 31 | If you are using Fedora, you need to install the gfs2-utils package |
32 | and, for lock_dlm, you will also need to install the cman package | 32 | and, for lock_dlm, you will also need to install the cman package |
33 | and write a cluster.conf as per the documentation. | 33 | and write a cluster.conf as per the documentation. For F17 and above |
34 | cman has been replaced by the dlm package. | ||
34 | 35 | ||
35 | GFS2 is not on-disk compatible with previous versions of GFS, but it | 36 | GFS2 is not on-disk compatible with previous versions of GFS, but it |
36 | is pretty close. | 37 | is pretty close. |
@@ -39,8 +40,6 @@ The following man pages can be found at the URL above: | |||
39 | fsck.gfs2 to repair a filesystem | 40 | fsck.gfs2 to repair a filesystem |
40 | gfs2_grow to expand a filesystem online | 41 | gfs2_grow to expand a filesystem online |
41 | gfs2_jadd to add journals to a filesystem online | 42 | gfs2_jadd to add journals to a filesystem online |
42 | gfs2_tool to manipulate, examine and tune a filesystem | 43 | tunegfs2 to manipulate, examine and tune a filesystem |
43 | gfs2_quota to examine and change quota values in a filesystem | ||
44 | gfs2_convert to convert a gfs filesystem to gfs2 in-place | 44 | gfs2_convert to convert a gfs filesystem to gfs2 in-place |
45 | mount.gfs2 to help mount(8) mount a filesystem | ||
46 | mkfs.gfs2 to make a filesystem | 45 | mkfs.gfs2 to make a filesystem |
diff --git a/Documentation/filesystems/nfs/pnfs.txt b/Documentation/filesystems/nfs/pnfs.txt index c7919c6e3be..52ae07f5f57 100644 --- a/Documentation/filesystems/nfs/pnfs.txt +++ b/Documentation/filesystems/nfs/pnfs.txt | |||
@@ -93,7 +93,7 @@ The API to the login script is as follows: | |||
93 | (allways exists) | 93 | (allways exists) |
94 | (More protocols can be defined in the future. | 94 | (More protocols can be defined in the future. |
95 | The client does not interpret this string it is | 95 | The client does not interpret this string it is |
96 | passed unchanged as recieved from the Server) | 96 | passed unchanged as received from the Server) |
97 | -o osdname of the requested target OSD | 97 | -o osdname of the requested target OSD |
98 | (Might be empty) | 98 | (Might be empty) |
99 | (A string which denotes the OSD name, there is a | 99 | (A string which denotes the OSD name, there is a |
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index 74acd961881..8c91d1057d9 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting | |||
@@ -297,7 +297,8 @@ in the beginning of ->setattr unconditionally. | |||
297 | be used instead. It gets called whenever the inode is evicted, whether it has | 297 | be used instead. It gets called whenever the inode is evicted, whether it has |
298 | remaining links or not. Caller does *not* evict the pagecache or inode-associated | 298 | remaining links or not. Caller does *not* evict the pagecache or inode-associated |
299 | metadata buffers; getting rid of those is responsibility of method, as it had | 299 | metadata buffers; getting rid of those is responsibility of method, as it had |
300 | been for ->delete_inode(). | 300 | been for ->delete_inode(). Caller makes sure async writeback cannot be running |
301 | for the inode while (or after) ->evict_inode() is called. | ||
301 | 302 | ||
302 | ->drop_inode() returns int now; it's called on final iput() with | 303 | ->drop_inode() returns int now; it's called on final iput() with |
303 | inode->i_lock held and it returns true if filesystems wants the inode to be | 304 | inode->i_lock held and it returns true if filesystems wants the inode to be |
@@ -306,14 +307,11 @@ updated appropriately. generic_delete_inode() is also alive and it consists | |||
306 | simply of return 1. Note that all actual eviction work is done by caller after | 307 | simply of return 1. Note that all actual eviction work is done by caller after |
307 | ->drop_inode() returns. | 308 | ->drop_inode() returns. |
308 | 309 | ||
309 | clear_inode() is gone; use end_writeback() instead. As before, it must | 310 | As before, clear_inode() must be called exactly once on each call of |
310 | be called exactly once on each call of ->evict_inode() (as it used to be for | 311 | ->evict_inode() (as it used to be for each call of ->delete_inode()). Unlike |
311 | each call of ->delete_inode()). Unlike before, if you are using inode-associated | 312 | before, if you are using inode-associated metadata buffers (i.e. |
312 | metadata buffers (i.e. mark_buffer_dirty_inode()), it's your responsibility to | 313 | mark_buffer_dirty_inode()), it's your responsibility to call |
313 | call invalidate_inode_buffers() before end_writeback(). | 314 | invalidate_inode_buffers() before clear_inode(). |
314 | No async writeback (and thus no calls of ->write_inode()) will happen | ||
315 | after end_writeback() returns, so actions that should not overlap with ->write_inode() | ||
316 | (e.g. freeing on-disk inode if i_nlink is 0) ought to be done after that call. | ||
317 | 315 | ||
318 | NOTE: checking i_nlink in the beginning of ->write_inode() and bailing out | 316 | NOTE: checking i_nlink in the beginning of ->write_inode() and bailing out |
319 | if it's zero is not *and* *never* *had* *been* enough. Final unlink() and iput() | 317 | if it's zero is not *and* *never* *had* *been* enough. Final unlink() and iput() |
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index ef088e55ab2..fb0a6aeb936 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -40,6 +40,7 @@ Table of Contents | |||
40 | 3.4 /proc/<pid>/coredump_filter - Core dump filtering settings | 40 | 3.4 /proc/<pid>/coredump_filter - Core dump filtering settings |
41 | 3.5 /proc/<pid>/mountinfo - Information about mounts | 41 | 3.5 /proc/<pid>/mountinfo - Information about mounts |
42 | 3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm | 42 | 3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm |
43 | 3.7 /proc/<pid>/task/<tid>/children - Information about task children | ||
43 | 44 | ||
44 | 4 Configuring procfs | 45 | 4 Configuring procfs |
45 | 4.1 Mount options | 46 | 4.1 Mount options |
@@ -310,6 +311,11 @@ Table 1-4: Contents of the stat files (as of 2.6.30-rc7) | |||
310 | start_data address above which program data+bss is placed | 311 | start_data address above which program data+bss is placed |
311 | end_data address below which program data+bss is placed | 312 | end_data address below which program data+bss is placed |
312 | start_brk address above which program heap can be expanded with brk() | 313 | start_brk address above which program heap can be expanded with brk() |
314 | arg_start address above which program command line is placed | ||
315 | arg_end address below which program command line is placed | ||
316 | env_start address above which program environment is placed | ||
317 | env_end address below which program environment is placed | ||
318 | exit_code the thread's exit_code in the form reported by the waitpid system call | ||
313 | .............................................................................. | 319 | .............................................................................. |
314 | 320 | ||
315 | The /proc/PID/maps file containing the currently mapped memory regions and | 321 | The /proc/PID/maps file containing the currently mapped memory regions and |
@@ -743,6 +749,7 @@ Committed_AS: 100056 kB | |||
743 | VmallocTotal: 112216 kB | 749 | VmallocTotal: 112216 kB |
744 | VmallocUsed: 428 kB | 750 | VmallocUsed: 428 kB |
745 | VmallocChunk: 111088 kB | 751 | VmallocChunk: 111088 kB |
752 | AnonHugePages: 49152 kB | ||
746 | 753 | ||
747 | MemTotal: Total usable ram (i.e. physical ram minus a few reserved | 754 | MemTotal: Total usable ram (i.e. physical ram minus a few reserved |
748 | bits and the kernel binary code) | 755 | bits and the kernel binary code) |
@@ -776,6 +783,7 @@ VmallocChunk: 111088 kB | |||
776 | Dirty: Memory which is waiting to get written back to the disk | 783 | Dirty: Memory which is waiting to get written back to the disk |
777 | Writeback: Memory which is actively being written back to the disk | 784 | Writeback: Memory which is actively being written back to the disk |
778 | AnonPages: Non-file backed pages mapped into userspace page tables | 785 | AnonPages: Non-file backed pages mapped into userspace page tables |
786 | AnonHugePages: Non-file backed huge pages mapped into userspace page tables | ||
779 | Mapped: files which have been mmaped, such as libraries | 787 | Mapped: files which have been mmaped, such as libraries |
780 | Slab: in-kernel data structures cache | 788 | Slab: in-kernel data structures cache |
781 | SReclaimable: Part of Slab, that might be reclaimed, such as caches | 789 | SReclaimable: Part of Slab, that might be reclaimed, such as caches |
@@ -1576,6 +1584,23 @@ then the kernel's TASK_COMM_LEN (currently 16 chars) will result in a truncated | |||
1576 | comm value. | 1584 | comm value. |
1577 | 1585 | ||
1578 | 1586 | ||
1587 | 3.7 /proc/<pid>/task/<tid>/children - Information about task children | ||
1588 | ------------------------------------------------------------------------- | ||
1589 | This file provides a fast way to retrieve first level children pids | ||
1590 | of a task pointed by <pid>/<tid> pair. The format is a space separated | ||
1591 | stream of pids. | ||
1592 | |||
1593 | Note the "first level" here -- if a child has own children they will | ||
1594 | not be listed here, one needs to read /proc/<children-pid>/task/<tid>/children | ||
1595 | to obtain the descendants. | ||
1596 | |||
1597 | Since this interface is intended to be fast and cheap it doesn't | ||
1598 | guarantee to provide precise results and some children might be | ||
1599 | skipped, especially if they've exited right after we printed their | ||
1600 | pids, so one need to either stop or freeze processes being inspected | ||
1601 | if precise results are needed. | ||
1602 | |||
1603 | |||
1579 | ------------------------------------------------------------------------------ | 1604 | ------------------------------------------------------------------------------ |
1580 | Configuring procfs | 1605 | Configuring procfs |
1581 | ------------------------------------------------------------------------------ | 1606 | ------------------------------------------------------------------------------ |
diff --git a/Documentation/filesystems/qnx6.txt b/Documentation/filesystems/qnx6.txt index 050223ea03c..e59f2f09f56 100644 --- a/Documentation/filesystems/qnx6.txt +++ b/Documentation/filesystems/qnx6.txt | |||
@@ -17,7 +17,7 @@ concepts of blocks, inodes and directories. | |||
17 | On QNX it is possible to create little endian and big endian qnx6 filesystems. | 17 | On QNX it is possible to create little endian and big endian qnx6 filesystems. |
18 | This feature makes it possible to create and use a different endianness fs | 18 | This feature makes it possible to create and use a different endianness fs |
19 | for the target (QNX is used on quite a range of embedded systems) plattform | 19 | for the target (QNX is used on quite a range of embedded systems) plattform |
20 | running on a different endianess. | 20 | running on a different endianness. |
21 | The Linux driver handles endianness transparently. (LE and BE) | 21 | The Linux driver handles endianness transparently. (LE and BE) |
22 | 22 | ||
23 | Blocks | 23 | Blocks |
@@ -26,7 +26,7 @@ Blocks | |||
26 | The space in the device or file is split up into blocks. These are a fixed | 26 | The space in the device or file is split up into blocks. These are a fixed |
27 | size of 512, 1024, 2048 or 4096, which is decided when the filesystem is | 27 | size of 512, 1024, 2048 or 4096, which is decided when the filesystem is |
28 | created. | 28 | created. |
29 | Blockpointers are 32bit, so the maximum space that can be adressed is | 29 | Blockpointers are 32bit, so the maximum space that can be addressed is |
30 | 2^32 * 4096 bytes or 16TB | 30 | 2^32 * 4096 bytes or 16TB |
31 | 31 | ||
32 | The superblocks | 32 | The superblocks |
@@ -47,16 +47,16 @@ inactive superblock. | |||
47 | Each superblock holds a set of root inodes for the different filesystem | 47 | Each superblock holds a set of root inodes for the different filesystem |
48 | parts. (Inode, Bitmap and Longfilenames) | 48 | parts. (Inode, Bitmap and Longfilenames) |
49 | Each of these root nodes holds information like total size of the stored | 49 | Each of these root nodes holds information like total size of the stored |
50 | data and the adressing levels in that specific tree. | 50 | data and the addressing levels in that specific tree. |
51 | If the level value is 0, up to 16 direct blocks can be adressed by each | 51 | If the level value is 0, up to 16 direct blocks can be addressed by each |
52 | node. | 52 | node. |
53 | Level 1 adds an additional indirect adressing level where each indirect | 53 | Level 1 adds an additional indirect addressing level where each indirect |
54 | adressing block holds up to blocksize / 4 bytes pointers to data blocks. | 54 | addressing block holds up to blocksize / 4 bytes pointers to data blocks. |
55 | Level 2 adds an additional indirect adressig block level (so, already up | 55 | Level 2 adds an additional indirect addressing block level (so, already up |
56 | to 16 * 256 * 256 = 1048576 blocks that can be adressed by such a tree)a | 56 | to 16 * 256 * 256 = 1048576 blocks that can be addressed by such a tree). |
57 | 57 | ||
58 | Unused block pointers are always set to ~0 - regardless of root node, | 58 | Unused block pointers are always set to ~0 - regardless of root node, |
59 | indirect adressing blocks or inodes. | 59 | indirect addressing blocks or inodes. |
60 | Data leaves are always on the lowest level. So no data is stored on upper | 60 | Data leaves are always on the lowest level. So no data is stored on upper |
61 | tree levels. | 61 | tree levels. |
62 | 62 | ||
@@ -64,7 +64,7 @@ The first Superblock is located at 0x2000. (0x2000 is the bootblock size) | |||
64 | The Audi MMI 3G first superblock directly starts at byte 0. | 64 | The Audi MMI 3G first superblock directly starts at byte 0. |
65 | Second superblock position can either be calculated from the superblock | 65 | Second superblock position can either be calculated from the superblock |
66 | information (total number of filesystem blocks) or by taking the highest | 66 | information (total number of filesystem blocks) or by taking the highest |
67 | device address, zeroing the last 3 bytes and then substracting 0x1000 from | 67 | device address, zeroing the last 3 bytes and then subtracting 0x1000 from |
68 | that address. | 68 | that address. |
69 | 69 | ||
70 | 0x1000 is the size reserved for each superblock - regardless of the | 70 | 0x1000 is the size reserved for each superblock - regardless of the |
@@ -83,8 +83,8 @@ size, number of blocks used, access time, change time and modification time. | |||
83 | Object mode field is POSIX format. (which makes things easier) | 83 | Object mode field is POSIX format. (which makes things easier) |
84 | 84 | ||
85 | There are also pointers to the first 16 blocks, if the object data can be | 85 | There are also pointers to the first 16 blocks, if the object data can be |
86 | adressed with 16 direct blocks. | 86 | addressed with 16 direct blocks. |
87 | For more than 16 blocks an indirect adressing in form of another tree is | 87 | For more than 16 blocks an indirect addressing in form of another tree is |
88 | used. (scheme is the same as the one used for the superblock root nodes) | 88 | used. (scheme is the same as the one used for the superblock root nodes) |
89 | 89 | ||
90 | The filesize is stored 64bit. Inode counting starts with 1. (whilst long | 90 | The filesize is stored 64bit. Inode counting starts with 1. (whilst long |
@@ -118,13 +118,13 @@ no block pointers and the directory file record pointing to the target file | |||
118 | inode. | 118 | inode. |
119 | 119 | ||
120 | Character and block special devices do not exist in QNX as those files | 120 | Character and block special devices do not exist in QNX as those files |
121 | are handled by the QNX kernel/drivers and created in /dev independant of the | 121 | are handled by the QNX kernel/drivers and created in /dev independent of the |
122 | underlaying filesystem. | 122 | underlaying filesystem. |
123 | 123 | ||
124 | Long filenames | 124 | Long filenames |
125 | -------------- | 125 | -------------- |
126 | 126 | ||
127 | Long filenames are stored in a seperate adressing tree. The staring point | 127 | Long filenames are stored in a separate addressing tree. The staring point |
128 | is the longfilename root node in the active superblock. | 128 | is the longfilename root node in the active superblock. |
129 | Each data block (tree leaves) holds one long filename. That filename is | 129 | Each data block (tree leaves) holds one long filename. That filename is |
130 | limited to 510 bytes. The first two starting bytes are used as length field | 130 | limited to 510 bytes. The first two starting bytes are used as length field |
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 0d049202808..efd23f48170 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -363,7 +363,7 @@ struct inode_operations { | |||
363 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); | 363 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); |
364 | ssize_t (*listxattr) (struct dentry *, char *, size_t); | 364 | ssize_t (*listxattr) (struct dentry *, char *, size_t); |
365 | int (*removexattr) (struct dentry *, const char *); | 365 | int (*removexattr) (struct dentry *, const char *); |
366 | void (*truncate_range)(struct inode *, loff_t, loff_t); | 366 | void (*update_time)(struct inode *, struct timespec *, int); |
367 | }; | 367 | }; |
368 | 368 | ||
369 | Again, all methods are called without any locks being held, unless | 369 | Again, all methods are called without any locks being held, unless |
@@ -472,9 +472,9 @@ otherwise noted. | |||
472 | removexattr: called by the VFS to remove an extended attribute from | 472 | removexattr: called by the VFS to remove an extended attribute from |
473 | a file. This method is called by removexattr(2) system call. | 473 | a file. This method is called by removexattr(2) system call. |
474 | 474 | ||
475 | truncate_range: a method provided by the underlying filesystem to truncate a | 475 | update_time: called by the VFS to update a specific time or the i_version of |
476 | range of blocks , i.e. punch a hole somewhere in a file. | 476 | an inode. If this is not defined the VFS will update the inode itself |
477 | 477 | and call mark_inode_dirty_sync. | |
478 | 478 | ||
479 | The Address Space Object | 479 | The Address Space Object |
480 | ======================== | 480 | ======================== |
@@ -760,7 +760,7 @@ struct file_operations | |||
760 | ---------------------- | 760 | ---------------------- |
761 | 761 | ||
762 | This describes how the VFS can manipulate an open file. As of kernel | 762 | This describes how the VFS can manipulate an open file. As of kernel |
763 | 2.6.22, the following members are defined: | 763 | 3.5, the following members are defined: |
764 | 764 | ||
765 | struct file_operations { | 765 | struct file_operations { |
766 | struct module *owner; | 766 | struct module *owner; |
@@ -790,6 +790,8 @@ struct file_operations { | |||
790 | int (*flock) (struct file *, int, struct file_lock *); | 790 | int (*flock) (struct file *, int, struct file_lock *); |
791 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned int); | 791 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned int); |
792 | ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int); | 792 | ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int); |
793 | int (*setlease)(struct file *, long arg, struct file_lock **); | ||
794 | long (*fallocate)(struct file *, int mode, loff_t offset, loff_t len); | ||
793 | }; | 795 | }; |
794 | 796 | ||
795 | Again, all methods are called without any locks being held, unless | 797 | Again, all methods are called without any locks being held, unless |
@@ -858,6 +860,11 @@ otherwise noted. | |||
858 | splice_read: called by the VFS to splice data from file to a pipe. This | 860 | splice_read: called by the VFS to splice data from file to a pipe. This |
859 | method is used by the splice(2) system call | 861 | method is used by the splice(2) system call |
860 | 862 | ||
863 | setlease: called by the VFS to set or release a file lock lease. | ||
864 | setlease has the file_lock_lock held and must not sleep. | ||
865 | |||
866 | fallocate: called by the VFS to preallocate blocks or punch a hole. | ||
867 | |||
861 | Note that the file operations are implemented by the specific | 868 | Note that the file operations are implemented by the specific |
862 | filesystem in which the inode resides. When opening a device node | 869 | filesystem in which the inode resides. When opening a device node |
863 | (character or block special) most filesystems will call special | 870 | (character or block special) most filesystems will call special |