€•dŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ&/translations/zh_CN/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/zh_TW/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/it_IT/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ja_JP/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ko_KR/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/pt_BR/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/sp_SP/filesystems/autofs”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒautofs - how it works”h]”hŒautofs - how it works”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ@/var/lib/git/docbuild/linux/Documentation/filesystems/autofs.rst”h´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒPurpose”h]”hŒPurpose”…”�”}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)�”}”(hŒ—The goal of autofs is to provide on-demand mounting and race free automatic unmounting of various other filesystems. This provides two key advantages:”h]”hŒ—The goal of autofs is to provide on-demand mounting and race free automatic unmounting of various other filesystems. This provides two key advantages:”…”�”}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hXEThere is no need to delay boot until all filesystems that might be needed are mounted. Processes that try to access those slow filesystems might be delayed but other processes can continue freely. This is particularly important for network filesystems (e.g. NFS) or filesystems stored on media with a media-changing robot. ”h]”hÝ)�”}”(hXDThere is no need to delay boot until all filesystems that might be needed are mounted. Processes that try to access those slow filesystems might be delayed but other processes can continue freely. This is particularly important for network filesystems (e.g. NFS) or filesystems stored on media with a media-changing robot.”h]”hXDThere is no need to delay boot until all filesystems that might be needed are mounted. Processes that try to access those slow filesystems might be delayed but other processes can continue freely. This is particularly important for network filesystems (e.g. NFS) or filesystems stored on media with a media-changing robot.”…”�”}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhóubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhhîh²hh³hÊh´Nubhò)�”}”(hXŠThe names and locations of filesystems can be stored in a remote database and can change at any time. The content in that database at the time of access will be used to provide a target for the access. The interpretation of names in the filesystem can even be programmatic rather than database-backed, allowing wildcards for example, and can vary based on the user who first accessed a name. ”h]”hÝ)�”}”(hX‰The names and locations of filesystems can be stored in a remote database and can change at any time. The content in that database at the time of access will be used to provide a target for the access. The interpretation of names in the filesystem can even be programmatic rather than database-backed, allowing wildcards for example, and can vary based on the user who first accessed a name.”h]”hX‰The names and locations of filesystems can be stored in a remote database and can change at any time. The content in that database at the time of access will be used to provide a target for the access. The interpretation of names in the filesystem can even be programmatic rather than database-backed, allowing wildcards for example, and can vary based on the user who first accessed a name.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhhîh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1hìhhËh²hh³hÊh´K ubeh}”(h]”Œpurpose”ah ]”h"]”Œpurpose”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒContext”h]”hŒContext”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj6h²hh³hÊh´KubhÝ)�”}”(hXÇThe "autofs" filesystem module is only one part of an autofs system. There also needs to be a user-space program which looks up names and mounts filesystems. This will often be the "automount" program, though other tools including "systemd" can make use of "autofs". This document describes only the kernel module and the interactions required with any user-space program. Subsequent text refers to this as the "automount daemon" or simply "the daemon".”h]”hXßThe “autofsâ€� filesystem module is only one part of an autofs system. There also needs to be a user-space program which looks up names and mounts filesystems. This will often be the “automountâ€� program, though other tools including “systemdâ€� can make use of “autofsâ€�. This document describes only the kernel module and the interactions required with any user-space program. Subsequent text refers to this as the “automount daemonâ€� or simply “the daemonâ€�.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khj6h²hubhÝ)�”}”(hŒÇ"autofs" is a Linux kernel module which provides the "autofs" filesystem type. Several "autofs" filesystems can be mounted and they can each be managed separately, or all managed by the same daemon.”h]”hŒÓ“autofsâ€� is a Linux kernel module which provides the “autofsâ€� filesystem type. Several “autofsâ€� filesystems can be mounted and they can each be managed separately, or all managed by the same daemon.”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K&hj6h²hubeh}”(h]”Œcontext”ah ]”h"]”Œcontext”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒContent”h]”hŒContent”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjkh²hh³hÊh´K+ubhÝ)�”}”(hŒ¶An autofs filesystem can contain 3 sorts of objects: directories, symbolic links and mount traps. Mount traps are directories with extra properties as described in the next section.”h]”hŒ¶An autofs filesystem can contain 3 sorts of objects: directories, symbolic links and mount traps. Mount traps are directories with extra properties as described in the next section.”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K-hjkh²hubhÝ)�”}”(hXÚObjects can only be created by the automount daemon: symlinks are created with a regular `symlink` system call, while directories and mount traps are created with `mkdir`. The determination of whether a directory should be a mount trap is based on a master map. This master map is consulted by autofs to determine which directories are mount points. Mount points can be *direct*/*indirect*/*offset*. On most systems, the default master map is located at */etc/auto.master*.”h]”(hŒYObjects can only be created by the automount daemon: symlinks are created with a regular ”…”�”}”(hjŠh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `symlink`”h]”hŒsymlink”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjŠubhŒA system call, while directories and mount traps are created with ”…”�”}”(hjŠh²hh³Nh´Nubj“)�”}”(hŒ`mkdir`”h]”hŒmkdir”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjŠubhŒÉ. The determination of whether a directory should be a mount trap is based on a master map. This master map is consulted by autofs to determine which directories are mount points. Mount points can be ”…”�”}”(hjŠh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ*direct*”h]”hŒdirect”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjŠubhŒ/”…”�”}”(hjŠh²hh³Nh´Nubj¹)�”}”(hŒ *indirect*”h]”hŒindirect”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjŠubhŒ/”…”�”}”hjŠsbj¹)�”}”(hŒ*offset*”h]”hŒoffset”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjŠubhŒ8. On most systems, the default master map is located at ”…”�”}”(hjŠh²hh³Nh´Nubj¹)�”}”(hŒ*/etc/auto.master*”h]”hŒ/etc/auto.master”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjŠubhŒ.”…”�”}”(hjŠh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K1hjkh²hubhÝ)�”}”(hX²If neither the *direct* or *offset* mount options are given (so the mount is considered to be *indirect*), then the root directory is always a regular directory, otherwise it is a mount trap when it is empty and a regular directory when not empty. Note that *direct* and *offset* are treated identically so a concise summary is that the root directory is a mount trap only if the filesystem is mounted *direct* and the root is empty.”h]”(hŒIf neither the ”…”�”}”(hjh²hh³Nh´Nubj¹)�”}”(hŒ*direct*”h]”hŒdirect”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ or ”…”�”}”(hjh²hh³Nh´Nubj¹)�”}”(hŒ*offset*”h]”hŒoffset”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ; mount options are given (so the mount is considered to be ”…”�”}”(hjh²hh³Nh´Nubj¹)�”}”(hŒ *indirect*”h]”hŒindirect”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ›), then the root directory is always a regular directory, otherwise it is a mount trap when it is empty and a regular directory when not empty. Note that ”…”�”}”(hjh²hh³Nh´Nubj¹)�”}”(hŒ*direct*”h]”hŒdirect”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ and ”…”�”}”(hjh²hh³Nh´Nubj¹)�”}”(hŒ*offset*”h]”hŒoffset”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ{ are treated identically so a concise summary is that the root directory is a mount trap only if the filesystem is mounted ”…”�”}”(hjh²hh³Nh´Nubj¹)�”}”(hŒ*direct*”h]”hŒdirect”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ and the root is empty.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K9hjkh²hubhÝ)�”}”(hŒzDirectories created in the root directory are mount traps only if the filesystem is mounted *indirect* and they are empty.”h]”(hŒ\Directories created in the root directory are mount traps only if the filesystem is mounted ”…”�”}”(hj‚h²hh³Nh´Nubj¹)�”}”(hŒ *indirect*”h]”hŒindirect”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj‚ubhŒ and they are empty.”…”�”}”(hj‚h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KAhjkh²hubhÝ)�”}”(hX`Directories further down the tree depend on the *maxproto* mount option and particularly whether it is less than five or not. When *maxproto* is five, no directories further down the tree are ever mount traps, they are always regular directories. When the *maxproto* is four (or three), these directories are mount traps precisely when they are empty.”h]”(hŒ0Directories further down the tree depend on the ”…”�”}”(hj¢h²hh³Nh´Nubj¹)�”}”(hŒ *maxproto*”h]”hŒmaxproto”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¢ubhŒI mount option and particularly whether it is less than five or not. When ”…”�”}”(hj¢h²hh³Nh´Nubj¹)�”}”(hŒ *maxproto*”h]”hŒmaxproto”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¢ubhŒt is five, no directories further down the tree are ever mount traps, they are always regular directories. When the ”…”�”}”(hj¢h²hh³Nh´Nubj¹)�”}”(hŒ *maxproto*”h]”hŒmaxproto”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¢ubhŒU is four (or three), these directories are mount traps precisely when they are empty.”…”�”}”(hj¢h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KDhjkh²hubhÝ)�”}”(hXSo: non-empty (i.e. non-leaf) directories are never mount traps. Empty directories are sometimes mount traps, and sometimes not depending on where in the tree they are (root, top level, or lower), the *maxproto*, and whether the mount was *indirect* or not.”h]”(hŒÉSo: non-empty (i.e. non-leaf) directories are never mount traps. Empty directories are sometimes mount traps, and sometimes not depending on where in the tree they are (root, top level, or lower), the ”…”�”}”(hjæh²hh³Nh´Nubj¹)�”}”(hŒ *maxproto*”h]”hŒmaxproto”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjæubhŒ, and whether the mount was ”…”�”}”(hjæh²hh³Nh´Nubj¹)�”}”(hŒ *indirect*”h]”hŒindirect”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjæubhŒ or not.”…”�”}”(hjæh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KKhjkh²hubeh}”(h]”Œcontent”ah ]”h"]”Œcontent”ah$]”h&]”uh1hµhh·h²hh³hÊh´K+ubh¶)�”}”(hhh]”(h»)�”}”(hŒ Mount Traps”h]”hŒ Mount Traps”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´KQubhÝ)�”}”(hXA core element of the implementation of autofs is the Mount Traps which are provided by the Linux VFS. Any directory provided by a filesystem can be designated as a trap. This involves two separate features that work together to allow autofs to do its job.”h]”hXA core element of the implementation of autofs is the Mount Traps which are provided by the Linux VFS. Any directory provided by a filesystem can be designated as a trap. This involves two separate features that work together to allow autofs to do its job.”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KShj h²hubhÝ)�”}”(hŒ**DCACHE_NEED_AUTOMOUNT**”h]”hŒstrong”“”)�”}”(hjAh]”hŒDCACHE_NEED_AUTOMOUNT”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KXhj h²hubhÝ)�”}”(hXêIf a dentry has the DCACHE_NEED_AUTOMOUNT flag set (which gets set if the inode has S_AUTOMOUNT set, or can be set directly) then it is (potentially) a mount trap. Any access to this directory beyond a "`stat`" will (normally) cause the `d_op->d_automount()` dentry operation to be called. The task of this method is to find the filesystem that should be mounted on the directory and to return it. The VFS is responsible for actually mounting the root of this filesystem on the directory.”h]”(hŒÎIf a dentry has the DCACHE_NEED_AUTOMOUNT flag set (which gets set if the inode has S_AUTOMOUNT set, or can be set directly) then it is (potentially) a mount trap. Any access to this directory beyond a “”…”�”}”(hjXh²hh³Nh´Nubj“)�”}”(hŒ`stat`”h]”hŒstat”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjXubhŒâ€� will (normally) cause the ”…”�”}”(hjXh²hh³Nh´Nubj“)�”}”(hŒ`d_op->d_automount()`”h]”hŒd_op->d_automount()”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjXubhŒç dentry operation to be called. The task of this method is to find the filesystem that should be mounted on the directory and to return it. The VFS is responsible for actually mounting the root of this filesystem on the directory.”…”�”}”(hjXh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KZhj h²hubhÝ)�”}”(hX‡autofs doesn't find the filesystem itself but sends a message to the automount daemon asking it to find and mount the filesystem. The autofs `d_automount` method then waits for the daemon to report that everything is ready. It will then return "`NULL`" indicating that the mount has already happened. The VFS doesn't try to mount anything but follows down the mount that is already there.”h]”(hŒ�autofs doesn’t find the filesystem itself but sends a message to the automount daemon asking it to find and mount the filesystem. The autofs ”…”�”}”(hjŠh²hh³Nh´Nubj“)�”}”(hŒ `d_automount`”h]”hŒ d_automount”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjŠubhŒ^ method then waits for the daemon to report that everything is ready. It will then return “”…”�”}”(hjŠh²hh³Nh´Nubj“)�”}”(hŒ`NULL`”h]”hŒNULL”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjŠubhŒŽâ€� indicating that the mount has already happened. The VFS doesn’t try to mount anything but follows down the mount that is already there.”…”�”}”(hjŠh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kchj h²hubhÝ)�”}”(hXÃThis functionality is sufficient for some users of mount traps such as NFS which creates traps so that mountpoints on the server can be reflected on the client. However it is not sufficient for autofs. As mounting onto a directory is considered to be "beyond a `stat`", the automount daemon would not be able to mount a filesystem on the 'trap' directory without some way to avoid getting caught in the trap. For that purpose there is another flag.”h]”(hX This functionality is sufficient for some users of mount traps such as NFS which creates traps so that mountpoints on the server can be reflected on the client. However it is not sufficient for autofs. As mounting onto a directory is considered to be “beyond a ”…”�”}”(hj¼h²hh³Nh´Nubj“)�”}”(hŒ`stat`”h]”hŒstat”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¼ubhŒ¼â€�, the automount daemon would not be able to mount a filesystem on the ‘trap’ directory without some way to avoid getting caught in the trap. For that purpose there is another flag.”…”�”}”(hj¼h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kjhj h²hubhÝ)�”}”(hŒ**DCACHE_MANAGE_TRANSIT**”h]”jD)�”}”(hjÞh]”hŒDCACHE_MANAGE_TRANSIT”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Krhj h²hubhÝ)�”}”(hŒ™If a dentry has DCACHE_MANAGE_TRANSIT set then two very different but related behaviours are invoked, both using the `d_op->d_manage()` dentry operation.”h]”(hŒuIf a dentry has DCACHE_MANAGE_TRANSIT set then two very different but related behaviours are invoked, both using the ”…”�”}”(hjóh²hh³Nh´Nubj“)�”}”(hŒ`d_op->d_manage()`”h]”hŒd_op->d_manage()”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjóubhŒ dentry operation.”…”�”}”(hjóh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kthj h²hubhÝ)�”}”(hŒºFirstly, before checking to see if any filesystem is mounted on the directory, d_manage() will be called with the `rcu_walk` parameter set to `false`. It may return one of three things:”h]”(hŒrFirstly, before checking to see if any filesystem is mounted on the directory, d_manage() will be called with the ”…”�”}”(hjh²hh³Nh´Nubj“)�”}”(hŒ `rcu_walk`”h]”hŒrcu_walk”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubhŒ parameter set to ”…”�”}”(hjh²hh³Nh´Nubj“)�”}”(hŒ`false`”h]”hŒfalse”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubhŒ%. It may return one of three things:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kxhj h²hubhŒ bullet_list”“”)�”}”(hhh]”(hò)�”}”(hXA return value of zero indicates that there is nothing special about this dentry and normal checks for mounts and automounts should proceed. autofs normally returns zero, but first waits for any expiry (automatic unmounting of the mounted filesystem) to complete. This avoids races. ”h]”(hÝ)�”}”(hŒŒA return value of zero indicates that there is nothing special about this dentry and normal checks for mounts and automounts should proceed.”h]”hŒŒA return value of zero indicates that there is nothing special about this dentry and normal checks for mounts and automounts should proceed.”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K|hjJubhÝ)�”}”(hŒŽautofs normally returns zero, but first waits for any expiry (automatic unmounting of the mounted filesystem) to complete. This avoids races.”h]”hŒŽautofs normally returns zero, but first waits for any expiry (automatic unmounting of the mounted filesystem) to complete. This avoids races.”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K€hjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhjGh²hh³hÊh´Nubhò)�”}”(hXGA return value of `-EISDIR` tells the VFS to ignore any mounts on the directory and to not consider calling `->d_automount()`. This effectively disables the **DCACHE_NEED_AUTOMOUNT** flag causing the directory not be a mount trap after all. autofs returns this if it detects that the process performing the lookup is the automount daemon and that the mount has been requested but has not yet completed. How it determines this is discussed later. This allows the automount daemon not to get caught in the mount trap. There is a subtlety here. It is possible that a second autofs filesystem can be mounted below the first and for both of them to be managed by the same daemon. For the daemon to be able to mount something on the second it must be able to "walk" down past the first. This means that d_manage cannot *always* return -EISDIR for the automount daemon. It must only return it when a mount has been requested, but has not yet completed. `d_manage` also returns `-EISDIR` if the dentry shouldn't be a mount trap, either because it is a symbolic link or because it is not empty. ”h]”(hÝ)�”}”(hŒðA return value of `-EISDIR` tells the VFS to ignore any mounts on the directory and to not consider calling `->d_automount()`. This effectively disables the **DCACHE_NEED_AUTOMOUNT** flag causing the directory not be a mount trap after all.”h]”(hŒA return value of ”…”�”}”(hjth²hh³Nh´Nubj“)�”}”(hŒ `-EISDIR`”h]”hŒ-EISDIR”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjtubhŒQ tells the VFS to ignore any mounts on the directory and to not consider calling ”…”�”}”(hjth²hh³Nh´Nubj“)�”}”(hŒ`->d_automount()`”h]”hŒ->d_automount()”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjtubhŒ . This effectively disables the ”…”�”}”(hjth²hh³Nh´NubjD)�”}”(hŒ**DCACHE_NEED_AUTOMOUNT**”h]”hŒDCACHE_NEED_AUTOMOUNT”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjtubhŒ: flag causing the directory not be a mount trap after all.”…”�”}”(hjth²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K„hjpubhÝ)�”}”(hXautofs returns this if it detects that the process performing the lookup is the automount daemon and that the mount has been requested but has not yet completed. How it determines this is discussed later. This allows the automount daemon not to get caught in the mount trap.”h]”hXautofs returns this if it detects that the process performing the lookup is the automount daemon and that the mount has been requested but has not yet completed. How it determines this is discussed later. This allows the automount daemon not to get caught in the mount trap.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K‰hjpubhÝ)�”}”(hX±There is a subtlety here. It is possible that a second autofs filesystem can be mounted below the first and for both of them to be managed by the same daemon. For the daemon to be able to mount something on the second it must be able to "walk" down past the first. This means that d_manage cannot *always* return -EISDIR for the automount daemon. It must only return it when a mount has been requested, but has not yet completed.”h]”(hX0There is a subtlety here. It is possible that a second autofs filesystem can be mounted below the first and for both of them to be managed by the same daemon. For the daemon to be able to mount something on the second it must be able to “walkâ€� down past the first. This means that d_manage cannot ”…”�”}”(hjÆh²hh³Nh´Nubj¹)�”}”(hŒ*always*”h]”hŒalways”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÆubhŒ} return -EISDIR for the automount daemon. It must only return it when a mount has been requested, but has not yet completed.”…”�”}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K�hjpubhÝ)�”}”(hŒ‹`d_manage` also returns `-EISDIR` if the dentry shouldn't be a mount trap, either because it is a symbolic link or because it is not empty.”h]”(j“)�”}”(hŒ `d_manage`”h]”hŒd_manage”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjæubhŒ also returns ”…”�”}”(hjæh²hh³Nh´Nubj“)�”}”(hŒ `-EISDIR`”h]”hŒ-EISDIR”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjæubhŒl if the dentry shouldn’t be a mount trap, either because it is a symbolic link or because it is not empty.”…”�”}”(hjæh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K—hjpubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhjGh²hh³hÊh´Nubhò)�”}”(hX<Any other negative value is treated as an error and returned to the caller. autofs can return - -ENOENT if the automount daemon failed to mount anything, - -ENOMEM if it ran out of memory, - -EINTR if a signal arrived while waiting for expiry to complete - or any other error sent down by the automount daemon. ”h]”(hÝ)�”}”(hŒKAny other negative value is treated as an error and returned to the caller.”h]”hŒKAny other negative value is treated as an error and returned to the caller.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K›hjubhÝ)�”}”(hŒautofs can return”h]”hŒautofs can return”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KžhjubjF)�”}”(hhh]”(hò)�”}”(hŒ9-ENOENT if the automount daemon failed to mount anything,”h]”hÝ)�”}”(hj?h]”hŒ9-ENOENT if the automount daemon failed to mount anything,”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhj:ubhò)�”}”(hŒ -ENOMEM if it ran out of memory,”h]”hÝ)�”}”(hjVh]”hŒ -ENOMEM if it ran out of memory,”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¡hjTubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhj:ubhò)�”}”(hŒ?-EINTR if a signal arrived while waiting for expiry to complete”h]”hÝ)�”}”(hŒ?-EINTR if a signal arrived while waiting for expiry to complete”h]”hŒ?-EINTR if a signal arrived while waiting for expiry to complete”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¢hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhj:ubhò)�”}”(hŒ7or any other error sent down by the automount daemon. ”h]”hÝ)�”}”(hŒ5or any other error sent down by the automount daemon.”h]”hŒ5or any other error sent down by the automount daemon.”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¤hjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhj:ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jEh³hÊh´K hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhjGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¡j¢uh1jEh³hÊh´K|hj h²hubhÝ)�”}”(hŒSThe second use case only occurs during an "RCU-walk" and so `rcu_walk` will be set.”h]”(hŒ@The second use case only occurs during an “RCU-walkâ€� and so ”…”�”}”(hj¯h²hh³Nh´Nubj“)�”}”(hŒ `rcu_walk`”h]”hŒrcu_walk”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¯ubhŒ will be set.”…”�”}”(hj¯h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K§hj h²hubhÝ)�”}”(hŒûAn RCU-walk is a fast and lightweight process for walking down a filename path (i.e. it is like running on tip-toes). RCU-walk cannot cope with all situations so when it finds a difficulty it falls back to "REF-walk", which is slower but more robust.”h]”hŒÿAn RCU-walk is a fast and lightweight process for walking down a filename path (i.e. it is like running on tip-toes). RCU-walk cannot cope with all situations so when it finds a difficulty it falls back to “REF-walkâ€�, which is slower but more robust.”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kªhj h²hubhÝ)�”}”(hŒãRCU-walk will never call `->d_automount`; the filesystems must already be mounted or RCU-walk cannot handle the path. To determine if a mount-trap is safe for RCU-walk mode it calls `->d_manage()` with `rcu_walk` set to `true`.”h]”(hŒRCU-walk will never call ”…”�”}”(hjÝh²hh³Nh´Nubj“)�”}”(hŒ`->d_automount`”h]”hŒ ->d_automount”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÝubhŒŽ; the filesystems must already be mounted or RCU-walk cannot handle the path. To determine if a mount-trap is safe for RCU-walk mode it calls ”…”�”}”(hjÝh²hh³Nh´Nubj“)�”}”(hŒ`->d_manage()`”h]”hŒ ->d_manage()”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÝubhŒ with ”…”�”}”(hjÝh²hh³Nh´Nubj“)�”}”(hŒ `rcu_walk`”h]”hŒrcu_walk”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÝubhŒ set to ”…”�”}”(hjÝh²hh³Nh´Nubj“)�”}”(hŒ`true`”h]”hŒtrue”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÝubhŒ.”…”�”}”(hjÝh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¯hj h²hubhÝ)�”}”(hXIn this case `d_manage()` must avoid blocking and should avoid taking spinlocks if at all possible. Its sole purpose is to determine if it would be safe to follow down into any mounted directory and the only reason that it might not be is if an expiry of the mount is underway.”h]”(hŒ In this case ”…”�”}”(hj3h²hh³Nh´Nubj“)�”}”(hŒ `d_manage()`”h]”hŒ d_manage()”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj3ubhŒý must avoid blocking and should avoid taking spinlocks if at all possible. Its sole purpose is to determine if it would be safe to follow down into any mounted directory and the only reason that it might not be is if an expiry of the mount is underway.”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K´hj h²hubhÝ)�”}”(hX{In the `rcu_walk` case, `d_manage()` cannot return -EISDIR to tell the VFS that this is a directory that doesn't require d_automount. If `rcu_walk` sees a dentry with DCACHE_NEED_AUTOMOUNT set but nothing mounted, it *will* fall back to REF-walk. `d_manage()` cannot make the VFS remain in RCU-walk mode, but can only tell it to get out of RCU-walk mode by returning `-ECHILD`.”h]”(hŒIn the ”…”�”}”(hjSh²hh³Nh´Nubj“)�”}”(hŒ `rcu_walk`”h]”hŒrcu_walk”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjSubhŒ case, ”…”�”}”(hjSh²hh³Nh´Nubj“)�”}”(hŒ `d_manage()`”h]”hŒ d_manage()”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjSubhŒh cannot return -EISDIR to tell the VFS that this is a directory that doesn’t require d_automount. If ”…”�”}”(hjSh²hh³Nh´Nubj“)�”}”(hŒ `rcu_walk`”h]”hŒrcu_walk”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjSubhŒF sees a dentry with DCACHE_NEED_AUTOMOUNT set but nothing mounted, it ”…”�”}”(hjSh²hh³Nh´Nubj¹)�”}”(hŒ*will*”h]”hŒwill”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjSubhŒ fall back to REF-walk. ”…”�”}”(hjSh²hh³Nh´Nubj“)�”}”(hŒ `d_manage()`”h]”hŒ d_manage()”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjSubhŒl cannot make the VFS remain in RCU-walk mode, but can only tell it to get out of RCU-walk mode by returning ”…”�”}”(hjSh²hh³Nh´Nubj“)�”}”(hŒ `-ECHILD`”h]”hŒ-ECHILD”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjSubhŒ.”…”�”}”(hjSh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kºhj h²hubhÝ)�”}”(hŒ¼So `d_manage()`, when called with `rcu_walk` set, should either return -ECHILD if there is any reason to believe it is unsafe to enter the mounted filesystem, otherwise it should return 0.”h]”(hŒSo ”…”�”}”(hjÍh²hh³Nh´Nubj“)�”}”(hŒ `d_manage()`”h]”hŒ d_manage()”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÍubhŒ, when called with ”…”�”}”(hjÍh²hh³Nh´Nubj“)�”}”(hŒ `rcu_walk`”h]”hŒrcu_walk”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÍubhŒ� set, should either return -ECHILD if there is any reason to believe it is unsafe to enter the mounted filesystem, otherwise it should return 0.”…”�”}”(hjÍh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÁhj h²hubhÝ)�”}”(hŒ~autofs will return `-ECHILD` if an expiry of the filesystem has been initiated or is being considered, otherwise it returns 0.”h]”(hŒautofs will return ”…”�”}”(hjÿh²hh³Nh´Nubj“)�”}”(hŒ `-ECHILD`”h]”hŒ-ECHILD”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÿubhŒb if an expiry of the filesystem has been initiated or is being considered, otherwise it returns 0.”…”�”}”(hjÿh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÅhj h²hubeh}”(h]”Œ mount-traps”ah ]”h"]”Œ mount traps”ah$]”h&]”uh1hµhh·h²hh³hÊh´KQubh¶)�”}”(hhh]”(h»)�”}”(hŒMountpoint expiry”h]”hŒMountpoint expiry”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj'h²hh³hÊh´KÊubhÝ)�”}”(hXíThe VFS has a mechanism for automatically expiring unused mounts, much as it can expire any unused dentry information from the dcache. This is guided by the MNT_SHRINKABLE flag. This only applies to mounts that were created by `d_automount()` returning a filesystem to be mounted. As autofs doesn't return such a filesystem but leaves the mounting to the automount daemon, it must involve the automount daemon in unmounting as well. This also means that autofs has more control over expiry.”h]”(hŒäThe VFS has a mechanism for automatically expiring unused mounts, much as it can expire any unused dentry information from the dcache. This is guided by the MNT_SHRINKABLE flag. This only applies to mounts that were created by ”…”�”}”(hj8h²hh³Nh´Nubj“)�”}”(hŒ`d_automount()`”h]”hŒ d_automount()”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj8ubhŒü returning a filesystem to be mounted. As autofs doesn’t return such a filesystem but leaves the mounting to the automount daemon, it must involve the automount daemon in unmounting as well. This also means that autofs has more control over expiry.”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÌhj'h²hubhÝ)�”}”(hX·The VFS also supports "expiry" of mounts using the MNT_EXPIRE flag to the `umount` system call. Unmounting with MNT_EXPIRE will fail unless a previous attempt had been made, and the filesystem has been inactive and untouched since that previous attempt. autofs does not depend on this but has its own internal tracking of whether filesystems were recently used. This allows individual names in the autofs directory to expire separately.”h]”(hŒNThe VFS also supports “expiryâ€� of mounts using the MNT_EXPIRE flag to the ”…”�”}”(hjXh²hh³Nh´Nubj“)�”}”(hŒ`umount`”h]”hŒumount”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjXubhXe system call. Unmounting with MNT_EXPIRE will fail unless a previous attempt had been made, and the filesystem has been inactive and untouched since that previous attempt. autofs does not depend on this but has its own internal tracking of whether filesystems were recently used. This allows individual names in the autofs directory to expire separately.”…”�”}”(hjXh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÕhj'h²hubhÝ)�”}”(hXEWith version 4 of the protocol, the automount daemon can try to unmount any filesystems mounted on the autofs filesystem or remove any symbolic links or empty directories any time it likes. If the unmount or removal is successful the filesystem will be returned to the state it was before the mount or creation, so that any access of the name will trigger normal auto-mount processing. In particular, `rmdir` and `unlink` do not leave negative entries in the dcache as a normal filesystem would, so an attempt to access a recently-removed object is passed to autofs for handling.”h]”(hX“With version 4 of the protocol, the automount daemon can try to unmount any filesystems mounted on the autofs filesystem or remove any symbolic links or empty directories any time it likes. If the unmount or removal is successful the filesystem will be returned to the state it was before the mount or creation, so that any access of the name will trigger normal auto-mount processing. In particular, ”…”�”}”(hjxh²hh³Nh´Nubj“)�”}”(hŒ`rmdir`”h]”hŒrmdir”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjxubhŒ and ”…”�”}”(hjxh²hh³Nh´Nubj“)�”}”(hŒ`unlink`”h]”hŒunlink”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjxubhŒž do not leave negative entries in the dcache as a normal filesystem would, so an attempt to access a recently-removed object is passed to autofs for handling.”…”�”}”(hjxh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÝhj'h²hubhÝ)�”}”(hX'With version 5, this is not safe except for unmounting from top-level directories. As lower-level directories are never mount traps, other processes will see an empty directory as soon as the filesystem is unmounted. So it is generally safest to use the autofs expiry protocol described below.”h]”hX'With version 5, this is not safe except for unmounting from top-level directories. As lower-level directories are never mount traps, other processes will see an empty directory as soon as the filesystem is unmounted. So it is generally safest to use the autofs expiry protocol described below.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kçhj'h²hubhÝ)�”}”(hXNormally the daemon only wants to remove entries which haven't been used for a while. For this purpose autofs maintains a "`last_used`" time stamp on each directory or symlink. For symlinks it genuinely does record the last time the symlink was "used" or followed to find out where it points to. For directories the field is used slightly differently. The field is updated at mount time and during expire checks if it is found to be in use (ie. open file descriptor or process working directory) and during path walks. The update done during path walks prevents frequent expire and immediate mount of frequently accessed automounts. But in the case where a GUI continually access or an application frequently scans an autofs directory tree there can be an accumulation of mounts that aren't actually being used. To cater for this case the "`strictexpire`" autofs mount option can be used to avoid the "`last_used`" update on path walk thereby preventing this apparent inability to expire mounts that aren't really in use.”h]”(hŒ€Normally the daemon only wants to remove entries which haven’t been used for a while. For this purpose autofs maintains a “”…”�”}”(hj¸h²hh³Nh´Nubj“)�”}”(hŒ `last_used`”h]”hŒ last_used”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¸ubhXÏâ€� time stamp on each directory or symlink. For symlinks it genuinely does record the last time the symlink was “usedâ€� or followed to find out where it points to. For directories the field is used slightly differently. The field is updated at mount time and during expire checks if it is found to be in use (ie. open file descriptor or process working directory) and during path walks. The update done during path walks prevents frequent expire and immediate mount of frequently accessed automounts. But in the case where a GUI continually access or an application frequently scans an autofs directory tree there can be an accumulation of mounts that aren’t actually being used. To cater for this case the “”…”�”}”(hj¸h²hh³Nh´Nubj“)�”}”(hŒ`strictexpire`”h]”hŒ strictexpire”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¸ubhŒ4â€� autofs mount option can be used to avoid the “”…”�”}”(hj¸h²hh³Nh´Nubj“)�”}”(hŒ `last_used`”h]”hŒ last_used”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¸ubhŒpâ€� update on path walk thereby preventing this apparent inability to expire mounts that aren’t really in use.”…”�”}”(hj¸h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kíhj'h²hubhÝ)�”}”(hXWThe daemon is able to ask autofs if anything is due to be expired, using an `ioctl` as discussed later. For a *direct* mount, autofs considers if the entire mount-tree can be unmounted or not. For an *indirect* mount, autofs considers each of the names in the top level directory to determine if any of those can be unmounted and cleaned up.”h]”(hŒLThe daemon is able to ask autofs if anything is due to be expired, using an ”…”�”}”(hjüh²hh³Nh´Nubj“)�”}”(hŒ`ioctl`”h]”hŒioctl”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjüubhŒ as discussed later. For a ”…”�”}”(hjüh²hh³Nh´Nubj¹)�”}”(hŒ*direct*”h]”hŒdirect”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjüubhŒS mount, autofs considers if the entire mount-tree can be unmounted or not. For an ”…”�”}”(hjüh²hh³Nh´Nubj¹)�”}”(hŒ *indirect*”h]”hŒindirect”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjüubhŒƒ mount, autofs considers each of the names in the top level directory to determine if any of those can be unmounted and cleaned up.”…”�”}”(hjüh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kþhj'h²hubhÝ)�”}”(hXThere is an option with indirect mounts to consider each of the leaves that has been mounted on instead of considering the top-level names. This was originally intended for compatibility with version 4 of autofs and should be considered as deprecated for Sun Format automount maps. However, it may be used again for amd format mount maps (which are generally indirect maps) because the amd automounter allows for the setting of an expire timeout for individual mounts. But there are some difficulties in making the needed changes for this.”h]”hXThere is an option with indirect mounts to consider each of the leaves that has been mounted on instead of considering the top-level names. This was originally intended for compatibility with version 4 of autofs and should be considered as deprecated for Sun Format automount maps. However, it may be used again for amd format mount maps (which are generally indirect maps) because the amd automounter allows for the setting of an expire timeout for individual mounts. But there are some difficulties in making the needed changes for this.”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj'h²hubhÝ)�”}”(hX=When autofs considers a directory it checks the `last_used` time and compares it with the "timeout" value set when the filesystem was mounted, though this check is ignored in some cases. It also checks if the directory or anything below it is in use. For symbolic links, only the `last_used` time is ever considered.”h]”(hŒ0When autofs considers a directory it checks the ”…”�”}”(hjNh²hh³Nh´Nubj“)�”}”(hŒ `last_used`”h]”hŒ last_used”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjNubhŒâ time and compares it with the “timeoutâ€� value set when the filesystem was mounted, though this check is ignored in some cases. It also checks if the directory or anything below it is in use. For symbolic links, only the ”…”�”}”(hjNh²hh³Nh´Nubj“)�”}”(hŒ `last_used`”h]”hŒ last_used”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjNubhŒ time is ever considered.”…”�”}”(hjNh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj'h²hubhÝ)�”}”(hŒPIf both appear to support expiring the directory or symlink, an action is taken.”h]”hŒPIf both appear to support expiring the directory or symlink, an action is taken.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj'h²hubhÝ)�”}”(hXüThere are two ways to ask autofs to consider expiry. The first is to use the **AUTOFS_IOC_EXPIRE** ioctl. This only works for indirect mounts. If it finds something in the root directory to expire it will return the name of that thing. Once a name has been returned the automount daemon needs to unmount any filesystems mounted below the name normally. As described above, this is unsafe for non-toplevel mounts in a version-5 autofs. For this reason the current `automount(8)` does not use this ioctl.”h]”(hŒNThere are two ways to ask autofs to consider expiry. The first is to use the ”…”�”}”(hjŽh²hh³Nh´NubjD)�”}”(hŒ**AUTOFS_IOC_EXPIRE**”h]”hŒAUTOFS_IOC_EXPIRE”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjŽubhXr ioctl. This only works for indirect mounts. If it finds something in the root directory to expire it will return the name of that thing. Once a name has been returned the automount daemon needs to unmount any filesystems mounted below the name normally. As described above, this is unsafe for non-toplevel mounts in a version-5 autofs. For this reason the current ”…”�”}”(hjŽh²hh³Nh´Nubj“)�”}”(hŒ`automount(8)`”h]”hŒ automount(8)”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjŽubhŒ does not use this ioctl.”…”�”}”(hjŽh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj'h²hubhÝ)�”}”(hXÐThe second mechanism uses either the **AUTOFS_DEV_IOCTL_EXPIRE_CMD** or the **AUTOFS_IOC_EXPIRE_MULTI** ioctl. This will work for both direct and indirect mounts. If it selects an object to expire, it will notify the daemon using the notification mechanism described below. This will block until the daemon acknowledges the expiry notification. This implies that the "`EXPIRE`" ioctl must be sent from a different thread than the one which handles notification.”h]”(hŒ%The second mechanism uses either the ”…”�”}”(hjÀh²hh³Nh´NubjD)�”}”(hŒ**AUTOFS_DEV_IOCTL_EXPIRE_CMD**”h]”hŒAUTOFS_DEV_IOCTL_EXPIRE_CMD”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÀubhŒ or the ”…”�”}”(hjÀh²hh³Nh´NubjD)�”}”(hŒ**AUTOFS_IOC_EXPIRE_MULTI**”h]”hŒAUTOFS_IOC_EXPIRE_MULTI”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÀubhX ioctl. This will work for both direct and indirect mounts. If it selects an object to expire, it will notify the daemon using the notification mechanism described below. This will block until the daemon acknowledges the expiry notification. This implies that the “”…”�”}”(hjÀh²hh³Nh´Nubj“)�”}”(hŒ`EXPIRE`”h]”hŒEXPIRE”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÀubhŒWâ€� ioctl must be sent from a different thread than the one which handles notification.”…”�”}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj'h²hubhÝ)�”}”(hŒîWhile the ioctl is blocking, the entry is marked as "expiring" and `d_manage` will block until the daemon affirms that the unmount has completed (together with removing any directories that might have been necessary), or has been aborted.”h]”(hŒGWhile the ioctl is blocking, the entry is marked as “expiringâ€� and ”…”�”}”(hj h²hh³Nh´Nubj“)�”}”(hŒ `d_manage`”h]”hŒd_manage”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj ubhŒ¡ will block until the daemon affirms that the unmount has completed (together with removing any directories that might have been necessary), or has been aborted.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M(hj'h²hubeh}”(h]”Œmountpoint-expiry”ah ]”h"]”Œmountpoint expiry”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÊubh¶)�”}”(hhh]”(h»)�”}”(hŒ/Communicating with autofs: detecting the daemon”h]”hŒ/Communicating with autofs: detecting the daemon”…”�”}”(hj/ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj, h²hh³hÊh´M.ubhÝ)�”}”(hXVThere are several forms of communication between the automount daemon and the filesystem. As we have already seen, the daemon can create and remove directories and symlinks using normal filesystem operations. autofs knows whether a process requesting some operation is the daemon or not based on its process-group id number (see getpgid(1)).”h]”hXVThere are several forms of communication between the automount daemon and the filesystem. As we have already seen, the daemon can create and remove directories and symlinks using normal filesystem operations. autofs knows whether a process requesting some operation is the daemon or not based on its process-group id number (see getpgid(1)).”…”�”}”(hj= h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M0hj, h²hubhÝ)�”}”(hXƒWhen an autofs filesystem is mounted the pgid of the mounting processes is recorded unless the "pgrp=" option is given, in which case that number is recorded instead. Any request arriving from a process in that process group is considered to come from the daemon. If the daemon ever has to be stopped and restarted a new pgid can be provided through an ioctl as will be described below.”h]”hX‡When an autofs filesystem is mounted the pgid of the mounting processes is recorded unless the “pgrp=â€� option is given, in which case that number is recorded instead. Any request arriving from a process in that process group is considered to come from the daemon. If the daemon ever has to be stopped and restarted a new pgid can be provided through an ioctl as will be described below.”…”�”}”(hjK h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M6hj, h²hubeh}”(h]”Œ.communicating-with-autofs-detecting-the-daemon”ah ]”h"]”Œ/communicating with autofs: detecting the daemon”ah$]”h&]”uh1hµhh·h²hh³hÊh´M.ubh¶)�”}”(hhh]”(h»)�”}”(hŒ)Communicating with autofs: the event pipe”h]”hŒ)Communicating with autofs: the event pipe”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhja h²hh³hÊh´M>ubhÝ)�”}”(hŒîWhen an autofs filesystem is mounted, the 'write' end of a pipe must be passed using the 'fd=' mount option. autofs will write notification messages to this pipe for the daemon to respond to. For version 5, the format of the message is::”h]”hŒõWhen an autofs filesystem is mounted, the ‘write’ end of a pipe must be passed using the ‘fd=’ mount option. autofs will write notification messages to this pipe for the daemon to respond to. For version 5, the format of the message is:”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M@hja h²hubhŒ literal_block”“”)�”}”(hXstruct autofs_v5_packet { struct autofs_packet_hdr hdr; autofs_wqt_t wait_queue_token; __u32 dev; __u64 ino; __u32 uid; __u32 gid; __u32 pid; __u32 tgid; __u32 len; char name[NAME_MAX+1]; };”h]”hXstruct autofs_v5_packet { struct autofs_packet_hdr hdr; autofs_wqt_t wait_queue_token; __u32 dev; __u64 ino; __u32 uid; __u32 gid; __u32 pid; __u32 tgid; __u32 len; char name[NAME_MAX+1]; };”…”�”}”hj‚ sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j€ h³hÊh´MEhja h²hubhÝ)�”}”(hŒ!And the format of the header is::”h]”hŒ And the format of the header is:”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MRhja h²hubj� )�”}”(hŒ™struct autofs_packet_hdr { int proto_version; /* Protocol version */ int type; /* Type of packet */ };”h]”hŒ™struct autofs_packet_hdr { int proto_version; /* Protocol version */ int type; /* Type of packet */ };”…”�”}”hj  sbah}”(h]”h ]”h"]”h$]”h&]”j� j‘ uh1j€ h³hÊh´MThja h²hubhÝ)�”}”(hŒwhere the type is one of ::”h]”hŒwhere the type is one of”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MYhja h²hubj� )�”}”(hŒqautofs_ptype_missing_indirect autofs_ptype_expire_indirect autofs_ptype_missing_direct autofs_ptype_expire_direct”h]”hŒqautofs_ptype_missing_indirect autofs_ptype_expire_indirect autofs_ptype_missing_direct autofs_ptype_expire_direct”…”�”}”hj¼ sbah}”(h]”h ]”h"]”h$]”h&]”j� j‘ uh1j€ h³hÊh´M[hja h²hubhÝ)�”}”(hŒŠso messages can indicate that a name is missing (something tried to access it but it isn't there) or that it has been selected for expiry.”h]”hŒŒso messages can indicate that a name is missing (something tried to access it but it isn’t there) or that it has been selected for expiry.”…”�”}”(hjÊ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M`hja h²hubhÝ)�”}”(hŒÉThe pipe will be set to "packet mode" (equivalent to passing `O_DIRECT`) to _pipe2(2)_ so that a read from the pipe will return at most one packet, and any unread portion of a packet will be discarded.”h]”(hŒAThe pipe will be set to “packet modeâ€� (equivalent to passing ”…”�”}”(hjØ h²hh³Nh´Nubj“)�”}”(hŒ `O_DIRECT`”h]”hŒO_DIRECT”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjØ ubhŒ‚) to _pipe2(2)_ so that a read from the pipe will return at most one packet, and any unread portion of a packet will be discarded.”…”�”}”(hjØ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mchja h²hubhÝ)�”}”(hXOThe `wait_queue_token` is a unique number which can identify a particular request to be acknowledged. When a message is sent over the pipe the affected dentry is marked as either "active" or "expiring" and other accesses to it block until the message is acknowledged using one of the ioctls below with the relevant `wait_queue_token`.”h]”(hŒThe ”…”�”}”(hjø h²hh³Nh´Nubj“)�”}”(hŒ`wait_queue_token`”h]”hŒwait_queue_token”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjø ubhX. is a unique number which can identify a particular request to be acknowledged. When a message is sent over the pipe the affected dentry is marked as either “activeâ€� or “expiringâ€� and other accesses to it block until the message is acknowledged using one of the ioctls below with the relevant ”…”�”}”(hjø h²hh³Nh´Nubj“)�”}”(hŒ`wait_queue_token`”h]”hŒwait_queue_token”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjø ubhŒ.”…”�”}”(hjø h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mghja h²hubeh}”(h]”Œ(communicating-with-autofs-the-event-pipe”ah ]”h"]”Œ)communicating with autofs: the event pipe”ah$]”h&]”uh1hµhh·h²hh³hÊh´M>ubh¶)�”}”(hhh]”(h»)�”}”(hŒ0Communicating with autofs: root directory ioctls”h]”hŒ0Communicating with autofs: root directory ioctls”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj2 h²hh³hÊh´MoubhÝ)�”}”(hŒ¶The root directory of an autofs filesystem will respond to a number of ioctls. The process issuing the ioctl must have the CAP_SYS_ADMIN capability, or must be the automount daemon.”h]”hŒ¶The root directory of an autofs filesystem will respond to a number of ioctls. The process issuing the ioctl must have the CAP_SYS_ADMIN capability, or must be the automount daemon.”…”�”}”(hjC h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mqhj2 h²hubhÝ)�”}”(hŒ!The available ioctl commands are:”h]”hŒ!The available ioctl commands are:”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Muhj2 h²hubjF)�”}”(hhh]”(hò)�”}”(hŒÂ**AUTOFS_IOC_READY**: a notification has been handled. The argument to the ioctl command is the "wait_queue_token" number corresponding to the notification being acknowledged.”h]”hŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒ°**AUTOFS_IOC_READY**: a notification has been handled. The argument to the ioctl command is the "wait_queue_token" number corresponding to the notification being acknowledged.”h]”(hŒterm”“”)�”}”(hŒ**AUTOFS_IOC_READY**:”h]”(jD)�”}”(hŒ**AUTOFS_IOC_READY**”h]”hŒAUTOFS_IOC_READY”…”�”}”(hjw h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjs ubhŒ:”…”�”}”(hjs h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq h³hÊh´Myhjm ubhŒ definition”“”)�”}”(hhh]”hÝ)�”}”(hŒša notification has been handled. The argument to the ioctl command is the "wait_queue_token" number corresponding to the notification being acknowledged.”h]”hŒža notification has been handled. The argument to the ioctl command is the “wait_queue_tokenâ€� number corresponding to the notification being acknowledged.”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mxhj‘ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j� hjm ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jk h³hÊh´Myhjh ubah}”(h]”h ]”h"]”h$]”h&]”uh1jf hjb ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhj_ h²hh³Nh´Nubhò)�”}”(hŒf**AUTOFS_IOC_FAIL**: similar to above, but indicates failure with the error code `ENOENT`.”h]”jg )�”}”(hhh]”jl )�”}”(hŒZ**AUTOFS_IOC_FAIL**: similar to above, but indicates failure with the error code `ENOENT`.”h]”(jr )�”}”(hŒ**AUTOFS_IOC_FAIL**:”h]”(jD)�”}”(hŒ**AUTOFS_IOC_FAIL**”h]”hŒAUTOFS_IOC_FAIL”…”�”}”(hjÉ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÅ ubhŒ:”…”�”}”(hjÅ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq h³hÊh´M|hjÁ ubj� )�”}”(hhh]”hÝ)�”}”(hŒEsimilar to above, but indicates failure with the error code `ENOENT`.”h]”(hŒ**AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD**: same as `close(ioctlfd)`.”h]”(jr )�”}”(hŒ$**AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD**:”h]”(jD)�”}”(hŒ#**AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD**”h]”hŒAUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj3ubhŒ:”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq h³hÊh´Míhj/ubj� )�”}”(hhh]”hÝ)�”}”(hŒsame as `close(ioctlfd)`.”h]”(hŒsame as ”…”�”}”(hjRh²hh³Nh´Nubj“)�”}”(hŒ`close(ioctlfd)`”h]”hŒclose(ioctlfd)”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjRubhŒ.”…”�”}”(hjRh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MîhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1j� hj/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jk h³hÊh´Míhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jf hj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³Nh´Nubhò)�”}”(hX"**AUTOFS_DEV_IOCTL_SETPIPEFD_CMD**: if the filesystem is in catatonic mode, this can provide the write end of a new pipe in `setpipefd.pipefd` to re-establish communication with a daemon. The process group of the calling process is used to identify the daemon.”h]”jg )�”}”(hhh]”jl )�”}”(hX**AUTOFS_DEV_IOCTL_SETPIPEFD_CMD**: if the filesystem is in catatonic mode, this can provide the write end of a new pipe in `setpipefd.pipefd` to re-establish communication with a daemon. The process group of the calling process is used to identify the daemon.”h]”(jr )�”}”(hŒ#**AUTOFS_DEV_IOCTL_SETPIPEFD_CMD**:”h]”(jD)�”}”(hŒ"**AUTOFS_DEV_IOCTL_SETPIPEFD_CMD**”h]”hŒAUTOFS_DEV_IOCTL_SETPIPEFD_CMD”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj•ubhŒ:”…”�”}”(hj•h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq h³hÊh´Móhj‘ubj� )�”}”(hhh]”hÝ)�”}”(hŒàif the filesystem is in catatonic mode, this can provide the write end of a new pipe in `setpipefd.pipefd` to re-establish communication with a daemon. The process group of the calling process is used to identify the daemon.”h]”(hŒXif the filesystem is in catatonic mode, this can provide the write end of a new pipe in ”…”�”}”(hj´h²hh³Nh´Nubj“)�”}”(hŒ`setpipefd.pipefd`”h]”hŒsetpipefd.pipefd”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj´ubhŒv to re-establish communication with a daemon. The process group of the calling process is used to identify the daemon.”…”�”}”(hj´h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mðhj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1j� hj‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jk h³hÊh´MóhjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jf hjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³Nh´Nubhò)�”}”(hX**AUTOFS_DEV_IOCTL_REQUESTER_CMD**: `path` should be a name within the filesystem that has been auto-mounted on. On successful return, `requester.uid` and `requester.gid` will be the UID and GID of the process which triggered that mount.”h]”jg )�”}”(hhh]”jl )�”}”(hŒí**AUTOFS_DEV_IOCTL_REQUESTER_CMD**: `path` should be a name within the filesystem that has been auto-mounted on. On successful return, `requester.uid` and `requester.gid` will be the UID and GID of the process which triggered that mount.”h]”(jr )�”}”(hŒ#**AUTOFS_DEV_IOCTL_REQUESTER_CMD**:”h]”(jD)�”}”(hŒ"**AUTOFS_DEV_IOCTL_REQUESTER_CMD**”h]”hŒAUTOFS_DEV_IOCTL_REQUESTER_CMD”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj÷ubhŒ:”…”�”}”(hj÷h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq h³hÊh´Møhjóubj� )�”}”(hhh]”hÝ)�”}”(hŒÉ`path` should be a name within the filesystem that has been auto-mounted on. On successful return, `requester.uid` and `requester.gid` will be the UID and GID of the process which triggered that mount.”h]”(j“)�”}”(hŒ`path`”h]”hŒpath”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubhŒ] should be a name within the filesystem that has been auto-mounted on. On successful return, ”…”�”}”(hjh²hh³Nh´Nubj“)�”}”(hŒ`requester.uid`”h]”hŒ requester.uid”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubhŒ and ”…”�”}”(hjh²hh³Nh´Nubj“)�”}”(hŒ`requester.gid`”h]”hŒ requester.gid”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubhŒC will be the UID and GID of the process which triggered that mount.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Möhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j� hjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1jk h³hÊh´Møhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jf hjìubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³Nh´Nubhò)�”}”(hŒ–**AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD**: Check if path is a mountpoint of a particular type - see separate documentation for details. ”h]”jg )�”}”(hhh]”jl )�”}”(hŒ„**AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD**: Check if path is a mountpoint of a particular type - see separate documentation for details. ”h]”(jr )�”}”(hŒ&**AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD**:”h]”(jD)�”}”(hŒ%**AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD**”h]”hŒ!AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjyubhŒ:”…”�”}”(hjyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq h³hÊh´Mýhjuubj� )�”}”(hhh]”hÝ)�”}”(hŒ\Check if path is a mountpoint of a particular type - see separate documentation for details.”h]”hŒ\Check if path is a mountpoint of a particular type - see separate documentation for details.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mûhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1j� hjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1jk h³hÊh´Mýhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1jf hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³Nh´Nubhò)�”}”(hŒ!**AUTOFS_DEV_IOCTL_PROTOVER_CMD**”h]”hÝ)�”}”(hjÀh]”jD)�”}”(hjÀh]”hŒAUTOFS_DEV_IOCTL_PROTOVER_CMD”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mÿhj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ$**AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD**”h]”hÝ)�”}”(hjàh]”jD)�”}”(hjàh]”hŒ AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjâubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ**AUTOFS_DEV_IOCTL_READY_CMD**”h]”hÝ)�”}”(hjh]”jD)�”}”(hjh]”hŒAUTOFS_DEV_IOCTL_READY_CMD”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ**AUTOFS_DEV_IOCTL_FAIL_CMD**”h]”hÝ)�”}”(hj h]”jD)�”}”(hj h]”hŒAUTOFS_DEV_IOCTL_FAIL_CMD”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ"**AUTOFS_DEV_IOCTL_CATATONIC_CMD**”h]”hÝ)�”}”(hj@h]”jD)�”}”(hj@h]”hŒAUTOFS_DEV_IOCTL_CATATONIC_CMD”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjBubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ **AUTOFS_DEV_IOCTL_TIMEOUT_CMD**”h]”hÝ)�”}”(hj`h]”jD)�”}”(hj`h]”hŒAUTOFS_DEV_IOCTL_TIMEOUT_CMD”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjbubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ**AUTOFS_DEV_IOCTL_EXPIRE_CMD**”h]”hÝ)�”}”(hj€h]”jD)�”}”(hj€h]”hŒAUTOFS_DEV_IOCTL_EXPIRE_CMD”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubhò)�”}”(hŒ#**AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD** ”h]”hÝ)�”}”(hŒ"**AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD**”h]”jD)�”}”(hj¤h]”hŒAUTOFS_DEV_IOCTL_ASKUMOUNT_CMD”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjah²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¡j¢uh1jEh³hÊh´MähjHh²hubhÝ)�”}”(hXThese all have the same function as the similarly named **AUTOFS_IOC** ioctls, except that **FAIL** can be given an explicit error number in `fail.status` instead of assuming `ENOENT`, and this **EXPIRE** command corresponds to **AUTOFS_IOC_EXPIRE_MULTI**.”h]”(hŒ8These all have the same function as the similarly named ”…”�”}”(hjÅh²hh³Nh´NubjD)�”}”(hŒ**AUTOFS_IOC**”h]”hŒ AUTOFS_IOC”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÅubhŒ ioctls, except that ”…”�”}”(hjÅh²hh³Nh´NubjD)�”}”(hŒ**FAIL**”h]”hŒFAIL”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÅubhŒ* can be given an explicit error number in ”…”�”}”(hjÅh²hh³Nh´Nubj“)�”}”(hŒ `fail.status`”h]”hŒ fail.status”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÅubhŒ instead of assuming ”…”�”}”(hjÅh²hh³Nh´Nubj“)�”}”(hŒ`ENOENT`”h]”hŒENOENT”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÅubhŒ , and this ”…”�”}”(hjÅh²hh³Nh´NubjD)�”}”(hŒ **EXPIRE**”h]”hŒEXPIRE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÅubhŒ command corresponds to ”…”�”}”(hjÅh²hh³Nh´NubjD)�”}”(hŒ**AUTOFS_IOC_EXPIRE_MULTI**”h]”hŒAUTOFS_IOC_EXPIRE_MULTI”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÅubhŒ.”…”�”}”(hjÅh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjHh²hubeh}”(h]”Œ,communicating-with-autofs-char-device-ioctls”ah ]”h"]”Œ-communicating with autofs: char-device ioctls”ah$]”h&]”uh1hµhh·h²hh³hÊh´M²ubh¶)�”}”(hhh]”(h»)�”}”(hŒCatatonic mode”h]”hŒCatatonic mode”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjGh²hh³hÊh´MubhÝ)�”}”(hŒ¢As mentioned, an autofs mount can enter "catatonic" mode. This happens if a write to the notification pipe fails, or if it is explicitly requested by an `ioctl`.”h]”(hŒžAs mentioned, an autofs mount can enter “catatonicâ€� mode. This happens if a write to the notification pipe fails, or if it is explicitly requested by an ”…”�”}”(hjXh²hh³Nh´Nubj“)�”}”(hŒ`ioctl`”h]”hŒioctl”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjXubhŒ.”…”�”}”(hjXh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjGh²hubhÝ)�”}”(hŒxWhen entering catatonic mode, the pipe is closed and any pending notifications are acknowledged with the error `ENOENT`.”h]”(hŒoWhen entering catatonic mode, the pipe is closed and any pending notifications are acknowledged with the error ”…”�”}”(hjxh²hh³Nh´Nubj“)�”}”(hŒ`ENOENT`”h]”hŒENOENT”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjxubhŒ.”…”�”}”(hjxh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjGh²hubhÝ)�”}”(hŒáOnce in catatonic mode attempts to access non-existing names will result in `ENOENT` while attempts to access existing directories will be treated in the same way as if they came from the daemon, so mount traps will not fire.”h]”(hŒLOnce in catatonic mode attempts to access non-existing names will result in ”…”�”}”(hj˜h²hh³Nh´Nubj“)�”}”(hŒ`ENOENT`”h]”hŒENOENT”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj˜ubhŒ� while attempts to access existing directories will be treated in the same way as if they came from the daemon, so mount traps will not fire.”…”�”}”(hj˜h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjGh²hubhÝ)�”}”(hXWhen the filesystem is mounted a _uid_ and _gid_ can be given which set the ownership of directories and symbolic links. When the filesystem is in catatonic mode, any process with a matching UID can create directories or symlinks in the root directory, but not in other directories.”h]”hXWhen the filesystem is mounted a _uid_ and _gid_ can be given which set the ownership of directories and symbolic links. When the filesystem is in catatonic mode, any process with a matching UID can create directories or symlinks in the root directory, but not in other directories.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjGh²hubhÝ)�”}”(hŒfCatatonic mode can only be left via the **AUTOFS_DEV_IOCTL_OPENMOUNT_CMD** ioctl on the `/dev/autofs`.”h]”(hŒ(Catatonic mode can only be left via the ”…”�”}”(hjÆh²hh³Nh´NubjD)�”}”(hŒ"**AUTOFS_DEV_IOCTL_OPENMOUNT_CMD**”h]”hŒAUTOFS_DEV_IOCTL_OPENMOUNT_CMD”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjÆubhŒ ioctl on the ”…”�”}”(hjÆh²hh³Nh´Nubj“)�”}”(hŒ `/dev/autofs`”h]”hŒ /dev/autofs”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÆubhŒ.”…”�”}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M#hjGh²hubeh}”(h]”Œcatatonic-mode”ah ]”h"]”Œcatatonic mode”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mubh¶)�”}”(hhh]”(h»)�”}”(hŒThe "ignore" mount option”h]”hŒThe “ignoreâ€� mount option”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´M'ubhÝ)�”}”(hŒžThe "ignore" mount option can be used to provide a generic indicator to applications that the mount entry should be ignored when displaying mount information.”h]”hŒ¢The “ignoreâ€� mount option can be used to provide a generic indicator to applications that the mount entry should be ignored when displaying mount information.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M)hjh²hubhÝ)�”}”(hŒöIn other OSes that provide autofs and that provide a mount list to user space based on the kernel mount list a no-op mount option ("ignore" is the one use on the most common OSes) is allowed so that autofs file system users can optionally use it.”h]”hŒúIn other OSes that provide autofs and that provide a mount list to user space based on the kernel mount list a no-op mount option (“ignoreâ€� is the one use on the most common OSes) is allowed so that autofs file system users can optionally use it.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M-hjh²hubhÝ)�”}”(hŒ|This is intended to be used by user space programs to exclude autofs mounts from consideration when reading the mounts list.”h]”hŒ|This is intended to be used by user space programs to exclude autofs mounts from consideration when reading the mounts list.”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M2hjh²hubeh}”(h]”Œthe-ignore-mount-option”ah ]”h"]”Œthe "ignore" mount option”ah$]”h&]”uh1hµhh·h²hh³hÊh´M'ubh¶)�”}”(hhh]”(h»)�”}”(hŒ&autofs, name spaces, and shared mounts”h]”hŒ&autofs, name spaces, and shared mounts”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjCh²hh³hÊh´M6ubhÝ)�”}”(hŒéWith bind mounts and name spaces it is possible for an autofs filesystem to appear at multiple places in one or more filesystem name spaces. For this to work sensibly, the autofs filesystem should always be mounted "shared". e.g. ::”h]”hŒêWith bind mounts and name spaces it is possible for an autofs filesystem to appear at multiple places in one or more filesystem name spaces. For this to work sensibly, the autofs filesystem should always be mounted “sharedâ€�. e.g.”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M8hjCh²hubj� )�”}”(hŒ'mount --make-shared /autofs/mount/point”h]”hŒ'mount --make-shared /autofs/mount/point”…”�”}”hjbsbah}”(h]”h ]”h"]”h$]”h&]”j� j‘ uh1j€ h³hÊh´M=hjCh²hubhÝ)�”}”(hX The automount daemon is only able to manage a single mount location for an autofs filesystem and if mounts on that are not 'shared', other locations will not behave as expected. In particular access to those other locations will likely result in the `ELOOP` error ::”h]”(hŒÿThe automount daemon is only able to manage a single mount location for an autofs filesystem and if mounts on that are not ‘shared’, other locations will not behave as expected. In particular access to those other locations will likely result in the ”…”�”}”(hjph²hh³Nh´Nubj“)�”}”(hŒ`ELOOP`”h]”hŒELOOP”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjpubhŒ error”…”�”}”(hjph²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M?hjCh²hubj� )�”}”(hŒ!Too many levels of symbolic links”h]”hŒ!Too many levels of symbolic links”…”�”}”hj�sbah}”(h]”h ]”h"]”h$]”h&]”j� j‘ uh1j€ h³hÊh´MDhjCh²hubeh}”(h]”Œ$autofs-name-spaces-and-shared-mounts”ah ]”h"]”Œ&autofs, name spaces, and shared mounts”ah$]”h&]”uh1hµhh·h²hh³hÊh´M6ubeh}”(h]”Œautofs-how-it-works”ah ]”h"]”Œautofs - how it works”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jÑŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j«j¨j3j0jhjejjj$j!j) j& j^ j[ j/ j, jEjBjDjAjýjúj@j=j£j uŒ nametypes”}”(j«‰j3‰jh‰j‰j$‰j) ‰j^ ‰j/ ‰jE‰jD‰jý‰j@‰j£‰uh}”(j¨h·j0hËjej6jjkj!j j& j'j[ j, j, ja jBj2 jAjHjújGj=jj jCuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.