| .TH XFSCTL 3 |
| .SH NAME |
| xfsctl \- control XFS filesystems and individual files |
| .SH C SYNOPSIS |
| .B #include <xfs/xfs.h> |
| .HP |
| .BI "int\ xfsctl(const char *" path ", int " fd ", int " cmd ", void *" ptr ); |
| .PP |
| .BI "int platform_test_xfs_fd(int " fd ); |
| .br |
| .BI "int platform_test_xfs_path(const char *" path ); |
| .SH DESCRIPTION |
| Some functionality specific to the XFS filesystem is accessible to |
| applications through platform-specific system call interfaces. |
| These operations can be divided into two sections \- operations |
| that operate on individual files, and operations that operate on |
| the filesystem itself. Care should be taken when issuing |
| .BR xfsctl () |
| calls to ensure the target path and file descriptor (both must |
| be supplied) do indeed represent a file from an XFS filesystem. |
| The |
| .BR statfs (2) |
| and |
| .BR fstatfs (2) |
| system calls can be used to determine whether or not an arbitrary |
| path or file descriptor belong to an XFS filesystem. |
| These are not portable however, so the routines |
| .BR platform_test_xfs_fd () |
| and |
| .BR platform_test_xfs_path () |
| provide a platform-independent mechanism. |
| .SS File Operations |
| In order to effect an operation on an individual file, the pathname |
| and descriptor arguments passed to |
| .B xfsctl |
| identifies the file being operated on. |
| The final argument described below refers to the final argument of |
| .BR xfsctl . |
| All of the data structures and macros mentioned below are defined in the |
| .RI < xfs/xfs_fs.h > |
| header file. |
| .PP |
| .B XFS_IOC_ALLOCSP |
| .br |
| .B XFS_IOC_ALLOCSP64 |
| .br |
| .B XFS_IOC_FREESP |
| .PD 0 |
| .TP |
| .B XFS_IOC_FREESP64 |
| Alter storage space associated with a section of the ordinary |
| file specified. The section is specified by a variable of type |
| .BR xfs_flock64_t , |
| pointed to by the final argument. |
| The data type |
| .B xfs_flock64_t |
| contains the following members: |
| .B l_whence |
| is 0, 1, or 2 to indicate that the relative offset |
| .B l_start |
| will be measured from the start of the file, the current position, or |
| the end of the file, respectively (i.e., |
| .B l_start |
| is the offset from the position specified in |
| .BR l_whence ). |
| If the offset specified is before the current end of file, any data |
| previously written into this section is no longer accessible. |
| If the offset specified is beyond the current end of file, the file |
| is grown and filled with zeroes. |
| The |
| .B l_len |
| field is currently ignored, and should be set to zero. |
| |
| .BR XFS_IOC_ALLOCSP , |
| .BR XFS_IOC_ALLOCSP64 , |
| .B XFS_IOC_FREESP |
| and |
| .B XFS_IOC_FREESP64 |
| operations are all identical. |
| |
| These ioctls are no longer supported as of Linux 5.17. |
| |
| .TP |
| .B XFS_IOC_FSSETDM |
| Set the di_dmevmask and di_dmstate fields in an XFS on-disk inode. |
| The only legitimate values for these fields are those |
| previously returned in the |
| .B bs_dmevmask |
| and |
| .B bs_dmstate |
| fields of the bulkstat structure. |
| The data referred to by the final argument is a |
| .BR "struct fsdmidata" . |
| This structure's members are |
| .B fsd_dmevmask |
| and |
| .BR fsd_dmstate . |
| The di_dmevmask |
| field is set to the value in |
| .BR fsd_dmevmask . |
| The di_dmstate field is set to the value in |
| .BR fsd_dmstate . |
| This command is restricted to root or to processes with device |
| management capabilities. |
| Its sole purpose is to allow backup and restore programs to restore the |
| aforementioned critical on-disk inode fields. |
| This ioctl is not supported as of Linux 5.5. |
| |
| .TP |
| .B XFS_IOC_DIOINFO |
| Get information required to perform direct I/O on the specified file |
| descriptor. |
| Direct I/O is performed directly to and from a user's data buffer. |
| Since the kernel's buffer cache is no longer between the two, the |
| user's data buffer must conform to the same type of constraints as |
| required for accessing a raw disk partition. |
| The final argument points to a variable of type |
| .BR "struct dioattr" , |
| which contains the following members: |
| .B d_mem |
| is the memory alignment requirement of the user's data buffer. |
| .B d_miniosz |
| specifies block size, minimum I/O request size, and I/O alignment. |
| The size of all I/O requests must be a multiple of this amount and |
| the value of the seek pointer at the time of the I/O request must |
| also be an integer multiple of this amount. |
| .B d_maxiosz |
| is the maximum I/O request size which can be performed on the file |
| descriptor. |
| If an I/O request does not meet these constraints, the |
| .BR read (2) |
| or |
| .BR write (2) |
| will fail with EINVAL. |
| All I/O requests are kept consistent with any data brought into |
| the cache with an access through a non-direct I/O file descriptor. |
| |
| .PP |
| .nf |
| .B XFS_IOC_FSGETXATTR |
| .B XFS_IOC_FSGETXATTRA |
| .fi |
| .PD 0 |
| .TP |
| .B XFS_IOC_FSSETXATTR |
| See |
| .BR ioctl_xfs_fsgetxattr (2) |
| for more information. |
| |
| .PP |
| .nf |
| .B XFS_IOC_GETBMAP |
| .B XFS_IOC_GETBMAPA |
| .fi |
| .PD 0 |
| .TP |
| .B XFS_IOC_GETBMAPX |
| See |
| .BR ioctl_getbmap (2) |
| for more information. |
| |
| .PP |
| .B XFS_IOC_RESVSP |
| .TP |
| .B XFS_IOC_RESVSP64 |
| This command is used to allocate space to a file. |
| A range of bytes is specified using a pointer to a variable of type |
| .B xfs_flock64_t |
| in the final argument. |
| The blocks are allocated, but not zeroed, and the file size does not change. |
| If the XFS filesystem is configured to flag unwritten file extents, |
| performance will be negatively affected when writing to preallocated space, |
| since extra filesystem transactions are required to convert extent flags on |
| the range of the file written. |
| If |
| .BR xfs_info (8) |
| reports unwritten=1, then the filesystem was made to flag unwritten extents. |
| |
| .PP |
| .B XFS_IOC_UNRESVSP |
| .TP |
| .B XFS_IOC_UNRESVSP64 |
| This command is used to free space from a file. |
| A range of bytes is specified using a pointer to a variable of type |
| .B xfs_flock64_t |
| in the final argument. |
| Partial filesystem blocks are zeroed, and whole filesystem blocks are |
| removed from the file. The file size does not change. |
| |
| .TP |
| .B XFS_IOC_ZERO_RANGE |
| This command is used to convert a range of a file to zeros without issuing data |
| IO. |
| A range of bytes is specified using a pointer to a variable of type |
| .B xfs_flock64_t |
| in the final argument. |
| Blocks are preallocated for regions that span holes in the file, and the entire |
| range is converted to unwritten extents. |
| This operation is a fast method of overwriting any from the range specified |
| with zeros without removing any blocks or having to write zeros to disk. |
| Any subsequent read in the given range will return zeros until new data is |
| written. |
| This functionality requires filesystems to support unwritten extents. |
| If |
| .BR xfs_info (8) |
| reports unwritten=1, then the filesystem was made to flag unwritten extents. |
| |
| .\" .TP |
| .\" .B XFS_IOC_GETBIOSIZE |
| .\" This command gets information about the preferred buffered I/O |
| .\" size used by the system when performing buffered I/O (e.g. |
| .\" standard Unix non-direct I/O) to and from the file. |
| .\" The information is passed back in a structure of type |
| .\" .B "struct biosize" |
| .\" pointed to by the final argument. |
| .\" biosize lengths are expressed in log base 2. |
| .\" That is if the value is 14, then the true size is 2^14 (2 raised to |
| .\" the 14th power). |
| .\" The |
| .\" .B biosz_read |
| .\" field will contain the current value used by the system when reading |
| .\" from the file. |
| .\" Except at the end-of-file, the system will read from the file in |
| .\" multiples of this length. |
| .\" The |
| .\" .B biosz_write |
| .\" field will contain the current value used by the system when writing |
| .\" to the file. |
| .\" Except at the end-of-file, the system will write to the file in |
| .\" multiples of this length. |
| .\" The |
| .\" .B dfl_biosz_read |
| .\" and |
| .\" .B dfl_biosz_write |
| .\" will be set to the system default values for the opened file. |
| .\" The |
| .\" .B biosz_flags |
| .\" field will be set to 1 if the current read or write value has been |
| .\" explicitly set. |
| .\" |
| .\" .TP |
| .\" .B XFS_IOC_SETBIOSIZE |
| .\" This command sets information about the preferred buffered I/O size |
| .\" used by the system when performing buffered I/O (e.g. standard Unix |
| .\" non-direct I/O) to and from the file. |
| .\" The information is passed in a structure of type |
| .\" .B "struct biosize" |
| .\" pointed to by the final argument. |
| .\" Using smaller preferred I/O sizes can result in performance |
| .\" improvements if the file is typically accessed using small |
| .\" synchronous I/Os or if only a small amount of the file is accessed |
| .\" using small random I/Os, resulting in little or no use of the |
| .\" additional data read in near the random I/Os. |
| .\" |
| .\" To explicitly set the preferred I/O sizes, the |
| .\" .B biosz_flags |
| .\" field should be set to zero and the |
| .\" .B biosz_read |
| .\" and |
| .\" .B biosz_write |
| .\" fields should be set to the log base 2 of the desired read and |
| .\" write lengths, respectively (e.g. 13 for 8K bytes, 14 for 16K |
| .\" bytes, 15 for 32K bytes, etc.). Valid values are 13-16 |
| .\" inclusive for machines with a 4K byte pagesize and 14-16 for |
| .\" machines with a 16K byte pagesize. The specified read and |
| .\" write values must also result in lengths that are greater than |
| .\" or equal to the filesystem block size. |
| .\" The |
| .\" .B dfl_biosz_read |
| .\" and |
| .\" .B dfl_biosz_write |
| .\" fields are ignored. |
| .\" |
| .\" If biosizes have already been explicitly set due to a prior use |
| .\" of |
| .\" .BR XFS_IOC_SETBIOSIZE , |
| .\" and the requested sizes are larger than the |
| .\" existing sizes, the |
| .\" .I xfsctl |
| .\" call will return successfully and the |
| .\" system will use the smaller of the two sizes. However, if |
| .\" .B biosz_flags |
| .\" is set to 1, the system will use the new values |
| .\" regardless of whether the new sizes are larger or smaller than the old. |
| .\" |
| .\" To reset the biosize values to the defaults for the filesystem |
| .\" that the file resides in, the |
| .\" .B biosz_flags |
| .\" field should be set to 2. |
| .\" The remainder of the fields will be ignored in that case. |
| .\" |
| .\" Changes made by |
| .\" .B XFS_IOC_SETBIOSIZE |
| .\" are transient. |
| .\" The sizes are reset to the default values once the reference count on the |
| .\" file drops to zero (e.g. all open file descriptors to that file |
| .\" have been closed). |
| .\" See |
| .\" .I mount(8) |
| .\" for details on how to set the |
| .\" default biosize values for a filesystem. |
| |
| .PP |
| .nf |
| .B XFS_IOC_PATH_TO_HANDLE |
| .B XFS_IOC_PATH_TO_FSHANDLE |
| .B XFS_IOC_FD_TO_HANDLE |
| .B XFS_IOC_OPEN_BY_HANDLE |
| .B XFS_IOC_READLINK_BY_HANDLE |
| .B XFS_IOC_ATTR_LIST_BY_HANDLE |
| .B XFS_IOC_ATTR_MULTI_BY_HANDLE |
| .fi |
| .PD 0 |
| .TP |
| .B XFS_IOC_FSSETDM_BY_HANDLE |
| These are all interfaces that are used to implement various |
| .I libhandle |
| functions (see |
| .BR open_by_handle (3)). |
| They are all subject to change and should not be called directly |
| by applications. |
| XFS_IOC_FSSETDM_BY_HANDLE is not supported as of Linux 5.5. |
| |
| .SS Filesystem Operations |
| In order to effect one of the following operations, the pathname |
| and descriptor arguments passed to |
| .BR xfsctl () |
| can be any open file in the XFS filesystem in question. |
| |
| .PP |
| .TP |
| .B XFS_IOC_FSINUMBERS |
| See |
| .BR ioctl_xfs_fsinumbers (2) |
| for more information. |
| |
| .TP |
| .B XFS_IOC_FSGEOMETRY |
| See |
| .BR ioctl_xfs_fsgeometry (2) |
| for more information. |
| |
| .TP |
| .B XFS_IOC_AG_GEOMETRY |
| See |
| .BR ioctl_xfs_ag_geometry (2) |
| for more information. |
| |
| .TP |
| .BR XFS_IOC_FSBULKSTAT " or " XFS_IOC_FSBULKSTAT_SINGLE |
| See |
| .BR ioctl_xfs_fsbulkstat (2) |
| for more information. |
| |
| .TP |
| .B XFS_IOC_SCRUB_METADATA |
| See |
| .BR ioctl_xfs_scrub_metadata (2) |
| for more information. |
| |
| .TP |
| .B XFS_IOC_FSCOUNTS |
| See |
| .BR ioctl_xfs_fscounts (2) |
| for more information. |
| |
| .TP |
| .nf |
| .B XFS_IOC_GET_RESBLKS |
| .fi |
| .TP |
| .B XFS_IOC_SET_RESBLKS |
| See |
| .BR ioctl_xfs_getresblks (2) |
| for more information. |
| Save yourself a lot of frustration and avoid these ioctls. |
| |
| .TP |
| .B XFS_IOC_GOINGDOWN |
| See |
| .BR ioctl_xfs_goingdown (2) |
| for more information. |
| |
| .PP |
| .nf |
| .B XFS_IOC_THAW |
| .B XFS_IOC_FREEZE |
| .B XFS_IOC_FSGROWFSDATA |
| .B XFS_IOC_FSGROWFSLOG |
| .fi |
| .TP |
| .B XFS_IOC_FSGROWFSRT |
| These interfaces are used to implement various filesystem internal |
| operations on XFS filesystems. |
| The remainder of these operations will not be described further |
| as they are not of general use to applications. |
| |
| .SH SEE ALSO |
| .BR ioctl_xfs_fsgetxattr (2), |
| .BR ioctl_xfs_fsgeometry (2), |
| .BR ioctl_xfs_fsbulkstat (2), |
| .BR ioctl_xfs_scrub_metadata (2), |
| .BR ioctl_xfs_fsinumbers (2), |
| .BR ioctl_xfs_fscounts (2), |
| .BR ioctl_xfs_getresblks (2), |
| .BR ioctl_xfs_getbmap (2), |
| .BR ioctl_xfs_goingdown (2), |
| .BR fstatfs (2), |
| .BR statfs (2), |
| .BR xfs (5), |
| .BR xfs_info (8). |