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)
195
195
return ret ;
196
196
}
197
197
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
+
198
236
const struct file_operations ovl_file_operations = {
199
237
.open = ovl_open ,
200
238
.release = ovl_release ,
201
239
.llseek = ovl_llseek ,
202
240
.read_iter = ovl_read_iter ,
241
+ .write_iter = ovl_write_iter ,
203
242
};
You can’t perform that action at this time.
0 commit comments