Log Message: |
Reimplement fsfs private operations required by `svnfsfs` (stats, dump index,
load index) as "ioctls".
Technically we achieve this by introducing the new svn_fs_ioctl() API that
adds a generic way of performing backend-specific I/O operations.
This change serves two purposes:
- It allows us to properly expose FS-specific details and invoke FS-specific
operations everywhere without necessarily promoting them into a proper
public API (the ioctl code itself may be made either public or private,
depending on the requirements).
- It solves a potential dependency/linking problem where tools like `svnfsfs`
work through the libsvn_fs's loader, but also have to load and call private
APIs from libsvn_fs_fs thus ignoring the loader. The latter part may
potentially cause issues with the global shared state, etc. With the
patch, all such operations always go through the FS loader.
* subversion/include/svn_fs.h
(svn_fs_ioctl, SVN_FS_DECLARE_IOCTL_CODE, svn_fs_ioctl_code_t): New.
* subversion/include/svn_error_codes.h
(SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE): New error code.
* subversion/include/private/svn_fs_fs_private.h
(svn_fs_fs__get_stats, svn_fs_fs__dump_index, svn_fs_fs__load_index):
These functions are now implemented as...
(SVN_FS_FS__IOCTL_GET_STATS, SVN_FS_FS__IOCTL_DUMP_INDEX,
SVN_FS_FS__IOCTL_LOAD_INDEX): ...these new ioctls, which ...
(svn_fs_fs__ioctl_get_stats_input_t, svn_fs_fs__ioctl_get_stats_output_t,
svn_fs_fs__ioctl_dump_index_input_t, svn_fs_fs__ioctl_load_index_input_t):
...use these new structures.
* subversion/libsvn_fs/fs-loader.h
(fs_library_vtable_t.ioctl, fs_vtable_t.ioctl): New vtable members.
* subversion/libsvn_fs/fs-loader.c
(svn_fs_ioctl): Implement the new API by forwarding it to an appropriate
vtable member.
* subversion/libsvn_fs_fs/fs_fs.h
(svn_fs_fs__get_stats, svn_fs_fs__dump_index, svn_fs_fs__load_index):
These functions are now declared here.
* subversion/libsvn_fs_fs/fs.c
(): Include `svn_fs_fs_private.h`.
(fs_ioctl): Implement the ioctl dispatcher for three current fsfs-specific
operations.
(fs_vtable): Initialize the `ioctl` field.
(library_vtable): Initialize the `ioctl` field to NULL.
* subversion/libsvn_fs_fs/dump-index.c,
subversion/libsvn_fs_fs/load-index.c,
subversion/libsvn_fs_fs/stats.c
(): Tweak includes.
* subversion/libsvn_fs_base/fs.c
(library_vtable, fs_vtable): Initialize the `ioctl` field to NULL.
* subversion/libsvn_fs_x/fs.c
(library_vtable, fs_vtable): Initialize the `ioctl` field to NULL.
* subversion/svnfsfs/dump-index-cmd.c
(dump_index): Invoke an appropriate svn_fs_ioctl().
* subversion/svnfsfs/load-index-cmd.c
(load_index): Invoke an appropriate svn_fs_ioctl().
* subversion/svnfsfs/stats-cmd.c
(subcommand__stats): Invoke an appropriate svn_fs_ioctl().
* subversion/tests/libsvn_fs/fs-test.c
(test_unrecognized_ioctl): New test.
(test_funcs): Run the new test.
* subversion/tests/libsvn_fs_fs/fs-fs-private-test.c
(get_repo_stats, dump_index, load_index): Switch to svn_fs_ioctl().
* build.conf
(svnfsfs, fs-fs-private-test): Don't link to libsvn_fs_fs.
|