diff options
author | Daniel Rosenberg <drosen@google.com> | 2017-03-09 21:48:09 -0800 |
---|---|---|
committer | zhang sanshan <sanshan.zhang@nxp.com> | 2018-01-19 14:30:30 +0800 |
commit | a88711e790e0b196f90f9181cb936c15834a8669 (patch) | |
tree | 56987ef55b75bfcb1d05f3784837138989a03942 | |
parent | 805b2314249b84d2a03bff59aade16d96000316c (diff) |
MA-11162 [Android] Fix Cts case android.os.storage.cts.StorageManagerTesto8.0.0_1.0.0-ga
Fix below cts case:
android.os.storage.cts.StorageManagerTest#testMountAndUnmountObbNormal
android.os.storage.cts.StorageManagerTest#testMountAndUnmountTwoObbs
ANDROID: sdcardfs: add read_iter/write_iter opeations
Adapted from wrapfs
commit f398bf6a7377 ("Wrapfs: add read_iter/write_iter opeations")
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
Signed-off-by: Mengyang Li <li.mengyang@stonybrook.edu>
Signed-off-by: Daniel Rosenberg <drosen@google.com>
Bug: 35766959
Change-Id: I2b3de59c9682fc705bf21df0de6df81e76fd2e40
-rw-r--r-- | fs/sdcardfs/file.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/fs/sdcardfs/file.c b/fs/sdcardfs/file.c index eee4eb5896e5..0e2ba3d60d0b 100644 --- a/fs/sdcardfs/file.c +++ b/fs/sdcardfs/file.c @@ -318,6 +318,53 @@ static int sdcardfs_fasync(int fd, struct file *file, int flag) return err; } +/* + * Sdcardfs read_iter, redirect modified iocb to lower read_iter + */ +ssize_t sdcardfs_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + int err; + struct file *file = iocb->ki_filp, *lower_file; + + lower_file = sdcardfs_lower_file(file); + if (!lower_file->f_op->read_iter) { + err = -EINVAL; + goto out; + } + + get_file(lower_file); /* prevent lower_file from being released */ + iocb->ki_filp = lower_file; + err = lower_file->f_op->read_iter(iocb, iter); + /* ? wait IO finish to update atime as ecryptfs ? */ + iocb->ki_filp = file; + fput(lower_file); +out: + return err; +} + +/* + * Sdcardfs write_iter, redirect modified iocb to lower write_iter + */ +ssize_t sdcardfs_write_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + int err; + struct file *file = iocb->ki_filp, *lower_file; + + lower_file = sdcardfs_lower_file(file); + if (!lower_file->f_op->write_iter) { + err = -EINVAL; + goto out; + } + + get_file(lower_file); /* prevent lower_file from being released */ + iocb->ki_filp = lower_file; + err = lower_file->f_op->write_iter(iocb, iter); + iocb->ki_filp = file; + fput(lower_file); +out: + return err; +} + const struct file_operations sdcardfs_main_fops = { .llseek = generic_file_llseek, .read = sdcardfs_read, @@ -332,6 +379,8 @@ const struct file_operations sdcardfs_main_fops = { .release = sdcardfs_file_release, .fsync = sdcardfs_fsync, .fasync = sdcardfs_fasync, + .read_iter = sdcardfs_read_iter, + .write_iter = sdcardfs_write_iter, }; /* trimmed directory options */ |