blob: f5dc922533982d6a4e4d73b15fb12eeeefd4297b [file] [log] [blame]
commit b52cd719699b9a62bd104cfff6dded98be06cf85
Author: pliard <pliard@google.com>
Date: Wed Jul 24 10:55:05 2019 +0900
Add pack-file and path-prefix-filter options
This change adds two command line options allowing multiple instances of
ureadahead to be more isolated:
* --pack-file: Overrides the path to the pack file instead of
determining it from the underlying device which an unrelated pack file
might already exist for. This overridden path gets used for tracing,
dumping the pack file as well as reading ahead.
* --path-prefix-filter: Prefix that the paths read from the debugfs
trace file have to start with for them to be retained in the pack file.
These new options will be used by the upstart job starting ureadahead
when the login screen appears in order to preload ARCVM files.
BUG=b:137810150
TEST=/var/lib/ureadahead/opt.google.vms.android.pack gets created with \
these options and only contains entries under \
/opt/google/vms/android \
TEST=/var/lib/ureadahead/pack gets recreated correctly on boot if \
deleted
diff --git a/src/trace.c b/src/trace.c
index 9f0ec09..0e34d70 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -90,6 +90,7 @@
/* Prototypes for static functions */
static int read_trace (const void *parent,
int dfd, const char *path,
+ const char *path_prefix_filter,
const PathPrefixOption *path_prefix,
PackFile **files, size_t *num_files);
static void fix_path (char *pathname);
@@ -119,6 +120,8 @@ int
trace (int daemonise,
int timeout,
const char *filename_to_replace,
+ const char *pack_file,
+ const char *path_prefix_filter,
const PathPrefixOption *path_prefix)
{
int dfd;
@@ -253,7 +256,8 @@ trace (int daemonise,
;
/* Read trace log */
- if (read_trace (NULL, dfd, "trace", path_prefix, &files, &num_files) < 0)
+ if (read_trace (NULL, dfd, "trace", path_prefix_filter, path_prefix,
+ &files, &num_files) < 0)
goto error;
/*
@@ -277,27 +281,30 @@ trace (int daemonise,
/* Write out pack files */
for (size_t i = 0; i < num_files; i++) {
nih_local char *filename = NULL;
+ if (pack_file) {
+ filename = NIH_MUST (nih_strdup (NULL, pack_file));
+ } else {
+ filename = pack_file_name_for_device (NULL,
+ files[i].dev);
+ if (! filename) {
+ NihError *err;
- filename = pack_file_name_for_device (NULL, files[i].dev);
- if (! filename) {
- NihError *err;
-
- err = nih_error_get ();
- nih_warn ("%s", err->message);
- nih_free (err);
+ err = nih_error_get ();
+ nih_warn ("%s", err->message);
+ nih_free (err);
- continue;
- }
+ continue;
+ }
- /* If filename_to_replace is not NULL, only write out the
- * file and skip others.
- */
- if (filename_to_replace &&
- strcmp (filename_to_replace, filename)) {
- nih_info ("Skipping %s", filename);
- continue;
+ /* If filename_to_replace is not NULL, only write out
+ * the file and skip others.
+ */
+ if (filename_to_replace &&
+ strcmp (filename_to_replace, filename)) {
+ nih_info ("Skipping %s", filename);
+ continue;
+ }
}
-
nih_info ("Writing %s", filename);
/* We only need to apply additional sorting to the
@@ -334,6 +341,7 @@ static int
read_trace (const void *parent,
int dfd,
const char *path,
+ const char *path_prefix_filter, /* May be null */
const PathPrefixOption *path_prefix,
PackFile ** files,
size_t * num_files)
@@ -389,6 +397,14 @@ read_trace (const void *parent,
*end = '\0';
fix_path (ptr);
+
+ if (path_prefix_filter &&
+ strncmp (ptr, path_prefix_filter,
+ strlen (path_prefix_filter))) {
+ nih_warn ("Skipping %s due to path prefix filter", ptr);
+ continue;
+ }
+
if (path_prefix->st_dev != NODEV && ptr[0] == '/') {
struct stat stbuf;
char *rewritten = nih_sprintf (
diff --git a/src/trace.h b/src/trace.h
index 986b10c..16af782 100644
--- a/src/trace.h
+++ b/src/trace.h
@@ -35,6 +35,8 @@ typedef struct path_prefix_option {
int trace (int daemonise, int timeout,
const char *filename_to_replace,
+ const char *pack_file, /* May be null */
+ const char *path_prefix_filter, /* May be null */
const PathPrefixOption *path_prefix);
NIH_END_EXTERN
diff --git a/src/ureadahead.c b/src/ureadahead.c
index 0e91693..066bfff 100644
--- a/src/ureadahead.c
+++ b/src/ureadahead.c
@@ -95,6 +95,21 @@ static SortOption sort_pack = SORT_OPEN;
**/
static PathPrefixOption path_prefix = { NODEV };
+/**
+ * pack_file:
+ *
+ * Path to the pack file to use.
+ */
+static char *pack_file = NULL;
+
+/**
+ * path_prefix_filter:
+ *
+ * Path prefix that files read during tracing have to start with to be included
+ * in the pack file.
+ */
+static char *path_prefix_filter = NULL;
+
static int
path_prefix_option (NihOption *option,
const char *arg)
@@ -129,6 +144,19 @@ error:
return -1;
}
+static int
+dup_string_handler (NihOption *option,
+ const char *arg)
+{
+ nih_assert (option != NULL);
+ nih_assert (option->value != NULL);
+ nih_assert (arg != NULL);
+
+ char **value = (char **)option->value;
+ *value = NIH_MUST (nih_strdup (NULL, arg));
+ return 0;
+}
+
static int
sort_option (NihOption *option,
const char *arg)
@@ -178,6 +206,11 @@ static NihOption options[] = {
NULL, "SORT", &sort_pack, sort_option },
{ 0, "path-prefix", N_("pathname to prepend for files on the device"),
NULL, "PREFIX", &path_prefix, path_prefix_option },
+ { 0, "path-prefix-filter",
+ N_("Path prefix that retained files during tracing must start with"),
+ NULL, "PREFIX_FILTER", &path_prefix_filter, dup_string_handler },
+ { 0, "pack-file", N_("Path of the pack file to use"),
+ NULL, "PACK_FILE", &pack_file, dup_string_handler },
NIH_OPTION_LAST
};
@@ -212,7 +245,9 @@ main (int argc,
/* Lookup the filename for the pack based on the path given
* (if any).
*/
- filename = pack_file_name (NULL, args[0]);
+ filename = pack_file
+ ? NIH_MUST (nih_strdup (NULL, pack_file))
+ : pack_file_name (NULL, args[0]);
if (! force_trace) {
NihError *err;
@@ -265,7 +300,8 @@ main (int argc,
}
/* Trace to generate new pack files */
- if (trace (daemonise, timeout, filename, &path_prefix) < 0) {
+ if (trace (daemonise, timeout, filename, pack_file,
+ path_prefix_filter, &path_prefix) < 0) {
NihError *err;
err = nih_error_get ();