Wrapfs: properly copy meta-data after AIO operations from lower inode
authorErez Zadok <ezk@cs.sunysb.edu>
Sat, 16 Aug 2014 02:56:54 +0000 (22:56 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 03:53:21 +0000 (22:53 -0500)
Signed-off-by: Mengyang Li <li.mengyang@stonybrook.edu>
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/file.c

index aed8a0fd319d2c11c9030bcb99572578e3507112..999c0f678dd66e56738b61797dab6d1e0bde02bd 100644 (file)
@@ -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;
 }