chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
readahead: Add tool to analyze the contents of the pack file. v3.
[elogind.git]
/
src
/
readahead
/
readahead-collect.c
diff --git
a/src/readahead/readahead-collect.c
b/src/readahead/readahead-collect.c
index 70e0f66eda2b51d5a523796536fcadd34ebfc19e..c4bcd4e16250e433d6cbbc0960b0b32b7fba4a8a 100644
(file)
--- a/
src/readahead/readahead-collect.c
+++ b/
src/readahead/readahead-collect.c
@@
-86,6
+86,7
@@
static int pack_file(FILE *pack, const char *fn, bool on_btrfs) {
void *start = MAP_FAILED;
uint8_t *vec;
uint32_t b, c;
void *start = MAP_FAILED;
uint8_t *vec;
uint32_t b, c;
+ uint64_t inode;
size_t l, pages;
bool mapped;
int r = 0, fd = -1, k;
size_t l, pages;
bool mapped;
int r = 0, fd = -1, k;
@@
-93,7
+94,8
@@
static int pack_file(FILE *pack, const char *fn, bool on_btrfs) {
assert(pack);
assert(fn);
assert(pack);
assert(fn);
- if ((fd = open(fn, O_RDONLY|O_CLOEXEC|O_NOATIME|O_NOCTTY|O_NOFOLLOW)) < 0) {
+ fd = open(fn, O_RDONLY|O_CLOEXEC|O_NOATIME|O_NOCTTY|O_NOFOLLOW);
+ if (fd < 0) {
if (errno == ENOENT)
return 0;
if (errno == ENOENT)
return 0;
@@
-106,7
+108,8
@@
static int pack_file(FILE *pack, const char *fn, bool on_btrfs) {
goto finish;
}
goto finish;
}
- if ((k = file_verify(fd, fn, arg_file_size_max, &st)) <= 0) {
+ k = file_verify(fd, fn, arg_file_size_max, &st);
+ if (k <= 0) {
r = k;
goto finish;
}
r = k;
goto finish;
}
@@
-115,14
+118,14
@@
static int pack_file(FILE *pack, const char *fn, bool on_btrfs) {
btrfs_defrag(fd);
l = PAGE_ALIGN(st.st_size);
btrfs_defrag(fd);
l = PAGE_ALIGN(st.st_size);
- if ((start = mmap(NULL, l, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
+ start = mmap(NULL, l, PROT_READ, MAP_SHARED, fd, 0);
+ if (start == MAP_FAILED) {
log_warning("mmap(%s) failed: %m", fn);
r = -errno;
goto finish;
}
pages = l / page_size();
log_warning("mmap(%s) failed: %m", fn);
r = -errno;
goto finish;
}
pages = l / page_size();
-
vec = alloca(pages);
memset(vec, 0, pages);
if (mincore(start, l, vec) < 0) {
vec = alloca(pages);
memset(vec, 0, pages);
if (mincore(start, l, vec) < 0) {
@@
-134,6
+137,10
@@
static int pack_file(FILE *pack, const char *fn, bool on_btrfs) {
fputs(fn, pack);
fputc('\n', pack);
fputs(fn, pack);
fputc('\n', pack);
+ /* Store the inode, so that we notice when the file is deleted */
+ inode = (uint64_t) st.st_ino;
+ fwrite(&inode, sizeof(inode), 1, pack);
+
mapped = false;
for (c = 0; c < pages; c++) {
bool new_mapped = !!(vec[c] & 1);
mapped = false;
for (c = 0; c < pages; c++) {
bool new_mapped = !!(vec[c] & 1);
@@
-253,8
+260,6
@@
static int collect(const char *root) {
block_get_readahead(root, &previous_block_readahead) >= 0 &&
block_set_readahead(root, 8*1024) >= 0;
block_get_readahead(root, &previous_block_readahead) >= 0 &&
block_set_readahead(root, 8*1024) >= 0;
- write_one_line_file("/proc/self/oom_score_adj", "1000");
-
if (ioprio_set(IOPRIO_WHO_PROCESS, getpid(), IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)) < 0)
log_warning("Failed to set IDLE IO priority class: %m");
if (ioprio_set(IOPRIO_WHO_PROCESS, getpid(), IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)) < 0)
log_warning("Failed to set IDLE IO priority class: %m");
@@
-481,13
+486,14
@@
done:
goto finish;
}
goto finish;
}
- if (!(pack = fopen(pack_fn_new, "we"))) {
+ pack = fopen(pack_fn_new, "we");
+ if (!pack) {
log_error("Failed to open pack file: %m");
r = -errno;
goto finish;
}
log_error("Failed to open pack file: %m");
r = -errno;
goto finish;
}
- fputs(CANONICAL_HOST
"\n"
, pack);
+ fputs(CANONICAL_HOST
READAHEAD_PACK_FILE_VERSION
, pack);
putc(on_ssd ? 'S' : 'R', pack);
if (on_ssd || on_btrfs) {
putc(on_ssd ? 'S' : 'R', pack);
if (on_ssd || on_btrfs) {
@@
-677,7
+683,7
@@
int main(int argc, char *argv[]) {
int r;
const char *root;
int r;
const char *root;
- log_set_target(LOG_TARGET_
AUTO
);
+ log_set_target(LOG_TARGET_
SAFE
);
log_parse_environment();
log_open();
log_parse_environment();
log_open();