2023-10-20 10:31:14

by Miklos Szeredi

[permalink] [raw]
Subject: [RFC PATCH 0/2] add list iterate & delete macros

It turns out that a very common pattern is:

- remove first element
- do something with first element
- repeat until list is empty

This is most often coded as something like:

while (!list_empty(head)) {
pos = list_first_entry(head, typeof(*pos), member);
list_del(&pos->member);
...
}

The first patch adds macros to condense this pattern into a single list
iteration statement.

The second patch replaces some instances with the new macros.

I think the most important result is that it makes the pattern recognisable
and is easier to read.

Any comments or objections?

Should the conversion patch be split up by subsystem?

Thanks,
Miklos


Miklos Szeredi (2):
add list_for_each_entry_del()
replace trivial incarnations of list_for_each_entry_del()

arch/powerpc/platforms/powermac/pfunc_core.c | 7 +--
arch/powerpc/platforms/powernv/opal-hmi.c | 5 +-
.../platforms/powernv/opal-memory-errors.c | 5 +-
arch/powerpc/platforms/pseries/hvcserver.c | 7 +--
arch/x86/kernel/cpu/sgx/encl.c | 5 +-
block/bfq-iosched.c | 7 +--
block/blk-core.c | 9 +--
block/blk-mq.c | 16 ++---
block/mq-deadline.c | 8 +--
drivers/accel/qaic/qaic_data.c | 4 +-
drivers/accel/qaic/qaic_drv.c | 4 +-
drivers/acpi/acpi_ipmi.c | 6 +-
drivers/android/binder_alloc.c | 6 +-
drivers/base/dd.c | 6 +-
drivers/base/firmware_loader/main.c | 5 +-
drivers/base/regmap/regmap-debugfs.c | 7 +--
drivers/block/aoe/aoecmd.c | 6 +-
drivers/block/drbd/drbd_nl.c | 8 +--
drivers/block/loop.c | 5 +-
drivers/block/nbd.c | 4 +-
drivers/block/null_blk/main.c | 6 +-
drivers/block/rbd.c | 6 +-
drivers/block/xen-blkback/blkback.c | 8 +--
drivers/char/ipmi/ipmi_msghandler.c | 12 +---
drivers/crypto/ccp/ccp-dev-v3.c | 8 +--
drivers/crypto/ccp/ccp-dev-v5.c | 8 +--
drivers/dma/pl330.c | 5 +-
drivers/dma/ptdma/ptdma-dev.c | 4 +-
drivers/dma/tegra20-apb-dma.c | 22 ++-----
drivers/firmware/cirrus/cs_dsp.c | 15 ++---
drivers/gpio/gpio-rockchip.c | 6 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 +-
drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 13 ++--
.../gpu/drm/nouveau/nvkm/engine/disp/base.c | 10 +---
drivers/gpu/drm/vc4/vc4_gem.c | 15 ++---
drivers/gpu/drm/virtio/virtgpu_gem.c | 5 +-
drivers/gpu/ipu-v3/ipu-image-convert.c | 8 +--
.../hid/intel-ish-hid/ishtp/client-buffers.c | 20 ++-----
drivers/i3c/master.c | 6 +-
drivers/infiniband/core/cma.c | 13 +---
drivers/infiniband/core/mad.c | 7 +--
drivers/infiniband/core/mr_pool.c | 5 +-
drivers/infiniband/core/multicast.c | 5 +-
drivers/infiniband/core/uverbs_main.c | 6 +-
drivers/infiniband/hw/hfi1/mmu_rb.c | 9 +--
drivers/infiniband/hw/hfi1/qp.c | 11 +---
drivers/infiniband/hw/mlx4/alias_GUID.c | 6 +-
drivers/infiniband/ulp/ipoib/ipoib_cm.c | 8 +--
drivers/infiniband/ulp/rtrs/rtrs-srv.c | 12 ++--
drivers/macintosh/windfarm_fcu_controls.c | 6 +-
drivers/macintosh/windfarm_smu_controls.c | 5 +-
drivers/macintosh/windfarm_smu_sat.c | 6 +-
drivers/macintosh/windfarm_smu_sensors.c | 5 +-
drivers/md/bcache/alloc.c | 6 +-
drivers/md/bcache/btree.c | 5 +-
drivers/md/bcache/journal.c | 5 +-
drivers/md/bcache/super.c | 5 +-
drivers/md/dm-bufio.c | 6 +-
drivers/md/dm-stats.c | 4 +-
drivers/md/dm-zoned-metadata.c | 10 +---
drivers/md/raid1.c | 5 +-
drivers/md/raid10.c | 5 +-
drivers/md/raid5-cache.c | 5 +-
drivers/md/raid5.c | 21 ++-----
drivers/media/cec/core/cec-api.c | 17 ++----
drivers/media/common/saa7146/saa7146_vbi.c | 5 +-
drivers/media/common/saa7146/saa7146_video.c | 5 +-
drivers/media/dvb-frontends/rtl2832_sdr.c | 9 +--
drivers/media/mc/mc-entity.c | 7 +--
drivers/media/pci/bt8xx/bttv-driver.c | 13 +---
drivers/media/pci/bt8xx/bttv-vbi.c | 5 +-
drivers/media/pci/cx18/cx18-queue.c | 5 +-
drivers/media/pci/cx18/cx18-streams.c | 8 +--
drivers/media/pci/cx23885/cx23885-417.c | 8 +--
drivers/media/pci/cx23885/cx23885-core.c | 5 +-
drivers/media/pci/cx23885/cx23885-vbi.c | 8 +--
drivers/media/pci/cx23885/cx23885-video.c | 8 +--
drivers/media/pci/cx25821/cx25821-video.c | 8 +--
drivers/media/pci/cx88/cx88-blackbird.c | 15 +----
drivers/media/pci/cx88/cx88-dvb.c | 8 +--
drivers/media/pci/cx88/cx88-mpeg.c | 5 +-
drivers/media/pci/cx88/cx88-vbi.c | 8 +--
drivers/media/pci/cx88/cx88-video.c | 8 +--
drivers/media/pci/dt3155/dt3155.c | 5 +-
.../pci/netup_unidvb/netup_unidvb_core.c | 6 +-
.../media/pci/solo6x10/solo6x10-v4l2-enc.c | 9 +--
drivers/media/pci/solo6x10/solo6x10-v4l2.c | 9 +--
drivers/media/pci/tw5864/tw5864-video.c | 16 ++---
drivers/media/pci/tw68/tw68-video.c | 8 +--
drivers/media/pci/tw686x/tw686x-video.c | 22 ++-----
drivers/media/pci/zoran/zoran_driver.c | 4 +-
.../media/platform/chips-media/coda-common.c | 7 +--
.../platform/nxp/imx8-isi/imx8-isi-video.c | 16 +----
.../platform/rockchip/rkisp1/rkisp1-capture.c | 6 +-
.../platform/samsung/exynos4-is/media-dev.c | 7 +--
.../platform/samsung/s5p-mfc/s5p_mfc_enc.c | 5 +-
.../media/platform/ti/davinci/vpif_capture.c | 5 +-
.../media/platform/ti/davinci/vpif_display.c | 5 +-
drivers/media/platform/ti/omap3isp/ispvideo.c | 8 +--
.../test-drivers/vivid/vivid-kthread-cap.c | 23 +++-----
.../test-drivers/vivid/vivid-kthread-out.c | 23 ++------
.../test-drivers/vivid/vivid-kthread-touch.c | 9 +--
.../media/test-drivers/vivid/vivid-sdr-cap.c | 8 +--
drivers/media/usb/airspy/airspy.c | 8 +--
drivers/media/usb/au0828/au0828-video.c | 7 +--
drivers/media/usb/em28xx/em28xx-video.c | 14 ++---
drivers/media/usb/msi2500/msi2500.c | 9 +--
drivers/media/usb/pwc/pwc-if.c | 8 +--
drivers/media/usb/stk1160/stk1160-v4l.c | 5 +-
drivers/media/usb/uvc/uvc_queue.c | 7 +--
drivers/mtd/ubi/wl.c | 6 +-
drivers/net/ethernet/agere/et131x.c | 6 +-
.../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 7 +--
.../net/ethernet/broadcom/bnx2x/bnx2x_sp.c | 14 +----
drivers/net/ethernet/brocade/bna/bfa_ioc.c | 5 +-
drivers/net/ethernet/brocade/bna/bfa_msgq.c | 6 +-
drivers/net/ethernet/brocade/bna/bna_tx_rx.c | 9 +--
drivers/net/ethernet/qlogic/qed/qed_ooo.c | 17 ++----
.../qlogic/qlcnic/qlcnic_sriov_common.c | 10 +---
drivers/net/ethernet/sfc/siena/siena_sriov.c | 16 +----
drivers/net/ethernet/sun/ldmvsw.c | 4 +-
drivers/net/ethernet/sun/sunvnet.c | 4 +-
drivers/net/wireless/ath/ath10k/qmi.c | 5 +-
drivers/net/wireless/ath/ath11k/qmi.c | 5 +-
drivers/net/wireless/ath/ath12k/qmi.c | 5 +-
drivers/net/wireless/ath/ath6kl/htc_pipe.c | 6 +-
drivers/net/wireless/ath/ath6kl/txrx.c | 6 +-
.../broadcom/brcm80211/brcmfmac/msgbuf.c | 8 +--
drivers/net/wireless/intel/ipw2x00/ipw2100.c | 9 +--
drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 7 +--
drivers/net/wireless/intersil/p54/p54spi.c | 7 +--
.../net/wireless/mediatek/mt76/mt7915/mac.c | 4 +-
.../net/wireless/mediatek/mt76/mt7996/mac.c | 4 +-
drivers/net/wwan/wwan_hwsim.c | 14 ++---
drivers/net/xen-netback/netback.c | 10 +---
drivers/nvme/host/fc.c | 5 +-
drivers/nvme/target/rdma.c | 31 +++-------
drivers/pci/controller/pci-hyperv.c | 12 +---
drivers/pinctrl/pinctrl-rockchip.c | 6 +-
drivers/s390/net/lcs.c | 5 +-
drivers/scsi/aacraid/commctrl.c | 6 +-
drivers/scsi/bnx2i/bnx2i_init.c | 4 +-
drivers/scsi/csiostor/csio_mb.c | 5 +-
drivers/scsi/csiostor/csio_scsi.c | 16 ++---
drivers/scsi/ibmvscsi/ibmvscsi.c | 4 +-
drivers/scsi/libiscsi.c | 10 +---
drivers/scsi/libsas/sas_scsi_host.c | 6 +-
drivers/scsi/lpfc/lpfc_bsg.c | 8 +--
drivers/scsi/lpfc/lpfc_mem.c | 8 +--
drivers/scsi/megaraid/megaraid_sas_base.c | 11 +---
drivers/scsi/mpi3mr/mpi3mr_os.c | 13 ++--
drivers/scsi/mvumi.c | 15 +----
drivers/scsi/qla1280.c | 6 +-
drivers/scsi/qla2xxx/qla_target.c | 18 +++---
.../staging/media/atomisp/pci/atomisp_cmd.c | 5 +-
drivers/staging/media/omap4iss/iss_video.c | 9 +--
drivers/staging/nvec/nvec.c | 4 +-
drivers/target/target_core_tmr.c | 5 +-
drivers/tee/optee/call.c | 5 +-
drivers/thunderbolt/nhi.c | 9 +--
drivers/thunderbolt/tb.c | 8 +--
drivers/usb/core/hcd.c | 7 +--
drivers/usb/core/hub.c | 9 +--
drivers/usb/gadget/composite.c | 7 +--
drivers/usb/gadget/function/f_printer.c | 28 ++-------
drivers/usb/gadget/function/u_ether.c | 14 +----
drivers/usb/gadget/function/u_serial.c | 4 +-
drivers/usb/gadget/function/uvc_queue.c | 5 +-
drivers/usb/gadget/legacy/inode.c | 10 ++--
drivers/usb/gadget/udc/dummy_hcd.c | 6 +-
drivers/usb/host/ehci-q.c | 6 +-
drivers/usb/host/xhci-dbgtty.c | 5 +-
drivers/usb/mon/mon_main.c | 7 +--
drivers/usb/mon/mon_text.c | 6 +-
drivers/usb/usbip/vudc_dev.c | 5 +-
drivers/usb/usbip/vudc_tx.c | 5 +-
drivers/video/fbdev/udlfb.c | 5 +-
drivers/watchdog/watchdog_core.c | 10 +---
drivers/xen/gntalloc.c | 5 +-
drivers/xen/gntdev.c | 6 +-
drivers/xen/xen-pciback/pci_stub.c | 6 +-
drivers/xen/xenbus/xenbus_dev_frontend.c | 5 +-
fs/afs/inode.c | 7 +--
fs/afs/write.c | 5 +-
fs/btrfs/backref.c | 10 +---
fs/btrfs/block-group.c | 47 +++------------
fs/btrfs/disk-io.c | 13 +---
fs/btrfs/inode.c | 12 +---
fs/btrfs/ordered-data.c | 7 +--
fs/btrfs/qgroup.c | 17 ++----
fs/btrfs/raid56.c | 6 +-
fs/btrfs/ref-verify.c | 16 ++---
fs/btrfs/relocation.c | 34 +++--------
fs/btrfs/transaction.c | 26 +++-----
fs/btrfs/tree-log.c | 6 +-
fs/btrfs/volumes.c | 12 +---
fs/btrfs/zstd.c | 5 +-
fs/ceph/caps.c | 17 ++----
fs/ceph/file.c | 6 +-
fs/ceph/mds_client.c | 12 ++--
fs/ceph/snap.c | 19 ++----
fs/char_dev.c | 8 +--
fs/dlm/lockspace.c | 6 +-
fs/dlm/member.c | 4 +-
fs/ecryptfs/kthread.c | 7 +--
fs/exfat/cache.c | 5 +-
fs/ext4/fast_commit.c | 7 +--
fs/ext4/page-io.c | 4 +-
fs/ext4/super.c | 5 +-
fs/fat/cache.c | 5 +-
fs/fuse/dev.c | 7 +--
fs/gfs2/bmap.c | 5 +-
fs/gfs2/glock.c | 4 +-
fs/gfs2/log.c | 8 +--
fs/gfs2/lops.c | 14 +----
fs/gfs2/quota.c | 6 +-
fs/gfs2/recovery.c | 5 +-
fs/gfs2/super.c | 4 +-
fs/inode.c | 7 +--
fs/locks.c | 5 +-
fs/namespace.c | 8 +--
fs/netfs/objects.c | 5 +-
fs/nfs/blocklayout/blocklayout.c | 8 +--
fs/nfs/dir.c | 5 +-
fs/nfs/filelayout/filelayoutdev.c | 11 +---
fs/nfs/flexfilelayout/flexfilelayoutdev.c | 18 +-----
fs/nfs/nfs42xattr.c | 11 +---
fs/nfs/nfs4client.c | 11 +---
fs/nfs/pnfs_nfs.c | 7 +--
fs/nfsd/filecache.c | 10 +---
fs/nfsd/nfs4layouts.c | 6 +-
fs/nfsd/nfs4state.c | 59 +++++--------------
fs/nfsd/nfscache.c | 4 +-
fs/nilfs2/gcinode.c | 4 +-
fs/nilfs2/mdt.c | 6 +-
fs/nilfs2/recovery.c | 14 ++---
fs/nilfs2/segment.c | 7 +--
fs/ocfs2/filecheck.c | 5 +-
fs/pnode.c | 24 +++-----
fs/proc/vmcore.c | 19 +++---
fs/smb/client/smbdirect.c | 6 +-
fs/smb/server/crypto_ctx.c | 7 +--
fs/smb/server/mgmt/share_config.c | 8 +--
fs/ubifs/commit.c | 6 +-
fs/ubifs/gc.c | 7 +--
fs/ubifs/replay.c | 5 +-
fs/ubifs/scan.c | 6 +-
fs/ubifs/super.c | 20 ++-----
fs/xfs/xfs_buf.c | 20 ++-----
fs/xfs/xfs_log_cil.c | 12 ++--
fs/xfs/xfs_qm.c | 8 +--
include/linux/list.h | 29 +++++++++
io_uring/io_uring.c | 9 +--
io_uring/kbuf.c | 8 +--
kernel/audit_tree.c | 9 +--
kernel/kthread.c | 10 ++--
kernel/padata.c | 10 +---
kernel/rcu/srcutiny.c | 6 +-
kernel/sched/fair.c | 6 +-
kernel/signal.c | 5 +-
net/9p/trans_fd.c | 8 +--
net/bluetooth/l2cap_core.c | 5 +-
net/ceph/osd_client.c | 8 +--
net/ceph/osdmap.c | 7 +--
net/ceph/pagelist.c | 15 ++---
net/core/dev.c | 15 +----
net/handshake/netlink.c | 5 +-
net/ipv6/addrconf.c | 16 +----
net/mac80211/ibss.c | 10 +---
net/mac80211/ocb.c | 10 +---
net/rds/send.c | 10 +---
net/rxrpc/call_object.c | 5 +-
net/rxrpc/conn_object.c | 6 +-
net/rxrpc/peer_event.c | 6 +-
net/sunrpc/auth.c | 5 +-
net/sunrpc/backchannel_rqst.c | 7 +--
net/sunrpc/cache.c | 10 +---
net/sunrpc/svc_xprt.c | 10 +---
net/sunrpc/xprt.c | 5 +-
net/sunrpc/xprtrdma/verbs.c | 9 +--
net/vmw_vsock/vmci_transport.c | 7 +--
net/wireless/core.c | 8 +--
net/wireless/reg.c | 7 +--
net/wireless/util.c | 5 +-
security/apparmor/lsm.c | 5 +-
sound/core/misc.c | 4 +-
sound/core/rawmidi.c | 5 +-
sound/core/timer.c | 9 +--
sound/core/ump.c | 5 +-
sound/hda/ext/hdac_ext_controller.c | 5 +-
sound/pci/ctxfi/ctimap.c | 7 +--
sound/pci/ctxfi/ctvmem.c | 14 +----
sound/pci/hda/hda_codec.c | 8 +--
sound/pci/hda/hda_controller.c | 5 +-
sound/soc/codecs/wm0010.c | 5 +-
sound/soc/soc-pcm.c | 5 +-
sound/usb/midi2.c | 6 +-
297 files changed, 645 insertions(+), 1966 deletions(-)

--
2.41.0


2023-10-20 10:31:56

by Miklos Szeredi

[permalink] [raw]
Subject: [RFC PATCH 2/2] replace trivial incarnations of list_for_each_entry_del()

Most of the work was done by coccinelle with variations of the following
semantic patch:

@@
identifier member;
expression head;
type T;
T *pos;
iterator name list_for_each_entry_del;
@@
- while (!list_empty(head)) {
- pos = list_first_entry(head, T, member);
- list_del(&pos->member);
+ list_for_each_entry_del(pos, head, member) {
...
}

This patch replaces 275 instances of list_for_each_entry_del() and 147
instances of list_for_each_entry_del_init() resulting in net 1350 line
removed.

There are a lot more cases, but those are not so simple to detect or
verify.

Signed-off-by: Miklos Szeredi <[email protected]>
---
arch/powerpc/platforms/powermac/pfunc_core.c | 7 +--
arch/powerpc/platforms/powernv/opal-hmi.c | 5 +-
.../platforms/powernv/opal-memory-errors.c | 5 +-
arch/powerpc/platforms/pseries/hvcserver.c | 7 +--
arch/x86/kernel/cpu/sgx/encl.c | 5 +-
block/bfq-iosched.c | 7 +--
block/blk-core.c | 9 +--
block/blk-mq.c | 16 ++---
block/mq-deadline.c | 8 +--
drivers/accel/qaic/qaic_data.c | 4 +-
drivers/accel/qaic/qaic_drv.c | 4 +-
drivers/acpi/acpi_ipmi.c | 6 +-
drivers/android/binder_alloc.c | 6 +-
drivers/base/dd.c | 6 +-
drivers/base/firmware_loader/main.c | 5 +-
drivers/base/regmap/regmap-debugfs.c | 7 +--
drivers/block/aoe/aoecmd.c | 6 +-
drivers/block/drbd/drbd_nl.c | 8 +--
drivers/block/loop.c | 5 +-
drivers/block/nbd.c | 4 +-
drivers/block/null_blk/main.c | 6 +-
drivers/block/rbd.c | 6 +-
drivers/block/xen-blkback/blkback.c | 8 +--
drivers/char/ipmi/ipmi_msghandler.c | 12 +---
drivers/crypto/ccp/ccp-dev-v3.c | 8 +--
drivers/crypto/ccp/ccp-dev-v5.c | 8 +--
drivers/dma/pl330.c | 5 +-
drivers/dma/ptdma/ptdma-dev.c | 4 +-
drivers/dma/tegra20-apb-dma.c | 22 ++-----
drivers/firmware/cirrus/cs_dsp.c | 15 ++---
drivers/gpio/gpio-rockchip.c | 6 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 +-
drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 13 ++--
.../gpu/drm/nouveau/nvkm/engine/disp/base.c | 10 +---
drivers/gpu/drm/vc4/vc4_gem.c | 15 ++---
drivers/gpu/drm/virtio/virtgpu_gem.c | 5 +-
drivers/gpu/ipu-v3/ipu-image-convert.c | 8 +--
.../hid/intel-ish-hid/ishtp/client-buffers.c | 20 ++-----
drivers/i3c/master.c | 6 +-
drivers/infiniband/core/cma.c | 13 +---
drivers/infiniband/core/mad.c | 7 +--
drivers/infiniband/core/mr_pool.c | 5 +-
drivers/infiniband/core/multicast.c | 5 +-
drivers/infiniband/core/uverbs_main.c | 6 +-
drivers/infiniband/hw/hfi1/mmu_rb.c | 9 +--
drivers/infiniband/hw/hfi1/qp.c | 11 +---
drivers/infiniband/hw/mlx4/alias_GUID.c | 6 +-
drivers/infiniband/ulp/ipoib/ipoib_cm.c | 8 +--
drivers/infiniband/ulp/rtrs/rtrs-srv.c | 12 ++--
drivers/macintosh/windfarm_fcu_controls.c | 6 +-
drivers/macintosh/windfarm_smu_controls.c | 5 +-
drivers/macintosh/windfarm_smu_sat.c | 6 +-
drivers/macintosh/windfarm_smu_sensors.c | 5 +-
drivers/md/bcache/alloc.c | 6 +-
drivers/md/bcache/btree.c | 5 +-
drivers/md/bcache/journal.c | 5 +-
drivers/md/bcache/super.c | 5 +-
drivers/md/dm-bufio.c | 6 +-
drivers/md/dm-stats.c | 4 +-
drivers/md/dm-zoned-metadata.c | 10 +---
drivers/md/raid1.c | 5 +-
drivers/md/raid10.c | 5 +-
drivers/md/raid5-cache.c | 5 +-
drivers/md/raid5.c | 21 ++-----
drivers/media/cec/core/cec-api.c | 17 ++----
drivers/media/common/saa7146/saa7146_vbi.c | 5 +-
drivers/media/common/saa7146/saa7146_video.c | 5 +-
drivers/media/dvb-frontends/rtl2832_sdr.c | 9 +--
drivers/media/mc/mc-entity.c | 7 +--
drivers/media/pci/bt8xx/bttv-driver.c | 13 +---
drivers/media/pci/bt8xx/bttv-vbi.c | 5 +-
drivers/media/pci/cx18/cx18-queue.c | 5 +-
drivers/media/pci/cx18/cx18-streams.c | 8 +--
drivers/media/pci/cx23885/cx23885-417.c | 8 +--
drivers/media/pci/cx23885/cx23885-core.c | 5 +-
drivers/media/pci/cx23885/cx23885-vbi.c | 8 +--
drivers/media/pci/cx23885/cx23885-video.c | 8 +--
drivers/media/pci/cx25821/cx25821-video.c | 8 +--
drivers/media/pci/cx88/cx88-blackbird.c | 15 +----
drivers/media/pci/cx88/cx88-dvb.c | 8 +--
drivers/media/pci/cx88/cx88-mpeg.c | 5 +-
drivers/media/pci/cx88/cx88-vbi.c | 8 +--
drivers/media/pci/cx88/cx88-video.c | 8 +--
drivers/media/pci/dt3155/dt3155.c | 5 +-
.../pci/netup_unidvb/netup_unidvb_core.c | 6 +-
.../media/pci/solo6x10/solo6x10-v4l2-enc.c | 9 +--
drivers/media/pci/solo6x10/solo6x10-v4l2.c | 9 +--
drivers/media/pci/tw5864/tw5864-video.c | 16 ++---
drivers/media/pci/tw68/tw68-video.c | 8 +--
drivers/media/pci/tw686x/tw686x-video.c | 22 ++-----
drivers/media/pci/zoran/zoran_driver.c | 4 +-
.../media/platform/chips-media/coda-common.c | 7 +--
.../platform/nxp/imx8-isi/imx8-isi-video.c | 16 +----
.../platform/rockchip/rkisp1/rkisp1-capture.c | 6 +-
.../platform/samsung/exynos4-is/media-dev.c | 7 +--
.../platform/samsung/s5p-mfc/s5p_mfc_enc.c | 5 +-
.../media/platform/ti/davinci/vpif_capture.c | 5 +-
.../media/platform/ti/davinci/vpif_display.c | 5 +-
drivers/media/platform/ti/omap3isp/ispvideo.c | 8 +--
.../test-drivers/vivid/vivid-kthread-cap.c | 23 +++-----
.../test-drivers/vivid/vivid-kthread-out.c | 23 ++------
.../test-drivers/vivid/vivid-kthread-touch.c | 9 +--
.../media/test-drivers/vivid/vivid-sdr-cap.c | 8 +--
drivers/media/usb/airspy/airspy.c | 8 +--
drivers/media/usb/au0828/au0828-video.c | 7 +--
drivers/media/usb/em28xx/em28xx-video.c | 14 ++---
drivers/media/usb/msi2500/msi2500.c | 9 +--
drivers/media/usb/pwc/pwc-if.c | 8 +--
drivers/media/usb/stk1160/stk1160-v4l.c | 5 +-
drivers/media/usb/uvc/uvc_queue.c | 7 +--
drivers/mtd/ubi/wl.c | 6 +-
drivers/net/ethernet/agere/et131x.c | 6 +-
.../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 7 +--
.../net/ethernet/broadcom/bnx2x/bnx2x_sp.c | 14 +----
drivers/net/ethernet/brocade/bna/bfa_ioc.c | 5 +-
drivers/net/ethernet/brocade/bna/bfa_msgq.c | 6 +-
drivers/net/ethernet/brocade/bna/bna_tx_rx.c | 9 +--
drivers/net/ethernet/qlogic/qed/qed_ooo.c | 17 ++----
.../qlogic/qlcnic/qlcnic_sriov_common.c | 10 +---
drivers/net/ethernet/sfc/siena/siena_sriov.c | 16 +----
drivers/net/ethernet/sun/ldmvsw.c | 4 +-
drivers/net/ethernet/sun/sunvnet.c | 4 +-
drivers/net/wireless/ath/ath10k/qmi.c | 5 +-
drivers/net/wireless/ath/ath11k/qmi.c | 5 +-
drivers/net/wireless/ath/ath12k/qmi.c | 5 +-
drivers/net/wireless/ath/ath6kl/htc_pipe.c | 6 +-
drivers/net/wireless/ath/ath6kl/txrx.c | 6 +-
.../broadcom/brcm80211/brcmfmac/msgbuf.c | 8 +--
drivers/net/wireless/intel/ipw2x00/ipw2100.c | 9 +--
drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 7 +--
drivers/net/wireless/intersil/p54/p54spi.c | 7 +--
.../net/wireless/mediatek/mt76/mt7915/mac.c | 4 +-
.../net/wireless/mediatek/mt76/mt7996/mac.c | 4 +-
drivers/net/wwan/wwan_hwsim.c | 14 ++---
drivers/net/xen-netback/netback.c | 10 +---
drivers/nvme/host/fc.c | 5 +-
drivers/nvme/target/rdma.c | 31 +++-------
drivers/pci/controller/pci-hyperv.c | 12 +---
drivers/pinctrl/pinctrl-rockchip.c | 6 +-
drivers/s390/net/lcs.c | 5 +-
drivers/scsi/aacraid/commctrl.c | 6 +-
drivers/scsi/bnx2i/bnx2i_init.c | 4 +-
drivers/scsi/csiostor/csio_mb.c | 5 +-
drivers/scsi/csiostor/csio_scsi.c | 16 ++---
drivers/scsi/ibmvscsi/ibmvscsi.c | 4 +-
drivers/scsi/libiscsi.c | 10 +---
drivers/scsi/libsas/sas_scsi_host.c | 6 +-
drivers/scsi/lpfc/lpfc_bsg.c | 8 +--
drivers/scsi/lpfc/lpfc_mem.c | 8 +--
drivers/scsi/megaraid/megaraid_sas_base.c | 11 +---
drivers/scsi/mpi3mr/mpi3mr_os.c | 13 ++--
drivers/scsi/mvumi.c | 15 +----
drivers/scsi/qla1280.c | 6 +-
drivers/scsi/qla2xxx/qla_target.c | 18 +++---
.../staging/media/atomisp/pci/atomisp_cmd.c | 5 +-
drivers/staging/media/omap4iss/iss_video.c | 9 +--
drivers/staging/nvec/nvec.c | 4 +-
drivers/target/target_core_tmr.c | 5 +-
drivers/tee/optee/call.c | 5 +-
drivers/thunderbolt/nhi.c | 9 +--
drivers/thunderbolt/tb.c | 8 +--
drivers/usb/core/hcd.c | 7 +--
drivers/usb/core/hub.c | 9 +--
drivers/usb/gadget/composite.c | 7 +--
drivers/usb/gadget/function/f_printer.c | 28 ++-------
drivers/usb/gadget/function/u_ether.c | 14 +----
drivers/usb/gadget/function/u_serial.c | 4 +-
drivers/usb/gadget/function/uvc_queue.c | 5 +-
drivers/usb/gadget/legacy/inode.c | 10 ++--
drivers/usb/gadget/udc/dummy_hcd.c | 6 +-
drivers/usb/host/ehci-q.c | 6 +-
drivers/usb/host/xhci-dbgtty.c | 5 +-
drivers/usb/mon/mon_main.c | 7 +--
drivers/usb/mon/mon_text.c | 6 +-
drivers/usb/usbip/vudc_dev.c | 5 +-
drivers/usb/usbip/vudc_tx.c | 5 +-
drivers/video/fbdev/udlfb.c | 5 +-
drivers/watchdog/watchdog_core.c | 10 +---
drivers/xen/gntalloc.c | 5 +-
drivers/xen/gntdev.c | 6 +-
drivers/xen/xen-pciback/pci_stub.c | 6 +-
drivers/xen/xenbus/xenbus_dev_frontend.c | 5 +-
fs/afs/inode.c | 7 +--
fs/afs/write.c | 5 +-
fs/btrfs/backref.c | 10 +---
fs/btrfs/block-group.c | 47 +++------------
fs/btrfs/disk-io.c | 13 +---
fs/btrfs/inode.c | 12 +---
fs/btrfs/ordered-data.c | 7 +--
fs/btrfs/qgroup.c | 17 ++----
fs/btrfs/raid56.c | 6 +-
fs/btrfs/ref-verify.c | 16 ++---
fs/btrfs/relocation.c | 34 +++--------
fs/btrfs/transaction.c | 26 +++-----
fs/btrfs/tree-log.c | 6 +-
fs/btrfs/volumes.c | 12 +---
fs/btrfs/zstd.c | 5 +-
fs/ceph/caps.c | 17 ++----
fs/ceph/file.c | 6 +-
fs/ceph/mds_client.c | 12 ++--
fs/ceph/snap.c | 19 ++----
fs/char_dev.c | 8 +--
fs/dlm/lockspace.c | 6 +-
fs/dlm/member.c | 4 +-
fs/ecryptfs/kthread.c | 7 +--
fs/exfat/cache.c | 5 +-
fs/ext4/fast_commit.c | 7 +--
fs/ext4/page-io.c | 4 +-
fs/ext4/super.c | 5 +-
fs/fat/cache.c | 5 +-
fs/fuse/dev.c | 7 +--
fs/gfs2/bmap.c | 5 +-
fs/gfs2/glock.c | 4 +-
fs/gfs2/log.c | 8 +--
fs/gfs2/lops.c | 14 +----
fs/gfs2/quota.c | 6 +-
fs/gfs2/recovery.c | 5 +-
fs/gfs2/super.c | 4 +-
fs/inode.c | 7 +--
fs/locks.c | 5 +-
fs/namespace.c | 8 +--
fs/netfs/objects.c | 5 +-
fs/nfs/blocklayout/blocklayout.c | 8 +--
fs/nfs/dir.c | 5 +-
fs/nfs/filelayout/filelayoutdev.c | 11 +---
fs/nfs/flexfilelayout/flexfilelayoutdev.c | 18 +-----
fs/nfs/nfs42xattr.c | 11 +---
fs/nfs/nfs4client.c | 11 +---
fs/nfs/pnfs_nfs.c | 7 +--
fs/nfsd/filecache.c | 10 +---
fs/nfsd/nfs4layouts.c | 6 +-
fs/nfsd/nfs4state.c | 59 +++++--------------
fs/nfsd/nfscache.c | 4 +-
fs/nilfs2/gcinode.c | 4 +-
fs/nilfs2/mdt.c | 6 +-
fs/nilfs2/recovery.c | 14 ++---
fs/nilfs2/segment.c | 7 +--
fs/ocfs2/filecheck.c | 5 +-
fs/pnode.c | 24 +++-----
fs/proc/vmcore.c | 19 +++---
fs/smb/client/smbdirect.c | 6 +-
fs/smb/server/crypto_ctx.c | 7 +--
fs/smb/server/mgmt/share_config.c | 8 +--
fs/ubifs/commit.c | 6 +-
fs/ubifs/gc.c | 7 +--
fs/ubifs/replay.c | 5 +-
fs/ubifs/scan.c | 6 +-
fs/ubifs/super.c | 20 ++-----
fs/xfs/xfs_buf.c | 20 ++-----
fs/xfs/xfs_log_cil.c | 12 ++--
fs/xfs/xfs_qm.c | 8 +--
io_uring/io_uring.c | 9 +--
io_uring/kbuf.c | 8 +--
kernel/audit_tree.c | 9 +--
kernel/kthread.c | 10 ++--
kernel/padata.c | 10 +---
kernel/rcu/srcutiny.c | 6 +-
kernel/sched/fair.c | 6 +-
kernel/signal.c | 5 +-
net/9p/trans_fd.c | 8 +--
net/bluetooth/l2cap_core.c | 5 +-
net/ceph/osd_client.c | 8 +--
net/ceph/osdmap.c | 7 +--
net/ceph/pagelist.c | 15 ++---
net/core/dev.c | 15 +----
net/handshake/netlink.c | 5 +-
net/ipv6/addrconf.c | 16 +----
net/mac80211/ibss.c | 10 +---
net/mac80211/ocb.c | 10 +---
net/rds/send.c | 10 +---
net/rxrpc/call_object.c | 5 +-
net/rxrpc/conn_object.c | 6 +-
net/rxrpc/peer_event.c | 6 +-
net/sunrpc/auth.c | 5 +-
net/sunrpc/backchannel_rqst.c | 7 +--
net/sunrpc/cache.c | 10 +---
net/sunrpc/svc_xprt.c | 10 +---
net/sunrpc/xprt.c | 5 +-
net/sunrpc/xprtrdma/verbs.c | 9 +--
net/vmw_vsock/vmci_transport.c | 7 +--
net/wireless/core.c | 8 +--
net/wireless/reg.c | 7 +--
net/wireless/util.c | 5 +-
security/apparmor/lsm.c | 5 +-
sound/core/misc.c | 4 +-
sound/core/rawmidi.c | 5 +-
sound/core/timer.c | 9 +--
sound/core/ump.c | 5 +-
sound/hda/ext/hdac_ext_controller.c | 5 +-
sound/pci/ctxfi/ctimap.c | 7 +--
sound/pci/ctxfi/ctvmem.c | 14 +----
sound/pci/hda/hda_codec.c | 8 +--
sound/pci/hda/hda_controller.c | 5 +-
sound/soc/codecs/wm0010.c | 5 +-
sound/soc/soc-pcm.c | 5 +-
sound/usb/midi2.c | 6 +-
296 files changed, 616 insertions(+), 1966 deletions(-)

diff --git a/arch/powerpc/platforms/powermac/pfunc_core.c b/arch/powerpc/platforms/powermac/pfunc_core.c
index 22741ddfd5b2..0bde0a0dcdf6 100644
--- a/arch/powerpc/platforms/powermac/pfunc_core.c
+++ b/arch/powerpc/platforms/powermac/pfunc_core.c
@@ -779,6 +779,7 @@ EXPORT_SYMBOL_GPL(pmf_put_function);

void pmf_unregister_driver(struct device_node *np)
{
+ struct pmf_function *func;
struct pmf_device *dev;
unsigned long flags;

@@ -793,12 +794,8 @@ void pmf_unregister_driver(struct device_node *np)
}
list_del(&dev->link);

- while(!list_empty(&dev->functions)) {
- struct pmf_function *func =
- list_entry(dev->functions.next, typeof(*func), link);
- list_del(&func->link);
+ list_for_each_entry_del(func, &dev->functions, link) {
__pmf_put_function(func);
- }

pmf_put_device(dev);
spin_unlock_irqrestore(&pmf_lock, flags);
diff --git a/arch/powerpc/platforms/powernv/opal-hmi.c b/arch/powerpc/platforms/powernv/opal-hmi.c
index f0c1830deb51..c345bfe53e8c 100644
--- a/arch/powerpc/platforms/powernv/opal-hmi.c
+++ b/arch/powerpc/platforms/powernv/opal-hmi.c
@@ -277,10 +277,7 @@ static void hmi_event_handler(struct work_struct *work)
int unrecoverable = 0;

spin_lock_irqsave(&opal_hmi_evt_lock, flags);
- while (!list_empty(&opal_hmi_evt_list)) {
- msg_node = list_entry(opal_hmi_evt_list.next,
- struct OpalHmiEvtNode, list);
- list_del(&msg_node->list);
+ list_for_each_entry_del(msg_node, &opal_hmi_evt_list, list) {
spin_unlock_irqrestore(&opal_hmi_evt_lock, flags);

hmi_evt = (struct OpalHMIEvent *) &msg_node->hmi_evt;
diff --git a/arch/powerpc/platforms/powernv/opal-memory-errors.c b/arch/powerpc/platforms/powernv/opal-memory-errors.c
index a1754a28265d..ae311b9e320c 100644
--- a/arch/powerpc/platforms/powernv/opal-memory-errors.c
+++ b/arch/powerpc/platforms/powernv/opal-memory-errors.c
@@ -58,10 +58,7 @@ static void handle_memory_error(void)
struct OpalMsgNode *msg_node;

spin_lock_irqsave(&opal_mem_err_lock, flags);
- while (!list_empty(&opal_memory_err_list)) {
- msg_node = list_entry(opal_memory_err_list.next,
- struct OpalMsgNode, list);
- list_del(&msg_node->list);
+ list_for_each_entry_del(msg_node, &opal_memory_err_list, list) {
spin_unlock_irqrestore(&opal_mem_err_lock, flags);

merr_evt = (struct OpalMemoryErrorData *)
diff --git a/arch/powerpc/platforms/pseries/hvcserver.c b/arch/powerpc/platforms/pseries/hvcserver.c
index d48c9c7ce10f..ad6ef95e9683 100644
--- a/arch/powerpc/platforms/pseries/hvcserver.c
+++ b/arch/powerpc/platforms/pseries/hvcserver.c
@@ -62,17 +62,12 @@ static int hvcs_convert(long to_convert)
int hvcs_free_partner_info(struct list_head *head)
{
struct hvcs_partner_info *pi;
- struct list_head *element;

if (!head)
return -EINVAL;

- while (!list_empty(head)) {
- element = head->next;
- pi = list_entry(element, struct hvcs_partner_info, node);
- list_del(element);
+ list_for_each_entry_del(pi, head, node)
kfree(pi);
- }

return 0;
}
diff --git a/arch/x86/kernel/cpu/sgx/encl.c b/arch/x86/kernel/cpu/sgx/encl.c
index 279148e72459..ce5fbe8ef27e 100644
--- a/arch/x86/kernel/cpu/sgx/encl.c
+++ b/arch/x86/kernel/cpu/sgx/encl.c
@@ -745,10 +745,7 @@ void sgx_encl_release(struct kref *ref)
encl->secs.epc_page = NULL;
}

- while (!list_empty(&encl->va_pages)) {
- va_page = list_first_entry(&encl->va_pages, struct sgx_va_page,
- list);
- list_del(&va_page->list);
+ list_for_each_entry_del(va_page, &encl->va_pages, list) {
sgx_encl_free_epc_page(va_page->epc_page);
kfree(va_page);
}
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 3cce6de464a7..4604e7031eb8 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -6296,13 +6296,10 @@ static void bfq_insert_requests(struct blk_mq_hw_ctx *hctx,
struct list_head *list,
blk_insert_t flags)
{
- while (!list_empty(list)) {
- struct request *rq;
+ struct request *rq;

- rq = list_first_entry(list, struct request, queuelist);
- list_del_init(&rq->queuelist);
+ list_for_each_entry_del_init(rq, list, queuelist)
bfq_insert_request(hctx, rq, flags);
- }
}

static void bfq_update_hw_tag(struct bfq_data *bfqd)
diff --git a/block/blk-core.c b/block/blk-core.c
index 9d51e9894ece..c8b13562908c 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1098,15 +1098,12 @@ static void flush_plug_callbacks(struct blk_plug *plug, bool from_schedule)
LIST_HEAD(callbacks);

while (!list_empty(&plug->cb_list)) {
+ struct blk_plug_cb *cb;
+
list_splice_init(&plug->cb_list, &callbacks);

- while (!list_empty(&callbacks)) {
- struct blk_plug_cb *cb = list_first_entry(&callbacks,
- struct blk_plug_cb,
- list);
- list_del(&cb->list);
+ list_for_each_entry_del(cb, &callbacks, list)
cb->callback(cb, from_schedule);
- }
}
}

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 1fafd54dce3c..87992c13005a 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1488,11 +1488,8 @@ static void blk_mq_requeue_work(struct work_struct *work)
}
}

- while (!list_empty(&flush_list)) {
- rq = list_entry(flush_list.next, struct request, queuelist);
- list_del_init(&rq->queuelist);
+ list_for_each_entry_del_init(rq, &flush_list, queuelist)
blk_mq_insert_request(rq, 0);
- }

blk_mq_run_hw_queues(q, false);
}
@@ -2821,14 +2818,11 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule)
static void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
struct list_head *list)
{
+ struct request *rq;
int queued = 0;
blk_status_t ret = BLK_STS_OK;

- while (!list_empty(list)) {
- struct request *rq = list_first_entry(list, struct request,
- queuelist);
-
- list_del_init(&rq->queuelist);
+ list_for_each_entry_del_init(rq, list, queuelist) {
ret = blk_mq_request_issue_directly(rq, list_empty(list));
switch (ret) {
case BLK_STS_OK:
@@ -3271,9 +3265,7 @@ void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,

blk_mq_clear_rq_mapping(drv_tags, tags);

- while (!list_empty(&tags->page_list)) {
- page = list_first_entry(&tags->page_list, struct page, lru);
- list_del_init(&page->lru);
+ list_for_each_entry_del_init(page, &tags->page_list, lru) {
/*
* Remove kmemleak object previously allocated in
* blk_mq_alloc_rqs().
diff --git a/block/mq-deadline.c b/block/mq-deadline.c
index f958e79277b8..94bda20d6486 100644
--- a/block/mq-deadline.c
+++ b/block/mq-deadline.c
@@ -865,18 +865,14 @@ static void dd_insert_requests(struct blk_mq_hw_ctx *hctx,
struct list_head *list,
blk_insert_t flags)
{
+ struct request *rq;
struct request_queue *q = hctx->queue;
struct deadline_data *dd = q->elevator->elevator_data;
LIST_HEAD(free);

spin_lock(&dd->lock);
- while (!list_empty(list)) {
- struct request *rq;
-
- rq = list_first_entry(list, struct request, queuelist);
- list_del_init(&rq->queuelist);
+ list_for_each_entry_del_init(rq, list, queuelist)
dd_insert_request(hctx, rq, flags, &free);
- }
spin_unlock(&dd->lock);

blk_mq_free_requests(&free);
diff --git a/drivers/accel/qaic/qaic_data.c b/drivers/accel/qaic/qaic_data.c
index f4b06792c6f1..9cf985736db1 100644
--- a/drivers/accel/qaic/qaic_data.c
+++ b/drivers/accel/qaic/qaic_data.c
@@ -1805,10 +1805,8 @@ static void empty_xfer_list(struct qaic_device *qdev, struct dma_bridge_chan *db
struct qaic_bo *bo;

spin_lock_irqsave(&dbc->xfer_lock, flags);
- while (!list_empty(&dbc->xfer_list)) {
- bo = list_first_entry(&dbc->xfer_list, typeof(*bo), xfer_list);
+ list_for_each_entry_del(bo, &dbc->xfer_list, xfer_list) {
bo->queued = false;
- list_del(&bo->xfer_list);
spin_unlock_irqrestore(&dbc->xfer_lock, flags);
dma_sync_sgtable_for_cpu(&qdev->pdev->dev, bo->sgt, bo->dir);
complete_all(&bo->xfer_done);
diff --git a/drivers/accel/qaic/qaic_drv.c b/drivers/accel/qaic/qaic_drv.c
index b5de82e6eb4d..5e392a4ef5e1 100644
--- a/drivers/accel/qaic/qaic_drv.c
+++ b/drivers/accel/qaic/qaic_drv.c
@@ -243,9 +243,7 @@ static void qaic_destroy_drm_device(struct qaic_device *qdev, s32 partition_id)
* user list.
*/
mutex_lock(&qddev->users_mutex);
- while (!list_empty(&qddev->users)) {
- usr = list_first_entry(&qddev->users, struct qaic_user, node);
- list_del_init(&usr->node);
+ list_for_each_entry_del_init(usr, &qddev->users, node) {
kref_get(&usr->ref_count);
usr->qddev = NULL;
mutex_unlock(&qddev->users_mutex);
diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c
index 0555f68c2dfd..42df6b201f18 100644
--- a/drivers/acpi/acpi_ipmi.c
+++ b/drivers/acpi/acpi_ipmi.c
@@ -335,11 +335,7 @@ static void ipmi_flush_tx_msg(struct acpi_ipmi_device *ipmi)
* ipmi_recv_msg(s) are freed after invoking ipmi_destroy_user().
*/
spin_lock_irqsave(&ipmi->tx_msg_lock, flags);
- while (!list_empty(&ipmi->tx_msg_list)) {
- tx_msg = list_first_entry(&ipmi->tx_msg_list,
- struct acpi_ipmi_msg,
- head);
- list_del(&tx_msg->head);
+ list_for_each_entry_del(tx_msg, &ipmi->tx_msg_list, head) {
spin_unlock_irqrestore(&ipmi->tx_msg_lock, flags);

/* wake up the sleep thread on the Tx msg */
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
index e3db8297095a..b74ffcde674c 100644
--- a/drivers/android/binder_alloc.c
+++ b/drivers/android/binder_alloc.c
@@ -827,12 +827,8 @@ void binder_alloc_deferred_release(struct binder_alloc *alloc)
buffers++;
}

- while (!list_empty(&alloc->buffers)) {
- buffer = list_first_entry(&alloc->buffers,
- struct binder_buffer, entry);
+ list_for_each_entry_del(buffer, &alloc->buffers, entry) {
WARN_ON(!buffer->free);
-
- list_del(&buffer->entry);
WARN_ON_ONCE(!list_empty(&alloc->buffers));
kfree(buffer);
}
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index a528cec24264..1796659df9b9 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -95,11 +95,9 @@ static void deferred_probe_work_func(struct work_struct *work)
* from under our feet.
*/
mutex_lock(&deferred_probe_mutex);
- while (!list_empty(&deferred_probe_active_list)) {
- private = list_first_entry(&deferred_probe_active_list,
- typeof(*dev->p), deferred_probe);
+ list_for_each_entry_del_init(private, &deferred_probe_active_list,
+ deferred_probe) {
dev = private->device;
- list_del_init(&private->deferred_probe);

get_device(dev);

diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index b58c42f1b1ce..7ee7e2cdc3b3 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -1439,10 +1439,7 @@ static void __device_uncache_fw_images(void)
struct fw_cache_entry *fce;

spin_lock(&fwc->name_lock);
- while (!list_empty(&fwc->fw_names)) {
- fce = list_entry(fwc->fw_names.next,
- struct fw_cache_entry, list);
- list_del(&fce->list);
+ list_for_each_entry_del(fce, &fwc->fw_names, list) {
spin_unlock(&fwc->name_lock);

uncache_firmware(fce->name);
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index f36027591e1a..84ff2d11d753 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -68,13 +68,8 @@ static void regmap_debugfs_free_dump_cache(struct regmap *map)
{
struct regmap_debugfs_off_cache *c;

- while (!list_empty(&map->debugfs_off_cache)) {
- c = list_first_entry(&map->debugfs_off_cache,
- struct regmap_debugfs_off_cache,
- list);
- list_del(&c->list);
+ list_for_each_entry_del(c, &map->debugfs_off_cache, list)
kfree(c);
- }
}

static bool regmap_printable(struct regmap *map, unsigned int reg)
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index d7317425be51..9c20aa87ad84 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -1644,17 +1644,13 @@ aoe_flush_iocq_by_index(int id)
struct frame *f;
struct aoedev *d;
LIST_HEAD(flist);
- struct list_head *pos;
struct sk_buff *skb;
ulong flags;

spin_lock_irqsave(&iocq[id].lock, flags);
list_splice_init(&iocq[id].head, &flist);
spin_unlock_irqrestore(&iocq[id].lock, flags);
- while (!list_empty(&flist)) {
- pos = flist.next;
- list_del(pos);
- f = list_entry(pos, struct frame, head);
+ list_for_each_entry_del(f, &flist, head) {
d = f->t->d;
skb = f->r_skb;
spin_lock_irqsave(&d->lock, flags);
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index d3538bd83fb3..d34164a12798 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -4836,12 +4836,10 @@ static int notify_initial_state_done(struct sk_buff *skb, unsigned int seq)

static void free_state_changes(struct list_head *list)
{
- while (!list_empty(list)) {
- struct drbd_state_change *state_change =
- list_first_entry(list, struct drbd_state_change, list);
- list_del(&state_change->list);
+ struct drbd_state_change *state_change;
+
+ list_for_each_entry_del(state_change, list, list)
forget_state_change(state_change);
- }
}

static unsigned int notifications_for_state_change(struct drbd_state_change *state_change)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 9f2d412fc560..282983bf9e30 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1941,10 +1941,7 @@ static void loop_process_work(struct loop_worker *worker,

current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
spin_lock_irq(&lo->lo_work_lock);
- while (!list_empty(cmd_list)) {
- cmd = container_of(
- cmd_list->next, struct loop_cmd, list_entry);
- list_del(cmd_list->next);
+ list_for_each_entry_del(cmd, cmd_list, list_entry) {
spin_unlock_irq(&lo->lo_work_lock);

loop_handle_cmd(cmd);
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 800f131222fc..cee388b441d2 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -2564,9 +2564,7 @@ static void __exit nbd_cleanup(void)
idr_for_each(&nbd_index_idr, &nbd_exit_cb, &del_list);
mutex_unlock(&nbd_index_mutex);

- while (!list_empty(&del_list)) {
- nbd = list_first_entry(&del_list, struct nbd_device, list);
- list_del_init(&nbd->list);
+ list_for_each_entry_del_init(nbd, &del_list, list) {
if (refcount_read(&nbd->config_refs))
pr_err("possibly leaking nbd_config (ref %d)\n",
refcount_read(&nbd->config_refs));
diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c
index 968090935eb2..26104a7cf5b0 100644
--- a/drivers/block/null_blk/main.c
+++ b/drivers/block/null_blk/main.c
@@ -1640,6 +1640,7 @@ static void null_map_queues(struct blk_mq_tag_set *set)

static int null_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
{
+ struct request *req;
struct nullb_queue *nq = hctx->driver_data;
LIST_HEAD(list);
int nr = 0;
@@ -1651,12 +1652,9 @@ static int null_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
blk_mq_set_request_complete(rq);
spin_unlock(&nq->poll_lock);

- while (!list_empty(&list)) {
+ list_for_each_entry_del_init(req, &list, queuelist) {
struct nullb_cmd *cmd;
- struct request *req;

- req = list_first_entry(&list, struct request, queuelist);
- list_del_init(&req->queuelist);
cmd = blk_mq_rq_to_pdu(req);
cmd->error = null_process_cmd(cmd, req_op(req), blk_rq_pos(req),
blk_rq_sectors(req));
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index a999b698b131..142747ce3e52 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1493,10 +1493,8 @@ static void rbd_obj_request_destroy(struct kref *kref)

dout("%s: obj %p\n", __func__, obj_request);

- while (!list_empty(&obj_request->osd_reqs)) {
- osd_req = list_first_entry(&obj_request->osd_reqs,
- struct ceph_osd_request, r_private_item);
- list_del_init(&osd_req->r_private_item);
+ list_for_each_entry_del_init(osd_req, &obj_request->osd_reqs,
+ r_private_item) {
ceph_osdc_put_request(osd_req);
}

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index c362f4ad80ab..5cb0c378540c 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -300,12 +300,8 @@ void xen_blkbk_unmap_purged_grants(struct work_struct *work)
unmap_data.unmap_ops = unmap;
unmap_data.kunmap_ops = NULL;

- while(!list_empty(&ring->persistent_purge_list)) {
- persistent_gnt = list_first_entry(&ring->persistent_purge_list,
- struct persistent_gnt,
- remove_node);
- list_del(&persistent_gnt->remove_node);
-
+ list_for_each_entry_del(persistent_gnt, &ring->persistent_purge_list,
+ remove_node) {
gnttab_set_unmap_op(&unmap[segs_to_unmap],
vaddr(persistent_gnt->page),
GNTMAP_host_map,
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
index 186f1fee7534..31ee10ac4ea8 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -3723,7 +3723,6 @@ static void cleanup_smi_msgs(struct ipmi_smi *intf)
int i;
struct seq_table *ent;
struct ipmi_smi_msg *msg;
- struct list_head *entry;
struct list_head tmplist;

/* Clear out our transmit queues and hold the messages. */
@@ -3743,12 +3742,8 @@ static void cleanup_smi_msgs(struct ipmi_smi *intf)
* Return errors for all pending messages in queue and in the
* tables waiting for remote responses.
*/
- while (!list_empty(&tmplist)) {
- entry = tmplist.next;
- list_del(entry);
- msg = list_entry(entry, struct ipmi_smi_msg, link);
+ list_for_each_entry_del(msg, &tmplist, link)
deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED);
- }

for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {
ent = &intf->seq_table[i];
@@ -4764,10 +4759,7 @@ static void handle_new_recv_msgs(struct ipmi_smi *intf)
/* See if any waiting messages need to be processed. */
if (!run_to_completion)
spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags);
- while (!list_empty(&intf->waiting_rcv_msgs)) {
- smi_msg = list_entry(intf->waiting_rcv_msgs.next,
- struct ipmi_smi_msg, link);
- list_del(&smi_msg->link);
+ list_for_each_entry_del(smi_msg, &intf->waiting_rcv_msgs, link) {
if (!run_to_completion)
spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock,
flags);
diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c
index fe69053b2394..f07b14efb5e4 100644
--- a/drivers/crypto/ccp/ccp-dev-v3.c
+++ b/drivers/crypto/ccp/ccp-dev-v3.c
@@ -550,16 +550,12 @@ static void ccp_destroy(struct ccp_device *ccp)
dma_pool_destroy(ccp->cmd_q[i].dma_pool);

/* Flush the cmd and backlog queue */
- while (!list_empty(&ccp->cmd)) {
+ list_for_each_entry_del(cmd, &ccp->cmd, entry) {
/* Invoke the callback directly with an error code */
- cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry);
- list_del(&cmd->entry);
cmd->callback(cmd->data, -ENODEV);
}
- while (!list_empty(&ccp->backlog)) {
+ list_for_each_entry_del(cmd, &ccp->backlog, entry) {
/* Invoke the callback directly with an error code */
- cmd = list_first_entry(&ccp->backlog, struct ccp_cmd, entry);
- list_del(&cmd->entry);
cmd->callback(cmd->data, -ENODEV);
}
}
diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c
index 7b73332d6aa1..8c1002eea436 100644
--- a/drivers/crypto/ccp/ccp-dev-v5.c
+++ b/drivers/crypto/ccp/ccp-dev-v5.c
@@ -1048,16 +1048,12 @@ static void ccp5_destroy(struct ccp_device *ccp)
sp_free_ccp_irq(ccp->sp, ccp);

/* Flush the cmd and backlog queue */
- while (!list_empty(&ccp->cmd)) {
+ list_for_each_entry_del(cmd, &ccp->cmd, entry) {
/* Invoke the callback directly with an error code */
- cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry);
- list_del(&cmd->entry);
cmd->callback(cmd->data, -ENODEV);
}
- while (!list_empty(&ccp->backlog)) {
+ list_for_each_entry_del(cmd, &ccp->backlog, entry) {
/* Invoke the callback directly with an error code */
- cmd = list_first_entry(&ccp->backlog, struct ccp_cmd, entry);
- list_del(&cmd->entry);
cmd->callback(cmd->data, -ENODEV);
}
}
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 3cf0b38387ae..f6c44a8f3ff3 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -1716,10 +1716,7 @@ static int pl330_update(struct pl330_dmac *pl330)
}

/* Now that we are in no hurry, do the callbacks */
- while (!list_empty(&pl330->req_done)) {
- descdone = list_first_entry(&pl330->req_done,
- struct dma_pl330_desc, rqd);
- list_del(&descdone->rqd);
+ list_for_each_entry_del(descdone, &pl330->req_done, rqd) {
spin_unlock_irqrestore(&pl330->lock, flags);
dma_pl330_rqcb(descdone, PL330_ERR_NONE);
spin_lock_irqsave(&pl330->lock, flags);
diff --git a/drivers/dma/ptdma/ptdma-dev.c b/drivers/dma/ptdma/ptdma-dev.c
index a2bf13ff18b6..86f6184ef4e4 100644
--- a/drivers/dma/ptdma/ptdma-dev.c
+++ b/drivers/dma/ptdma/ptdma-dev.c
@@ -300,10 +300,8 @@ void pt_core_destroy(struct pt_device *pt)
cmd_q->qbase_dma);

/* Flush the cmd queue */
- while (!list_empty(&pt->cmd)) {
+ list_for_each_entry_del(cmd, &pt->cmd, entry) {
/* Invoke the callback directly with an error code */
- cmd = list_first_entry(&pt->cmd, struct pt_cmd, entry);
- list_del(&cmd->entry);
cmd->pt_cmd_callback(cmd->data, -ENODEV);
}
}
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
index 063022f9df76..45e84382291d 100644
--- a/drivers/dma/tegra20-apb-dma.c
+++ b/drivers/dma/tegra20-apb-dma.c
@@ -641,10 +641,7 @@ static void tegra_dma_tasklet(struct tasklet_struct *t)
unsigned long flags;

spin_lock_irqsave(&tdc->lock, flags);
- while (!list_empty(&tdc->cb_desc)) {
- dma_desc = list_first_entry(&tdc->cb_desc, typeof(*dma_desc),
- cb_node);
- list_del(&dma_desc->cb_node);
+ list_for_each_entry_del(dma_desc, &tdc->cb_desc, cb_node) {
dmaengine_desc_get_callback(&dma_desc->txd, &cb);
cb_count = dma_desc->cb_count;
dma_desc->cb_count = 0;
@@ -778,12 +775,8 @@ static int tegra_dma_terminate_all(struct dma_chan *dc)
skip_dma_stop:
tegra_dma_abort_all(tdc);

- while (!list_empty(&tdc->cb_desc)) {
- dma_desc = list_first_entry(&tdc->cb_desc, typeof(*dma_desc),
- cb_node);
- list_del(&dma_desc->cb_node);
+ list_for_each_entry_del(dma_desc, &tdc->cb_desc, cb_node)
dma_desc->cb_count = 0;
- }
spin_unlock_irqrestore(&tdc->lock, flags);

return 0;
@@ -1326,18 +1319,11 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
tdc->config_init = false;
tdc->isr_handler = NULL;

- while (!list_empty(&dma_desc_list)) {
- dma_desc = list_first_entry(&dma_desc_list, typeof(*dma_desc),
- node);
- list_del(&dma_desc->node);
+ list_for_each_entry_del(dma_desc, &dma_desc_list, node)
kfree(dma_desc);
- }

- while (!list_empty(&sg_req_list)) {
- sg_req = list_first_entry(&sg_req_list, typeof(*sg_req), node);
- list_del(&sg_req->node);
+ list_for_each_entry_del(sg_req, &sg_req_list, node)
kfree(sg_req);
- }

tdc->slave_id = TEGRA_APBDMA_SLAVE_ID_INVALID;
}
diff --git a/drivers/firmware/cirrus/cs_dsp.c b/drivers/firmware/cirrus/cs_dsp.c
index 79d4254d1f9b..0980d6c841e9 100644
--- a/drivers/firmware/cirrus/cs_dsp.c
+++ b/drivers/firmware/cirrus/cs_dsp.c
@@ -332,11 +332,9 @@ static struct cs_dsp_buf *cs_dsp_buf_alloc(const void *src, size_t len,

static void cs_dsp_buf_free(struct list_head *list)
{
- while (!list_empty(list)) {
- struct cs_dsp_buf *buf = list_first_entry(list,
- struct cs_dsp_buf,
- list);
- list_del(&buf->list);
+ struct cs_dsp_buf *buf;
+
+ list_for_each_entry_del(buf, list, list) {
vfree(buf->buf);
kfree(buf);
}
@@ -1655,13 +1653,8 @@ static void cs_dsp_free_alg_regions(struct cs_dsp *dsp)
{
struct cs_dsp_alg_region *alg_region;

- while (!list_empty(&dsp->alg_regions)) {
- alg_region = list_first_entry(&dsp->alg_regions,
- struct cs_dsp_alg_region,
- list);
- list_del(&alg_region->list);
+ list_for_each_entry_del(alg_region, &dsp->alg_regions, list)
kfree(alg_region);
- }
}

static void cs_dsp_parse_wmfw_id_header(struct cs_dsp *dsp,
diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c
index b35b9604413f..5992d4b2d753 100644
--- a/drivers/gpio/gpio-rockchip.c
+++ b/drivers/gpio/gpio-rockchip.c
@@ -746,11 +746,7 @@ static int rockchip_gpio_probe(struct platform_device *pdev)
return ret;
}

- while (!list_empty(&bank->deferred_pins)) {
- cfg = list_first_entry(&bank->deferred_pins,
- struct rockchip_pin_deferred, head);
- list_del(&cfg->head);
-
+ list_for_each_entry_del(cfg, &bank->deferred_pins, head) {
switch (cfg->param) {
case PIN_CONFIG_OUTPUT:
ret = rockchip_gpio_direction_output(&bank->gpio_chip, cfg->pin, cfg->arg);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index f5daadcec865..a1dd04ff7a14 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1331,11 +1331,7 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
struct dma_fence *f = NULL;
int r;

- while (!list_empty(&vm->freed)) {
- mapping = list_first_entry(&vm->freed,
- struct amdgpu_bo_va_mapping, list);
- list_del(&mapping->list);
-
+ list_for_each_entry_del(mapping, &vm->freed, list) {
if (vm->pte_support_ats &&
mapping->start < AMDGPU_GMC_HOLE_START)
init_pte_value = AMDGPU_PTE_DEFAULT_ATC;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index bb16b795d1bc..075488240aa5 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -366,20 +366,17 @@ static bool svm_bo_ref_unless_zero(struct svm_range_bo *svm_bo)

static void svm_range_bo_release(struct kref *kref)
{
+ struct svm_range *prange;
struct svm_range_bo *svm_bo;

svm_bo = container_of(kref, struct svm_range_bo, kref);
pr_debug("svm_bo 0x%p\n", svm_bo);

spin_lock(&svm_bo->list_lock);
- while (!list_empty(&svm_bo->range_list)) {
- struct svm_range *prange =
- list_first_entry(&svm_bo->range_list,
- struct svm_range, svm_bo_list);
- /* list_del_init tells a concurrent svm_range_vram_node_new when
- * it's safe to reuse the svm_bo pointer and svm_bo_list head.
- */
- list_del_init(&prange->svm_bo_list);
+ /* list_del_init tells a concurrent svm_range_vram_node_new when
+ * it's safe to reuse the svm_bo pointer and svm_bo_list head.
+ */
+ list_for_each_entry_del_init(prange, &svm_bo->range_list, svm_bo_list) {
spin_unlock(&svm_bo->list_lock);

pr_debug("svms 0x%p [0x%lx 0x%lx]\n", prange->svms,
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
index 73104b59f97f..9745251a205b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
@@ -324,17 +324,11 @@ nvkm_disp_dtor(struct nvkm_engine *engine)

nvkm_event_fini(&disp->vblank);

- while (!list_empty(&disp->conns)) {
- conn = list_first_entry(&disp->conns, typeof(*conn), head);
- list_del(&conn->head);
+ list_for_each_entry_del(conn, &disp->conns, head)
nvkm_conn_del(&conn);
- }

- while (!list_empty(&disp->outps)) {
- outp = list_first_entry(&disp->outps, typeof(*outp), head);
- list_del(&outp->head);
+ list_for_each_entry_del(outp, &disp->outps, head)
nvkm_outp_del(&outp);
- }

while (!list_empty(&disp->iors)) {
ior = list_first_entry(&disp->iors, typeof(*ior), head);
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index 03648f954985..1fc170d95d38 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -918,6 +918,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
static void
vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
{
+ struct vc4_bo *bo;
struct vc4_dev *vc4 = to_vc4_dev(dev);
unsigned long irqflags;
unsigned i;
@@ -940,12 +941,8 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
kvfree(exec->bo);
}

- while (!list_empty(&exec->unref_list)) {
- struct vc4_bo *bo = list_first_entry(&exec->unref_list,
- struct vc4_bo, unref_head);
- list_del(&bo->unref_head);
+ list_for_each_entry_del(bo, &exec->unref_list, unref_head)
drm_gem_object_put(&bo->base.base);
- }

/* Free up the allocation of any bin slots we used. */
spin_lock_irqsave(&vc4->job_lock, irqflags);
@@ -967,6 +964,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
void
vc4_job_handle_completed(struct vc4_dev *vc4)
{
+ struct vc4_exec_info *exec;
unsigned long irqflags;
struct vc4_seqno_cb *cb, *cb_temp;

@@ -974,12 +972,7 @@ vc4_job_handle_completed(struct vc4_dev *vc4)
return;

spin_lock_irqsave(&vc4->job_lock, irqflags);
- while (!list_empty(&vc4->job_done_list)) {
- struct vc4_exec_info *exec =
- list_first_entry(&vc4->job_done_list,
- struct vc4_exec_info, head);
- list_del(&exec->head);
-
+ list_for_each_entry_del(exec, &vc4->job_done_list, head) {
spin_unlock_irqrestore(&vc4->job_lock, irqflags);
vc4_complete_exec(&vc4->base, exec);
spin_lock_irqsave(&vc4->job_lock, irqflags);
diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c
index 7db48d17ee3a..d1f022bab8ff 100644
--- a/drivers/gpu/drm/virtio/virtgpu_gem.c
+++ b/drivers/gpu/drm/virtio/virtgpu_gem.c
@@ -284,10 +284,7 @@ void virtio_gpu_array_put_free_work(struct work_struct *work)
struct virtio_gpu_object_array *objs;

spin_lock(&vgdev->obj_free_lock);
- while (!list_empty(&vgdev->obj_free_list)) {
- objs = list_first_entry(&vgdev->obj_free_list,
- struct virtio_gpu_object_array, next);
- list_del(&objs->next);
+ list_for_each_entry_del(objs, &vgdev->obj_free_list, next) {
spin_unlock(&vgdev->obj_free_lock);
virtio_gpu_array_put_free(objs);
spin_lock(&vgdev->obj_free_lock);
diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 841316582ea9..38cebdc05c33 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1552,13 +1552,7 @@ static void empty_done_q(struct ipu_image_convert_chan *chan)

spin_lock_irqsave(&chan->irqlock, flags);

- while (!list_empty(&chan->done_q)) {
- run = list_entry(chan->done_q.next,
- struct ipu_image_convert_run,
- list);
-
- list_del(&run->list);
-
+ list_for_each_entry_del(run, &chan->done_q, list) {
dev_dbg(priv->ipu->dev,
"%s: task %u: completing ctx %p run %p with %d\n",
__func__, chan->ic_task, run->ctx, run, run->status);
diff --git a/drivers/hid/intel-ish-hid/ishtp/client-buffers.c b/drivers/hid/intel-ish-hid/ishtp/client-buffers.c
index 513d7a4a1b8a..e0e932bf6955 100644
--- a/drivers/hid/intel-ish-hid/ishtp/client-buffers.c
+++ b/drivers/hid/intel-ish-hid/ishtp/client-buffers.c
@@ -101,20 +101,14 @@ void ishtp_cl_free_rx_ring(struct ishtp_cl *cl)

/* release allocated memory - pass over free_rb_list */
spin_lock_irqsave(&cl->free_list_spinlock, flags);
- while (!list_empty(&cl->free_rb_list.list)) {
- rb = list_entry(cl->free_rb_list.list.next, struct ishtp_cl_rb,
- list);
- list_del(&rb->list);
+ list_for_each_entry_del(rb, &cl->free_rb_list.list, list) {
kfree(rb->buffer.data);
kfree(rb);
}
spin_unlock_irqrestore(&cl->free_list_spinlock, flags);
/* release allocated memory - pass over in_process_list */
spin_lock_irqsave(&cl->in_process_spinlock, flags);
- while (!list_empty(&cl->in_process_list.list)) {
- rb = list_entry(cl->in_process_list.list.next,
- struct ishtp_cl_rb, list);
- list_del(&rb->list);
+ list_for_each_entry_del(rb, &cl->in_process_list.list, list) {
kfree(rb->buffer.data);
kfree(rb);
}
@@ -134,10 +128,7 @@ void ishtp_cl_free_tx_ring(struct ishtp_cl *cl)

spin_lock_irqsave(&cl->tx_free_list_spinlock, flags);
/* release allocated memory - pass over tx_free_list */
- while (!list_empty(&cl->tx_free_list.list)) {
- tx_buf = list_entry(cl->tx_free_list.list.next,
- struct ishtp_cl_tx_ring, list);
- list_del(&tx_buf->list);
+ list_for_each_entry_del(tx_buf, &cl->tx_free_list.list, list) {
--cl->tx_ring_free_size;
kfree(tx_buf->send_buf.data);
kfree(tx_buf);
@@ -146,10 +137,7 @@ void ishtp_cl_free_tx_ring(struct ishtp_cl *cl)

spin_lock_irqsave(&cl->tx_list_spinlock, flags);
/* release allocated memory - pass over tx_list */
- while (!list_empty(&cl->tx_list.list)) {
- tx_buf = list_entry(cl->tx_list.list.next,
- struct ishtp_cl_tx_ring, list);
- list_del(&tx_buf->list);
+ list_for_each_entry_del(tx_buf, &cl->tx_list.list, list) {
kfree(tx_buf->send_buf.data);
kfree(tx_buf);
}
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 87283e4a4607..be9a41375bae 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -2427,12 +2427,8 @@ void i3c_generic_ibi_free_pool(struct i3c_generic_ibi_pool *pool)
struct i3c_generic_ibi_slot *slot;
unsigned int nslots = 0;

- while (!list_empty(&pool->free_slots)) {
- slot = list_first_entry(&pool->free_slots,
- struct i3c_generic_ibi_slot, node);
- list_del(&slot->node);
+ list_for_each_entry_del(slot, &pool->free_slots, node)
nslots++;
- }

/*
* If the number of freed slots is not equal to the number of allocated
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 1e2cd7c8716e..b8d3f165da07 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1914,13 +1914,10 @@ static void _cma_cancel_listens(struct rdma_id_private *id_priv)
*/
list_del_init(&id_priv->listen_any_item);

- while (!list_empty(&id_priv->listen_list)) {
- dev_id_priv =
- list_first_entry(&id_priv->listen_list,
- struct rdma_id_private, listen_item);
+ list_for_each_entry_del_init(dev_id_priv, &id_priv->listen_list,
+ listen_item) {
/* sync with device removal to avoid duplicate destruction */
list_del_init(&dev_id_priv->device_item);
- list_del_init(&dev_id_priv->listen_item);
mutex_unlock(&lock);

rdma_destroy_id(&dev_id_priv->id);
@@ -2018,12 +2015,8 @@ static void cma_leave_mc_groups(struct rdma_id_private *id_priv)
{
struct cma_multicast *mc;

- while (!list_empty(&id_priv->mc_list)) {
- mc = list_first_entry(&id_priv->mc_list, struct cma_multicast,
- list);
- list_del(&mc->list);
+ list_for_each_entry_del(mc, &id_priv->mc_list, list)
destroy_mc(id_priv, mc);
- }
}

static void _destroy_id(struct rdma_id_private *id_priv,
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index 674344eb8e2f..44c6b3cf003a 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -2508,11 +2508,8 @@ static void local_completions(struct work_struct *work)
mad_agent_priv->qp_info->port_priv->port_num);

spin_lock_irqsave(&mad_agent_priv->lock, flags);
- while (!list_empty(&mad_agent_priv->local_list)) {
- local = list_entry(mad_agent_priv->local_list.next,
- struct ib_mad_local_private,
- completion_list);
- list_del(&local->completion_list);
+ list_for_each_entry_del(local, &mad_agent_priv->local_list,
+ completion_list) {
spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
free_mad = 0;
if (local->mad_priv) {
diff --git a/drivers/infiniband/core/mr_pool.c b/drivers/infiniband/core/mr_pool.c
index c0e2df128b34..7dcec19032df 100644
--- a/drivers/infiniband/core/mr_pool.c
+++ b/drivers/infiniband/core/mr_pool.c
@@ -69,10 +69,7 @@ void ib_mr_pool_destroy(struct ib_qp *qp, struct list_head *list)
unsigned long flags;

spin_lock_irqsave(&qp->mr_lock, flags);
- while (!list_empty(list)) {
- mr = list_first_entry(list, struct ib_mr, qp_entry);
- list_del(&mr->qp_entry);
-
+ list_for_each_entry_del(mr, list, qp_entry) {
spin_unlock_irqrestore(&qp->mr_lock, flags);
ib_dereg_mr(mr);
spin_lock_irqsave(&qp->mr_lock, flags);
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c
index a236532a9026..971793f1ec1f 100644
--- a/drivers/infiniband/core/multicast.c
+++ b/drivers/infiniband/core/multicast.c
@@ -398,11 +398,8 @@ static void process_group_error(struct mcast_group *group)
group->pkey_index == pkey_index)
goto out;

- while (!list_empty(&group->active_list)) {
- member = list_entry(group->active_list.next,
- struct mcast_member, list);
+ list_for_each_entry_del_init(member, &group->active_list, list) {
refcount_inc(&member->refcount);
- list_del_init(&member->list);
adjust_membership(group, member->multicast.rec.join_state, -1);
member->state = MCAST_ERROR;
spin_unlock_irq(&group->lock);
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index 495d5a5d0373..4ac1987d951c 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -1191,10 +1191,8 @@ static void ib_uverbs_free_hw_resources(struct ib_uverbs_device *uverbs_dev,
uverbs_disassociate_api_pre(uverbs_dev);

mutex_lock(&uverbs_dev->lists_mutex);
- while (!list_empty(&uverbs_dev->uverbs_file_list)) {
- file = list_first_entry(&uverbs_dev->uverbs_file_list,
- struct ib_uverbs_file, list);
- list_del_init(&file->list);
+ list_for_each_entry_del_init(file, &uverbs_dev->uverbs_file_list,
+ list) {
kref_get(&file->ref);

/* We must release the mutex before going ahead and calling
diff --git a/drivers/infiniband/hw/hfi1/mmu_rb.c b/drivers/infiniband/hw/hfi1/mmu_rb.c
index 7a51f7d73b61..3f7af80cf49e 100644
--- a/drivers/infiniband/hw/hfi1/mmu_rb.c
+++ b/drivers/infiniband/hw/hfi1/mmu_rb.c
@@ -105,11 +105,8 @@ void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler)
}
spin_unlock_irqrestore(&handler->lock, flags);

- while (!list_empty(&del_list)) {
- rbnode = list_first_entry(&del_list, struct mmu_rb_node, list);
- list_del(&rbnode->list);
+ list_for_each_entry_del(rbnode, &del_list, list)
kref_put(&rbnode->refcount, release_immediate);
- }

/* Now the mm may be freed. */
mmdrop(handler->mn.mm);
@@ -303,9 +300,7 @@ static void handle_remove(struct work_struct *work)
list_replace_init(&handler->del_list, &del_list);
spin_unlock_irqrestore(&handler->lock, flags);

- while (!list_empty(&del_list)) {
- node = list_first_entry(&del_list, struct mmu_rb_node, list);
- list_del(&node->list);
+ list_for_each_entry_del(node, &del_list, list) {
trace_hfi1_mmu_release_node(node);
handler->ops->remove(handler->ops_arg, node);
}
diff --git a/drivers/infiniband/hw/hfi1/qp.c b/drivers/infiniband/hw/hfi1/qp.c
index 6193d48b2c1f..afde276d2563 100644
--- a/drivers/infiniband/hw/hfi1/qp.c
+++ b/drivers/infiniband/hw/hfi1/qp.c
@@ -106,14 +106,9 @@ const struct rvt_operation_params hfi1_post_parms[RVT_OPERATION_MAX] = {

static void flush_list_head(struct list_head *l)
{
- while (!list_empty(l)) {
- struct sdma_txreq *tx;
-
- tx = list_first_entry(
- l,
- struct sdma_txreq,
- list);
- list_del_init(&tx->list);
+ struct sdma_txreq *tx;
+
+ list_for_each_entry_del_init(tx, l, list) {
hfi1_put_txreq(
container_of(tx, struct verbs_txreq, txreq));
}
diff --git a/drivers/infiniband/hw/mlx4/alias_GUID.c b/drivers/infiniband/hw/mlx4/alias_GUID.c
index 111fa88a3be4..ab2e8bc45906 100644
--- a/drivers/infiniband/hw/mlx4/alias_GUID.c
+++ b/drivers/infiniband/hw/mlx4/alias_GUID.c
@@ -806,13 +806,9 @@ void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev)
det = &sriov->alias_guid.ports_guid[i];
cancel_delayed_work_sync(&det->alias_guid_work);
spin_lock_irqsave(&sriov->alias_guid.ag_work_lock, flags);
- while (!list_empty(&det->cb_list)) {
- cb_ctx = list_entry(det->cb_list.next,
- struct mlx4_alias_guid_work_context,
- list);
+ list_for_each_entry_del(cb_ctx, &det->cb_list, list) {
sa_query = cb_ctx->sa_query;
cb_ctx->sa_query = NULL;
- list_del(&cb_ctx->list);
spin_unlock_irqrestore(&sriov->alias_guid.ag_work_lock, flags);
ib_sa_cancel_query(cb_ctx->query_id, sa_query);
wait_for_completion(&cb_ctx->done);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index b610d36295bb..5c3106e3febb 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -1351,9 +1351,7 @@ static void ipoib_cm_tx_start(struct work_struct *work)
netif_tx_lock_bh(dev);
spin_lock_irqsave(&priv->lock, flags);

- while (!list_empty(&priv->cm.start_list)) {
- p = list_entry(priv->cm.start_list.next, typeof(*p), list);
- list_del_init(&p->list);
+ list_for_each_entry_del_init(p, &priv->cm.start_list, list) {
neigh = p->neigh;

qpn = IPOIB_QPN(neigh->daddr);
@@ -1405,9 +1403,7 @@ static void ipoib_cm_tx_reap(struct work_struct *work)
netif_tx_lock_bh(dev);
spin_lock_irqsave(&priv->lock, flags);

- while (!list_empty(&priv->cm.reap_list)) {
- p = list_entry(priv->cm.reap_list.next, typeof(*p), list);
- list_del_init(&p->list);
+ list_for_each_entry_del_init(p, &priv->cm.reap_list, list) {
spin_unlock_irqrestore(&priv->lock, flags);
netif_tx_unlock_bh(dev);
ipoib_cm_tx_destroy(p);
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index 75e56604e462..a780396dc7a9 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -1164,15 +1164,11 @@ static int rtrs_srv_inv_rkey(struct rtrs_srv_con *con,

static void rtrs_rdma_process_wr_wait_list(struct rtrs_srv_con *con)
{
- spin_lock(&con->rsp_wr_wait_lock);
- while (!list_empty(&con->rsp_wr_wait_list)) {
- struct rtrs_srv_op *id;
- int ret;
-
- id = list_entry(con->rsp_wr_wait_list.next,
- struct rtrs_srv_op, wait_list);
- list_del(&id->wait_list);
+ struct rtrs_srv_op *id;
+ int ret;

+ spin_lock(&con->rsp_wr_wait_lock);
+ list_for_each_entry_del(id, &con->rsp_wr_wait_list, wait_list) {
spin_unlock(&con->rsp_wr_wait_lock);
ret = rtrs_srv_resp_rdma(id, id->status);
spin_lock(&con->rsp_wr_wait_lock);
diff --git a/drivers/macintosh/windfarm_fcu_controls.c b/drivers/macintosh/windfarm_fcu_controls.c
index 603ef6c600ba..7e4f7281e4ad 100644
--- a/drivers/macintosh/windfarm_fcu_controls.c
+++ b/drivers/macintosh/windfarm_fcu_controls.c
@@ -564,11 +564,9 @@ static void wf_fcu_remove(struct i2c_client *client)
struct wf_fcu_priv *pv = dev_get_drvdata(&client->dev);
struct wf_fcu_fan *fan;

- while (!list_empty(&pv->fan_list)) {
- fan = list_first_entry(&pv->fan_list, struct wf_fcu_fan, link);
- list_del(&fan->link);
+ list_for_each_entry_del(fan, &pv->fan_list, link)
wf_unregister_control(&fan->ctrl);
- }
+
kref_put(&pv->ref, wf_fcu_release);
}

diff --git a/drivers/macintosh/windfarm_smu_controls.c b/drivers/macintosh/windfarm_smu_controls.c
index bdd92b27da2a..17d7b5e5d616 100644
--- a/drivers/macintosh/windfarm_smu_controls.c
+++ b/drivers/macintosh/windfarm_smu_controls.c
@@ -309,11 +309,8 @@ static void __exit smu_controls_exit(void)
{
struct smu_fan_control *fct;

- while (!list_empty(&smu_fans)) {
- fct = list_entry(smu_fans.next, struct smu_fan_control, link);
- list_del(&fct->link);
+ list_for_each_entry_del(fct, &smu_fans, link)
wf_unregister_control(&fct->ctrl);
- }
}


diff --git a/drivers/macintosh/windfarm_smu_sat.c b/drivers/macintosh/windfarm_smu_sat.c
index 50baa062c9df..9d878652d241 100644
--- a/drivers/macintosh/windfarm_smu_sat.c
+++ b/drivers/macintosh/windfarm_smu_sat.c
@@ -322,12 +322,8 @@ static void wf_sat_remove(struct i2c_client *client)
struct wf_sat_sensor *sens;

/* release sensors */
- while(!list_empty(&sat->sensors)) {
- sens = list_first_entry(&sat->sensors,
- struct wf_sat_sensor, link);
- list_del(&sens->link);
+ list_for_each_entry_del(sens, &sat->sensors, link)
wf_unregister_sensor(&sens->sens);
- }
sat->i2c = NULL;
kref_put(&sat->ref, wf_sat_release);
}
diff --git a/drivers/macintosh/windfarm_smu_sensors.c b/drivers/macintosh/windfarm_smu_sensors.c
index 2bdb73b34d29..a76b30dae984 100644
--- a/drivers/macintosh/windfarm_smu_sensors.c
+++ b/drivers/macintosh/windfarm_smu_sensors.c
@@ -463,11 +463,8 @@ static void __exit smu_sensors_exit(void)
wf_unregister_sensor(&smu_cpu_power->sens);

/* dispose of basic sensors */
- while (!list_empty(&smu_ads)) {
- ads = list_entry(smu_ads.next, struct smu_ad_sensor, link);
- list_del(&ads->link);
+ list_for_each_entry_del(ads, &smu_ads, link)
wf_unregister_sensor(&ads->sens);
- }
}


diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c
index ce13c272c387..5219629ad67d 100644
--- a/drivers/md/bcache/alloc.c
+++ b/drivers/md/bcache/alloc.c
@@ -698,12 +698,8 @@ void bch_open_buckets_free(struct cache_set *c)
{
struct open_bucket *b;

- while (!list_empty(&c->data_buckets)) {
- b = list_first_entry(&c->data_buckets,
- struct open_bucket, list);
- list_del(&b->list);
+ list_for_each_entry_del(b, &c->data_buckets, list)
kfree(b);
- }
}

int bch_open_buckets_alloc(struct cache_set *c)
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index fd121a61f17c..65e19322ca3f 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -782,10 +782,7 @@ void bch_btree_cache_free(struct cache_set *c)
mca_data_free(b);
}

- while (!list_empty(&c->btree_cache_freed)) {
- b = list_first_entry(&c->btree_cache_freed,
- struct btree, list);
- list_del(&b->list);
+ list_for_each_entry_del(b, &c->btree_cache_freed, list) {
cancel_delayed_work_sync(&b->work);
kfree(b);
}
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c
index c182c21de2e8..a1682eb2cdf4 100644
--- a/drivers/md/bcache/journal.c
+++ b/drivers/md/bcache/journal.c
@@ -397,11 +397,8 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list)
pr_info("journal replay done, %i keys in %i entries, seq %llu\n",
keys, entries, end);
err:
- while (!list_empty(list)) {
- i = list_first_entry(list, struct journal_replay, list);
- list_del(&i->list);
+ list_for_each_entry_del(i, list, list)
kfree(i);
- }

return ret;
}
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 0ae2b3676293..abd7a07e2527 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -2128,11 +2128,8 @@ static int run_cache_set(struct cache_set *c)
set_bit(CACHE_SET_RUNNING, &c->flags);
return 0;
err:
- while (!list_empty(&journal)) {
- l = list_first_entry(&journal, struct journal_replay, list);
- list_del(&l->list);
+ list_for_each_entry_del(l, &journal, list)
kfree(l);
- }

closure_sync(&cl);

diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
index bc309e41d074..55ce606dc720 100644
--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -1427,13 +1427,11 @@ static void __write_dirty_buffer(struct dm_buffer *b,

static void __flush_write_list(struct list_head *write_list)
{
+ struct dm_buffer *b;
struct blk_plug plug;

blk_start_plug(&plug);
- while (!list_empty(write_list)) {
- struct dm_buffer *b =
- list_entry(write_list->next, struct dm_buffer, write_list);
- list_del(&b->write_list);
+ list_for_each_entry_del(b, write_list, write_list) {
submit_io(b, REQ_OP_WRITE, write_endio);
cond_resched();
}
diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c
index db2d997a6c18..b380b37936a9 100644
--- a/drivers/md/dm-stats.c
+++ b/drivers/md/dm-stats.c
@@ -215,9 +215,7 @@ void dm_stats_cleanup(struct dm_stats *stats)
struct dm_stat *s;
struct dm_stat_shared *shared;

- while (!list_empty(&stats->list)) {
- s = container_of(stats->list.next, struct dm_stat, list_entry);
- list_del(&s->list_entry);
+ list_for_each_entry_del(s, &stats->list, list_entry) {
for (ni = 0; ni < s->n_entries; ni++) {
shared = &s->stat_shared[ni];
if (WARN_ON(dm_stat_in_flight(shared))) {
diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c
index 9d3cca8e3dc9..f972e69ea134 100644
--- a/drivers/md/dm-zoned-metadata.c
+++ b/drivers/md/dm-zoned-metadata.c
@@ -944,10 +944,7 @@ int dmz_flush_metadata(struct dmz_metadata *zmd)
if (ret)
goto err;

- while (!list_empty(&write_list)) {
- mblk = list_first_entry(&write_list, struct dmz_mblock, link);
- list_del_init(&mblk->link);
-
+ list_for_each_entry_del_init(mblk, &write_list, link) {
spin_lock(&zmd->mblk_lock);
clear_bit(DMZ_META_DIRTY, &mblk->state);
if (mblk->ref == 0)
@@ -2808,10 +2805,7 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd)
dmz_free_mblock(zmd, mblk);
}

- while (!list_empty(&zmd->mblk_lru_list)) {
- mblk = list_first_entry(&zmd->mblk_lru_list,
- struct dmz_mblock, link);
- list_del_init(&mblk->link);
+ list_for_each_entry_del_init(mblk, &zmd->mblk_lru_list, link) {
rb_erase(&mblk->node, &zmd->mblk_rbtree);
dmz_free_mblock(zmd, mblk);
}
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 2aabac773fe7..bc39e0e617b4 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -2567,10 +2567,7 @@ static void raid1d(struct md_thread *thread)
if (!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
list_splice_init(&conf->bio_end_io_list, &tmp);
spin_unlock_irqrestore(&conf->device_lock, flags);
- while (!list_empty(&tmp)) {
- r1_bio = list_first_entry(&tmp, struct r1bio,
- retry_list);
- list_del(&r1_bio->retry_list);
+ list_for_each_entry_del(r1_bio, &tmp, retry_list) {
idx = sector_to_idx(r1_bio->sector);
atomic_dec(&conf->nr_queued[idx]);
if (mddev->degraded)
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 023413120851..305ce283c381 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -3122,10 +3122,7 @@ static void raid10d(struct md_thread *thread)
}
}
spin_unlock_irqrestore(&conf->device_lock, flags);
- while (!list_empty(&tmp)) {
- r10_bio = list_first_entry(&tmp, struct r10bio,
- retry_list);
- list_del(&r10_bio->retry_list);
+ list_for_each_entry_del(r10_bio, &tmp, retry_list) {
if (mddev->degraded)
set_bit(R10BIO_Degraded, &r10_bio->state);

diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index 518b7cfa78b9..91943de6e64e 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -1133,10 +1133,7 @@ static void r5l_run_no_space_stripes(struct r5l_log *log)
struct stripe_head *sh;

spin_lock(&log->no_space_stripes_lock);
- while (!list_empty(&log->no_space_stripes)) {
- sh = list_first_entry(&log->no_space_stripes,
- struct stripe_head, log_list);
- list_del_init(&sh->log_list);
+ list_for_each_entry_del_init(sh, &log->no_space_stripes, log_list) {
set_bit(STRIPE_HANDLE, &sh->state);
raid5_release_stripe(sh);
}
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 284cd71bcc68..8ea33f1e328a 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -2583,11 +2583,9 @@ static int resize_stripes(struct r5conf *conf, int newsize)
}
if (i) {
/* didn't get enough, give up */
- while (!list_empty(&newstripes)) {
- nsh = list_entry(newstripes.next, struct stripe_head, lru);
- list_del(&nsh->lru);
+ list_for_each_entry_del(nsh, &newstripes, lru)
free_stripe(sc, nsh);
- }
+
kmem_cache_destroy(sc);
mutex_unlock(&conf->cache_size_mutex);
return -ENOMEM;
@@ -2661,10 +2659,7 @@ static int resize_stripes(struct r5conf *conf, int newsize)
conf->active_name = 1-conf->active_name;

/* Step 4, return new stripes to service */
- while(!list_empty(&newstripes)) {
- nsh = list_entry(newstripes.next, struct stripe_head, lru);
- list_del_init(&nsh->lru);
-
+ list_for_each_entry_del_init(nsh, &newstripes, lru) {
#if PAGE_SIZE != DEFAULT_STRIPE_SIZE
for (i = 0; i < nsh->nr_pages; i++) {
if (nsh->pages[i])
@@ -5724,9 +5719,7 @@ static void raid5_unplug(struct blk_plug_cb *blk_cb, bool from_schedule)

if (cb->list.next && !list_empty(&cb->list)) {
spin_lock_irq(&conf->device_lock);
- while (!list_empty(&cb->list)) {
- sh = list_first_entry(&cb->list, struct stripe_head, lru);
- list_del_init(&sh->lru);
+ list_for_each_entry_del_init(sh, &cb->list, lru) {
/*
* avoid race release_stripe_plug() sees
* STRIPE_ON_UNPLUG_LIST clear but the stripe
@@ -6481,11 +6474,9 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
/* Now that the sources are clearly marked, we can release
* the destination stripes
*/
- while (!list_empty(&stripes)) {
- sh = list_entry(stripes.next, struct stripe_head, lru);
- list_del_init(&sh->lru);
+ list_for_each_entry_del_init(sh, &stripes, lru)
raid5_release_stripe(sh);
- }
+
/* If this takes us to the resync_max point where we have to pause,
* then we need to write out the superblock.
*/
diff --git a/drivers/media/cec/core/cec-api.c b/drivers/media/cec/core/cec-api.c
index 67dc79ef1705..c970370241c2 100644
--- a/drivers/media/cec/core/cec-api.c
+++ b/drivers/media/cec/core/cec-api.c
@@ -627,6 +627,7 @@ static int cec_open(struct inode *inode, struct file *filp)
/* Override for the release function */
static int cec_release(struct inode *inode, struct file *filp)
{
+ struct cec_msg_entry *entry;
struct cec_devnode *devnode = cec_devnode_data(filp);
struct cec_adapter *adap = to_cec_adapter(devnode);
struct cec_fh *fh = filp->private_data;
@@ -664,22 +665,14 @@ static int cec_release(struct inode *inode, struct file *filp)
list_del_init(&data->xfer_list);
}
mutex_unlock(&adap->lock);
- while (!list_empty(&fh->msgs)) {
- struct cec_msg_entry *entry =
- list_first_entry(&fh->msgs, struct cec_msg_entry, list);
-
- list_del(&entry->list);
+ list_for_each_entry_del(entry, &fh->msgs, list)
kfree(entry);
- }
+
for (i = CEC_NUM_CORE_EVENTS; i < CEC_NUM_EVENTS; i++) {
- while (!list_empty(&fh->events[i])) {
- struct cec_event_entry *entry =
- list_first_entry(&fh->events[i],
- struct cec_event_entry, list);
+ struct cec_event_entry *entry;

- list_del(&entry->list);
+ list_for_each_entry_del(entry, &fh->events[i], list)
kfree(entry);
- }
}
kfree(fh);

diff --git a/drivers/media/common/saa7146/saa7146_vbi.c b/drivers/media/common/saa7146/saa7146_vbi.c
index bb7d81f7eba6..a35e2c5d8079 100644
--- a/drivers/media/common/saa7146/saa7146_vbi.c
+++ b/drivers/media/common/saa7146/saa7146_vbi.c
@@ -298,11 +298,8 @@ static void return_buffers(struct vb2_queue *q, int state)
dq->curr = NULL;
vb2_buffer_done(&buf->vb.vb2_buf, state);
}
- while (!list_empty(&dq->queue)) {
- buf = list_entry(dq->queue.next, struct saa7146_buf, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dq->queue, list)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }
}

static void vbi_stop(struct saa7146_dev *dev)
diff --git a/drivers/media/common/saa7146/saa7146_video.c b/drivers/media/common/saa7146/saa7146_video.c
index 040489e15ea0..88648b9c6e77 100644
--- a/drivers/media/common/saa7146/saa7146_video.c
+++ b/drivers/media/common/saa7146/saa7146_video.c
@@ -643,11 +643,8 @@ static void return_buffers(struct vb2_queue *q, int state)
dq->curr = NULL;
vb2_buffer_done(&buf->vb.vb2_buf, state);
}
- while (!list_empty(&dq->queue)) {
- buf = list_entry(dq->queue.next, struct saa7146_buf, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dq->queue, list)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }
}

static int start_streaming(struct vb2_queue *q, unsigned int count)
diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.c b/drivers/media/dvb-frontends/rtl2832_sdr.c
index 02c619e51641..bc6a22ce4fcf 100644
--- a/drivers/media/dvb-frontends/rtl2832_sdr.c
+++ b/drivers/media/dvb-frontends/rtl2832_sdr.c
@@ -401,20 +401,15 @@ static int rtl2832_sdr_alloc_urbs(struct rtl2832_sdr_dev *dev)
/* Must be called with vb_queue_lock hold */
static void rtl2832_sdr_cleanup_queued_bufs(struct rtl2832_sdr_dev *dev)
{
+ struct rtl2832_sdr_frame_buf *buf;
struct platform_device *pdev = dev->pdev;
unsigned long flags;

dev_dbg(&pdev->dev, "\n");

spin_lock_irqsave(&dev->queued_bufs_lock, flags);
- while (!list_empty(&dev->queued_bufs)) {
- struct rtl2832_sdr_frame_buf *buf;
-
- buf = list_entry(dev->queued_bufs.next,
- struct rtl2832_sdr_frame_buf, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->queued_bufs, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->queued_bufs_lock, flags);
}

diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c
index 83468d4a440b..c77f7cba59e2 100644
--- a/drivers/media/mc/mc-entity.c
+++ b/drivers/media/mc/mc-entity.c
@@ -651,13 +651,10 @@ static int media_pipeline_explore_next_link(struct media_pipeline *pipe,

static void media_pipeline_cleanup(struct media_pipeline *pipe)
{
- while (!list_empty(&pipe->pads)) {
- struct media_pipeline_pad *ppad;
+ struct media_pipeline_pad *ppad;

- ppad = list_first_entry(&pipe->pads, typeof(*ppad), list);
- list_del(&ppad->list);
+ list_for_each_entry_del(ppad, &pipe->pads, list)
kfree(ppad);
- }
}

static int media_pipeline_populate(struct media_pipeline *pipe,
diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
index aa708a0e5eac..976d9c596046 100644
--- a/drivers/media/pci/bt8xx/bttv-driver.c
+++ b/drivers/media/pci/bt8xx/bttv-driver.c
@@ -1545,10 +1545,7 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
if (ret == 0) {
if (btv->field_count)
seqnr++;
- while (!list_empty(&btv->capture)) {
- buf = list_entry(btv->capture.next,
- struct bttv_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &btv->capture, list) {
buf->vbuf.sequence = (btv->field_count >> 1) + seqnr++;
vb2_buffer_done(&buf->vbuf.vb2_buf,
VB2_BUF_STATE_QUEUED);
@@ -2816,16 +2813,12 @@ static void bttv_irq_timeout(struct timer_list *t)
/* cancel all outstanding capture / vbi requests */
if (btv->field_count)
seqnr++;
- while (!list_empty(&btv->capture)) {
- item = list_entry(btv->capture.next, struct bttv_buffer, list);
- list_del(&item->list);
+ list_for_each_entry_del(item, &btv->capture, list) {
item->vbuf.vb2_buf.timestamp = ktime_get_ns();
item->vbuf.sequence = (btv->field_count >> 1) + seqnr++;
vb2_buffer_done(&item->vbuf.vb2_buf, VB2_BUF_STATE_ERROR);
}
- while (!list_empty(&btv->vcapture)) {
- item = list_entry(btv->vcapture.next, struct bttv_buffer, list);
- list_del(&item->list);
+ list_for_each_entry_del(item, &btv->vcapture, list) {
item->vbuf.vb2_buf.timestamp = ktime_get_ns();
item->vbuf.sequence = (btv->field_count >> 1) + seqnr++;
vb2_buffer_done(&item->vbuf.vb2_buf, VB2_BUF_STATE_ERROR);
diff --git a/drivers/media/pci/bt8xx/bttv-vbi.c b/drivers/media/pci/bt8xx/bttv-vbi.c
index ab213e51ec95..fee09c46fa31 100644
--- a/drivers/media/pci/bt8xx/bttv-vbi.c
+++ b/drivers/media/pci/bt8xx/bttv-vbi.c
@@ -133,10 +133,7 @@ static int start_streaming_vbi(struct vb2_queue *q, unsigned int count)
if (ret == 0) {
if (btv->field_count)
seqnr++;
- while (!list_empty(&btv->vcapture)) {
- buf = list_entry(btv->vcapture.next,
- struct bttv_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &btv->vcapture, list) {
buf->vbuf.sequence = (btv->field_count >> 1) + seqnr++;
vb2_buffer_done(&buf->vbuf.vb2_buf,
VB2_BUF_STATE_QUEUED);
diff --git a/drivers/media/pci/cx18/cx18-queue.c b/drivers/media/pci/cx18/cx18-queue.c
index 013694bfcb1c..c054a24eb38d 100644
--- a/drivers/media/pci/cx18/cx18-queue.c
+++ b/drivers/media/pci/cx18/cx18-queue.c
@@ -416,10 +416,7 @@ void cx18_stream_free(struct cx18_stream *s)
kfree(mdl);

/* empty buf_pool */
- while (!list_empty(&s->buf_pool)) {
- buf = list_first_entry(&s->buf_pool, struct cx18_buffer, list);
- list_del_init(&buf->list);
-
+ list_for_each_entry_del_init(buf, &s->buf_pool, list) {
dma_unmap_single(&s->cx->pci_dev->dev, buf->dma_handle,
s->buf_size, s->dma);
kfree(buf->buf);
diff --git a/drivers/media/pci/cx18/cx18-streams.c b/drivers/media/pci/cx18/cx18-streams.c
index 597472754c4c..77cad68a624f 100644
--- a/drivers/media/pci/cx18/cx18-streams.c
+++ b/drivers/media/pci/cx18/cx18-streams.c
@@ -173,14 +173,10 @@ static int cx18_buf_prepare(struct vb2_buffer *vb)

void cx18_clear_queue(struct cx18_stream *s, enum vb2_buffer_state state)
{
- while (!list_empty(&s->vb_capture)) {
- struct cx18_vb2_buffer *buf;
+ struct cx18_vb2_buffer *buf;

- buf = list_first_entry(&s->vb_capture,
- struct cx18_vb2_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &s->vb_capture, list)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }
}

static int cx18_start_streaming(struct vb2_queue *vq, unsigned int count)
diff --git a/drivers/media/pci/cx23885/cx23885-417.c b/drivers/media/pci/cx23885/cx23885-417.c
index 434677bd4ad1..ba81f615a567 100644
--- a/drivers/media/pci/cx23885/cx23885-417.c
+++ b/drivers/media/pci/cx23885/cx23885-417.c
@@ -1166,6 +1166,7 @@ static void buffer_queue(struct vb2_buffer *vb)

static int cx23885_start_streaming(struct vb2_queue *q, unsigned int count)
{
+ struct cx23885_buffer *buf;
struct cx23885_dev *dev = q->drv_priv;
struct cx23885_dmaqueue *dmaq = &dev->ts1.mpegq;
unsigned long flags;
@@ -1180,13 +1181,8 @@ static int cx23885_start_streaming(struct vb2_queue *q, unsigned int count)
return 0;
}
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx23885_buffer *buf = list_entry(dmaq->active.next,
- struct cx23885_buffer, queue);
-
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &dmaq->active, queue)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
- }
spin_unlock_irqrestore(&dev->slock, flags);
return ret;
}
diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c
index c8705d786cdd..3522310d4b16 100644
--- a/drivers/media/pci/cx23885/cx23885-core.c
+++ b/drivers/media/pci/cx23885/cx23885-core.c
@@ -1651,10 +1651,7 @@ static void do_cancel_buffers(struct cx23885_tsport *port, char *reason)
unsigned long flags;

spin_lock_irqsave(&port->slock, flags);
- while (!list_empty(&q->active)) {
- buf = list_entry(q->active.next, struct cx23885_buffer,
- queue);
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &q->active, queue) {
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
dprintk(1, "[%p/%d] %s - dma=0x%08lx\n",
buf, buf->vb.vb2_buf.index, reason,
diff --git a/drivers/media/pci/cx23885/cx23885-vbi.c b/drivers/media/pci/cx23885/cx23885-vbi.c
index 4bdd2bea3713..6d33b7faac2f 100644
--- a/drivers/media/pci/cx23885/cx23885-vbi.c
+++ b/drivers/media/pci/cx23885/cx23885-vbi.c
@@ -227,19 +227,15 @@ static int cx23885_start_streaming(struct vb2_queue *q, unsigned int count)

static void cx23885_stop_streaming(struct vb2_queue *q)
{
+ struct cx23885_buffer *buf;
struct cx23885_dev *dev = q->drv_priv;
struct cx23885_dmaqueue *dmaq = &dev->vbiq;
unsigned long flags;

cx_clear(VID_A_DMA_CTL, 0x22); /* FIFO and RISC enable */
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx23885_buffer *buf = list_entry(dmaq->active.next,
- struct cx23885_buffer, queue);
-
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &dmaq->active, queue)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx23885/cx23885-video.c b/drivers/media/pci/cx23885/cx23885-video.c
index 9af2c5596121..8c904ba4b6c1 100644
--- a/drivers/media/pci/cx23885/cx23885-video.c
+++ b/drivers/media/pci/cx23885/cx23885-video.c
@@ -498,19 +498,15 @@ static int cx23885_start_streaming(struct vb2_queue *q, unsigned int count)

static void cx23885_stop_streaming(struct vb2_queue *q)
{
+ struct cx23885_buffer *buf;
struct cx23885_dev *dev = q->drv_priv;
struct cx23885_dmaqueue *dmaq = &dev->vidq;
unsigned long flags;

cx_clear(VID_A_DMA_CTL, 0x11);
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx23885_buffer *buf = list_entry(dmaq->active.next,
- struct cx23885_buffer, queue);
-
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &dmaq->active, queue)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx25821/cx25821-video.c b/drivers/media/pci/cx25821/cx25821-video.c
index 1b80c990cb94..0a153b2187f5 100644
--- a/drivers/media/pci/cx25821/cx25821-video.c
+++ b/drivers/media/pci/cx25821/cx25821-video.c
@@ -273,6 +273,7 @@ static int cx25821_start_streaming(struct vb2_queue *q, unsigned int count)

static void cx25821_stop_streaming(struct vb2_queue *q)
{
+ struct cx25821_buffer *buf;
struct cx25821_channel *chan = q->drv_priv;
struct cx25821_dev *dev = chan->dev;
struct cx25821_dmaqueue *dmaq = &dev->channels[chan->id].dma_vidq;
@@ -280,13 +281,8 @@ static void cx25821_stop_streaming(struct vb2_queue *q)

cx_write(chan->sram_channels->dma_ctl, 0); /* FIFO and RISC disable */
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx25821_buffer *buf = list_entry(dmaq->active.next,
- struct cx25821_buffer, queue);
-
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &dmaq->active, queue)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx88/cx88-blackbird.c b/drivers/media/pci/cx88/cx88-blackbird.c
index c1b41a9283c1..12005100b909 100644
--- a/drivers/media/pci/cx88/cx88-blackbird.c
+++ b/drivers/media/pci/cx88/cx88-blackbird.c
@@ -738,19 +738,15 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)

fail:
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx88_buffer *buf = list_entry(dmaq->active.next,
- struct cx88_buffer, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dmaq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
- }
spin_unlock_irqrestore(&dev->slock, flags);
return err;
}

static void stop_streaming(struct vb2_queue *q)
{
+ struct cx88_buffer *buf;
struct cx8802_dev *dev = q->drv_priv;
struct cx88_dmaqueue *dmaq = &dev->mpegq;
struct cx8802_driver *drv = NULL;
@@ -766,13 +762,8 @@ static void stop_streaming(struct vb2_queue *q)
drv->request_release(drv);

spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx88_buffer *buf = list_entry(dmaq->active.next,
- struct cx88_buffer, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dmaq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx88/cx88-dvb.c b/drivers/media/pci/cx88/cx88-dvb.c
index 2087f2491c42..ce176173f143 100644
--- a/drivers/media/pci/cx88/cx88-dvb.c
+++ b/drivers/media/pci/cx88/cx88-dvb.c
@@ -130,6 +130,7 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)

static void stop_streaming(struct vb2_queue *q)
{
+ struct cx88_buffer *buf;
struct cx8802_dev *dev = q->drv_priv;
struct cx88_dmaqueue *dmaq = &dev->mpegq;
unsigned long flags;
@@ -137,13 +138,8 @@ static void stop_streaming(struct vb2_queue *q)
cx8802_cancel_buffers(dev);

spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx88_buffer *buf = list_entry(dmaq->active.next,
- struct cx88_buffer, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dmaq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx88/cx88-mpeg.c b/drivers/media/pci/cx88/cx88-mpeg.c
index 2c1d5137ac47..6b2c37569505 100644
--- a/drivers/media/pci/cx88/cx88-mpeg.c
+++ b/drivers/media/pci/cx88/cx88-mpeg.c
@@ -276,11 +276,8 @@ static void do_cancel_buffers(struct cx8802_dev *dev)
unsigned long flags;

spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&q->active)) {
- buf = list_entry(q->active.next, struct cx88_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &q->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx88/cx88-vbi.c b/drivers/media/pci/cx88/cx88-vbi.c
index 469aeaa725ad..e3a17e834639 100644
--- a/drivers/media/pci/cx88/cx88-vbi.c
+++ b/drivers/media/pci/cx88/cx88-vbi.c
@@ -204,6 +204,7 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)

static void stop_streaming(struct vb2_queue *q)
{
+ struct cx88_buffer *buf;
struct cx8800_dev *dev = q->drv_priv;
struct cx88_core *core = dev->core;
struct cx88_dmaqueue *dmaq = &dev->vbiq;
@@ -213,13 +214,8 @@ static void stop_streaming(struct vb2_queue *q)
cx_clear(VID_CAPTURE_CONTROL, 0x06);
cx8800_stop_vbi_dma(dev);
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx88_buffer *buf = list_entry(dmaq->active.next,
- struct cx88_buffer, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dmaq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c
index c0ef03ed74f9..a00d280cbb7e 100644
--- a/drivers/media/pci/cx88/cx88-video.c
+++ b/drivers/media/pci/cx88/cx88-video.c
@@ -539,6 +539,7 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)

static void stop_streaming(struct vb2_queue *q)
{
+ struct cx88_buffer *buf;
struct cx8800_dev *dev = q->drv_priv;
struct cx88_core *core = dev->core;
struct cx88_dmaqueue *dmaq = &dev->vidq;
@@ -547,13 +548,8 @@ static void stop_streaming(struct vb2_queue *q)
cx_clear(MO_VID_DMACNTRL, 0x11);
cx_clear(VID_CAPTURE_CONTROL, 0x06);
spin_lock_irqsave(&dev->slock, flags);
- while (!list_empty(&dmaq->active)) {
- struct cx88_buffer *buf = list_entry(dmaq->active.next,
- struct cx88_buffer, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dmaq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/pci/dt3155/dt3155.c b/drivers/media/pci/dt3155/dt3155.c
index 548156b199cc..9bc378dd8c1f 100644
--- a/drivers/media/pci/dt3155/dt3155.c
+++ b/drivers/media/pci/dt3155/dt3155.c
@@ -200,11 +200,8 @@ static void dt3155_stop_streaming(struct vb2_queue *q)
pd->curr_buf = NULL;
}

- while (!list_empty(&pd->dmaq)) {
- vb = list_first_entry(&pd->dmaq, typeof(*vb), done_entry);
- list_del(&vb->done_entry);
+ list_for_each_entry_del(vb, &pd->dmaq, done_entry)
vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irq(&pd->lock);
}

diff --git a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
index d85bfbb77a25..409755858232 100644
--- a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
+++ b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
@@ -625,12 +625,8 @@ static void netup_unidvb_queue_cleanup(struct netup_dma *dma)
unsigned long flags;

spin_lock_irqsave(&dma->lock, flags);
- while (!list_empty(&dma->free_buffers)) {
- buf = list_first_entry(&dma->free_buffers,
- struct netup_unidvb_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dma->free_buffers, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dma->lock, flags);
}

diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
index 0adf3d80f248..d7b039a20489 100644
--- a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
+++ b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
@@ -714,19 +714,14 @@ static int solo_enc_start_streaming(struct vb2_queue *q, unsigned int count)

static void solo_enc_stop_streaming(struct vb2_queue *q)
{
+ struct solo_vb2_buf *buf;
struct solo_enc_dev *solo_enc = vb2_get_drv_priv(q);
unsigned long flags;

spin_lock_irqsave(&solo_enc->av_lock, flags);
solo_enc_off(solo_enc);
- while (!list_empty(&solo_enc->vidq_active)) {
- struct solo_vb2_buf *buf = list_entry(
- solo_enc->vidq_active.next,
- struct solo_vb2_buf, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &solo_enc->vidq_active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&solo_enc->av_lock, flags);
}

diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2.c b/drivers/media/pci/solo6x10/solo6x10-v4l2.c
index e18cc41fca83..d6127ed51801 100644
--- a/drivers/media/pci/solo6x10/solo6x10-v4l2.c
+++ b/drivers/media/pci/solo6x10/solo6x10-v4l2.c
@@ -329,19 +329,14 @@ static int solo_start_streaming(struct vb2_queue *q, unsigned int count)

static void solo_stop_streaming(struct vb2_queue *q)
{
+ struct solo_vb2_buf *buf;
struct solo_dev *solo_dev = vb2_get_drv_priv(q);

solo_stop_thread(solo_dev);

spin_lock(&solo_dev->slock);
- while (!list_empty(&solo_dev->vidq_active)) {
- struct solo_vb2_buf *buf = list_entry(
- solo_dev->vidq_active.next,
- struct solo_vb2_buf, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &solo_dev->vidq_active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock(&solo_dev->slock);
INIT_LIST_HEAD(&solo_dev->vidq_active);
}
diff --git a/drivers/media/pci/tw5864/tw5864-video.c b/drivers/media/pci/tw5864/tw5864-video.c
index 197ed8978102..d94e0580c78a 100644
--- a/drivers/media/pci/tw5864/tw5864-video.c
+++ b/drivers/media/pci/tw5864/tw5864-video.c
@@ -426,6 +426,7 @@ static int tw5864_disable_input(struct tw5864_input *input)

static int tw5864_start_streaming(struct vb2_queue *q, unsigned int count)
{
+ struct tw5864_buf *buf;
struct tw5864_input *input = vb2_get_drv_priv(q);
int ret;

@@ -433,18 +434,14 @@ static int tw5864_start_streaming(struct vb2_queue *q, unsigned int count)
if (!ret)
return 0;

- while (!list_empty(&input->active)) {
- struct tw5864_buf *buf = list_entry(input->active.next,
- struct tw5864_buf, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &input->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
- }
return ret;
}

static void tw5864_stop_streaming(struct vb2_queue *q)
{
+ struct tw5864_buf *buf;
unsigned long flags;
struct tw5864_input *input = vb2_get_drv_priv(q);

@@ -455,13 +452,8 @@ static void tw5864_stop_streaming(struct vb2_queue *q)
vb2_buffer_done(&input->vb->vb.vb2_buf, VB2_BUF_STATE_ERROR);
input->vb = NULL;
}
- while (!list_empty(&input->active)) {
- struct tw5864_buf *buf = list_entry(input->active.next,
- struct tw5864_buf, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &input->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&input->slock, flags);
}

diff --git a/drivers/media/pci/tw68/tw68-video.c b/drivers/media/pci/tw68/tw68-video.c
index 773a18702d36..17c7a6aefbc1 100644
--- a/drivers/media/pci/tw68/tw68-video.c
+++ b/drivers/media/pci/tw68/tw68-video.c
@@ -503,17 +503,13 @@ static int tw68_start_streaming(struct vb2_queue *q, unsigned int count)

static void tw68_stop_streaming(struct vb2_queue *q)
{
+ struct tw68_buf *buf;
struct tw68_dev *dev = vb2_get_drv_priv(q);

/* Stop risc & fifo */
tw_clearl(TW68_DMAC, TW68_DMAP_EN | TW68_FIFO_EN);
- while (!list_empty(&dev->active)) {
- struct tw68_buf *buf =
- container_of(dev->active.next, struct tw68_buf, list);
-
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
}

static const struct vb2_ops tw68_video_qops = {
diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c
index 3ebf7a2c95f0..d8f62911e243 100644
--- a/drivers/media/pci/tw686x/tw686x-video.c
+++ b/drivers/media/pci/tw686x/tw686x-video.c
@@ -130,12 +130,7 @@ static void tw686x_memcpy_buf_refill(struct tw686x_video_channel *vc,
{
struct tw686x_v4l2_buf *buf;

- while (!list_empty(&vc->vidq_queued)) {
-
- buf = list_first_entry(&vc->vidq_queued,
- struct tw686x_v4l2_buf, list);
- list_del(&buf->list);
-
+ list_for_each_entry_del(buf, &vc->vidq_queued, list) {
vc->curr_bufs[pb] = buf;
return;
}
@@ -227,13 +222,9 @@ static void tw686x_sg_buf_refill(struct tw686x_video_channel *vc,
struct tw686x_dev *dev = vc->dev;
struct tw686x_v4l2_buf *buf;

- while (!list_empty(&vc->vidq_queued)) {
+ list_for_each_entry_del(buf, &vc->vidq_queued, list) {
unsigned int buf_len;

- buf = list_first_entry(&vc->vidq_queued,
- struct tw686x_v4l2_buf, list);
- list_del(&buf->list);
-
buf_len = (vc->width * vc->height * vc->format->depth) >> 3;
if (tw686x_sg_desc_fill(vc->sg_descs[pb], buf, buf_len)) {
v4l2_err(&dev->v4l2_dev,
@@ -471,16 +462,11 @@ static void tw686x_buf_queue(struct vb2_buffer *vb)
static void tw686x_clear_queue(struct tw686x_video_channel *vc,
enum vb2_buffer_state state)
{
+ struct tw686x_v4l2_buf *buf;
unsigned int pb;

- while (!list_empty(&vc->vidq_queued)) {
- struct tw686x_v4l2_buf *buf;
-
- buf = list_first_entry(&vc->vidq_queued,
- struct tw686x_v4l2_buf, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &vc->vidq_queued, list)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }

for (pb = 0; pb < 2; pb++) {
if (vc->curr_bufs[pb])
diff --git a/drivers/media/pci/zoran/zoran_driver.c b/drivers/media/pci/zoran/zoran_driver.c
index fa672cc8bc67..86c672e3be9c 100644
--- a/drivers/media/pci/zoran/zoran_driver.c
+++ b/drivers/media/pci/zoran/zoran_driver.c
@@ -932,9 +932,7 @@ static void zr_vb2_stop_streaming(struct vb2_queue *vq)
}

spin_lock_irqsave(&zr->queued_bufs_lock, flags);
- while (!list_empty(&zr->queued_bufs)) {
- buf = list_entry(zr->queued_bufs.next, struct zr_buffer, queue);
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &zr->queued_bufs, queue) {
vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_ERROR);
zr->buf_in_reserve--;
}
diff --git a/drivers/media/platform/chips-media/coda-common.c b/drivers/media/platform/chips-media/coda-common.c
index cc4892129aaf..eefee828a377 100644
--- a/drivers/media/platform/chips-media/coda-common.c
+++ b/drivers/media/platform/chips-media/coda-common.c
@@ -2146,12 +2146,9 @@ static void coda_stop_streaming(struct vb2_queue *q)
flush_work(&ctx->seq_end_work);
}
spin_lock(&ctx->buffer_meta_lock);
- while (!list_empty(&ctx->buffer_meta_list)) {
- meta = list_first_entry(&ctx->buffer_meta_list,
- struct coda_buffer_meta, list);
- list_del(&meta->list);
+ list_for_each_entry_del(meta, &ctx->buffer_meta_list, list)
kfree(meta);
- }
+
ctx->num_metas = 0;
spin_unlock(&ctx->buffer_meta_lock);
kfifo_init(&ctx->bitstream_fifo,
diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-video.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-video.c
index 10840c9a0912..84bd35389a35 100644
--- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-video.c
+++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-video.c
@@ -737,27 +737,17 @@ static void mxc_isi_video_return_buffers(struct mxc_isi_video *video,

spin_lock_irq(&video->buf_lock);

- while (!list_empty(&video->out_active)) {
- buf = list_first_entry(&video->out_active,
- struct mxc_isi_buffer, list);
- list_del_init(&buf->list);
+ list_for_each_entry_del_init(buf, &video->out_active, list) {
if (buf->discard)
continue;

vb2_buffer_done(&buf->v4l2_buf.vb2_buf, state);
}

- while (!list_empty(&video->out_pending)) {
- buf = list_first_entry(&video->out_pending,
- struct mxc_isi_buffer, list);
- list_del_init(&buf->list);
+ list_for_each_entry_del_init(buf, &video->out_pending, list)
vb2_buffer_done(&buf->v4l2_buf.vb2_buf, state);
- }

- while (!list_empty(&video->out_discard)) {
- buf = list_first_entry(&video->out_discard,
- struct mxc_isi_buffer, list);
- list_del_init(&buf->list);
+ list_for_each_entry_del_init(buf, &video->out_discard, list) {
}

INIT_LIST_HEAD(&video->out_active);
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c
index 8f3cba319762..39eecd6ecf68 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c
@@ -867,12 +867,8 @@ static void rkisp1_return_all_buffers(struct rkisp1_capture *cap,
vb2_buffer_done(&cap->buf.next->vb.vb2_buf, state);
cap->buf.next = NULL;
}
- while (!list_empty(&cap->buf.queue)) {
- buf = list_first_entry(&cap->buf.queue,
- struct rkisp1_buffer, queue);
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &cap->buf.queue, queue)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }
spin_unlock_irq(&cap->buf.lock);
}

diff --git a/drivers/media/platform/samsung/exynos4-is/media-dev.c b/drivers/media/platform/samsung/exynos4-is/media-dev.c
index 5f10bb4eb4f7..0825279449b5 100644
--- a/drivers/media/platform/samsung/exynos4-is/media-dev.c
+++ b/drivers/media/platform/samsung/exynos4-is/media-dev.c
@@ -385,13 +385,10 @@ static struct exynos_media_pipeline *fimc_md_pipeline_create(

static void fimc_md_pipelines_free(struct fimc_md *fmd)
{
- while (!list_empty(&fmd->pipelines)) {
- struct fimc_pipeline *p;
+ struct fimc_pipeline *p;

- p = list_entry(fmd->pipelines.next, typeof(*p), list);
- list_del(&p->list);
+ list_for_each_entry_del(p, &fmd->pipelines, list)
kfree(p);
- }
}

static int fimc_md_parse_one_endpoint(struct fimc_md *fmd,
diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c
index f62703cebb77..c0f94ec07f8e 100644
--- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c
+++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c
@@ -1116,10 +1116,7 @@ static void cleanup_ref_queue(struct s5p_mfc_ctx *ctx)
struct s5p_mfc_buf *mb_entry;

/* move buffers in ref queue to src queue */
- while (!list_empty(&ctx->ref_queue)) {
- mb_entry = list_entry((&ctx->ref_queue)->next,
- struct s5p_mfc_buf, list);
- list_del(&mb_entry->list);
+ list_for_each_entry_del(mb_entry, &ctx->ref_queue, list) {
ctx->ref_queue_cnt--;
list_add_tail(&mb_entry->list, &ctx->src_queue);
ctx->src_queue_cnt++;
diff --git a/drivers/media/platform/ti/davinci/vpif_capture.c b/drivers/media/platform/ti/davinci/vpif_capture.c
index 99fae8830c41..4eaf5f306a0a 100644
--- a/drivers/media/platform/ti/davinci/vpif_capture.c
+++ b/drivers/media/platform/ti/davinci/vpif_capture.c
@@ -293,10 +293,7 @@ static void vpif_stop_streaming(struct vb2_queue *vq)
}

spin_lock_irqsave(&common->irqlock, flags);
- while (!list_empty(&common->dma_queue)) {
- common->next_frm = list_entry(common->dma_queue.next,
- struct vpif_cap_buffer, list);
- list_del(&common->next_frm->list);
+ list_for_each_entry_del(common->next_frm, &common->dma_queue, list) {
vb2_buffer_done(&common->next_frm->vb.vb2_buf,
VB2_BUF_STATE_ERROR);
}
diff --git a/drivers/media/platform/ti/davinci/vpif_display.c b/drivers/media/platform/ti/davinci/vpif_display.c
index f8ec2991c667..ba8d3a73f6bb 100644
--- a/drivers/media/platform/ti/davinci/vpif_display.c
+++ b/drivers/media/platform/ti/davinci/vpif_display.c
@@ -280,10 +280,7 @@ static void vpif_stop_streaming(struct vb2_queue *vq)
VB2_BUF_STATE_ERROR);
}

- while (!list_empty(&common->dma_queue)) {
- common->next_frm = list_entry(common->dma_queue.next,
- struct vpif_disp_buffer, list);
- list_del(&common->next_frm->list);
+ list_for_each_entry_del(common->next_frm, &common->dma_queue, list) {
vb2_buffer_done(&common->next_frm->vb.vb2_buf,
VB2_BUF_STATE_ERROR);
}
diff --git a/drivers/media/platform/ti/omap3isp/ispvideo.c b/drivers/media/platform/ti/omap3isp/ispvideo.c
index daca689dc082..931d804e5b7d 100644
--- a/drivers/media/platform/ti/omap3isp/ispvideo.c
+++ b/drivers/media/platform/ti/omap3isp/ispvideo.c
@@ -437,14 +437,10 @@ static void isp_video_buffer_queue(struct vb2_buffer *buf)
static void omap3isp_video_return_buffers(struct isp_video *video,
enum vb2_buffer_state state)
{
- while (!list_empty(&video->dmaqueue)) {
- struct isp_buffer *buf;
+ struct isp_buffer *buf;

- buf = list_first_entry(&video->dmaqueue,
- struct isp_buffer, irqlist);
- list_del(&buf->irqlist);
+ list_for_each_entry_del(buf, &video->dmaqueue, irqlist)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }
}

static int isp_video_start_streaming(struct vb2_queue *queue,
diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-cap.c b/drivers/media/test-drivers/vivid/vivid-kthread-cap.c
index 42048727d7ff..c2bac5a01465 100644
--- a/drivers/media/test-drivers/vivid/vivid-kthread-cap.c
+++ b/drivers/media/test-drivers/vivid/vivid-kthread-cap.c
@@ -830,13 +830,10 @@ void vivid_stop_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming)

*pstreaming = false;
if (pstreaming == &dev->vid_cap_streaming) {
- /* Release all active buffers */
- while (!list_empty(&dev->vid_cap_active)) {
- struct vivid_buffer *buf;
+ struct vivid_buffer *buf;

- buf = list_entry(dev->vid_cap_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ /* Release all active buffers */
+ list_for_each_entry_del(buf, &dev->vid_cap_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_vid_cap);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
@@ -846,12 +843,9 @@ void vivid_stop_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming)
}

if (pstreaming == &dev->vbi_cap_streaming) {
- while (!list_empty(&dev->vbi_cap_active)) {
- struct vivid_buffer *buf;
+ struct vivid_buffer *buf;

- buf = list_entry(dev->vbi_cap_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->vbi_cap_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_vbi_cap);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
@@ -861,12 +855,9 @@ void vivid_stop_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming)
}

if (pstreaming == &dev->meta_cap_streaming) {
- while (!list_empty(&dev->meta_cap_active)) {
- struct vivid_buffer *buf;
+ struct vivid_buffer *buf;

- buf = list_entry(dev->meta_cap_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->meta_cap_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_meta_cap);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-out.c b/drivers/media/test-drivers/vivid/vivid-kthread-out.c
index fac6208b51da..a090512210ef 100644
--- a/drivers/media/test-drivers/vivid/vivid-kthread-out.c
+++ b/drivers/media/test-drivers/vivid/vivid-kthread-out.c
@@ -294,6 +294,8 @@ int vivid_start_generating_vid_out(struct vivid_dev *dev, bool *pstreaming)

void vivid_stop_generating_vid_out(struct vivid_dev *dev, bool *pstreaming)
{
+ struct vivid_buffer *buf;
+
dprintk(dev, 1, "%s\n", __func__);

if (dev->kthread_vid_out == NULL)
@@ -302,12 +304,7 @@ void vivid_stop_generating_vid_out(struct vivid_dev *dev, bool *pstreaming)
*pstreaming = false;
if (pstreaming == &dev->vid_out_streaming) {
/* Release all active buffers */
- while (!list_empty(&dev->vid_out_active)) {
- struct vivid_buffer *buf;
-
- buf = list_entry(dev->vid_out_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->vid_out_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_vid_out);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
@@ -317,12 +314,7 @@ void vivid_stop_generating_vid_out(struct vivid_dev *dev, bool *pstreaming)
}

if (pstreaming == &dev->vbi_out_streaming) {
- while (!list_empty(&dev->vbi_out_active)) {
- struct vivid_buffer *buf;
-
- buf = list_entry(dev->vbi_out_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->vbi_out_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_vbi_out);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
@@ -332,12 +324,7 @@ void vivid_stop_generating_vid_out(struct vivid_dev *dev, bool *pstreaming)
}

if (pstreaming == &dev->meta_out_streaming) {
- while (!list_empty(&dev->meta_out_active)) {
- struct vivid_buffer *buf;
-
- buf = list_entry(dev->meta_out_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->meta_out_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_meta_out);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-touch.c b/drivers/media/test-drivers/vivid/vivid-kthread-touch.c
index fa711ee36a3f..d778da55b317 100644
--- a/drivers/media/test-drivers/vivid/vivid-kthread-touch.c
+++ b/drivers/media/test-drivers/vivid/vivid-kthread-touch.c
@@ -168,17 +168,14 @@ int vivid_start_generating_touch_cap(struct vivid_dev *dev)

void vivid_stop_generating_touch_cap(struct vivid_dev *dev)
{
+ struct vivid_buffer *buf;
+
if (!dev->kthread_touch_cap)
return;

dev->touch_cap_streaming = false;

- while (!list_empty(&dev->touch_cap_active)) {
- struct vivid_buffer *buf;
-
- buf = list_entry(dev->touch_cap_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->touch_cap_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_touch_cap);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
diff --git a/drivers/media/test-drivers/vivid/vivid-sdr-cap.c b/drivers/media/test-drivers/vivid/vivid-sdr-cap.c
index a81f26b76988..4a2365664114 100644
--- a/drivers/media/test-drivers/vivid/vivid-sdr-cap.c
+++ b/drivers/media/test-drivers/vivid/vivid-sdr-cap.c
@@ -297,17 +297,13 @@ static int sdr_cap_start_streaming(struct vb2_queue *vq, unsigned count)
/* abort streaming and wait for last buffer */
static void sdr_cap_stop_streaming(struct vb2_queue *vq)
{
+ struct vivid_buffer *buf;
struct vivid_dev *dev = vb2_get_drv_priv(vq);

if (dev->kthread_sdr_cap == NULL)
return;

- while (!list_empty(&dev->sdr_cap_active)) {
- struct vivid_buffer *buf;
-
- buf = list_entry(dev->sdr_cap_active.next,
- struct vivid_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->sdr_cap_active, list) {
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
&dev->ctrl_hdl_sdr_cap);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
diff --git a/drivers/media/usb/airspy/airspy.c b/drivers/media/usb/airspy/airspy.c
index 462eb8423506..0204adb91ff0 100644
--- a/drivers/media/usb/airspy/airspy.c
+++ b/drivers/media/usb/airspy/airspy.c
@@ -440,19 +440,15 @@ static int airspy_alloc_urbs(struct airspy *s)
/* Must be called with vb_queue_lock hold */
static void airspy_cleanup_queued_bufs(struct airspy *s)
{
+ struct airspy_frame_buf *buf;
unsigned long flags;

dev_dbg(s->dev, "\n");

spin_lock_irqsave(&s->queued_bufs_lock, flags);
- while (!list_empty(&s->queued_bufs)) {
- struct airspy_frame_buf *buf;

- buf = list_entry(s->queued_bufs.next,
- struct airspy_frame_buf, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &s->queued_bufs, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&s->queued_bufs_lock, flags);
}

diff --git a/drivers/media/usb/au0828/au0828-video.c b/drivers/media/usb/au0828/au0828-video.c
index fd9fc43d47e0..cdf679e6a198 100644
--- a/drivers/media/usb/au0828/au0828-video.c
+++ b/drivers/media/usb/au0828/au0828-video.c
@@ -880,6 +880,7 @@ static void au0828_stop_streaming(struct vb2_queue *vq)

void au0828_stop_vbi_streaming(struct vb2_queue *vq)
{
+ struct au0828_buffer *buf;
struct au0828_dev *dev = vb2_get_drv_priv(vq);
struct au0828_dmaqueue *vbiq = &dev->vbiq;
unsigned long flags = 0;
@@ -898,13 +899,9 @@ void au0828_stop_vbi_streaming(struct vb2_queue *vq)
VB2_BUF_STATE_ERROR);
dev->isoc_ctl.vbi_buf = NULL;
}
- while (!list_empty(&vbiq->active)) {
- struct au0828_buffer *buf;

- buf = list_entry(vbiq->active.next, struct au0828_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &vbiq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);

dev->vbi_timeout_running = 0;
diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 25e0620deff1..9c29ae802ba0 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -1136,6 +1136,7 @@ int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count)

static void em28xx_stop_streaming(struct vb2_queue *vq)
{
+ struct em28xx_buffer *buf;
struct em28xx *dev = vb2_get_drv_priv(vq);
struct em28xx_v4l2 *v4l2 = dev->v4l2;
struct em28xx_dmaqueue *vidq = &dev->vidq;
@@ -1159,18 +1160,15 @@ static void em28xx_stop_streaming(struct vb2_queue *vq)
VB2_BUF_STATE_ERROR);
dev->usb_ctl.vid_buf = NULL;
}
- while (!list_empty(&vidq->active)) {
- struct em28xx_buffer *buf;

- buf = list_entry(vidq->active.next, struct em28xx_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &vidq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
{
+ struct em28xx_buffer *buf;
struct em28xx *dev = vb2_get_drv_priv(vq);
struct em28xx_v4l2 *v4l2 = dev->v4l2;
struct em28xx_dmaqueue *vbiq = &dev->vbiq;
@@ -1194,13 +1192,9 @@ void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
VB2_BUF_STATE_ERROR);
dev->usb_ctl.vbi_buf = NULL;
}
- while (!list_empty(&vbiq->active)) {
- struct em28xx_buffer *buf;

- buf = list_entry(vbiq->active.next, struct em28xx_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &vbiq->active, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->slock, flags);
}

diff --git a/drivers/media/usb/msi2500/msi2500.c b/drivers/media/usb/msi2500/msi2500.c
index 9759996ee6a4..99549b4175a3 100644
--- a/drivers/media/usb/msi2500/msi2500.c
+++ b/drivers/media/usb/msi2500/msi2500.c
@@ -543,19 +543,14 @@ static int msi2500_isoc_init(struct msi2500_dev *dev)
/* Must be called with vb_queue_lock hold */
static void msi2500_cleanup_queued_bufs(struct msi2500_dev *dev)
{
+ struct msi2500_frame_buf *buf;
unsigned long flags;

dev_dbg(dev->dev, "\n");

spin_lock_irqsave(&dev->queued_bufs_lock, flags);
- while (!list_empty(&dev->queued_bufs)) {
- struct msi2500_frame_buf *buf;
-
- buf = list_entry(dev->queued_bufs.next,
- struct msi2500_frame_buf, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->queued_bufs, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }
spin_unlock_irqrestore(&dev->queued_bufs_lock, flags);
}

diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c
index e342199711d3..11636ce37a52 100644
--- a/drivers/media/usb/pwc/pwc-if.c
+++ b/drivers/media/usb/pwc/pwc-if.c
@@ -554,17 +554,13 @@ static void pwc_isoc_cleanup(struct pwc_device *pdev)
static void pwc_cleanup_queued_bufs(struct pwc_device *pdev,
enum vb2_buffer_state state)
{
+ struct pwc_frame_buf *buf;
unsigned long flags = 0;

spin_lock_irqsave(&pdev->queued_bufs_lock, flags);
- while (!list_empty(&pdev->queued_bufs)) {
- struct pwc_frame_buf *buf;

- buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf,
- list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &pdev->queued_bufs, list)
vb2_buffer_done(&buf->vb.vb2_buf, state);
- }
spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
}

diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c b/drivers/media/usb/stk1160/stk1160-v4l.c
index a1f785a5ffd8..83a4d4ba68d1 100644
--- a/drivers/media/usb/stk1160/stk1160-v4l.c
+++ b/drivers/media/usb/stk1160/stk1160-v4l.c
@@ -756,10 +756,7 @@ void stk1160_clear_queue(struct stk1160 *dev, enum vb2_buffer_state vb2_state)

/* Release all active buffers */
spin_lock_irqsave(&dev->buf_lock, flags);
- while (!list_empty(&dev->avail_bufs)) {
- buf = list_first_entry(&dev->avail_bufs,
- struct stk1160_buffer, list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &dev->avail_bufs, list) {
vb2_buffer_done(&buf->vb.vb2_buf, vb2_state);
stk1160_dbg("buffer [%p/%d] aborted\n",
buf, buf->vb.vb2_buf.index);
diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c
index 16fa17bbd15e..6b01cc44af84 100644
--- a/drivers/media/usb/uvc/uvc_queue.c
+++ b/drivers/media/usb/uvc/uvc_queue.c
@@ -45,15 +45,12 @@ static inline struct uvc_buffer *uvc_vbuf_to_buffer(struct vb2_v4l2_buffer *buf)
static void uvc_queue_return_buffers(struct uvc_video_queue *queue,
enum uvc_buffer_state state)
{
+ struct uvc_buffer *buf;
enum vb2_buffer_state vb2_state = state == UVC_BUF_STATE_ERROR
? VB2_BUF_STATE_ERROR
: VB2_BUF_STATE_QUEUED;

- while (!list_empty(&queue->irqqueue)) {
- struct uvc_buffer *buf = list_first_entry(&queue->irqqueue,
- struct uvc_buffer,
- queue);
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &queue->irqqueue, queue) {
buf->state = state;
vb2_buffer_done(&buf->buf.vb2_buf, vb2_state);
}
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c
index 26a214f016c1..f7777013354a 100644
--- a/drivers/mtd/ubi/wl.c
+++ b/drivers/mtd/ubi/wl.c
@@ -1718,11 +1718,9 @@ int ubi_thread(void *u)
*/
static void shutdown_work(struct ubi_device *ubi)
{
- while (!list_empty(&ubi->works)) {
- struct ubi_work *wrk;
+ struct ubi_work *wrk;

- wrk = list_entry(ubi->works.next, struct ubi_work, list);
- list_del(&wrk->list);
+ list_for_each_entry_del(wrk, &ubi->works, list) {
wrk->func(ubi, wrk, 1);
ubi->works_count -= 1;
ubi_assert(ubi->works_count >= 0);
diff --git a/drivers/net/ethernet/agere/et131x.c b/drivers/net/ethernet/agere/et131x.c
index 3d9220f9c9fe..30088e6db40c 100644
--- a/drivers/net/ethernet/agere/et131x.c
+++ b/drivers/net/ethernet/agere/et131x.c
@@ -2012,11 +2012,7 @@ static void et131x_rx_dma_memory_free(struct et131x_adapter *adapter)
/* Free RFDs and associated packet descriptors */
WARN_ON(rx_ring->num_ready_recv != rx_ring->num_rfd);

- while (!list_empty(&rx_ring->recv_list)) {
- rfd = list_entry(rx_ring->recv_list.next,
- struct rfd, list_node);
-
- list_del(&rfd->list_node);
+ list_for_each_entry_del(rfd, &rx_ring->recv_list, list_node) {
rfd->skb = NULL;
kfree(rfd);
}
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 0d8e61c63c7c..d80bb466edae 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -12526,11 +12526,8 @@ static void bnx2x_free_mcast_macs_list(struct list_head *mcast_group_list)
{
struct bnx2x_mcast_list_elem_group *current_mcast_group;

- while (!list_empty(mcast_group_list)) {
- current_mcast_group = list_first_entry(mcast_group_list,
- struct bnx2x_mcast_list_elem_group,
- mcast_group_link);
- list_del(&current_mcast_group->mcast_group_link);
+ list_for_each_entry_del(current_mcast_group, mcast_group_list,
+ mcast_group_link) {
free_page((unsigned long)current_mcast_group);
}
}
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
index 8e04552d2216..1d65a0195710 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
@@ -154,13 +154,8 @@ static inline void __bnx2x_exe_queue_reset_pending(
{
struct bnx2x_exeq_elem *elem;

- while (!list_empty(&o->pending_comp)) {
- elem = list_first_entry(&o->pending_comp,
- struct bnx2x_exeq_elem, link);
-
- list_del(&elem->link);
+ list_for_each_entry_del(elem, &o->pending_comp, link)
bnx2x_exe_queue_free_elem(bp, elem);
- }
}

/**
@@ -2659,11 +2654,8 @@ static void bnx2x_free_groups(struct list_head *mcast_group_list)
{
struct bnx2x_mcast_elem_group *current_mcast_group;

- while (!list_empty(mcast_group_list)) {
- current_mcast_group = list_first_entry(mcast_group_list,
- struct bnx2x_mcast_elem_group,
- mcast_group_link);
- list_del(&current_mcast_group->mcast_group_link);
+ list_for_each_entry_del(current_mcast_group, mcast_group_list,
+ mcast_group_link) {
free_page((unsigned long)current_mcast_group);
}
}
diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
index b07522ac3e74..3bae7d6102e8 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c
+++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
@@ -2172,10 +2172,7 @@ bfa_ioc_mbox_flush(struct bfa_ioc *ioc)
struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
struct bfa_mbox_cmd *cmd;

- while (!list_empty(&mod->cmd_q)) {
- cmd = list_first_entry(&mod->cmd_q, struct bfa_mbox_cmd, qe);
- list_del(&cmd->qe);
- }
+ list_for_each_entry_del(cmd, &mod->cmd_q, qe);
}

/**
diff --git a/drivers/net/ethernet/brocade/bna/bfa_msgq.c b/drivers/net/ethernet/brocade/bna/bfa_msgq.c
index fa40d5ec6f1c..a4a06e4486db 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_msgq.c
+++ b/drivers/net/ethernet/brocade/bna/bfa_msgq.c
@@ -57,12 +57,8 @@ cmdq_sm_stopped_entry(struct bfa_msgq_cmdq *cmdq)
cmdq->token = 0;
cmdq->offset = 0;
cmdq->bytes_to_copy = 0;
- while (!list_empty(&cmdq->pending_q)) {
- cmdq_ent = list_first_entry(&cmdq->pending_q,
- struct bfa_msgq_cmd_entry, qe);
- list_del(&cmdq_ent->qe);
+ list_for_each_entry_del(cmdq_ent, &cmdq->pending_q, qe)
call_cmdq_ent_cbfn(cmdq_ent, BFA_STATUS_FAILED);
- }
}

static void
diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
index c05dc7a1c4a1..5e2a812f2705 100644
--- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
+++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
@@ -904,10 +904,7 @@ bna_rx_mcast_delall(struct bna_rx *rx)
}

/* Schedule all entries in active_q for deletion */
- while (!list_empty(&rxf->mcast_active_q)) {
- mac = list_first_entry(&rxf->mcast_active_q,
- struct bna_mac, qe);
- list_del(&mac->qe);
+ list_for_each_entry_del(mac, &rxf->mcast_active_q, qe) {
del_mac = bna_cam_mod_mac_get(bna_mcam_mod_del_q(rxf->rx->bna));
memcpy(del_mac, mac, sizeof(*del_mac));
list_add_tail(&del_mac->qe, &rxf->mcast_pending_del_q);
@@ -2490,9 +2487,7 @@ bna_rx_destroy(struct bna_rx *rx)

bna_rxf_uninit(&rx->rxf);

- while (!list_empty(&rx->rxp_q)) {
- rxp = list_first_entry(&rx->rxp_q, struct bna_rxp, qe);
- list_del(&rxp->qe);
+ list_for_each_entry_del(rxp, &rx->rxp_q, qe) {
GET_RXQS(rxp, q0, q1);
if (rx->rcb_destroy_cbfn)
rx->rcb_destroy_cbfn(rx->bna->bnad, q0->rcb);
diff --git a/drivers/net/ethernet/qlogic/qed/qed_ooo.c b/drivers/net/ethernet/qlogic/qed/qed_ooo.c
index 5d725f59db24..8f07f54b1902 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_ooo.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_ooo.c
@@ -172,12 +172,8 @@ void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
if (!p_archipelago)
return;

- while (!list_empty(&p_archipelago->isles_list)) {
- p_isle = list_first_entry(&p_archipelago->isles_list,
- struct qed_ooo_isle, list_entry);
-
- list_del(&p_isle->list_entry);
-
+ list_for_each_entry_del(p_isle, &p_archipelago->isles_list,
+ list_entry) {
while (!list_empty(&p_isle->buffers_list)) {
p_buffer = list_first_entry(&p_isle->buffers_list,
struct qed_ooo_buffer,
@@ -205,13 +201,8 @@ void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
for (i = 0; i < p_ooo_info->max_num_archipelagos; i++) {
p_archipelago = &(p_ooo_info->p_archipelagos_mem[i]);

- while (!list_empty(&p_archipelago->isles_list)) {
- p_isle = list_first_entry(&p_archipelago->isles_list,
- struct qed_ooo_isle,
- list_entry);
-
- list_del(&p_isle->list_entry);
-
+ list_for_each_entry_del(p_isle, &p_archipelago->isles_list,
+ list_entry) {
while (!list_empty(&p_isle->buffers_list)) {
p_buffer =
list_first_entry(&p_isle->buffers_list,
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index f9dd50152b1e..640b0cb218c2 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -244,10 +244,7 @@ void qlcnic_sriov_cleanup_list(struct qlcnic_trans_list *t_list)

spin_lock_irqsave(&t_list->lock, flags);

- while (!list_empty(&t_list->wait_list)) {
- trans = list_first_entry(&t_list->wait_list,
- struct qlcnic_bc_trans, list);
- list_del(&trans->list);
+ list_for_each_entry_del(trans, &t_list->wait_list, list) {
t_list->count--;
cmd.req.arg = (u32 *)trans->req_pay;
cmd.rsp.arg = (u32 *)trans->rsp_pay;
@@ -1530,10 +1527,7 @@ void qlcnic_sriov_cleanup_async_list(struct qlcnic_back_channel *bc)
cancel_work_sync(&bc->vf_async_work);

spin_lock(&bc->queue_lock);
- while (!list_empty(head)) {
- entry = list_entry(head->next, struct qlcnic_async_cmd,
- list);
- list_del(&entry->list);
+ list_for_each_entry_del(entry, head, list) {
kfree(entry->cmd);
kfree(entry);
}
diff --git a/drivers/net/ethernet/sfc/siena/siena_sriov.c b/drivers/net/ethernet/sfc/siena/siena_sriov.c
index 8353c15dc233..e81284b24621 100644
--- a/drivers/net/ethernet/sfc/siena/siena_sriov.c
+++ b/drivers/net/ethernet/sfc/siena/siena_sriov.c
@@ -1148,10 +1148,7 @@ static void efx_siena_sriov_peer_work(struct work_struct *data)
mutex_unlock(&nic_data->local_lock);

/* Free any now unused endpoint pages */
- while (!list_empty(&pages)) {
- epp = list_first_entry(
- &pages, struct efx_endpoint_page, link);
- list_del(&epp->link);
+ list_for_each_entry_del(epp, &pages, link) {
dma_free_coherent(&efx->pci_dev->dev, EFX_PAGE_SIZE,
epp->ptr, epp->addr);
kfree(epp);
@@ -1174,17 +1171,10 @@ static void efx_siena_sriov_free_local(struct efx_nic *efx)
struct efx_local_addr *local_addr;
struct efx_endpoint_page *epp;

- while (!list_empty(&nic_data->local_addr_list)) {
- local_addr = list_first_entry(&nic_data->local_addr_list,
- struct efx_local_addr, link);
- list_del(&local_addr->link);
+ list_for_each_entry_del(local_addr, &nic_data->local_addr_list, link)
kfree(local_addr);
- }

- while (!list_empty(&nic_data->local_page_list)) {
- epp = list_first_entry(&nic_data->local_page_list,
- struct efx_endpoint_page, link);
- list_del(&epp->link);
+ list_for_each_entry_del(epp, &nic_data->local_page_list, link) {
dma_free_coherent(&efx->pci_dev->dev, EFX_PAGE_SIZE,
epp->ptr, epp->addr);
kfree(epp);
diff --git a/drivers/net/ethernet/sun/ldmvsw.c b/drivers/net/ethernet/sun/ldmvsw.c
index a9a6670b5ff1..886b3ddbee37 100644
--- a/drivers/net/ethernet/sun/ldmvsw.c
+++ b/drivers/net/ethernet/sun/ldmvsw.c
@@ -436,9 +436,7 @@ static void vsw_cleanup(void)

/* just need to free up the vnet list */
mutex_lock(&vnet_list_mutex);
- while (!list_empty(&vnet_list)) {
- vp = list_first_entry(&vnet_list, struct vnet, list);
- list_del(&vp->list);
+ list_for_each_entry_del(vp, &vnet_list, list) {
/* vio_unregister_driver() should have cleaned up port_list */
if (!list_empty(&vp->port_list))
pr_err("Ports not removed by VIO subsystem!\n");
diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c
index e220620d0ffc..3934cc30a999 100644
--- a/drivers/net/ethernet/sun/sunvnet.c
+++ b/drivers/net/ethernet/sun/sunvnet.c
@@ -368,9 +368,7 @@ static void vnet_cleanup(void)
struct net_device *dev;

mutex_lock(&vnet_list_mutex);
- while (!list_empty(&vnet_list)) {
- vp = list_first_entry(&vnet_list, struct vnet, list);
- list_del(&vp->list);
+ list_for_each_entry_del(vp, &vnet_list, list) {
dev = vp->dev;
/* vio_unregister_driver() should have cleaned up port_list */
BUG_ON(!list_empty(&vp->port_list));
diff --git a/drivers/net/wireless/ath/ath10k/qmi.c b/drivers/net/wireless/ath/ath10k/qmi.c
index 52c1a3de8da6..0191b1ad315f 100644
--- a/drivers/net/wireless/ath/ath10k/qmi.c
+++ b/drivers/net/wireless/ath/ath10k/qmi.c
@@ -1030,10 +1030,7 @@ static void ath10k_qmi_driver_event_work(struct work_struct *work)
struct ath10k *ar = qmi->ar;

spin_lock(&qmi->event_lock);
- while (!list_empty(&qmi->event_list)) {
- event = list_first_entry(&qmi->event_list,
- struct ath10k_qmi_driver_event, list);
- list_del(&event->list);
+ list_for_each_entry_del(event, &qmi->event_list, list) {
spin_unlock(&qmi->event_lock);

switch (event->type) {
diff --git a/drivers/net/wireless/ath/ath11k/qmi.c b/drivers/net/wireless/ath/ath11k/qmi.c
index 41fad03a3025..0274982c29f6 100644
--- a/drivers/net/wireless/ath/ath11k/qmi.c
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
@@ -3184,10 +3184,7 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
int ret;

spin_lock(&qmi->event_lock);
- while (!list_empty(&qmi->event_list)) {
- event = list_first_entry(&qmi->event_list,
- struct ath11k_qmi_driver_event, list);
- list_del(&event->list);
+ list_for_each_entry_del(event, &qmi->event_list, list) {
spin_unlock(&qmi->event_lock);

if (test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)) {
diff --git a/drivers/net/wireless/ath/ath12k/qmi.c b/drivers/net/wireless/ath/ath12k/qmi.c
index b2db0436bdde..026e932624ba 100644
--- a/drivers/net/wireless/ath/ath12k/qmi.c
+++ b/drivers/net/wireless/ath/ath12k/qmi.c
@@ -2986,10 +2986,7 @@ static void ath12k_qmi_driver_event_work(struct work_struct *work)
int ret;

spin_lock(&qmi->event_lock);
- while (!list_empty(&qmi->event_list)) {
- event = list_first_entry(&qmi->event_list,
- struct ath12k_qmi_driver_event, list);
- list_del(&event->list);
+ list_for_each_entry_del(event, &qmi->event_list, list) {
spin_unlock(&qmi->event_lock);

if (test_bit(ATH12K_FLAG_UNREGISTERING, &ab->dev_flags))
diff --git a/drivers/net/wireless/ath/ath6kl/htc_pipe.c b/drivers/net/wireless/ath/ath6kl/htc_pipe.c
index 9b88d96bfe96..f8d790482fca 100644
--- a/drivers/net/wireless/ath/ath6kl/htc_pipe.c
+++ b/drivers/net/wireless/ath/ath6kl/htc_pipe.c
@@ -917,12 +917,8 @@ static void do_recv_completion(struct htc_endpoint *ep,
}

/* using legacy EpRecv */
- while (!list_empty(queue_to_indicate)) {
- packet = list_first_entry(queue_to_indicate,
- struct htc_packet, list);
- list_del(&packet->list);
+ list_for_each_entry_del(packet, queue_to_indicate, list)
ep->ep_cb.rx(ep->target, packet);
- }

return;
}
diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index a56fab6232a9..bc0b044e930f 100644
--- a/drivers/net/wireless/ath/ath6kl/txrx.c
+++ b/drivers/net/wireless/ath/ath6kl/txrx.c
@@ -699,11 +699,7 @@ void ath6kl_tx_complete(struct htc_target *target,
spin_lock_bh(&ar->lock);

/* reap completed packets */
- while (!list_empty(packet_queue)) {
- packet = list_first_entry(packet_queue, struct htc_packet,
- list);
- list_del(&packet->list);
-
+ list_for_each_entry_del(packet, packet_queue, list) {
if (WARN_ON_ONCE(packet->endpoint == ENDPOINT_UNUSED ||
packet->endpoint >= ENDPOINT_MAX))
continue;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
index 45fbcbdc7d9e..a87be4cd928a 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
@@ -1663,13 +1663,9 @@ void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr)
if (drvr->proto->pd) {
msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
cancel_work_sync(&msgbuf->flowring_work);
- while (!list_empty(&msgbuf->work_queue)) {
- work = list_first_entry(&msgbuf->work_queue,
- struct brcmf_msgbuf_work_item,
- queue);
- list_del(&work->queue);
+ list_for_each_entry_del(work, &msgbuf->work_queue, queue)
kfree(work);
- }
+
kfree(msgbuf->flow_map);
kfree(msgbuf->txstatus_done_map);
if (msgbuf->txflow_wq)
diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.c b/drivers/net/wireless/intel/ipw2x00/ipw2100.c
index 0812db8936f1..b1852db39dca 100644
--- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c
+++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c
@@ -5785,7 +5785,6 @@ static int ipw2100_close(struct net_device *dev)
{
struct ipw2100_priv *priv = libipw_priv(dev);
unsigned long flags;
- struct list_head *element;
struct ipw2100_tx_packet *packet;

IPW_DEBUG_INFO("enter\n");
@@ -5797,17 +5796,13 @@ static int ipw2100_close(struct net_device *dev)
netif_stop_queue(dev);

/* Flush the TX queue ... */
- while (!list_empty(&priv->tx_pend_list)) {
- element = priv->tx_pend_list.next;
- packet = list_entry(element, struct ipw2100_tx_packet, list);
-
- list_del(element);
+ list_for_each_entry_del(packet, &priv->tx_pend_list, list) {
DEC_STAT(&priv->tx_pend_stat);

libipw_txb_free(packet->info.d_struct.txb);
packet->info.d_struct.txb = NULL;

- list_add_tail(element, &priv->tx_free_list);
+ list_add_tail(&packet->list, &priv->tx_free_list);
INC_STAT(&priv->tx_free_stat);
}
spin_unlock_irqrestore(&priv->low_lock, flags);
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
index 3ab6a68f1e9f..48e92fee9976 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
@@ -2643,13 +2643,10 @@ static void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt,

static void iwl_dump_ini_list_free(struct list_head *list)
{
- while (!list_empty(list)) {
- struct iwl_fw_ini_dump_entry *entry =
- list_entry(list->next, typeof(*entry), list);
+ struct iwl_fw_ini_dump_entry *entry;

- list_del(&entry->list);
+ list_for_each_entry_del(entry, list, list)
vfree(entry);
- }
}

static void iwl_fw_error_dump_data_free(struct iwl_fwrt_dump_data *dump_data)
diff --git a/drivers/net/wireless/intersil/p54/p54spi.c b/drivers/net/wireless/intersil/p54/p54spi.c
index ce0179b8ab36..49453219ff24 100644
--- a/drivers/net/wireless/intersil/p54/p54spi.c
+++ b/drivers/net/wireless/intersil/p54/p54spi.c
@@ -430,12 +430,7 @@ static int p54spi_wq_tx(struct p54s_priv *priv)

spin_lock_irqsave(&priv->tx_lock, flags);

- while (!list_empty(&priv->tx_pending)) {
- entry = list_entry(priv->tx_pending.next,
- struct p54s_tx_info, tx_list);
-
- list_del_init(&entry->tx_list);
-
+ list_for_each_entry_del_init(entry, &priv->tx_pending, tx_list) {
spin_unlock_irqrestore(&priv->tx_lock, flags);

dinfo = container_of((void *) entry, struct p54s_tx_info,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index b8b0c0fda752..3d0c72fd9db4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1962,9 +1962,7 @@ void mt7915_mac_sta_rc_work(struct work_struct *work)
spin_lock_bh(&dev->mt76.sta_poll_lock);
list_splice_init(&dev->sta_rc_list, &list);

- while (!list_empty(&list)) {
- msta = list_first_entry(&list, struct mt7915_sta, rc_list);
- list_del_init(&msta->rc_list);
+ list_for_each_entry_del_init(msta, &list, rc_list) {
changed = msta->changed;
msta->changed = 0;
spin_unlock_bh(&dev->mt76.sta_poll_lock);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
index ac8759febe48..62476348e39c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
@@ -2152,9 +2152,7 @@ void mt7996_mac_sta_rc_work(struct work_struct *work)
spin_lock_bh(&dev->mt76.sta_poll_lock);
list_splice_init(&dev->sta_rc_list, &list);

- while (!list_empty(&list)) {
- msta = list_first_entry(&list, struct mt7996_sta, rc_list);
- list_del_init(&msta->rc_list);
+ list_for_each_entry_del_init(msta, &list, rc_list) {
changed = msta->changed;
msta->changed = 0;
spin_unlock_bh(&dev->mt76.sta_poll_lock);
diff --git a/drivers/net/wwan/wwan_hwsim.c b/drivers/net/wwan/wwan_hwsim.c
index ff3dd24ddb33..8530da9c9562 100644
--- a/drivers/net/wwan/wwan_hwsim.c
+++ b/drivers/net/wwan/wwan_hwsim.c
@@ -318,15 +318,12 @@ static struct wwan_hwsim_dev *wwan_hwsim_dev_new(void)

static void wwan_hwsim_dev_del(struct wwan_hwsim_dev *dev)
{
+ struct wwan_hwsim_port *port;
+
debugfs_remove(dev->debugfs_portcreate); /* Avoid new ports */

spin_lock(&dev->ports_lock);
- while (!list_empty(&dev->ports)) {
- struct wwan_hwsim_port *port;
-
- port = list_first_entry(&dev->ports, struct wwan_hwsim_port,
- list);
- list_del_init(&port->list);
+ list_for_each_entry_del_init(port, &dev->ports, list) {
spin_unlock(&dev->ports_lock);
wwan_hwsim_port_del(port);
spin_lock(&dev->ports_lock);
@@ -489,10 +486,7 @@ static void wwan_hwsim_free_devs(void)
struct wwan_hwsim_dev *dev;

spin_lock(&wwan_hwsim_devs_lock);
- while (!list_empty(&wwan_hwsim_devs)) {
- dev = list_first_entry(&wwan_hwsim_devs, struct wwan_hwsim_dev,
- list);
- list_del_init(&dev->list);
+ list_for_each_entry_del_init(dev, &wwan_hwsim_devs, list) {
spin_unlock(&wwan_hwsim_devs_lock);
wwan_hwsim_dev_del(dev);
spin_lock(&wwan_hwsim_devs_lock);
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 88f760a7cbc3..ffce0f6e5050 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -880,17 +880,13 @@ bool xenvif_mcast_match(struct xenvif *vif, const u8 *addr)

void xenvif_mcast_addr_list_free(struct xenvif *vif)
{
+ struct xenvif_mcast_addr *mcast;
+
/* No need for locking or RCU here. NAPI poll and TX queue
* are stopped.
*/
- while (!list_empty(&vif->fe_mcast_addr)) {
- struct xenvif_mcast_addr *mcast;
-
- mcast = list_first_entry(&vif->fe_mcast_addr,
- struct xenvif_mcast_addr,
- entry);
+ list_for_each_entry_del(mcast, &vif->fe_mcast_addr, entry) {
--vif->fe_mcast_count;
- list_del(&mcast->entry);
kfree(mcast);
}
}
diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
index a15b37750d6e..1e5cf09d2088 100644
--- a/drivers/nvme/host/fc.c
+++ b/drivers/nvme/host/fc.c
@@ -3798,10 +3798,7 @@ static ssize_t nvme_fc_nvme_discovery_store(struct device *dev,
}

process_local_list:
- while (!list_empty(&local_disc_list)) {
- rport = list_first_entry(&local_disc_list,
- struct nvme_fc_rport, disc_list);
- list_del_init(&rport->disc_list);
+ list_for_each_entry_del_init(rport, &local_disc_list, disc_list) {
spin_unlock_irqrestore(&nvme_fc_lock, flags);

lport = rport->lport;
diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
index 4597bca43a6d..46b55f5a6e17 100644
--- a/drivers/nvme/target/rdma.c
+++ b/drivers/nvme/target/rdma.c
@@ -520,15 +520,11 @@ static int nvmet_rdma_post_recv(struct nvmet_rdma_device *ndev,

static void nvmet_rdma_process_wr_wait_list(struct nvmet_rdma_queue *queue)
{
- spin_lock(&queue->rsp_wr_wait_lock);
- while (!list_empty(&queue->rsp_wr_wait_list)) {
- struct nvmet_rdma_rsp *rsp;
- bool ret;
-
- rsp = list_entry(queue->rsp_wr_wait_list.next,
- struct nvmet_rdma_rsp, wait_list);
- list_del(&rsp->wait_list);
+ struct nvmet_rdma_rsp *rsp;
+ bool ret;

+ spin_lock(&queue->rsp_wr_wait_lock);
+ list_for_each_entry_del(rsp, &queue->rsp_wr_wait_list, wait_list) {
spin_unlock(&queue->rsp_wr_wait_lock);
ret = nvmet_rdma_execute_command(rsp);
spin_lock(&queue->rsp_wr_wait_lock);
@@ -1613,6 +1609,7 @@ static int nvmet_rdma_queue_connect(struct rdma_cm_id *cm_id,

static void nvmet_rdma_queue_established(struct nvmet_rdma_queue *queue)
{
+ struct nvmet_rdma_rsp *cmd;
unsigned long flags;

spin_lock_irqsave(&queue->state_lock, flags);
@@ -1622,13 +1619,7 @@ static void nvmet_rdma_queue_established(struct nvmet_rdma_queue *queue)
}
queue->state = NVMET_RDMA_Q_LIVE;

- while (!list_empty(&queue->rsp_wait_list)) {
- struct nvmet_rdma_rsp *cmd;
-
- cmd = list_first_entry(&queue->rsp_wait_list,
- struct nvmet_rdma_rsp, wait_list);
- list_del(&cmd->wait_list);
-
+ list_for_each_entry_del(cmd, &queue->rsp_wait_list, wait_list) {
spin_unlock_irqrestore(&queue->state_lock, flags);
nvmet_rdma_handle_command(queue, cmd);
spin_lock_irqsave(&queue->state_lock, flags);
@@ -1640,6 +1631,7 @@ static void nvmet_rdma_queue_established(struct nvmet_rdma_queue *queue)

static void __nvmet_rdma_queue_disconnect(struct nvmet_rdma_queue *queue)
{
+ struct nvmet_rdma_rsp *rsp;
bool disconnect = false;
unsigned long flags;

@@ -1648,15 +1640,8 @@ static void __nvmet_rdma_queue_disconnect(struct nvmet_rdma_queue *queue)
spin_lock_irqsave(&queue->state_lock, flags);
switch (queue->state) {
case NVMET_RDMA_Q_CONNECTING:
- while (!list_empty(&queue->rsp_wait_list)) {
- struct nvmet_rdma_rsp *rsp;
-
- rsp = list_first_entry(&queue->rsp_wait_list,
- struct nvmet_rdma_rsp,
- wait_list);
- list_del(&rsp->wait_list);
+ list_for_each_entry_del(rsp, &queue->rsp_wait_list, wait_list)
nvmet_rdma_put_rsp(rsp);
- }
fallthrough;
case NVMET_RDMA_Q_LIVE:
queue->state = NVMET_RDMA_Q_DISCONNECTING;
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index bed3cefdaf19..8fcf61cf9754 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -2592,11 +2592,7 @@ static void pci_devices_present_work(struct work_struct *work)

/* Pull this off the queue and process it if it was the last one. */
spin_lock_irqsave(&hbus->device_list_lock, flags);
- while (!list_empty(&hbus->dr_list)) {
- dr = list_first_entry(&hbus->dr_list, struct hv_dr_state,
- list_entry);
- list_del(&dr->list_entry);
-
+ list_for_each_entry_del(dr, &hbus->dr_list, list_entry) {
/* Throw this away if the list still has stuff in it. */
if (!list_empty(&hbus->dr_list)) {
kfree(dr);
@@ -2658,11 +2654,7 @@ static void pci_devices_present_work(struct work_struct *work)
spin_unlock_irqrestore(&hbus->device_list_lock, flags);

/* Delete everything that should no longer exist. */
- while (!list_empty(&removed)) {
- hpdev = list_first_entry(&removed, struct hv_pci_dev,
- list_entry);
- list_del(&hpdev->list_entry);
-
+ list_for_each_entry_del(hpdev, &removed, list_entry) {
if (hpdev->pci_slot)
pci_destroy_slot(hpdev->pci_slot);

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 45e416f68e74..47331b516549 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -3442,12 +3442,8 @@ static int rockchip_pinctrl_remove(struct platform_device *pdev)
bank = &info->ctrl->pin_banks[i];

mutex_lock(&bank->deferred_lock);
- while (!list_empty(&bank->deferred_pins)) {
- cfg = list_first_entry(&bank->deferred_pins,
- struct rockchip_pin_deferred, head);
- list_del(&cfg->head);
+ list_for_each_entry_del(cfg, &bank->deferred_pins, head)
kfree(cfg);
- }
mutex_unlock(&bank->deferred_lock);
}

diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c
index a1f2acd6fb8f..70f695ccf759 100644
--- a/drivers/s390/net/lcs.c
+++ b/drivers/s390/net/lcs.c
@@ -432,10 +432,7 @@ static void lcs_clear_multicast_list(struct lcs_card *card)
/* Free multicast list. */
LCS_DBF_TEXT(3, setup, "clmclist");
spin_lock_irqsave(&card->ipm_lock, flags);
- while (!list_empty(&card->ipm_list)){
- ipm = list_entry(card->ipm_list.next,
- struct lcs_ipm_list, list);
- list_del(&ipm->list);
+ list_for_each_entry_del(ipm, &card->ipm_list, list) {
if (ipm->ipm_state != LCS_IPM_STATE_SET_REQUIRED){
spin_unlock_irqrestore(&card->ipm_lock, flags);
lcs_send_delipm(card, ipm);
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
index e7cc927ed952..93c85582e4da 100644
--- a/drivers/scsi/aacraid/commctrl.c
+++ b/drivers/scsi/aacraid/commctrl.c
@@ -359,14 +359,10 @@ int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx)
/*
* First free any FIBs that have not been consumed.
*/
- while (!list_empty(&fibctx->fib_list)) {
- struct list_head * entry;
+ list_for_each_entry_del(fib, &fibctx->fib_list, fiblink) {
/*
* Pull the next fib from the fibs
*/
- entry = fibctx->fib_list.next;
- list_del(entry);
- fib = list_entry(entry, struct fib, fiblink);
fibctx->count--;
/*
* Free the space occupied by this copy of the fib.
diff --git a/drivers/scsi/bnx2i/bnx2i_init.c b/drivers/scsi/bnx2i/bnx2i_init.c
index 872ad37e2a6e..4155f6710e65 100644
--- a/drivers/scsi/bnx2i/bnx2i_init.c
+++ b/drivers/scsi/bnx2i/bnx2i_init.c
@@ -525,9 +525,7 @@ static void __exit bnx2i_mod_exit(void)
struct bnx2i_hba *hba;

mutex_lock(&bnx2i_dev_lock);
- while (!list_empty(&adapter_list)) {
- hba = list_entry(adapter_list.next, struct bnx2i_hba, link);
- list_del(&hba->link);
+ list_for_each_entry_del(hba, &adapter_list, link) {
adapter_count--;

if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) {
diff --git a/drivers/scsi/csiostor/csio_mb.c b/drivers/scsi/csiostor/csio_mb.c
index 94810b19e747..a6fac1e4574d 100644
--- a/drivers/scsi/csiostor/csio_mb.c
+++ b/drivers/scsi/csiostor/csio_mb.c
@@ -1357,10 +1357,7 @@ csio_mb_completions(struct csio_hw *hw, struct list_head *cbfn_q)
struct csio_mbm *mbm = &hw->mbm;
enum fw_retval rv;

- while (!list_empty(cbfn_q)) {
- mbp = list_first_entry(cbfn_q, struct csio_mb, list);
- list_del_init(&mbp->list);
-
+ list_for_each_entry_del_init(mbp, cbfn_q, list) {
rv = csio_mb_fw_retval(mbp);
if ((rv != FW_SUCCESS) && (rv != FW_HOSTERROR))
CSIO_INC_STATS(mbm, n_err);
diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c
index 05e1a63e00c3..c96f8afabf34 100644
--- a/drivers/scsi/csiostor/csio_scsi.c
+++ b/drivers/scsi/csiostor/csio_scsi.c
@@ -2417,6 +2417,7 @@ csio_scsi_free_ddp_bufs(struct csio_scsim *scm, struct csio_hw *hw)
int
csio_scsim_init(struct csio_scsim *scm, struct csio_hw *hw)
{
+ struct csio_sm *tmp;
int i;
struct csio_ioreq *ioreq;
struct csio_dma_buf *dma_buf;
@@ -2477,12 +2478,7 @@ csio_scsim_init(struct csio_scsim *scm, struct csio_hw *hw)
* Free up existing allocations, since an error
* from here means we are returning for good
*/
- while (!list_empty(&scm->ioreq_freelist)) {
- struct csio_sm *tmp;
-
- tmp = list_first_entry(&scm->ioreq_freelist,
- struct csio_sm, sm_list);
- list_del_init(&tmp->sm_list);
+ list_for_each_entry_del_init(tmp, &scm->ioreq_freelist, sm_list) {
ioreq = (struct csio_ioreq *)tmp;

dma_buf = &ioreq->dma_buf;
@@ -2505,15 +2501,11 @@ csio_scsim_init(struct csio_scsim *scm, struct csio_hw *hw)
void
csio_scsim_exit(struct csio_scsim *scm)
{
+ struct csio_sm *tmp;
struct csio_ioreq *ioreq;
struct csio_dma_buf *dma_buf;

- while (!list_empty(&scm->ioreq_freelist)) {
- struct csio_sm *tmp;
-
- tmp = list_first_entry(&scm->ioreq_freelist,
- struct csio_sm, sm_list);
- list_del_init(&tmp->sm_list);
+ list_for_each_entry_del_init(tmp, &scm->ioreq_freelist, sm_list) {
ioreq = (struct csio_ioreq *)tmp;

dma_buf = &ioreq->dma_buf;
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index 59599299615d..624197378797 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -786,9 +786,7 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
unsigned long flags;

spin_lock_irqsave(hostdata->host->host_lock, flags);
- while (!list_empty(&hostdata->sent)) {
- evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list);
- list_del(&evt->list);
+ list_for_each_entry_del(evt, &hostdata->sent, list) {
del_timer(&evt->timer);

spin_unlock_irqrestore(hostdata->host->host_lock, flags);
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 0fda8905eabd..783e454fe351 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1620,10 +1620,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
* overflow us with nop-ins
*/
check_mgmt:
- while (!list_empty(&conn->mgmtqueue)) {
- task = list_entry(conn->mgmtqueue.next, struct iscsi_task,
- running);
- list_del_init(&task->running);
+ list_for_each_entry_del_init(task, &conn->mgmtqueue, running) {
if (iscsi_prep_mgmt_task(conn, task)) {
/* regular RX path uses back_lock */
spin_lock_bh(&conn->session->back_lock);
@@ -1659,10 +1656,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
}

/* process pending command queue */
- while (!list_empty(&conn->cmdqueue)) {
- task = list_entry(conn->cmdqueue.next, struct iscsi_task,
- running);
- list_del_init(&task->running);
+ list_for_each_entry_del_init(task, &conn->cmdqueue, running) {
if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
fail_scsi_task(task, DID_IMM_RETRY);
continue;
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 9047cfcd1072..b038e9887ada 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -657,15 +657,13 @@ static void sas_eh_handle_resets(struct Scsi_Host *shost)
{
struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
struct sas_internal *i = to_sas_internal(shost->transportt);
+ struct ssp_device *ssp;

/* handle directed resets to sas devices */
spin_lock_irq(&ha->lock);
- while (!list_empty(&ha->eh_dev_q)) {
+ list_for_each_entry_del_init(ssp, &ha->eh_dev_q, eh_list_node) {
struct domain_device *dev;
- struct ssp_device *ssp;

- ssp = list_entry(ha->eh_dev_q.next, typeof(*ssp), eh_list_node);
- list_del_init(&ssp->eh_list_node);
dev = container_of(ssp, typeof(*dev), ssp_dev);
kref_get(&dev->kref);
WARN_ONCE(dev_is_sata(dev), "ssp reset to ata device?\n");
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c
index 595dca92e8db..4ad6700304e1 100644
--- a/drivers/scsi/lpfc/lpfc_bsg.c
+++ b/drivers/scsi/lpfc/lpfc_bsg.c
@@ -782,16 +782,12 @@ lpfc_bsg_event_free(struct kref *kref)

list_del(&evt->node);

- while (!list_empty(&evt->events_to_get)) {
- ed = list_entry(evt->events_to_get.next, typeof(*ed), node);
- list_del(&ed->node);
+ list_for_each_entry_del(ed, &evt->events_to_get, node) {
kfree(ed->data);
kfree(ed);
}

- while (!list_empty(&evt->events_to_see)) {
- ed = list_entry(evt->events_to_see.next, typeof(*ed), node);
- list_del(&ed->node);
+ list_for_each_entry_del(ed, &evt->events_to_see, node) {
kfree(ed->data);
kfree(ed);
}
diff --git a/drivers/scsi/lpfc/lpfc_mem.c b/drivers/scsi/lpfc/lpfc_mem.c
index 89cbeba06aea..ca717c0d10e8 100644
--- a/drivers/scsi/lpfc/lpfc_mem.c
+++ b/drivers/scsi/lpfc/lpfc_mem.c
@@ -259,13 +259,9 @@ lpfc_mem_free(struct lpfc_hba *phba)
/* Free Device Data memory pool */
if (phba->device_data_mem_pool) {
/* Ensure all objects have been returned to the pool */
- while (!list_empty(&phba->luns)) {
- device_data = list_first_entry(&phba->luns,
- struct lpfc_device_data,
- listentry);
- list_del(&device_data->listentry);
+ list_for_each_entry_del(device_data, &phba->luns, listentry)
mempool_free(device_data, phba->device_data_mem_pool);
- }
+
mempool_destroy(phba->device_data_mem_pool);
}
phba->device_data_mem_pool = NULL;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index e1aa667dae66..2f31e5fceee8 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2780,10 +2780,7 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance)
}

reset_index = 0;
- while (!list_empty(&clist_local)) {
- reset_cmd = list_entry((&clist_local)->next,
- struct megasas_cmd, list);
- list_del_init(&reset_cmd->list);
+ list_for_each_entry_del_init(reset_cmd, &clist_local, list) {
if (reset_cmd->scmd) {
reset_cmd->scmd->result = DID_REQUEUE << 16;
dev_notice(&instance->pdev->dev, "%d:%p reset [%02x]\n",
@@ -3822,11 +3819,7 @@ megasas_issue_pending_cmds_again(struct megasas_instance *instance)
list_splice_init(&instance->internal_reset_pending_q, &clist_local);
spin_unlock_irqrestore(&instance->hba_lock, flags);

- while (!list_empty(&clist_local)) {
- cmd = list_entry((&clist_local)->next,
- struct megasas_cmd, list);
- list_del_init(&cmd->list);
-
+ list_for_each_entry_del_init(cmd, &clist_local, list) {
if (cmd->sync_cmd || cmd->scmd) {
dev_notice(&instance->pdev->dev, "command %p, %p:%d"
"detected to be pending while HBA reset\n",
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
index 89ba015c5d7e..85e5a5d7779f 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_os.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
@@ -2096,17 +2096,12 @@ void mpi3mr_flush_delayed_cmd_lists(struct mpi3mr_ioc *mrioc)
struct delayed_evt_ack_node *_evtack_node;

dprint_reset(mrioc, "flushing delayed dev_remove_hs commands\n");
- while (!list_empty(&mrioc->delayed_rmhs_list)) {
- _rmhs_node = list_entry(mrioc->delayed_rmhs_list.next,
- struct delayed_dev_rmhs_node, list);
- list_del(&_rmhs_node->list);
+ list_for_each_entry_del(_rmhs_node, &mrioc->delayed_rmhs_list, list)
kfree(_rmhs_node);
- }
+
dprint_reset(mrioc, "flushing delayed event ack commands\n");
- while (!list_empty(&mrioc->delayed_evtack_cmds_list)) {
- _evtack_node = list_entry(mrioc->delayed_evtack_cmds_list.next,
- struct delayed_evt_ack_node, list);
- list_del(&_evtack_node->list);
+ list_for_each_entry_del(_evtack_node,
+ &mrioc->delayed_evtack_cmds_list, list) {
kfree(_evtack_node);
}
}
diff --git a/drivers/scsi/mvumi.c b/drivers/scsi/mvumi.c
index d9d366ec17dc..6066ce52bfcd 100644
--- a/drivers/scsi/mvumi.c
+++ b/drivers/scsi/mvumi.c
@@ -347,10 +347,7 @@ static void mvumi_free_cmds(struct mvumi_hba *mhba)
{
struct mvumi_cmd *cmd;

- while (!list_empty(&mhba->cmd_pool)) {
- cmd = list_first_entry(&mhba->cmd_pool, struct mvumi_cmd,
- queue_pointer);
- list_del(&cmd->queue_pointer);
+ list_for_each_entry_del(cmd, &mhba->cmd_pool, queue_pointer) {
if (!(mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC))
kfree(cmd->frame);
kfree(cmd);
@@ -388,10 +385,7 @@ static int mvumi_alloc_cmds(struct mvumi_hba *mhba)
err_exit:
dev_err(&mhba->pdev->dev,
"failed to allocate memory for cmd[0x%x].\n", i);
- while (!list_empty(&mhba->cmd_pool)) {
- cmd = list_first_entry(&mhba->cmd_pool, struct mvumi_cmd,
- queue_pointer);
- list_del(&cmd->queue_pointer);
+ list_for_each_entry_del(cmd, &mhba->cmd_pool, queue_pointer) {
if (!(mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC))
kfree(cmd->frame);
kfree(cmd);
@@ -1767,10 +1761,7 @@ static void mvumi_handle_clob(struct mvumi_hba *mhba)
struct mvumi_cmd *cmd;
struct mvumi_ob_data *pool;

- while (!list_empty(&mhba->free_ob_list)) {
- pool = list_first_entry(&mhba->free_ob_list,
- struct mvumi_ob_data, list);
- list_del_init(&pool->list);
+ list_for_each_entry_del_init(pool, &mhba->free_ob_list, list) {
list_add_tail(&pool->list, &mhba->ob_data_list);

ob_frame = (struct mvumi_rsp_frame *) &pool->data[0];
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
index 6e5e89aaa283..be98b5b066cf 100644
--- a/drivers/scsi/qla1280.c
+++ b/drivers/scsi/qla1280.c
@@ -1238,11 +1238,7 @@ qla1280_done(struct scsi_qla_host *ha)

done_q = &ha->done_q;

- while (!list_empty(done_q)) {
- sp = list_entry(done_q->next, struct srb, list);
-
- list_del(&sp->list);
-
+ list_for_each_entry_del(sp, done_q, list) {
cmd = sp->cmd;
bus = SCSI_BUS_32(cmd);
target = SCSI_TCN_32(cmd);
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 2ef2dbac0db2..5a58356d58d4 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -6320,6 +6320,7 @@ static void qlt_abort_work(struct qla_tgt *tgt,

static void qlt_sess_work_fn(struct work_struct *work)
{
+ struct qla_tgt_sess_work_param *prm;
struct qla_tgt *tgt = container_of(work, struct qla_tgt, sess_work);
struct scsi_qla_host *vha = tgt->vha;
unsigned long flags;
@@ -6327,17 +6328,12 @@ static void qlt_sess_work_fn(struct work_struct *work)
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf000, "Sess work (tgt %p)", tgt);

spin_lock_irqsave(&tgt->sess_work_lock, flags);
- while (!list_empty(&tgt->sess_works_list)) {
- struct qla_tgt_sess_work_param *prm = list_entry(
- tgt->sess_works_list.next, typeof(*prm),
- sess_works_list_entry);
-
- /*
- * This work can be scheduled on several CPUs at time, so we
- * must delete the entry to eliminate double processing
- */
- list_del(&prm->sess_works_list_entry);
-
+ /*
+ * This work can be scheduled on several CPUs at time, so we
+ * must delete the entry to eliminate double processing
+ */
+ list_for_each_entry_del(prm, &tgt->sess_works_list,
+ sess_works_list_entry) {
spin_unlock_irqrestore(&tgt->sess_work_lock, flags);

switch (prm->type) {
diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 0803b296e9ac..919ca5fae425 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
@@ -637,10 +637,7 @@ void atomisp_flush_params_queue(struct atomisp_video_pipe *pipe)
{
struct atomisp_css_params_with_list *param;

- while (!list_empty(&pipe->per_frame_params)) {
- param = list_entry(pipe->per_frame_params.next,
- struct atomisp_css_params_with_list, list);
- list_del(&param->list);
+ list_for_each_entry_del(param, &pipe->per_frame_params, list) {
atomisp_free_css_parameters(&param->params);
kvfree(param);
}
diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c
index 22fa4d6cae10..158b8421fb82 100644
--- a/drivers/staging/media/omap4iss/iss_video.c
+++ b/drivers/staging/media/omap4iss/iss_video.c
@@ -495,18 +495,13 @@ struct iss_buffer *omap4iss_video_buffer_next(struct iss_video *video)
*/
void omap4iss_video_cancel_stream(struct iss_video *video)
{
+ struct iss_buffer *buf;
unsigned long flags;

spin_lock_irqsave(&video->qlock, flags);

- while (!list_empty(&video->dmaqueue)) {
- struct iss_buffer *buf;
-
- buf = list_first_entry(&video->dmaqueue, struct iss_buffer,
- list);
- list_del(&buf->list);
+ list_for_each_entry_del(buf, &video->dmaqueue, list)
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- }

vb2_queue_error(video->queue);
video->error = true;
diff --git a/drivers/staging/nvec/nvec.c b/drivers/staging/nvec/nvec.c
index 2823cacde130..1ed84cf8195e 100644
--- a/drivers/staging/nvec/nvec.c
+++ b/drivers/staging/nvec/nvec.c
@@ -442,9 +442,7 @@ static void nvec_dispatch(struct work_struct *work)
struct nvec_msg *msg;

spin_lock_irqsave(&nvec->rx_lock, flags);
- while (!list_empty(&nvec->rx_data)) {
- msg = list_first_entry(&nvec->rx_data, struct nvec_msg, node);
- list_del_init(&msg->node);
+ list_for_each_entry_del_init(msg, &nvec->rx_data, node) {
spin_unlock_irqrestore(&nvec->rx_lock, flags);

if (nvec->sync_write_pending ==
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
index 4718db628222..bb272ca7606b 100644
--- a/drivers/target/target_core_tmr.c
+++ b/drivers/target/target_core_tmr.c
@@ -338,10 +338,7 @@ static void core_tmr_drain_state_list(
TMR_LUN_RESET_PRO : TMR_LUN_RESET,
&drain_task_list);

- while (!list_empty(&drain_task_list)) {
- cmd = list_entry(drain_task_list.next, struct se_cmd, state_list);
- list_del_init(&cmd->state_list);
-
+ list_for_each_entry_del_init(cmd, &drain_task_list, state_list) {
target_show_cmd("LUN_RESET: ", cmd);
pr_debug("LUN_RESET: ITT[0x%08llx] - %s pr_res_key: 0x%016Lx\n",
cmd->tag, (preempt_and_abort_list) ? "preempt" : "",
diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
index df5fb5410b72..bcf70a09388f 100644
--- a/drivers/tee/optee/call.c
+++ b/drivers/tee/optee/call.c
@@ -145,10 +145,7 @@ void optee_shm_arg_cache_uninit(struct optee *optee)
struct optee_shm_arg_entry *entry;

mutex_destroy(&optee->shm_arg_cache.mutex);
- while (!list_empty(head)) {
- entry = list_first_entry(head, struct optee_shm_arg_entry,
- list_node);
- list_del(&entry->list_node);
+ list_for_each_entry_del(entry, head, list_node) {
if (find_first_bit(entry->map, MAX_ARG_COUNT_PER_ENTRY) !=
MAX_ARG_COUNT_PER_ENTRY) {
pr_err("Freeing non-free entry\n");
diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index 4b7bec74e89f..ef6426eddee9 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -308,13 +308,8 @@ static void ring_work(struct work_struct *work)
invoke_callback:
/* allow callbacks to schedule new work */
spin_unlock_irqrestore(&ring->lock, flags);
- while (!list_empty(&done)) {
- frame = list_first_entry(&done, typeof(*frame), list);
- /*
- * The callback may reenqueue or delete frame.
- * Do not hold on to it.
- */
- list_del_init(&frame->list);
+ /* The callback may reenqueue or delete frame. Do not hold on to it. */
+ list_for_each_entry_del_init(frame, &done, list) {
if (frame->callback)
frame->callback(ring, frame, canceled);
}
diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c
index dd0a1ef8cf12..bc311cb6a833 100644
--- a/drivers/thunderbolt/tb.c
+++ b/drivers/thunderbolt/tb.c
@@ -1466,6 +1466,7 @@ static void tb_dp_resource_available(struct tb *tb, struct tb_port *port)

static void tb_disconnect_and_release_dp(struct tb *tb)
{
+ struct tb_port *port;
struct tb_cm *tcm = tb_priv(tb);
struct tb_tunnel *tunnel, *n;

@@ -1478,12 +1479,7 @@ static void tb_disconnect_and_release_dp(struct tb *tb)
tb_deactivate_and_free_tunnel(tunnel);
}

- while (!list_empty(&tcm->dp_resources)) {
- struct tb_port *port;
-
- port = list_first_entry(&tcm->dp_resources,
- struct tb_port, list);
- list_del_init(&port->list);
+ list_for_each_entry_del_init(port, &tcm->dp_resources, list) {
}
}

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 12b6dfeaf658..0fba3ac7de73 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1666,6 +1666,7 @@ static void __usb_hcd_giveback_urb(struct urb *urb)

static void usb_giveback_urb_bh(struct tasklet_struct *t)
{
+ struct urb *urb;
struct giveback_urb_bh *bh = from_tasklet(bh, t, bh);
struct list_head local_list;

@@ -1674,11 +1675,7 @@ static void usb_giveback_urb_bh(struct tasklet_struct *t)
list_replace_init(&bh->head, &local_list);
spin_unlock_irq(&bh->lock);

- while (!list_empty(&local_list)) {
- struct urb *urb;
-
- urb = list_entry(local_list.next, struct urb, urb_list);
- list_del_init(&urb->urb_list);
+ list_for_each_entry_del_init(urb, &local_list, urb_list) {
bh->completing_ep = urb->ep;
__usb_hcd_giveback_urb(urb);
bh->completing_ep = NULL;
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 0ff47eeffb49..d1e94b7b461e 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -816,22 +816,17 @@ hub_clear_tt_buffer(struct usb_device *hdev, u16 devinfo, u16 tt)
*/
static void hub_tt_work(struct work_struct *work)
{
+ struct usb_tt_clear *clear;
struct usb_hub *hub =
container_of(work, struct usb_hub, tt.clear_work);
unsigned long flags;

spin_lock_irqsave(&hub->tt.lock, flags);
- while (!list_empty(&hub->tt.clear_list)) {
- struct list_head *next;
- struct usb_tt_clear *clear;
+ list_for_each_entry_del(clear, &hub->tt.clear_list, clear_list) {
struct usb_device *hdev = hub->hdev;
const struct hc_driver *drv;
int status;

- next = hub->tt.clear_list.next;
- clear = list_entry(next, struct usb_tt_clear, clear_list);
- list_del(&clear->clear_list);
-
/* drop lock so HCD can concurrently report other TT errors */
spin_unlock_irqrestore(&hub->tt.lock, flags);
status = hub_clear_tt_buffer(hdev, clear->devinfo, clear->tt);
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 0ace45b66a31..e894c798a273 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -1124,12 +1124,9 @@ int usb_add_config(struct usb_composite_dev *cdev,
status = usb_gadget_check_config(cdev->gadget);

if (status < 0) {
- while (!list_empty(&config->functions)) {
- struct usb_function *f;
+ struct usb_function *f;

- f = list_first_entry(&config->functions,
- struct usb_function, list);
- list_del(&f->list);
+ list_for_each_entry_del(f, &config->functions, list) {
if (f->unbind) {
DBG(cdev, "unbind function '%s'/%p\n",
f->name, f);
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
index 076dd4c1be96..e2dead3691c1 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -1149,18 +1149,12 @@ static int printer_func_bind(struct usb_configuration *c,
device_destroy(&usb_gadget_class, devt);

fail_rx_reqs:
- while (!list_empty(&dev->rx_reqs)) {
- req = container_of(dev->rx_reqs.next, struct usb_request, list);
- list_del(&req->list);
+ list_for_each_entry_del(req, &dev->rx_reqs, list)
printer_req_free(dev->out_ep, req);
- }

fail_tx_reqs:
- while (!list_empty(&dev->tx_reqs)) {
- req = container_of(dev->tx_reqs.next, struct usb_request, list);
- list_del(&req->list);
+ list_for_each_entry_del(req, &dev->tx_reqs, list)
printer_req_free(dev->in_ep, req);
- }

usb_free_all_descriptors(f);
return ret;
@@ -1423,29 +1417,17 @@ static void printer_func_unbind(struct usb_configuration *c,
WARN_ON(!list_empty(&dev->rx_reqs_active));

/* Free all memory for this driver. */
- while (!list_empty(&dev->tx_reqs)) {
- req = container_of(dev->tx_reqs.next, struct usb_request,
- list);
- list_del(&req->list);
+ list_for_each_entry_del(req, &dev->tx_reqs, list)
printer_req_free(dev->in_ep, req);
- }

if (dev->current_rx_req != NULL)
printer_req_free(dev->out_ep, dev->current_rx_req);

- while (!list_empty(&dev->rx_reqs)) {
- req = container_of(dev->rx_reqs.next,
- struct usb_request, list);
- list_del(&req->list);
+ list_for_each_entry_del(req, &dev->rx_reqs, list)
printer_req_free(dev->out_ep, req);
- }

- while (!list_empty(&dev->rx_buffers)) {
- req = container_of(dev->rx_buffers.next,
- struct usb_request, list);
- list_del(&req->list);
+ list_for_each_entry_del(req, &dev->rx_buffers, list)
printer_req_free(dev->out_ep, req);
- }
usb_free_all_descriptors(f);
}

diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index 4bb0553da658..a229ef44cec7 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -375,9 +375,7 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags)

/* fill unused rxq slots with some skb */
spin_lock_irqsave(&dev->req_lock, flags);
- while (!list_empty(&dev->rx_reqs)) {
- req = list_first_entry(&dev->rx_reqs, struct usb_request, list);
- list_del_init(&req->list);
+ list_for_each_entry_del_init(req, &dev->rx_reqs, list) {
spin_unlock_irqrestore(&dev->req_lock, flags);

if (rx_submit(dev, req, gfp_flags) < 0) {
@@ -1209,10 +1207,7 @@ void gether_disconnect(struct gether *link)
*/
usb_ep_disable(link->in_ep);
spin_lock(&dev->req_lock);
- while (!list_empty(&dev->tx_reqs)) {
- req = list_first_entry(&dev->tx_reqs, struct usb_request, list);
- list_del(&req->list);
-
+ list_for_each_entry_del(req, &dev->tx_reqs, list) {
spin_unlock(&dev->req_lock);
usb_ep_free_request(link->in_ep, req);
spin_lock(&dev->req_lock);
@@ -1222,10 +1217,7 @@ void gether_disconnect(struct gether *link)

usb_ep_disable(link->out_ep);
spin_lock(&dev->req_lock);
- while (!list_empty(&dev->rx_reqs)) {
- req = list_first_entry(&dev->rx_reqs, struct usb_request, list);
- list_del(&req->list);
-
+ list_for_each_entry_del(req, &dev->rx_reqs, list) {
spin_unlock(&dev->req_lock);
usb_ep_free_request(link->out_ep, req);
spin_lock(&dev->req_lock);
diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c
index a92eb6d90976..d06772183eb7 100644
--- a/drivers/usb/gadget/function/u_serial.c
+++ b/drivers/usb/gadget/function/u_serial.c
@@ -494,9 +494,7 @@ static void gs_free_requests(struct usb_ep *ep, struct list_head *head,
{
struct usb_request *req;

- while (!list_empty(head)) {
- req = list_entry(head->next, struct usb_request, list);
- list_del(&req->list);
+ list_for_each_entry_del(req, head, list) {
gs_free_req(ep, req);
if (allocated)
(*allocated)--;
diff --git a/drivers/usb/gadget/function/uvc_queue.c b/drivers/usb/gadget/function/uvc_queue.c
index 0aa3d7e1f3cc..616368964d79 100644
--- a/drivers/usb/gadget/function/uvc_queue.c
+++ b/drivers/usb/gadget/function/uvc_queue.c
@@ -254,10 +254,7 @@ void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect)
unsigned long flags;

spin_lock_irqsave(&queue->irqlock, flags);
- while (!list_empty(&queue->irqqueue)) {
- buf = list_first_entry(&queue->irqqueue, struct uvc_buffer,
- queue);
- list_del(&buf->queue);
+ list_for_each_entry_del(buf, &queue->irqqueue, queue) {
buf->state = UVC_BUF_STATE_ERROR;
vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_ERROR);
}
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
index ce9e31f3d26b..62bfba1cdff5 100644
--- a/drivers/usb/gadget/legacy/inode.c
+++ b/drivers/usb/gadget/legacy/inode.c
@@ -1540,18 +1540,18 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)

static void destroy_ep_files (struct dev_data *dev)
{
+ struct ep_data *ep;
+
DBG (dev, "%s %d\n", __func__, dev->state);

/* dev->state must prevent interference */
spin_lock_irq (&dev->lock);
- while (!list_empty(&dev->epfiles)) {
- struct ep_data *ep;
+
+ /* break link to FS */
+ list_for_each_entry_del_init(ep, &dev->epfiles, epfiles) {
struct inode *parent;
struct dentry *dentry;

- /* break link to FS */
- ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles);
- list_del_init (&ep->epfiles);
spin_unlock_irq (&dev->lock);

dentry = ep->dentry;
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c
index 0953e1b5c030..806e3399d20b 100644
--- a/drivers/usb/gadget/udc/dummy_hcd.c
+++ b/drivers/usb/gadget/udc/dummy_hcd.c
@@ -328,11 +328,9 @@ static inline struct dummy *gadget_dev_to_dummy(struct device *dev)
/* called with spinlock held */
static void nuke(struct dummy *dum, struct dummy_ep *ep)
{
- while (!list_empty(&ep->queue)) {
- struct dummy_request *req;
+ struct dummy_request *req;

- req = list_entry(ep->queue.next, struct dummy_request, queue);
- list_del_init(&req->queue);
+ list_for_each_entry_del_init(req, &ep->queue, queue) {
req->req.status = -ESHUTDOWN;

spin_unlock(&dum->lock);
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index 666f5c4db25a..922679a63d3d 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -1402,11 +1402,7 @@ static void end_unlink_async(struct ehci_hcd *ehci)

/* Process the idle QHs */
ehci->async_unlinking = true;
- while (!list_empty(&ehci->async_idle)) {
- qh = list_first_entry(&ehci->async_idle, struct ehci_qh,
- unlink_node);
- list_del(&qh->unlink_node);
-
+ list_for_each_entry_del(qh, &ehci->async_idle, unlink_node) {
qh->qh_state = QH_STATE_IDLE;
qh->qh_next.qh = NULL;

diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c
index b74e98e94393..14c93c8b7d48 100644
--- a/drivers/usb/host/xhci-dbgtty.c
+++ b/drivers/usb/host/xhci-dbgtty.c
@@ -171,11 +171,8 @@ xhci_dbc_free_requests(struct list_head *head)
{
struct dbc_request *req;

- while (!list_empty(head)) {
- req = list_entry(head->next, struct dbc_request, list_pool);
- list_del(&req->list_pool);
+ list_for_each_entry_del(req, head, list_pool)
xhci_dbc_free_req(req);
- }
}

static int dbc_tty_install(struct tty_driver *driver, struct tty_struct *tty)
diff --git a/drivers/usb/mon/mon_main.c b/drivers/usb/mon/mon_main.c
index 9812d102a005..a8cc3a407378 100644
--- a/drivers/usb/mon/mon_main.c
+++ b/drivers/usb/mon/mon_main.c
@@ -384,18 +384,13 @@ static int __init mon_init(void)
static void __exit mon_exit(void)
{
struct mon_bus *mbus;
- struct list_head *p;

usb_unregister_notify(&mon_nb);
usb_mon_deregister();

mutex_lock(&mon_lock);

- while (!list_empty(&mon_buses)) {
- p = mon_buses.next;
- mbus = list_entry(p, struct mon_bus, bus_link);
- list_del(p);
-
+ list_for_each_entry_del(mbus, &mon_buses, bus_link) {
if (mbus->text_inited)
mon_text_del(mbus);
if (mbus->bin_inited)
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c
index 39cb14164652..e814d9a29f2b 100644
--- a/drivers/usb/mon/mon_text.c
+++ b/drivers/usb/mon/mon_text.c
@@ -644,7 +644,6 @@ static int mon_text_release(struct inode *inode, struct file *file)
struct mon_reader_text *rp = file->private_data;
struct mon_bus *mbus;
/* unsigned long flags; */
- struct list_head *p;
struct mon_event_text *ep;

mutex_lock(&mon_lock);
@@ -665,10 +664,7 @@ static int mon_text_release(struct inode *inode, struct file *file)
* So, we better not touch mbus.
*/
/* spin_lock_irqsave(&mbus->lock, flags); */
- while (!list_empty(&rp->e_list)) {
- p = rp->e_list.next;
- ep = list_entry(p, struct mon_event_text, e_link);
- list_del(p);
+ list_for_each_entry_del(ep, &rp->e_list, e_link) {
--rp->nevents;
kmem_cache_free(rp->e_slab, ep);
}
diff --git a/drivers/usb/usbip/vudc_dev.c b/drivers/usb/usbip/vudc_dev.c
index 44b04c54c086..4e2520ef48cc 100644
--- a/drivers/usb/usbip/vudc_dev.c
+++ b/drivers/usb/usbip/vudc_dev.c
@@ -74,10 +74,7 @@ static void nuke(struct vudc *udc, struct vep *ep)
{
struct vrequest *req;

- while (!list_empty(&ep->req_queue)) {
- req = list_first_entry(&ep->req_queue, struct vrequest,
- req_entry);
- list_del_init(&req->req_entry);
+ list_for_each_entry_del_init(req, &ep->req_queue, req_entry) {
req->req.status = -ESHUTDOWN;

spin_unlock(&udc->lock);
diff --git a/drivers/usb/usbip/vudc_tx.c b/drivers/usb/usbip/vudc_tx.c
index 3ccb17c3e840..3137971d19f3 100644
--- a/drivers/usb/usbip/vudc_tx.c
+++ b/drivers/usb/usbip/vudc_tx.c
@@ -189,10 +189,7 @@ static int v_send_ret(struct vudc *udc)
int ret = 0;

spin_lock_irqsave(&udc->lock_tx, flags);
- while (!list_empty(&udc->tx_queue)) {
- txi = list_first_entry(&udc->tx_queue, struct tx_item,
- tx_entry);
- list_del(&txi->tx_entry);
+ list_for_each_entry_del(txi, &udc->tx_queue, tx_entry) {
spin_unlock_irqrestore(&udc->lock_tx, flags);

switch (txi->type) {
diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c
index b70762ead13c..d7c7ffe70c48 100644
--- a/drivers/video/fbdev/udlfb.c
+++ b/drivers/video/fbdev/udlfb.c
@@ -998,6 +998,7 @@ static int dlfb_ops_open(struct fb_info *info, int user)

static void dlfb_ops_destroy(struct fb_info *info)
{
+ struct dlfb_deferred_free *d;
struct dlfb_data *dlfb = info->par;

cancel_work_sync(&dlfb->damage_work);
@@ -1012,9 +1013,7 @@ static void dlfb_ops_destroy(struct fb_info *info)

fb_destroy_modelist(&info->modelist);

- while (!list_empty(&dlfb->deferred_free)) {
- struct dlfb_deferred_free *d = list_entry(dlfb->deferred_free.next, struct dlfb_deferred_free, list);
- list_del(&d->list);
+ list_for_each_entry_del(d, &dlfb->deferred_free, list) {
vfree(d->mem);
kfree(d);
}
diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c
index 5b55ccae06d4..59e30eac3264 100644
--- a/drivers/watchdog/watchdog_core.c
+++ b/drivers/watchdog/watchdog_core.c
@@ -444,16 +444,12 @@ EXPORT_SYMBOL_GPL(devm_watchdog_register_device);

static int __init watchdog_deferred_registration(void)
{
+ struct watchdog_device *wdd;
+
mutex_lock(&wtd_deferred_reg_mutex);
wtd_deferred_reg_done = true;
- while (!list_empty(&wtd_deferred_reg_list)) {
- struct watchdog_device *wdd;
-
- wdd = list_first_entry(&wtd_deferred_reg_list,
- struct watchdog_device, deferred);
- list_del(&wdd->deferred);
+ list_for_each_entry_del(wdd, &wtd_deferred_reg_list, deferred)
__watchdog_register_device(wdd);
- }
mutex_unlock(&wtd_deferred_reg_mutex);
return 0;
}
diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index 26ffb8755ffb..46c114546af6 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -252,10 +252,7 @@ static int gntalloc_release(struct inode *inode, struct file *filp)
pr_debug("%s: priv %p\n", __func__, priv);

mutex_lock(&gref_mutex);
- while (!list_empty(&priv->list)) {
- gref = list_entry(priv->list.next,
- struct gntalloc_gref, next_file);
- list_del(&gref->next_file);
+ list_for_each_entry_del(gref, &priv->list, next_file) {
gref->users--;
if (gref->users == 0)
__del_gref(gref);
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 61faea1f0663..c5c984ebb318 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -612,12 +612,8 @@ static int gntdev_release(struct inode *inode, struct file *flip)
pr_debug("priv %p\n", priv);

mutex_lock(&priv->lock);
- while (!list_empty(&priv->maps)) {
- map = list_entry(priv->maps.next,
- struct gntdev_grant_map, next);
- list_del(&map->next);
+ list_for_each_entry_del(map, &priv->maps, next)
gntdev_put_map(NULL /* already removed */, map);
- }
mutex_unlock(&priv->lock);

#ifdef CONFIG_XEN_GNTDEV_DMABUF
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c
index e34b623e4b41..40decc8b710c 100644
--- a/drivers/xen/xen-pciback/pci_stub.c
+++ b/drivers/xen/xen-pciback/pci_stub.c
@@ -455,11 +455,7 @@ static int __init pcistub_init_devices_late(void)

spin_lock_irqsave(&pcistub_devices_lock, flags);

- while (!list_empty(&seized_devices)) {
- psdev = container_of(seized_devices.next,
- struct pcistub_device, dev_list);
- list_del(&psdev->dev_list);
-
+ list_for_each_entry_del(psdev, &seized_devices, dev_list) {
spin_unlock_irqrestore(&pcistub_devices_lock, flags);

err = pcistub_init_device(psdev->dev);
diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c
index 0792fda49a15..8e60622a21dc 100644
--- a/drivers/xen/xenbus/xenbus_dev_frontend.c
+++ b/drivers/xen/xenbus/xenbus_dev_frontend.c
@@ -216,11 +216,8 @@ static void queue_cleanup(struct list_head *list)
{
struct read_buffer *rb;

- while (!list_empty(list)) {
- rb = list_entry(list->next, struct read_buffer, list);
- list_del(list->next);
+ list_for_each_entry_del(rb, list, list)
kfree(rb);
- }
}

struct watch_adapter {
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 1c794a1896aa..1a9680493f35 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -808,6 +808,7 @@ int afs_drop_inode(struct inode *inode)
*/
void afs_evict_inode(struct inode *inode)
{
+ struct afs_wb_key *wbk;
struct afs_vnode_cache_aux aux;
struct afs_vnode *vnode = AFS_FS_I(inode);

@@ -826,12 +827,8 @@ void afs_evict_inode(struct inode *inode)
fscache_clear_inode_writeback(afs_vnode_cache(vnode), inode, &aux);
clear_inode(inode);

- while (!list_empty(&vnode->wb_keys)) {
- struct afs_wb_key *wbk = list_entry(vnode->wb_keys.next,
- struct afs_wb_key, vnode_link);
- list_del(&wbk->vnode_link);
+ list_for_each_entry_del(wbk, &vnode->wb_keys, vnode_link)
afs_put_wb_key(wbk);
- }

fscache_relinquish_cookie(afs_vnode_cache(vnode),
test_bit(AFS_VNODE_DELETED, &vnode->flags));
diff --git a/fs/afs/write.c b/fs/afs/write.c
index e1c45341719b..314b5d2baec2 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -985,11 +985,8 @@ void afs_prune_wb_keys(struct afs_vnode *vnode)

spin_unlock(&vnode->wb_lock);

- while (!list_empty(&graveyard)) {
- wbk = list_entry(graveyard.next, struct afs_wb_key, vnode_link);
- list_del(&wbk->vnode_link);
+ list_for_each_entry_del(wbk, &graveyard, vnode_link)
afs_put_wb_key(wbk);
- }
}

/*
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index b7d54efb4728..92020ff677c7 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -3596,10 +3596,7 @@ void btrfs_backref_error_cleanup(struct btrfs_backref_cache *cache,
struct btrfs_backref_node *upper;
struct btrfs_backref_edge *edge;

- while (!list_empty(&cache->useless_node)) {
- lower = list_first_entry(&cache->useless_node,
- struct btrfs_backref_node, list);
- list_del_init(&lower->list);
+ list_for_each_entry_del_init(lower, &cache->useless_node, list) {
}
while (!list_empty(&cache->pending_edge)) {
edge = list_first_entry(&cache->pending_edge,
@@ -3629,10 +3626,7 @@ void btrfs_backref_error_cleanup(struct btrfs_backref_cache *cache,
list_add(&upper->list, &cache->useless_node);
}

- while (!list_empty(&cache->useless_node)) {
- lower = list_first_entry(&cache->useless_node,
- struct btrfs_backref_node, list);
- list_del_init(&lower->list);
+ list_for_each_entry_del_init(lower, &cache->useless_node, list) {
if (lower == node)
node = NULL;
btrfs_backref_drop_node(cache, lower);
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index b2e5107b7cec..6a499516f671 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -1487,14 +1487,10 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
return;

spin_lock(&fs_info->unused_bgs_lock);
- while (!list_empty(&fs_info->unused_bgs)) {
+ list_for_each_entry_del_init(block_group, &fs_info->unused_bgs,
+ bg_list) {
int trimming;

- block_group = list_first_entry(&fs_info->unused_bgs,
- struct btrfs_block_group,
- bg_list);
- list_del_init(&block_group->bg_list);
-
space_info = block_group->space_info;

if (ret || btrfs_mixed_space_info(space_info)) {
@@ -1776,15 +1772,10 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
* and their presence in the reclaim_bgs list must be preserved.
*/
list_sort(NULL, &fs_info->reclaim_bgs, reclaim_bgs_cmp);
- while (!list_empty(&fs_info->reclaim_bgs)) {
+ list_for_each_entry_del_init(bg, &fs_info->reclaim_bgs, bg_list) {
u64 zone_unusable;
int ret = 0;

- bg = list_first_entry(&fs_info->reclaim_bgs,
- struct btrfs_block_group,
- bg_list);
- list_del_init(&bg->bg_list);
-
space_info = bg->space_info;
spin_unlock(&fs_info->unused_bgs_lock);

@@ -3527,10 +3518,7 @@ int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans)
* Refer to the definition of io_bgs member for details why it's safe
* to use it without any locking
*/
- while (!list_empty(io)) {
- cache = list_first_entry(io, struct btrfs_block_group,
- io_list);
- list_del_init(&cache->io_list);
+ list_for_each_entry_del_init(cache, io, io_list) {
btrfs_wait_cache_io(trans, cache, path);
btrfs_put_block_group(cache);
}
@@ -4307,38 +4295,21 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
}

write_lock(&info->block_group_cache_lock);
- while (!list_empty(&info->caching_block_groups)) {
- caching_ctl = list_entry(info->caching_block_groups.next,
- struct btrfs_caching_control, list);
- list_del(&caching_ctl->list);
+ list_for_each_entry_del(caching_ctl, &info->caching_block_groups, list)
btrfs_put_caching_control(caching_ctl);
- }
write_unlock(&info->block_group_cache_lock);

spin_lock(&info->unused_bgs_lock);
- while (!list_empty(&info->unused_bgs)) {
- block_group = list_first_entry(&info->unused_bgs,
- struct btrfs_block_group,
- bg_list);
- list_del_init(&block_group->bg_list);
+ list_for_each_entry_del_init(block_group, &info->unused_bgs, bg_list)
btrfs_put_block_group(block_group);
- }

- while (!list_empty(&info->reclaim_bgs)) {
- block_group = list_first_entry(&info->reclaim_bgs,
- struct btrfs_block_group,
- bg_list);
- list_del_init(&block_group->bg_list);
+ list_for_each_entry_del_init(block_group, &info->reclaim_bgs, bg_list)
btrfs_put_block_group(block_group);
- }
spin_unlock(&info->unused_bgs_lock);

spin_lock(&info->zone_active_bgs_lock);
- while (!list_empty(&info->zone_active_bgs)) {
- block_group = list_first_entry(&info->zone_active_bgs,
- struct btrfs_block_group,
- active_bg_list);
- list_del_init(&block_group->active_bg_list);
+ list_for_each_entry_del_init(block_group, &info->zone_active_bgs,
+ active_bg_list) {
btrfs_put_block_group(block_group);
}
spin_unlock(&info->zone_active_bgs_lock);
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 68f60d50e1fd..3b4967daecf7 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1833,11 +1833,7 @@ void btrfs_free_fs_roots(struct btrfs_fs_info *fs_info)
struct btrfs_root *gang[8];
int i;

- while (!list_empty(&fs_info->dead_roots)) {
- gang[0] = list_entry(fs_info->dead_roots.next,
- struct btrfs_root, root_list);
- list_del(&gang[0]->root_list);
-
+ list_for_each_entry_del(gang[0], &fs_info->dead_roots, root_list) {
if (test_bit(BTRFS_ROOT_IN_RADIX, &gang[0]->state))
btrfs_drop_and_free_fs_root(fs_info, gang[0]);
btrfs_put_root(gang[0]);
@@ -4817,12 +4813,7 @@ void btrfs_cleanup_dirty_bgs(struct btrfs_transaction *cur_trans,
* Refer to the definition of io_bgs member for details why it's safe
* to use it without any locking
*/
- while (!list_empty(&cur_trans->io_bgs)) {
- cache = list_first_entry(&cur_trans->io_bgs,
- struct btrfs_block_group,
- io_list);
-
- list_del_init(&cache->io_list);
+ list_for_each_entry_del_init(cache, &cur_trans->io_bgs, io_list) {
spin_lock(&cache->lock);
cache->disk_cache_state = BTRFS_DC_ERROR;
spin_unlock(&cache->lock);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 7814b9d654ce..cd9ce29a25ab 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1578,12 +1578,8 @@ static noinline void submit_compressed_extents(struct btrfs_work *work)
nr_pages = (async_chunk->end - async_chunk->start + PAGE_SIZE) >>
PAGE_SHIFT;

- while (!list_empty(&async_chunk->extents)) {
- async_extent = list_entry(async_chunk->extents.next,
- struct async_extent, list);
- list_del(&async_extent->list);
+ list_for_each_entry_del(async_extent, &async_chunk->extents, list)
submit_one_async_extent(async_chunk, async_extent, &alloc_hint);
- }

/* atomic_sub_return implies a barrier */
if (atomic_sub_return(nr_pages, &fs_info->async_delalloc_pages) <
@@ -1733,11 +1729,9 @@ static noinline int csum_exist_in_range(struct btrfs_fs_info *fs_info,
if (ret == 0 && list_empty(&list))
return 0;

- while (!list_empty(&list)) {
- sums = list_entry(list.next, struct btrfs_ordered_sum, list);
- list_del(&sums->list);
+ list_for_each_entry_del(sums, &list, list)
kfree(sums);
- }
+
if (ret < 0)
return ret;
return 1;
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
index 345c449d588c..d20cc0ccec44 100644
--- a/fs/btrfs/ordered-data.c
+++ b/fs/btrfs/ordered-data.c
@@ -550,7 +550,6 @@ bool btrfs_dec_test_ordered_pending(struct btrfs_inode *inode,
*/
void btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry)
{
- struct list_head *cur;
struct btrfs_ordered_sum *sum;

trace_btrfs_ordered_extent_put(BTRFS_I(entry->inode), entry);
@@ -561,12 +560,8 @@ void btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry)
ASSERT(RB_EMPTY_NODE(&entry->rb_node));
if (entry->inode)
btrfs_add_delayed_iput(BTRFS_I(entry->inode));
- while (!list_empty(&entry->list)) {
- cur = entry->list.next;
- sum = list_entry(cur, struct btrfs_ordered_sum, list);
- list_del(&sum->list);
+ list_for_each_entry_del(sum, &entry->list, list)
kvfree(sum);
- }
kmem_cache_free(btrfs_ordered_extent_cache, entry);
}
}
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index b99230db3c82..526e49fc97e2 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -221,19 +221,13 @@ static void __del_qgroup_rb(struct btrfs_fs_info *fs_info,
struct btrfs_qgroup_list *list;

list_del(&qgroup->dirty);
- while (!list_empty(&qgroup->groups)) {
- list = list_first_entry(&qgroup->groups,
- struct btrfs_qgroup_list, next_group);
- list_del(&list->next_group);
+ list_for_each_entry_del(list, &qgroup->groups, next_group) {
list_del(&list->next_member);
kfree(list);
}

- while (!list_empty(&qgroup->members)) {
- list = list_first_entry(&qgroup->members,
- struct btrfs_qgroup_list, next_member);
+ list_for_each_entry_del(list, &qgroup->members, next_member) {
list_del(&list->next_group);
- list_del(&list->next_member);
kfree(list);
}
}
@@ -2847,6 +2841,7 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans)
*/
int btrfs_run_qgroups(struct btrfs_trans_handle *trans)
{
+ struct btrfs_qgroup *qgroup;
struct btrfs_fs_info *fs_info = trans->fs_info;
int ret = 0;

@@ -2862,11 +2857,7 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans)
return ret;

spin_lock(&fs_info->qgroup_lock);
- while (!list_empty(&fs_info->dirty_qgroups)) {
- struct btrfs_qgroup *qgroup;
- qgroup = list_first_entry(&fs_info->dirty_qgroups,
- struct btrfs_qgroup, dirty);
- list_del_init(&qgroup->dirty);
+ list_for_each_entry_del_init(qgroup, &fs_info->dirty_qgroups, dirty) {
spin_unlock(&fs_info->qgroup_lock);
ret = update_qgroup_info_item(trans, qgroup);
if (ret)
diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c
index 3e014b9370a3..c6efe769aee2 100644
--- a/fs/btrfs/raid56.c
+++ b/fs/btrfs/raid56.c
@@ -1580,11 +1580,7 @@ static void raid_unplug(struct blk_plug_cb *cb, bool from_schedule)

list_sort(NULL, &plug->rbio_list, plug_cmp);

- while (!list_empty(&plug->rbio_list)) {
- cur = list_entry(plug->rbio_list.next,
- struct btrfs_raid_bio, plug_list);
- list_del_init(&cur->plug_list);
-
+ list_for_each_entry_del_init(cur, &plug->rbio_list, plug_list) {
if (rbio_is_full(cur)) {
/* We have a full stripe, queue it down. */
start_async_work(cur, rmw_rbio_work);
diff --git a/fs/btrfs/ref-verify.c b/fs/btrfs/ref-verify.c
index 95d28497de7c..7bba6ae6281b 100644
--- a/fs/btrfs/ref-verify.c
+++ b/fs/btrfs/ref-verify.c
@@ -251,12 +251,9 @@ static void free_block_entry(struct block_entry *be)
kfree(ref);
}

- while (!list_empty(&be->actions)) {
- ra = list_first_entry(&be->actions, struct ref_action,
- list);
- list_del(&ra->list);
+ list_for_each_entry_del(ra, &be->actions, list)
kfree(ra);
- }
+
kfree(be);
}

@@ -727,6 +724,8 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
*/
ret = -EINVAL;
if (action == BTRFS_ADD_DELAYED_EXTENT) {
+ struct ref_action *tmp;
+
/*
* For subvol_create we'll just pass in whatever the parent root
* is and the new root objectid, so let's not treat the passed
@@ -753,12 +752,7 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
goto out_unlock;
}

- while (!list_empty(&be->actions)) {
- struct ref_action *tmp;
-
- tmp = list_first_entry(&be->actions, struct ref_action,
- list);
- list_del(&tmp->list);
+ list_for_each_entry_del(tmp, &be->actions, list) {
kfree(tmp);
}
} else {
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 9951a0caf5bb..063cab9b7398 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -274,10 +274,7 @@ static int update_backref_cache(struct btrfs_trans_handle *trans,
btrfs_backref_cleanup_node(cache, node);
}

- while (!list_empty(&cache->changed)) {
- node = list_entry(cache->changed.next,
- struct btrfs_backref_node, list);
- list_del_init(&node->list);
+ list_for_each_entry_del_init(node, &cache->changed, list) {
BUG_ON(node->pending);
update_backref_node(cache, node, node->new_bytenr);
}
@@ -393,17 +390,12 @@ struct btrfs_root *find_reloc_root(struct btrfs_fs_info *fs_info, u64 bytenr)
static bool handle_useless_nodes(struct reloc_control *rc,
struct btrfs_backref_node *node)
{
+ struct btrfs_backref_node *cur;
struct btrfs_backref_cache *cache = &rc->backref_cache;
struct list_head *useless_node = &cache->useless_node;
bool ret = false;

- while (!list_empty(useless_node)) {
- struct btrfs_backref_node *cur;
-
- cur = list_first_entry(useless_node, struct btrfs_backref_node,
- list);
- list_del_init(&cur->list);
-
+ list_for_each_entry_del_init(cur, useless_node, list) {
/* Only tree root nodes can be added to @useless_nodes */
ASSERT(list_empty(&cur->upper));

@@ -1898,11 +1890,7 @@ int prepare_to_merge(struct reloc_control *rc, int err)

rc->merge_reloc_tree = 1;

- while (!list_empty(&rc->reloc_roots)) {
- reloc_root = list_entry(rc->reloc_roots.next,
- struct btrfs_root, root_list);
- list_del_init(&reloc_root->root_list);
-
+ list_for_each_entry_del_init(reloc_root, &rc->reloc_roots, root_list) {
root = btrfs_get_fs_root(fs_info, reloc_root->root_key.offset,
false);
if (IS_ERR(root)) {
@@ -4304,11 +4292,7 @@ int btrfs_recover_relocation(struct btrfs_fs_info *fs_info)

rc->merge_reloc_tree = 1;

- while (!list_empty(&reloc_roots)) {
- reloc_root = list_entry(reloc_roots.next,
- struct btrfs_root, root_list);
- list_del(&reloc_root->root_list);
-
+ list_for_each_entry_del(reloc_root, &reloc_roots, root_list) {
if (btrfs_root_refs(&reloc_root->root_item) == 0) {
list_add_tail(&reloc_root->root_list,
&rc->reloc_roots);
@@ -4382,6 +4366,7 @@ int btrfs_recover_relocation(struct btrfs_fs_info *fs_info)
*/
int btrfs_reloc_clone_csums(struct btrfs_ordered_extent *ordered)
{
+ struct btrfs_ordered_sum *sums;
struct btrfs_inode *inode = BTRFS_I(ordered->inode);
struct btrfs_fs_info *fs_info = inode->root->fs_info;
u64 disk_bytenr = ordered->file_offset + inode->index_cnt;
@@ -4395,12 +4380,7 @@ int btrfs_reloc_clone_csums(struct btrfs_ordered_extent *ordered)
if (ret)
return ret;

- while (!list_empty(&list)) {
- struct btrfs_ordered_sum *sums =
- list_entry(list.next, struct btrfs_ordered_sum, list);
-
- list_del_init(&sums->list);
-
+ list_for_each_entry_del_init(sums, &list, list) {
/*
* We need to offset the new_bytenr based on where the csum is.
* We need to do this because we will read in entire prealloc
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index c780d3729463..a11b66574c4a 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -144,6 +144,8 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction)
{
WARN_ON(refcount_read(&transaction->use_count) == 0);
if (refcount_dec_and_test(&transaction->use_count)) {
+ struct btrfs_block_group *cache;
+
BUG_ON(!list_empty(&transaction->list));
WARN_ON(!RB_EMPTY_ROOT(
&transaction->delayed_refs.href_root.rb_root));
@@ -160,13 +162,8 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction)
* and calling btrfs_finish_extent_commit()), so we can not
* discard the physical locations of the block groups.
*/
- while (!list_empty(&transaction->deleted_bgs)) {
- struct btrfs_block_group *cache;
-
- cache = list_first_entry(&transaction->deleted_bgs,
- struct btrfs_block_group,
- bg_list);
- list_del_init(&cache->bg_list);
+ list_for_each_entry_del_init(cache, &transaction->deleted_bgs,
+ bg_list) {
btrfs_unfreeze_block_group(cache);
btrfs_put_block_group(cache);
}
@@ -203,10 +200,8 @@ static noinline void switch_commit_roots(struct btrfs_trans_handle *trans)

/* We can free old roots now. */
spin_lock(&cur_trans->dropped_roots_lock);
- while (!list_empty(&cur_trans->dropped_roots)) {
- root = list_first_entry(&cur_trans->dropped_roots,
- struct btrfs_root, root_list);
- list_del_init(&root->root_list);
+ list_for_each_entry_del_init(root, &cur_trans->dropped_roots,
+ root_list) {
spin_unlock(&cur_trans->dropped_roots_lock);
btrfs_free_log(trans, root);
btrfs_drop_and_free_fs_root(fs_info, root);
@@ -1285,7 +1280,7 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans)
struct btrfs_fs_info *fs_info = trans->fs_info;
struct list_head *dirty_bgs = &trans->transaction->dirty_bgs;
struct list_head *io_bgs = &trans->transaction->io_bgs;
- struct list_head *next;
+ struct btrfs_root *root;
struct extent_buffer *eb;
int ret;

@@ -1319,11 +1314,8 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans)
return ret;

again:
- while (!list_empty(&fs_info->dirty_cowonly_roots)) {
- struct btrfs_root *root;
- next = fs_info->dirty_cowonly_roots.next;
- list_del_init(next);
- root = list_entry(next, struct btrfs_root, dirty_list);
+ list_for_each_entry_del_init(root, &fs_info->dirty_cowonly_roots,
+ dirty_list) {
clear_bit(BTRFS_ROOT_DIRTY, &root->state);

list_add_tail(&root->dirty_list,
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index cbb17b542131..4ac55c11e6bd 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -4879,11 +4879,7 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,

list_sort(NULL, &extents, extent_cmp);
process:
- while (!list_empty(&extents)) {
- em = list_entry(extents.next, struct extent_map, list);
-
- list_del_init(&em->list);
-
+ list_for_each_entry_del_init(em, &extents, list) {
/*
* If we had an error we just need to delete everybody from our
* private list.
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 5a5a8d488a7b..51b844a6c081 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -406,12 +406,8 @@ static void free_fs_devices(struct btrfs_fs_devices *fs_devices)
struct btrfs_device *device;

WARN_ON(fs_devices->opened);
- while (!list_empty(&fs_devices->devices)) {
- device = list_entry(fs_devices->devices.next,
- struct btrfs_device, dev_list);
- list_del(&device->dev_list);
+ list_for_each_entry_del(device, &fs_devices->devices, dev_list)
btrfs_free_device(device);
- }
kfree(fs_devices);
}

@@ -419,12 +415,8 @@ void __exit btrfs_cleanup_fs_uuids(void)
{
struct btrfs_fs_devices *fs_devices;

- while (!list_empty(&fs_uuids)) {
- fs_devices = list_entry(fs_uuids.next,
- struct btrfs_fs_devices, fs_list);
- list_del(&fs_devices->fs_list);
+ list_for_each_entry_del(fs_devices, &fs_uuids, fs_list)
free_fs_devices(fs_devices);
- }
}

static bool match_fsid_fs_devices(const struct btrfs_fs_devices *fs_devices,
diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c
index e7ac4ec809a4..0c6a9e7f1d38 100644
--- a/fs/btrfs/zstd.c
+++ b/fs/btrfs/zstd.c
@@ -204,10 +204,7 @@ void zstd_cleanup_workspace_manager(void)

spin_lock_bh(&wsm.lock);
for (i = 0; i < ZSTD_BTRFS_MAX_LEVEL; i++) {
- while (!list_empty(&wsm.idle_ws[i])) {
- workspace = container_of(wsm.idle_ws[i].next,
- struct workspace, list);
- list_del(&workspace->list);
+ list_for_each_entry_del(workspace, &wsm.idle_ws[i], list) {
list_del(&workspace->lru_list);
zstd_free_workspace(&workspace->list);
}
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 14215ec646f7..69bb3deba960 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -137,12 +137,8 @@ void ceph_caps_finalize(struct ceph_mds_client *mdsc)
struct ceph_cap *cap;

spin_lock(&mdsc->caps_list_lock);
- while (!list_empty(&mdsc->caps_list)) {
- cap = list_first_entry(&mdsc->caps_list,
- struct ceph_cap, caps_item);
- list_del(&cap->caps_item);
+ list_for_each_entry_del(cap, &mdsc->caps_list, caps_item)
kmem_cache_free(ceph_cap_cachep, cap);
- }
mdsc->caps_total_count = 0;
mdsc->caps_avail_count = 0;
mdsc->caps_use_count = 0;
@@ -3813,10 +3809,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid,
out:
spin_unlock(&ci->i_ceph_lock);

- while (!list_empty(&to_remove)) {
- cf = list_first_entry(&to_remove,
- struct ceph_cap_flush, i_list);
- list_del_init(&cf->i_list);
+ list_for_each_entry_del_init(cf, &to_remove, i_list) {
if (!cf->is_capsnap)
ceph_free_cap_flush(cf);
}
@@ -4882,11 +4875,9 @@ int ceph_purge_inode_cap(struct inode *inode, struct ceph_cap *cap, bool *invali
spin_lock(&mdsc->cap_dirty_lock);

/* trash all of the cap flushes for this inode */
- while (!list_empty(&ci->i_cap_flush_list)) {
- cf = list_first_entry(&ci->i_cap_flush_list,
- struct ceph_cap_flush, i_list);
+ list_for_each_entry_del_init(cf, &ci->i_cap_flush_list,
+ i_list) {
list_del_init(&cf->g_list);
- list_del_init(&cf->i_list);
if (!cf->is_capsnap)
ceph_free_cap_flush(cf);
}
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index b5f8038065d7..a5dd9a4d6e8f 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -1574,11 +1574,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,

list_splice(&aio_req->osd_reqs, &osd_reqs);
inode_dio_begin(inode);
- while (!list_empty(&osd_reqs)) {
- req = list_first_entry(&osd_reqs,
- struct ceph_osd_request,
- r_private_item);
- list_del_init(&req->r_private_item);
+ list_for_each_entry_del_init(req, &osd_reqs, r_private_item) {
if (ret >= 0)
ceph_osdc_start_request(req->r_osdc, req);
if (ret < 0) {
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 615db141b6c4..7ba9dbf88147 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -1741,11 +1741,10 @@ static void detach_cap_releases(struct ceph_mds_session *session,
static void dispose_cap_releases(struct ceph_mds_client *mdsc,
struct list_head *dispose)
{
- while (!list_empty(dispose)) {
- struct ceph_cap *cap;
+ struct ceph_cap *cap;
+
+ list_for_each_entry_del(cap, dispose, session_caps) {
/* zero out the in-progress message */
- cap = list_first_entry(dispose, struct ceph_cap, session_caps);
- list_del(&cap->session_caps);
ceph_put_cap(mdsc, cap);
}
}
@@ -3440,10 +3439,7 @@ static void __wake_requests(struct ceph_mds_client *mdsc,

list_splice_init(head, &tmp_list);

- while (!list_empty(&tmp_list)) {
- req = list_entry(tmp_list.next,
- struct ceph_mds_request, r_wait);
- list_del_init(&req->r_wait);
+ list_for_each_entry_del_init(req, &tmp_list, r_wait) {
dout(" wake request %p tid %llu\n", req, req->r_tid);
__do_request(mdsc, req);
}
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index 813f21add992..b1a19b93878f 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -255,10 +255,7 @@ static void __cleanup_empty_realms(struct ceph_mds_client *mdsc)
lockdep_assert_held_write(&mdsc->snap_rwsem);

spin_lock(&mdsc->snap_empty_lock);
- while (!list_empty(&mdsc->snap_empty)) {
- realm = list_first_entry(&mdsc->snap_empty,
- struct ceph_snap_realm, empty_item);
- list_del(&realm->empty_item);
+ list_for_each_entry_del(realm, &mdsc->snap_empty, empty_item) {
spin_unlock(&mdsc->snap_empty_lock);
__destroy_snap_realm(mdsc, realm);
spin_lock(&mdsc->snap_empty_lock);
@@ -869,12 +866,8 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
* queue cap snaps _after_ we've built the new snap contexts,
* so that i_head_snapc can be set appropriately.
*/
- while (!list_empty(&dirty_realms)) {
- realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
- dirty_item);
- list_del_init(&realm->dirty_item);
+ list_for_each_entry_del_init(realm, &dirty_realms, dirty_item)
queue_realm_cap_snaps(realm);
- }

if (realm_ret)
*realm_ret = first_realm;
@@ -1286,9 +1279,7 @@ void ceph_trim_snapid_map(struct ceph_mds_client *mdsc)
}
spin_unlock(&mdsc->snapid_map_lock);

- while (!list_empty(&to_free)) {
- sm = list_first_entry(&to_free, struct ceph_snapid_map, lru);
- list_del(&sm->lru);
+ list_for_each_entry_del(sm, &to_free, lru) {
dout("trim snapid map %llx -> %x\n", sm->snap, sm->dev);
free_anon_bdev(sm->dev);
kfree(sm);
@@ -1310,9 +1301,7 @@ void ceph_cleanup_snapid_map(struct ceph_mds_client *mdsc)
}
spin_unlock(&mdsc->snapid_map_lock);

- while (!list_empty(&to_free)) {
- sm = list_first_entry(&to_free, struct ceph_snapid_map, lru);
- list_del(&sm->lru);
+ list_for_each_entry_del(sm, &to_free, lru) {
free_anon_bdev(sm->dev);
if (WARN_ON_ONCE(atomic_read(&sm->ref))) {
pr_err("snapid map %llx -> %x still in use\n",
diff --git a/fs/char_dev.c b/fs/char_dev.c
index 950b6919fb87..dfa3e79eb1c1 100644
--- a/fs/char_dev.c
+++ b/fs/char_dev.c
@@ -434,13 +434,11 @@ void cd_forget(struct inode *inode)

static void cdev_purge(struct cdev *cdev)
{
+ struct inode *inode;
+
spin_lock(&cdev_lock);
- while (!list_empty(&cdev->list)) {
- struct inode *inode;
- inode = container_of(cdev->list.next, struct inode, i_devices);
- list_del_init(&inode->i_devices);
+ list_for_each_entry_del_init(inode, &cdev->list, i_devices)
inode->i_cdev = NULL;
- }
spin_unlock(&cdev_lock);
}

diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c
index 0455dddb0797..8b7df9981057 100644
--- a/fs/dlm/lockspace.c
+++ b/fs/dlm/lockspace.c
@@ -852,12 +852,8 @@ static int release_lockspace(struct dlm_ls *ls, int force)
for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++)
kfree(ls->ls_remove_names[i]);

- while (!list_empty(&ls->ls_new_rsb)) {
- rsb = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb,
- res_hashchain);
- list_del(&rsb->res_hashchain);
+ list_for_each_entry_del(rsb, &ls->ls_new_rsb, res_hashchain)
dlm_free_rsb(rsb);
- }

/*
* Free structures on any other lists
diff --git a/fs/dlm/member.c b/fs/dlm/member.c
index be7909ead71b..18608111d526 100644
--- a/fs/dlm/member.c
+++ b/fs/dlm/member.c
@@ -376,9 +376,7 @@ static void clear_memb_list(struct list_head *head,
{
struct dlm_member *memb;

- while (!list_empty(head)) {
- memb = list_entry(head->next, struct dlm_member, list);
- list_del(&memb->list);
+ list_for_each_entry_del(memb, head, list) {
if (after_del)
after_del(memb->nodeid);
kfree(memb);
diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c
index ae4cb4e2e134..a2837b9ef202 100644
--- a/fs/ecryptfs/kthread.c
+++ b/fs/ecryptfs/kthread.c
@@ -54,11 +54,8 @@ static int ecryptfs_threadfn(void *ignored)
mutex_unlock(&ecryptfs_kthread_ctl.mux);
goto out;
}
- while (!list_empty(&ecryptfs_kthread_ctl.req_list)) {
- req = list_first_entry(&ecryptfs_kthread_ctl.req_list,
- struct ecryptfs_open_req,
- kthread_ctl_list);
- list_del(&req->kthread_ctl_list);
+ list_for_each_entry_del(req, &ecryptfs_kthread_ctl.req_list,
+ kthread_ctl_list) {
*req->lower_file = dentry_open(&req->path,
(O_RDWR | O_LARGEFILE), current_cred());
complete(&req->done);
diff --git a/fs/exfat/cache.c b/fs/exfat/cache.c
index 5a2f119b7e8c..5181b3c34858 100644
--- a/fs/exfat/cache.c
+++ b/fs/exfat/cache.c
@@ -195,10 +195,7 @@ static void __exfat_cache_inval_inode(struct inode *inode)
struct exfat_inode_info *ei = EXFAT_I(inode);
struct exfat_cache *cache;

- while (!list_empty(&ei->cache_lru)) {
- cache = list_entry(ei->cache_lru.next,
- struct exfat_cache, cache_list);
- list_del_init(&cache->cache_list);
+ list_for_each_entry_del_init(cache, &ei->cache_lru, cache_list) {
ei->nr_caches--;
exfat_cache_free(cache);
}
diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
index b06de728b3b6..23618b7f5c36 100644
--- a/fs/ext4/fast_commit.c
+++ b/fs/ext4/fast_commit.c
@@ -1293,11 +1293,8 @@ static void ext4_fc_cleanup(journal_t *journal, int full, tid_t tid)
#endif
}

- while (!list_empty(&sbi->s_fc_dentry_q[FC_Q_MAIN])) {
- fc_dentry = list_first_entry(&sbi->s_fc_dentry_q[FC_Q_MAIN],
- struct ext4_fc_dentry_update,
- fcd_list);
- list_del_init(&fc_dentry->fcd_list);
+ list_for_each_entry_del_init(fc_dentry,
+ &sbi->s_fc_dentry_q[FC_Q_MAIN], fcd_list) {
list_del_init(&fc_dentry->fcd_dilist);
spin_unlock(&sbi->s_fc_lock);

diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index dfdd7e5cf038..876e2ea28aa9 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -251,10 +251,8 @@ static int ext4_do_flush_completed_IO(struct inode *inode,
list_replace_init(head, &unwritten);
spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);

- while (!list_empty(&unwritten)) {
- io_end = list_entry(unwritten.next, ext4_io_end_t, list);
+ list_for_each_entry_del_init(io_end, &unwritten, list) {
BUG_ON(!(io_end->flag & EXT4_IO_END_UNWRITTEN));
- list_del_init(&io_end->list);

err = ext4_end_io_end(io_end);
if (unlikely(!ret && err))
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index dbebd8b3127e..50b8b43eae13 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -514,10 +514,7 @@ static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn)
ext4_maybe_update_superblock(sb);

spin_lock(&sbi->s_md_lock);
- while (!list_empty(&txn->t_private_list)) {
- jce = list_entry(txn->t_private_list.next,
- struct ext4_journal_cb_entry, jce_list);
- list_del_init(&jce->jce_list);
+ list_for_each_entry_del_init(jce, &txn->t_private_list, jce_list) {
spin_unlock(&sbi->s_md_lock);
jce->jce_func(sb, jce, error);
spin_lock(&sbi->s_md_lock);
diff --git a/fs/fat/cache.c b/fs/fat/cache.c
index 738e427e2d21..e994c076a343 100644
--- a/fs/fat/cache.c
+++ b/fs/fat/cache.c
@@ -188,10 +188,7 @@ static void __fat_cache_inval_inode(struct inode *inode)
struct msdos_inode_info *i = MSDOS_I(inode);
struct fat_cache *cache;

- while (!list_empty(&i->cache_lru)) {
- cache = list_entry(i->cache_lru.next,
- struct fat_cache, cache_list);
- list_del_init(&cache->cache_list);
+ list_for_each_entry_del_init(cache, &i->cache_lru, cache_list) {
i->nr_caches--;
fat_cache_free(cache);
}
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 1a8f82f478cb..ba6f7e470fc8 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -2079,12 +2079,11 @@ static __poll_t fuse_dev_poll(struct file *file, poll_table *wait)
/* Abort all requests on the given list (pending or processing) */
static void end_requests(struct list_head *head)
{
- while (!list_empty(head)) {
- struct fuse_req *req;
- req = list_entry(head->next, struct fuse_req, list);
+ struct fuse_req *req;
+
+ list_for_each_entry_del_init(req, head, list) {
req->out.h.error = -ECONNABORTED;
clear_bit(FR_SENT, &req->flags);
- list_del_init(&req->list);
fuse_request_end(req);
}
}
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index ef7017fb6951..9cd413f7d820 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -2174,11 +2174,8 @@ void gfs2_free_journal_extents(struct gfs2_jdesc *jd)
{
struct gfs2_journal_extent *jext;

- while(!list_empty(&jd->extent_list)) {
- jext = list_first_entry(&jd->extent_list, struct gfs2_journal_extent, list);
- list_del(&jext->list);
+ list_for_each_entry_del(jext, &jd->extent_list, list)
kfree(jext);
- }
}

/**
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 4a280be229a6..8b48fd5bcb25 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1962,9 +1962,7 @@ __acquires(&lru_lock)

list_sort(NULL, list, glock_cmp);

- while(!list_empty(list)) {
- gl = list_first_entry(list, struct gfs2_glock, gl_lru);
- list_del_init(&gl->gl_lru);
+ list_for_each_entry_del_init(gl, list, gl_lru) {
clear_bit(GLF_LRU, &gl->gl_flags);
if (!spin_trylock(&gl->gl_lockref.lock)) {
add_back_to_lru:
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index e5271ae87d1c..339b56b20a91 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -1006,17 +1006,13 @@ static void trans_drain(struct gfs2_trans *tr)
return;

head = &tr->tr_buf;
- while (!list_empty(head)) {
- bd = list_first_entry(head, struct gfs2_bufdata, bd_list);
- list_del_init(&bd->bd_list);
+ list_for_each_entry_del_init(bd, head, bd_list) {
if (!list_empty(&bd->bd_ail_st_list))
gfs2_remove_from_ail(bd);
kmem_cache_free(gfs2_bufdata_cachep, bd);
}
head = &tr->tr_databuf;
- while (!list_empty(head)) {
- bd = list_first_entry(head, struct gfs2_bufdata, bd_list);
- list_del_init(&bd->bd_list);
+ list_for_each_entry_del_init(bd, head, bd_list) {
if (!list_empty(&bd->bd_ail_st_list))
gfs2_remove_from_ail(bd);
kmem_cache_free(gfs2_bufdata_cachep, bd);
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index 483f69807062..218f8da93238 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -739,11 +739,8 @@ static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
return;

head = &tr->tr_buf;
- while (!list_empty(head)) {
- bd = list_first_entry(head, struct gfs2_bufdata, bd_list);
- list_del_init(&bd->bd_list);
+ list_for_each_entry_del_init(bd, head, bd_list)
gfs2_unpin(sdp, bd->bd_bh, tr);
- }
}

static void buf_lo_before_scan(struct gfs2_jdesc *jd,
@@ -900,9 +897,7 @@ void gfs2_drain_revokes(struct gfs2_sbd *sdp)
struct gfs2_bufdata *bd;
struct gfs2_glock *gl;

- while (!list_empty(head)) {
- bd = list_first_entry(head, struct gfs2_bufdata, bd_list);
- list_del_init(&bd->bd_list);
+ list_for_each_entry_del_init(bd, head, bd_list) {
gl = bd->bd_gl;
gfs2_glock_remove_revoke(gl);
kmem_cache_free(gfs2_bufdata_cachep, bd);
@@ -1085,11 +1080,8 @@ static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
return;

head = &tr->tr_databuf;
- while (!list_empty(head)) {
- bd = list_first_entry(head, struct gfs2_bufdata, bd_list);
- list_del_init(&bd->bd_list);
+ list_for_each_entry_del_init(bd, head, bd_list)
gfs2_unpin(sdp, bd->bd_bh, tr);
- }
}


diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 171b2713d2e5..288c81b7ef40 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -142,12 +142,8 @@ static void gfs2_qd_list_dispose(struct list_head *list)
{
struct gfs2_quota_data *qd;

- while (!list_empty(list)) {
- qd = list_first_entry(list, struct gfs2_quota_data, qd_lru);
- list_del(&qd->qd_lru);
-
+ list_for_each_entry_del(qd, list, qd_lru)
gfs2_qd_dispose(qd);
- }
}


diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index 5aae02669a40..fbac9d9d16ff 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -108,11 +108,8 @@ void gfs2_revoke_clean(struct gfs2_jdesc *jd)
struct list_head *head = &jd->jd_revoke_list;
struct gfs2_revoke_replay *rr;

- while (!list_empty(head)) {
- rr = list_first_entry(head, struct gfs2_revoke_replay, rr_list);
- list_del(&rr->rr_list);
+ list_for_each_entry_del(rr, head, rr_list)
kfree(rr);
- }
}

int __get_log_header(struct gfs2_sbd *sdp, const struct gfs2_log_header *lh,
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 02d93da21b2b..efb1d233a0c8 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -385,9 +385,7 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp)
gfs2_assert_withdraw(sdp, !error2);

out:
- while (!list_empty(&list)) {
- lfcc = list_first_entry(&list, struct lfcc, list);
- list_del(&lfcc->list);
+ list_for_each_entry_del(lfcc, &list, list) {
gfs2_glock_dq_uninit(&lfcc->gh);
kfree(lfcc);
}
diff --git a/fs/inode.c b/fs/inode.c
index 84bc3c76e5cc..0d1eba0cfece 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -688,12 +688,9 @@ static void evict(struct inode *inode)
*/
static void dispose_list(struct list_head *head)
{
- while (!list_empty(head)) {
- struct inode *inode;
-
- inode = list_first_entry(head, struct inode, i_lru);
- list_del_init(&inode->i_lru);
+ struct inode *inode;

+ list_for_each_entry_del_init(inode, head, i_lru) {
evict(inode);
cond_resched();
}
diff --git a/fs/locks.c b/fs/locks.c
index 76ad05f8070a..31bcd5934dc4 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -342,11 +342,8 @@ locks_dispose_list(struct list_head *dispose)
{
struct file_lock *fl;

- while (!list_empty(dispose)) {
- fl = list_first_entry(dispose, struct file_lock, fl_list);
- list_del_init(&fl->fl_list);
+ list_for_each_entry_del_init(fl, dispose, fl_list)
locks_free_lock(fl);
- }
}

void locks_init_lock(struct file_lock *fl)
diff --git a/fs/namespace.c b/fs/namespace.c
index e157efc54023..503ab3945671 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1648,13 +1648,11 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
if (how & UMOUNT_PROPAGATE)
propagate_umount(&tmp_list);

- while (!list_empty(&tmp_list)) {
- struct mnt_namespace *ns;
+ list_for_each_entry_del_init(p, &tmp_list, mnt_list) {
+ struct mnt_namespace *ns = p->mnt_ns;
bool disconnect;
- p = list_first_entry(&tmp_list, struct mount, mnt_list);
+
list_del_init(&p->mnt_expire);
- list_del_init(&p->mnt_list);
- ns = p->mnt_ns;
if (ns) {
ns->mounts--;
__touch_mnt_namespace(ns);
diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c
index e17cdf53f6a7..756466b5a23e 100644
--- a/fs/netfs/objects.c
+++ b/fs/netfs/objects.c
@@ -61,10 +61,7 @@ void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async)
{
struct netfs_io_subrequest *subreq;

- while (!list_empty(&rreq->subrequests)) {
- subreq = list_first_entry(&rreq->subrequests,
- struct netfs_io_subrequest, rreq_link);
- list_del(&subreq->rreq_link);
+ list_for_each_entry_del(subreq, &rreq->subrequests, rreq_link) {
netfs_put_subrequest(subreq, was_async,
netfs_sreq_trace_put_clear);
}
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 943aeea1eb16..a86a874d3332 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -644,6 +644,7 @@ static struct pnfs_layout_segment *
bl_alloc_lseg(struct pnfs_layout_hdr *lo, struct nfs4_layoutget_res *lgr,
gfp_t gfp_mask)
{
+ struct pnfs_block_extent *be;
struct layout_verification lv = {
.mode = lgr->range.iomode,
.start = lgr->range.offset >> SECTOR_SHIFT,
@@ -706,12 +707,7 @@ bl_alloc_lseg(struct pnfs_layout_hdr *lo, struct nfs4_layoutget_res *lgr,
}

process_extents:
- while (!list_empty(&extents)) {
- struct pnfs_block_extent *be =
- list_first_entry(&extents, struct pnfs_block_extent,
- be_list);
- list_del(&be->be_list);
-
+ list_for_each_entry_del(be, &extents, be_list) {
if (!status)
status = ext_tree_insert(bl, be);

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index e6a51fd94fea..d4ec0bd4b8ac 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -2787,11 +2787,8 @@ static void nfs_access_free_list(struct list_head *head)
{
struct nfs_access_entry *cache;

- while (!list_empty(head)) {
- cache = list_entry(head->next, struct nfs_access_entry, lru);
- list_del(&cache->lru);
+ list_for_each_entry_del(cache, head, lru)
nfs_access_free_entry(cache);
- }
}

static unsigned long
diff --git a/fs/nfs/filelayout/filelayoutdev.c b/fs/nfs/filelayout/filelayoutdev.c
index acf4b88889dc..813282245eb6 100644
--- a/fs/nfs/filelayout/filelayoutdev.c
+++ b/fs/nfs/filelayout/filelayoutdev.c
@@ -174,11 +174,7 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev,
goto out_err_drain_dsaddrs;

/* If DS was already in cache, free ds addrs */
- while (!list_empty(&dsaddrs)) {
- da = list_first_entry(&dsaddrs,
- struct nfs4_pnfs_ds_addr,
- da_node);
- list_del_init(&da->da_node);
+ list_for_each_entry_del_init(da, &dsaddrs, da_node) {
kfree(da->da_remotestr);
kfree(da);
}
@@ -188,10 +184,7 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev,
return dsaddr;

out_err_drain_dsaddrs:
- while (!list_empty(&dsaddrs)) {
- da = list_first_entry(&dsaddrs, struct nfs4_pnfs_ds_addr,
- da_node);
- list_del_init(&da->da_node);
+ list_for_each_entry_del_init(da, &dsaddrs, da_node) {
kfree(da->da_remotestr);
kfree(da);
}
diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
index e028f5a0ef5f..b4e4ee29a3d4 100644
--- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c
+++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
@@ -154,11 +154,7 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev,
goto out_err_drain_dsaddrs;

/* If DS was already in cache, free ds addrs */
- while (!list_empty(&dsaddrs)) {
- da = list_first_entry(&dsaddrs,
- struct nfs4_pnfs_ds_addr,
- da_node);
- list_del_init(&da->da_node);
+ list_for_each_entry_del_init(da, &dsaddrs, da_node) {
kfree(da->da_remotestr);
kfree(da);
}
@@ -167,10 +163,7 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev,
return new_ds;

out_err_drain_dsaddrs:
- while (!list_empty(&dsaddrs)) {
- da = list_first_entry(&dsaddrs, struct nfs4_pnfs_ds_addr,
- da_node);
- list_del_init(&da->da_node);
+ list_for_each_entry_del_init(da, &dsaddrs, da_node) {
kfree(da->da_remotestr);
kfree(da);
}
@@ -462,13 +455,8 @@ void ff_layout_free_ds_ioerr(struct list_head *head)
{
struct nfs4_ff_layout_ds_err *err;

- while (!list_empty(head)) {
- err = list_first_entry(head,
- struct nfs4_ff_layout_ds_err,
- list);
- list_del(&err->list);
+ list_for_each_entry_del(err, head, list)
kfree(err);
- }
}

/* called with inode i_lock held */
diff --git a/fs/nfs/nfs42xattr.c b/fs/nfs/nfs42xattr.c
index 911f634ba3da..64b8f933119e 100644
--- a/fs/nfs/nfs42xattr.c
+++ b/fs/nfs/nfs42xattr.c
@@ -863,10 +863,7 @@ nfs4_xattr_cache_scan(struct shrinker *shrink, struct shrink_control *sc)

freed = list_lru_shrink_walk(&nfs4_xattr_cache_lru, sc,
cache_lru_isolate, &dispose);
- while (!list_empty(&dispose)) {
- cache = list_first_entry(&dispose, struct nfs4_xattr_cache,
- dispose);
- list_del_init(&cache->dispose);
+ list_for_each_entry_del_init(cache, &dispose, dispose) {
nfs4_xattr_discard_cache(cache);
kref_put(&cache->ref, nfs4_xattr_free_cache_cb);
}
@@ -948,11 +945,7 @@ nfs4_xattr_entry_scan(struct shrinker *shrink, struct shrink_control *sc)

freed = list_lru_shrink_walk(lru, sc, entry_lru_isolate, &dispose);

- while (!list_empty(&dispose)) {
- entry = list_first_entry(&dispose, struct nfs4_xattr_entry,
- dispose);
- list_del_init(&entry->dispose);
-
+ list_for_each_entry_del_init(entry, &dispose, dispose) {
/*
* Drop two references: the one that we just grabbed
* in entry_lru_isolate, and the one that was set
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
index 11e3a285594c..104b26e51281 100644
--- a/fs/nfs/nfs4client.c
+++ b/fs/nfs/nfs4client.c
@@ -154,10 +154,7 @@ nfs4_shutdown_ds_clients(struct nfs_client *clp)
{
struct nfs4_ds_server *dss;

- while (!list_empty(&clp->cl_ds_clients)) {
- dss = list_entry(clp->cl_ds_clients.next,
- struct nfs4_ds_server, list);
- list_del(&dss->list);
+ list_for_each_entry_del(dss, &clp->cl_ds_clients, list) {
rpc_shutdown_client(dss->rpc_clnt);
kfree (dss);
}
@@ -168,12 +165,8 @@ nfs4_cleanup_callback(struct nfs_client *clp)
{
struct nfs4_copy_state *cp_state;

- while (!list_empty(&clp->pending_cb_stateids)) {
- cp_state = list_entry(clp->pending_cb_stateids.next,
- struct nfs4_copy_state, copies);
- list_del(&cp_state->copies);
+ list_for_each_entry_del(cp_state, &clp->pending_cb_stateids, copies)
kfree(cp_state);
- }
}

void nfs41_shutdown_client(struct nfs_client *clp)
diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
index afd23910f3bf..0f1f4707ec2f 100644
--- a/fs/nfs/pnfs_nfs.c
+++ b/fs/nfs/pnfs_nfs.c
@@ -686,13 +686,8 @@ static void destroy_ds(struct nfs4_pnfs_ds *ds)

nfs_put_client(ds->ds_clp);

- while (!list_empty(&ds->ds_addrs)) {
- da = list_first_entry(&ds->ds_addrs,
- struct nfs4_pnfs_ds_addr,
- da_node);
- list_del_init(&da->da_node);
+ list_for_each_entry_del_init(da, &ds->ds_addrs, da_node)
nfs4_pnfs_ds_addr_free(da);
- }

kfree(ds->ds_remotestr);
kfree(ds);
diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
index ee9c923192e0..30ce8caeb37e 100644
--- a/fs/nfsd/filecache.c
+++ b/fs/nfsd/filecache.c
@@ -395,11 +395,8 @@ nfsd_file_dispose_list(struct list_head *dispose)
{
struct nfsd_file *nf;

- while (!list_empty(dispose)) {
- nf = list_first_entry(dispose, struct nfsd_file, nf_lru);
- list_del_init(&nf->nf_lru);
+ list_for_each_entry_del_init(nf, dispose, nf_lru)
nfsd_file_free(nf);
- }
}

/**
@@ -630,11 +627,8 @@ nfsd_file_close_inode_sync(struct inode *inode)
trace_nfsd_file_close(inode);

nfsd_file_queue_for_close(inode, &dispose);
- while (!list_empty(&dispose)) {
- nf = list_first_entry(&dispose, struct nfsd_file, nf_lru);
- list_del_init(&nf->nf_lru);
+ list_for_each_entry_del_init(nf, &dispose, nf_lru)
nfsd_file_free(nf);
- }
flush_delayed_fput();
}

diff --git a/fs/nfsd/nfs4layouts.c b/fs/nfsd/nfs4layouts.c
index e8a80052cb1b..0c645e630d4f 100644
--- a/fs/nfsd/nfs4layouts.c
+++ b/fs/nfsd/nfs4layouts.c
@@ -451,11 +451,9 @@ nfsd4_insert_layout(struct nfsd4_layoutget *lgp, struct nfs4_layout_stateid *ls)
static void
nfsd4_free_layouts(struct list_head *reaplist)
{
- while (!list_empty(reaplist)) {
- struct nfs4_layout *lp = list_first_entry(reaplist,
- struct nfs4_layout, lo_perstate);
+ struct nfs4_layout *lp;

- list_del(&lp->lo_perstate);
+ list_for_each_entry_del(lp, reaplist, lo_perstate) {
nfs4_put_stid(&lp->lo_state->ls_stid);
kmem_cache_free(nfs4_layout_cache, lp);
}
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 8534693eb6a4..f90f531d68a7 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -339,23 +339,15 @@ remove_blocked_locks(struct nfs4_lockowner *lo)

/* Dequeue all blocked locks */
spin_lock(&nn->blocked_locks_lock);
- while (!list_empty(&lo->lo_blocked)) {
- nbl = list_first_entry(&lo->lo_blocked,
- struct nfsd4_blocked_lock,
- nbl_list);
- list_del_init(&nbl->nbl_list);
+ list_for_each_entry_del_init(nbl, &lo->lo_blocked, nbl_list) {
WARN_ON(list_empty(&nbl->nbl_lru));
list_move(&nbl->nbl_lru, &reaplist);
}
spin_unlock(&nn->blocked_locks_lock);

/* Now free them */
- while (!list_empty(&reaplist)) {
- nbl = list_first_entry(&reaplist, struct nfsd4_blocked_lock,
- nbl_lru);
- list_del_init(&nbl->nbl_lru);
+ list_for_each_entry_del_init(nbl, &reaplist, nbl_lru)
free_blocked_lock(nbl);
- }
}

static void
@@ -1576,10 +1568,7 @@ free_ol_stateid_reaplist(struct list_head *reaplist)

might_sleep();

- while (!list_empty(reaplist)) {
- stp = list_first_entry(reaplist, struct nfs4_ol_stateid,
- st_locks);
- list_del(&stp->st_locks);
+ list_for_each_entry_del(stp, reaplist, st_locks) {
fp = stp->st_stid.sc_file;
stp->st_stid.sc_free(&stp->st_stid);
if (fp)
@@ -1941,9 +1930,7 @@ static void nfsd4_del_conns(struct nfsd4_session *s)
struct nfsd4_conn *c;

spin_lock(&clp->cl_lock);
- while (!list_empty(&s->se_conns)) {
- c = list_first_entry(&s->se_conns, struct nfsd4_conn, cn_persession);
- list_del_init(&c->cn_persession);
+ list_for_each_entry_del_init(c, &s->se_conns, cn_persession) {
spin_unlock(&clp->cl_lock);

unregister_xpt_user(c->cn_xprt, &c->cn_xpt_user);
@@ -2152,11 +2139,9 @@ static void drop_client(struct nfs4_client *clp)
static void
free_client(struct nfs4_client *clp)
{
- while (!list_empty(&clp->cl_sessions)) {
- struct nfsd4_session *ses;
- ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
- se_perclnt);
- list_del(&ses->se_perclnt);
+ struct nfsd4_session *ses;
+
+ list_for_each_entry_del(ses, &clp->cl_sessions, se_perclnt) {
WARN_ON_ONCE(atomic_read(&ses->se_ref));
free_session(ses);
}
@@ -2230,16 +2215,12 @@ __destroy_client(struct nfs4_client *clp)
list_add(&dp->dl_recall_lru, &reaplist);
}
spin_unlock(&state_lock);
- while (!list_empty(&reaplist)) {
- dp = list_entry(reaplist.next, struct nfs4_delegation, dl_recall_lru);
- list_del_init(&dp->dl_recall_lru);
+ list_for_each_entry_del_init(dp, &reaplist, dl_recall_lru)
destroy_unhashed_deleg(dp);
- }
- while (!list_empty(&clp->cl_revoked)) {
- dp = list_entry(clp->cl_revoked.next, struct nfs4_delegation, dl_recall_lru);
- list_del_init(&dp->dl_recall_lru);
+
+ list_for_each_entry_del_init(dp, &clp->cl_revoked, dl_recall_lru)
nfs4_put_stid(&dp->dl_stid);
- }
+
while (!list_empty(&clp->cl_openowners)) {
oo = list_entry(clp->cl_openowners.next, struct nfs4_openowner, oo_perclient);
nfs4_get_stateowner(&oo->oo_owner);
@@ -6170,12 +6151,8 @@ nfs4_laundromat(struct nfsd_net *nn)
list_add(&dp->dl_recall_lru, &reaplist);
}
spin_unlock(&state_lock);
- while (!list_empty(&reaplist)) {
- dp = list_first_entry(&reaplist, struct nfs4_delegation,
- dl_recall_lru);
- list_del_init(&dp->dl_recall_lru);
+ list_for_each_entry_del_init(dp, &reaplist, dl_recall_lru)
revoke_delegation(dp);
- }

spin_lock(&nn->client_lock);
while (!list_empty(&nn->close_lru)) {
@@ -6215,12 +6192,9 @@ nfs4_laundromat(struct nfsd_net *nn)
}
spin_unlock(&nn->blocked_locks_lock);

- while (!list_empty(&reaplist)) {
- nbl = list_first_entry(&reaplist,
- struct nfsd4_blocked_lock, nbl_lru);
- list_del_init(&nbl->nbl_lru);
+ list_for_each_entry_del_init(nbl, &reaplist, nbl_lru)
free_blocked_lock(nbl);
- }
+
#ifdef CONFIG_NFSD_V4_2_INTER_SSC
/* service the server-to-server copy delayed unmount list */
nfsd4_ssc_expire_umount(nn);
@@ -6280,10 +6254,7 @@ deleg_reaper(struct nfsd_net *nn)
}
spin_unlock(&nn->client_lock);

- while (!list_empty(&cblist)) {
- clp = list_first_entry(&cblist, struct nfs4_client,
- cl_ra_cblist);
- list_del_init(&clp->cl_ra_cblist);
+ list_for_each_entry_del_init(clp, &cblist, cl_ra_cblist) {
clp->cl_ra->ra_keep = 0;
clp->cl_ra->ra_bmval[0] = BIT(RCA4_TYPE_MASK_RDATA_DLG);
trace_nfsd_cb_recall_any(clp->cl_ra);
diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c
index 80621a709510..596e5371d237 100644
--- a/fs/nfsd/nfscache.c
+++ b/fs/nfsd/nfscache.c
@@ -123,9 +123,7 @@ nfsd_cacherep_dispose(struct list_head *dispose)
struct nfsd_cacherep *rp;
unsigned long freed = 0;

- while (!list_empty(dispose)) {
- rp = list_first_entry(dispose, struct nfsd_cacherep, c_lru);
- list_del(&rp->c_lru);
+ list_for_each_entry_del(rp, dispose, c_lru) {
nfsd_cacherep_free(rp);
freed++;
}
diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c
index 8beb2730929d..071102336615 100644
--- a/fs/nilfs2/gcinode.c
+++ b/fs/nilfs2/gcinode.c
@@ -181,9 +181,7 @@ void nilfs_remove_all_gcinodes(struct the_nilfs *nilfs)
struct list_head *head = &nilfs->ns_gc_inodes;
struct nilfs_inode_info *ii;

- while (!list_empty(head)) {
- ii = list_first_entry(head, struct nilfs_inode_info, i_dirty);
- list_del_init(&ii->i_dirty);
+ list_for_each_entry_del_init(ii, head, i_dirty) {
truncate_inode_pages(&ii->vfs_inode.i_data, 0);
nilfs_btnode_cache_clear(ii->i_assoc_inode->i_mapping);
iput(&ii->vfs_inode);
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c
index 19c8158605ed..23b29bdf264f 100644
--- a/fs/nilfs2/mdt.c
+++ b/fs/nilfs2/mdt.c
@@ -612,12 +612,8 @@ static void nilfs_release_frozen_buffers(struct nilfs_shadow_map *shadow)
struct list_head *head = &shadow->frozen_buffers;
struct buffer_head *bh;

- while (!list_empty(head)) {
- bh = list_first_entry(head, struct buffer_head,
- b_assoc_buffers);
- list_del_init(&bh->b_assoc_buffers);
+ list_for_each_entry_del_init(bh, head, b_assoc_buffers)
brelse(bh); /* drop ref-count to make it releasable */
- }
}

/**
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c
index 0955b657938f..9301bafb04b3 100644
--- a/fs/nilfs2/recovery.c
+++ b/fs/nilfs2/recovery.c
@@ -374,13 +374,10 @@ static int nilfs_scan_dsync_log(struct the_nilfs *nilfs, sector_t start_blocknr,

static void dispose_recovery_list(struct list_head *head)
{
- while (!list_empty(head)) {
- struct nilfs_recovery_block *rb;
+ struct nilfs_recovery_block *rb;

- rb = list_first_entry(head, struct nilfs_recovery_block, list);
- list_del(&rb->list);
+ list_for_each_entry_del(rb, head, list)
kfree(rb);
- }
}

struct nilfs_segment_entry {
@@ -403,13 +400,10 @@ static int nilfs_segment_list_add(struct list_head *head, __u64 segnum)

void nilfs_dispose_segment_list(struct list_head *head)
{
- while (!list_empty(head)) {
- struct nilfs_segment_entry *ent;
+ struct nilfs_segment_entry *ent;

- ent = list_first_entry(head, struct nilfs_segment_entry, list);
- list_del(&ent->list);
+ list_for_each_entry_del(ent, head, list)
kfree(ent);
- }
}

static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs,
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index 7ec16879756e..72353b237704 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -1055,12 +1055,9 @@ static int nilfs_segctor_apply_buffers(struct nilfs_sc_info *sci,
}

dispose_buffers:
- while (!list_empty(listp)) {
- bh = list_first_entry(listp, struct buffer_head,
- b_assoc_buffers);
- list_del_init(&bh->b_assoc_buffers);
+ list_for_each_entry_del_init(bh, listp, b_assoc_buffers)
brelse(bh);
- }
+
return err;
}

diff --git a/fs/ocfs2/filecheck.c b/fs/ocfs2/filecheck.c
index 1ad7106741f8..4fa008c53c9d 100644
--- a/fs/ocfs2/filecheck.c
+++ b/fs/ocfs2/filecheck.c
@@ -150,10 +150,7 @@ ocfs2_filecheck_sysfs_free(struct ocfs2_filecheck_sysfs_entry *entry)
struct ocfs2_filecheck_entry *p;

spin_lock(&entry->fs_fcheck->fc_lock);
- while (!list_empty(&entry->fs_fcheck->fc_head)) {
- p = list_first_entry(&entry->fs_fcheck->fc_head,
- struct ocfs2_filecheck_entry, fe_list);
- list_del(&p->fe_list);
+ list_for_each_entry_del(p, &entry->fs_fcheck->fc_head, fe_list) {
BUG_ON(!p->fe_done); /* To free a undone file check entry */
kfree(p);
}
diff --git a/fs/pnode.c b/fs/pnode.c
index e4d0340393d5..52434cf4cc43 100644
--- a/fs/pnode.c
+++ b/fs/pnode.c
@@ -82,12 +82,9 @@ static int do_make_slave(struct mount *mnt)
master = mnt->mnt_master;
if (!master) {
struct list_head *p = &mnt->mnt_slave_list;
- while (!list_empty(p)) {
- slave_mnt = list_first_entry(p,
- struct mount, mnt_slave);
- list_del_init(&slave_mnt->mnt_slave);
+ list_for_each_entry_del_init(slave_mnt, p, mnt_slave)
slave_mnt->mnt_master = NULL;
- }
+
return 0;
}
} else {
@@ -533,14 +530,12 @@ static void umount_list(struct list_head *to_umount,

static void restore_mounts(struct list_head *to_restore)
{
- /* Restore mounts to a clean working state */
- while (!list_empty(to_restore)) {
- struct mount *mnt, *parent;
- struct mountpoint *mp;
+ struct mount *mnt, *parent;
+ struct mountpoint *mp;

- mnt = list_first_entry(to_restore, struct mount, mnt_umounting);
+ /* Restore mounts to a clean working state */
+ list_for_each_entry_del_init(mnt, to_restore, mnt_umounting) {
CLEAR_MNT_MARK(mnt);
- list_del_init(&mnt->mnt_umounting);

/* Should this mount be reparented? */
mp = mnt->mnt_mp;
@@ -556,10 +551,9 @@ static void restore_mounts(struct list_head *to_restore)

static void cleanup_umount_visitations(struct list_head *visited)
{
- while (!list_empty(visited)) {
- struct mount *mnt =
- list_first_entry(visited, struct mount, mnt_umounting);
- list_del_init(&mnt->mnt_umounting);
+ struct mount *mnt;
+
+ list_for_each_entry_del_init(mnt, visited, mnt_umounting) {
}
}

diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index 1fb213f379a5..d396b0e43945 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -1535,13 +1535,10 @@ EXPORT_SYMBOL(vmcore_add_device_dump);
static void vmcore_free_device_dumps(void)
{
#ifdef CONFIG_PROC_VMCORE_DEVICE_DUMP
- mutex_lock(&vmcoredd_mutex);
- while (!list_empty(&vmcoredd_list)) {
- struct vmcoredd_node *dump;
+ struct vmcoredd_node *dump;

- dump = list_first_entry(&vmcoredd_list, struct vmcoredd_node,
- list);
- list_del(&dump->list);
+ mutex_lock(&vmcoredd_mutex);
+ list_for_each_entry_del(dump, &vmcoredd_list, list) {
vfree(dump->buf);
vfree(dump);
}
@@ -1583,19 +1580,17 @@ fs_initcall(vmcore_init);
/* Cleanup function for vmcore module. */
void vmcore_cleanup(void)
{
+ struct vmcore *m;
+
if (proc_vmcore) {
proc_remove(proc_vmcore);
proc_vmcore = NULL;
}

/* clear the vmcore list. */
- while (!list_empty(&vmcore_list)) {
- struct vmcore *m;
-
- m = list_first_entry(&vmcore_list, struct vmcore, list);
- list_del(&m->list);
+ list_for_each_entry_del(m, &vmcore_list, list)
kfree(m);
- }
+
free_elfcorebuf();

/* clear vmcore device dump list */
diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c
index 94df9eec3d8d..131d2bf3ff87 100644
--- a/fs/smb/client/smbdirect.c
+++ b/fs/smb/client/smbdirect.c
@@ -1234,11 +1234,7 @@ static int allocate_receive_buffers(struct smbd_connection *info, int num_buf)
return 0;

allocate_failed:
- while (!list_empty(&info->receive_queue)) {
- response = list_first_entry(
- &info->receive_queue,
- struct smbd_response, list);
- list_del(&response->list);
+ list_for_each_entry_del(response, &info->receive_queue, list) {
info->count_receive_queue--;

mempool_free(response, info->response_mempool);
diff --git a/fs/smb/server/crypto_ctx.c b/fs/smb/server/crypto_ctx.c
index 81488d04199d..acc57d58b8fb 100644
--- a/fs/smb/server/crypto_ctx.c
+++ b/fs/smb/server/crypto_ctx.c
@@ -240,13 +240,8 @@ void ksmbd_crypto_destroy(void)
{
struct ksmbd_crypto_ctx *ctx;

- while (!list_empty(&ctx_list.idle_ctx)) {
- ctx = list_entry(ctx_list.idle_ctx.next,
- struct ksmbd_crypto_ctx,
- list);
- list_del(&ctx->list);
+ list_for_each_entry_del(ctx, &ctx_list.idle_ctx, list)
ctx_free(ctx);
- }
}

int ksmbd_crypto_create(void)
diff --git a/fs/smb/server/mgmt/share_config.c b/fs/smb/server/mgmt/share_config.c
index 328a412259dc..2c231d7dd6c8 100644
--- a/fs/smb/server/mgmt/share_config.c
+++ b/fs/smb/server/mgmt/share_config.c
@@ -34,13 +34,9 @@ static unsigned int share_name_hash(const char *name)

static void kill_share(struct ksmbd_share_config *share)
{
- while (!list_empty(&share->veto_list)) {
- struct ksmbd_veto_pattern *p;
+ struct ksmbd_veto_pattern *p;

- p = list_entry(share->veto_list.next,
- struct ksmbd_veto_pattern,
- list);
- list_del(&p->list);
+ list_for_each_entry_del(p, &share->veto_list, list) {
kfree(p->pattern);
kfree(p);
}
diff --git a/fs/ubifs/commit.c b/fs/ubifs/commit.c
index c4fc1047fc07..c051ee2d8b43 100644
--- a/fs/ubifs/commit.c
+++ b/fs/ubifs/commit.c
@@ -710,11 +710,9 @@ int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot)
ubifs_dump_node(c, &i->idx, ubifs_idx_node_sz(c, c->fanout));
}
out_free:
- while (!list_empty(&list)) {
- i = list_entry(list.next, struct idx_node, list);
- list_del(&i->list);
+ list_for_each_entry_del(i, &list, list)
kfree(i);
- }
+
ubifs_err(c, "failed, error %d", err);
if (err > 0)
err = -EINVAL;
diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c
index 3134d070fcc0..f6ed9152790f 100644
--- a/fs/ubifs/gc.c
+++ b/fs/ubifs/gc.c
@@ -984,13 +984,10 @@ int ubifs_gc_end_commit(struct ubifs_info *c)
*/
void ubifs_destroy_idx_gc(struct ubifs_info *c)
{
- while (!list_empty(&c->idx_gc)) {
- struct ubifs_gced_idx_leb *idx_gc;
+ struct ubifs_gced_idx_leb *idx_gc;

- idx_gc = list_entry(c->idx_gc.next, struct ubifs_gced_idx_leb,
- list);
+ list_for_each_entry_del(idx_gc, &c->idx_gc, list) {
c->idx_gc_cnt -= 1;
- list_del(&idx_gc->list);
kfree(idx_gc);
}
}
diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c
index 4211e4456b1e..34b0481440bd 100644
--- a/fs/ubifs/replay.c
+++ b/fs/ubifs/replay.c
@@ -868,11 +868,8 @@ static void destroy_bud_list(struct ubifs_info *c)
{
struct bud_entry *b;

- while (!list_empty(&c->replay_buds)) {
- b = list_entry(c->replay_buds.next, struct bud_entry, list);
- list_del(&b->list);
+ list_for_each_entry_del(b, &c->replay_buds, list)
kfree(b);
- }
}

/**
diff --git a/fs/ubifs/scan.c b/fs/ubifs/scan.c
index 84a9157dcc32..bd87f2be29e6 100644
--- a/fs/ubifs/scan.c
+++ b/fs/ubifs/scan.c
@@ -357,10 +357,8 @@ void ubifs_scan_destroy(struct ubifs_scan_leb *sleb)
struct list_head *head;

head = &sleb->nodes;
- while (!list_empty(head)) {
- node = list_entry(head->next, struct ubifs_scan_node, list);
- list_del(&node->list);
+ list_for_each_entry_del(node, head, list)
kfree(node);
- }
+
kfree(sleb);
}
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index b08fb28d16b5..27b8720e919c 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -904,9 +904,7 @@ static void free_orphans(struct ubifs_info *c)
kfree(orph);
}

- while (!list_empty(&c->orph_list)) {
- orph = list_entry(c->orph_list.next, struct ubifs_orphan, list);
- list_del(&orph->list);
+ list_for_each_entry_del(orph, &c->orph_list, list) {
kfree(orph);
ubifs_err(c, "orphan list not empty at unmount");
}
@@ -1180,21 +1178,15 @@ static void ubifs_release_options(struct ubifs_info *c)
*/
static void destroy_journal(struct ubifs_info *c)
{
- while (!list_empty(&c->unclean_leb_list)) {
- struct ubifs_unclean_leb *ucleb;
+ struct ubifs_unclean_leb *ucleb;
+ struct ubifs_bud *bud;

- ucleb = list_entry(c->unclean_leb_list.next,
- struct ubifs_unclean_leb, list);
- list_del(&ucleb->list);
+ list_for_each_entry_del(ucleb, &c->unclean_leb_list, list)
kfree(ucleb);
- }
- while (!list_empty(&c->old_buds)) {
- struct ubifs_bud *bud;

- bud = list_entry(c->old_buds.next, struct ubifs_bud, list);
- list_del(&bud->list);
+ list_for_each_entry_del(bud, &c->old_buds, list)
kfree(bud);
- }
+
ubifs_destroy_idx_gc(c);
ubifs_destroy_size_tree(c);
ubifs_tnc_close(c);
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index c1ece4a08ff4..e7fe0aa600b1 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1843,13 +1843,12 @@ xfs_buftarg_drain(

/* loop until there is nothing left on the lru list. */
while (list_lru_count(&btp->bt_lru)) {
+ struct xfs_buf *bp;
+
list_lru_walk(&btp->bt_lru, xfs_buftarg_drain_rele,
&dispose, LONG_MAX);

- while (!list_empty(&dispose)) {
- struct xfs_buf *bp;
- bp = list_first_entry(&dispose, struct xfs_buf, b_lru);
- list_del_init(&bp->b_lru);
+ list_for_each_entry_del_init(bp, &dispose, b_lru) {
if (bp->b_flags & XBF_WRITE_FAIL) {
write_fail = true;
xfs_buf_alert_ratelimited(bp,
@@ -1913,6 +1912,7 @@ xfs_buftarg_shrink_scan(
struct shrinker *shrink,
struct shrink_control *sc)
{
+ struct xfs_buf *bp;
struct xfs_buftarg *btp = container_of(shrink,
struct xfs_buftarg, bt_shrinker);
LIST_HEAD(dispose);
@@ -1921,12 +1921,8 @@ xfs_buftarg_shrink_scan(
freed = list_lru_shrink_walk(&btp->bt_lru, sc,
xfs_buftarg_isolate, &dispose);

- while (!list_empty(&dispose)) {
- struct xfs_buf *bp;
- bp = list_first_entry(&dispose, struct xfs_buf, b_lru);
- list_del_init(&bp->b_lru);
+ list_for_each_entry_del_init(bp, &dispose, b_lru)
xfs_buf_rele(bp);
- }

return freed;
}
@@ -2252,11 +2248,7 @@ xfs_buf_delwri_submit(
xfs_buf_delwri_submit_buffers(buffer_list, &wait_list);

/* Wait for IO to complete. */
- while (!list_empty(&wait_list)) {
- bp = list_first_entry(&wait_list, struct xfs_buf, b_list);
-
- list_del_init(&bp->b_list);
-
+ list_for_each_entry_del_init(bp, &wait_list, b_list) {
/*
* Wait on the locked buffer, check for errors and unlock and
* release the delwri queue reference.
diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c
index 67a99d94701e..abe72f0cee2d 100644
--- a/fs/xfs/xfs_log_cil.c
+++ b/fs/xfs/xfs_log_cil.c
@@ -700,11 +700,8 @@ xlog_cil_free_logvec(
{
struct xfs_log_vec *lv;

- while (!list_empty(lv_chain)) {
- lv = list_first_entry(lv_chain, struct xfs_log_vec, lv_list);
- list_del_init(&lv->lv_list);
+ list_for_each_entry_del_init(lv, lv_chain, lv_list)
kmem_free(lv);
- }
}

/*
@@ -1094,10 +1091,9 @@ static void
xlog_cil_cleanup_whiteouts(
struct list_head *whiteouts)
{
- while (!list_empty(whiteouts)) {
- struct xfs_log_item *item = list_first_entry(whiteouts,
- struct xfs_log_item, li_cil);
- list_del_init(&item->li_cil);
+ struct xfs_log_item *item;
+
+ list_for_each_entry_del_init(item, whiteouts, li_cil) {
trace_xfs_cil_whiteout_unpin(item);
item->li_ops->iop_unpin(item, 1);
}
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
index 086e78a6143a..acdd6ac8fe18 100644
--- a/fs/xfs/xfs_qm.c
+++ b/fs/xfs/xfs_qm.c
@@ -504,6 +504,7 @@ xfs_qm_shrink_scan(
struct shrinker *shrink,
struct shrink_control *sc)
{
+ struct xfs_dquot *dqp;
struct xfs_quotainfo *qi = container_of(shrink,
struct xfs_quotainfo, qi_shrinker);
struct xfs_qm_isolate isol;
@@ -523,13 +524,8 @@ xfs_qm_shrink_scan(
if (error)
xfs_warn(NULL, "%s: dquot reclaim failed", __func__);

- while (!list_empty(&isol.dispose)) {
- struct xfs_dquot *dqp;
-
- dqp = list_first_entry(&isol.dispose, struct xfs_dquot, q_lru);
- list_del_init(&dqp->q_lru);
+ list_for_each_entry_del_init(dqp, &isol.dispose, q_lru)
xfs_qm_dqfree_one(dqp);
- }

return freed;
}
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index d839a80a6751..4c66d5f61be7 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -683,11 +683,8 @@ static void io_cqring_overflow_kill(struct io_ring_ctx *ctx)
clear_bit(IO_CHECK_CQ_OVERFLOW_BIT, &ctx->check_cq);
spin_unlock(&ctx->completion_lock);

- while (!list_empty(&list)) {
- ocqe = list_first_entry(&list, struct io_overflow_cqe, list);
- list_del(&ocqe->list);
+ list_for_each_entry_del(ocqe, &list, list)
kfree(ocqe);
- }
}

static void __io_cqring_overflow_flush(struct io_ring_ctx *ctx)
@@ -3237,9 +3234,7 @@ static __cold bool io_cancel_defer_files(struct io_ring_ctx *ctx,
if (list_empty(&list))
return false;

- while (!list_empty(&list)) {
- de = list_first_entry(&list, struct io_defer_entry, list);
- list_del_init(&de->list);
+ list_for_each_entry_del_init(de, &list, list) {
io_req_task_queue_fail(de->req, -ECANCELED);
kfree(de);
}
diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c
index 9123138aa9f4..f1167a896201 100644
--- a/io_uring/kbuf.c
+++ b/io_uring/kbuf.c
@@ -254,6 +254,7 @@ static int __io_remove_buffers(struct io_ring_ctx *ctx,

void io_destroy_buffers(struct io_ring_ctx *ctx)
{
+ struct page *page;
struct io_buffer_list *bl;
unsigned long index;
int i;
@@ -270,13 +271,8 @@ void io_destroy_buffers(struct io_ring_ctx *ctx)
kfree(bl);
}

- while (!list_empty(&ctx->io_buffers_pages)) {
- struct page *page;
-
- page = list_first_entry(&ctx->io_buffers_pages, struct page, lru);
- list_del_init(&page->lru);
+ list_for_each_entry_del_init(page, &ctx->io_buffers_pages, lru)
__free_page(page);
- }
}

int io_remove_buffers_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
index e867c17d3f84..991c3122fca9 100644
--- a/kernel/audit_tree.c
+++ b/kernel/audit_tree.c
@@ -754,6 +754,8 @@ static int tag_mount(struct vfsmount *mnt, void *arg)
static int prune_tree_thread(void *unused)
{
for (;;) {
+ struct audit_tree *victim;
+
if (list_empty(&prune_list)) {
set_current_state(TASK_INTERRUPTIBLE);
schedule();
@@ -762,12 +764,7 @@ static int prune_tree_thread(void *unused)
audit_ctl_lock();
mutex_lock(&audit_filter_mutex);

- while (!list_empty(&prune_list)) {
- struct audit_tree *victim;
-
- victim = list_entry(prune_list.next,
- struct audit_tree, list);
- list_del_init(&victim->list);
+ list_for_each_entry_del_init(victim, &prune_list, list) {

mutex_unlock(&audit_filter_mutex);

diff --git a/kernel/kthread.c b/kernel/kthread.c
index 1eea53050bab..d2d672c593ee 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -729,18 +729,16 @@ int kthreadd(void *unused)
cgroup_init_kthreadd();

for (;;) {
+ struct kthread_create_info *create;
+
set_current_state(TASK_INTERRUPTIBLE);
if (list_empty(&kthread_create_list))
schedule();
__set_current_state(TASK_RUNNING);

spin_lock(&kthread_create_lock);
- while (!list_empty(&kthread_create_list)) {
- struct kthread_create_info *create;
-
- create = list_entry(kthread_create_list.next,
- struct kthread_create_info, list);
- list_del_init(&create->list);
+ list_for_each_entry_del_init(create, &kthread_create_list,
+ list) {
spin_unlock(&kthread_create_lock);

create_kthread(create);
diff --git a/kernel/padata.c b/kernel/padata.c
index 222d60195de6..63c083bf6c5d 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -352,6 +352,7 @@ static void invoke_padata_reorder(struct work_struct *work)

static void padata_serial_worker(struct work_struct *serial_work)
{
+ struct padata_priv *padata;
struct padata_serial_queue *squeue;
struct parallel_data *pd;
LIST_HEAD(local_list);
@@ -367,14 +368,7 @@ static void padata_serial_worker(struct work_struct *serial_work)

cnt = 0;

- while (!list_empty(&local_list)) {
- struct padata_priv *padata;
-
- padata = list_entry(local_list.next,
- struct padata_priv, list);
-
- list_del_init(&padata->list);
-
+ list_for_each_entry_del_init(padata, &local_list, list) {
padata->serial(padata);
cnt++;
}
diff --git a/kernel/rcu/srcutiny.c b/kernel/rcu/srcutiny.c
index 336af24e0fe3..7661df05cd03 100644
--- a/kernel/rcu/srcutiny.c
+++ b/kernel/rcu/srcutiny.c
@@ -275,10 +275,6 @@ void __init srcu_init(void)
struct srcu_struct *ssp;

srcu_init_done = true;
- while (!list_empty(&srcu_boot_list)) {
- ssp = list_first_entry(&srcu_boot_list,
- struct srcu_struct, srcu_work.entry);
- list_del_init(&ssp->srcu_work.entry);
+ list_for_each_entry_del_init(ssp, &srcu_boot_list, srcu_work.entry)
schedule_work(&ssp->srcu_work);
- }
}
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 061a30a8925a..68d1a765a52d 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9001,12 +9001,8 @@ static void attach_tasks(struct lb_env *env)
rq_lock(env->dst_rq, &rf);
update_rq_clock(env->dst_rq);

- while (!list_empty(tasks)) {
- p = list_first_entry(tasks, struct task_struct, se.group_node);
- list_del_init(&p->se.group_node);
-
+ list_for_each_entry_del_init(p, tasks, se.group_node)
attach_task(env->dst_rq, p);
- }

rq_unlock(env->dst_rq, &rf);
}
diff --git a/kernel/signal.c b/kernel/signal.c
index 09019017d669..9319b05daf9e 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -465,11 +465,8 @@ void flush_sigqueue(struct sigpending *queue)
struct sigqueue *q;

sigemptyset(&queue->signal);
- while (!list_empty(&queue->list)) {
- q = list_entry(queue->list.next, struct sigqueue , list);
- list_del_init(&q->list);
+ list_for_each_entry_del_init(q, &queue->list, list)
__sigqueue_free(q);
- }
}

/*
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index c4015f30f9fa..857f36bf2fc5 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c
@@ -1152,16 +1152,14 @@ MODULE_ALIAS_9P("fd");

static void p9_poll_workfn(struct work_struct *work)
{
+ struct p9_conn *conn;
unsigned long flags;

p9_debug(P9_DEBUG_TRANS, "start %p\n", current);

spin_lock_irqsave(&p9_poll_lock, flags);
- while (!list_empty(&p9_poll_pending_list)) {
- struct p9_conn *conn = list_first_entry(&p9_poll_pending_list,
- struct p9_conn,
- poll_pending_link);
- list_del_init(&conn->poll_pending_link);
+ list_for_each_entry_del_init(conn, &p9_poll_pending_list,
+ poll_pending_link) {
spin_unlock_irqrestore(&p9_poll_lock, flags);

p9_poll_mux(conn);
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 17ca13e8c044..63c7ff82f50a 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -1879,11 +1879,8 @@ static void l2cap_unregister_all_users(struct l2cap_conn *conn)
{
struct l2cap_user *user;

- while (!list_empty(&conn->users)) {
- user = list_first_entry(&conn->users, struct l2cap_user, list);
- list_del_init(&user->list);
+ list_for_each_entry_del_init(user, &conn->users, list)
user->remove(conn, user);
- }
}

static void l2cap_conn_del(struct hci_conn *hcon, int err)
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index d3a759e052c8..e4a0f42d255d 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -3445,6 +3445,7 @@ static int linger_notify_finish_wait(struct ceph_osd_linger_request *lreq,
*/
static void handle_timeout(struct work_struct *work)
{
+ struct ceph_osd *osd;
struct ceph_osd_client *osdc =
container_of(work, struct ceph_osd_client, timeout_work.work);
struct ceph_options *opts = osdc->client->options;
@@ -3519,13 +3520,8 @@ static void handle_timeout(struct work_struct *work)
if (atomic_read(&osdc->num_homeless) || !list_empty(&slow_osds))
maybe_request_map(osdc);

- while (!list_empty(&slow_osds)) {
- struct ceph_osd *osd = list_first_entry(&slow_osds,
- struct ceph_osd,
- o_keepalive_item);
- list_del_init(&osd->o_keepalive_item);
+ list_for_each_entry_del_init(osd, &slow_osds, o_keepalive_item)
ceph_con_keepalive(&osd->o_con);
- }

up_write(&osdc->lock);
schedule_delayed_work(&osdc->timeout_work,
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 295098873861..047d92d3a693 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -1034,12 +1034,9 @@ static void cleanup_workspace_manager(struct workspace_manager *wsm)
{
struct crush_work *work;

- while (!list_empty(&wsm->idle_ws)) {
- work = list_first_entry(&wsm->idle_ws, struct crush_work,
- item);
- list_del_init(&work->item);
+ list_for_each_entry_del_init(work, &wsm->idle_ws, item)
free_workspace(work);
- }
+
atomic_set(&wsm->total_ws, 0);
wsm->free_ws = 0;
}
diff --git a/net/ceph/pagelist.c b/net/ceph/pagelist.c
index 74622b278d57..a0c2d5cc2b92 100644
--- a/net/ceph/pagelist.c
+++ b/net/ceph/pagelist.c
@@ -37,15 +37,13 @@ static void ceph_pagelist_unmap_tail(struct ceph_pagelist *pl)

void ceph_pagelist_release(struct ceph_pagelist *pl)
{
+ struct page *page;
+
if (!refcount_dec_and_test(&pl->refcnt))
return;
ceph_pagelist_unmap_tail(pl);
- while (!list_empty(&pl->head)) {
- struct page *page = list_first_entry(&pl->head, struct page,
- lru);
- list_del(&page->lru);
+ list_for_each_entry_del(page, &pl->head, lru)
__free_page(page);
- }
ceph_pagelist_free_reserve(pl);
kfree(pl);
}
@@ -120,10 +118,9 @@ EXPORT_SYMBOL(ceph_pagelist_reserve);
/* Free any pages that have been preallocated. */
int ceph_pagelist_free_reserve(struct ceph_pagelist *pl)
{
- while (!list_empty(&pl->free_list)) {
- struct page *page = list_first_entry(&pl->free_list,
- struct page, lru);
- list_del(&page->lru);
+ struct page *page;
+
+ list_for_each_entry_del(page, &pl->free_list, lru) {
__free_page(page);
--pl->num_pages_free;
}
diff --git a/net/core/dev.c b/net/core/dev.c
index 5aaf5753d4e4..0e691eb4afd3 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10403,13 +10403,8 @@ void netdev_run_todo(void)

list_replace_init(&net_unlink_list, &unlink_list);

- while (!list_empty(&unlink_list)) {
- struct net_device *dev = list_first_entry(&unlink_list,
- struct net_device,
- unlink_list);
- list_del_init(&dev->unlink_list);
+ list_for_each_entry_del_init(dev, &unlink_list, unlink_list)
dev->nested_level = dev->lower_level - 1;
- }
#endif

/* Snapshot list, allow later requests */
@@ -11166,6 +11161,7 @@ EXPORT_SYMBOL_GPL(__dev_change_net_namespace);

static int dev_cpu_dead(unsigned int oldcpu)
{
+ struct napi_struct *napi;
struct sk_buff **list_skb;
struct sk_buff *skb;
unsigned int cpu;
@@ -11195,12 +11191,7 @@ static int dev_cpu_dead(unsigned int oldcpu)
* process_backlog() must be called by cpu owning percpu backlog.
* We properly handle process_queue & input_pkt_queue later.
*/
- while (!list_empty(&oldsd->poll_list)) {
- struct napi_struct *napi = list_first_entry(&oldsd->poll_list,
- struct napi_struct,
- poll_list);
-
- list_del_init(&napi->poll_list);
+ list_for_each_entry_del_init(napi, &oldsd->poll_list, poll_list) {
if (napi->poll == process_backlog)
napi->state = 0;
else
diff --git a/net/handshake/netlink.c b/net/handshake/netlink.c
index d0bc1dd8e65a..edfb04c38ee5 100644
--- a/net/handshake/netlink.c
+++ b/net/handshake/netlink.c
@@ -228,10 +228,7 @@ static void __net_exit handshake_net_exit(struct net *net)
list_splice_init(&requests, &hn->hn_requests);
spin_unlock(&hn->hn_lock);

- while (!list_empty(&requests)) {
- req = list_first_entry(&requests, struct handshake_req, hr_list);
- list_del(&req->hr_list);
-
+ list_for_each_entry_del(req, &requests, hr_list) {
/*
* Requests on this list have not yet been
* accepted, so they do not have an fd to put.
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 0b6ee962c84e..4076f2e989ea 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -825,10 +825,7 @@ static void dev_forward_change(struct inet6_dev *idev)
}
read_unlock_bh(&idev->lock);

- while (!list_empty(&tmp_addr_list)) {
- ifa = list_first_entry(&tmp_addr_list,
- struct inet6_ifaddr, if_list_aux);
- list_del(&ifa->if_list_aux);
+ list_for_each_entry_del(ifa, &tmp_addr_list, if_list_aux) {
if (idev->cnf.forwarding)
addrconf_join_anycast(ifa);
else
@@ -3858,10 +3855,7 @@ static int addrconf_ifdown(struct net_device *dev, bool unregister)
idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);

/* Step 3: clear tempaddr list */
- while (!list_empty(&idev->tempaddr_list)) {
- ifa = list_first_entry(&idev->tempaddr_list,
- struct inet6_ifaddr, tmp_list);
- list_del(&ifa->tmp_list);
+ list_for_each_entry_del(ifa, &idev->tempaddr_list, tmp_list) {
write_unlock_bh(&idev->lock);
spin_lock_bh(&ifa->lock);

@@ -3878,14 +3872,10 @@ static int addrconf_ifdown(struct net_device *dev, bool unregister)
list_add_tail(&ifa->if_list_aux, &tmp_addr_list);
write_unlock_bh(&idev->lock);

- while (!list_empty(&tmp_addr_list)) {
+ list_for_each_entry_del(ifa, &tmp_addr_list, if_list_aux) {
struct fib6_info *rt = NULL;
bool keep;

- ifa = list_first_entry(&tmp_addr_list,
- struct inet6_ifaddr, if_list_aux);
- list_del(&ifa->if_list_aux);
-
addrconf_del_dad_work(ifa);

keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) &&
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 5542c93edfba..278fc63d5996 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -698,10 +698,7 @@ static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata)
sta_info_flush(sdata);

spin_lock_bh(&ifibss->incomplete_lock);
- while (!list_empty(&ifibss->incomplete_stations)) {
- sta = list_first_entry(&ifibss->incomplete_stations,
- struct sta_info, list);
- list_del(&sta->list);
+ list_for_each_entry_del(sta, &ifibss->incomplete_stations, list) {
spin_unlock_bh(&ifibss->incomplete_lock);

sta_info_free(local, sta);
@@ -1692,10 +1689,7 @@ void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
goto out;

spin_lock_bh(&ifibss->incomplete_lock);
- while (!list_empty(&ifibss->incomplete_stations)) {
- sta = list_first_entry(&ifibss->incomplete_stations,
- struct sta_info, list);
- list_del(&sta->list);
+ list_for_each_entry_del(sta, &ifibss->incomplete_stations, list) {
spin_unlock_bh(&ifibss->incomplete_lock);

ieee80211_ibss_finish_sta(sta);
diff --git a/net/mac80211/ocb.c b/net/mac80211/ocb.c
index b44896e14522..e0aee270ab2d 100644
--- a/net/mac80211/ocb.c
+++ b/net/mac80211/ocb.c
@@ -130,10 +130,7 @@ void ieee80211_ocb_work(struct ieee80211_sub_if_data *sdata)
sdata_lock(sdata);

spin_lock_bh(&ifocb->incomplete_lock);
- while (!list_empty(&ifocb->incomplete_stations)) {
- sta = list_first_entry(&ifocb->incomplete_stations,
- struct sta_info, list);
- list_del(&sta->list);
+ list_for_each_entry_del(sta, &ifocb->incomplete_stations, list) {
spin_unlock_bh(&ifocb->incomplete_lock);

ieee80211_ocb_finish_sta(sta);
@@ -213,10 +210,7 @@ int ieee80211_ocb_leave(struct ieee80211_sub_if_data *sdata)
sta_info_flush(sdata);

spin_lock_bh(&ifocb->incomplete_lock);
- while (!list_empty(&ifocb->incomplete_stations)) {
- sta = list_first_entry(&ifocb->incomplete_stations,
- struct sta_info, list);
- list_del(&sta->list);
+ list_for_each_entry_del(sta, &ifocb->incomplete_stations, list) {
spin_unlock_bh(&ifocb->incomplete_lock);

sta_info_free(local, sta);
diff --git a/net/rds/send.c b/net/rds/send.c
index 5e57a1581dc6..d0675b91245e 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -608,13 +608,9 @@ static void rds_send_remove_from_sock(struct list_head *messages, int status)
struct rds_sock *rs = NULL;
struct rds_message *rm;

- while (!list_empty(messages)) {
+ list_for_each_entry_del_init(rm, messages, m_conn_item) {
int was_on_sock = 0;

- rm = list_entry(messages->next, struct rds_message,
- m_conn_item);
- list_del_init(&rm->m_conn_item);
-
/*
* If we see this flag cleared then we're *sure* that someone
* else beat us to removing it from the sock. If we race
@@ -788,9 +784,7 @@ void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in6 *dest)

rds_wake_sk_sleep(rs);

- while (!list_empty(&list)) {
- rm = list_entry(list.next, struct rds_message, m_sock_item);
- list_del_init(&rm->m_sock_item);
+ list_for_each_entry_del_init(rm, &list, m_sock_item) {
rds_message_wait(rm);

/* just in case the code above skipped this message
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c
index 773eecd1e979..4c6c5d8814d7 100644
--- a/net/rxrpc/call_object.c
+++ b/net/rxrpc/call_object.c
@@ -613,10 +613,7 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx)

_enter("%p", rx);

- while (!list_empty(&rx->to_be_accepted)) {
- call = list_entry(rx->to_be_accepted.next,
- struct rxrpc_call, accept_link);
- list_del(&call->accept_link);
+ list_for_each_entry_del(call, &rx->to_be_accepted, accept_link) {
rxrpc_propose_abort(call, RX_CALL_DEAD, -ECONNRESET,
rxrpc_abort_call_sock_release_tba);
rxrpc_put_call(call, rxrpc_call_put_release_sock_tba);
diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c
index ac85d4644a3c..dce3855202eb 100644
--- a/net/rxrpc/conn_object.c
+++ b/net/rxrpc/conn_object.c
@@ -441,11 +441,7 @@ void rxrpc_service_connection_reaper(struct work_struct *work)
rxrpc_set_service_reap_timer(rxnet, earliest);
}

- while (!list_empty(&graveyard)) {
- conn = list_entry(graveyard.next, struct rxrpc_connection,
- link);
- list_del_init(&conn->link);
-
+ list_for_each_entry_del_init(conn, &graveyard, link) {
ASSERTCMP(atomic_read(&conn->active), ==, -1);
rxrpc_put_connection(conn, rxrpc_conn_put_service_reaped);
}
diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c
index 552ba84a255c..876c649be7f8 100644
--- a/net/rxrpc/peer_event.c
+++ b/net/rxrpc/peer_event.c
@@ -240,11 +240,7 @@ static void rxrpc_peer_keepalive_dispatch(struct rxrpc_net *rxnet,

spin_lock(&rxnet->peer_hash_lock);

- while (!list_empty(collector)) {
- peer = list_entry(collector->next,
- struct rxrpc_peer, keepalive_link);
-
- list_del_init(&peer->keepalive_link);
+ list_for_each_entry_del_init(peer, collector, keepalive_link) {
if (!rxrpc_get_peer_maybe(peer, rxrpc_peer_get_keepalive))
continue;

diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c
index 814b0169f972..2e0d2736059c 100644
--- a/net/sunrpc/auth.c
+++ b/net/sunrpc/auth.c
@@ -328,11 +328,8 @@ void rpcauth_destroy_credlist(struct list_head *head)
{
struct rpc_cred *cred;

- while (!list_empty(head)) {
- cred = list_entry(head->next, struct rpc_cred, cr_lru);
- list_del_init(&cred->cr_lru);
+ list_for_each_entry_del_init(cred, head, cr_lru)
put_rpccred(cred);
- }
}

static void
diff --git a/net/sunrpc/backchannel_rqst.c b/net/sunrpc/backchannel_rqst.c
index 65a6c6429a53..538450dea3bd 100644
--- a/net/sunrpc/backchannel_rqst.c
+++ b/net/sunrpc/backchannel_rqst.c
@@ -179,13 +179,8 @@ int xprt_setup_bc(struct rpc_xprt *xprt, unsigned int min_reqs)
/*
* Memory allocation failed, free the temporary list
*/
- while (!list_empty(&tmp_list)) {
- req = list_first_entry(&tmp_list,
- struct rpc_rqst,
- rq_bc_pa_list);
- list_del(&req->rq_bc_pa_list);
+ list_for_each_entry_del(req, &tmp_list, rq_bc_pa_list)
xprt_free_allocation(req);
- }

dprintk("RPC: setup backchannel transport failed\n");
return -ENOMEM;
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
index 95ff74706104..48e0c256241f 100644
--- a/net/sunrpc/cache.c
+++ b/net/sunrpc/cache.c
@@ -746,11 +746,8 @@ static void cache_revisit_request(struct cache_head *item)

spin_unlock(&cache_defer_lock);

- while (!list_empty(&pending)) {
- dreq = list_entry(pending.next, struct cache_deferred_req, recent);
- list_del_init(&dreq->recent);
+ list_for_each_entry_del_init(dreq, &pending, recent)
dreq->revisit(dreq, 0);
- }
}

void cache_clean_deferred(void *owner)
@@ -770,11 +767,8 @@ void cache_clean_deferred(void *owner)
}
spin_unlock(&cache_defer_lock);

- while (!list_empty(&pending)) {
- dreq = list_entry(pending.next, struct cache_deferred_req, recent);
- list_del_init(&dreq->recent);
+ list_for_each_entry_del_init(dreq, &pending, recent)
dreq->revisit(dreq, 1);
- }
}

/*
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 4cfe9640df48..15e78a1eb723 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -987,10 +987,7 @@ void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)
}
spin_unlock_bh(&serv->sv_lock);

- while (!list_empty(&to_be_closed)) {
- le = to_be_closed.next;
- list_del_init(le);
- xprt = list_entry(le, struct svc_xprt, xpt_list);
+ list_for_each_entry_del_init(xprt, &to_be_closed, xpt_list) {
set_bit(XPT_CLOSE, &xprt->xpt_flags);
set_bit(XPT_KILL_TEMP, &xprt->xpt_flags);
dprintk("svc_age_temp_xprts_now: queuing xprt %p for closing\n",
@@ -1005,11 +1002,8 @@ static void call_xpt_users(struct svc_xprt *xprt)
struct svc_xpt_user *u;

spin_lock(&xprt->xpt_lock);
- while (!list_empty(&xprt->xpt_users)) {
- u = list_first_entry(&xprt->xpt_users, struct svc_xpt_user, list);
- list_del_init(&u->list);
+ list_for_each_entry_del_init(u, &xprt->xpt_users, list)
u->callback(u);
- }
spin_unlock(&xprt->xpt_lock);
}

diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index ab453ede54f0..d41b2b7cb081 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -1770,11 +1770,8 @@ EXPORT_SYMBOL_GPL(xprt_free_slot);
static void xprt_free_all_slots(struct rpc_xprt *xprt)
{
struct rpc_rqst *req;
- while (!list_empty(&xprt->free)) {
- req = list_first_entry(&xprt->free, struct rpc_rqst, rq_list);
- list_del(&req->rq_list);
+ list_for_each_entry_del(req, &xprt->free, rq_list)
kfree(req);
- }
}

static DEFINE_IDA(rpc_xprt_ids);
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 28c0771c4e8c..9d4ed2cb5bbf 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -1140,16 +1140,11 @@ static void rpcrdma_mrs_destroy(struct rpcrdma_xprt *r_xprt)
void
rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf)
{
+ struct rpcrdma_req *req;
rpcrdma_reps_destroy(buf);

- while (!list_empty(&buf->rb_send_bufs)) {
- struct rpcrdma_req *req;
-
- req = list_first_entry(&buf->rb_send_bufs,
- struct rpcrdma_req, rl_list);
- list_del(&req->rl_list);
+ list_for_each_entry_del(req, &buf->rb_send_bufs, rl_list)
rpcrdma_req_destroy(req);
- }
}

/**
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c
index b370070194fa..eb5ceb9bdc08 100644
--- a/net/vmw_vsock/vmci_transport.c
+++ b/net/vmw_vsock/vmci_transport.c
@@ -1594,12 +1594,9 @@ static int vmci_transport_socket_init(struct vsock_sock *vsk,

static void vmci_transport_free_resources(struct list_head *transport_list)
{
- while (!list_empty(transport_list)) {
- struct vmci_transport *transport =
- list_first_entry(transport_list, struct vmci_transport,
- elem);
- list_del(&transport->elem);
+ struct vmci_transport *transport;

+ list_for_each_entry_del(transport, transport_list, elem) {
if (transport->detach_sub_id != VMCI_INVALID_ID) {
vmci_event_unsubscribe(transport->detach_sub_id);
transport->detach_sub_id = VMCI_INVALID_ID;
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 64e861617110..3386ed5f68fb 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -1051,18 +1051,14 @@ EXPORT_SYMBOL(wiphy_rfkill_start_polling);

void cfg80211_process_wiphy_works(struct cfg80211_registered_device *rdev)
{
+ struct wiphy_work *wk;
unsigned int runaway_limit = 100;
unsigned long flags;

lockdep_assert_held(&rdev->wiphy.mtx);

spin_lock_irqsave(&rdev->wiphy_work_lock, flags);
- while (!list_empty(&rdev->wiphy_work_list)) {
- struct wiphy_work *wk;
-
- wk = list_first_entry(&rdev->wiphy_work_list,
- struct wiphy_work, entry);
- list_del_init(&wk->entry);
+ list_for_each_entry_del_init(wk, &rdev->wiphy_work_list, entry) {
spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags);

wk->func(&rdev->wiphy, wk);
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 0317cf9da307..de64008f741e 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -487,12 +487,7 @@ static void reg_regdb_apply(struct work_struct *work)
rtnl_lock();

mutex_lock(&reg_regdb_apply_mutex);
- while (!list_empty(&reg_regdb_apply_list)) {
- request = list_first_entry(&reg_regdb_apply_list,
- struct reg_regdb_apply_request,
- list);
- list_del(&request->list);
-
+ list_for_each_entry_del(request, &reg_regdb_apply_list, list) {
set_regdom(request->regdom, REGD_SOURCE_INTERNAL_DB);
kfree(request);
}
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 1783ab9d57a3..6ac1b4dedb77 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1038,10 +1038,7 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev)
unsigned long flags;

spin_lock_irqsave(&wdev->event_lock, flags);
- while (!list_empty(&wdev->event_list)) {
- ev = list_first_entry(&wdev->event_list,
- struct cfg80211_event, list);
- list_del(&ev->list);
+ list_for_each_entry_del(ev, &wdev->event_list, list) {
spin_unlock_irqrestore(&wdev->event_lock, flags);

wdev_lock(wdev);
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index 108eccc5ada5..ef419b71ce92 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -1710,10 +1710,7 @@ static void destroy_buffers(void)
union aa_buffer *aa_buf;

spin_lock(&aa_buffers_lock);
- while (!list_empty(&aa_global_buffers)) {
- aa_buf = list_first_entry(&aa_global_buffers, union aa_buffer,
- list);
- list_del(&aa_buf->list);
+ list_for_each_entry_del(aa_buf, &aa_global_buffers, list) {
spin_unlock(&aa_buffers_lock);
kfree(aa_buf);
spin_lock(&aa_buffers_lock);
diff --git a/sound/core/misc.c b/sound/core/misc.c
index d32a19976a2b..f7769582975d 100644
--- a/sound/core/misc.c
+++ b/sound/core/misc.c
@@ -173,9 +173,7 @@ static void snd_fasync_work_fn(struct work_struct *work)
struct snd_fasync *fasync;

spin_lock_irq(&snd_fasync_lock);
- while (!list_empty(&snd_fasync_list)) {
- fasync = list_first_entry(&snd_fasync_list, struct snd_fasync, list);
- list_del_init(&fasync->list);
+ list_for_each_entry_del_init(fasync, &snd_fasync_list, list) {
spin_unlock_irq(&snd_fasync_lock);
if (fasync->on)
kill_fasync(&fasync->fasync, fasync->signal, fasync->poll);
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c
index 1431cb997808..cd1179369e58 100644
--- a/sound/core/rawmidi.c
+++ b/sound/core/rawmidi.c
@@ -1970,11 +1970,8 @@ static void snd_rawmidi_free_substreams(struct snd_rawmidi_str *stream)
{
struct snd_rawmidi_substream *substream;

- while (!list_empty(&stream->substreams)) {
- substream = list_entry(stream->substreams.next, struct snd_rawmidi_substream, list);
- list_del(&substream->list);
+ list_for_each_entry_del(substream, &stream->substreams, list)
kfree(substream);
- }
}

/* called from ump.c, too */
diff --git a/sound/core/timer.c b/sound/core/timer.c
index e6e551d4a29e..04c202babf1b 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -779,13 +779,8 @@ static void snd_timer_process_callbacks(struct snd_timer *timer,
struct snd_timer_instance *ti;
unsigned long resolution, ticks;

- while (!list_empty(head)) {
- ti = list_first_entry(head, struct snd_timer_instance,
- ack_list);
-
- /* remove from ack_list and make empty */
- list_del_init(&ti->ack_list);
-
+ /* remove from ack_list and make empty */
+ list_for_each_entry_del_init(ti, head, ack_list) {
if (!(ti->flags & SNDRV_TIMER_IFLG_DEAD)) {
ticks = ti->pticks;
ti->pticks = 0;
diff --git a/sound/core/ump.c b/sound/core/ump.c
index 3bef1944e955..0a1fcaf7b072 100644
--- a/sound/core/ump.c
+++ b/sound/core/ump.c
@@ -74,10 +74,7 @@ static void snd_ump_endpoint_free(struct snd_rawmidi *rmidi)
struct snd_ump_endpoint *ump = rawmidi_to_ump(rmidi);
struct snd_ump_block *fb;

- while (!list_empty(&ump->block_list)) {
- fb = list_first_entry(&ump->block_list, struct snd_ump_block,
- list);
- list_del(&fb->list);
+ list_for_each_entry_del(fb, &ump->block_list, list) {
if (fb->private_free)
fb->private_free(fb);
kfree(fb);
diff --git a/sound/hda/ext/hdac_ext_controller.c b/sound/hda/ext/hdac_ext_controller.c
index 6199bb60ccf0..fff6e1382859 100644
--- a/sound/hda/ext/hdac_ext_controller.c
+++ b/sound/hda/ext/hdac_ext_controller.c
@@ -117,11 +117,8 @@ void snd_hdac_ext_link_free_all(struct hdac_bus *bus)
{
struct hdac_ext_link *hlink;

- while (!list_empty(&bus->hlink_list)) {
- hlink = list_first_entry(&bus->hlink_list, struct hdac_ext_link, list);
- list_del(&hlink->list);
+ list_for_each_entry_del(hlink, &bus->hlink_list, list)
kfree(hlink);
- }
}
EXPORT_SYMBOL_GPL(snd_hdac_ext_link_free_all);

diff --git a/sound/pci/ctxfi/ctimap.c b/sound/pci/ctxfi/ctimap.c
index d5a53d2f5f15..db3b126e757d 100644
--- a/sound/pci/ctxfi/ctimap.c
+++ b/sound/pci/ctxfi/ctimap.c
@@ -96,13 +96,8 @@ int input_mapper_delete(struct list_head *mappers, struct imapper *entry,
void free_input_mapper_list(struct list_head *head)
{
struct imapper *entry;
- struct list_head *pos;

- while (!list_empty(head)) {
- pos = head->next;
- list_del(pos);
- entry = list_entry(pos, struct imapper, list);
+ list_for_each_entry_del(entry, head, list)
kfree(entry);
- }
}

diff --git a/sound/pci/ctxfi/ctvmem.c b/sound/pci/ctxfi/ctvmem.c
index 7a805c4a58e1..1a863691e127 100644
--- a/sound/pci/ctxfi/ctvmem.c
+++ b/sound/pci/ctxfi/ctvmem.c
@@ -215,22 +215,14 @@ int ct_vm_create(struct ct_vm **rvm, struct pci_dev *pci)
void ct_vm_destroy(struct ct_vm *vm)
{
int i;
- struct list_head *pos;
struct ct_vm_block *entry;

/* free used and unused list nodes */
- while (!list_empty(&vm->used)) {
- pos = vm->used.next;
- list_del(pos);
- entry = list_entry(pos, struct ct_vm_block, list);
+ list_for_each_entry_del(entry, &vm->used, list)
kfree(entry);
- }
- while (!list_empty(&vm->unused)) {
- pos = vm->unused.next;
- list_del(pos);
- entry = list_entry(pos, struct ct_vm_block, list);
+
+ list_for_each_entry_del(entry, &vm->unused, list)
kfree(entry);
- }

/* free allocated page table pages */
for (i = 0; i < CT_PTP_NUM; i++)
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 33af707a65ab..5069878fc752 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -120,12 +120,10 @@ static int add_conn_list(struct hda_codec *codec, hda_nid_t nid, int len,

static void remove_conn_list(struct hda_codec *codec)
{
- while (!list_empty(&codec->conn_list)) {
- struct hda_conn_list *p;
- p = list_first_entry(&codec->conn_list, typeof(*p), list);
- list_del(&p->list);
+ struct hda_conn_list *p;
+
+ list_for_each_entry_del(p, &codec->conn_list, list)
kfree(p);
- }
}

/* read the connection and add to the cache */
diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
index 406779625fb5..732ff038788a 100644
--- a/sound/pci/hda/hda_controller.c
+++ b/sound/pci/hda/hda_controller.c
@@ -1317,10 +1317,7 @@ void azx_free_streams(struct azx *chip)
struct hdac_bus *bus = azx_bus(chip);
struct hdac_stream *s;

- while (!list_empty(&bus->stream_list)) {
- s = list_first_entry(&bus->stream_list, struct hdac_stream, list);
- list_del(&s->list);
+ list_for_each_entry_del(s, &bus->stream_list, list)
kfree(stream_to_azx_dev(s));
- }
}
EXPORT_SYMBOL_GPL(azx_free_streams);
diff --git a/sound/soc/codecs/wm0010.c b/sound/soc/codecs/wm0010.c
index 1d4259433f47..c65171564926 100644
--- a/sound/soc/codecs/wm0010.c
+++ b/sound/soc/codecs/wm0010.c
@@ -478,12 +478,9 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_component *comp
ret = 0;

abort1:
- while (!list_empty(&xfer_list)) {
- xfer = list_first_entry(&xfer_list, struct wm0010_boot_xfer,
- list);
+ list_for_each_entry_del(xfer, &xfer_list, list) {
kfree(xfer->t.rx_buf);
kfree(xfer->t.tx_buf);
- list_del(&xfer->list);
kfree(xfer);
}

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index 54704250c0a2..c5b28cea8a10 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -1317,10 +1317,7 @@ void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
}
snd_soc_dpcm_stream_unlock_irq(fe, stream);

- while (!list_empty(&deleted_dpcms)) {
- dpcm = list_first_entry(&deleted_dpcms, struct snd_soc_dpcm,
- list_fe);
- list_del(&dpcm->list_fe);
+ list_for_each_entry_del(dpcm, &deleted_dpcms, list_fe) {
dpcm_remove_debugfs_state(dpcm);
kfree(dpcm);
}
diff --git a/sound/usb/midi2.c b/sound/usb/midi2.c
index 1ec177fe284e..95682bdee3e6 100644
--- a/sound/usb/midi2.c
+++ b/sound/usb/midi2.c
@@ -692,12 +692,8 @@ static void free_all_midi2_umps(struct snd_usb_midi2_interface *umidi)
{
struct snd_usb_midi2_ump *rmidi;

- while (!list_empty(&umidi->rawmidi_list)) {
- rmidi = list_first_entry(&umidi->rawmidi_list,
- struct snd_usb_midi2_ump, list);
- list_del(&rmidi->list);
+ list_for_each_entry_del(rmidi, &umidi->rawmidi_list, list)
kfree(rmidi);
- }
}

static int create_midi2_ump(struct snd_usb_midi2_interface *umidi,
--
2.41.0

2023-10-20 10:32:03

by Miklos Szeredi

[permalink] [raw]
Subject: [RFC PATCH 1/2] add list_for_each_entry_del()

Add a new list iteration macro that always takes the first element of the
list and removes it, until the list is empty.

Add a list_for_each_entry_del_init() variant too.

This is a common pattern.

Signed-off-by: Miklos Szeredi <[email protected]>
---
include/linux/list.h | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)

diff --git a/include/linux/list.h b/include/linux/list.h
index 164b4d0e9d2a..db23a9ee98f0 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -921,6 +921,35 @@ static inline size_t list_count_nodes(struct list_head *head)
#define list_safe_reset_next(pos, n, member) \
n = list_next_entry(pos, member)

+/**
+ * list_for_each_entry_del - iterate list and remove elements
+ * @pos: the type * to use as a loop cursor.
+ * @head: the head for your list.
+ * @member: the name of the list_head within the struct.
+ *
+ * Delete first element from list before the iteration. Iterate until
+ * the list is empty.
+ */
+#define list_for_each_entry_del(pos, head, member) \
+ while (!list_empty(head) && \
+ ({ pos = list_first_entry(head, typeof(*(pos)), member);\
+ list_del(&(pos)->member); 1; }))
+
+/**
+ * list_for_each_entry_del_init - iterate list, remove and reinitialize elements
+ * @pos: the type * to use as a loop cursor.
+ * @head: the head for your list.
+ * @member: the name of the list_head within the struct.
+ *
+ * Delete first element from list before the iteration using list_del_init().
+ * Iterate until the list is empty.
+ */
+#define list_for_each_entry_del_init(pos, head, member) \
+ while (!list_empty(head) && \
+ ({ pos = list_first_entry(head, typeof(*(pos)), member);\
+ list_del_init(&(pos)->member); 1; }))
+
+
/*
* Double linked lists with a single pointer list head.
* Mostly useful for hash tables where the two pointer list head is
--
2.41.0

2023-10-21 10:02:18

by David Laight

[permalink] [raw]
Subject: RE: [RFC PATCH 1/2] add list_for_each_entry_del()

From: Miklos Szeredi
> Sent: 20 October 2023 11:29
>
> Add a new list iteration macro that always takes the first element of the
> list and removes it, until the list is empty.
...
> +/**
> + * list_for_each_entry_del - iterate list and remove elements
> + * @pos: the type * to use as a loop cursor.
> + * @head: the head for your list.
> + * @member: the name of the list_head within the struct.
> + *
> + * Delete first element from list before the iteration. Iterate until
> + * the list is empty.
> + */
> +#define list_for_each_entry_del(pos, head, member) \
> + while (!list_empty(head) && \
> + ({ pos = list_first_entry(head, typeof(*(pos)), member);\
> + list_del(&(pos)->member); 1; }))

That pattern is actually pretty obvious.
Add another wrapper and people end up having to read the
header to find out what it does.

I can't help feeling that if you look inside list_empty(),
list_first_entry() and list_del() there is a lot of
replicated code and tests.

Adding a list_del_first() function that returns the deleted
item or NULL to optimise it might make more sense.

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

2023-10-26 09:53:51

by Miklos Szeredi

[permalink] [raw]
Subject: Re: [RFC PATCH 1/2] add list_for_each_entry_del()

On Sat, Oct 21, 2023 at 12:00 PM David Laight <[email protected]> wrote:

> Adding a list_del_first() function that returns the deleted
> item or NULL to optimise it might make more sense.

Something like this?

- list_for_each_entry_del(entry, head, member))
+ while (list_del_first(entry, head, member))

This allows the compact loop condition, and I always hated having to
pass the type to list_*entry()... Disadvantage being that the
assignment is now implicit (just as with all the list iterators).

Thanks,
Miklos

2023-10-26 18:43:13

by Linus Torvalds

[permalink] [raw]
Subject: Re: [RFC PATCH 1/2] add list_for_each_entry_del()

On Wed, 25 Oct 2023 at 23:52, Miklos Szeredi <[email protected]> wrote:
>
> Something like this?
>
> - list_for_each_entry_del(entry, head, member))
> + while (list_del_first(entry, head, member))
>
> This allows the compact loop condition, and I always hated having to
> pass the type to list_*entry()... Disadvantage being that the
> assignment is now implicit (just as with all the list iterators).

So I have two issues with this.

One is purely syntactical: I would be personally happier if any new
list iterators kept the declaration of the iterator internally to
itself.

IOW, instead of

struct request *rq;

list_for_each_entry_del(rq, list, queuelist) {
...

we'd move on to modern C which allows declaring variables in for loops
(so they aren't visible outside the loop), and turn it into

list_for_each_entry_del(struct request, rq, list, queuelist) {
...

which would then behind the scenes turn into

for (struct request *rq; rq = list_del_first(list, queuelist); ) {
...

or something. None of these "we have stale 'rq' variables outside the
list" things.

(Of course, I realize that people then sometimes intentionally use
those stale variables outside the list by breaking out of the loop in
the middle, but it's ugly)

That said, the *second* issue I have with this whole
list_for_each_entry_del() is that it seems a bit mis-designed. You
have two cases:

- you want to unconditionally delete everything

- you might want to have a condition on it and break out early

and the first one is often better dealt with by first moving the list
to a private list head (presumably using list_splice_init()), and then
iterating the private list head instead. That can avoid having to hold
a lock over the whole loop (or dropping it and re-taking it), for
example.

And that *second* case would presumably want to use
list_for_each_entry_safe(), and then do the "list_del()" at the _end_
of the loop, not at the beginning?

Hmm?

I guess the "delete the whole list" is the simple case you want to
deal with, and people who can use a private list to avoid locking
already do the list_splice_init() thing separately (or create the
private list as a separate phase, to also deal with the "I'm not going
to delete everything" issue).

Linus