.sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget+/translations/zh_CN/admin-guide/sysfs-rulesmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/admin-guide/sysfs-rulesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/admin-guide/sysfs-rulesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/admin-guide/sysfs-rulesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/admin-guide/sysfs-rulesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/admin-guide/sysfs-rulesmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h+Rules on how to access information in sysfsh]h+Rules on how to access information in sysfs}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhE/var/lib/git/docbuild/linux/Documentation/admin-guide/sysfs-rules.rsthKubh paragraph)}(hXJThe kernel-exported sysfs exports internal kernel implementation details and depends on internal kernel structures and layout. It is agreed upon by the kernel developers that the Linux kernel does not provide a stable internal API. Therefore, there are aspects of the sysfs interface that may not be stable across kernel releases.h]hXJThe kernel-exported sysfs exports internal kernel implementation details and depends on internal kernel structures and layout. It is agreed upon by the kernel developers that the Linux kernel does not provide a stable internal API. Therefore, there are aspects of the sysfs interface that may not be stable across kernel releases.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXTo minimize the risk of breaking users of sysfs, which are in most cases low-level userspace applications, with a new kernel release, the users of sysfs must follow some rules to use an as-abstract-as-possible way to access this filesystem. The current udev and HAL programs already implement this and users are encouraged to plug, if possible, into the abstractions these programs provide instead of accessing sysfs directly.h]hXTo minimize the risk of breaking users of sysfs, which are in most cases low-level userspace applications, with a new kernel release, the users of sysfs must follow some rules to use an as-abstract-as-possible way to access this filesystem. The current udev and HAL programs already implement this and users are encouraged to plug, if possible, into the abstractions these programs provide instead of accessing sysfs directly.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hBut if you really do want or need to access sysfs directly, please follow the following rules and then your programs should work with future versions of the sysfs interface.h]hBut if you really do want or need to access sysfs directly, please follow the following rules and then your programs should work with future versions of the sysfs interface.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh bullet_list)}(hhh](h list_item)}(hXDo not use libsysfs It makes assumptions about sysfs which are not true. Its API does not offer any abstraction, it exposes all the kernel driver-core implementation details in its own API. Therefore it is not better than reading directories and opening the files yourself. Also, it is not actively maintained, in the sense of reflecting the current kernel development. The goal of providing a stable interface to sysfs has failed; it causes more problems than it solves. It violates many of the rules in this document. h]hdefinition_list)}(hhh]hdefinition_list_item)}(hXDo not use libsysfs It makes assumptions about sysfs which are not true. Its API does not offer any abstraction, it exposes all the kernel driver-core implementation details in its own API. Therefore it is not better than reading directories and opening the files yourself. Also, it is not actively maintained, in the sense of reflecting the current kernel development. The goal of providing a stable interface to sysfs has failed; it causes more problems than it solves. It violates many of the rules in this document. h](hterm)}(hDo not use libsysfsh]hDo not use libsysfs}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubh definition)}(hhh]h)}(hXIt makes assumptions about sysfs which are not true. Its API does not offer any abstraction, it exposes all the kernel driver-core implementation details in its own API. Therefore it is not better than reading directories and opening the files yourself. Also, it is not actively maintained, in the sense of reflecting the current kernel development. The goal of providing a stable interface to sysfs has failed; it causes more problems than it solves. It violates many of the rules in this document.h]hXIt makes assumptions about sysfs which are not true. Its API does not offer any abstraction, it exposes all the kernel driver-core implementation details in its own API. Therefore it is not better than reading directories and opening the files yourself. Also, it is not actively maintained, in the sense of reflecting the current kernel development. The goal of providing a stable interface to sysfs has failed; it causes more problems than it solves. It violates many of the rules in this document.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXqsysfs is always at ``/sys`` Parsing ``/proc/mounts`` is a waste of time. Other mount points are a system configuration bug you should not try to solve. For test cases, possibly support a ``SYSFS_PATH`` environment variable to overwrite the application's behavior, but never try to search for sysfs. Never try to mount it, if you are not an early boot script. h]h)}(hhh]h)}(hXgsysfs is always at ``/sys`` Parsing ``/proc/mounts`` is a waste of time. Other mount points are a system configuration bug you should not try to solve. For test cases, possibly support a ``SYSFS_PATH`` environment variable to overwrite the application's behavior, but never try to search for sysfs. Never try to mount it, if you are not an early boot script. h](h)}(hsysfs is always at ``/sys``h](hsysfs is always at }(hj?hhhNhNubhliteral)}(h``/sys``h]h/sys}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj?ubeh}(h]h ]h"]h$]h&]uh1hhhhK$hj;ubj )}(hhh]h)}(hXJParsing ``/proc/mounts`` is a waste of time. Other mount points are a system configuration bug you should not try to solve. For test cases, possibly support a ``SYSFS_PATH`` environment variable to overwrite the application's behavior, but never try to search for sysfs. Never try to mount it, if you are not an early boot script.h](hParsing }(hj`hhhNhNubjH)}(h``/proc/mounts``h]h /proc/mounts}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj`ubh is a waste of time. Other mount points are a system configuration bug you should not try to solve. For test cases, possibly support a }(hj`hhhNhNubjH)}(h``SYSFS_PATH``h]h SYSFS_PATH}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj`ubh environment variable to overwrite the application’s behavior, but never try to search for sysfs. Never try to mount it, if you are not an early boot script.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hj]ubah}(h]h ]h"]h$]h&]uh1j hj;ubeh}(h]h ]h"]h$]h&]uh1hhhhK$hj8ubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hX) devices are only "devices" There is no such thing like class-, bus-, physical devices, interfaces, and such that you can rely on in userspace. Everything is just simply a "device". Class-, bus-, physical, ... types are just kernel implementation details which should not be expected by applications that look for devices in sysfs. The properties of a device are: - devpath (``/devices/pci0000:00/0000:00:1d.1/usb2/2-2/2-2:1.0``) - identical to the DEVPATH value in the event sent from the kernel at device creation and removal - the unique key to the device at that point in time - the kernel's path to the device directory without the leading ``/sys``, and always starting with a slash - all elements of a devpath must be real directories. Symlinks pointing to /sys/devices must always be resolved to their real target and the target path must be used to access the device. That way the devpath to the device matches the devpath of the kernel used at event time. - using or exposing symlink values as elements in a devpath string is a bug in the application - kernel name (``sda``, ``tty``, ``0000:00:1f.2``, ...) - a directory name, identical to the last element of the devpath - applications need to handle spaces and characters like ``!`` in the name - subsystem (``block``, ``tty``, ``pci``, ...) - simple string, never a path or a link - retrieved by reading the "subsystem"-link and using only the last element of the target path - driver (``tg3``, ``ata_piix``, ``uhci_hcd``) - a simple string, which may contain spaces, never a path or a link - it is retrieved by reading the "driver"-link and using only the last element of the target path - devices which do not have "driver"-link just do not have a driver; copying the driver value in a child device context is a bug in the application - attributes - the files in the device directory or files below subdirectories of the same device directory - accessing attributes reached by a symlink pointing to another device, like the "device"-link, is a bug in the application Everything else is just a kernel driver-core implementation detail that should not be assumed to be stable across kernel releases. h]h)}(hhh]h)}(hXdevices are only "devices" There is no such thing like class-, bus-, physical devices, interfaces, and such that you can rely on in userspace. Everything is just simply a "device". Class-, bus-, physical, ... types are just kernel implementation details which should not be expected by applications that look for devices in sysfs. The properties of a device are: - devpath (``/devices/pci0000:00/0000:00:1d.1/usb2/2-2/2-2:1.0``) - identical to the DEVPATH value in the event sent from the kernel at device creation and removal - the unique key to the device at that point in time - the kernel's path to the device directory without the leading ``/sys``, and always starting with a slash - all elements of a devpath must be real directories. Symlinks pointing to /sys/devices must always be resolved to their real target and the target path must be used to access the device. That way the devpath to the device matches the devpath of the kernel used at event time. - using or exposing symlink values as elements in a devpath string is a bug in the application - kernel name (``sda``, ``tty``, ``0000:00:1f.2``, ...) - a directory name, identical to the last element of the devpath - applications need to handle spaces and characters like ``!`` in the name - subsystem (``block``, ``tty``, ``pci``, ...) - simple string, never a path or a link - retrieved by reading the "subsystem"-link and using only the last element of the target path - driver (``tg3``, ``ata_piix``, ``uhci_hcd``) - a simple string, which may contain spaces, never a path or a link - it is retrieved by reading the "driver"-link and using only the last element of the target path - devices which do not have "driver"-link just do not have a driver; copying the driver value in a child device context is a bug in the application - attributes - the files in the device directory or files below subdirectories of the same device directory - accessing attributes reached by a symlink pointing to another device, like the "device"-link, is a bug in the application Everything else is just a kernel driver-core implementation detail that should not be assumed to be stable across kernel releases. h](h)}(hdevices are only "devices"h]hdevices are only “devices”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK\hjubj )}(hhh](h)}(hX/There is no such thing like class-, bus-, physical devices, interfaces, and such that you can rely on in userspace. Everything is just simply a "device". Class-, bus-, physical, ... types are just kernel implementation details which should not be expected by applications that look for devices in sysfs.h]hX3There is no such thing like class-, bus-, physical devices, interfaces, and such that you can rely on in userspace. Everything is just simply a “device”. Class-, bus-, physical, ... types are just kernel implementation details which should not be expected by applications that look for devices in sysfs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjubh)}(hThe properties of a device are:h]hThe properties of a device are:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubh)}(hhh](h)}(hXdevpath (``/devices/pci0000:00/0000:00:1d.1/usb2/2-2/2-2:1.0``) - identical to the DEVPATH value in the event sent from the kernel at device creation and removal - the unique key to the device at that point in time - the kernel's path to the device directory without the leading ``/sys``, and always starting with a slash - all elements of a devpath must be real directories. Symlinks pointing to /sys/devices must always be resolved to their real target and the target path must be used to access the device. That way the devpath to the device matches the devpath of the kernel used at event time. - using or exposing symlink values as elements in a devpath string is a bug in the application h](h)}(h?devpath (``/devices/pci0000:00/0000:00:1d.1/usb2/2-2/2-2:1.0``)h](h devpath (}(hjhhhNhNubjH)}(h5``/devices/pci0000:00/0000:00:1d.1/usb2/2-2/2-2:1.0``h]h1/devices/pci0000:00/0000:00:1d.1/usb2/2-2/2-2:1.0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK/hjubh)}(hhh](h)}(h_identical to the DEVPATH value in the event sent from the kernel at device creation and removalh]h)}(h_identical to the DEVPATH value in the event sent from the kernel at device creation and removalh]h_identical to the DEVPATH value in the event sent from the kernel at device creation and removal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hj ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(h2the unique key to the device at that point in timeh]h)}(hj&h]h2the unique key to the device at that point in time}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hj$ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hhthe kernel's path to the device directory without the leading ``/sys``, and always starting with a slashh]h)}(hhthe kernel's path to the device directory without the leading ``/sys``, and always starting with a slashh](h@the kernel’s path to the device directory without the leading }(hj?hhhNhNubjH)}(h``/sys``h]h/sys}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj?ubh", and always starting with a slash}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK4hj;ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hXall elements of a devpath must be real directories. Symlinks pointing to /sys/devices must always be resolved to their real target and the target path must be used to access the device. That way the devpath to the device matches the devpath of the kernel used at event time.h]h)}(hXall elements of a devpath must be real directories. Symlinks pointing to /sys/devices must always be resolved to their real target and the target path must be used to access the device. That way the devpath to the device matches the devpath of the kernel used at event time.h]hXall elements of a devpath must be real directories. Symlinks pointing to /sys/devices must always be resolved to their real target and the target path must be used to access the device. That way the devpath to the device matches the devpath of the kernel used at event time.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjeubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(h]using or exposing symlink values as elements in a devpath string is a bug in the application h]h)}(h\using or exposing symlink values as elements in a devpath string is a bug in the applicationh]h\using or exposing symlink values as elements in a devpath string is a bug in the application}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hj}ubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]bullet-uh1hhhhK1hjubeh}(h]h ]h"]h$]h&]uh1hhjubh)}(hkernel name (``sda``, ``tty``, ``0000:00:1f.2``, ...) - a directory name, identical to the last element of the devpath - applications need to handle spaces and characters like ``!`` in the name h](h)}(h5kernel name (``sda``, ``tty``, ``0000:00:1f.2``, ...)h](h kernel name (}(hjhhhNhNubjH)}(h``sda``h]hsda}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, }(hjhhhNhNubjH)}(h``tty``h]htty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, }hjsbjH)}(h``0000:00:1f.2``h]h 0000:00:1f.2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, ...)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK>hjubh)}(hhh](h)}(h>a directory name, identical to the last element of the devpathh]h)}(hjh]h>a directory name, identical to the last element of the devpath}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjubah}(h]h ]h"]h$]h&]uh1hhjubh)}(hIapplications need to handle spaces and characters like ``!`` in the name h]h)}(hHapplications need to handle spaces and characters like ``!`` in the nameh](h7applications need to handle spaces and characters like }(hj hhhNhNubjH)}(h``!``h]h!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj ubh in the name}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKAhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]jjuh1hhhhK@hjubeh}(h]h ]h"]h$]h&]uh1hhjubh)}(hsubsystem (``block``, ``tty``, ``pci``, ...) - simple string, never a path or a link - retrieved by reading the "subsystem"-link and using only the last element of the target path h](h)}(h,subsystem (``block``, ``tty``, ``pci``, ...)h](h subsystem (}(hj?hhhNhNubjH)}(h ``block``h]hblock}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj?ubh, }(hj?hhhNhNubjH)}(h``tty``h]htty}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj?ubh, }hj?sbjH)}(h``pci``h]hpci}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj?ubh, ...)}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKDhj;ubh)}(hhh](h)}(h%simple string, never a path or a linkh]h)}(hjh]h%simple string, never a path or a link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjubah}(h]h ]h"]h$]h&]uh1hhjubh)}(h]retrieved by reading the "subsystem"-link and using only the last element of the target path h]h)}(h\retrieved by reading the "subsystem"-link and using only the last element of the target pathh]h`retrieved by reading the “subsystem”-link and using only the last element of the target path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]jjuh1hhhhKFhj;ubeh}(h]h ]h"]h$]h&]uh1hhjubh)}(hXpdriver (``tg3``, ``ata_piix``, ``uhci_hcd``) - a simple string, which may contain spaces, never a path or a link - it is retrieved by reading the "driver"-link and using only the last element of the target path - devices which do not have "driver"-link just do not have a driver; copying the driver value in a child device context is a bug in the application h](h)}(h,driver (``tg3``, ``ata_piix``, ``uhci_hcd``)h](hdriver (}(hjhhhNhNubjH)}(h``tg3``h]htg3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, }(hjhhhNhNubjH)}(h ``ata_piix``h]hata_piix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, }hjsbjH)}(h ``uhci_hcd``h]huhci_hcd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKJhjubh)}(hhh](h)}(hAa simple string, which may contain spaces, never a path or a linkh]h)}(hAa simple string, which may contain spaces, never a path or a linkh]hAa simple string, which may contain spaces, never a path or a link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhj ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(h_it is retrieved by reading the "driver"-link and using only the last element of the target pathh]h)}(h_it is retrieved by reading the "driver"-link and using only the last element of the target pathh]hcit is retrieved by reading the “driver”-link and using only the last element of the target path}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhj$ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hdevices which do not have "driver"-link just do not have a driver; copying the driver value in a child device context is a bug in the application h]h)}(hdevices which do not have "driver"-link just do not have a driver; copying the driver value in a child device context is a bug in the applicationh]hdevices which do not have “driver”-link just do not have a driver; copying the driver value in a child device context is a bug in the application}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhj<ubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]jjuh1hhhhKLhjubeh}(h]h ]h"]h$]h&]uh1hhjubh)}(hattributes - the files in the device directory or files below subdirectories of the same device directory - accessing attributes reached by a symlink pointing to another device, like the "device"-link, is a bug in the application h](h)}(h attributesh]h attributes}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThj`ubh)}(hhh](h)}(h\the files in the device directory or files below subdirectories of the same device directoryh]h)}(h\the files in the device directory or files below subdirectories of the same device directoryh]h\the files in the device directory or files below subdirectories of the same device directory}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjuubah}(h]h ]h"]h$]h&]uh1hhjrubh)}(hzaccessing attributes reached by a symlink pointing to another device, like the "device"-link, is a bug in the application h]h)}(hyaccessing attributes reached by a symlink pointing to another device, like the "device"-link, is a bug in the applicationh]h}accessing attributes reached by a symlink pointing to another device, like the “device”-link, is a bug in the application}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjubah}(h]h ]h"]h$]h&]uh1hhjrubeh}(h]h ]h"]h$]h&]jjuh1hhhhKVhj`ubeh}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]jjuh1hhhhK/hjubh)}(hEverything else is just a kernel driver-core implementation detail that should not be assumed to be stable across kernel releases.h]hEverything else is just a kernel driver-core implementation detail that should not be assumed to be stable across kernel releases.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhK\hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXProperties of parent devices never belong into a child device. Always look at the parent devices themselves for determining device context properties. If the device ``eth0`` or ``sda`` does not have a "driver"-link, then this device does not have a driver. Its value is empty. Never copy any property of the parent-device into a child-device. Parent device properties may change dynamically without any notice to the child device. h]h)}(hhh]h)}(hXProperties of parent devices never belong into a child device. Always look at the parent devices themselves for determining device context properties. If the device ``eth0`` or ``sda`` does not have a "driver"-link, then this device does not have a driver. Its value is empty. Never copy any property of the parent-device into a child-device. Parent device properties may change dynamically without any notice to the child device. h](h)}(h>Properties of parent devices never belong into a child device.h]h>Properties of parent devices never belong into a child device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjubj )}(hhh]h)}(hXoAlways look at the parent devices themselves for determining device context properties. If the device ``eth0`` or ``sda`` does not have a "driver"-link, then this device does not have a driver. Its value is empty. Never copy any property of the parent-device into a child-device. Parent device properties may change dynamically without any notice to the child device.h](hfAlways look at the parent devices themselves for determining device context properties. If the device }(hjhhhNhNubjH)}(h``eth0``h]heth0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh or }(hjhhhNhNubjH)}(h``sda``h]hsda}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh does not have a “driver”-link, then this device does not have a driver. Its value is empty. Never copy any property of the parent-device into a child-device. Parent device properties may change dynamically without any notice to the child device.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK_hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhKdhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hHierarchy in a single device tree There is only one valid place in sysfs where hierarchy can be examined and this is below: ``/sys/devices.`` It is planned that all device directories will end up in the tree below this directory. h]h)}(hhh]h)}(hHierarchy in a single device tree There is only one valid place in sysfs where hierarchy can be examined and this is below: ``/sys/devices.`` It is planned that all device directories will end up in the tree below this directory. h](h)}(h!Hierarchy in a single device treeh]h!Hierarchy in a single device tree}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhjJubj )}(hhh]h)}(hThere is only one valid place in sysfs where hierarchy can be examined and this is below: ``/sys/devices.`` It is planned that all device directories will end up in the tree below this directory.h](hZThere is only one valid place in sysfs where hierarchy can be examined and this is below: }(hj_hhhNhNubjH)}(h``/sys/devices.``h]h /sys/devices.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj_ubhX It is planned that all device directories will end up in the tree below this directory.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKghj\ubah}(h]h ]h"]h$]h&]uh1j hjJubeh}(h]h ]h"]h$]h&]uh1hhhhKjhjGubah}(h]h ]h"]h$]h&]uh1hhjCubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXClassification by subsystem There are currently three places for classification of devices: ``/sys/block,`` ``/sys/class`` and ``/sys/bus.`` It is planned that these will not contain any device directories themselves, but only flat lists of symlinks pointing to the unified ``/sys/devices`` tree. All three places have completely different rules on how to access device information. It is planned to merge all three classification directories into one place at ``/sys/subsystem``, following the layout of the bus directories. All buses and classes, including the converted block subsystem, will show up there. The devices belonging to a subsystem will create a symlink in the "devices" directory at ``/sys/subsystem//devices``, If ``/sys/subsystem`` exists, ``/sys/bus``, ``/sys/class`` and ``/sys/block`` can be ignored. If it does not exist, you always have to scan all three places, as the kernel is free to move a subsystem from one place to the other, as long as the devices are still reachable by the same subsystem name. Assuming ``/sys/class/`` and ``/sys/bus/``, or ``/sys/block`` and ``/sys/class/block`` are not interchangeable is a bug in the application. h]h)}(hhh]h)}(hXClassification by subsystem There are currently three places for classification of devices: ``/sys/block,`` ``/sys/class`` and ``/sys/bus.`` It is planned that these will not contain any device directories themselves, but only flat lists of symlinks pointing to the unified ``/sys/devices`` tree. All three places have completely different rules on how to access device information. It is planned to merge all three classification directories into one place at ``/sys/subsystem``, following the layout of the bus directories. All buses and classes, including the converted block subsystem, will show up there. The devices belonging to a subsystem will create a symlink in the "devices" directory at ``/sys/subsystem//devices``, If ``/sys/subsystem`` exists, ``/sys/bus``, ``/sys/class`` and ``/sys/block`` can be ignored. If it does not exist, you always have to scan all three places, as the kernel is free to move a subsystem from one place to the other, as long as the devices are still reachable by the same subsystem name. Assuming ``/sys/class/`` and ``/sys/bus/``, or ``/sys/block`` and ``/sys/class/block`` are not interchangeable is a bug in the application. h](h)}(hClassification by subsystemh]hClassification by subsystem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj )}(hhh](h)}(hXThere are currently three places for classification of devices: ``/sys/block,`` ``/sys/class`` and ``/sys/bus.`` It is planned that these will not contain any device directories themselves, but only flat lists of symlinks pointing to the unified ``/sys/devices`` tree. All three places have completely different rules on how to access device information. It is planned to merge all three classification directories into one place at ``/sys/subsystem``, following the layout of the bus directories. All buses and classes, including the converted block subsystem, will show up there. The devices belonging to a subsystem will create a symlink in the "devices" directory at ``/sys/subsystem//devices``,h](h@There are currently three places for classification of devices: }(hjhhhNhNubjH)}(h``/sys/block,``h]h /sys/block,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh }(hjhhhNhNubjH)}(h``/sys/class``h]h /sys/class}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh and }(hjhhhNhNubjH)}(h ``/sys/bus.``h]h /sys/bus.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh It is planned that these will not contain any device directories themselves, but only flat lists of symlinks pointing to the unified }(hjhhhNhNubjH)}(h``/sys/devices``h]h /sys/devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh tree. All three places have completely different rules on how to access device information. It is planned to merge all three classification directories into one place at }(hjhhhNhNubjH)}(h``/sys/subsystem``h]h/sys/subsystem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, following the layout of the bus directories. All buses and classes, including the converted block subsystem, will show up there. The devices belonging to a subsystem will create a symlink in the “devices” directory at }(hjhhhNhNubjH)}(h!``/sys/subsystem//devices``h]h/sys/subsystem//devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh,}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKmhjubh)}(hX+If ``/sys/subsystem`` exists, ``/sys/bus``, ``/sys/class`` and ``/sys/block`` can be ignored. If it does not exist, you always have to scan all three places, as the kernel is free to move a subsystem from one place to the other, as long as the devices are still reachable by the same subsystem name.h](hIf }(hj-hhhNhNubjH)}(h``/sys/subsystem``h]h/sys/subsystem}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj-ubh exists, }(hj-hhhNhNubjH)}(h ``/sys/bus``h]h/sys/bus}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj-ubh, }(hj-hhhNhNubjH)}(h``/sys/class``h]h /sys/class}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj-ubh and }(hj-hhhNhNubjH)}(h``/sys/block``h]h /sys/block}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj-ubh can be ignored. If it does not exist, you always have to scan all three places, as the kernel is free to move a subsystem from one place to the other, as long as the devices are still reachable by the same subsystem name.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKzhjubh)}(hAssuming ``/sys/class/`` and ``/sys/bus/``, or ``/sys/block`` and ``/sys/class/block`` are not interchangeable is a bug in the application.h](h Assuming }(hjhhhNhNubjH)}(h``/sys/class/``h]h/sys/class/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh and }(hjhhhNhNubjH)}(h``/sys/bus/``h]h/sys/bus/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh, or }(hjhhhNhNubjH)}(h``/sys/block``h]h /sys/block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh and }hjsbjH)}(h``/sys/class/block``h]h/sys/class/block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh5 are not interchangeable is a bug in the application.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hX;Block The converted block subsystem at ``/sys/class/block`` or ``/sys/subsystem/block`` will contain the links for disks and partitions at the same level, never in a hierarchy. Assuming the block subsystem to contain only disks and not partition devices in the same flat list is a bug in the application. h]h)}(hhh]h)}(hX1Block The converted block subsystem at ``/sys/class/block`` or ``/sys/subsystem/block`` will contain the links for disks and partitions at the same level, never in a hierarchy. Assuming the block subsystem to contain only disks and not partition devices in the same flat list is a bug in the application. h](h)}(hBlockh]hBlock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj )}(hhh]h)}(hX*The converted block subsystem at ``/sys/class/block`` or ``/sys/subsystem/block`` will contain the links for disks and partitions at the same level, never in a hierarchy. Assuming the block subsystem to contain only disks and not partition devices in the same flat list is a bug in the application.h](h!The converted block subsystem at }(hj hhhNhNubjH)}(h``/sys/class/block``h]h/sys/class/block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj ubh or }(hj hhhNhNubjH)}(h``/sys/subsystem/block``h]h/sys/subsystem/block}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj ubh will contain the links for disks and partitions at the same level, never in a hierarchy. Assuming the block subsystem to contain only disks and not partition devices in the same flat list is a bug in the application.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXY"device"-link and :-links Never depend on the "device"-link. The "device"-link is a workaround for the old layout, where class devices are not created in ``/sys/devices/`` like the bus devices. If the link-resolving of a device directory does not end in ``/sys/devices/``, you can use the "device"-link to find the parent devices in ``/sys/devices/``, That is the single valid use of the "device"-link; it must never appear in any path as an element. Assuming the existence of the "device"-link for a device in ``/sys/devices/`` is a bug in the application. Accessing ``/sys/class/net/eth0/device`` is a bug in the application. Never depend on the class-specific links back to the ``/sys/class`` directory. These links are also a workaround for the design mistake that class devices are not created in ``/sys/devices.`` If a device directory does not contain directories for child devices, these links may be used to find the child devices in ``/sys/class.`` That is the single valid use of these links; they must never appear in any path as an element. Assuming the existence of these links for devices which are real child device directories in the ``/sys/devices`` tree is a bug in the application. It is planned to remove all these links when all class device directories live in ``/sys/devices.`` h]h)}(hhh]h)}(hX1"device"-link and :-links Never depend on the "device"-link. The "device"-link is a workaround for the old layout, where class devices are not created in ``/sys/devices/`` like the bus devices. If the link-resolving of a device directory does not end in ``/sys/devices/``, you can use the "device"-link to find the parent devices in ``/sys/devices/``, That is the single valid use of the "device"-link; it must never appear in any path as an element. Assuming the existence of the "device"-link for a device in ``/sys/devices/`` is a bug in the application. Accessing ``/sys/class/net/eth0/device`` is a bug in the application. Never depend on the class-specific links back to the ``/sys/class`` directory. These links are also a workaround for the design mistake that class devices are not created in ``/sys/devices.`` If a device directory does not contain directories for child devices, these links may be used to find the child devices in ``/sys/class.`` That is the single valid use of these links; they must never appear in any path as an element. Assuming the existence of these links for devices which are real child device directories in the ``/sys/devices`` tree is a bug in the application. It is planned to remove all these links when all class device directories live in ``/sys/devices.`` h](h)}(h1"device"-link and :-linksh]h5“device”-link and :-links}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj^ubj )}(hhh](h)}(hXYNever depend on the "device"-link. The "device"-link is a workaround for the old layout, where class devices are not created in ``/sys/devices/`` like the bus devices. If the link-resolving of a device directory does not end in ``/sys/devices/``, you can use the "device"-link to find the parent devices in ``/sys/devices/``, That is the single valid use of the "device"-link; it must never appear in any path as an element. Assuming the existence of the "device"-link for a device in ``/sys/devices/`` is a bug in the application. Accessing ``/sys/class/net/eth0/device`` is a bug in the application.h](hNever depend on the “device”-link. The “device”-link is a workaround for the old layout, where class devices are not created in }(hjshhhNhNubjH)}(h``/sys/devices/``h]h /sys/devices/}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjsubhS like the bus devices. If the link-resolving of a device directory does not end in }(hjshhhNhNubjH)}(h``/sys/devices/``h]h /sys/devices/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjsubhB, you can use the “device”-link to find the parent devices in }(hjshhhNhNubjH)}(h``/sys/devices/``h]h /sys/devices/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjsubh, That is the single valid use of the “device”-link; it must never appear in any path as an element. Assuming the existence of the “device”-link for a device in }(hjshhhNhNubjH)}(h``/sys/devices/``h]h /sys/devices/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjsubh( is a bug in the application. Accessing }(hjshhhNhNubjH)}(h``/sys/class/net/eth0/device``h]h/sys/class/net/eth0/device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjsubh is a bug in the application.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjpubh)}(hX>Never depend on the class-specific links back to the ``/sys/class`` directory. These links are also a workaround for the design mistake that class devices are not created in ``/sys/devices.`` If a device directory does not contain directories for child devices, these links may be used to find the child devices in ``/sys/class.`` That is the single valid use of these links; they must never appear in any path as an element. Assuming the existence of these links for devices which are real child device directories in the ``/sys/devices`` tree is a bug in the application.h](h5Never depend on the class-specific links back to the }(hjhhhNhNubjH)}(h``/sys/class``h]h /sys/class}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubhl directory. These links are also a workaround for the design mistake that class devices are not created in }(hjhhhNhNubjH)}(h``/sys/devices.``h]h /sys/devices.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh| If a device directory does not contain directories for child devices, these links may be used to find the child devices in }(hjhhhNhNubjH)}(h``/sys/class.``h]h /sys/class.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh That is the single valid use of these links; they must never appear in any path as an element. Assuming the existence of these links for devices which are real child device directories in the }(hjhhhNhNubjH)}(h``/sys/devices``h]h /sys/devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh" tree is a bug in the application.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjpubh)}(hcIt is planned to remove all these links when all class device directories live in ``/sys/devices.``h](hRIt is planned to remove all these links when all class device directories live in }(hj1hhhNhNubjH)}(h``/sys/devices.``h]h /sys/devices.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj1ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjpubeh}(h]h ]h"]h$]h&]uh1j hj^ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj[ubah}(h]h ]h"]h$]h&]uh1hhjWubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hX$Position of devices along device chain can change. Never depend on a specific parent device position in the devpath, or the chain of parent devices. The kernel is free to insert devices into the chain. You must always request the parent device you are looking for by its subsystem value. You need to walk up the chain until you find the device that matches the expected subsystem. Depending on a specific position of a parent device or exposing relative paths using ``../`` to access the chain of parents is a bug in the application. h]h)}(hhh]h)}(hXPosition of devices along device chain can change. Never depend on a specific parent device position in the devpath, or the chain of parent devices. The kernel is free to insert devices into the chain. You must always request the parent device you are looking for by its subsystem value. You need to walk up the chain until you find the device that matches the expected subsystem. Depending on a specific position of a parent device or exposing relative paths using ``../`` to access the chain of parents is a bug in the application. h](h)}(h2Position of devices along device chain can change.h]h2Position of devices along device chain can change.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlubj )}(hhh]h)}(hXNever depend on a specific parent device position in the devpath, or the chain of parent devices. The kernel is free to insert devices into the chain. You must always request the parent device you are looking for by its subsystem value. You need to walk up the chain until you find the device that matches the expected subsystem. Depending on a specific position of a parent device or exposing relative paths using ``../`` to access the chain of parents is a bug in the application.h](hXNever depend on a specific parent device position in the devpath, or the chain of parent devices. The kernel is free to insert devices into the chain. You must always request the parent device you are looking for by its subsystem value. You need to walk up the chain until you find the device that matches the expected subsystem. Depending on a specific position of a parent device or exposing relative paths using }(hjhhhNhNubjH)}(h``../``h]h../}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh< to access the chain of parents is a bug in the application.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj~ubah}(h]h ]h"]h$]h&]uh1j hjlubeh}(h]h ]h"]h$]h&]uh1hhhhKhjiubah}(h]h ]h"]h$]h&]uh1hhjeubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXWhen reading and writing sysfs device attribute files, avoid dependency on specific error codes wherever possible. This minimizes coupling to the error handling implementation within the kernel. In general, failures to read or write sysfs device attributes shall propagate errors wherever possible. Common errors include, but are not limited to: ``-EIO``: The read or store operation is not supported, typically returned by the sysfs system itself if the read or store pointer is ``NULL``. ``-ENXIO``: The read or store operation failed Error codes will not be changed without good reason, and should a change to error codes result in user-space breakage, it will be fixed, or the the offending change will be reverted. Userspace applications can, however, expect the format and contents of the attribute files to remain consistent in the absence of a version attribute change in the context of a given attribute.h]h)}(hhh]h)}(hXWhen reading and writing sysfs device attribute files, avoid dependency on specific error codes wherever possible. This minimizes coupling to the error handling implementation within the kernel. In general, failures to read or write sysfs device attributes shall propagate errors wherever possible. Common errors include, but are not limited to: ``-EIO``: The read or store operation is not supported, typically returned by the sysfs system itself if the read or store pointer is ``NULL``. ``-ENXIO``: The read or store operation failed Error codes will not be changed without good reason, and should a change to error codes result in user-space breakage, it will be fixed, or the the offending change will be reverted. Userspace applications can, however, expect the format and contents of the attribute files to remain consistent in the absence of a version attribute change in the context of a given attribute.h](h)}(hGWhen reading and writing sysfs device attribute files, avoid dependencyh]hGWhen reading and writing sysfs device attribute files, avoid dependency}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj )}(hhh](h)}(hzon specific error codes wherever possible. This minimizes coupling to the error handling implementation within the kernel.h]hzon specific error codes wherever possible. This minimizes coupling to the error handling implementation within the kernel.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hIn general, failures to read or write sysfs device attributes shall propagate errors wherever possible. Common errors include, but are not limited to:h]hIn general, failures to read or write sysfs device attributes shall propagate errors wherever possible. Common errors include, but are not limited to:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh block_quote)}(h``-EIO``: The read or store operation is not supported, typically returned by the sysfs system itself if the read or store pointer is ``NULL``. ``-ENXIO``: The read or store operation failed h](h)}(h``-EIO``: The read or store operation is not supported, typically returned by the sysfs system itself if the read or store pointer is ``NULL``.h](jH)}(h``-EIO``h]h-EIO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh~: The read or store operation is not supported, typically returned by the sysfs system itself if the read or store pointer is }(hjhhhNhNubjH)}(h``NULL``h]hNULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jGhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h.``-ENXIO``: The read or store operation failedh](jH)}(h ``-ENXIO``h]h-ENXIO}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1jGhj% ubh$: The read or store operation failed}(hj% hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubh)}(hError codes will not be changed without good reason, and should a change to error codes result in user-space breakage, it will be fixed, or the the offending change will be reverted.h]hError codes will not be changed without good reason, and should a change to error codes result in user-space breakage, it will be fixed, or the the offending change will be reverted.}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hUserspace applications can, however, expect the format and contents of the attribute files to remain consistent in the absence of a version attribute change in the context of a given attribute.h]hUserspace applications can, however, expect the format and contents of the attribute files to remain consistent in the absence of a version attribute change in the context of a given attribute.}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubeh}(h]h ]h"]h$]h&]jjuh1hhhhKhhhhubeh}(h]+rules-on-how-to-access-information-in-sysfsah ]h"]+rules on how to access information in sysfsah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}j j s nametypes}j sh}j hs footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.