Commit e6f7df74 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Jonathan Corbet

docs: filesystems: convert fiemap.txt to ReST

- Add a SPDX header;
- Some whitespace fixes and new line breaks;
- Mark literal blocks as such;
- Add it to filesystems/index.rst.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Link: https://lore.kernel.org/r/9182d49ffca7a0580e32ab24ecf5f8cc8d8924af.1588021877.git.mchehab+huawei@kernel.orgSigned-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent b31763cf
.. SPDX-License-Identifier: GPL-2.0
============ ============
Fiemap Ioctl Fiemap Ioctl
============ ============
...@@ -10,9 +12,9 @@ returns a list of extents. ...@@ -10,9 +12,9 @@ returns a list of extents.
Request Basics Request Basics
-------------- --------------
A fiemap request is encoded within struct fiemap: A fiemap request is encoded within struct fiemap::
struct fiemap { struct fiemap {
__u64 fm_start; /* logical offset (inclusive) at __u64 fm_start; /* logical offset (inclusive) at
* which to start mapping (in) */ * which to start mapping (in) */
__u64 fm_length; /* logical length of mapping which __u64 fm_length; /* logical length of mapping which
...@@ -23,7 +25,7 @@ struct fiemap { ...@@ -23,7 +25,7 @@ struct fiemap {
__u32 fm_extent_count; /* size of fm_extents array (in) */ __u32 fm_extent_count; /* size of fm_extents array (in) */
__u32 fm_reserved; __u32 fm_reserved;
struct fiemap_extent fm_extents[0]; /* array of mapped extents (out) */ struct fiemap_extent fm_extents[0]; /* array of mapped extents (out) */
}; };
fm_start, and fm_length specify the logical range within the file fm_start, and fm_length specify the logical range within the file
...@@ -51,12 +53,12 @@ nothing to prevent the file from changing between calls to FIEMAP. ...@@ -51,12 +53,12 @@ nothing to prevent the file from changing between calls to FIEMAP.
The following flags can be set in fm_flags: The following flags can be set in fm_flags:
* FIEMAP_FLAG_SYNC FIEMAP_FLAG_SYNC
If this flag is set, the kernel will sync the file before mapping extents. If this flag is set, the kernel will sync the file before mapping extents.
* FIEMAP_FLAG_XATTR FIEMAP_FLAG_XATTR
If this flag is set, the extents returned will describe the inodes If this flag is set, the extents returned will describe the inodes
extended attribute lookup tree, instead of its data tree. extended attribute lookup tree, instead of its data tree.
Extent Mapping Extent Mapping
...@@ -75,9 +77,9 @@ complete the requested range and will not have the FIEMAP_EXTENT_LAST ...@@ -75,9 +77,9 @@ complete the requested range and will not have the FIEMAP_EXTENT_LAST
flag set (see the next section on extent flags). flag set (see the next section on extent flags).
Each extent is described by a single fiemap_extent structure as Each extent is described by a single fiemap_extent structure as
returned in fm_extents. returned in fm_extents::
struct fiemap_extent { struct fiemap_extent {
__u64 fe_logical; /* logical offset in bytes for the start of __u64 fe_logical; /* logical offset in bytes for the start of
* the extent */ * the extent */
__u64 fe_physical; /* physical offset in bytes for the start __u64 fe_physical; /* physical offset in bytes for the start
...@@ -86,7 +88,7 @@ struct fiemap_extent { ...@@ -86,7 +88,7 @@ struct fiemap_extent {
__u64 fe_reserved64[2]; __u64 fe_reserved64[2];
__u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */ __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
__u32 fe_reserved[3]; __u32 fe_reserved[3];
}; };
All offsets and lengths are in bytes and mirror those on disk. It is valid All offsets and lengths are in bytes and mirror those on disk. It is valid
for an extents logical offset to start before the request or its logical for an extents logical offset to start before the request or its logical
...@@ -114,26 +116,27 @@ worry about all present and future flags which might imply unaligned ...@@ -114,26 +116,27 @@ worry about all present and future flags which might imply unaligned
data. Note that the opposite is not true - it would be valid for data. Note that the opposite is not true - it would be valid for
FIEMAP_EXTENT_NOT_ALIGNED to appear alone. FIEMAP_EXTENT_NOT_ALIGNED to appear alone.
* FIEMAP_EXTENT_LAST FIEMAP_EXTENT_LAST
This is generally the last extent in the file. A mapping attempt past This is generally the last extent in the file. A mapping attempt past
this extent may return nothing. Some implementations set this flag to this extent may return nothing. Some implementations set this flag to
indicate this extent is the last one in the range queried by the user indicate this extent is the last one in the range queried by the user
(via fiemap->fm_length). (via fiemap->fm_length).
FIEMAP_EXTENT_UNKNOWN
The location of this extent is currently unknown. This may indicate
the data is stored on an inaccessible volume or that no storage has
been allocated for the file yet.
* FIEMAP_EXTENT_UNKNOWN FIEMAP_EXTENT_DELALLOC
The location of this extent is currently unknown. This may indicate This will also set FIEMAP_EXTENT_UNKNOWN.
the data is stored on an inaccessible volume or that no storage has
been allocated for the file yet.
* FIEMAP_EXTENT_DELALLOC Delayed allocation - while there is data for this extent, its
- This will also set FIEMAP_EXTENT_UNKNOWN. physical location has not been allocated yet.
Delayed allocation - while there is data for this extent, its
physical location has not been allocated yet.
* FIEMAP_EXTENT_ENCODED FIEMAP_EXTENT_ENCODED
This extent does not consist of plain filesystem blocks but is This extent does not consist of plain filesystem blocks but is
encoded (e.g. encrypted or compressed). Reading the data in this encoded (e.g. encrypted or compressed). Reading the data in this
extent via I/O to the block device will have undefined results. extent via I/O to the block device will have undefined results.
Note that it is *always* undefined to try to update the data Note that it is *always* undefined to try to update the data
in-place by writing to the indicated location without the in-place by writing to the indicated location without the
...@@ -145,32 +148,32 @@ unmounted, and then only if the FIEMAP_EXTENT_ENCODED flag is ...@@ -145,32 +148,32 @@ unmounted, and then only if the FIEMAP_EXTENT_ENCODED flag is
clear; user applications must not try reading or writing to the clear; user applications must not try reading or writing to the
filesystem via the block device under any other circumstances. filesystem via the block device under any other circumstances.
* FIEMAP_EXTENT_DATA_ENCRYPTED FIEMAP_EXTENT_DATA_ENCRYPTED
- This will also set FIEMAP_EXTENT_ENCODED This will also set FIEMAP_EXTENT_ENCODED
The data in this extent has been encrypted by the file system. The data in this extent has been encrypted by the file system.
* FIEMAP_EXTENT_NOT_ALIGNED FIEMAP_EXTENT_NOT_ALIGNED
Extent offsets and length are not guaranteed to be block aligned. Extent offsets and length are not guaranteed to be block aligned.
* FIEMAP_EXTENT_DATA_INLINE FIEMAP_EXTENT_DATA_INLINE
This will also set FIEMAP_EXTENT_NOT_ALIGNED This will also set FIEMAP_EXTENT_NOT_ALIGNED
Data is located within a meta data block. Data is located within a meta data block.
* FIEMAP_EXTENT_DATA_TAIL FIEMAP_EXTENT_DATA_TAIL
This will also set FIEMAP_EXTENT_NOT_ALIGNED This will also set FIEMAP_EXTENT_NOT_ALIGNED
Data is packed into a block with data from other files. Data is packed into a block with data from other files.
* FIEMAP_EXTENT_UNWRITTEN FIEMAP_EXTENT_UNWRITTEN
Unwritten extent - the extent is allocated but its data has not been Unwritten extent - the extent is allocated but its data has not been
initialized. This indicates the extent's data will be all zero if read initialized. This indicates the extent's data will be all zero if read
through the filesystem but the contents are undefined if read directly from through the filesystem but the contents are undefined if read directly from
the device. the device.
* FIEMAP_EXTENT_MERGED FIEMAP_EXTENT_MERGED
This will be set when a file does not support extents, i.e., it uses a block This will be set when a file does not support extents, i.e., it uses a block
based addressing scheme. Since returning an extent for each block back to based addressing scheme. Since returning an extent for each block back to
userspace would be highly inefficient, the kernel will try to merge most userspace would be highly inefficient, the kernel will try to merge most
adjacent blocks into 'extents'. adjacent blocks into 'extents'.
VFS -> File System Implementation VFS -> File System Implementation
...@@ -179,23 +182,23 @@ VFS -> File System Implementation ...@@ -179,23 +182,23 @@ VFS -> File System Implementation
File systems wishing to support fiemap must implement a ->fiemap callback on File systems wishing to support fiemap must implement a ->fiemap callback on
their inode_operations structure. The fs ->fiemap call is responsible for their inode_operations structure. The fs ->fiemap call is responsible for
defining its set of supported fiemap flags, and calling a helper function on defining its set of supported fiemap flags, and calling a helper function on
each discovered extent: each discovered extent::
struct inode_operations { struct inode_operations {
... ...
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
u64 len); u64 len);
->fiemap is passed struct fiemap_extent_info which describes the ->fiemap is passed struct fiemap_extent_info which describes the
fiemap request: fiemap request::
struct fiemap_extent_info { struct fiemap_extent_info {
unsigned int fi_flags; /* Flags as passed from user */ unsigned int fi_flags; /* Flags as passed from user */
unsigned int fi_extents_mapped; /* Number of mapped extents */ unsigned int fi_extents_mapped; /* Number of mapped extents */
unsigned int fi_extents_max; /* Size of fiemap_extent array */ unsigned int fi_extents_max; /* Size of fiemap_extent array */
struct fiemap_extent *fi_extents_start; /* Start of fiemap_extent array */ struct fiemap_extent *fi_extents_start; /* Start of fiemap_extent array */
}; };
It is intended that the file system should not need to access any of this It is intended that the file system should not need to access any of this
structure directly. Filesystem handlers should be tolerant to signals and return structure directly. Filesystem handlers should be tolerant to signals and return
...@@ -203,9 +206,9 @@ EINTR once fatal signal received. ...@@ -203,9 +206,9 @@ EINTR once fatal signal received.
Flag checking should be done at the beginning of the ->fiemap callback via the Flag checking should be done at the beginning of the ->fiemap callback via the
fiemap_check_flags() helper: fiemap_check_flags() helper::
int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags); int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags);
The struct fieinfo should be passed in as received from ioctl_fiemap(). The The struct fieinfo should be passed in as received from ioctl_fiemap(). The
set of fiemap flags which the fs understands should be passed via fs_flags. If set of fiemap flags which the fs understands should be passed via fs_flags. If
...@@ -216,9 +219,9 @@ ioctl_fiemap(). ...@@ -216,9 +219,9 @@ ioctl_fiemap().
For each extent in the request range, the file system should call For each extent in the request range, the file system should call
the helper function, fiemap_fill_next_extent(): the helper function, fiemap_fill_next_extent()::
int fiemap_fill_next_extent(struct fiemap_extent_info *info, u64 logical, int fiemap_fill_next_extent(struct fiemap_extent_info *info, u64 logical,
u64 phys, u64 len, u32 flags, u32 dev); u64 phys, u64 len, u32 flags, u32 dev);
fiemap_fill_next_extent() will use the passed values to populate the fiemap_fill_next_extent() will use the passed values to populate the
......
...@@ -26,6 +26,7 @@ algorithms work. ...@@ -26,6 +26,7 @@ algorithms work.
directory-locking directory-locking
devpts devpts
dnotify dnotify
fiemap
automount-support automount-support
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment