83
83
const struct kvec *kvec; \
84
84
struct kvec v; \
85
85
iterate_kvec(i, n, v, kvec, skip, (K)) \
86
+ } else if (unlikely(i->type & ITER_DISCARD)) { \
86
87
} else { \
87
88
const struct iovec *iov; \
88
89
struct iovec v; \
114
115
} \
115
116
i->nr_segs -= kvec - i->kvec; \
116
117
i->kvec = kvec; \
118
+ } else if (unlikely(i->type & ITER_DISCARD)) { \
119
+ skip += n; \
117
120
} else { \
118
121
const struct iovec *iov; \
119
122
struct iovec v; \
@@ -838,7 +841,9 @@ size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
838
841
size_t wanted = copy_to_iter (kaddr + offset , bytes , i );
839
842
kunmap_atomic (kaddr );
840
843
return wanted ;
841
- } else if (likely (!iov_iter_is_pipe (i )))
844
+ } else if (unlikely (iov_iter_is_discard (i )))
845
+ return bytes ;
846
+ else if (likely (!iov_iter_is_pipe (i )))
842
847
return copy_page_to_iter_iovec (page , offset , bytes , i );
843
848
else
844
849
return copy_page_to_iter_pipe (page , offset , bytes , i );
@@ -850,7 +855,7 @@ size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
850
855
{
851
856
if (unlikely (!page_copy_sane (page , offset , bytes )))
852
857
return 0 ;
853
- if (unlikely (iov_iter_is_pipe (i ))) {
858
+ if (unlikely (iov_iter_is_pipe (i ) || iov_iter_is_discard ( i ) )) {
854
859
WARN_ON (1 );
855
860
return 0 ;
856
861
}
@@ -910,7 +915,7 @@ size_t iov_iter_copy_from_user_atomic(struct page *page,
910
915
kunmap_atomic (kaddr );
911
916
return 0 ;
912
917
}
913
- if (unlikely (iov_iter_is_pipe (i ))) {
918
+ if (unlikely (iov_iter_is_pipe (i ) || iov_iter_is_discard ( i ) )) {
914
919
kunmap_atomic (kaddr );
915
920
WARN_ON (1 );
916
921
return 0 ;
@@ -978,6 +983,10 @@ void iov_iter_advance(struct iov_iter *i, size_t size)
978
983
pipe_advance (i , size );
979
984
return ;
980
985
}
986
+ if (unlikely (iov_iter_is_discard (i ))) {
987
+ i -> count -= size ;
988
+ return ;
989
+ }
981
990
iterate_and_advance (i , size , v , 0 , 0 , 0 )
982
991
}
983
992
EXPORT_SYMBOL (iov_iter_advance );
@@ -1013,6 +1022,8 @@ void iov_iter_revert(struct iov_iter *i, size_t unroll)
1013
1022
pipe_truncate (i );
1014
1023
return ;
1015
1024
}
1025
+ if (unlikely (iov_iter_is_discard (i )))
1026
+ return ;
1016
1027
if (unroll <= i -> iov_offset ) {
1017
1028
i -> iov_offset -= unroll ;
1018
1029
return ;
@@ -1055,6 +1066,8 @@ size_t iov_iter_single_seg_count(const struct iov_iter *i)
1055
1066
return i -> count ; // it is a silly place, anyway
1056
1067
if (i -> nr_segs == 1 )
1057
1068
return i -> count ;
1069
+ if (unlikely (iov_iter_is_discard (i )))
1070
+ return i -> count ;
1058
1071
else if (iov_iter_is_bvec (i ))
1059
1072
return min (i -> count , i -> bvec -> bv_len - i -> iov_offset );
1060
1073
else
@@ -1103,6 +1116,24 @@ void iov_iter_pipe(struct iov_iter *i, unsigned int direction,
1103
1116
}
1104
1117
EXPORT_SYMBOL (iov_iter_pipe );
1105
1118
1119
+ /**
1120
+ * iov_iter_discard - Initialise an I/O iterator that discards data
1121
+ * @i: The iterator to initialise.
1122
+ * @direction: The direction of the transfer.
1123
+ * @count: The size of the I/O buffer in bytes.
1124
+ *
1125
+ * Set up an I/O iterator that just discards everything that's written to it.
1126
+ * It's only available as a READ iterator.
1127
+ */
1128
+ void iov_iter_discard (struct iov_iter * i , unsigned int direction , size_t count )
1129
+ {
1130
+ BUG_ON (direction != READ );
1131
+ i -> type = ITER_DISCARD | READ ;
1132
+ i -> count = count ;
1133
+ i -> iov_offset = 0 ;
1134
+ }
1135
+ EXPORT_SYMBOL (iov_iter_discard );
1136
+
1106
1137
unsigned long iov_iter_alignment (const struct iov_iter * i )
1107
1138
{
1108
1139
unsigned long res = 0 ;
@@ -1127,7 +1158,7 @@ unsigned long iov_iter_gap_alignment(const struct iov_iter *i)
1127
1158
unsigned long res = 0 ;
1128
1159
size_t size = i -> count ;
1129
1160
1130
- if (unlikely (iov_iter_is_pipe (i ))) {
1161
+ if (unlikely (iov_iter_is_pipe (i ) || iov_iter_is_discard ( i ) )) {
1131
1162
WARN_ON (1 );
1132
1163
return ~0U ;
1133
1164
}
@@ -1197,6 +1228,9 @@ ssize_t iov_iter_get_pages(struct iov_iter *i,
1197
1228
1198
1229
if (unlikely (iov_iter_is_pipe (i )))
1199
1230
return pipe_get_pages (i , pages , maxsize , maxpages , start );
1231
+ if (unlikely (iov_iter_is_discard (i )))
1232
+ return - EFAULT ;
1233
+
1200
1234
iterate_all_kinds (i , maxsize , v , ({
1201
1235
unsigned long addr = (unsigned long )v .iov_base ;
1202
1236
size_t len = v .iov_len + (* start = addr & (PAGE_SIZE - 1 ));
@@ -1274,6 +1308,9 @@ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
1274
1308
1275
1309
if (unlikely (iov_iter_is_pipe (i )))
1276
1310
return pipe_get_pages_alloc (i , pages , maxsize , start );
1311
+ if (unlikely (iov_iter_is_discard (i )))
1312
+ return - EFAULT ;
1313
+
1277
1314
iterate_all_kinds (i , maxsize , v , ({
1278
1315
unsigned long addr = (unsigned long )v .iov_base ;
1279
1316
size_t len = v .iov_len + (* start = addr & (PAGE_SIZE - 1 ));
@@ -1315,7 +1352,7 @@ size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
1315
1352
__wsum sum , next ;
1316
1353
size_t off = 0 ;
1317
1354
sum = * csum ;
1318
- if (unlikely (iov_iter_is_pipe (i ))) {
1355
+ if (unlikely (iov_iter_is_pipe (i ) || iov_iter_is_discard ( i ) )) {
1319
1356
WARN_ON (1 );
1320
1357
return 0 ;
1321
1358
}
@@ -1357,7 +1394,7 @@ bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum,
1357
1394
__wsum sum , next ;
1358
1395
size_t off = 0 ;
1359
1396
sum = * csum ;
1360
- if (unlikely (iov_iter_is_pipe (i ))) {
1397
+ if (unlikely (iov_iter_is_pipe (i ) || iov_iter_is_discard ( i ) )) {
1361
1398
WARN_ON (1 );
1362
1399
return false;
1363
1400
}
@@ -1402,7 +1439,7 @@ size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum,
1402
1439
__wsum sum , next ;
1403
1440
size_t off = 0 ;
1404
1441
sum = * csum ;
1405
- if (unlikely (iov_iter_is_pipe (i ))) {
1442
+ if (unlikely (iov_iter_is_pipe (i ) || iov_iter_is_discard ( i ) )) {
1406
1443
WARN_ON (1 ); /* for now */
1407
1444
return 0 ;
1408
1445
}
@@ -1444,6 +1481,8 @@ int iov_iter_npages(const struct iov_iter *i, int maxpages)
1444
1481
1445
1482
if (!size )
1446
1483
return 0 ;
1484
+ if (unlikely (iov_iter_is_discard (i )))
1485
+ return 0 ;
1447
1486
1448
1487
if (unlikely (iov_iter_is_pipe (i ))) {
1449
1488
struct pipe_inode_info * pipe = i -> pipe ;
@@ -1487,6 +1526,8 @@ const void *dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
1487
1526
WARN_ON (1 );
1488
1527
return NULL ;
1489
1528
}
1529
+ if (unlikely (iov_iter_is_discard (new )))
1530
+ return NULL ;
1490
1531
if (iov_iter_is_bvec (new ))
1491
1532
return new -> bvec = kmemdup (new -> bvec ,
1492
1533
new -> nr_segs * sizeof (struct bio_vec ),
0 commit comments