File tree Expand file tree Collapse file tree 1 file changed +39
-0
lines changed Expand file tree Collapse file tree 1 file changed +39
-0
lines changed Original file line number Diff line number Diff 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+
198236const 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};
You can’t perform that action at this time.
0 commit comments