Changes in 4.9.236 HID: core: Correctly handle ReportSize being zero HID: core: Sanitize event code and type when mapping input perf record/stat: Explicitly call out event modifiers in the documentation hwmon: (applesmc) check status earlier. nvmet: Disable keep-alive timer when kato is cleared to 0h ceph: don't allow setlease on cephfs s390: don't trace preemption in percpu macros xen/xenbus: Fix granting of vmalloc'd memory dmaengine: of-dma: Fix of_dma_router_xlate's of_dma_xlate handling batman-adv: Avoid uninitialized chaddr when handling DHCP batman-adv: bla: use netif_rx_ni when not in interrupt context dmaengine: at_hdmac: check return value of of_find_device_by_node() in at_dma_xlate() MIPS: mm: BMIPS5000 has inclusive physical caches MIPS: BMIPS: Also call bmips_cpu_setup() for secondary cores netfilter: nf_tables: add NFTA_SET_USERDATA if not null netfilter: nf_tables: incorrect enum nft_list_attributes definition netfilter: nf_tables: fix destination register zeroing net: hns: Fix memleak in hns_nic_dev_probe ravb: Fixed to be able to unload modules net: arc_emac: Fix memleak in arc_mdio_probe dmaengine: pl330: Fix burst length if burst size is smaller than bus width bnxt_en: Check for zero dir entries in NVRAM. bnxt_en: Fix PCI AER error recovery flow fix regression in "epoll: Keep a reference on files added to the check list" tg3: Fix soft lockup when tg3_reset_task() fails. iommu/vt-d: Serialize IOMMU GCMD register modifications thermal: ti-soc-thermal: Fix bogus thermal shutdowns for omap4430 include/linux/log2.h: add missing () around n in roundup_pow_of_two() btrfs: drop path before adding new uuid tree entry btrfs: Remove redundant extent_buffer_get in get_old_root btrfs: Remove extraneous extent_buffer_get from tree_mod_log_rewind btrfs: set the lockdep class for log tree extent buffers uaccess: Add non-pagefault user-space read functions uaccess: Add non-pagefault user-space write function btrfs: fix potential deadlock in the search ioctl net: usb: qmi_wwan: add Telit 0x1050 composition drivers: net: usb: qmi_wwan: add QMI_QUIRK_SET_DTR for Telit PID 0x1201 qmi_wwan: new Telewell and Sierra device IDs usb: qmi_wwan: add D-Link DWM-222 A2 device ID ALSA: ca0106: fix error code handling ALSA: pcm: oss: Remove superfluous WARN_ON() for mulaw sanity check ALSA: firewire-digi00x: exclude Avid Adrenaline from detection block: allow for_each_bvec to support zero len bvec block: Move SECTOR_SIZE and SECTOR_SHIFT definitions into <linux/blkdev.h> libata: implement ATA_HORKAGE_MAX_TRIM_128M and apply to Sandisks dm cache metadata: Avoid returning cmd->bm wild pointer on error dm thin metadata: Avoid returning cmd->bm wild pointer on error mm: slub: fix conversion of freelist_corrupted() vfio/type1: Support faulting PFNMAP vmas vfio-pci: Fault mmaps to enable vma tracking vfio-pci: Invalidate mmaps and block MMIO access on disabled memory KVM: arm64: Add kvm_extable for vaxorcism code KVM: arm64: Defer guest entry when an asynchronous exception is pending KVM: arm64: Survive synchronous exceptions caused by AT instructions KVM: arm64: Set HCR_EL2.PTW to prevent AT taking synchronous exception net: refactor bind_bucket fastreuse into helper net: initialize fastreuse on inet_inherit_port vfio/pci: Fix SR-IOV VF handling with MMIO blocking checkpatch: fix the usage of capture group ( ... ) mm/hugetlb: fix a race between hugetlb sysctl handlers cfg80211: regulatory: reject invalid hints net: usb: Fix uninit-was-stored issue in asix_read_phy_addr() ALSA; firewire-tascam: exclude Tascam FE-8 from detection fs/affs: use octal for permissions affs: fix basic permission bits to actually work net: ethernet: mlx4: Fix memory allocation in mlx4_buddy_init() bnxt: don't enable NAPI until rings are ready netlabel: fix problems with mapping removal sctp: not disable bh in the whole sctp_get_port_local() net: disable netpoll on fresh napis Linux 4.9.236 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I707909fadc45a09f6ecdacb81a294421af163664
105 lines
2.9 KiB
C
105 lines
2.9 KiB
C
/*
|
|
* bvec iterator
|
|
*
|
|
* Copyright (C) 2001 Ming Lei <ming.lei@canonical.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
*
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public Licens
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-
|
|
*/
|
|
#ifndef __LINUX_BVEC_ITER_H
|
|
#define __LINUX_BVEC_ITER_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/bug.h>
|
|
|
|
/*
|
|
* was unsigned short, but we might as well be ready for > 64kB I/O pages
|
|
*/
|
|
struct bio_vec {
|
|
struct page *bv_page;
|
|
unsigned int bv_len;
|
|
unsigned int bv_offset;
|
|
};
|
|
|
|
struct bvec_iter {
|
|
sector_t bi_sector; /* device address in 512 byte
|
|
sectors */
|
|
unsigned int bi_size; /* residual I/O count */
|
|
|
|
unsigned int bi_idx; /* current index into bvl_vec */
|
|
|
|
unsigned int bi_bvec_done; /* number of bytes completed in
|
|
current bvec */
|
|
};
|
|
|
|
/*
|
|
* various member access, note that bio_data should of course not be used
|
|
* on highmem page vectors
|
|
*/
|
|
#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx])
|
|
|
|
#define bvec_iter_page(bvec, iter) \
|
|
(__bvec_iter_bvec((bvec), (iter))->bv_page)
|
|
|
|
#define bvec_iter_len(bvec, iter) \
|
|
min((iter).bi_size, \
|
|
__bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done)
|
|
|
|
#define bvec_iter_offset(bvec, iter) \
|
|
(__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done)
|
|
|
|
#define bvec_iter_bvec(bvec, iter) \
|
|
((struct bio_vec) { \
|
|
.bv_page = bvec_iter_page((bvec), (iter)), \
|
|
.bv_len = bvec_iter_len((bvec), (iter)), \
|
|
.bv_offset = bvec_iter_offset((bvec), (iter)), \
|
|
})
|
|
|
|
static inline void bvec_iter_advance(const struct bio_vec *bv,
|
|
struct bvec_iter *iter,
|
|
unsigned bytes)
|
|
{
|
|
WARN_ONCE(bytes > iter->bi_size,
|
|
"Attempted to advance past end of bvec iter\n");
|
|
|
|
while (bytes) {
|
|
unsigned iter_len = bvec_iter_len(bv, *iter);
|
|
unsigned len = min(bytes, iter_len);
|
|
|
|
bytes -= len;
|
|
iter->bi_size -= len;
|
|
iter->bi_bvec_done += len;
|
|
|
|
if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) {
|
|
iter->bi_bvec_done = 0;
|
|
iter->bi_idx++;
|
|
}
|
|
}
|
|
}
|
|
|
|
static inline void bvec_iter_skip_zero_bvec(struct bvec_iter *iter)
|
|
{
|
|
iter->bi_bvec_done = 0;
|
|
iter->bi_idx++;
|
|
}
|
|
|
|
#define for_each_bvec(bvl, bio_vec, iter, start) \
|
|
for (iter = (start); \
|
|
(iter).bi_size && \
|
|
((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \
|
|
(bvl).bv_len ? (void)bvec_iter_advance((bio_vec), &(iter), \
|
|
(bvl).bv_len) : bvec_iter_skip_zero_bvec(&(iter)))
|
|
|
|
#endif /* __LINUX_BVEC_ITER_H */
|