Checkout
kotkov
committed
on 12 Apr
Reimplement fsfs private operations required by `svnfsfs` (stats, dump index,
load index) as "ioctls".

Technically we achieve this by intro… Show more
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.

Show less