Update mtime when mmap'ed pages become writable #1127
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
GNU Tar is sensitive to situations where mtimes on open files are
updated to times in the past.
When doing write operations on mmap'ed files, the modification time update
presently occurs during a flush. Observant programs that open such files
shortly after they are closed will observe that modification times
appear to occur in the past. This caused a failure that was observed
during binary package generation on Gentoo where PaX-marking is done on
certain files via mmap almost immediately prior to package generation,
which relies on GNU tar. It can be replicated with a Hello World program
by doing:
gcc hello.c && scanelf -Xxz -r a.out && tar -cf hello.tgz a.out
Brian Behlendorf suggested that we could prevent this by doing mtime
updates in the kernel's page_mkwrite() callback function, which is
invoked whenever a page becomes writeable. We implement that by
replacing the page_mkwrite function with a wrapper function that invokes
zfs_inode_update() after invoking the kernel's generic page_mkwrite. It
would be better to do an mtime update and flush on each close()
operation done from userland on a dirty file, but unfortunately, the
Linux kernel provides us with no way to do that.
Signed-off-by: Richard Yao ryao@cs.stonybrook.edu