mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
This is the 5.4.33 stable release
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl6ZbdIACgkQONu9yGCS
aT5Jqw/7BZ639nTAAmz809yOF1JBhvBptRg9tBKYAfw62DzfZe5s9IZA6znIt0f0
nlluLvnhHlDSpgycHNkFry5AkiCUpRQW6NY681xITm918w3BxsKX2pfCawojIOSw
YBaTWoWqNFQQWlC18L1CWJmIvIktSCHXBMTVDpnvRv7sw5A4Oe/zarzVDNb0A6OJ
ThaR7LAKJrUEDDLuCOuB/IrYCOpOzg2SkViFmlo4wmmhvCSi8PXvf3royrSFXxM/
Y1bs67Hu/uqeHl8Y2RaMZpXf1aW9F31sooca4GD+UnVoWppjIOKRyuGLTrXKv7pw
/goIzlE8wfJz5K0iQ4UcbXwwdY81L9UlMdVsmIWHHgxMjSp1J5mfQ5TLUC/VK3UO
Ll9tCYBwH4FjzxNRJq7if8TDAfgPzyhw4BMchgXZWzW1oasl51T2uEye3KgFXQSb
u6TwCx4KGS0w/Q81SKis83Pb0unHGanJOSCZxI1B44raf0ruCBpTYUc713pfegWT
46YtwoorAK8N+GpFQA1tsTJvVclqCF5bHVE19TMvXV4UX/VTPtbIAUE7vnvcxcqO
uh0b9Jfmd6Fcgh7VZQCH7CUYnsyJmGqj2kycB1p+T8UB6H+PCeuQBZBl8sJnf8oj
d5NIzB7WWXBQuEG5XuPtxg6+ARMPEIpd2exEVn9ZOv5qhesBo04=
=pjAq
-----END PGP SIGNATURE-----
Merge 5.4.33 into android-5.4-stable
Changes in 5.4.33
ARM: dts: sun8i-a83t-tbs-a711: HM5065 doesn't like such a high voltage
bus: sunxi-rsb: Return correct data when mixing 16-bit and 8-bit reads
ARM: dts: Fix dm814x Ethernet by changing to use rgmii-id mode
bpf: Fix deadlock with rq_lock in bpf_send_signal()
iwlwifi: mvm: Fix rate scale NSS configuration
Input: tm2-touchkey - add support for Coreriver TC360 variant
soc: fsl: dpio: register dpio irq handlers after dpio create
rxrpc: Abstract out the calculation of whether there's Tx space
rxrpc: Fix call interruptibility handling
net: stmmac: platform: Fix misleading interrupt error msg
net: vxge: fix wrong __VA_ARGS__ usage
hinic: fix a bug of waitting for IO stopped
hinic: fix the bug of clearing event queue
hinic: fix out-of-order excution in arm cpu
hinic: fix wrong para of wait_for_completion_timeout
hinic: fix wrong value of MIN_SKB_LEN
selftests/net: add definition for SOL_DCCP to fix compilation errors for old libc
cxgb4/ptp: pass the sign of offset delta in FW CMD
drm/scheduler: fix rare NULL ptr race
cfg80211: Do not warn on same channel at the end of CSA
qlcnic: Fix bad kzalloc null test
i2c: st: fix missing struct parameter description
i2c: pca-platform: Use platform_irq_get_optional
media: rc: add keymap for Videostrong KII Pro
cpufreq: imx6q: Fixes unwanted cpu overclocking on i.MX6ULL
staging: wilc1000: avoid double unlocking of 'wilc->hif_cs' mutex
media: venus: hfi_parser: Ignore HEVC encoding for V1
firmware: arm_sdei: fix double-lock on hibernate with shared events
null_blk: Fix the null_add_dev() error path
null_blk: Handle null_add_dev() failures properly
null_blk: fix spurious IO errors after failed past-wp access
media: imx: imx7_mipi_csis: Power off the source when stopping streaming
media: imx: imx7-media-csi: Fix video field handling
xhci: bail out early if driver can't accress host in resume
ACPI: EC: Do not clear boot_ec_is_ecdt in acpi_ec_add()
x86: Don't let pgprot_modify() change the page encryption bit
dma-mapping: Fix dma_pgprot() for unencrypted coherent pages
block: keep bdi->io_pages in sync with max_sectors_kb for stacked devices
debugfs: Check module state before warning in {full/open}_proxy_open()
irqchip/versatile-fpga: Handle chained IRQs properly
time/sched_clock: Expire timer in hardirq context
media: allegro: fix type of gop_length in channel_create message
sched: Avoid scale real weight down to zero
selftests/x86/ptrace_syscall_32: Fix no-vDSO segfault
PCI/switchtec: Fix init_completion race condition with poll_wait()
block, bfq: move forward the getting of an extra ref in bfq_bfqq_move
media: i2c: video-i2c: fix build errors due to 'imply hwmon'
libata: Remove extra scsi_host_put() in ata_scsi_add_hosts()
pstore/platform: fix potential mem leak if pstore_init_fs failed
gfs2: Do log_flush in gfs2_ail_empty_gl even if ail list is empty
gfs2: Don't demote a glock until its revokes are written
cpufreq: imx6q: fix error handling
x86/boot: Use unsigned comparison for addresses
efi/x86: Ignore the memory attributes table on i386
genirq/irqdomain: Check pointer in irq_domain_alloc_irqs_hierarchy()
block: Fix use-after-free issue accessing struct io_cq
media: i2c: ov5695: Fix power on and off sequences
usb: dwc3: core: add support for disabling SS instances in park mode
irqchip/gic-v4: Provide irq_retrigger to avoid circular locking dependency
md: check arrays is suspended in mddev_detach before call quiesce operations
firmware: fix a double abort case with fw_load_sysfs_fallback
spi: spi-fsl-dspi: Replace interruptible wait queue with a simple completion
locking/lockdep: Avoid recursion in lockdep_count_{for,back}ward_deps()
block, bfq: fix use-after-free in bfq_idle_slice_timer_body
btrfs: qgroup: ensure qgroup_rescan_running is only set when the worker is at least queued
btrfs: remove a BUG_ON() from merge_reloc_roots()
btrfs: restart relocate_tree_blocks properly
btrfs: track reloc roots based on their commit root bytenr
ASoC: fix regwmask
ASoC: dapm: connect virtual mux with default value
ASoC: dpcm: allow start or stop during pause for backend
ASoC: topology: use name_prefix for new kcontrol
usb: gadget: f_fs: Fix use after free issue as part of queue failure
usb: gadget: composite: Inform controller driver of self-powered
ALSA: usb-audio: Add mixer workaround for TRX40 and co
ALSA: hda: Add driver blacklist
ALSA: hda: Fix potential access overflow in beep helper
ALSA: ice1724: Fix invalid access for enumerated ctl items
ALSA: pcm: oss: Fix regression by buffer overflow fix
ALSA: hda/realtek: Enable mute LED on an HP system
ALSA: hda/realtek - a fake key event is triggered by running shutup
ALSA: doc: Document PC Beep Hidden Register on Realtek ALC256
ALSA: hda/realtek - Set principled PC Beep configuration for ALC256
ALSA: hda/realtek - Remove now-unnecessary XPS 13 headphone noise fixups
ALSA: hda/realtek - Add quirk for Lenovo Carbon X1 8th gen
ALSA: hda/realtek - Add quirk for MSI GL63
media: venus: firmware: Ignore secure call error on first resume
media: hantro: Read be32 words starting at every fourth byte
media: ti-vpe: cal: fix disable_irqs to only the intended target
media: ti-vpe: cal: fix a kernel oops when unloading module
seccomp: Add missing compat_ioctl for notify
acpi/x86: ignore unspecified bit positions in the ACPI global lock field
ACPICA: Allow acpi_any_gpe_status_set() to skip one GPE
ACPI: PM: s2idle: Refine active GPEs check
thermal: devfreq_cooling: inline all stubs for CONFIG_DEVFREQ_THERMAL=n
nvmet-tcp: fix maxh2cdata icresp parameter
nvme-fc: Revert "add module to ops template to allow module references"
efi/x86: Add TPM related EFI tables to unencrypted mapping checks
PCI: pciehp: Fix indefinite wait on sysfs requests
PCI/ASPM: Clear the correct bits when enabling L1 substates
PCI: Add boot interrupt quirk mechanism for Xeon chipsets
PCI: qcom: Fix the fixup of PCI_VENDOR_ID_QCOM
PCI: endpoint: Fix for concurrent memory allocation in OB address region
sched/fair: Fix enqueue_task_fair warning
tpm: Don't make log failures fatal
tpm: tpm1_bios_measurements_next should increase position index
tpm: tpm2_bios_measurements_next should increase position index
KEYS: reaching the keys quotas correctly
cpu/hotplug: Ignore pm_wakeup_pending() for disable_nonboot_cpus()
genirq/debugfs: Add missing sanity checks to interrupt injection
irqchip/versatile-fpga: Apply clear-mask earlier
io_uring: remove bogus RLIMIT_NOFILE check in file registration
pstore: pstore_ftrace_seq_next should increase position index
MIPS/tlbex: Fix LDDIR usage in setup_pw() for Loongson-3
MIPS: OCTEON: irq: Fix potential NULL pointer dereference
PM / Domains: Allow no domain-idle-states DT property in genpd when parsing
PM: sleep: wakeup: Skip wakeup_source_sysfs_remove() if device is not there
ath9k: Handle txpower changes even when TPC is disabled
signal: Extend exec_id to 64bits
x86/tsc_msr: Use named struct initializers
x86/tsc_msr: Fix MSR_FSB_FREQ mask for Cherry Trail devices
x86/tsc_msr: Make MSR derived TSC frequency more accurate
x86/entry/32: Add missing ASM_CLAC to general_protection entry
platform/x86: asus-wmi: Support laptops where the first battery is named BATT
KVM: nVMX: Properly handle userspace interrupt window request
KVM: s390: vsie: Fix region 1 ASCE sanity shadow address checks
KVM: s390: vsie: Fix delivery of addressing exceptions
KVM: x86: Allocate new rmap and large page tracking when moving memslot
KVM: VMX: Always VMCLEAR in-use VMCSes during crash with kexec support
KVM: x86: Gracefully handle __vmalloc() failure during VM allocation
KVM: VMX: Add a trampoline to fix VMREAD error handling
KVM: VMX: fix crash cleanup when KVM wasn't used
smb3: fix performance regression with setting mtime
CIFS: Fix bug which the return value by asynchronous read is error
mtd: spinand: Stop using spinand->oobbuf for buffering bad block markers
mtd: spinand: Do not erase the block before writing a bad block marker
btrfs: Don't submit any btree write bio if the fs has errors
Btrfs: fix crash during unmount due to race with delayed inode workers
btrfs: reloc: clean dirty subvols if we fail to start a transaction
btrfs: set update the uuid generation as soon as possible
btrfs: drop block from cache on error in relocation
btrfs: fix missing file extent item for hole after ranged fsync
btrfs: unset reloc control if we fail to recover
btrfs: fix missing semaphore unlock in btrfs_sync_file
btrfs: use nofs allocations for running delayed items
remoteproc: qcom_q6v5_mss: Don't reassign mpss region on shutdown
remoteproc: qcom_q6v5_mss: Reload the mba region on coredump
remoteproc: Fix NULL pointer dereference in rproc_virtio_notify
crypto: rng - Fix a refcounting bug in crypto_rng_reset()
crypto: mxs-dcp - fix scatterlist linearization for hash
erofs: correct the remaining shrink objects
io_uring: honor original task RLIMIT_FSIZE
mmc: sdhci-of-esdhc: fix esdhc_reset() for different controller versions
powerpc/pseries: Drop pointless static qualifier in vpa_debugfs_init()
tools: gpio: Fix out-of-tree build regression
net: qualcomm: rmnet: Allow configuration updates to existing devices
arm64: dts: allwinner: h6: Fix PMU compatible
sched/core: Remove duplicate assignment in sched_tick_remote()
arm64: dts: allwinner: h5: Fix PMU compatible
mm, memcg: do not high throttle allocators based on wraparound
dm writecache: add cond_resched to avoid CPU hangs
dm integrity: fix a crash with unusually large tag size
dm verity fec: fix memory leak in verity_fec_dtr
dm clone: Add overflow check for number of regions
dm clone metadata: Fix return type of dm_clone_nr_of_hydrated_regions()
XArray: Fix xas_pause for large multi-index entries
xarray: Fix early termination of xas_for_each_marked
crypto: caam/qi2 - fix chacha20 data size error
crypto: caam - update xts sector size for large input length
crypto: ccree - protect against empty or NULL scatterlists
crypto: ccree - only try to map auth tag if needed
crypto: ccree - dec auth tag size from cryptlen map
scsi: zfcp: fix missing erp_lock in port recovery trigger for point-to-point
scsi: ufs: fix Auto-Hibern8 error detection
scsi: lpfc: Fix lpfc_io_buf resource leak in lpfc_get_scsi_buf_s4 error path
ARM: dts: exynos: Fix polarity of the LCD SPI bus on UniversalC210 board
arm64: dts: ti: k3-am65: Add clocks to dwc3 nodes
arm64: armv8_deprecated: Fix undef_hook mask for thumb setend
selftests: vm: drop dependencies on page flags from mlock2 tests
selftests/vm: fix map_hugetlb length used for testing read and write
selftests/powerpc: Add tlbie_test in .gitignore
vfio: platform: Switch to platform_get_irq_optional()
drm/i915/gem: Flush all the reloc_gpu batch
drm/etnaviv: rework perfmon query infrastructure
drm: Remove PageReserved manipulation from drm_pci_alloc
drm/amdgpu/powerplay: using the FCLK DPM table to set the MCLK
drm/amdgpu: unify fw_write_wait for new gfx9 asics
powerpc/pseries: Avoid NULL pointer dereference when drmem is unavailable
nfsd: fsnotify on rmdir under nfsd/clients/
NFS: Fix use-after-free issues in nfs_pageio_add_request()
NFS: Fix a page leak in nfs_destroy_unlinked_subrequests()
ext4: fix a data race at inode->i_blocks
fs/filesystems.c: downgrade user-reachable WARN_ONCE() to pr_warn_once()
ocfs2: no need try to truncate file beyond i_size
perf tools: Support Python 3.8+ in Makefile
s390/diag: fix display of diagnose call statistics
Input: i8042 - add Acer Aspire 5738z to nomux list
ftrace/kprobe: Show the maxactive number on kprobe_events
clk: ingenic/jz4770: Exit with error if CGU init failed
clk: ingenic/TCU: Fix round_rate returning error
kmod: make request_module() return an error when autoloading is disabled
cpufreq: powernv: Fix use-after-free
hfsplus: fix crash and filesystem corruption when deleting files
libata: Return correct status in sata_pmp_eh_recover_pm() when ATA_DFLAG_DETACH is set
ipmi: fix hung processes in __get_guid()
xen/blkfront: fix memory allocation flags in blkfront_setup_indirect()
powerpc/64/tm: Don't let userspace set regs->trap via sigreturn
powerpc/fsl_booke: Avoid creating duplicate tlb1 entry
powerpc/hash64/devmap: Use H_PAGE_THP_HUGE when setting up huge devmap PTE entries
powerpc/xive: Use XIVE_BAD_IRQ instead of zero to catch non configured IPIs
powerpc/64: Setup a paca before parsing device tree etc.
powerpc/xive: Fix xmon support on the PowerNV platform
powerpc/kprobes: Ignore traps that happened in real mode
powerpc/64: Prevent stack protection in early boot
scsi: mpt3sas: Fix kernel panic observed on soft HBA unplug
powerpc: Make setjmp/longjmp signature standard
arm64: Always force a branch protection mode when the compiler has one
dm zoned: remove duplicate nr_rnd_zones increase in dmz_init_zone()
dm clone: replace spin_lock_irqsave with spin_lock_irq
dm clone: Fix handling of partial region discards
dm clone: Add missing casts to prevent overflows and data corruption
scsi: lpfc: Add registration for CPU Offline/Online events
scsi: lpfc: Fix Fabric hostname registration if system hostname changes
scsi: lpfc: Fix configuration of BB credit recovery in service parameters
scsi: lpfc: Fix broken Credit Recovery after driver load
Revert "drm/dp_mst: Remove VCPI while disabling topology mgr"
drm/dp_mst: Fix clearing payload state on topology disable
drm/amdgpu: fix gfx hang during suspend with video playback (v2)
drm/i915/icl+: Don't enable DDI IO power on a TypeC port in TBT mode
powerpc/kasan: Fix kasan_remap_early_shadow_ro()
mmc: sdhci: Convert sdhci_set_timeout_irq() to non-static
mmc: sdhci: Refactor sdhci_set_timeout()
bpf: Fix tnum constraints for 32-bit comparisons
mfd: dln2: Fix sanity checking for endpoints
efi/x86: Fix the deletion of variables in mixed mode
ASoC: stm32: sai: Add missing cleanup
scsi: lpfc: fix inlining of lpfc_sli4_cleanup_poll_list()
Linux 5.4.33
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Change-Id: I6c37e2c64801a572781c46fc5883bcc74e6a7a1a
This commit is contained in:
commit
a9372c6b57
266 changed files with 2951 additions and 1278 deletions
|
|
@ -656,7 +656,7 @@ bool dm_clone_is_range_hydrated(struct dm_clone_metadata *cmd,
|
|||
return (bit >= (start + nr_regions));
|
||||
}
|
||||
|
||||
unsigned long dm_clone_nr_of_hydrated_regions(struct dm_clone_metadata *cmd)
|
||||
unsigned int dm_clone_nr_of_hydrated_regions(struct dm_clone_metadata *cmd)
|
||||
{
|
||||
return bitmap_weight(cmd->region_map, cmd->nr_regions);
|
||||
}
|
||||
|
|
@ -748,7 +748,7 @@ static int __metadata_commit(struct dm_clone_metadata *cmd)
|
|||
static int __flush_dmap(struct dm_clone_metadata *cmd, struct dirty_map *dmap)
|
||||
{
|
||||
int r;
|
||||
unsigned long word, flags;
|
||||
unsigned long word;
|
||||
|
||||
word = 0;
|
||||
do {
|
||||
|
|
@ -772,9 +772,9 @@ static int __flush_dmap(struct dm_clone_metadata *cmd, struct dirty_map *dmap)
|
|||
return r;
|
||||
|
||||
/* Update the changed flag */
|
||||
spin_lock_irqsave(&cmd->bitmap_lock, flags);
|
||||
spin_lock_irq(&cmd->bitmap_lock);
|
||||
dmap->changed = 0;
|
||||
spin_unlock_irqrestore(&cmd->bitmap_lock, flags);
|
||||
spin_unlock_irq(&cmd->bitmap_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -782,7 +782,6 @@ static int __flush_dmap(struct dm_clone_metadata *cmd, struct dirty_map *dmap)
|
|||
int dm_clone_metadata_pre_commit(struct dm_clone_metadata *cmd)
|
||||
{
|
||||
int r = 0;
|
||||
unsigned long flags;
|
||||
struct dirty_map *dmap, *next_dmap;
|
||||
|
||||
down_write(&cmd->lock);
|
||||
|
|
@ -808,9 +807,9 @@ int dm_clone_metadata_pre_commit(struct dm_clone_metadata *cmd)
|
|||
}
|
||||
|
||||
/* Swap dirty bitmaps */
|
||||
spin_lock_irqsave(&cmd->bitmap_lock, flags);
|
||||
spin_lock_irq(&cmd->bitmap_lock);
|
||||
cmd->current_dmap = next_dmap;
|
||||
spin_unlock_irqrestore(&cmd->bitmap_lock, flags);
|
||||
spin_unlock_irq(&cmd->bitmap_lock);
|
||||
|
||||
/* Set old dirty bitmap as currently committing */
|
||||
cmd->committing_dmap = dmap;
|
||||
|
|
@ -851,6 +850,12 @@ int dm_clone_set_region_hydrated(struct dm_clone_metadata *cmd, unsigned long re
|
|||
struct dirty_map *dmap;
|
||||
unsigned long word, flags;
|
||||
|
||||
if (unlikely(region_nr >= cmd->nr_regions)) {
|
||||
DMERR("Region %lu out of range (total number of regions %lu)",
|
||||
region_nr, cmd->nr_regions);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
word = region_nr / BITS_PER_LONG;
|
||||
|
||||
spin_lock_irqsave(&cmd->bitmap_lock, flags);
|
||||
|
|
@ -878,9 +883,16 @@ int dm_clone_cond_set_range(struct dm_clone_metadata *cmd, unsigned long start,
|
|||
{
|
||||
int r = 0;
|
||||
struct dirty_map *dmap;
|
||||
unsigned long word, region_nr, flags;
|
||||
unsigned long word, region_nr;
|
||||
|
||||
spin_lock_irqsave(&cmd->bitmap_lock, flags);
|
||||
if (unlikely(start >= cmd->nr_regions || (start + nr_regions) < start ||
|
||||
(start + nr_regions) > cmd->nr_regions)) {
|
||||
DMERR("Invalid region range: start %lu, nr_regions %lu (total number of regions %lu)",
|
||||
start, nr_regions, cmd->nr_regions);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
spin_lock_irq(&cmd->bitmap_lock);
|
||||
|
||||
if (cmd->read_only) {
|
||||
r = -EPERM;
|
||||
|
|
@ -898,7 +910,7 @@ int dm_clone_cond_set_range(struct dm_clone_metadata *cmd, unsigned long start,
|
|||
}
|
||||
}
|
||||
out:
|
||||
spin_unlock_irqrestore(&cmd->bitmap_lock, flags);
|
||||
spin_unlock_irq(&cmd->bitmap_lock);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -965,13 +977,11 @@ out:
|
|||
|
||||
void dm_clone_metadata_set_read_only(struct dm_clone_metadata *cmd)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
down_write(&cmd->lock);
|
||||
|
||||
spin_lock_irqsave(&cmd->bitmap_lock, flags);
|
||||
spin_lock_irq(&cmd->bitmap_lock);
|
||||
cmd->read_only = 1;
|
||||
spin_unlock_irqrestore(&cmd->bitmap_lock, flags);
|
||||
spin_unlock_irq(&cmd->bitmap_lock);
|
||||
|
||||
if (!cmd->fail_io)
|
||||
dm_bm_set_read_only(cmd->bm);
|
||||
|
|
@ -981,13 +991,11 @@ void dm_clone_metadata_set_read_only(struct dm_clone_metadata *cmd)
|
|||
|
||||
void dm_clone_metadata_set_read_write(struct dm_clone_metadata *cmd)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
down_write(&cmd->lock);
|
||||
|
||||
spin_lock_irqsave(&cmd->bitmap_lock, flags);
|
||||
spin_lock_irq(&cmd->bitmap_lock);
|
||||
cmd->read_only = 0;
|
||||
spin_unlock_irqrestore(&cmd->bitmap_lock, flags);
|
||||
spin_unlock_irq(&cmd->bitmap_lock);
|
||||
|
||||
if (!cmd->fail_io)
|
||||
dm_bm_set_read_write(cmd->bm);
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@ int dm_clone_set_region_hydrated(struct dm_clone_metadata *cmd, unsigned long re
|
|||
* @start: Starting region number
|
||||
* @nr_regions: Number of regions in the range
|
||||
*
|
||||
* This function doesn't block, so it's safe to call it from interrupt context.
|
||||
* This function doesn't block, but since it uses spin_lock_irq()/spin_unlock_irq()
|
||||
* it's NOT safe to call it from any context where interrupts are disabled, e.g.,
|
||||
* from interrupt context.
|
||||
*/
|
||||
int dm_clone_cond_set_range(struct dm_clone_metadata *cmd, unsigned long start,
|
||||
unsigned long nr_regions);
|
||||
|
|
@ -154,7 +156,7 @@ bool dm_clone_is_range_hydrated(struct dm_clone_metadata *cmd,
|
|||
/*
|
||||
* Returns the number of hydrated regions.
|
||||
*/
|
||||
unsigned long dm_clone_nr_of_hydrated_regions(struct dm_clone_metadata *cmd);
|
||||
unsigned int dm_clone_nr_of_hydrated_regions(struct dm_clone_metadata *cmd);
|
||||
|
||||
/*
|
||||
* Returns the first unhydrated region with region_nr >= @start
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ static bool bio_triggers_commit(struct clone *clone, struct bio *bio)
|
|||
/* Get the address of the region in sectors */
|
||||
static inline sector_t region_to_sector(struct clone *clone, unsigned long region_nr)
|
||||
{
|
||||
return (region_nr << clone->region_shift);
|
||||
return ((sector_t)region_nr << clone->region_shift);
|
||||
}
|
||||
|
||||
/* Get the region number of the bio */
|
||||
|
|
@ -293,10 +293,17 @@ static inline unsigned long bio_to_region(struct clone *clone, struct bio *bio)
|
|||
|
||||
/* Get the region range covered by the bio */
|
||||
static void bio_region_range(struct clone *clone, struct bio *bio,
|
||||
unsigned long *rs, unsigned long *re)
|
||||
unsigned long *rs, unsigned long *nr_regions)
|
||||
{
|
||||
unsigned long end;
|
||||
|
||||
*rs = dm_sector_div_up(bio->bi_iter.bi_sector, clone->region_size);
|
||||
*re = bio_end_sector(bio) >> clone->region_shift;
|
||||
end = bio_end_sector(bio) >> clone->region_shift;
|
||||
|
||||
if (*rs >= end)
|
||||
*nr_regions = 0;
|
||||
else
|
||||
*nr_regions = end - *rs;
|
||||
}
|
||||
|
||||
/* Check whether a bio overwrites a region */
|
||||
|
|
@ -338,8 +345,6 @@ static void submit_bios(struct bio_list *bios)
|
|||
*/
|
||||
static void issue_bio(struct clone *clone, struct bio *bio)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!bio_triggers_commit(clone, bio)) {
|
||||
generic_make_request(bio);
|
||||
return;
|
||||
|
|
@ -358,9 +363,9 @@ static void issue_bio(struct clone *clone, struct bio *bio)
|
|||
* Batch together any bios that trigger commits and then issue a single
|
||||
* commit for them in process_deferred_flush_bios().
|
||||
*/
|
||||
spin_lock_irqsave(&clone->lock, flags);
|
||||
spin_lock_irq(&clone->lock);
|
||||
bio_list_add(&clone->deferred_flush_bios, bio);
|
||||
spin_unlock_irqrestore(&clone->lock, flags);
|
||||
spin_unlock_irq(&clone->lock);
|
||||
|
||||
wake_worker(clone);
|
||||
}
|
||||
|
|
@ -456,7 +461,7 @@ static void trim_bio(struct bio *bio, sector_t sector, unsigned int len)
|
|||
|
||||
static void complete_discard_bio(struct clone *clone, struct bio *bio, bool success)
|
||||
{
|
||||
unsigned long rs, re;
|
||||
unsigned long rs, nr_regions;
|
||||
|
||||
/*
|
||||
* If the destination device supports discards, remap and trim the
|
||||
|
|
@ -465,9 +470,9 @@ static void complete_discard_bio(struct clone *clone, struct bio *bio, bool succ
|
|||
*/
|
||||
if (test_bit(DM_CLONE_DISCARD_PASSDOWN, &clone->flags) && success) {
|
||||
remap_to_dest(clone, bio);
|
||||
bio_region_range(clone, bio, &rs, &re);
|
||||
trim_bio(bio, rs << clone->region_shift,
|
||||
(re - rs) << clone->region_shift);
|
||||
bio_region_range(clone, bio, &rs, &nr_regions);
|
||||
trim_bio(bio, region_to_sector(clone, rs),
|
||||
nr_regions << clone->region_shift);
|
||||
generic_make_request(bio);
|
||||
} else
|
||||
bio_endio(bio);
|
||||
|
|
@ -475,12 +480,21 @@ static void complete_discard_bio(struct clone *clone, struct bio *bio, bool succ
|
|||
|
||||
static void process_discard_bio(struct clone *clone, struct bio *bio)
|
||||
{
|
||||
unsigned long rs, re, flags;
|
||||
unsigned long rs, nr_regions;
|
||||
|
||||
bio_region_range(clone, bio, &rs, &re);
|
||||
BUG_ON(re > clone->nr_regions);
|
||||
bio_region_range(clone, bio, &rs, &nr_regions);
|
||||
if (!nr_regions) {
|
||||
bio_endio(bio);
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(rs == re)) {
|
||||
if (WARN_ON(rs >= clone->nr_regions || (rs + nr_regions) < rs ||
|
||||
(rs + nr_regions) > clone->nr_regions)) {
|
||||
DMERR("%s: Invalid range (%lu + %lu, total regions %lu) for discard (%llu + %u)",
|
||||
clone_device_name(clone), rs, nr_regions,
|
||||
clone->nr_regions,
|
||||
(unsigned long long)bio->bi_iter.bi_sector,
|
||||
bio_sectors(bio));
|
||||
bio_endio(bio);
|
||||
return;
|
||||
}
|
||||
|
|
@ -489,7 +503,7 @@ static void process_discard_bio(struct clone *clone, struct bio *bio)
|
|||
* The covered regions are already hydrated so we just need to pass
|
||||
* down the discard.
|
||||
*/
|
||||
if (dm_clone_is_range_hydrated(clone->cmd, rs, re - rs)) {
|
||||
if (dm_clone_is_range_hydrated(clone->cmd, rs, nr_regions)) {
|
||||
complete_discard_bio(clone, bio, true);
|
||||
return;
|
||||
}
|
||||
|
|
@ -507,9 +521,9 @@ static void process_discard_bio(struct clone *clone, struct bio *bio)
|
|||
/*
|
||||
* Defer discard processing.
|
||||
*/
|
||||
spin_lock_irqsave(&clone->lock, flags);
|
||||
spin_lock_irq(&clone->lock);
|
||||
bio_list_add(&clone->deferred_discard_bios, bio);
|
||||
spin_unlock_irqrestore(&clone->lock, flags);
|
||||
spin_unlock_irq(&clone->lock);
|
||||
|
||||
wake_worker(clone);
|
||||
}
|
||||
|
|
@ -784,11 +798,14 @@ static void hydration_copy(struct dm_clone_region_hydration *hd, unsigned int nr
|
|||
struct dm_io_region from, to;
|
||||
struct clone *clone = hd->clone;
|
||||
|
||||
if (WARN_ON(!nr_regions))
|
||||
return;
|
||||
|
||||
region_size = clone->region_size;
|
||||
region_start = hd->region_nr;
|
||||
region_end = region_start + nr_regions - 1;
|
||||
|
||||
total_size = (nr_regions - 1) << clone->region_shift;
|
||||
total_size = region_to_sector(clone, nr_regions - 1);
|
||||
|
||||
if (region_end == clone->nr_regions - 1) {
|
||||
/*
|
||||
|
|
@ -1167,13 +1184,13 @@ static void process_deferred_discards(struct clone *clone)
|
|||
int r = -EPERM;
|
||||
struct bio *bio;
|
||||
struct blk_plug plug;
|
||||
unsigned long rs, re, flags;
|
||||
unsigned long rs, nr_regions;
|
||||
struct bio_list discards = BIO_EMPTY_LIST;
|
||||
|
||||
spin_lock_irqsave(&clone->lock, flags);
|
||||
spin_lock_irq(&clone->lock);
|
||||
bio_list_merge(&discards, &clone->deferred_discard_bios);
|
||||
bio_list_init(&clone->deferred_discard_bios);
|
||||
spin_unlock_irqrestore(&clone->lock, flags);
|
||||
spin_unlock_irq(&clone->lock);
|
||||
|
||||
if (bio_list_empty(&discards))
|
||||
return;
|
||||
|
|
@ -1183,14 +1200,13 @@ static void process_deferred_discards(struct clone *clone)
|
|||
|
||||
/* Update the metadata */
|
||||
bio_list_for_each(bio, &discards) {
|
||||
bio_region_range(clone, bio, &rs, &re);
|
||||
bio_region_range(clone, bio, &rs, &nr_regions);
|
||||
/*
|
||||
* A discard request might cover regions that have been already
|
||||
* hydrated. There is no need to update the metadata for these
|
||||
* regions.
|
||||
*/
|
||||
r = dm_clone_cond_set_range(clone->cmd, rs, re - rs);
|
||||
|
||||
r = dm_clone_cond_set_range(clone->cmd, rs, nr_regions);
|
||||
if (unlikely(r))
|
||||
break;
|
||||
}
|
||||
|
|
@ -1203,13 +1219,12 @@ out:
|
|||
|
||||
static void process_deferred_bios(struct clone *clone)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct bio_list bios = BIO_EMPTY_LIST;
|
||||
|
||||
spin_lock_irqsave(&clone->lock, flags);
|
||||
spin_lock_irq(&clone->lock);
|
||||
bio_list_merge(&bios, &clone->deferred_bios);
|
||||
bio_list_init(&clone->deferred_bios);
|
||||
spin_unlock_irqrestore(&clone->lock, flags);
|
||||
spin_unlock_irq(&clone->lock);
|
||||
|
||||
if (bio_list_empty(&bios))
|
||||
return;
|
||||
|
|
@ -1220,7 +1235,6 @@ static void process_deferred_bios(struct clone *clone)
|
|||
static void process_deferred_flush_bios(struct clone *clone)
|
||||
{
|
||||
struct bio *bio;
|
||||
unsigned long flags;
|
||||
bool dest_dev_flushed;
|
||||
struct bio_list bios = BIO_EMPTY_LIST;
|
||||
struct bio_list bio_completions = BIO_EMPTY_LIST;
|
||||
|
|
@ -1229,13 +1243,13 @@ static void process_deferred_flush_bios(struct clone *clone)
|
|||
* If there are any deferred flush bios, we must commit the metadata
|
||||
* before issuing them or signaling their completion.
|
||||
*/
|
||||
spin_lock_irqsave(&clone->lock, flags);
|
||||
spin_lock_irq(&clone->lock);
|
||||
bio_list_merge(&bios, &clone->deferred_flush_bios);
|
||||
bio_list_init(&clone->deferred_flush_bios);
|
||||
|
||||
bio_list_merge(&bio_completions, &clone->deferred_flush_completions);
|
||||
bio_list_init(&clone->deferred_flush_completions);
|
||||
spin_unlock_irqrestore(&clone->lock, flags);
|
||||
spin_unlock_irq(&clone->lock);
|
||||
|
||||
if (bio_list_empty(&bios) && bio_list_empty(&bio_completions) &&
|
||||
!(dm_clone_changed_this_transaction(clone->cmd) && need_commit_due_to_time(clone)))
|
||||
|
|
@ -1455,7 +1469,7 @@ static void clone_status(struct dm_target *ti, status_type_t type,
|
|||
goto error;
|
||||
}
|
||||
|
||||
DMEMIT("%u %llu/%llu %llu %lu/%lu %u ",
|
||||
DMEMIT("%u %llu/%llu %llu %u/%lu %u ",
|
||||
DM_CLONE_METADATA_BLOCK_SIZE,
|
||||
(unsigned long long)(nr_metadata_blocks - nr_free_metadata_blocks),
|
||||
(unsigned long long)nr_metadata_blocks,
|
||||
|
|
@ -1775,6 +1789,7 @@ error:
|
|||
static int clone_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
||||
{
|
||||
int r;
|
||||
sector_t nr_regions;
|
||||
struct clone *clone;
|
||||
struct dm_arg_set as;
|
||||
|
||||
|
|
@ -1816,7 +1831,16 @@ static int clone_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
|||
goto out_with_source_dev;
|
||||
|
||||
clone->region_shift = __ffs(clone->region_size);
|
||||
clone->nr_regions = dm_sector_div_up(ti->len, clone->region_size);
|
||||
nr_regions = dm_sector_div_up(ti->len, clone->region_size);
|
||||
|
||||
/* Check for overflow */
|
||||
if (nr_regions != (unsigned long)nr_regions) {
|
||||
ti->error = "Too many regions. Consider increasing the region size";
|
||||
r = -EOVERFLOW;
|
||||
goto out_with_source_dev;
|
||||
}
|
||||
|
||||
clone->nr_regions = nr_regions;
|
||||
|
||||
r = validate_nr_regions(clone->nr_regions, &ti->error);
|
||||
if (r)
|
||||
|
|
|
|||
|
|
@ -1514,7 +1514,7 @@ static void integrity_metadata(struct work_struct *w)
|
|||
struct bio *bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io));
|
||||
char *checksums;
|
||||
unsigned extra_space = unlikely(digest_size > ic->tag_size) ? digest_size - ic->tag_size : 0;
|
||||
char checksums_onstack[HASH_MAX_DIGESTSIZE];
|
||||
char checksums_onstack[max((size_t)HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
|
||||
unsigned sectors_to_process = dio->range.n_sectors;
|
||||
sector_t sector = dio->range.logical_sector;
|
||||
|
||||
|
|
@ -1743,7 +1743,7 @@ retry_kmap:
|
|||
} while (++s < ic->sectors_per_block);
|
||||
#ifdef INTERNAL_VERIFY
|
||||
if (ic->internal_hash) {
|
||||
char checksums_onstack[max(HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
|
||||
char checksums_onstack[max((size_t)HASH_MAX_DIGESTSIZE, MAX_TAG_SIZE)];
|
||||
|
||||
integrity_sector_checksum(ic, logical_sector, mem + bv.bv_offset, checksums_onstack);
|
||||
if (unlikely(memcmp(checksums_onstack, journal_entry_tag(ic, je), ic->tag_size))) {
|
||||
|
|
|
|||
|
|
@ -551,6 +551,7 @@ void verity_fec_dtr(struct dm_verity *v)
|
|||
mempool_exit(&f->rs_pool);
|
||||
mempool_exit(&f->prealloc_pool);
|
||||
mempool_exit(&f->extra_pool);
|
||||
mempool_exit(&f->output_pool);
|
||||
kmem_cache_destroy(f->cache);
|
||||
|
||||
if (f->data_bufio)
|
||||
|
|
|
|||
|
|
@ -872,6 +872,7 @@ static int writecache_alloc_entries(struct dm_writecache *wc)
|
|||
struct wc_entry *e = &wc->entries[b];
|
||||
e->index = b;
|
||||
e->write_in_progress = false;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -926,6 +927,7 @@ static void writecache_resume(struct dm_target *ti)
|
|||
e->original_sector = le64_to_cpu(wme.original_sector);
|
||||
e->seq_count = le64_to_cpu(wme.seq_count);
|
||||
}
|
||||
cond_resched();
|
||||
}
|
||||
#endif
|
||||
for (b = 0; b < wc->n_blocks; b++) {
|
||||
|
|
@ -1770,8 +1772,10 @@ static int init_memory(struct dm_writecache *wc)
|
|||
pmem_assign(sb(wc)->n_blocks, cpu_to_le64(wc->n_blocks));
|
||||
pmem_assign(sb(wc)->seq_count, cpu_to_le64(0));
|
||||
|
||||
for (b = 0; b < wc->n_blocks; b++)
|
||||
for (b = 0; b < wc->n_blocks; b++) {
|
||||
write_original_sector_seq_count(wc, &wc->entries[b], -1, -1);
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
writecache_flush_all_metadata(wc);
|
||||
writecache_commit_flushed(wc, false);
|
||||
|
|
|
|||
|
|
@ -1109,7 +1109,6 @@ static int dmz_init_zone(struct blk_zone *blkz, unsigned int idx, void *data)
|
|||
switch (blkz->type) {
|
||||
case BLK_ZONE_TYPE_CONVENTIONAL:
|
||||
set_bit(DMZ_RND, &zone->flags);
|
||||
zmd->nr_rnd_zones++;
|
||||
break;
|
||||
case BLK_ZONE_TYPE_SEQWRITE_REQ:
|
||||
case BLK_ZONE_TYPE_SEQWRITE_PREF:
|
||||
|
|
|
|||
|
|
@ -6040,7 +6040,7 @@ EXPORT_SYMBOL_GPL(md_stop_writes);
|
|||
static void mddev_detach(struct mddev *mddev)
|
||||
{
|
||||
md_bitmap_wait_behind_writes(mddev);
|
||||
if (mddev->pers && mddev->pers->quiesce) {
|
||||
if (mddev->pers && mddev->pers->quiesce && !mddev->suspended) {
|
||||
mddev->pers->quiesce(mddev, 1);
|
||||
mddev->pers->quiesce(mddev, 0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue