]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iov_iter: Add iov_iter_fault_in_writeable()
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 13 May 2021 15:04:54 +0000 (17:04 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Wed, 2 Jun 2021 09:47:03 +0000 (11:47 +0200)
Add the equivalent of iov_iter_fault_in_readable(), but for pages that will be
written to.

While at it, fix an indentation error in iov_iter_fault_in_readable().

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
include/linux/uio.h
lib/iov_iter.c

index d3ec87706d757331dd2db52ba9c8d52d96fb0f02..6811eb6ac6e3f85a146eb23843c59efc55e7e4b9 100644 (file)
@@ -124,6 +124,7 @@ size_t iov_iter_copy_from_user_atomic(struct page *page,
 void iov_iter_advance(struct iov_iter *i, size_t bytes);
 void iov_iter_revert(struct iov_iter *i, size_t bytes);
 int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
+int iov_iter_fault_in_writeable(struct iov_iter *i, size_t bytes);
 size_t iov_iter_single_seg_count(const struct iov_iter *i);
 size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
                         struct iov_iter *i);
index c701b7a187f2baf3276fdffb3dc29d3210620789..317c94eac907ddd933d896ed5c680d05198fa742 100644 (file)
@@ -480,13 +480,31 @@ int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
                iterate_iovec(i, bytes, v, iov, skip, ({
                        err = fault_in_pages_readable(v.iov_base, v.iov_len);
                        if (unlikely(err))
-                       return err;
+                               return err;
                0;}))
        }
        return 0;
 }
 EXPORT_SYMBOL(iov_iter_fault_in_readable);
 
+int iov_iter_fault_in_writeable(struct iov_iter *i, size_t bytes)
+{
+       size_t skip = i->iov_offset;
+       const struct iovec *iov;
+       int err;
+       struct iovec v;
+
+       if (!(i->type & (ITER_BVEC|ITER_KVEC))) {
+               iterate_iovec(i, bytes, v, iov, skip, ({
+                       err = fault_in_pages_writeable(v.iov_base, v.iov_len);
+                       if (unlikely(err))
+                               return err;
+               0;}))
+       }
+       return 0;
+}
+EXPORT_SYMBOL(iov_iter_fault_in_writeable);
+
 void iov_iter_init(struct iov_iter *i, unsigned int direction,
                        const struct iovec *iov, unsigned long nr_segs,
                        size_t count)