From 2830bd2f8c61114a05615e058848219be81f6e7e Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Fri, 15 Aug 2014 22:48:32 -0400 Subject: [PATCH] Wrapfs: properly copy meta-data after AIO operations from lower inode Signed-off-by: Mengyang Li Signed-off-by: Erez Zadok --- fs/wrapfs/file.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/fs/wrapfs/file.c b/fs/wrapfs/file.c index ce3377b63b47..0d4086da679e 100644 --- a/fs/wrapfs/file.c +++ b/fs/wrapfs/file.c @@ -284,7 +284,10 @@ static ssize_t wrapfs_aio_read(struct kiocb *iocb, const struct iovec *iov, err = lower_file->f_op->aio_read(iocb, iov, nr_segs, pos); iocb->ki_filp = file; fput(lower_file); - /* XXX: need to update upper inode atime as needed */ + /* update upper inode atime as needed */ + if (err >= 0 || err == -EIOCBQUEUED) + fsstack_copy_attr_atime(file->f_path.dentry->d_inode, + file_inode(lower_file)); out: return err; } @@ -308,7 +311,13 @@ static ssize_t wrapfs_aio_write(struct kiocb *iocb, const struct iovec *iov, err = lower_file->f_op->aio_write(iocb, iov, nr_segs, pos); iocb->ki_filp = file; fput(lower_file); - /* XXX: need to update upper inode times/sizes as needed */ + /* update upper inode times/sizes as needed */ + if (err >= 0 || err == -EIOCBQUEUED) { + fsstack_copy_inode_size(file->f_path.dentry->d_inode, + file_inode(lower_file)); + fsstack_copy_attr_times(file->f_path.dentry->d_inode, + file_inode(lower_file)); + } out: return err; } @@ -355,7 +364,10 @@ wrapfs_read_iter(struct kiocb *iocb, struct iov_iter *iter) err = lower_file->f_op->read_iter(iocb, iter); iocb->ki_filp = file; fput(lower_file); - /* XXX: need to update upper inode atime as needed */ + /* update upper inode atime as needed */ + if (err >= 0 || err == -EIOCBQUEUED) + fsstack_copy_attr_atime(file->f_path.dentry->d_inode, + file_inode(lower_file)); out: return err; } @@ -380,7 +392,13 @@ wrapfs_write_iter(struct kiocb *iocb, struct iov_iter *iter) err = lower_file->f_op->write_iter(iocb, iter); iocb->ki_filp = file; fput(lower_file); - /* XXX: need to update upper inode times/sizes as needed */ + /* update upper inode times/sizes as needed */ + if (err >= 0 || err == -EIOCBQUEUED) { + fsstack_copy_inode_size(file->f_path.dentry->d_inode, + file_inode(lower_file)); + fsstack_copy_attr_times(file->f_path.dentry->d_inode, + file_inode(lower_file)); + } out: return err; } -- 2.43.0