@@ -34,7 +34,7 @@ const struct file_operations afs_file_operations = {
3434 .release = afs_release ,
3535 .llseek = generic_file_llseek ,
3636 .read_iter = afs_file_read_iter ,
37- .write_iter = afs_file_write ,
37+ .write_iter = netfs_file_write_iter ,
3838 .mmap = afs_file_mmap ,
3939 .splice_read = afs_file_splice_read ,
4040 .splice_write = iter_file_splice_write ,
@@ -50,16 +50,15 @@ const struct inode_operations afs_file_inode_operations = {
5050};
5151
5252const struct address_space_operations afs_file_aops = {
53+ .direct_IO = noop_direct_IO ,
5354 .read_folio = netfs_read_folio ,
5455 .readahead = netfs_readahead ,
5556 .dirty_folio = netfs_dirty_folio ,
56- .launder_folio = afs_launder_folio ,
57+ .launder_folio = netfs_launder_folio ,
5758 .release_folio = netfs_release_folio ,
5859 .invalidate_folio = netfs_invalidate_folio ,
59- .write_begin = afs_write_begin ,
60- .write_end = afs_write_end ,
61- .writepages = afs_writepages ,
6260 .migrate_folio = filemap_migrate_folio ,
61+ .writepages = afs_writepages ,
6362};
6463
6564const struct address_space_operations afs_symlink_aops = {
@@ -355,7 +354,10 @@ static int afs_symlink_read_folio(struct file *file, struct folio *folio)
355354
356355static int afs_init_request (struct netfs_io_request * rreq , struct file * file )
357356{
358- rreq -> netfs_priv = key_get (afs_file_key (file ));
357+ if (file )
358+ rreq -> netfs_priv = key_get (afs_file_key (file ));
359+ rreq -> rsize = 256 * 1024 ;
360+ rreq -> wsize = 256 * 1024 ;
359361 return 0 ;
360362}
361363
@@ -372,11 +374,36 @@ static void afs_free_request(struct netfs_io_request *rreq)
372374 key_put (rreq -> netfs_priv );
373375}
374376
377+ static void afs_update_i_size (struct inode * inode , loff_t new_i_size )
378+ {
379+ struct afs_vnode * vnode = AFS_FS_I (inode );
380+ loff_t i_size ;
381+
382+ write_seqlock (& vnode -> cb_lock );
383+ i_size = i_size_read (& vnode -> netfs .inode );
384+ if (new_i_size > i_size ) {
385+ i_size_write (& vnode -> netfs .inode , new_i_size );
386+ inode_set_bytes (& vnode -> netfs .inode , new_i_size );
387+ }
388+ write_sequnlock (& vnode -> cb_lock );
389+ fscache_update_cookie (afs_vnode_cache (vnode ), NULL , & new_i_size );
390+ }
391+
392+ static void afs_netfs_invalidate_cache (struct netfs_io_request * wreq )
393+ {
394+ struct afs_vnode * vnode = AFS_FS_I (wreq -> inode );
395+
396+ afs_invalidate_cache (vnode , 0 );
397+ }
398+
375399const struct netfs_request_ops afs_req_ops = {
376400 .init_request = afs_init_request ,
377401 .free_request = afs_free_request ,
378402 .check_write_begin = afs_check_write_begin ,
379403 .issue_read = afs_issue_read ,
404+ .update_i_size = afs_update_i_size ,
405+ .invalidate_cache = afs_netfs_invalidate_cache ,
406+ .create_write_requests = afs_create_write_requests ,
380407};
381408
382409static void afs_add_open_mmap (struct afs_vnode * vnode )
@@ -445,28 +472,39 @@ static vm_fault_t afs_vm_map_pages(struct vm_fault *vmf, pgoff_t start_pgoff, pg
445472
446473static ssize_t afs_file_read_iter (struct kiocb * iocb , struct iov_iter * iter )
447474{
448- struct afs_vnode * vnode = AFS_FS_I (file_inode (iocb -> ki_filp ));
475+ struct inode * inode = file_inode (iocb -> ki_filp );
476+ struct afs_vnode * vnode = AFS_FS_I (inode );
449477 struct afs_file * af = iocb -> ki_filp -> private_data ;
450- int ret ;
478+ ssize_t ret ;
451479
452- ret = afs_validate (vnode , af -> key );
480+ if (iocb -> ki_flags & IOCB_DIRECT )
481+ return netfs_unbuffered_read_iter (iocb , iter );
482+
483+ ret = netfs_start_io_read (inode );
453484 if (ret < 0 )
454485 return ret ;
455-
456- return generic_file_read_iter (iocb , iter );
486+ ret = afs_validate (vnode , af -> key );
487+ if (ret == 0 )
488+ ret = filemap_read (iocb , iter , 0 );
489+ netfs_end_io_read (inode );
490+ return ret ;
457491}
458492
459493static ssize_t afs_file_splice_read (struct file * in , loff_t * ppos ,
460494 struct pipe_inode_info * pipe ,
461495 size_t len , unsigned int flags )
462496{
463- struct afs_vnode * vnode = AFS_FS_I (file_inode (in ));
497+ struct inode * inode = file_inode (in );
498+ struct afs_vnode * vnode = AFS_FS_I (inode );
464499 struct afs_file * af = in -> private_data ;
465- int ret ;
500+ ssize_t ret ;
466501
467- ret = afs_validate ( vnode , af -> key );
502+ ret = netfs_start_io_read ( inode );
468503 if (ret < 0 )
469504 return ret ;
470-
471- return filemap_splice_read (in , ppos , pipe , len , flags );
505+ ret = afs_validate (vnode , af -> key );
506+ if (ret == 0 )
507+ ret = filemap_splice_read (in , ppos , pipe , len , flags );
508+ netfs_end_io_read (inode );
509+ return ret ;
472510}
0 commit comments