Skip to content

Commit 2a92e07

Browse files
author
Miklos Szeredi
committed
ovl: add ovl_write_iter()
Implement stacked writes. Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 16914e6 commit 2a92e07

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

fs/overlayfs/file.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,48 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
195195
return ret;
196196
}
197197

198+
static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
199+
{
200+
struct file *file = iocb->ki_filp;
201+
struct inode *inode = file_inode(file);
202+
struct fd real;
203+
const struct cred *old_cred;
204+
ssize_t ret;
205+
206+
if (!iov_iter_count(iter))
207+
return 0;
208+
209+
inode_lock(inode);
210+
/* Update mode */
211+
ovl_copyattr(ovl_inode_real(inode), inode);
212+
ret = file_remove_privs(file);
213+
if (ret)
214+
goto out_unlock;
215+
216+
ret = ovl_real_fdget(file, &real);
217+
if (ret)
218+
goto out_unlock;
219+
220+
old_cred = ovl_override_creds(file_inode(file)->i_sb);
221+
ret = vfs_iter_write(real.file, iter, &iocb->ki_pos,
222+
ovl_iocb_to_rwf(iocb));
223+
revert_creds(old_cred);
224+
225+
/* Update size */
226+
ovl_copyattr(ovl_inode_real(inode), inode);
227+
228+
fdput(real);
229+
230+
out_unlock:
231+
inode_unlock(inode);
232+
233+
return ret;
234+
}
235+
198236
const struct file_operations ovl_file_operations = {
199237
.open = ovl_open,
200238
.release = ovl_release,
201239
.llseek = ovl_llseek,
202240
.read_iter = ovl_read_iter,
241+
.write_iter = ovl_write_iter,
203242
};

0 commit comments

Comments
 (0)