mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
Merge 5.10.22 into android12-5.10
Changes in 5.10.22 ALSA: hda/realtek: Enable headset mic of Acer SWIFT with ALC256 ALSA: usb-audio: use Corsair Virtuoso mapping for Corsair Virtuoso SE ALSA: usb-audio: Drop bogus dB range in too low level tpm, tpm_tis: Decorate tpm_tis_gen_interrupt() with request_locality() tpm, tpm_tis: Decorate tpm_get_timeouts() with request_locality() btrfs: avoid double put of block group when emptying cluster btrfs: fix raid6 qstripe kmap btrfs: fix race between writes to swap files and scrub btrfs: fix race between swap file activation and snapshot creation btrfs: fix stale data exposure after cloning a hole with NO_HOLES enabled btrfs: fix race between extent freeing/allocation when using bitmaps btrfs: validate qgroup inherit for SNAP_CREATE_V2 ioctl btrfs: free correct amount of space in btrfs_delayed_inode_reserve_metadata btrfs: unlock extents in btrfs_zero_range in case of quota reservation errors btrfs: fix warning when creating a directory with smack enabled PM: runtime: Update device status before letting suppliers suspend ring-buffer: Force before_stamp and write_stamp to be different on discard io_uring: ignore double poll add on the same waitqueue head dm bufio: subtract the number of initial sectors in dm_bufio_get_device_size dm verity: fix FEC for RS roots unaligned to block size drm/amdgpu:disable VCN for Navi12 SKU drm/amdgpu: fix parameter error of RREG32_PCIE() in amdgpu_regs_pcie crypto - shash: reduce minimum alignment of shash_desc structure arm64: mm: Move reserve_crashkernel() into mem_init() arm64: mm: Move zone_dma_bits initialization into zone_sizes_init() of/address: Introduce of_dma_get_max_cpu_address() of: unittest: Add test for of_dma_get_max_cpu_address() arm64: mm: Set ZONE_DMA size based on devicetree's dma-ranges arm64: mm: Set ZONE_DMA size based on early IORT scan mm: Remove examples from enum zone_type comment ALSA: ctxfi: cthw20k2: fix mask on conf to allow 4 bits RDMA/cm: Fix IRQ restore in ib_send_cm_sidr_rep RDMA/rxe: Fix missing kconfig dependency on CRYPTO IB/mlx5: Add missing error code ALSA: hda: intel-nhlt: verify config type ftrace: Have recordmcount use w8 to read relp->r_info in arm64_is_fake_mcount rsxx: Return -EFAULT if copy_to_user() fails iommu/vt-d: Fix status code for Allocate/Free PASID command Revert "arm64: dts: amlogic: add missing ethernet reset ID" of: unittest: Fix build on architectures without CONFIG_OF_ADDRESS tomoyo: recognize kernel threads correctly r8169: fix resuming from suspend on RTL8105e if machine runs on battery Linux 5.10.22 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I6adb109dd12fde9737f46fe7b496c94999e5c335
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 21
|
||||
SUBLEVEL = 22
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
|
||||
@@ -227,8 +227,6 @@
|
||||
"timing-adjustment";
|
||||
rx-fifo-depth = <4096>;
|
||||
tx-fifo-depth = <2048>;
|
||||
resets = <&reset RESET_ETHERNET>;
|
||||
reset-names = "stmmaceth";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -224,8 +224,6 @@
|
||||
"timing-adjustment";
|
||||
rx-fifo-depth = <4096>;
|
||||
tx-fifo-depth = <2048>;
|
||||
resets = <&reset RESET_ETHERNET>;
|
||||
reset-names = "stmmaceth";
|
||||
status = "disabled";
|
||||
|
||||
mdio0: mdio {
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/meson-gxbb-power.h>
|
||||
#include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
|
||||
/ {
|
||||
@@ -576,8 +575,6 @@
|
||||
interrupt-names = "macirq";
|
||||
rx-fifo-depth = <4096>;
|
||||
tx-fifo-depth = <2048>;
|
||||
resets = <&reset RESET_ETHERNET>;
|
||||
reset-names = "stmmaceth";
|
||||
power-domains = <&pwrc PWRC_GXBB_ETHERNET_MEM_ID>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/acpi_iort.h>
|
||||
|
||||
#include <asm/boot.h>
|
||||
#include <asm/fixmap.h>
|
||||
@@ -42,8 +43,6 @@
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/alternative.h>
|
||||
|
||||
#define ARM64_ZONE_DMA_BITS 30
|
||||
|
||||
/*
|
||||
* We need to be able to catch inadvertent references to memstart_addr
|
||||
* that occur (potentially in generic code) before arm64_memblock_init()
|
||||
@@ -188,8 +187,14 @@ static phys_addr_t __init max_zone_phys(unsigned int zone_bits)
|
||||
static void __init zone_sizes_init(unsigned long min, unsigned long max)
|
||||
{
|
||||
unsigned long max_zone_pfns[MAX_NR_ZONES] = {0};
|
||||
unsigned int __maybe_unused acpi_zone_dma_bits;
|
||||
unsigned int __maybe_unused dt_zone_dma_bits;
|
||||
|
||||
#ifdef CONFIG_ZONE_DMA
|
||||
acpi_zone_dma_bits = fls64(acpi_iort_dma_get_max_cpu_address());
|
||||
dt_zone_dma_bits = fls64(of_dma_get_max_cpu_address(NULL));
|
||||
zone_dma_bits = min3(32U, dt_zone_dma_bits, acpi_zone_dma_bits);
|
||||
arm64_dma_phys_limit = max_zone_phys(zone_dma_bits);
|
||||
max_zone_pfns[ZONE_DMA] = PFN_DOWN(arm64_dma_phys_limit);
|
||||
#endif
|
||||
#ifdef CONFIG_ZONE_DMA32
|
||||
@@ -379,18 +384,11 @@ void __init arm64_memblock_init(void)
|
||||
|
||||
early_init_fdt_scan_reserved_mem();
|
||||
|
||||
if (IS_ENABLED(CONFIG_ZONE_DMA)) {
|
||||
zone_dma_bits = ARM64_ZONE_DMA_BITS;
|
||||
arm64_dma_phys_limit = max_zone_phys(ARM64_ZONE_DMA_BITS);
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_ZONE_DMA32))
|
||||
arm64_dma32_phys_limit = max_zone_phys(32);
|
||||
else
|
||||
arm64_dma32_phys_limit = PHYS_MASK + 1;
|
||||
|
||||
reserve_crashkernel();
|
||||
|
||||
reserve_elfcorehdr();
|
||||
|
||||
high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
|
||||
@@ -430,6 +428,12 @@ void __init bootmem_init(void)
|
||||
sparse_init();
|
||||
zone_sizes_init(min, max);
|
||||
|
||||
/*
|
||||
* request_standard_resources() depends on crashkernel's memory being
|
||||
* reserved, so do it here.
|
||||
*/
|
||||
reserve_crashkernel();
|
||||
|
||||
memblock_dump_all();
|
||||
}
|
||||
|
||||
|
||||
@@ -1730,3 +1730,58 @@ void __init acpi_iort_init(void)
|
||||
|
||||
iort_init_platform_devices();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ZONE_DMA
|
||||
/*
|
||||
* Extract the highest CPU physical address accessible to all DMA masters in
|
||||
* the system. PHYS_ADDR_MAX is returned when no constrained device is found.
|
||||
*/
|
||||
phys_addr_t __init acpi_iort_dma_get_max_cpu_address(void)
|
||||
{
|
||||
phys_addr_t limit = PHYS_ADDR_MAX;
|
||||
struct acpi_iort_node *node, *end;
|
||||
struct acpi_table_iort *iort;
|
||||
acpi_status status;
|
||||
int i;
|
||||
|
||||
if (acpi_disabled)
|
||||
return limit;
|
||||
|
||||
status = acpi_get_table(ACPI_SIG_IORT, 0,
|
||||
(struct acpi_table_header **)&iort);
|
||||
if (ACPI_FAILURE(status))
|
||||
return limit;
|
||||
|
||||
node = ACPI_ADD_PTR(struct acpi_iort_node, iort, iort->node_offset);
|
||||
end = ACPI_ADD_PTR(struct acpi_iort_node, iort, iort->header.length);
|
||||
|
||||
for (i = 0; i < iort->node_count; i++) {
|
||||
if (node >= end)
|
||||
break;
|
||||
|
||||
switch (node->type) {
|
||||
struct acpi_iort_named_component *ncomp;
|
||||
struct acpi_iort_root_complex *rc;
|
||||
phys_addr_t local_limit;
|
||||
|
||||
case ACPI_IORT_NODE_NAMED_COMPONENT:
|
||||
ncomp = (struct acpi_iort_named_component *)node->node_data;
|
||||
local_limit = DMA_BIT_MASK(ncomp->memory_address_limit);
|
||||
limit = min_not_zero(limit, local_limit);
|
||||
break;
|
||||
|
||||
case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
|
||||
if (node->revision < 1)
|
||||
break;
|
||||
|
||||
rc = (struct acpi_iort_root_complex *)node->node_data;
|
||||
local_limit = DMA_BIT_MASK(rc->memory_address_limit);
|
||||
limit = min_not_zero(limit, local_limit);
|
||||
break;
|
||||
}
|
||||
node = ACPI_ADD_PTR(struct acpi_iort_node, node, node->length);
|
||||
}
|
||||
acpi_put_table(&iort->header);
|
||||
return limit;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -325,22 +325,22 @@ static void rpm_put_suppliers(struct device *dev)
|
||||
static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
|
||||
__releases(&dev->power.lock) __acquires(&dev->power.lock)
|
||||
{
|
||||
int retval, idx;
|
||||
bool use_links = dev->power.links_count > 0;
|
||||
bool get = false;
|
||||
int retval, idx;
|
||||
bool put;
|
||||
|
||||
if (dev->power.irq_safe) {
|
||||
spin_unlock(&dev->power.lock);
|
||||
} else if (!use_links) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
} else {
|
||||
get = dev->power.runtime_status == RPM_RESUMING;
|
||||
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
/*
|
||||
* Resume suppliers if necessary.
|
||||
*
|
||||
* The device's runtime PM status cannot change until this
|
||||
* routine returns, so it is safe to read the status outside of
|
||||
* the lock.
|
||||
*/
|
||||
if (use_links && dev->power.runtime_status == RPM_RESUMING) {
|
||||
/* Resume suppliers if necessary. */
|
||||
if (get) {
|
||||
idx = device_links_read_lock();
|
||||
|
||||
retval = rpm_get_suppliers(dev);
|
||||
@@ -355,24 +355,36 @@ static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
|
||||
|
||||
if (dev->power.irq_safe) {
|
||||
spin_lock(&dev->power.lock);
|
||||
} else {
|
||||
/*
|
||||
* If the device is suspending and the callback has returned
|
||||
* success, drop the usage counters of the suppliers that have
|
||||
* been reference counted on its resume.
|
||||
*
|
||||
* Do that if resume fails too.
|
||||
*/
|
||||
if (use_links
|
||||
&& ((dev->power.runtime_status == RPM_SUSPENDING && !retval)
|
||||
|| (dev->power.runtime_status == RPM_RESUMING && retval))) {
|
||||
idx = device_links_read_lock();
|
||||
return retval;
|
||||
}
|
||||
|
||||
fail:
|
||||
rpm_put_suppliers(dev);
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
|
||||
device_links_read_unlock(idx);
|
||||
}
|
||||
if (!use_links)
|
||||
return retval;
|
||||
|
||||
/*
|
||||
* If the device is suspending and the callback has returned success,
|
||||
* drop the usage counters of the suppliers that have been reference
|
||||
* counted on its resume.
|
||||
*
|
||||
* Do that if the resume fails too.
|
||||
*/
|
||||
put = dev->power.runtime_status == RPM_SUSPENDING && !retval;
|
||||
if (put)
|
||||
__update_runtime_status(dev, RPM_SUSPENDED);
|
||||
else
|
||||
put = get && retval;
|
||||
|
||||
if (put) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
idx = device_links_read_lock();
|
||||
|
||||
fail:
|
||||
rpm_put_suppliers(dev);
|
||||
|
||||
device_links_read_unlock(idx);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
}
|
||||
|
||||
@@ -165,15 +165,17 @@ static ssize_t rsxx_cram_read(struct file *fp, char __user *ubuf,
|
||||
{
|
||||
struct rsxx_cardinfo *card = file_inode(fp)->i_private;
|
||||
char *buf;
|
||||
ssize_t st;
|
||||
int st;
|
||||
|
||||
buf = kzalloc(cnt, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
st = rsxx_creg_read(card, CREG_ADD_CRAM + (u32)*ppos, cnt, buf, 1);
|
||||
if (!st)
|
||||
st = copy_to_user(ubuf, buf, cnt);
|
||||
if (!st) {
|
||||
if (copy_to_user(ubuf, buf, cnt))
|
||||
st = -EFAULT;
|
||||
}
|
||||
kfree(buf);
|
||||
if (st)
|
||||
return st;
|
||||
|
||||
@@ -707,12 +707,22 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
|
||||
const char *desc = "attempting to generate an interrupt";
|
||||
u32 cap2;
|
||||
cap_t cap;
|
||||
int ret;
|
||||
|
||||
/* TPM 2.0 */
|
||||
if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
||||
return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
|
||||
else
|
||||
return tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc,
|
||||
0);
|
||||
|
||||
/* TPM 1.2 */
|
||||
ret = request_locality(chip, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
|
||||
|
||||
release_locality(chip, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Register the IRQ and issue a command that will cause an interrupt. If an
|
||||
@@ -1019,11 +1029,21 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
|
||||
init_waitqueue_head(&priv->read_queue);
|
||||
init_waitqueue_head(&priv->int_queue);
|
||||
if (irq != -1) {
|
||||
/* Before doing irq testing issue a command to the TPM in polling mode
|
||||
/*
|
||||
* Before doing irq testing issue a command to the TPM in polling mode
|
||||
* to make sure it works. May as well use that command to set the
|
||||
* proper timeouts for the driver.
|
||||
*/
|
||||
if (tpm_get_timeouts(chip)) {
|
||||
|
||||
rc = request_locality(chip, 0);
|
||||
if (rc < 0)
|
||||
goto out_err;
|
||||
|
||||
rc = tpm_get_timeouts(chip);
|
||||
|
||||
release_locality(chip, 0);
|
||||
|
||||
if (rc) {
|
||||
dev_err(dev, "Could not get TPM timeouts and durations\n");
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
|
||||
@@ -355,7 +355,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
value = RREG32_PCIE(*pos >> 2);
|
||||
value = RREG32_PCIE(*pos);
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r) {
|
||||
pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
|
||||
@@ -422,7 +422,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
|
||||
return r;
|
||||
}
|
||||
|
||||
WREG32_PCIE(*pos >> 2, value);
|
||||
WREG32_PCIE(*pos, value);
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
|
||||
@@ -459,7 +459,8 @@ static bool nv_is_headless_sku(struct pci_dev *pdev)
|
||||
{
|
||||
if ((pdev->device == 0x731E &&
|
||||
(pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
|
||||
(pdev->device == 0x7340 && pdev->revision == 0xC9))
|
||||
(pdev->device == 0x7340 && pdev->revision == 0xC9) ||
|
||||
(pdev->device == 0x7360 && pdev->revision == 0xC7))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -524,7 +525,8 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
|
||||
!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
|
||||
if (!nv_is_headless_sku(adev->pdev))
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
|
||||
break;
|
||||
|
||||
@@ -3650,6 +3650,7 @@ static int cm_send_sidr_rep_locked(struct cm_id_private *cm_id_priv,
|
||||
struct ib_cm_sidr_rep_param *param)
|
||||
{
|
||||
struct ib_mad_send_buf *msg;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&cm_id_priv->lock);
|
||||
@@ -3675,12 +3676,12 @@ static int cm_send_sidr_rep_locked(struct cm_id_private *cm_id_priv,
|
||||
return ret;
|
||||
}
|
||||
cm_id_priv->id.state = IB_CM_IDLE;
|
||||
spin_lock_irq(&cm.lock);
|
||||
spin_lock_irqsave(&cm.lock, flags);
|
||||
if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) {
|
||||
rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
|
||||
RB_CLEAR_NODE(&cm_id_priv->sidr_id_node);
|
||||
}
|
||||
spin_unlock_irq(&cm.lock);
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1973,8 +1973,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_SUBSCRIBE_EVENT)(
|
||||
|
||||
num_alloc_xa_entries++;
|
||||
event_sub = kzalloc(sizeof(*event_sub), GFP_KERNEL);
|
||||
if (!event_sub)
|
||||
if (!event_sub) {
|
||||
err = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
list_add_tail(&event_sub->event_list, &sub_list);
|
||||
uverbs_uobject_get(&ev_file->uobj);
|
||||
|
||||
@@ -4,6 +4,7 @@ config RDMA_RXE
|
||||
depends on INET && PCI && INFINIBAND
|
||||
depends on INFINIBAND_VIRT_DMA
|
||||
select NET_UDP_TUNNEL
|
||||
select CRYPTO
|
||||
select CRYPTO_CRC32
|
||||
help
|
||||
This driver implements the InfiniBand RDMA transport over
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
#define VCMD_VRSP_IP 0x1
|
||||
#define VCMD_VRSP_SC(e) (((e) >> 1) & 0x3)
|
||||
#define VCMD_VRSP_SC_SUCCESS 0
|
||||
#define VCMD_VRSP_SC_NO_PASID_AVAIL 1
|
||||
#define VCMD_VRSP_SC_INVALID_PASID 1
|
||||
#define VCMD_VRSP_SC_NO_PASID_AVAIL 2
|
||||
#define VCMD_VRSP_SC_INVALID_PASID 2
|
||||
#define VCMD_VRSP_RESULT_PASID(e) (((e) >> 8) & 0xfffff)
|
||||
#define VCMD_CMD_OPERAND(e) ((e) << 8)
|
||||
/*
|
||||
|
||||
@@ -1526,6 +1526,10 @@ EXPORT_SYMBOL_GPL(dm_bufio_get_block_size);
|
||||
sector_t dm_bufio_get_device_size(struct dm_bufio_client *c)
|
||||
{
|
||||
sector_t s = i_size_read(c->bdev->bd_inode) >> SECTOR_SHIFT;
|
||||
if (s >= c->start)
|
||||
s -= c->start;
|
||||
else
|
||||
s = 0;
|
||||
if (likely(c->sectors_per_block_bits >= 0))
|
||||
s >>= c->sectors_per_block_bits;
|
||||
else
|
||||
|
||||
@@ -61,19 +61,18 @@ static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio,
|
||||
static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index,
|
||||
unsigned *offset, struct dm_buffer **buf)
|
||||
{
|
||||
u64 position, block;
|
||||
u64 position, block, rem;
|
||||
u8 *res;
|
||||
|
||||
position = (index + rsb) * v->fec->roots;
|
||||
block = position >> v->data_dev_block_bits;
|
||||
*offset = (unsigned)(position - (block << v->data_dev_block_bits));
|
||||
block = div64_u64_rem(position, v->fec->roots << SECTOR_SHIFT, &rem);
|
||||
*offset = (unsigned)rem;
|
||||
|
||||
res = dm_bufio_read(v->fec->bufio, v->fec->start + block, buf);
|
||||
res = dm_bufio_read(v->fec->bufio, block, buf);
|
||||
if (IS_ERR(res)) {
|
||||
DMERR("%s: FEC %llu: parity read failed (block %llu): %ld",
|
||||
v->data_dev->name, (unsigned long long)rsb,
|
||||
(unsigned long long)(v->fec->start + block),
|
||||
PTR_ERR(res));
|
||||
(unsigned long long)block, PTR_ERR(res));
|
||||
*buf = NULL;
|
||||
}
|
||||
|
||||
@@ -155,7 +154,7 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio,
|
||||
|
||||
/* read the next block when we run out of parity bytes */
|
||||
offset += v->fec->roots;
|
||||
if (offset >= 1 << v->data_dev_block_bits) {
|
||||
if (offset >= v->fec->roots << SECTOR_SHIFT) {
|
||||
dm_bufio_release(buf);
|
||||
|
||||
par = fec_read_parity(v, rsb, block_offset, &offset, &buf);
|
||||
@@ -674,7 +673,7 @@ int verity_fec_ctr(struct dm_verity *v)
|
||||
{
|
||||
struct dm_verity_fec *f = v->fec;
|
||||
struct dm_target *ti = v->ti;
|
||||
u64 hash_blocks;
|
||||
u64 hash_blocks, fec_blocks;
|
||||
int ret;
|
||||
|
||||
if (!verity_fec_is_enabled(v)) {
|
||||
@@ -744,15 +743,17 @@ int verity_fec_ctr(struct dm_verity *v)
|
||||
}
|
||||
|
||||
f->bufio = dm_bufio_client_create(f->dev->bdev,
|
||||
1 << v->data_dev_block_bits,
|
||||
f->roots << SECTOR_SHIFT,
|
||||
1, 0, NULL, NULL);
|
||||
if (IS_ERR(f->bufio)) {
|
||||
ti->error = "Cannot initialize FEC bufio client";
|
||||
return PTR_ERR(f->bufio);
|
||||
}
|
||||
|
||||
if (dm_bufio_get_device_size(f->bufio) <
|
||||
((f->start + f->rounds * f->roots) >> v->data_dev_block_bits)) {
|
||||
dm_bufio_set_sector_offset(f->bufio, f->start << (v->data_dev_block_bits - SECTOR_SHIFT));
|
||||
|
||||
fec_blocks = div64_u64(f->rounds * f->roots, v->fec->roots << SECTOR_SHIFT);
|
||||
if (dm_bufio_get_device_size(f->bufio) < fec_blocks) {
|
||||
ti->error = "FEC device is too small";
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
@@ -2244,6 +2244,7 @@ static void rtl_pll_power_down(struct rtl8169_private *tp)
|
||||
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
|
||||
case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
|
||||
case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33:
|
||||
case RTL_GIGA_MAC_VER_37:
|
||||
case RTL_GIGA_MAC_VER_39:
|
||||
@@ -2271,6 +2272,7 @@ static void rtl_pll_power_up(struct rtl8169_private *tp)
|
||||
{
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
|
||||
case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
|
||||
case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33:
|
||||
case RTL_GIGA_MAC_VER_37:
|
||||
case RTL_GIGA_MAC_VER_39:
|
||||
|
||||
@@ -1024,6 +1024,48 @@ out:
|
||||
}
|
||||
#endif /* CONFIG_HAS_DMA */
|
||||
|
||||
/**
|
||||
* of_dma_get_max_cpu_address - Gets highest CPU address suitable for DMA
|
||||
* @np: The node to start searching from or NULL to start from the root
|
||||
*
|
||||
* Gets the highest CPU physical address that is addressable by all DMA masters
|
||||
* in the sub-tree pointed by np, or the whole tree if NULL is passed. If no
|
||||
* DMA constrained device is found, it returns PHYS_ADDR_MAX.
|
||||
*/
|
||||
phys_addr_t __init of_dma_get_max_cpu_address(struct device_node *np)
|
||||
{
|
||||
phys_addr_t max_cpu_addr = PHYS_ADDR_MAX;
|
||||
struct of_range_parser parser;
|
||||
phys_addr_t subtree_max_addr;
|
||||
struct device_node *child;
|
||||
struct of_range range;
|
||||
const __be32 *ranges;
|
||||
u64 cpu_end = 0;
|
||||
int len;
|
||||
|
||||
if (!np)
|
||||
np = of_root;
|
||||
|
||||
ranges = of_get_property(np, "dma-ranges", &len);
|
||||
if (ranges && len) {
|
||||
of_dma_range_parser_init(&parser, np);
|
||||
for_each_of_range(&parser, &range)
|
||||
if (range.cpu_addr + range.size > cpu_end)
|
||||
cpu_end = range.cpu_addr + range.size - 1;
|
||||
|
||||
if (max_cpu_addr > cpu_end)
|
||||
max_cpu_addr = cpu_end;
|
||||
}
|
||||
|
||||
for_each_available_child_of_node(np, child) {
|
||||
subtree_max_addr = of_dma_get_max_cpu_address(child);
|
||||
if (max_cpu_addr > subtree_max_addr)
|
||||
max_cpu_addr = subtree_max_addr;
|
||||
}
|
||||
|
||||
return max_cpu_addr;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_dma_is_coherent - Check if device is coherent
|
||||
* @np: device node
|
||||
|
||||
@@ -869,6 +869,26 @@ static void __init of_unittest_changeset(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init of_unittest_dma_get_max_cpu_address(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
phys_addr_t cpu_addr;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_OF_ADDRESS))
|
||||
return;
|
||||
|
||||
np = of_find_node_by_path("/testcase-data/address-tests");
|
||||
if (!np) {
|
||||
pr_err("missing testcase data\n");
|
||||
return;
|
||||
}
|
||||
|
||||
cpu_addr = of_dma_get_max_cpu_address(np);
|
||||
unittest(cpu_addr == 0x4fffffff,
|
||||
"of_dma_get_max_cpu_address: wrong CPU addr %pad (expecting %x)\n",
|
||||
&cpu_addr, 0x4fffffff);
|
||||
}
|
||||
|
||||
static void __init of_unittest_dma_ranges_one(const char *path,
|
||||
u64 expect_dma_addr, u64 expect_paddr)
|
||||
{
|
||||
@@ -3266,6 +3286,7 @@ static int __init of_unittest(void)
|
||||
of_unittest_changeset();
|
||||
of_unittest_parse_interrupts();
|
||||
of_unittest_parse_interrupts_extended();
|
||||
of_unittest_dma_get_max_cpu_address();
|
||||
of_unittest_parse_dma_ranges();
|
||||
of_unittest_pci_dma_ranges();
|
||||
of_unittest_match_node();
|
||||
|
||||
@@ -1229,6 +1229,11 @@ static int inc_block_group_ro(struct btrfs_block_group *cache, int force)
|
||||
spin_lock(&sinfo->lock);
|
||||
spin_lock(&cache->lock);
|
||||
|
||||
if (cache->swap_extents) {
|
||||
ret = -ETXTBSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cache->ro) {
|
||||
cache->ro++;
|
||||
ret = 0;
|
||||
@@ -2274,7 +2279,7 @@ again:
|
||||
}
|
||||
|
||||
ret = inc_block_group_ro(cache, 0);
|
||||
if (!do_chunk_alloc)
|
||||
if (!do_chunk_alloc || ret == -ETXTBSY)
|
||||
goto unlock_out;
|
||||
if (!ret)
|
||||
goto out;
|
||||
@@ -2283,6 +2288,8 @@ again:
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = inc_block_group_ro(cache, 0);
|
||||
if (ret == -ETXTBSY)
|
||||
goto unlock_out;
|
||||
out:
|
||||
if (cache->flags & BTRFS_BLOCK_GROUP_SYSTEM) {
|
||||
alloc_flags = btrfs_get_alloc_profile(fs_info, cache->flags);
|
||||
@@ -3363,6 +3370,7 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
|
||||
ASSERT(list_empty(&block_group->io_list));
|
||||
ASSERT(list_empty(&block_group->bg_list));
|
||||
ASSERT(refcount_read(&block_group->refs) == 1);
|
||||
ASSERT(block_group->swap_extents == 0);
|
||||
btrfs_put_block_group(block_group);
|
||||
|
||||
spin_lock(&info->block_group_cache_lock);
|
||||
@@ -3429,3 +3437,26 @@ void btrfs_unfreeze_block_group(struct btrfs_block_group *block_group)
|
||||
__btrfs_remove_free_space_cache(block_group->free_space_ctl);
|
||||
}
|
||||
}
|
||||
|
||||
bool btrfs_inc_block_group_swap_extents(struct btrfs_block_group *bg)
|
||||
{
|
||||
bool ret = true;
|
||||
|
||||
spin_lock(&bg->lock);
|
||||
if (bg->ro)
|
||||
ret = false;
|
||||
else
|
||||
bg->swap_extents++;
|
||||
spin_unlock(&bg->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void btrfs_dec_block_group_swap_extents(struct btrfs_block_group *bg, int amount)
|
||||
{
|
||||
spin_lock(&bg->lock);
|
||||
ASSERT(!bg->ro);
|
||||
ASSERT(bg->swap_extents >= amount);
|
||||
bg->swap_extents -= amount;
|
||||
spin_unlock(&bg->lock);
|
||||
}
|
||||
|
||||
@@ -181,6 +181,12 @@ struct btrfs_block_group {
|
||||
*/
|
||||
int needs_free_space;
|
||||
|
||||
/*
|
||||
* Number of extents in this block group used for swap files.
|
||||
* All accesses protected by the spinlock 'lock'.
|
||||
*/
|
||||
int swap_extents;
|
||||
|
||||
/* Record locked full stripes for RAID5/6 block group */
|
||||
struct btrfs_full_stripe_locks_tree full_stripe_locks_root;
|
||||
};
|
||||
@@ -299,4 +305,7 @@ int btrfs_rmap_block(struct btrfs_fs_info *fs_info, u64 chunk_start,
|
||||
u64 physical, u64 **logical, int *naddrs, int *stripe_len);
|
||||
#endif
|
||||
|
||||
bool btrfs_inc_block_group_swap_extents(struct btrfs_block_group *bg);
|
||||
void btrfs_dec_block_group_swap_extents(struct btrfs_block_group *bg, int amount);
|
||||
|
||||
#endif /* BTRFS_BLOCK_GROUP_H */
|
||||
|
||||
@@ -522,6 +522,11 @@ struct btrfs_swapfile_pin {
|
||||
* points to a struct btrfs_device.
|
||||
*/
|
||||
bool is_block_group;
|
||||
/*
|
||||
* Only used when 'is_block_group' is true and it is the number of
|
||||
* extents used by a swapfile for this block group ('ptr' field).
|
||||
*/
|
||||
int bg_extent_count;
|
||||
};
|
||||
|
||||
bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr);
|
||||
|
||||
@@ -649,7 +649,7 @@ static int btrfs_delayed_inode_reserve_metadata(
|
||||
btrfs_ino(inode),
|
||||
num_bytes, 1);
|
||||
} else {
|
||||
btrfs_qgroup_free_meta_prealloc(root, fs_info->nodesize);
|
||||
btrfs_qgroup_free_meta_prealloc(root, num_bytes);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3236,8 +3236,11 @@ reserve_space:
|
||||
goto out;
|
||||
ret = btrfs_qgroup_reserve_data(BTRFS_I(inode), &data_reserved,
|
||||
alloc_start, bytes_to_reserve);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart,
|
||||
lockend, &cached_state);
|
||||
goto out;
|
||||
}
|
||||
ret = btrfs_prealloc_file_range(inode, mode, alloc_start,
|
||||
alloc_end - alloc_start,
|
||||
i_blocksize(inode),
|
||||
|
||||
@@ -2714,8 +2714,10 @@ static void __btrfs_return_cluster_to_free_space(
|
||||
struct rb_node *node;
|
||||
|
||||
spin_lock(&cluster->lock);
|
||||
if (cluster->block_group != block_group)
|
||||
goto out;
|
||||
if (cluster->block_group != block_group) {
|
||||
spin_unlock(&cluster->lock);
|
||||
return;
|
||||
}
|
||||
|
||||
cluster->block_group = NULL;
|
||||
cluster->window_start = 0;
|
||||
@@ -2753,8 +2755,6 @@ static void __btrfs_return_cluster_to_free_space(
|
||||
entry->offset, &entry->offset_index, bitmap);
|
||||
}
|
||||
cluster->root = RB_ROOT;
|
||||
|
||||
out:
|
||||
spin_unlock(&cluster->lock);
|
||||
btrfs_put_block_group(block_group);
|
||||
}
|
||||
@@ -3034,8 +3034,6 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group *block_group,
|
||||
entry->bytes -= bytes;
|
||||
}
|
||||
|
||||
if (entry->bytes == 0)
|
||||
rb_erase(&entry->offset_index, &cluster->root);
|
||||
break;
|
||||
}
|
||||
out:
|
||||
@@ -3052,7 +3050,10 @@ out:
|
||||
ctl->free_space -= bytes;
|
||||
if (!entry->bitmap && !btrfs_free_space_trimmed(entry))
|
||||
ctl->discardable_bytes[BTRFS_STAT_CURR] -= bytes;
|
||||
|
||||
spin_lock(&cluster->lock);
|
||||
if (entry->bytes == 0) {
|
||||
rb_erase(&entry->offset_index, &cluster->root);
|
||||
ctl->free_extents--;
|
||||
if (entry->bitmap) {
|
||||
kmem_cache_free(btrfs_free_space_bitmap_cachep,
|
||||
@@ -3065,6 +3066,7 @@ out:
|
||||
kmem_cache_free(btrfs_free_space_cachep, entry);
|
||||
}
|
||||
|
||||
spin_unlock(&cluster->lock);
|
||||
spin_unlock(&ctl->tree_lock);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -9993,6 +9993,7 @@ static int btrfs_add_swapfile_pin(struct inode *inode, void *ptr,
|
||||
sp->ptr = ptr;
|
||||
sp->inode = inode;
|
||||
sp->is_block_group = is_block_group;
|
||||
sp->bg_extent_count = 1;
|
||||
|
||||
spin_lock(&fs_info->swapfile_pins_lock);
|
||||
p = &fs_info->swapfile_pins.rb_node;
|
||||
@@ -10006,6 +10007,8 @@ static int btrfs_add_swapfile_pin(struct inode *inode, void *ptr,
|
||||
(sp->ptr == entry->ptr && sp->inode > entry->inode)) {
|
||||
p = &(*p)->rb_right;
|
||||
} else {
|
||||
if (is_block_group)
|
||||
entry->bg_extent_count++;
|
||||
spin_unlock(&fs_info->swapfile_pins_lock);
|
||||
kfree(sp);
|
||||
return 1;
|
||||
@@ -10031,8 +10034,11 @@ static void btrfs_free_swapfile_pins(struct inode *inode)
|
||||
sp = rb_entry(node, struct btrfs_swapfile_pin, node);
|
||||
if (sp->inode == inode) {
|
||||
rb_erase(&sp->node, &fs_info->swapfile_pins);
|
||||
if (sp->is_block_group)
|
||||
if (sp->is_block_group) {
|
||||
btrfs_dec_block_group_swap_extents(sp->ptr,
|
||||
sp->bg_extent_count);
|
||||
btrfs_put_block_group(sp->ptr);
|
||||
}
|
||||
kfree(sp);
|
||||
}
|
||||
node = next;
|
||||
@@ -10093,7 +10099,8 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
|
||||
sector_t *span)
|
||||
{
|
||||
struct inode *inode = file_inode(file);
|
||||
struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
|
||||
struct extent_state *cached_state = NULL;
|
||||
struct extent_map *em = NULL;
|
||||
@@ -10144,13 +10151,27 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
|
||||
"cannot activate swapfile while exclusive operation is running");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent snapshot creation while we are activating the swap file.
|
||||
* We do not want to race with snapshot creation. If snapshot creation
|
||||
* already started before we bumped nr_swapfiles from 0 to 1 and
|
||||
* completes before the first write into the swap file after it is
|
||||
* activated, than that write would fallback to COW.
|
||||
*/
|
||||
if (!btrfs_drew_try_write_lock(&root->snapshot_lock)) {
|
||||
btrfs_exclop_finish(fs_info);
|
||||
btrfs_warn(fs_info,
|
||||
"cannot activate swapfile because snapshot creation is in progress");
|
||||
return -EINVAL;
|
||||
}
|
||||
/*
|
||||
* Snapshots can create extents which require COW even if NODATACOW is
|
||||
* set. We use this counter to prevent snapshots. We must increment it
|
||||
* before walking the extents because we don't want a concurrent
|
||||
* snapshot to run after we've already checked the extents.
|
||||
*/
|
||||
atomic_inc(&BTRFS_I(inode)->root->nr_swapfiles);
|
||||
atomic_inc(&root->nr_swapfiles);
|
||||
|
||||
isize = ALIGN_DOWN(inode->i_size, fs_info->sectorsize);
|
||||
|
||||
@@ -10247,6 +10268,17 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!btrfs_inc_block_group_swap_extents(bg)) {
|
||||
btrfs_warn(fs_info,
|
||||
"block group for swapfile at %llu is read-only%s",
|
||||
bg->start,
|
||||
atomic_read(&fs_info->scrubs_running) ?
|
||||
" (scrub running)" : "");
|
||||
btrfs_put_block_group(bg);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = btrfs_add_swapfile_pin(inode, bg, true);
|
||||
if (ret) {
|
||||
btrfs_put_block_group(bg);
|
||||
@@ -10285,6 +10317,8 @@ out:
|
||||
if (ret)
|
||||
btrfs_swap_deactivate(file);
|
||||
|
||||
btrfs_drew_write_unlock(&root->snapshot_lock);
|
||||
|
||||
btrfs_exclop_finish(fs_info);
|
||||
|
||||
if (ret)
|
||||
|
||||
@@ -1914,7 +1914,10 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file,
|
||||
if (vol_args->flags & BTRFS_SUBVOL_RDONLY)
|
||||
readonly = true;
|
||||
if (vol_args->flags & BTRFS_SUBVOL_QGROUP_INHERIT) {
|
||||
if (vol_args->size > PAGE_SIZE) {
|
||||
u64 nums;
|
||||
|
||||
if (vol_args->size < sizeof(*inherit) ||
|
||||
vol_args->size > PAGE_SIZE) {
|
||||
ret = -EINVAL;
|
||||
goto free_args;
|
||||
}
|
||||
@@ -1923,6 +1926,20 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file,
|
||||
ret = PTR_ERR(inherit);
|
||||
goto free_args;
|
||||
}
|
||||
|
||||
if (inherit->num_qgroups > PAGE_SIZE ||
|
||||
inherit->num_ref_copies > PAGE_SIZE ||
|
||||
inherit->num_excl_copies > PAGE_SIZE) {
|
||||
ret = -EINVAL;
|
||||
goto free_inherit;
|
||||
}
|
||||
|
||||
nums = inherit->num_qgroups + 2 * inherit->num_ref_copies +
|
||||
2 * inherit->num_excl_copies;
|
||||
if (vol_args->size != struct_size(inherit, qgroups, nums)) {
|
||||
ret = -EINVAL;
|
||||
goto free_inherit;
|
||||
}
|
||||
}
|
||||
|
||||
ret = __btrfs_ioctl_snap_create(file, vol_args->name, vol_args->fd,
|
||||
|
||||
@@ -2363,16 +2363,21 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
SetPageUptodate(p_page);
|
||||
|
||||
if (has_qstripe) {
|
||||
/* RAID6, allocate and map temp space for the Q stripe */
|
||||
q_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
|
||||
if (!q_page) {
|
||||
__free_page(p_page);
|
||||
goto cleanup;
|
||||
}
|
||||
SetPageUptodate(q_page);
|
||||
pointers[rbio->real_stripes - 1] = kmap(q_page);
|
||||
}
|
||||
|
||||
atomic_set(&rbio->error, 0);
|
||||
|
||||
/* Map the parity stripe just once */
|
||||
pointers[nr_data] = kmap(p_page);
|
||||
|
||||
for_each_set_bit(pagenr, rbio->dbitmap, rbio->stripe_npages) {
|
||||
struct page *p;
|
||||
void *parity;
|
||||
@@ -2382,16 +2387,8 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
pointers[stripe] = kmap(p);
|
||||
}
|
||||
|
||||
/* then add the parity stripe */
|
||||
pointers[stripe++] = kmap(p_page);
|
||||
|
||||
if (has_qstripe) {
|
||||
/*
|
||||
* raid6, add the qstripe and call the
|
||||
* library function to fill in our p/q
|
||||
*/
|
||||
pointers[stripe++] = kmap(q_page);
|
||||
|
||||
/* RAID6, call the library function to fill in our P/Q */
|
||||
raid6_call.gen_syndrome(rbio->real_stripes, PAGE_SIZE,
|
||||
pointers);
|
||||
} else {
|
||||
@@ -2412,12 +2409,14 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
|
||||
for (stripe = 0; stripe < nr_data; stripe++)
|
||||
kunmap(page_in_rbio(rbio, stripe, pagenr, 0));
|
||||
kunmap(p_page);
|
||||
}
|
||||
|
||||
kunmap(p_page);
|
||||
__free_page(p_page);
|
||||
if (q_page)
|
||||
if (q_page) {
|
||||
kunmap(q_page);
|
||||
__free_page(q_page);
|
||||
}
|
||||
|
||||
writeback:
|
||||
/*
|
||||
|
||||
@@ -548,6 +548,24 @@ process_slot:
|
||||
btrfs_release_path(path);
|
||||
path->leave_spinning = 0;
|
||||
|
||||
/*
|
||||
* When using NO_HOLES and we are cloning a range that covers
|
||||
* only a hole (no extents) into a range beyond the current
|
||||
* i_size, punching a hole in the target range will not create
|
||||
* an extent map defining a hole, because the range starts at or
|
||||
* beyond current i_size. If the file previously had an i_size
|
||||
* greater than the new i_size set by this clone operation, we
|
||||
* need to make sure the next fsync is a full fsync, so that it
|
||||
* detects and logs a hole covering a range from the current
|
||||
* i_size to the new i_size. If the clone range covers extents,
|
||||
* besides a hole, then we know the full sync flag was already
|
||||
* set by previous calls to btrfs_replace_file_extents() that
|
||||
* replaced file extent items.
|
||||
*/
|
||||
if (last_dest_end >= i_size_read(inode))
|
||||
set_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
|
||||
&BTRFS_I(inode)->runtime_flags);
|
||||
|
||||
ret = btrfs_replace_file_extents(inode, path, last_dest_end,
|
||||
destoff + len - 1, NULL, &trans);
|
||||
if (ret)
|
||||
|
||||
@@ -3568,6 +3568,13 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
|
||||
* commit_transactions.
|
||||
*/
|
||||
ro_set = 0;
|
||||
} else if (ret == -ETXTBSY) {
|
||||
btrfs_warn(fs_info,
|
||||
"skipping scrub of block group %llu due to active swapfile",
|
||||
cache->start);
|
||||
scrub_pause_off(fs_info);
|
||||
ret = 0;
|
||||
goto skip_unfreeze;
|
||||
} else {
|
||||
btrfs_warn(fs_info,
|
||||
"failed setting block group ro: %d", ret);
|
||||
@@ -3657,7 +3664,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
|
||||
} else {
|
||||
spin_unlock(&cache->lock);
|
||||
}
|
||||
|
||||
skip_unfreeze:
|
||||
btrfs_unfreeze_block_group(cache);
|
||||
btrfs_put_block_group(cache);
|
||||
if (ret)
|
||||
|
||||
@@ -229,11 +229,33 @@ int btrfs_setxattr_trans(struct inode *inode, const char *name,
|
||||
{
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
struct btrfs_trans_handle *trans;
|
||||
const bool start_trans = (current->journal_info == NULL);
|
||||
int ret;
|
||||
|
||||
trans = btrfs_start_transaction(root, 2);
|
||||
if (IS_ERR(trans))
|
||||
return PTR_ERR(trans);
|
||||
if (start_trans) {
|
||||
/*
|
||||
* 1 unit for inserting/updating/deleting the xattr
|
||||
* 1 unit for the inode item update
|
||||
*/
|
||||
trans = btrfs_start_transaction(root, 2);
|
||||
if (IS_ERR(trans))
|
||||
return PTR_ERR(trans);
|
||||
} else {
|
||||
/*
|
||||
* This can happen when smack is enabled and a directory is being
|
||||
* created. It happens through d_instantiate_new(), which calls
|
||||
* smack_d_instantiate(), which in turn calls __vfs_setxattr() to
|
||||
* set the transmute xattr (XATTR_NAME_SMACKTRANSMUTE) on the
|
||||
* inode. We have already reserved space for the xattr and inode
|
||||
* update at btrfs_mkdir(), so just use the transaction handle.
|
||||
* We don't join or start a transaction, as that will reset the
|
||||
* block_rsv of the handle and trigger a warning for the start
|
||||
* case.
|
||||
*/
|
||||
ASSERT(strncmp(name, XATTR_SECURITY_PREFIX,
|
||||
XATTR_SECURITY_PREFIX_LEN) == 0);
|
||||
trans = current->journal_info;
|
||||
}
|
||||
|
||||
ret = btrfs_setxattr(trans, inode, name, value, size, flags);
|
||||
if (ret)
|
||||
@@ -244,7 +266,8 @@ int btrfs_setxattr_trans(struct inode *inode, const char *name,
|
||||
ret = btrfs_update_inode(trans, root, inode);
|
||||
BUG_ON(ret);
|
||||
out:
|
||||
btrfs_end_transaction(trans);
|
||||
if (start_trans)
|
||||
btrfs_end_transaction(trans);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -5083,6 +5083,9 @@ static void __io_queue_proc(struct io_poll_iocb *poll, struct io_poll_table *pt,
|
||||
pt->error = -EINVAL;
|
||||
return;
|
||||
}
|
||||
/* double add on the same waitqueue head, ignore */
|
||||
if (poll->head == head)
|
||||
return;
|
||||
poll = kmalloc(sizeof(*poll), GFP_ATOMIC);
|
||||
if (!poll) {
|
||||
pt->error = -ENOMEM;
|
||||
|
||||
@@ -149,7 +149,7 @@ struct ahash_alg {
|
||||
|
||||
struct shash_desc {
|
||||
struct crypto_shash *tfm;
|
||||
void *__ctx[] CRYPTO_MINALIGN_ATTR;
|
||||
void *__ctx[] __aligned(ARCH_SLAB_MINALIGN);
|
||||
};
|
||||
|
||||
#define HASH_MAX_DIGESTSIZE 64
|
||||
@@ -162,9 +162,9 @@ struct shash_desc {
|
||||
|
||||
#define HASH_MAX_STATESIZE 512
|
||||
|
||||
#define SHASH_DESC_ON_STACK(shash, ctx) \
|
||||
char __##shash##_desc[sizeof(struct shash_desc) + \
|
||||
HASH_MAX_DESCSIZE] CRYPTO_MINALIGN_ATTR; \
|
||||
#define SHASH_DESC_ON_STACK(shash, ctx) \
|
||||
char __##shash##_desc[sizeof(struct shash_desc) + HASH_MAX_DESCSIZE] \
|
||||
__aligned(__alignof__(struct shash_desc)); \
|
||||
struct shash_desc *shash = (struct shash_desc *)__##shash##_desc
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,6 +38,7 @@ void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 *size);
|
||||
const struct iommu_ops *iort_iommu_configure_id(struct device *dev,
|
||||
const u32 *id_in);
|
||||
int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head);
|
||||
phys_addr_t acpi_iort_dma_get_max_cpu_address(void);
|
||||
#else
|
||||
static inline void acpi_iort_init(void) { }
|
||||
static inline u32 iort_msi_map_id(struct device *dev, u32 id)
|
||||
@@ -55,6 +56,9 @@ static inline const struct iommu_ops *iort_iommu_configure_id(
|
||||
static inline
|
||||
int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head)
|
||||
{ return 0; }
|
||||
|
||||
static inline phys_addr_t acpi_iort_dma_get_max_cpu_address(void)
|
||||
{ return PHYS_ADDR_MAX; }
|
||||
#endif
|
||||
|
||||
#endif /* __ACPI_IORT_H__ */
|
||||
|
||||
@@ -151,9 +151,12 @@
|
||||
* The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual
|
||||
* declaration) is used to ensure that the crypto_tfm context structure is
|
||||
* aligned correctly for the given architecture so that there are no alignment
|
||||
* faults for C data types. In particular, this is required on platforms such
|
||||
* as arm where pointers are 32-bit aligned but there are data types such as
|
||||
* u64 which require 64-bit alignment.
|
||||
* faults for C data types. On architectures that support non-cache coherent
|
||||
* DMA, such as ARM or arm64, it also takes into account the minimal alignment
|
||||
* that is required to ensure that the context struct member does not share any
|
||||
* cachelines with the rest of the struct. This is needed to ensure that cache
|
||||
* maintenance for non-coherent DMA (cache invalidation in particular) does not
|
||||
* affect data that may be accessed by the CPU concurrently.
|
||||
*/
|
||||
#define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN
|
||||
|
||||
|
||||
@@ -356,26 +356,6 @@ enum zone_type {
|
||||
* DMA mask is assumed when ZONE_DMA32 is defined. Some 64-bit
|
||||
* platforms may need both zones as they support peripherals with
|
||||
* different DMA addressing limitations.
|
||||
*
|
||||
* Some examples:
|
||||
*
|
||||
* - i386 and x86_64 have a fixed 16M ZONE_DMA and ZONE_DMA32 for the
|
||||
* rest of the lower 4G.
|
||||
*
|
||||
* - arm only uses ZONE_DMA, the size, up to 4G, may vary depending on
|
||||
* the specific device.
|
||||
*
|
||||
* - arm64 has a fixed 1G ZONE_DMA and ZONE_DMA32 for the rest of the
|
||||
* lower 4G.
|
||||
*
|
||||
* - powerpc only uses ZONE_DMA, the size, up to 2G, may vary
|
||||
* depending on the specific device.
|
||||
*
|
||||
* - s390 uses ZONE_DMA fixed to the lower 2G.
|
||||
*
|
||||
* - ia64 and riscv only use ZONE_DMA32.
|
||||
*
|
||||
* - parisc uses neither.
|
||||
*/
|
||||
#ifdef CONFIG_ZONE_DMA
|
||||
ZONE_DMA,
|
||||
|
||||
@@ -558,6 +558,8 @@ int of_map_id(struct device_node *np, u32 id,
|
||||
const char *map_name, const char *map_mask_name,
|
||||
struct device_node **target, u32 *id_out);
|
||||
|
||||
phys_addr_t of_dma_get_max_cpu_address(struct device_node *np);
|
||||
|
||||
#else /* CONFIG_OF */
|
||||
|
||||
static inline void of_core_init(void)
|
||||
@@ -995,6 +997,11 @@ static inline int of_map_id(struct device_node *np, u32 id,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline phys_addr_t of_dma_get_max_cpu_address(struct device_node *np)
|
||||
{
|
||||
return PHYS_ADDR_MAX;
|
||||
}
|
||||
|
||||
#define of_match_ptr(_ptr) NULL
|
||||
#define of_match_node(_matches, _node) NULL
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
@@ -112,6 +112,11 @@ struct nhlt_vendor_dmic_array_config {
|
||||
/* TODO add vendor mic config */
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
NHLT_CONFIG_TYPE_GENERIC = 0,
|
||||
NHLT_CONFIG_TYPE_MIC_ARRAY = 1
|
||||
};
|
||||
|
||||
enum {
|
||||
NHLT_MIC_ARRAY_2CH_SMALL = 0xa,
|
||||
NHLT_MIC_ARRAY_2CH_BIG = 0xb,
|
||||
|
||||
@@ -2836,6 +2836,17 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
write_stamp, write_stamp - delta))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* It's possible that the event time delta is zero
|
||||
* (has the same time stamp as the previous event)
|
||||
* in which case write_stamp and before_stamp could
|
||||
* be the same. In such a case, force before_stamp
|
||||
* to be different than write_stamp. It doesn't
|
||||
* matter what it is, as long as its different.
|
||||
*/
|
||||
if (!delta)
|
||||
rb_time_set(&cpu_buffer->before_stamp, 0);
|
||||
|
||||
/*
|
||||
* If an event were to come in now, it would see that the
|
||||
* write_stamp and the before_stamp are different, and assume
|
||||
|
||||
@@ -438,7 +438,7 @@ static int arm_is_fake_mcount(Elf32_Rel const *rp)
|
||||
|
||||
static int arm64_is_fake_mcount(Elf64_Rel const *rp)
|
||||
{
|
||||
return ELF64_R_TYPE(w(rp->r_info)) != R_AARCH64_CALL26;
|
||||
return ELF64_R_TYPE(w8(rp->r_info)) != R_AARCH64_CALL26;
|
||||
}
|
||||
|
||||
/* 64-bit EM_MIPS has weird ELF64_Rela.r_info.
|
||||
|
||||
@@ -613,7 +613,7 @@ static int tomoyo_check_unix_address(struct sockaddr *addr,
|
||||
static bool tomoyo_kernel_service(void)
|
||||
{
|
||||
/* Nothing to do if I am a kernel service. */
|
||||
return uaccess_kernel();
|
||||
return (current->flags & (PF_KTHREAD | PF_IO_WORKER)) == PF_KTHREAD;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -31,18 +31,44 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
|
||||
struct nhlt_endpoint *epnt;
|
||||
struct nhlt_dmic_array_config *cfg;
|
||||
struct nhlt_vendor_dmic_array_config *cfg_vendor;
|
||||
struct nhlt_fmt *fmt_configs;
|
||||
unsigned int dmic_geo = 0;
|
||||
u8 j;
|
||||
u16 max_ch = 0;
|
||||
u8 i, j;
|
||||
|
||||
if (!nhlt)
|
||||
return 0;
|
||||
|
||||
epnt = (struct nhlt_endpoint *)nhlt->desc;
|
||||
for (j = 0, epnt = nhlt->desc; j < nhlt->endpoint_count; j++,
|
||||
epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length)) {
|
||||
|
||||
for (j = 0; j < nhlt->endpoint_count; j++) {
|
||||
if (epnt->linktype == NHLT_LINK_DMIC) {
|
||||
cfg = (struct nhlt_dmic_array_config *)
|
||||
(epnt->config.caps);
|
||||
if (epnt->linktype != NHLT_LINK_DMIC)
|
||||
continue;
|
||||
|
||||
cfg = (struct nhlt_dmic_array_config *)(epnt->config.caps);
|
||||
fmt_configs = (struct nhlt_fmt *)(epnt->config.caps + epnt->config.size);
|
||||
|
||||
/* find max number of channels based on format_configuration */
|
||||
if (fmt_configs->fmt_count) {
|
||||
dev_dbg(dev, "%s: found %d format definitions\n",
|
||||
__func__, fmt_configs->fmt_count);
|
||||
|
||||
for (i = 0; i < fmt_configs->fmt_count; i++) {
|
||||
struct wav_fmt_ext *fmt_ext;
|
||||
|
||||
fmt_ext = &fmt_configs->fmt_config[i].fmt_ext;
|
||||
|
||||
if (fmt_ext->fmt.channels > max_ch)
|
||||
max_ch = fmt_ext->fmt.channels;
|
||||
}
|
||||
dev_dbg(dev, "%s: max channels found %d\n", __func__, max_ch);
|
||||
} else {
|
||||
dev_dbg(dev, "%s: No format information found\n", __func__);
|
||||
}
|
||||
|
||||
if (cfg->device_config.config_type != NHLT_CONFIG_TYPE_MIC_ARRAY) {
|
||||
dmic_geo = max_ch;
|
||||
} else {
|
||||
switch (cfg->array_type) {
|
||||
case NHLT_MIC_ARRAY_2CH_SMALL:
|
||||
case NHLT_MIC_ARRAY_2CH_BIG:
|
||||
@@ -59,13 +85,23 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
|
||||
dmic_geo = cfg_vendor->nb_mics;
|
||||
break;
|
||||
default:
|
||||
dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
|
||||
cfg->array_type);
|
||||
dev_warn(dev, "%s: undefined DMIC array_type 0x%0x\n",
|
||||
__func__, cfg->array_type);
|
||||
}
|
||||
|
||||
if (dmic_geo > 0) {
|
||||
dev_dbg(dev, "%s: Array with %d dmics\n", __func__, dmic_geo);
|
||||
}
|
||||
if (max_ch > dmic_geo) {
|
||||
dev_dbg(dev, "%s: max channels %d exceed dmic number %d\n",
|
||||
__func__, max_ch, dmic_geo);
|
||||
}
|
||||
}
|
||||
epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s: dmic number %d max_ch %d\n",
|
||||
__func__, dmic_geo, max_ch);
|
||||
|
||||
return dmic_geo;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);
|
||||
|
||||
@@ -991,7 +991,7 @@ static int daio_mgr_dao_init(void *blk, unsigned int idx, unsigned int conf)
|
||||
|
||||
if (idx < 4) {
|
||||
/* S/PDIF output */
|
||||
switch ((conf & 0x7)) {
|
||||
switch ((conf & 0xf)) {
|
||||
case 1:
|
||||
set_field(&ctl->txctl[idx], ATXCTL_NUC, 0);
|
||||
break;
|
||||
|
||||
@@ -6408,6 +6408,7 @@ enum {
|
||||
ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
|
||||
ALC282_FIXUP_ACER_DISABLE_LINEOUT,
|
||||
ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
|
||||
ALC256_FIXUP_ACER_HEADSET_MIC,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
@@ -7864,6 +7865,16 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
|
||||
},
|
||||
[ALC256_FIXUP_ACER_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
|
||||
{ 0x1a, 0x90a1092f }, /* use as internal mic */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@@ -7890,9 +7901,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
|
||||
SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
|
||||
SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
|
||||
|
||||
@@ -1301,6 +1301,17 @@ no_res_check:
|
||||
/* totally crap, return an error */
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
/* if the max volume is too low, it's likely a bogus range;
|
||||
* here we use -96dB as the threshold
|
||||
*/
|
||||
if (cval->dBmax <= -9600) {
|
||||
usb_audio_info(cval->head.mixer->chip,
|
||||
"%d:%d: bogus dB values (%d/%d), disabling dB reporting\n",
|
||||
cval->head.id, mixer_ctrl_intf(cval->head.mixer),
|
||||
cval->dBmin, cval->dBmax);
|
||||
cval->dBmin = cval->dBmax = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -536,6 +536,16 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||
.id = USB_ID(0x05a7, 0x1020),
|
||||
.map = bose_companion5_map,
|
||||
},
|
||||
{
|
||||
/* Corsair Virtuoso SE (wired mode) */
|
||||
.id = USB_ID(0x1b1c, 0x0a3d),
|
||||
.map = corsair_virtuoso_map,
|
||||
},
|
||||
{
|
||||
/* Corsair Virtuoso SE (wireless mode) */
|
||||
.id = USB_ID(0x1b1c, 0x0a3e),
|
||||
.map = corsair_virtuoso_map,
|
||||
},
|
||||
{
|
||||
/* Corsair Virtuoso (wired mode) */
|
||||
.id = USB_ID(0x1b1c, 0x0a41),
|
||||
|
||||
Reference in New Issue
Block a user