Commit d796e77f authored by Amir Goldstein's avatar Amir Goldstein Committed by Miklos Szeredi

ovl: fix failure to fsync lower dir

As a writable mount, it is not expected for overlayfs to return
EINVAL/EROFS for fsync, even if dir/file is not changed.

This commit fixes the case of fsync of directory, which is easier to
address, because overlayfs already implements fsync file operation for
directories.

The problem reported by Raphael is that new PostgreSQL 10.0 with a
database in overlayfs where lower layer in squashfs fails to start.
The failure is due to fsync error, when PostgreSQL does fsync on all
existing db directories on startup and a specific directory exists
lower layer with no changes.
Reported-by: default avatarRaphael Hertzog <raphael@ouaza.com>
Cc: <stable@vger.kernel.org> # v3.18
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Tested-by: default avatarRaphaël Hertzog <hertzog@debian.org>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 31747eda
...@@ -769,10 +769,14 @@ static int ovl_dir_fsync(struct file *file, loff_t start, loff_t end, ...@@ -769,10 +769,14 @@ static int ovl_dir_fsync(struct file *file, loff_t start, loff_t end,
struct dentry *dentry = file->f_path.dentry; struct dentry *dentry = file->f_path.dentry;
struct file *realfile = od->realfile; struct file *realfile = od->realfile;
/* Nothing to sync for lower */
if (!OVL_TYPE_UPPER(ovl_path_type(dentry)))
return 0;
/* /*
* Need to check if we started out being a lower dir, but got copied up * Need to check if we started out being a lower dir, but got copied up
*/ */
if (!od->is_upper && OVL_TYPE_UPPER(ovl_path_type(dentry))) { if (!od->is_upper) {
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
realfile = READ_ONCE(od->upperfile); realfile = READ_ONCE(od->upperfile);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment