@@ -531,8 +531,7 @@ static void ceph_sync_write_unsafe(struct ceph_osd_request *req, bool unsafe)
531
531
* objects, rollback on failure, etc.)
532
532
*/
533
533
static ssize_t
534
- ceph_sync_direct_write (struct kiocb * iocb , const struct iovec * iov ,
535
- unsigned long nr_segs , size_t count )
534
+ ceph_sync_direct_write (struct kiocb * iocb , struct iov_iter * from )
536
535
{
537
536
struct file * file = iocb -> ki_filp ;
538
537
struct inode * inode = file_inode (file );
@@ -549,7 +548,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
549
548
int ret ;
550
549
struct timespec mtime = CURRENT_TIME ;
551
550
loff_t pos = iocb -> ki_pos ;
552
- struct iov_iter i ;
551
+ size_t count = iov_iter_count ( from ) ;
553
552
554
553
if (ceph_snap (file_inode (file )) != CEPH_NOSNAP )
555
554
return - EROFS ;
@@ -571,10 +570,8 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
571
570
CEPH_OSD_FLAG_ONDISK |
572
571
CEPH_OSD_FLAG_WRITE ;
573
572
574
- iov_iter_init (& i , WRITE , iov , nr_segs , count );
575
-
576
- while (iov_iter_count (& i ) > 0 ) {
577
- u64 len = iov_iter_single_seg_count (& i );
573
+ while (iov_iter_count (from ) > 0 ) {
574
+ u64 len = iov_iter_single_seg_count (from );
578
575
size_t start ;
579
576
ssize_t n ;
580
577
@@ -592,7 +589,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
592
589
break ;
593
590
}
594
591
595
- n = iov_iter_get_pages_alloc (& i , & pages , len , & start );
592
+ n = iov_iter_get_pages_alloc (from , & pages , len , & start );
596
593
if (unlikely (n < 0 )) {
597
594
ret = n ;
598
595
ceph_osdc_put_request (req );
@@ -623,7 +620,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
623
620
break ;
624
621
pos += n ;
625
622
written += n ;
626
- iov_iter_advance (& i , n );
623
+ iov_iter_advance (from , n );
627
624
628
625
if (pos > i_size_read (inode )) {
629
626
check_caps = ceph_inode_set_size (inode , pos );
@@ -649,8 +646,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
649
646
* correct atomic write, we should e.g. take write locks on all
650
647
* objects, rollback on failure, etc.)
651
648
*/
652
- static ssize_t ceph_sync_write (struct kiocb * iocb , const struct iovec * iov ,
653
- unsigned long nr_segs , size_t count )
649
+ static ssize_t ceph_sync_write (struct kiocb * iocb , struct iov_iter * from )
654
650
{
655
651
struct file * file = iocb -> ki_filp ;
656
652
struct inode * inode = file_inode (file );
@@ -668,7 +664,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
668
664
int ret ;
669
665
struct timespec mtime = CURRENT_TIME ;
670
666
loff_t pos = iocb -> ki_pos ;
671
- struct iov_iter i ;
667
+ size_t count = iov_iter_count ( from ) ;
672
668
673
669
if (ceph_snap (file_inode (file )) != CEPH_NOSNAP )
674
670
return - EROFS ;
@@ -690,9 +686,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
690
686
CEPH_OSD_FLAG_WRITE |
691
687
CEPH_OSD_FLAG_ACK ;
692
688
693
- iov_iter_init (& i , WRITE , iov , nr_segs , count );
694
-
695
- while ((len = iov_iter_count (& i )) > 0 ) {
689
+ while ((len = iov_iter_count (from )) > 0 ) {
696
690
size_t left ;
697
691
int n ;
698
692
@@ -724,7 +718,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
724
718
left = len ;
725
719
for (n = 0 ; n < num_pages ; n ++ ) {
726
720
size_t plen = min_t (size_t , left , PAGE_SIZE );
727
- ret = copy_page_from_iter (pages [n ], 0 , plen , & i );
721
+ ret = copy_page_from_iter (pages [n ], 0 , plen , from );
728
722
if (ret != plen ) {
729
723
ret = - EFAULT ;
730
724
break ;
@@ -861,25 +855,23 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
861
855
*
862
856
* If we are near ENOSPC, write synchronously.
863
857
*/
864
- static ssize_t ceph_aio_write (struct kiocb * iocb , const struct iovec * iov ,
865
- unsigned long nr_segs , loff_t pos )
858
+ static ssize_t ceph_write_iter (struct kiocb * iocb , struct iov_iter * from )
866
859
{
867
860
struct file * file = iocb -> ki_filp ;
868
861
struct ceph_file_info * fi = file -> private_data ;
869
862
struct inode * inode = file_inode (file );
870
863
struct ceph_inode_info * ci = ceph_inode (inode );
871
864
struct ceph_osd_client * osdc =
872
865
& ceph_sb_to_client (inode -> i_sb )-> client -> osdc ;
873
- ssize_t count , written = 0 ;
866
+ ssize_t count = iov_iter_count ( from ) , written = 0 ;
874
867
int err , want , got ;
868
+ loff_t pos = iocb -> ki_pos ;
875
869
876
870
if (ceph_snap (inode ) != CEPH_NOSNAP )
877
871
return - EROFS ;
878
872
879
873
mutex_lock (& inode -> i_mutex );
880
874
881
- count = iov_length (iov , nr_segs );
882
-
883
875
/* We can write back this queue in page reclaim */
884
876
current -> backing_dev_info = file -> f_mapping -> backing_dev_info ;
885
877
@@ -889,6 +881,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
889
881
890
882
if (count == 0 )
891
883
goto out ;
884
+ iov_iter_truncate (from , count );
892
885
893
886
err = file_remove_suid (file );
894
887
if (err )
@@ -920,32 +913,34 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
920
913
921
914
if ((got & (CEPH_CAP_FILE_BUFFER |CEPH_CAP_FILE_LAZYIO )) == 0 ||
922
915
(file -> f_flags & O_DIRECT ) || (fi -> flags & CEPH_F_SYNC )) {
916
+ struct iov_iter data ;
923
917
mutex_unlock (& inode -> i_mutex );
918
+ /* we might need to revert back to that point */
919
+ data = * from ;
924
920
if (file -> f_flags & O_DIRECT )
925
- written = ceph_sync_direct_write (iocb , iov ,
926
- nr_segs , count );
921
+ written = ceph_sync_direct_write (iocb , & data );
927
922
else
928
- written = ceph_sync_write (iocb , iov , nr_segs , count );
923
+ written = ceph_sync_write (iocb , & data );
929
924
if (written == - EOLDSNAPC ) {
930
925
dout ("aio_write %p %llx.%llx %llu~%u"
931
926
"got EOLDSNAPC, retrying\n" ,
932
927
inode , ceph_vinop (inode ),
933
- pos , (unsigned )iov -> iov_len );
928
+ pos , (unsigned )count );
934
929
mutex_lock (& inode -> i_mutex );
935
930
goto retry_snap ;
936
931
}
932
+ if (written > 0 )
933
+ iov_iter_advance (from , written );
937
934
} else {
938
935
loff_t old_size = inode -> i_size ;
939
- struct iov_iter from ;
940
936
/*
941
937
* No need to acquire the i_truncate_mutex. Because
942
938
* the MDS revokes Fwb caps before sending truncate
943
939
* message to us. We can't get Fwb cap while there
944
940
* are pending vmtruncate. So write and vmtruncate
945
941
* can not run at the same time
946
942
*/
947
- iov_iter_init (& from , WRITE , iov , nr_segs , count );
948
- written = generic_perform_write (file , & from , pos );
943
+ written = generic_perform_write (file , from , pos );
949
944
if (likely (written >= 0 ))
950
945
iocb -> ki_pos = pos + written ;
951
946
if (inode -> i_size > old_size )
@@ -963,7 +958,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
963
958
}
964
959
965
960
dout ("aio_write %p %llx.%llx %llu~%u dropping cap refs on %s\n" ,
966
- inode , ceph_vinop (inode ), pos , (unsigned )iov -> iov_len ,
961
+ inode , ceph_vinop (inode ), pos , (unsigned )count ,
967
962
ceph_cap_string (got ));
968
963
ceph_put_cap_refs (ci , got );
969
964
@@ -1241,9 +1236,9 @@ const struct file_operations ceph_file_fops = {
1241
1236
.release = ceph_release ,
1242
1237
.llseek = ceph_llseek ,
1243
1238
.read = new_sync_read ,
1244
- .write = do_sync_write ,
1239
+ .write = new_sync_write ,
1245
1240
.read_iter = ceph_read_iter ,
1246
- .aio_write = ceph_aio_write ,
1241
+ .write_iter = ceph_write_iter ,
1247
1242
.mmap = ceph_mmap ,
1248
1243
.fsync = ceph_fsync ,
1249
1244
.lock = ceph_lock ,
0 commit comments