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

index 18f1e166e8495c48258d9e360b6b788930ebdb74..203081f748029021b23ee4f25ded907e4c79f55a 100644 (file)
@@ -282,7 +282,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,
+                                       lower_file->f_path.dentry->d_inode);
 out:
        return err;
 }
@@ -306,7 +309,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,
+                                       lower_file->f_path.dentry->d_inode);
+               fsstack_copy_attr_times(file->f_path.dentry->d_inode,
+                                       lower_file->f_path.dentry->d_inode);
+       }
 out:
        return err;
 }