From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1EE13C43381 for ; Mon, 18 Mar 2019 23:16:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AFAC22173C for ; Mon, 18 Mar 2019 23:16:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1552950984; bh=WTvE+SzhpVdvKGb1AENwmFhSrOgbVZe/H4yzLHCs+7s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=O4rtHlj03PVXISXC+CfN5auFX3QIJ5X4LFHi4mB7tpYNqHtB/lRaFu0oHnv2Uz0WL /HPFVeyDfmVrL1YQJxj+QcDgrQcAJhm+gqVQof03/fgBbjIsJWrfZpRy6yvq5cE0Zr RUtL4oM07/TUM5rpW6PN9fQXbrpmlShfusBIwN+M= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727927AbfCRXP6 (ORCPT ); Mon, 18 Mar 2019 19:15:58 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:47995 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727901AbfCRXP5 (ORCPT ); Mon, 18 Mar 2019 19:15:57 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 1590D221D0; Mon, 18 Mar 2019 19:15:54 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Mon, 18 Mar 2019 19:15:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=+uEUhmPCmZzeblMw3j7Qo+d47fMJ/12hIWep9WkzgiQ=; b=VgANL8jQ WtUagaWmkuQgl0avM8o5lfv20yCKxqkMJNXo2ONByqE09OJ6u6wmPgwKNAqd2aAz TCCbTDcXL6dJhokLe+g+6vB+AiEDczkg90I/t2lADT7EX1rUJfY2k+q0CVXRe10H Wo2bSqV89BzNnjs3QyayDIvywTEA2p/9k0irHB5aqllck9hdrj0F7dwzNS7OCUBN OBxQuC03UnvW12/2hP7G5ffEbQq9daoMybe9TzZIJHnqPneGjPU9lTC+qvCm1CNa ZWkPqQYNebfwdhQRKbvPINQ+JCCnwcRpKS4ubfZ5+38YEV+azMmDMn2zVNeC+i4f QNdT9KwLw1lX5A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedutddriedvgddtfecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepfdfvohgsihhn ucevrdcujfgrrhguihhnghdfuceothhosghinheskhgvrhhnvghlrdhorhhgqeenucfkph epuddvgedrudeiledrudegledrgedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehtohgs ihhnsehkvghrnhgvlhdrohhrghenucevlhhushhtvghrufhiiigvpeel X-ME-Proxy: Received: from eros.localdomain (124-169-149-40.dyn.iinet.net.au [124.169.149.40]) by mail.messagingengine.com (Postfix) with ESMTPA id 0761910317; Mon, 18 Mar 2019 19:15:50 -0400 (EDT) From: "Tobin C. Harding" To: Jonathan Corbet Cc: "Tobin C. Harding" , Randy Dunlap , linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 11/13] docs: filesystems: vfs: Clean up lists Date: Tue, 19 Mar 2019 10:14:35 +1100 Message-Id: <20190318231437.1666-12-tobin@kernel.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190318231437.1666-1-tobin@kernel.org> References: <20190318231437.1666-1-tobin@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org During conversion of txt file to rst format we added a bunch of lists. To ease the review of that patch the list contents were not changed. We do that now as a separate patch. This patch does not change the contents of the document in any real way, does whitespace fixes and adds missing periods to list items. Clean up lists by: - Adding missing periods. - Correcting the column width. - Correcting the indentation. Tested-by: Randy Dunlap Signed-off-by: Tobin C. Harding --- Documentation/filesystems/vfs.rst | 1114 ++++++++++++++--------------- 1 file changed, 557 insertions(+), 557 deletions(-) diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst index 7ab885de9085..bd8f7891f44b 100644 --- a/Documentation/filesystems/vfs.rst +++ b/Documentation/filesystems/vfs.rst @@ -127,34 +127,34 @@ members are defined: }; - ``name``: the name of the filesystem type, such as "ext2", "iso9660", - "msdos" and so on + "msdos" and so on. -- ``fs_flags``: various flags (i.e. FS_REQUIRES_DEV, FS_NO_DCACHE, etc.) +- ``fs_flags``: various flags (i.e. FS_REQUIRES_DEV, FS_NO_DCACHE, etc.). -- ``mount``: the method to call when a new instance of this - filesystem should be mounted +- ``mount``: the method to call when a new instance of this filesystem + should be mounted. - ``kill_sb``: the method to call when an instance of this filesystem - should be shut down + should be shut down. -- ``owner``: for internal VFS use: you should initialize this to THIS_MODULE in - most cases. +- ``owner``: for internal VFS use: you should initialize this to + THIS_MODULE in most cases. -- ``next``: for internal VFS use: you should initialize this to NULL +- ``next``: for internal VFS use: you should initialize this to NULL. -- ``s_lock_key``, ``s_umount_key``: lockdep-specific +- ``s_lock_key``, ``s_umount_key``: lockdep-specific. The mount() method has the following arguments: -- ``struct file_system_type *fs_type``: describes the filesystem, partly initialized - by the specific filesystem code +- ``struct file_system_type *fs_type``: describes the filesystem, partly + initialized by the specific filesystem code. -- ``int flags``: mount flags +- ``int flags``: mount flags. - ``const char *dev_name``: the device name we are mounting. - ``void *data``: arbitrary mount options, usually comes as an ASCII - string (see "Mount Options" section) + string (see "Mount Options" section) The mount() method must return the root dentry of the tree requested by caller. An active reference to its superblock must be grabbed and the @@ -179,22 +179,22 @@ implementation. Usually, a filesystem uses one of the generic mount() implementations and provides a fill_super() callback instead. The generic variants are: -- ``mount_bdev``: mount a filesystem residing on a block device +- ``mount_bdev``: mount a filesystem residing on a block device. -- ``mount_nodev``: mount a filesystem that is not backed by a device +- ``mount_nodev``: mount a filesystem that is not backed by a device. - ``mount_single``: mount a filesystem which shares the instance between - all mounts + all mounts. A fill_super() callback implementation has the following arguments: - ``struct super_block *sb``: the superblock structure. The callback - must initialize this properly. + must initialize this properly. - ``void *data``: arbitrary mount options, usually comes as an ASCII - string (see "Mount Options" section) + string (see "Mount Options" section). -- ``int silent``: whether or not to be silent on error +- ``int silent``: whether or not to be silent on error. The Superblock Object @@ -240,87 +240,87 @@ noted. This means that most methods can block safely. All methods are only called from a process context (i.e. not from an interrupt handler or bottom half). -- ``alloc_inode``: this method is called by alloc_inode() to allocate memory - for struct inode and initialize it. If this function is not - defined, a simple 'struct inode' is allocated. Normally - alloc_inode will be used to allocate a larger structure which - contains a 'struct inode' embedded within it. +- ``alloc_inode``: this method is called by alloc_inode() to allocate + memory for struct inode and initialize it. If this function is not + defined, a simple 'struct inode' is allocated. Normally alloc_inode + will be used to allocate a larger structure which contains a 'struct + inode' embedded within it. - ``destroy_inode``: this method is called by destroy_inode() to release - resources allocated for struct inode. It is only required if - ->alloc_inode was defined and simply undoes anything done by - ->alloc_inode. + resources allocated for struct inode. It is only required if + ->alloc_inode was defined and simply undoes anything done by + ->alloc_inode. -- ``dirty_inode``: this method is called by the VFS to mark an inode dirty. +- ``dirty_inode``: this method is called by the VFS to mark an inode + dirty. - ``write_inode``: this method is called when the VFS needs to write an - inode to disc. The second parameter indicates whether the write - should be synchronous or not, not all filesystems check this flag. + inode to disc. The second parameter indicates whether the write + should be synchronous or not, not all filesystems check this flag. - ``drop_inode``: called when the last access to the inode is dropped, - with the inode->i_lock spinlock held. + with the inode->i_lock spinlock held. - This method should be either NULL (normal UNIX filesystem - semantics) or "generic_delete_inode" (for filesystems that do not - want to cache inodes - causing "delete_inode" to always be - called regardless of the value of i_nlink) + This method should be either NULL (normal UNIX filesystem semantics) + or "generic_delete_inode" (for filesystems that do not want to cache + inodes - causing "delete_inode" to always be called regardless of the + value of i_nlink). - The "generic_delete_inode()" behavior is equivalent to the - old practice of using "force_delete" in the put_inode() case, - but does not have the races that the "force_delete()" approach - had. + The "generic_delete_inode()" behavior is equivalent to the old + practice of using "force_delete" in the put_inode() case, but does not + have the races that the "force_delete()" approach had. -- ``delete_inode``: called when the VFS wants to delete an inode +- ``delete_inode``: called when the VFS wants to delete an inode. - ``put_super``: called when the VFS wishes to free the superblock - (i.e. unmount). This is called with the superblock lock held + (i.e. unmount). This is called with the superblock lock held. -- ``sync_fs``: called when VFS is writing out all dirty data associated with - a superblock. The second parameter indicates whether the method - should wait until the write out has been completed. Optional. +- ``sync_fs``: called when VFS is writing out all dirty data associated + with a superblock. The second parameter indicates whether the method + should wait until the write out has been completed. Optional. -- ``freeze_fs``: called when VFS is locking a filesystem and - forcing it into a consistent state. This method is currently - used by the Logical Volume Manager (LVM). +- ``freeze_fs``: called when VFS is locking a filesystem and forcing it + into a consistent state. This method is currently used by the Logical + Volume Manager (LVM). -- ``unfreeze_fs``: called when VFS is unlocking a filesystem and making it writable - again. +- ``unfreeze_fs``: called when VFS is unlocking a filesystem and making + it writable again. - ``statfs``: called when the VFS needs to get filesystem statistics. -- ``remount_fs``: called when the filesystem is remounted. This is called - with the kernel lock held +- ``remount_fs``: called when the filesystem is remounted. This is + called with the kernel lock held. -- ``clear_inode``: called then the VFS clears the inode. Optional +- ``clear_inode``: called then the VFS clears the inode. Optional. - ``umount_begin``: called when the VFS is unmounting a filesystem. - ``show_options``: called by the VFS to show mount options for - /proc//mounts. (see "Mount Options" section) + /proc//mounts (see "Mount Options" section). - ``quota_read``: called by the VFS to read from filesystem quota file. - ``quota_write``: called by the VFS to write to filesystem quota file. -- ``nr_cached_objects``: called by the sb cache shrinking function for the - filesystem to return the number of freeable cached objects it contains. - Optional. +- ``nr_cached_objects``: called by the sb cache shrinking function for + the filesystem to return the number of freeable cached objects it + contains. Optional. -- ``free_cache_objects``: called by the sb cache shrinking function for the - filesystem to scan the number of objects indicated to try to free them. - Optional, but any filesystem implementing this method needs to also - implement ->nr_cached_objects for it to be called correctly. +- ``free_cache_objects``: called by the sb cache shrinking function for + the filesystem to scan the number of objects indicated to try to free + them. Optional, but any filesystem implementing this method needs to + also implement ->nr_cached_objects for it to be called correctly. - We can't do anything with any errors that the filesystem might - encountered, hence the void return type. This will never be called if - the VM is trying to reclaim under GFP_NOFS conditions, hence this - method does not need to handle that situation itself. + We can't do anything with any errors that the filesystem might + encountered, hence the void return type. This will never be called if + the VM is trying to reclaim under GFP_NOFS conditions, hence this + method does not need to handle that situation itself. - Implementations must include conditional reschedule calls inside any - scanning loop that is done. This allows the VFS to determine - appropriate scan batch sizes without having to worry about whether - implementations will cause holdoff problems due to large scan batch - sizes. + Implementations must include conditional reschedule calls inside any + scanning loop that is done. This allows the VFS to determine + appropriate scan batch sizes without having to worry about whether + implementations will cause holdoff problems due to large scan batch + sizes. Whoever sets up the inode is responsible for filling in the "i_op" field. This is a pointer to a "struct inode_operations" which describes @@ -334,23 +334,24 @@ On filesystems that support extended attributes (xattrs), the s_xattr superblock field points to a NULL-terminated array of xattr handlers. Extended attributes are name:value pairs. -- ``name``: Indicates that the handler matches attributes with the specified name - (such as "system.posix_acl_access"); the prefix field must be NULL. +- ``name``: Indicates that the handler matches attributes with the + specified name (such as "system.posix_acl_access"); the prefix field + must be NULL. -- ``prefix``: Indicates that the handler matches all attributes with the specified - name prefix (such as "user."); the name field must be NULL. +- ``prefix``: Indicates that the handler matches all attributes with the + specified name prefix (such as "user."); the name field must be NULL. -- ``list``: Determine if attributes matching this xattr handler should be listed - for a particular dentry. Used by some listxattr implementations like - generic_listxattr. +- ``list``: Determine if attributes matching this xattr handler should + be listed for a particular dentry. Used by some listxattr + implementations like generic_listxattr. -- ``get``: Called by the VFS to get the value of a particular extended attribute. - This method is called by the getxattr(2) system call. +- ``get``: Called by the VFS to get the value of a particular extended + attribute. This method is called by the getxattr(2) system call. -- ``set``: Called by the VFS to set the value of a particular extended attribute. - When the new value is NULL, called to remove a particular extended - attribute. This method is called by the the setxattr(2) and - removexattr(2) system calls. +- ``set``: Called by the VFS to set the value of a particular extended + attribute. When the new value is NULL, called to remove a particular + extended attribute. This method is called by the the setxattr(2) and + removexattr(2) system calls. When none of the xattr handlers of a filesystem match the specified attribute name or when a filesystem doesn't support extended attributes, @@ -400,120 +401,118 @@ Again, all methods are called without any locks being held, unless otherwise noted. - ``create``: called by the open(2) and creat(2) system calls. Only - required if you want to support regular files. The dentry you - get should not have an inode (i.e. it should be a negative - dentry). Here you will probably call d_instantiate() with the - dentry and the newly created inode + required if you want to support regular files. The dentry you get + should not have an inode (i.e. it should be a negative dentry). Here + you will probably call d_instantiate() with the dentry and the newly + created inode. - ``lookup``: called when the VFS needs to look up an inode in a parent - directory. The name to look for is found in the dentry. This - method must call d_add() to insert the found inode into the - dentry. The "i_count" field in the inode structure should be - incremented. If the named inode does not exist a NULL inode - should be inserted into the dentry (this is called a negative - dentry). Returning an error code from this routine must only - be done on a real error, otherwise creating inodes with system - calls like create(2), mknod(2), mkdir(2) and so on will fail. - If you wish to overload the dentry methods then you should - initialise the "d_dop" field in the dentry; this is a pointer - to a struct "dentry_operations". - This method is called with the directory inode semaphore held - -- ``link``: called by the link(2) system call. Only required if you want - to support hard links. You will probably need to call - d_instantiate() just as you would in the create() method + directory. The name to look for is found in the dentry. This method + must call d_add() to insert the found inode into the dentry. The + "i_count" field in the inode structure should be incremented. If the + named inode does not exist a NULL inode should be inserted into the + dentry (this is called a negative dentry). Returning an error code + from this routine must only be done on a real error, otherwise + creating inodes with system calls like create(2), mknod(2), mkdir(2) + and so on will fail. If you wish to overload the dentry methods then + you should initialise the "d_dop" field in the dentry; this is a + pointer to a struct "dentry_operations". This method is called with + the directory inode semaphore held. + +- ``link``: called by the link(2) system call. Only required if you + want to support hard links. You will probably need to call + d_instantiate() just as you would in the create() method. - ``unlink``: called by the unlink(2) system call. Only required if you - want to support deleting inodes - -- ``symlink``: called by the symlink(2) system call. Only required if you - want to support symlinks. You will probably need to call - d_instantiate() just as you would in the create() method - -- ``mkdir``: called by the mkdir(2) system call. Only required if you want - to support creating subdirectories. You will probably need to - call d_instantiate() just as you would in the create() method - -- ``rmdir``: called by the rmdir(2) system call. Only required if you want - to support deleting subdirectories - -- ``mknod``: called by the mknod(2) system call to create a device (char, - block) inode or a named pipe (FIFO) or socket. Only required - if you want to support creating these types of inodes. You - will probably need to call d_instantiate() just as you would - in the create() method - -- ``rename``: called by the rename(2) system call to rename the object to - have the parent and name given by the second inode and dentry. - - The filesystem must return -EINVAL for any unsupported or - unknown flags. Currently the following flags are implemented: - (1) RENAME_NOREPLACE: this flag indicates that if the target - of the rename exists the rename should fail with -EEXIST - instead of replacing the target. The VFS already checks for - existence, so for local filesystems the RENAME_NOREPLACE - implementation is equivalent to plain rename. - (2) RENAME_EXCHANGE: exchange source and target. Both must - exist; this is checked by the VFS. Unlike plain rename, - source and target may be of different type. - -- ``get_link``: called by the VFS to follow a symbolic link to the - inode it points to. Only required if you want to support - symbolic links. This method returns the symlink body - to traverse (and possibly resets the current position with - nd_jump_link()). If the body won't go away until the inode - is gone, nothing else is needed; if it needs to be otherwise - pinned, arrange for its release by having get_link(..., ..., done) - do set_delayed_call(done, destructor, argument). - In that case destructor(argument) will be called once VFS is - done with the body you've returned. - May be called in RCU mode; that is indicated by NULL dentry - argument. If request can't be handled without leaving RCU mode, - have it return ERR_PTR(-ECHILD). - -- ``readlink``: this is now just an override for use by readlink(2) for the - cases when ->get_link uses nd_jump_link() or object is not in - fact a symlink. Normally filesystems should only implement - ->get_link for symlinks and readlink(2) will automatically use - that. - -- ``permission``: called by the VFS to check for access rights on a POSIX-like - filesystem. - - May be called in rcu-walk mode (mask & MAY_NOT_BLOCK). If in rcu-walk - mode, the filesystem must check the permission without blocking or - storing to the inode. - - If a situation is encountered that rcu-walk cannot handle, return - -ECHILD and it will be called again in ref-walk mode. - -- ``setattr``: called by the VFS to set attributes for a file. This method - is called by chmod(2) and related system calls. - -- ``getattr``: called by the VFS to get attributes of a file. This method - is called by stat(2) and related system calls. + want to support deleting inodes. + +- ``symlink``: called by the symlink(2) system call. Only required if + you want to support symlinks. You will probably need to call + d_instantiate() just as you would in the create() method. + +- ``mkdir``: called by the mkdir(2) system call. Only required if you + want to support creating subdirectories. You will probably need to + call d_instantiate() just as you would in the create() method. + +- ``rmdir``: called by the rmdir(2) system call. Only required if you + want to support deleting subdirectories. + +- ``mknod``: called by the mknod(2) system call to create a device + (char, block) inode or a named pipe (FIFO) or socket. Only required + if you want to support creating these types of inodes. You will + probably need to call d_instantiate() just as you would in the + create() method. + +- ``rename``: called by the rename(2) system call to rename the object + to have the parent and name given by the second inode and dentry. + + The filesystem must return -EINVAL for any unsupported or unknown + flags. Currently the following flags are implemented: + + 1. ``RENAME_NOREPLACE``: this flag indicates that if the target of the + rename exists the rename should fail with -EEXIST instead of + replacing the target. The VFS already checks for existence, so for + local filesystems the RENAME_NOREPLACE implementation is equivalent + to plain rename. + 2. ``RENAME_EXCHANGE``: exchange source and target. Both must exist; + this is checked by the VFS. Unlike plain rename, source and target + may be of different type. + +- ``get_link``: called by the VFS to follow a symbolic link to the inode + it points to. Only required if you want to support symbolic links. + This method returns the symlink body to traverse (and possibly resets + the current position with nd_jump_link()). If the body won't go away + until the inode is gone, nothing else is needed; if it needs to be + otherwise pinned, arrange for its release by having get_link(..., ..., + done) do set_delayed_call(done, destructor, argument). In that case + destructor(argument) will be called once VFS is done with the body + you've returned. May be called in RCU mode; that is indicated by NULL + dentry argument. If request can't be handled without leaving RCU + mode, have it return ERR_PTR(-ECHILD). + +- ``readlink``: this is now just an override for use by readlink(2) for + the cases when ->get_link uses nd_jump_link() or object is not in fact + a symlink. Normally filesystems should only implement ->get_link for + symlinks and readlink(2) will automatically use that. + +- ``permission``: called by the VFS to check for access rights on a + POSIX-like filesystem. + + May be called in rcu-walk mode (mask & MAY_NOT_BLOCK). If in rcu-walk + mode, the filesystem must check the permission without blocking or + storing to the inode. + + If a situation is encountered that rcu-walk cannot handle, return + -ECHILD and it will be called again in ref-walk mode. + +- ``setattr``: called by the VFS to set attributes for a file. This + method is called by chmod(2) and related system calls. + +- ``getattr``: called by the VFS to get attributes of a file. This + method is called by stat(2) and related system calls. - ``listxattr``: called by the VFS to list all extended attributes for a - given file. This method is called by the listxattr(2) system call. + given file. This method is called by the listxattr(2) system call. -- ``update_time``: called by the VFS to update a specific time or the i_version of - an inode. If this is not defined the VFS will update the inode itself - and call mark_inode_dirty_sync. +- ``update_time``: called by the VFS to update a specific time or the + i_version of an inode. If this is not defined the VFS will update the + inode itself and call mark_inode_dirty_sync. -- ``atomic_open``: called on the last component of an open. Using this optional - method the filesystem can look up, possibly create and open the file in - one atomic operation. If it wants to leave actual opening to the - caller (e.g. if the file turned out to be a symlink, device, or just - something filesystem won't do atomic open for), it may signal this by - returning finish_no_open(file, dentry). This method is only called if - the last component is negative or needs lookup. Cached positive dentries - are still handled by f_op->open(). If the file was created, - FMODE_CREATED flag should be set in file->f_mode. In case of O_EXCL - the method must only succeed if the file didn't exist and hence FMODE_CREATED - shall always be set on success. +- ``atomic_open``: called on the last component of an open. Using this + optional method the filesystem can look up, possibly create and open + the file in one atomic operation. If it wants to leave actual opening + to the caller (e.g. if the file turned out to be a symlink, device, or + just something filesystem won't do atomic open for), it may signal + this by returning finish_no_open(file, dentry). This method is only + called if the last component is negative or needs lookup. Cached + positive dentries are still handled by f_op->open(). If the file was + created, FMODE_CREATED flag should be set in file->f_mode. In case of + O_EXCL the method must only succeed if the file didn't exist and hence + FMODE_CREATED shall always be set on success. -- ``tmpfile``: called in the end of O_TMPFILE open(). Optional, equivalent to - atomically creating, opening and unlinking a file in given directory. +- ``tmpfile``: called in the end of O_TMPFILE open(). Optional, + equivalent to atomically creating, opening and unlinking a file in + given directory. The Address Space Object @@ -666,185 +665,180 @@ cache in your filesystem. The following members are defined: int (*swap_deactivate)(struct file *); }; -- ``writepage``: called by the VM to write a dirty page to backing store. - This may happen for data integrity reasons (i.e. 'sync'), or - to free up memory (flush). The difference can be seen in - wbc->sync_mode. - The PG_Dirty flag has been cleared and PageLocked is true. - writepage should start writeout, should set PG_Writeback, - and should make sure the page is unlocked, either synchronously - or asynchronously when the write operation completes. - - If wbc->sync_mode is WB_SYNC_NONE, ->writepage doesn't have to - try too hard if there are problems, and may choose to write out - other pages from the mapping if that is easier (e.g. due to - internal dependencies). If it chooses not to start writeout, it - should return AOP_WRITEPAGE_ACTIVATE so that the VM will not keep - calling ->writepage on that page. - - See the file "Locking" for more details. - -- ``readpage``: called by the VM to read a page from backing store. - The page will be Locked when readpage is called, and should be - unlocked and marked uptodate once the read completes. - If ->readpage discovers that it needs to unlock the page for - some reason, it can do so, and then return AOP_TRUNCATED_PAGE. - In this case, the page will be relocated, relocked and if - that all succeeds, ->readpage will be called again. - -- ``writepages``: called by the VM to write out pages associated with the - address_space object. If wbc->sync_mode is WBC_SYNC_ALL, then - the writeback_control will specify a range of pages that must be - written out. If it is WBC_SYNC_NONE, then a nr_to_write is given - and that many pages should be written if possible. - If no ->writepages is given, then mpage_writepages is used - instead. This will choose pages from the address space that are - tagged as DIRTY and will pass them to ->writepage. - -- ``set_page_dirty``: called by the VM to set a page dirty. - This is particularly needed if an address space attaches - private data to a page, and that data needs to be updated when - a page is dirtied. This is called, for example, when a memory - mapped page gets modified. - If defined, it should set the PageDirty flag, and the - PAGECACHE_TAG_DIRTY tag in the radix tree. - -- ``readpages``: called by the VM to read pages associated with the address_space - object. This is essentially just a vector version of - readpage. Instead of just one page, several pages are - requested. - readpages is only used for read-ahead, so read errors are - ignored. If anything goes wrong, feel free to give up. - -- ``write_begin``: - Called by the generic buffered write code to ask the filesystem to - prepare to write len bytes at the given offset in the file. The - address_space should check that the write will be able to complete, - by allocating space if necessary and doing any other internal - housekeeping. If the write will update parts of any basic-blocks on - storage, then those blocks should be pre-read (if they haven't been - read already) so that the updated blocks can be written out properly. - - The filesystem must return the locked pagecache page for the specified - offset, in *pagep, for the caller to write into. - - It must be able to cope with short writes (where the length passed to - write_begin is greater than the number of bytes copied into the page). - - flags is a field for AOP_FLAG_xxx flags, described in - include/linux/fs.h. - - A void * may be returned in fsdata, which then gets passed into - write_end. - - Returns 0 on success; < 0 on failure (which is the error code), in - which case write_end is not called. - -- ``write_end``: After a successful write_begin, and data copy, write_end must - be called. len is the original len passed to write_begin, and copied - is the amount that was able to be copied. - - The filesystem must take care of unlocking the page and releasing it - refcount, and updating i_size. - - Returns < 0 on failure, otherwise the number of bytes (<= 'copied') - that were able to be copied into pagecache. - -- ``bmap``: called by the VFS to map a logical block offset within object to - physical block number. This method is used by the FIBMAP - ioctl and for working with swap-files. To be able to swap to - a file, the file must have a stable mapping to a block - device. The swap system does not go through the filesystem - but instead uses bmap to find out where the blocks in the file - are and uses those addresses directly. +- ``writepage``: called by the VM to write a dirty page to backing + store. This may happen for data integrity reasons (i.e. 'sync'), or + to free up memory (flush). The difference can be seen in + wbc->sync_mode. The PG_Dirty flag has been cleared and PageLocked is + true. writepage should start writeout, should set PG_Writeback, and + should make sure the page is unlocked, either synchronously or + asynchronously when the write operation completes. + + If wbc->sync_mode is WB_SYNC_NONE, ->writepage doesn't have to try too + hard if there are problems, and may choose to write out other pages + from the mapping if that is easier (e.g. due to internal + dependencies). If it chooses not to start writeout, it should return + AOP_WRITEPAGE_ACTIVATE so that the VM will not keep calling + ->writepage on that page. + + See the file "Locking" for more details. + +- ``readpage``: called by the VM to read a page from backing store. The + page will be Locked when readpage is called, and should be unlocked + and marked uptodate once the read completes. If ->readpage discovers + that it needs to unlock the page for some reason, it can do so, and + then return AOP_TRUNCATED_PAGE. In this case, the page will be + relocated, relocked and if that all succeeds, ->readpage will be + called again. + +- ``writepages``: called by the VM to write out pages associated with + the address_space object. If wbc->sync_mode is WBC_SYNC_ALL, then the + writeback_control will specify a range of pages that must be written + out. If it is WBC_SYNC_NONE, then a nr_to_write is given and that + many pages should be written if possible. If no ->writepages is + given, then mpage_writepages is used instead. This will choose pages + from the address space that are tagged as DIRTY and will pass them to + ->writepage. + +- ``set_page_dirty``: called by the VM to set a page dirty. This is + particularly needed if an address space attaches private data to a + page, and that data needs to be updated when a page is dirtied. This + is called, for example, when a memory mapped page gets modified. If + defined, it should set the PageDirty flag, and the PAGECACHE_TAG_DIRTY + tag in the radix tree. + +- ``readpages``: called by the VM to read pages associated with the + address_space object. This is essentially just a vector version of + readpage. Instead of just one page, several pages are requested. + readpages is only used for read-ahead, so read errors are ignored. If + anything goes wrong, feel free to give up. + +- ``write_begin``: Called by the generic buffered write code to ask the + filesystem to prepare to write len bytes at the given offset in the + file. The address_space should check that the write will be able to + complete, by allocating space if necessary and doing any other + internal housekeeping. If the write will update parts of any + basic-blocks on storage, then those blocks should be pre-read (if they + haven't been read already) so that the updated blocks can be written + out properly. + + The filesystem must return the locked pagecache page for the specified + offset, in *pagep, for the caller to write into. + + It must be able to cope with short writes (where the length passed to + write_begin is greater than the number of bytes copied into the page). + + flags is a field for AOP_FLAG_xxx flags, described in + include/linux/fs.h. + + A void * may be returned in fsdata, which then gets passed into + write_end. + + Returns 0 on success; < 0 on failure (which is the error code), in + which case write_end is not called. + +- ``write_end``: After a successful write_begin, and data copy, + write_end must be called. len is the original len passed to + write_begin, and copied is the amount that was able to be copied. + + The filesystem must take care of unlocking the page and releasing it + refcount, and updating i_size. + + Returns < 0 on failure, otherwise the number of bytes (<= 'copied') + that were able to be copied into pagecache. + +- ``bmap``: called by the VFS to map a logical block offset within + object to physical block number. This method is used by the FIBMAP + ioctl and for working with swap-files. To be able to swap to a file, + the file must have a stable mapping to a block device. The swap + system does not go through the filesystem but instead uses bmap to + find out where the blocks in the file are and uses those addresses + directly. - ``invalidatepage``: If a page has PagePrivate set, then invalidatepage - will be called when part or all of the page is to be removed - from the address space. This generally corresponds to either a - truncation, punch hole or a complete invalidation of the address - space (in the latter case 'offset' will always be 0 and 'length' - will be PAGE_SIZE). Any private data associated with the page - should be updated to reflect this truncation. If offset is 0 and - length is PAGE_SIZE, then the private data should be released, - because the page must be able to be completely discarded. This may - be done by calling the ->releasepage function, but in this case the - release MUST succeed. - -- ``releasepage``: releasepage is called on PagePrivate pages to indicate - that the page should be freed if possible. ->releasepage - should remove any private data from the page and clear the - PagePrivate flag. If releasepage() fails for some reason, it must - indicate failure with a 0 return value. - releasepage() is used in two distinct though related cases. The - first is when the VM finds a clean page with no active users and - wants to make it a free page. If ->releasepage succeeds, the - page will be removed from the address_space and become free. - - The second case is when a request has been made to invalidate - some or all pages in an address_space. This can happen - through the fadvise(POSIX_FADV_DONTNEED) system call or by the - filesystem explicitly requesting it as nfs and 9fs do (when - they believe the cache may be out of date with storage) by - calling invalidate_inode_pages2(). - If the filesystem makes such a call, and needs to be certain - that all pages are invalidated, then its releasepage will - need to ensure this. Possibly it can clear the PageUptodate - bit if it cannot free private data yet. + will be called when part or all of the page is to be removed from the + address space. This generally corresponds to either a truncation, + punch hole or a complete invalidation of the address space (in the + latter case 'offset' will always be 0 and 'length' will be PAGE_SIZE). + Any private data associated with the page should be updated to reflect + this truncation. If offset is 0 and length is PAGE_SIZE, then the + private data should be released, because the page must be able to be + completely discarded. This may be done by calling the ->releasepage + function, but in this case the release MUST succeed. + +- ``releasepage``: releasepage is called on PagePrivate pages to + indicate that the page should be freed if possible. ->releasepage + should remove any private data from the page and clear the PagePrivate + flag. If releasepage() fails for some reason, it must indicate + failure with a 0 return value. releasepage() is used in two distinct + though related cases. The first is when the VM finds a clean page + with no active users and wants to make it a free page. If + ->releasepage succeeds, the page will be removed from the + address_space and become free. + + The second case is when a request has been made to invalidate some or + all pages in an address_space. This can happen through the + fadvise(POSIX_FADV_DONTNEED) system call or by the filesystem + explicitly requesting it as nfs and 9fs do (when they believe the + cache may be out of date with storage) by calling + invalidate_inode_pages2(). If the filesystem makes such a call, and + needs to be certain that all pages are invalidated, then its + releasepage will need to ensure this. Possibly it can clear the + PageUptodate bit if it cannot free private data yet. - ``freepage``: freepage is called once the page is no longer visible in - the page cache in order to allow the cleanup of any private - data. Since it may be called by the memory reclaimer, it - should not assume that the original address_space mapping still - exists, and it should not block. + the page cache in order to allow the cleanup of any private data. + Since it may be called by the memory reclaimer, it should not assume + that the original address_space mapping still exists, and it should + not block. - ``direct_IO``: called by the generic read/write routines to perform - direct_IO - that is IO requests which bypass the page cache - and transfer data directly between the storage and the - application's address space. - -- ``isolate_page``: Called by the VM when isolating a movable non-lru page. - If page is successfully isolated, VM marks the page as PG_isolated - via __SetPageIsolated. - -- ``migrate_page``: This is used to compact the physical memory usage. - If the VM wants to relocate a page (maybe off a memory card - that is signalling imminent failure) it will pass a new page - and an old page to this function. migrate_page should - transfer any private data across and update any references - that it has to the page. - -- ``putback_page``: Called by the VM when isolated page's migration fails. - -- ``launder_page``: Called before freeing a page - it writes back the dirty page. To - prevent redirtying the page, it is kept locked during the whole - operation. - -- ``is_partially_uptodate``: Called by the VM when reading a file through the - pagecache when the underlying blocksize != pagesize. If the required - block is up to date then the read can complete without needing the IO - to bring the whole page up to date. - -- ``is_dirty_writeback``: Called by the VM when attempting to reclaim a page. - The VM uses dirty and writeback information to determine if it needs - to stall to allow flushers a chance to complete some IO. Ordinarily - it can use PageDirty and PageWriteback but some filesystems have - more complex state (unstable pages in NFS prevent reclaim) or - do not set those flags due to locking problems. This callback - allows a filesystem to indicate to the VM if a page should be - treated as dirty or writeback for the purposes of stalling. - -- ``error_remove_page``: normally set to generic_error_remove_page if truncation - is ok for this address space. Used for memory failure handling. - Setting this implies you deal with pages going away under you, - unless you have them locked or reference counts increased. + direct_IO - that is IO requests which bypass the page cache and + transfer data directly between the storage and the application's + address space. + +- ``isolate_page``: Called by the VM when isolating a movable non-lru + page. If page is successfully isolated, VM marks the page as + PG_isolated via __SetPageIsolated. + +- ``migrate_page``: This is used to compact the physical memory usage. + If the VM wants to relocate a page (maybe off a memory card that is + signalling imminent failure) it will pass a new page and an old page + to this function. migrate_page should transfer any private data + across and update any references that it has to the page. + +- ``putback_page``: Called by the VM when isolated page's migration + fails. + +- ``launder_page``: Called before freeing a page - it writes back the + dirty page. To prevent redirtying the page, it is kept locked during + the whole operation. + +- ``is_partially_uptodate``: Called by the VM when reading a file + through the pagecache when the underlying blocksize != pagesize. If + the required block is up to date then the read can complete without + needing the IO to bring the whole page up to date. + +- ``is_dirty_writeback``: Called by the VM when attempting to reclaim a + page. The VM uses dirty and writeback information to determine if it + needs to stall to allow flushers a chance to complete some IO. + Ordinarily it can use PageDirty and PageWriteback but some filesystems + have more complex state (unstable pages in NFS prevent reclaim) or do + not set those flags due to locking problems. This callback allows a + filesystem to indicate to the VM if a page should be treated as dirty + or writeback for the purposes of stalling. + +- ``error_remove_page``: normally set to generic_error_remove_page if + truncation is ok for this address space. Used for memory failure + handling. Setting this implies you deal with pages going away under + you, unless you have them locked or reference counts increased. - ``swap_activate``: Called when swapon is used on a file to allocate - space if necessary and pin the block lookup information in - memory. A return value of zero indicates success, - in which case this file can be used to back swapspace. + space if necessary and pin the block lookup information in memory. A + return value of zero indicates success, in which case this file can be + used to back swapspace. -- ``swap_deactivate``: Called during swapoff on files where swap_activate - was successful. +- ``swap_deactivate``: Called during swapoff on files where + swap_activate was successful. The File Object @@ -908,87 +902,93 @@ This describes how the VFS can manipulate an open file. As of kernel Again, all methods are called without any locks being held, unless otherwise noted. -- ``llseek``: called when the VFS needs to move the file position index +- ``llseek``: called when the VFS needs to move the file position index. -- ``read``: called by read(2) and related system calls +- ``read``: called by read(2) and related system calls. -- ``read_iter``: possibly asynchronous read with iov_iter as destination +- ``read_iter``: possibly asynchronous read with iov_iter as + destination. -- ``write``: called by write(2) and related system calls +- ``write``: called by write(2) and related system calls. -- ``write_iter``: possibly asynchronous write with iov_iter as source +- ``write_iter``: possibly asynchronous write with iov_iter as source. -- ``iopoll``: called when aio wants to poll for completions on HIPRI iocbs +- ``iopoll``: called when aio wants to poll for completions on HIPRI + iocbs. -- ``iterate_shared``: called when the VFS needs to read the directory contents - when filesystem supports concurrent dir iterators +- ``iterate``: called when the VFS needs to read the directory contents. + +- ``iterate_shared``: called when the VFS needs to read the directory + contents when filesystem supports concurrent dir iterators. - ``poll``: called by the VFS when a process wants to check if there is - activity on this file and (optionally) go to sleep until there - is activity. Called by the select(2) and poll(2) system calls + activity on this file and (optionally) go to sleep until there is + activity. Called by the select(2) and poll(2) system calls. - ``unlocked_ioctl``: called by the ioctl(2) system call. -- ``compat_ioctl``: called by the ioctl(2) system call when 32 bit system calls - are used on 64 bit kernels. +- ``compat_ioctl``: called by the ioctl(2) system call when 32 bit + system calls are used on 64 bit kernels. -- ``mmap``: called by the mmap(2) system call +- ``mmap``: called by the mmap(2) system call. -- ``open``: called by the VFS when an inode should be opened. When the VFS - opens a file, it creates a new "struct file". It then calls the - open method for the newly allocated file structure. You might - think that the open method really belongs in - "struct inode_operations", and you may be right. I think it's - done the way it is because it makes filesystems simpler to - implement. The open() method is a good place to initialize the - "private_data" member in the file structure if you want to point - to a device structure +- ``open``: called by the VFS when an inode should be opened. When the + VFS opens a file, it creates a new "struct file". It then calls the + open method for the newly allocated file structure. You might think + that the open method really belongs in "struct inode_operations", and + you may be right. I think it's done the way it is because it makes + filesystems simpler to implement. The open() method is a good place + to initialize the "private_data" member in the file structure if you + want to point to a device structure. -- ``flush``: called by the close(2) system call to flush a file +- ``flush``: called by the close(2) system call to flush a file. -- ``release``: called when the last reference to an open file is closed +- ``release``: called when the last reference to an open file is closed. -- ``fsync``: called by the fsync(2) system call. Also see the section above - entitled "Handling errors during writeback". +- ``fsync``: called by the fsync(2) system call. Also see the section + above entitled "Handling errors during writeback". - ``fasync``: called by the fcntl(2) system call when asynchronous - (non-blocking) mode is enabled for a file + (non-blocking) mode is enabled for a file. -- ``lock``: called by the fcntl(2) system call for F_GETLK, F_SETLK, and F_SETLKW - commands +- ``lock``: called by the fcntl(2) system call for F_GETLK, F_SETLK, and + F_SETLKW commands. -- ``get_unmapped_area``: called by the mmap(2) system call +- ``get_unmapped_area``: called by the mmap(2) system call. -- ``check_flags``: called by the fcntl(2) system call for F_SETFL command +- ``check_flags``: called by the fcntl(2) system call for F_SETFL + command. -- ``flock``: called by the flock(2) system call +- ``flock``: called by the flock(2) system call. -- ``splice_write``: called by the VFS to splice data from a pipe to a file. This - method is used by the splice(2) system call +- ``splice_write``: called by the VFS to splice data from a pipe to a + file. This method is used by the splice(2) system call. -- ``splice_read``: called by the VFS to splice data from file to a pipe. This - method is used by the splice(2) system call +- ``splice_read``: called by the VFS to splice data from file to a pipe. + This method is used by the splice(2) system call -- ``setlease``: called by the VFS to set or release a file lock lease. setlease - implementations should call generic_setlease to record or remove - the lease in the inode after setting it. +- ``setlease``: called by the VFS to set or release a file lock lease. + setlease implementations should call generic_setlease to record or + remove the lease in the inode after setting it. -- ``fallocate``: called by the VFS to preallocate blocks or punch a hole. +- ``fallocate``: called by the VFS to preallocate blocks or punch a + hole. - ``copy_file_range``: called by the copy_file_range(2) system call. -- ``remap_file_range``: called by the ioctl(2) system call for FICLONERANGE and - FICLONE and FIDEDUPERANGE commands to remap file ranges. An - implementation should remap len bytes at pos_in of the source file into - the dest file at pos_out. Implementations must handle callers passing - in len == 0; this means "remap to the end of the source file". The - return value should the number of bytes remapped, or the usual - negative error code if errors occurred before any bytes were remapped. - The remap_flags parameter accepts REMAP_FILE_* flags. If - REMAP_FILE_DEDUP is set then the implementation must only remap if the - requested file ranges have identical contents. If REMAP_CAN_SHORTEN is - set, the caller is ok with the implementation shortening the request - length to satisfy alignment or EOF requirements (or any other reason). +- ``remap_file_range``: called by the ioctl(2) system call for + FICLONERANGE and FICLONE and FIDEDUPERANGE commands to remap file + ranges. An implementation should remap len bytes at pos_in of the + source file into the dest file at pos_out. Implementations must + handle callers passing in len == 0; this means "remap to the end of + the source file". The return value should the number of bytes + remapped, or the usual negative error code if errors occurred before + any bytes were remapped. The remap_flags parameter accepts + REMAP_FILE_* flags. If REMAP_FILE_DEDUP is set then the + implementation must only remap if the requested file ranges have + identical contents. If REMAP_CAN_SHORTEN is set, the caller is ok + with the implementation shortening the request length to satisfy + alignment or EOF requirements (or any other reason). - ``fadvise``: possibly called by the fadvise64() system call. @@ -1035,146 +1035,147 @@ defined: struct dentry *(*d_real)(struct dentry *, const struct inode *); }; -- ``d_revalidate``: called when the VFS needs to revalidate a dentry. This - is called whenever a name look-up finds a dentry in the - dcache. Most local filesystems leave this as NULL, because all their - dentries in the dcache are valid. Network filesystems are different - since things can change on the server without the client necessarily - being aware of it. +- ``d_revalidate``: called when the VFS needs to revalidate a dentry. + This is called whenever a name look-up finds a dentry in the dcache. + Most local filesystems leave this as NULL, because all their dentries + in the dcache are valid. Network filesystems are different since + things can change on the server without the client necessarily being + aware of it. - This function should return a positive value if the dentry is still - valid, and zero or a negative error code if it isn't. + This function should return a positive value if the dentry is still + valid, and zero or a negative error code if it isn't. - d_revalidate may be called in rcu-walk mode (flags & LOOKUP_RCU). - If in rcu-walk mode, the filesystem must revalidate the dentry without - blocking or storing to the dentry, d_parent and d_inode should not be - used without care (because they can change and, in d_inode case, even - become NULL under us). + d_revalidate may be called in rcu-walk mode (flags & LOOKUP_RCU). If + in rcu-walk mode, the filesystem must revalidate the dentry without + blocking or storing to the dentry, d_parent and d_inode should not be + used without care (because they can change and, in d_inode case, even + become NULL under us). - If a situation is encountered that rcu-walk cannot handle, return - -ECHILD and it will be called again in ref-walk mode. + If a situation is encountered that rcu-walk cannot handle, return + -ECHILD and it will be called again in ref-walk mode. -- ``d_weak_revalidate``: called when the VFS needs to revalidate a "jumped" dentry. - This is called when a path-walk ends at dentry that was not acquired by - doing a lookup in the parent directory. This includes "/", "." and "..", - as well as procfs-style symlinks and mountpoint traversal. +- ``d_weak_revalidate``: called when the VFS needs to revalidate a + "jumped" dentry. This is called when a path-walk ends at dentry that + was not acquired by doing a lookup in the parent directory. This + includes "/", "." and "..", as well as procfs-style symlinks and + mountpoint traversal. - In this case, we are less concerned with whether the dentry is still - fully correct, but rather that the inode is still valid. As with - d_revalidate, most local filesystems will set this to NULL since their - dcache entries are always valid. + In this case, we are less concerned with whether the dentry is still + fully correct, but rather that the inode is still valid. As with + d_revalidate, most local filesystems will set this to NULL since their + dcache entries are always valid. - This function has the same return code semantics as d_revalidate. + This function has the same return code semantics as d_revalidate. - d_weak_revalidate is only called after leaving rcu-walk mode. + d_weak_revalidate is only called after leaving rcu-walk mode. -- ``d_hash``: called when the VFS adds a dentry to the hash table. The first - dentry passed to d_hash is the parent directory that the name is - to be hashed into. +- ``d_hash``: called when the VFS adds a dentry to the hash table. The + first dentry passed to d_hash is the parent directory that the name is + to be hashed into. - Same locking and synchronisation rules as d_compare regarding - what is safe to dereference etc. + Same locking and synchronisation rules as d_compare regarding what is + safe to dereference etc. -- ``d_compare``: called to compare a dentry name with a given name. The first - dentry is the parent of the dentry to be compared, the second is - the child dentry. len and name string are properties of the dentry - to be compared. qstr is the name to compare it with. +- ``d_compare``: called to compare a dentry name with a given name. The + first dentry is the parent of the dentry to be compared, the second is + the child dentry. len and name string are properties of the dentry to + be compared. qstr is the name to compare it with. - Must be constant and idempotent, and should not take locks if - possible, and should not or store into the dentry. - Should not dereference pointers outside the dentry without - lots of care (eg. d_parent, d_inode, d_name should not be used). + Must be constant and idempotent, and should not take locks if + possible, and should not or store into the dentry. Should not + dereference pointers outside the dentry without lots of care (eg. + d_parent, d_inode, d_name should not be used). - However, our vfsmount is pinned, and RCU held, so the dentries and - inodes won't disappear, neither will our sb or filesystem module. - ->d_sb may be used. + However, our vfsmount is pinned, and RCU held, so the dentries and + inodes won't disappear, neither will our sb or filesystem module. + ->d_sb may be used. - It is a tricky calling convention because it needs to be called under - "rcu-walk", ie. without any locks or references on things. + It is a tricky calling convention because it needs to be called under + "rcu-walk", ie. without any locks or references on things. -- ``d_delete``: called when the last reference to a dentry is dropped and the - dcache is deciding whether or not to cache it. Return 1 to delete - immediately, or 0 to cache the dentry. Default is NULL which means to - always cache a reachable dentry. d_delete must be constant and - idempotent. +- ``d_delete``: called when the last reference to a dentry is dropped + and the dcache is deciding whether or not to cache it. Return 1 to + delete immediately, or 0 to cache the dentry. Default is NULL which + means to always cache a reachable dentry. d_delete must be constant + and idempotent. -- ``d_init``: called when a dentry is allocated +- ``d_init``: called when a dentry is allocated. -- ``d_release``: called when a dentry is really deallocated +- ``d_release``: called when a dentry is really deallocated. - ``d_iput``: called when a dentry loses its inode (just prior to its - being deallocated). The default when this is NULL is that the - VFS calls iput(). If you define this method, you must call - iput() yourself + being deallocated). The default when this is NULL is that the VFS + calls iput(). If you define this method, you must call iput() + yourself. - ``d_dname``: called when the pathname of a dentry should be generated. - Useful for some pseudo filesystems (sockfs, pipefs, ...) to delay - pathname generation. (Instead of doing it when dentry is created, - it's done only when the path is needed.). Real filesystems probably - dont want to use it, because their dentries are present in global - dcache hash, so their hash should be an invariant. As no lock is - held, d_dname() should not try to modify the dentry itself, unless - appropriate SMP safety is used. CAUTION : d_path() logic is quite - tricky. The correct way to return for example "Hello" is to put it - at the end of the buffer, and returns a pointer to the first char. - dynamic_dname() helper function is provided to take care of this. - - .. code-block:: c - - static char *pipefs_dname(struct dentry *dent, char *buffer, int buflen) - { - return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]", - dentry->d_inode->i_ino); - } - -- ``d_automount``: called when an automount dentry is to be traversed (optional). - This should create a new VFS mount record and return the record to the - caller. The caller is supplied with a path parameter giving the - automount directory to describe the automount target and the parent - VFS mount record to provide inheritable mount parameters. NULL should - be returned if someone else managed to make the automount first. If - the vfsmount creation failed, then an error code should be returned. - If -EISDIR is returned, then the directory will be treated as an - ordinary directory and returned to pathwalk to continue walking. - - If a vfsmount is returned, the caller will attempt to mount it on the - mountpoint and will remove the vfsmount from its expiration list in - the case of failure. The vfsmount should be returned with 2 refs on - it to prevent automatic expiration - the caller will clean up the - additional ref. - - This function is only used if DCACHE_NEED_AUTOMOUNT is set on the - dentry. This is set by __d_instantiate() if S_AUTOMOUNT is set on the - inode being added. - -- ``d_manage``: called to allow the filesystem to manage the transition from a - dentry (optional). This allows autofs, for example, to hold up clients - waiting to explore behind a 'mountpoint' while letting the daemon go - past and construct the subtree there. 0 should be returned to let the - calling process continue. -EISDIR can be returned to tell pathwalk to - use this directory as an ordinary directory and to ignore anything - mounted on it and not to check the automount flag. Any other error - code will abort pathwalk completely. - - If the 'rcu_walk' parameter is true, then the caller is doing a - pathwalk in RCU-walk mode. Sleeping is not permitted in this mode, - and the caller can be asked to leave it and call again by returning - -ECHILD. -EISDIR may also be returned to tell pathwalk to - ignore d_automount or any mounts. - - This function is only used if DCACHE_MANAGE_TRANSIT is set on the - dentry being transited from. - -- ``d_real``: overlay/union type filesystems implement this method to return one of - the underlying dentries hidden by the overlay. It is used in two - different modes: - - Called from file_dentry() it returns the real dentry matching the inode - argument. The real dentry may be from a lower layer already copied up, - but still referenced from the file. This mode is selected with a - non-NULL inode argument. - - With NULL inode the topmost real underlying dentry is returned. + Useful for some pseudo filesystems (sockfs, pipefs, ...) to delay + pathname generation. (Instead of doing it when dentry is created, + it's done only when the path is needed.). Real filesystems probably + dont want to use it, because their dentries are present in global + dcache hash, so their hash should be an invariant. As no lock is + held, d_dname() should not try to modify the dentry itself, unless + appropriate SMP safety is used. CAUTION : d_path() logic is quite + tricky. The correct way to return for example "Hello" is to put it at + the end of the buffer, and returns a pointer to the first char. + dynamic_dname() helper function is provided to take care of this. + + .. code-block:: c + + static char *pipefs_dname(struct dentry *dent, char *buffer, int buflen) + { + return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]", + dentry->d_inode->i_ino); + } + +- ``d_automount``: called when an automount dentry is to be traversed + (optional). This should create a new VFS mount record and return the + record to the caller. The caller is supplied with a path parameter + giving the automount directory to describe the automount target and + the parent VFS mount record to provide inheritable mount parameters. + NULL should be returned if someone else managed to make the automount + first. If the vfsmount creation failed, then an error code should be + returned. If -EISDIR is returned, then the directory will be treated + as an ordinary directory and returned to pathwalk to continue walking. + + If a vfsmount is returned, the caller will attempt to mount it on the + mountpoint and will remove the vfsmount from its expiration list in + the case of failure. The vfsmount should be returned with 2 refs on + it to prevent automatic expiration - the caller will clean up the + additional ref. + + This function is only used if DCACHE_NEED_AUTOMOUNT is set on the + dentry. This is set by __d_instantiate() if S_AUTOMOUNT is set on the + inode being added. + +- ``d_manage``: called to allow the filesystem to manage the transition + from a dentry (optional). This allows autofs, for example, to hold up + clients waiting to explore behind a 'mountpoint' while letting the + daemon go past and construct the subtree there. 0 should be returned + to let the calling process continue. -EISDIR can be returned to tell + pathwalk to use this directory as an ordinary directory and to ignore + anything mounted on it and not to check the automount flag. Any other + error code will abort pathwalk completely. + + If the 'rcu_walk' parameter is true, then the caller is doing a + pathwalk in RCU-walk mode. Sleeping is not permitted in this mode, + and the caller can be asked to leave it and call again by returning + -ECHILD. -EISDIR may also be returned to tell pathwalk to ignore + d_automount or any mounts. + + This function is only used if DCACHE_MANAGE_TRANSIT is set on the + dentry being transited from. + +- ``d_real``: overlay/union type filesystems implement this method to + return one of the underlying dentries hidden by the overlay. It is + used in two different modes: + + Called from file_dentry() it returns the real dentry matching the + inode argument. The real dentry may be from a lower layer already + copied up, but still referenced from the file. This mode is selected + with a non-NULL inode argument. + + With NULL inode the topmost real underlying dentry is returned. Each dentry has a pointer to its parent dentry, as well as a hash list of child dentries. Child dentries are basically like files in a @@ -1188,39 +1189,38 @@ There are a number of functions defined which permit a filesystem to manipulate dentries: - ``dget``: open a new handle for an existing dentry (this just increments - the usage count) + the usage count). - ``dput``: close a handle for a dentry (decrements the usage count). If - the usage count drops to 0, and the dentry is still in its - parent's hash, the "d_delete" method is called to check whether - it should be cached. If it should not be cached, or if the dentry - is not hashed, it is deleted. Otherwise cached dentries are put - into an LRU list to be reclaimed on memory shortage. + the usage count drops to 0, and the dentry is still in its parent's hash, + the "d_delete" method is called to check whether it should be cached. If + it should not be cached, or if the dentry is not hashed, it is deleted. + Otherwise cached dentries are put into an LRU list to be reclaimed on + memory shortage. - ``d_drop``: this unhashes a dentry from its parents hash list. A - subsequent call to dput() will deallocate the dentry if its - usage count drops to 0 + subsequent call to dput() will deallocate the dentry if its usage count + drops to 0. - ``d_delete``: delete a dentry. If there are no other open references to - the dentry then the dentry is turned into a negative dentry - (the d_iput() method is called). If there are other - references, then d_drop() is called instead + the dentry then the dentry is turned into a negative dentry (the d_iput() + method is called). If there are other references, then d_drop() is + called instead. - ``d_add``: add a dentry to its parents hash list and then calls - d_instantiate() + d_instantiate(). - ``d_instantiate``: add a dentry to the alias hash list for the inode and - updates the "d_inode" member. The "i_count" member in the - inode structure should be set/incremented. If the inode - pointer is NULL, the dentry is called a "negative - dentry". This function is commonly called when an inode is - created for an existing negative dentry + updates the "d_inode" member. The "i_count" member in the inode + structure should be set/incremented. If the inode pointer is NULL, the + dentry is called a "negative dentry". This function is commonly called + when an inode is created for an existing negative dentry. -- ``d_lookup``: look up a dentry given its parent and path name component - It looks up the child of that given name from the dcache - hash table. If it is found, the reference count is incremented - and the dentry is returned. The caller must use dput() - to free the dentry when it finishes using it. +- ``d_lookup``: look up a dentry given its parent and path name component. + It looks up the child of that given name from the dcache hash table. If + it is found, the reference count is incremented and the dentry is + returned. The caller must use dput() to free the dentry when it finishes + using it. Mount Options @@ -1234,8 +1234,8 @@ On mount and remount the filesystem is passed a string containing a comma separated list of mount options. The options can have either of these forms: - option - option=value +- option +- option=value The header defines an API that helps parse these options. There are plenty of examples on how to use it in existing @@ -1248,11 +1248,11 @@ Showing options If a filesystem accepts mount options, it must define show_options() to show all the currently active options. The rules are: - - options MUST be shown which are not default or their values differ - from the default +- options MUST be shown which are not default or their values differ from + the default. - - options MAY be shown which are enabled by default or have their - default value +- options MAY be shown which are enabled by default or have their default + value. Options used only internally between a mount helper and the kernel (such as file descriptors), or which only have an effect during the mounting -- 2.21.0