Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > +#define iterate_all_kinds(i, n, v, I, B, K, X) { \ > > Do you have any users that would pass different B and X? > > > @@ -1440,7 +1665,7 @@ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, > > return v.bv_len; > > }),({ > > return -EFAULT; > > - }) > > + }), 0 > > Correction - users that might get that flavour. This one explicitly checks > for xarray and doesn't get to iterate_... in that case. This is the case for iterate_all_kinds(), but not for iterate_and_advance(). See _copy_mc_to_iter() for example: that can return directly out of the middle of the loop, so the X variant must drop the rcu_read_lock(), but the B variant doesn't need to. You also can't just use break to get out as the X variant has a loop within a loop to handle iteration over the subelements of a THP. But with iterate_all_kinds(), I could just drop the X parameter and use the B parameter for both, I think. David