From mboxrd@z Thu Jan 1 00:00:00 1970 From: NeilBrown Subject: [PATCH 05/10] ovl: make sure fsync is never called on the lower filesystem. Date: Mon, 06 Sep 2010 10:50:29 +1000 Message-ID: <20100906005029.20775.56925.stgit@localhost.localdomain> References: <20100906004829.20775.68828.stgit@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org To: Miklos Szeredi Return-path: In-Reply-To: <20100906004829.20775.68828.stgit@localhost.localdomain> Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org If we open a directory O_RDONLY, ->realfile could be on the lower filesystem. While fsync is not likely to be called on such a file, we should make sure never to pass the fsync down as we are treating the lower filesystem as read-only. Signed-off-by: NeilBrown --- fs/overlayfs/overlayfs.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/fs/overlayfs/overlayfs.c b/fs/overlayfs/overlayfs.c index de854e1..f9eea96 100644 --- a/fs/overlayfs/overlayfs.c +++ b/fs/overlayfs/overlayfs.c @@ -329,8 +329,15 @@ static loff_t ovl_dir_llseek(struct file *file, loff_t offset, int origin) static int ovl_dir_fsync(struct file *file, int datasync) { struct ovl_dir_file *od = file->private_data; + struct ovl_entry *ue = file->f_path.dentry->d_fsdata; - return vfs_fsync(od->realfile, datasync); + /* realfile could be on lowerdir, but only if this was a read-only open, + * in which case we can ignore the fsync. + */ + if (file->f_path.dentry == ue->upperpath.dentry) + return vfs_fsync(od->realfile, datasync); + else + return 0; } static int ovl_dir_release(struct inode *inode, struct file *file)