@@ -453,40 +453,6 @@ v9fs_file_read(struct file *filp, char __user *udata, size_t count,
453
453
return ret ;
454
454
}
455
455
456
- ssize_t
457
- v9fs_file_write_internal (struct inode * inode , struct p9_fid * fid ,
458
- const char __user * data , size_t count ,
459
- loff_t * offset , int invalidate )
460
- {
461
- loff_t origin = * offset ;
462
- struct iovec iov = {.iov_base = (void __user * )data , .iov_len = count };
463
- struct iov_iter from ;
464
- int total , err = 0 ;
465
-
466
- p9_debug (P9_DEBUG_VFS , "data %p count %d offset %x\n" ,
467
- data , (int )count , (int )* offset );
468
-
469
- iov_iter_init (& from , WRITE , & iov , 1 , count );
470
-
471
- total = p9_client_write (fid , origin , & from , & err );
472
- if (invalidate && (total > 0 )) {
473
- loff_t i_size ;
474
- unsigned long pg_start , pg_end ;
475
- pg_start = origin >> PAGE_CACHE_SHIFT ;
476
- pg_end = (origin + total - 1 ) >> PAGE_CACHE_SHIFT ;
477
- if (inode -> i_mapping && inode -> i_mapping -> nrpages )
478
- invalidate_inode_pages2_range (inode -> i_mapping ,
479
- pg_start , pg_end );
480
- * offset += total ;
481
- i_size = i_size_read (inode );
482
- if (* offset > i_size ) {
483
- inode_add_bytes (inode , * offset - i_size );
484
- i_size_write (inode , * offset );
485
- }
486
- }
487
- return total ? total : err ;
488
- }
489
-
490
456
/**
491
457
* v9fs_file_write - write to a file
492
458
* @filp: file pointer to write
@@ -501,27 +467,44 @@ v9fs_file_write(struct file *filp, const char __user * data,
501
467
{
502
468
ssize_t retval = 0 ;
503
469
loff_t origin = * offset ;
470
+ struct iovec iov = {.iov_base = (void __user * )data , .iov_len = count };
471
+ struct iov_iter from ;
472
+ int err = 0 ;
504
473
474
+ iov_iter_init (& from , WRITE , & iov , 1 , count );
505
475
506
476
retval = generic_write_checks (filp , & origin , & count , 0 );
507
477
if (retval )
508
- goto out ;
478
+ return retval ;
479
+
480
+ iov_iter_truncate (& from , count );
481
+
482
+ p9_debug (P9_DEBUG_VFS , "data %p count %d offset %x\n" ,
483
+ data , (int )count , (int )* offset );
509
484
510
- retval = - EINVAL ;
511
- if ((ssize_t ) count < 0 )
512
- goto out ;
513
485
retval = 0 ;
514
486
if (!count )
515
- goto out ;
487
+ return 0 ;
516
488
517
- retval = v9fs_file_write_internal (file_inode (filp ),
518
- filp -> private_data ,
519
- data , count , & origin , 1 );
520
- /* update offset on successful write */
521
- if (retval > 0 )
522
- * offset = origin ;
523
- out :
524
- return retval ;
489
+ retval = p9_client_write (filp -> private_data , origin , & from , & err );
490
+ if (retval > 0 ) {
491
+ struct inode * inode = file_inode (filp );
492
+ loff_t i_size ;
493
+ unsigned long pg_start , pg_end ;
494
+ pg_start = origin >> PAGE_CACHE_SHIFT ;
495
+ pg_end = (origin + retval - 1 ) >> PAGE_CACHE_SHIFT ;
496
+ if (inode -> i_mapping && inode -> i_mapping -> nrpages )
497
+ invalidate_inode_pages2_range (inode -> i_mapping ,
498
+ pg_start , pg_end );
499
+ * offset += retval ;
500
+ i_size = i_size_read (inode );
501
+ if (* offset > i_size ) {
502
+ inode_add_bytes (inode , * offset - i_size );
503
+ i_size_write (inode , * offset );
504
+ }
505
+ return retval ;
506
+ }
507
+ return err ;
525
508
}
526
509
527
510
0 commit comments