summaryrefslogtreecommitdiff
path: root/ioreplay/src/mounts.h
diff options
context:
space:
mode:
authorPaul Bütow <pbuetow@mimecast.com>2018-03-01 11:21:26 +0000
committerPaul Bütow <pbuetow@mimecast.com>2018-03-01 11:21:26 +0000
commit56f8cdff9aaa9bf00c5dc9441a7569374f2cbafb (patch)
treeb5b440b504b9879e241733fa38d19089fb3377b2 /ioreplay/src/mounts.h
initial commit0.1
Diffstat (limited to 'ioreplay/src/mounts.h')
-rw-r--r--ioreplay/src/mounts.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/ioreplay/src/mounts.h b/ioreplay/src/mounts.h
new file mode 100644
index 0000000..a644ddb
--- /dev/null
+++ b/ioreplay/src/mounts.h
@@ -0,0 +1,154 @@
+// Copyright 2018 Mimecast Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef MOUNTPOINTS_H
+#define MOUNTPOINTS_H
+
+#include "datas/stack.h"
+#include "defaults.h"
+#include "options.h"
+
+#define MAX_MOUNTPOINTS 1024
+
+/**
+ * @brief Represents data parsed from /proc/mounts
+ *
+ * This is used to determine the file systems and the file system types
+ * currently mounted on the Linux system. I/O replay only replays I/O
+ * on specific file systems such as ext4 or xfs and will ignore any special
+ * or pseudo file systems such as tmpfs, devfs, sysfs. It does not make sense
+ * to replay I/O on these because there is actually no underlying block device
+ * attached to these.
+ *
+ * A mounts object helps to determine whether a path relies on a valid file
+ * system or not. All I/O operations on invalid file systems are being filtered
+ * out!
+ *
+ * The mounts object also does more things such as purging temp test data from
+ * the mountpoints etc...
+ */
+typedef struct mounts_s_ {
+ int count; /**< The amount of mount points */
+ char *mps[MAX_MOUNTPOINTS]; /**< The mp paths */
+ int lengths[MAX_MOUNTPOINTS]; /**< The mp lenghts */
+ int ignore_count; /**< The amount of ignored mount points */
+ char *ignore_mps[MAX_MOUNTPOINTS]; /**< The ignored mp paths */
+ options_s *opts; /**< A pointer to the options object */
+} mounts_s;
+
+/**
+ * @brief Creates a new mounts object
+ *
+ * @param opts The options object
+ * @return The new mounts object
+ */
+mounts_s *mounts_new(options_s *opts);
+
+/**
+ * @brief Destroys the mounts object
+ *
+ * @param m The mounts object
+ */
+void mounts_destroy(mounts_s *m);
+
+/**
+ * @brief moves all files within replay mounts to trash
+ *
+ * It moves all files of the .ioreplay/NAME directories to
+ * .ioreplay/NAME.trashEPOCH directories for all available mount points.
+ * It does the same for the working dorectory of the current test.
+ *
+ * @param m The responsible mounts object
+ */
+void mounts_trash(mounts_s *m);
+
+/**
+ * @brief Deletes all files within replay mounts
+ *
+ * It deletes all files from the .ioreplay/ directories for all availabe
+ * mount points. It also deletes the working directory of all tests. The
+ * function forks one sub-process per mount point, so it is cleaning all drives
+ * in parallel.
+ *
+ * It can take a significant amount of time to actually delete all these files.
+ * That's why there is also a mounts_trash function, which will not delete the
+ * files but move them to trash folders so they can be deleted at a later
+ * point.
+ *
+ * @param m The responsible mounts object
+ */
+void mounts_purge(mounts_s *m);
+
+/**
+ * @brief Ensures all mounts have a .ioreplay/NAME directory
+ *
+ * These directories are used by ioreplay to run the I/O replay tests in.
+ * The function also ensures to have the correct user permissions for these
+ * directories.
+ *
+ * @param m The responsible mounts object
+ */
+void mounts_init(mounts_s *m);
+
+/**
+ * @brief Reads /proc/mounts to determine which mounts are available
+ *
+ * @param m The mounts object
+ */
+void mounts_read(mounts_s *m);
+
+/**
+ * @brief Determines whether a path should be ignored
+ *
+ * ioreplay replays I/O only on known mount points of known
+ * file system types. This function helps to determine whether
+ * a path is on a valid mount point or not.
+ *
+ * @param m The responsible mounts object
+ * @param path The path to check
+ * @return true if path has to be ignored
+ */
+bool mounts_ignore_path(mounts_s *m, const char *path);
+
+/**
+ * @brief Inserts ./ioreplay/NAME into a path
+ *
+ * This function inserts ./ioreplay/NAME into a given file path.
+ * The function also checks whether the path is on a supported replay
+ * path or not. E.g. we want to ignore file systems such as devfs, sysfs,
+ * procfs.. etc.
+ *
+ * @param m The responsible mountpoint object
+ * @param name The name of the test
+ * @param path The original path
+ * @param path_r The tansformed path (has to be freed if not NULL)
+ * @return False if this path is to be ignored
+ */
+bool mounts_transform_path(mounts_s *m, const char *name,
+ char *path, char **path_r);
+
+
+/**
+ * @brief Get's the mount point number of a path
+ *
+ * Used by init.c to determine which thread to use to initialise a file
+ * or directory on a given path.
+ *
+ * @param m The responsible mountpoint object
+ * @param path The file/directory path
+ * @return The mountpoint number
+ */
+int mounts_get_mountnumber(mounts_s *m, const char *path);
+
+#endif // MOUNTPOINTS_H