diff options
Diffstat (limited to 'src/readahead/readahead-replay.c')
-rw-r--r-- | src/readahead/readahead-replay.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/readahead/readahead-replay.c b/src/readahead/readahead-replay.c index a6529f8bac..886e16f296 100644 --- a/src/readahead/readahead-replay.c +++ b/src/readahead/readahead-replay.c @@ -53,6 +53,7 @@ static int unpack_file(FILE *pack) { int r = 0, fd = -1; bool any = false; struct stat st; + uint64_t inode; assert(pack); @@ -62,7 +63,8 @@ static int unpack_file(FILE *pack) { char_array_0(fn); truncate_nl(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 && errno != EPERM && errno != EACCES) log_warning("open(%s) failed: %m", fn); @@ -72,6 +74,21 @@ static int unpack_file(FILE *pack) { fd = -1; } + if (fread(&inode, sizeof(inode), 1, pack) != 1) { + log_error("Premature end of pack file."); + r = -EIO; + goto finish; + } + + if (fd >= 0) { + /* If the inode changed the file got deleted, so just + * ignore this entry */ + if (st.st_ino != (uint64_t) inode) { + close_nointr_nofail(fd); + fd = -1; + } + } + for (;;) { uint32_t b, c; @@ -166,8 +183,8 @@ static int replay(const char *root) { char_array_0(line); - if (!streq(line, CANONICAL_HOST "\n")) { - log_debug("Pack file host type mismatch."); + if (!streq(line, CANONICAL_HOST ";VERSION=2\n")) { + log_debug("Pack file host or version type mismatch."); goto finish; } |