logcatd: unset pinning log files

commit 5327d931ac ("logcatd: fallocate and fadvise to logcat files")
introduced pinning log files in order to avoid f2fs fragmentation.

But, logcatd does not guarantee to write data within fallocated 2MB space.
So, we can see some bytes written beyond 2MB boundary which results in
pinning small chunks across the filesystem. This makes F2FS GC have to unset
the pinning blocks via GC loop. If this happens during checkpoint=disable
at booting time, we can see long delay to mount /data accordingly.

Bug: 136483670
Bug: 137180754
Bug: 149418646
Fixes: 5327d931ac ("logcatd: fallocate and fadvise to logcat files")
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
Change-Id: I986221d6d1da9b8e46e63d1be98ddf0ce4cb099f
This commit is contained in:
Jaegeuk Kim 2020-04-23 08:28:35 -07:00
parent efe9defc65
commit 2e5b7c425f
1 changed files with 14 additions and 0 deletions

View File

@ -123,6 +123,18 @@ static int openLogFile(const char* pathname, size_t sizeKB) {
return fd;
}
static void closeLogFile(const char* pathname) {
int fd = open(pathname, O_WRONLY | O_CLOEXEC);
if (fd == -1) {
return;
}
// no need to check errors
__u32 set = 0;
ioctl(fd, F2FS_IOC_SET_PIN_FILE, &set);
close(fd);
}
void Logcat::RotateLogs() {
// Can't rotate logs if we're not outputting to a file
if (!output_file_name_) return;
@ -153,6 +165,8 @@ void Logcat::RotateLogs() {
break;
}
closeLogFile(file0.c_str());
int err = rename(file0.c_str(), file1.c_str());
if (err < 0 && errno != ENOENT) {