@@ -34,7 +34,7 @@ const struct file_operations afs_file_operations = {
34
34
.release = afs_release ,
35
35
.llseek = generic_file_llseek ,
36
36
.read_iter = afs_file_read_iter ,
37
- .write_iter = afs_file_write ,
37
+ .write_iter = netfs_file_write_iter ,
38
38
.mmap = afs_file_mmap ,
39
39
.splice_read = afs_file_splice_read ,
40
40
.splice_write = iter_file_splice_write ,
@@ -50,16 +50,15 @@ const struct inode_operations afs_file_inode_operations = {
50
50
};
51
51
52
52
const struct address_space_operations afs_file_aops = {
53
+ .direct_IO = noop_direct_IO ,
53
54
.read_folio = netfs_read_folio ,
54
55
.readahead = netfs_readahead ,
55
56
.dirty_folio = netfs_dirty_folio ,
56
- .launder_folio = afs_launder_folio ,
57
+ .launder_folio = netfs_launder_folio ,
57
58
.release_folio = netfs_release_folio ,
58
59
.invalidate_folio = netfs_invalidate_folio ,
59
- .write_begin = afs_write_begin ,
60
- .write_end = afs_write_end ,
61
- .writepages = afs_writepages ,
62
60
.migrate_folio = filemap_migrate_folio ,
61
+ .writepages = afs_writepages ,
63
62
};
64
63
65
64
const struct address_space_operations afs_symlink_aops = {
@@ -355,7 +354,10 @@ static int afs_symlink_read_folio(struct file *file, struct folio *folio)
355
354
356
355
static int afs_init_request (struct netfs_io_request * rreq , struct file * file )
357
356
{
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 ;
359
361
return 0 ;
360
362
}
361
363
@@ -372,11 +374,36 @@ static void afs_free_request(struct netfs_io_request *rreq)
372
374
key_put (rreq -> netfs_priv );
373
375
}
374
376
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
+
375
399
const struct netfs_request_ops afs_req_ops = {
376
400
.init_request = afs_init_request ,
377
401
.free_request = afs_free_request ,
378
402
.check_write_begin = afs_check_write_begin ,
379
403
.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 ,
380
407
};
381
408
382
409
static 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
445
472
446
473
static ssize_t afs_file_read_iter (struct kiocb * iocb , struct iov_iter * iter )
447
474
{
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 );
449
477
struct afs_file * af = iocb -> ki_filp -> private_data ;
450
- int ret ;
478
+ ssize_t ret ;
451
479
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 );
453
484
if (ret < 0 )
454
485
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 ;
457
491
}
458
492
459
493
static ssize_t afs_file_splice_read (struct file * in , loff_t * ppos ,
460
494
struct pipe_inode_info * pipe ,
461
495
size_t len , unsigned int flags )
462
496
{
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 );
464
499
struct afs_file * af = in -> private_data ;
465
- int ret ;
500
+ ssize_t ret ;
466
501
467
- ret = afs_validate ( vnode , af -> key );
502
+ ret = netfs_start_io_read ( inode );
468
503
if (ret < 0 )
469
504
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 ;
472
510
}
0 commit comments