doc: filesystem hierarchy

This commit is contained in:
CismonX 2025-01-01 23:57:16 +08:00
parent cdf0ddfc53
commit 0863343749
No known key found for this signature in database
GPG key ID: 3094873E29A482FB

View file

@ -173,6 +173,83 @@ which means patches are generally rejected unless trivial (e.g. typo fix).
@node Hierarchy
@section Filesystem Hierarchy
BookmarkFS has multiple subsystems. Each one appears as a directory under
the mountpoint:
@example
$@{mountpoint@}/bookmarks
$@{mountpoint@}/tags
$@{mountpoint@}/keywords
@end example
If the backend does not support a subsystem, the corresponding directory
does not exist.
Currently all subsystem definitions are hard-coded within the
@code{mount.bookmarkfs} program, and cannot be extended by the backend.
@node Bookmarks
@subsection Bookmarks
@example
$@{mountpoint@}/bookmarks/$@{bookmark_dir...@}/$@{bookmark_name@}
@end example
@node Tags
@subsection Tags
@example
$@{mountpoint@}/tags/$@{tag_name@}/$@{bookmark_name@}
@end example
The ``tags'' subsystem maintains a many-to-many mapping between bookmarks and
their alternative names. Each tag name appears as the filename for directory
@code{$@{tag_name@}}, and @code{$@{bookmark_name@}} is a hard link to the
bookmark file. A bookmark directory cannot be associated with a tag.
If multiple bookmark files with identical names are both associated with a tag,
it is unspecified which one appears as an entry for the tag directory.
However, consecutive lookups and @code{readdir()}s should produce consistent
results for that file, provided that it is not renamed or deleted.
Tag files behave differently from traditional hard links. If the original
bookmark file is renamed or deleted, it may also change accordingly.
It may even link to another file that was previously shadowed. Applications
should tread lightly if they wish to cache tag directory entries.
To associate a bookmark with a tag, use @posixfuncmanpage{link}:
@example
fd = openat(dirfd, "tags/gnu/readline", O_CREAT | O_WRONLY, 0600);
// Oops, fd == -1, errno == EPERM
fd = linkat(dirfd, "bookmarks/other/readline", dirfd, "tags/gnu/readline", 0);
// OK!
@end example
Make sure that the two files have identical names, otherwise @code{link()}
fails with @code{EPERM}.
@node Keywords
@subsection Keywords
@example
$@{mountpoint@}/keywords/$@{keyword_name@}
@end example
The ``keywords'' subsystem maintains a one-to-one mapping between bookmarks
and their alternative names, independent from tag names.
Each keyword name appears as the filename for regular file
@code{$@{keyword_name@}}, which is a hard link to the bookmark file.
A bookmark directory cannot be associated with a keyword.
To associate a bookmark with a keyword, use @code{link()},
like we do with tags. If the original file is already associated with
another keyword, the operation fails with @code{EEXIST}.
@node Extended Attributes
@section Extended Attributes