Skip to content

Commit 4908b82

Browse files
author
Al Viro
committed
ceph: switch to ->write_iter()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 64c3131 commit 4908b82

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

fs/ceph/file.c

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,7 @@ static void ceph_sync_write_unsafe(struct ceph_osd_request *req, bool unsafe)
531531
* objects, rollback on failure, etc.)
532532
*/
533533
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)
536535
{
537536
struct file *file = iocb->ki_filp;
538537
struct inode *inode = file_inode(file);
@@ -549,7 +548,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
549548
int ret;
550549
struct timespec mtime = CURRENT_TIME;
551550
loff_t pos = iocb->ki_pos;
552-
struct iov_iter i;
551+
size_t count = iov_iter_count(from);
553552

554553
if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
555554
return -EROFS;
@@ -571,10 +570,8 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
571570
CEPH_OSD_FLAG_ONDISK |
572571
CEPH_OSD_FLAG_WRITE;
573572

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);
578575
size_t start;
579576
ssize_t n;
580577

@@ -592,7 +589,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
592589
break;
593590
}
594591

595-
n = iov_iter_get_pages_alloc(&i, &pages, len, &start);
592+
n = iov_iter_get_pages_alloc(from, &pages, len, &start);
596593
if (unlikely(n < 0)) {
597594
ret = n;
598595
ceph_osdc_put_request(req);
@@ -623,7 +620,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
623620
break;
624621
pos += n;
625622
written += n;
626-
iov_iter_advance(&i, n);
623+
iov_iter_advance(from, n);
627624

628625
if (pos > i_size_read(inode)) {
629626
check_caps = ceph_inode_set_size(inode, pos);
@@ -649,8 +646,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
649646
* correct atomic write, we should e.g. take write locks on all
650647
* objects, rollback on failure, etc.)
651648
*/
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)
654650
{
655651
struct file *file = iocb->ki_filp;
656652
struct inode *inode = file_inode(file);
@@ -668,7 +664,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
668664
int ret;
669665
struct timespec mtime = CURRENT_TIME;
670666
loff_t pos = iocb->ki_pos;
671-
struct iov_iter i;
667+
size_t count = iov_iter_count(from);
672668

673669
if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
674670
return -EROFS;
@@ -690,9 +686,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
690686
CEPH_OSD_FLAG_WRITE |
691687
CEPH_OSD_FLAG_ACK;
692688

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) {
696690
size_t left;
697691
int n;
698692

@@ -724,7 +718,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
724718
left = len;
725719
for (n = 0; n < num_pages; n++) {
726720
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);
728722
if (ret != plen) {
729723
ret = -EFAULT;
730724
break;
@@ -861,25 +855,23 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
861855
*
862856
* If we are near ENOSPC, write synchronously.
863857
*/
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)
866859
{
867860
struct file *file = iocb->ki_filp;
868861
struct ceph_file_info *fi = file->private_data;
869862
struct inode *inode = file_inode(file);
870863
struct ceph_inode_info *ci = ceph_inode(inode);
871864
struct ceph_osd_client *osdc =
872865
&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;
874867
int err, want, got;
868+
loff_t pos = iocb->ki_pos;
875869

876870
if (ceph_snap(inode) != CEPH_NOSNAP)
877871
return -EROFS;
878872

879873
mutex_lock(&inode->i_mutex);
880874

881-
count = iov_length(iov, nr_segs);
882-
883875
/* We can write back this queue in page reclaim */
884876
current->backing_dev_info = file->f_mapping->backing_dev_info;
885877

@@ -889,6 +881,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
889881

890882
if (count == 0)
891883
goto out;
884+
iov_iter_truncate(from, count);
892885

893886
err = file_remove_suid(file);
894887
if (err)
@@ -920,32 +913,34 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
920913

921914
if ((got & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_LAZYIO)) == 0 ||
922915
(file->f_flags & O_DIRECT) || (fi->flags & CEPH_F_SYNC)) {
916+
struct iov_iter data;
923917
mutex_unlock(&inode->i_mutex);
918+
/* we might need to revert back to that point */
919+
data = *from;
924920
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);
927922
else
928-
written = ceph_sync_write(iocb, iov, nr_segs, count);
923+
written = ceph_sync_write(iocb, &data);
929924
if (written == -EOLDSNAPC) {
930925
dout("aio_write %p %llx.%llx %llu~%u"
931926
"got EOLDSNAPC, retrying\n",
932927
inode, ceph_vinop(inode),
933-
pos, (unsigned)iov->iov_len);
928+
pos, (unsigned)count);
934929
mutex_lock(&inode->i_mutex);
935930
goto retry_snap;
936931
}
932+
if (written > 0)
933+
iov_iter_advance(from, written);
937934
} else {
938935
loff_t old_size = inode->i_size;
939-
struct iov_iter from;
940936
/*
941937
* No need to acquire the i_truncate_mutex. Because
942938
* the MDS revokes Fwb caps before sending truncate
943939
* message to us. We can't get Fwb cap while there
944940
* are pending vmtruncate. So write and vmtruncate
945941
* can not run at the same time
946942
*/
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);
949944
if (likely(written >= 0))
950945
iocb->ki_pos = pos + written;
951946
if (inode->i_size > old_size)
@@ -963,7 +958,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
963958
}
964959

965960
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,
967962
ceph_cap_string(got));
968963
ceph_put_cap_refs(ci, got);
969964

@@ -1241,9 +1236,9 @@ const struct file_operations ceph_file_fops = {
12411236
.release = ceph_release,
12421237
.llseek = ceph_llseek,
12431238
.read = new_sync_read,
1244-
.write = do_sync_write,
1239+
.write = new_sync_write,
12451240
.read_iter = ceph_read_iter,
1246-
.aio_write = ceph_aio_write,
1241+
.write_iter = ceph_write_iter,
12471242
.mmap = ceph_mmap,
12481243
.fsync = ceph_fsync,
12491244
.lock = ceph_lock,

0 commit comments

Comments
 (0)