Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update mtime when mmap'ed pages become writable #1127

Closed
wants to merge 1 commit into from

Conversation

ryao
Copy link
Contributor

@ryao ryao commented Dec 4, 2012

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

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>
@behlendorf
Copy link
Contributor

Upon further reflection we opted for an alternate fix, see commit d3aa3ea

@behlendorf behlendorf closed this Dec 5, 2012
pcd1193182 pushed a commit to pcd1193182/zfs that referenced this pull request Sep 26, 2023
openzfs#1127)

DLPX-87428 test_arc_with_heavy_io_memory_load failed with zoa crash dump- AWS SDK error

Due to a bug in the AWS SDK, if we get a SlowDown error when deleting
multiple objects, it is not handled correctly.  To work around this,
only delete one object at a time.

See awslabs/aws-sdk-rust#873
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants