This is the 4.19.132 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl8GySkACgkQONu9yGCS aT5AJxAAhkThJ1JxpJ/Ci5KASCkyXxqghdD+EQ/dwVp9fWjFcUZT4Pp+PZzGk02d 6DW9F8sNsCJOepeXmzJnFDf2rIuFCCGWgkX/wD+zTHDzY+ThmaOBy9hW2k2tM98B ii40ui4YYUYHKh0nPF1uPWsAGEdipqv2QWCaDszKtpH/mjcodWJmlJpXTl1Lh6+H dWT1CEYhLJBG5Z6A9NVeKn7PMtX7hMoYEF8DRyUg59a2oNKc2ys8FsjeRfJ9EvYN Qd1ZKWUvkzxQmL14RIvkA3bcU7bdIAB5Qm9lV0WKs/kVD2+zMOZb3j4HR2+0ey6U ieyX6iM07la1cMEEHxtHtIZoghgId7XgB2UJu7oFGH/4Y98ocwKa/8iA+qtXEDVj 7mHa3dnC/gKMISydKsLN8AswVJXTy+RrcOnOf4qNfRUe0hhRZhfniusio5Hp8s/x vV+k+/PH8kPvVOhM7Jw3wGgms4wMzgKR8zcZm4wf9qnZMyLn/e902w04d+xkEs3Z ShSZtd/9CWed7FENKEb0mCCJrE2c6kHCAExNfP6Xx2NSdB7Nr1vFNqYhXIynGRko Hpf746FaQ2J4jr1IHDaGvfxeD64EJqpH8M2Ti3/jkQG45FrYRGirX4cry0Kx655r SmSENRH4H5alnGL/1m/8xYHBDsA3u2hY7+7ZfKBgK3B0ikxPia8= =NI9a -----END PGP SIGNATURE----- Merge 4.19.132 into android-4.19-stable Changes in 4.19.132 btrfs: fix a block group ref counter leak after failure to remove block group mm: fix swap cache node allocation mask EDAC/amd64: Read back the scrub rate PCI register on F15h usbnet: smsc95xx: Fix use-after-free after removal mm/slub.c: fix corrupted freechain in deactivate_slab() mm/slub: fix stack overruns with SLUB_STATS usb: usbtest: fix missing kfree(dev->buf) in usbtest_disconnect s390/debug: avoid kernel warning on too large number of pages nvme-multipath: set bdi capabilities once nvme-multipath: fix deadlock between ana_work and scan_work kgdb: Avoid suspicious RCU usage warning crypto: af_alg - fix use-after-free in af_alg_accept() due to bh_lock_sock() drm/msm/dpu: fix error return code in dpu_encoder_init cxgb4: use unaligned conversion for fetching timestamp cxgb4: parse TC-U32 key values and masks natively cxgb4: use correct type for all-mask IP address comparison cxgb4: fix SGE queue dump destination buffer context hwmon: (max6697) Make sure the OVERT mask is set correctly hwmon: (acpi_power_meter) Fix potential memory leak in acpi_power_meter_add() drm: sun4i: hdmi: Remove extra HPD polling virtio-blk: free vblk-vqs in error path of virtblk_probe() SMB3: Honor 'posix' flag for multiuser mounts nvme: fix a crash in nvme_mpath_add_disk i2c: algo-pca: Add 0x78 as SCL stuck low status for PCA9665 i2c: mlxcpld: check correct size of maximum RECV_LEN packet nfsd: apply umask on fs without ACL support Revert "ALSA: usb-audio: Improve frames size computation" SMB3: Honor 'seal' flag for multiuser mounts SMB3: Honor persistent/resilient handle flags for multiuser mounts SMB3: Honor lease disabling for multiuser mounts cifs: Fix the target file was deleted when rename failed. MIPS: Add missing EHB in mtc0 -> mfc0 sequence for DSPen irqchip/gic: Atomically update affinity dm zoned: assign max_io_len correctly efi: Make it possible to disable efivar_ssdt entirely Linux 4.19.132 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I394bc3ee947bdf92bad83297e7bd579e92fed8a9
This commit is contained in:
commit
a6c20c0442
35 changed files with 250 additions and 145 deletions
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 131
|
||||
SUBLEVEL = 132
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -2096,6 +2096,7 @@ static void configure_status(void)
|
|||
|
||||
change_c0_status(ST0_CU|ST0_MX|ST0_RE|ST0_FR|ST0_BEV|ST0_TS|ST0_KX|ST0_SX|ST0_UX,
|
||||
status_set);
|
||||
back_to_back_c0_hazard();
|
||||
}
|
||||
|
||||
unsigned int hwrena;
|
||||
|
|
|
@ -198,9 +198,10 @@ static debug_entry_t ***debug_areas_alloc(int pages_per_area, int nr_areas)
|
|||
if (!areas)
|
||||
goto fail_malloc_areas;
|
||||
for (i = 0; i < nr_areas; i++) {
|
||||
/* GFP_NOWARN to avoid user triggerable WARN, we handle fails */
|
||||
areas[i] = kmalloc_array(pages_per_area,
|
||||
sizeof(debug_entry_t *),
|
||||
GFP_KERNEL);
|
||||
GFP_KERNEL | __GFP_NOWARN);
|
||||
if (!areas[i])
|
||||
goto fail_malloc_areas2;
|
||||
for (j = 0; j < pages_per_area; j++) {
|
||||
|
|
|
@ -133,21 +133,15 @@ EXPORT_SYMBOL_GPL(af_alg_release);
|
|||
void af_alg_release_parent(struct sock *sk)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
unsigned int nokey = ask->nokey_refcnt;
|
||||
bool last = nokey && !ask->refcnt;
|
||||
unsigned int nokey = atomic_read(&ask->nokey_refcnt);
|
||||
|
||||
sk = ask->parent;
|
||||
ask = alg_sk(sk);
|
||||
|
||||
local_bh_disable();
|
||||
bh_lock_sock(sk);
|
||||
ask->nokey_refcnt -= nokey;
|
||||
if (!last)
|
||||
last = !--ask->refcnt;
|
||||
bh_unlock_sock(sk);
|
||||
local_bh_enable();
|
||||
if (nokey)
|
||||
atomic_dec(&ask->nokey_refcnt);
|
||||
|
||||
if (last)
|
||||
if (atomic_dec_and_test(&ask->refcnt))
|
||||
sock_put(sk);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_release_parent);
|
||||
|
@ -192,7 +186,7 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|||
|
||||
err = -EBUSY;
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt | ask->nokey_refcnt)
|
||||
if (atomic_read(&ask->refcnt))
|
||||
goto unlock;
|
||||
|
||||
swap(ask->type, type);
|
||||
|
@ -241,7 +235,7 @@ static int alg_setsockopt(struct socket *sock, int level, int optname,
|
|||
int err = -EBUSY;
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (atomic_read(&ask->refcnt) != atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock;
|
||||
|
||||
type = ask->type;
|
||||
|
@ -308,12 +302,14 @@ int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
|
|||
|
||||
sk2->sk_family = PF_ALG;
|
||||
|
||||
if (nokey || !ask->refcnt++)
|
||||
if (atomic_inc_return_relaxed(&ask->refcnt) == 1)
|
||||
sock_hold(sk);
|
||||
ask->nokey_refcnt += nokey;
|
||||
if (nokey) {
|
||||
atomic_inc(&ask->nokey_refcnt);
|
||||
atomic_set(&alg_sk(sk2)->nokey_refcnt, 1);
|
||||
}
|
||||
alg_sk(sk2)->parent = sk;
|
||||
alg_sk(sk2)->type = type;
|
||||
alg_sk(sk2)->nokey_refcnt = nokey;
|
||||
|
||||
newsock->ops = type->ops;
|
||||
newsock->state = SS_CONNECTED;
|
||||
|
|
|
@ -388,7 +388,7 @@ static int aead_check_key(struct socket *sock)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (!atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock_child;
|
||||
|
||||
psk = ask->parent;
|
||||
|
@ -400,11 +400,8 @@ static int aead_check_key(struct socket *sock)
|
|||
if (crypto_aead_get_flags(tfm->aead) & CRYPTO_TFM_NEED_KEY)
|
||||
goto unlock;
|
||||
|
||||
if (!pask->refcnt++)
|
||||
sock_hold(psk);
|
||||
|
||||
ask->refcnt = 1;
|
||||
sock_put(psk);
|
||||
atomic_dec(&pask->nokey_refcnt);
|
||||
atomic_set(&ask->nokey_refcnt, 0);
|
||||
|
||||
err = 0;
|
||||
|
||||
|
|
|
@ -306,7 +306,7 @@ static int hash_check_key(struct socket *sock)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (!atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock_child;
|
||||
|
||||
psk = ask->parent;
|
||||
|
@ -318,11 +318,8 @@ static int hash_check_key(struct socket *sock)
|
|||
if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
||||
goto unlock;
|
||||
|
||||
if (!pask->refcnt++)
|
||||
sock_hold(psk);
|
||||
|
||||
ask->refcnt = 1;
|
||||
sock_put(psk);
|
||||
atomic_dec(&pask->nokey_refcnt);
|
||||
atomic_set(&ask->nokey_refcnt, 0);
|
||||
|
||||
err = 0;
|
||||
|
||||
|
|
|
@ -215,7 +215,7 @@ static int skcipher_check_key(struct socket *sock)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (!atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock_child;
|
||||
|
||||
psk = ask->parent;
|
||||
|
@ -227,11 +227,8 @@ static int skcipher_check_key(struct socket *sock)
|
|||
if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
|
||||
goto unlock;
|
||||
|
||||
if (!pask->refcnt++)
|
||||
sock_hold(psk);
|
||||
|
||||
ask->refcnt = 1;
|
||||
sock_put(psk);
|
||||
atomic_dec(&pask->nokey_refcnt);
|
||||
atomic_set(&ask->nokey_refcnt, 0);
|
||||
|
||||
err = 0;
|
||||
|
||||
|
|
|
@ -882,6 +882,7 @@ static int virtblk_probe(struct virtio_device *vdev)
|
|||
put_disk(vblk->disk);
|
||||
out_free_vq:
|
||||
vdev->config->del_vqs(vdev);
|
||||
kfree(vblk->vqs);
|
||||
out_free_vblk:
|
||||
kfree(vblk);
|
||||
out_free_index:
|
||||
|
|
|
@ -261,6 +261,8 @@ static int get_scrub_rate(struct mem_ctl_info *mci)
|
|||
|
||||
if (pvt->model == 0x60)
|
||||
amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
|
||||
else
|
||||
amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
|
||||
break;
|
||||
|
||||
case 0x17:
|
||||
|
|
|
@ -179,6 +179,17 @@ config RESET_ATTACK_MITIGATION
|
|||
have been evicted, since otherwise it will trigger even on clean
|
||||
reboots.
|
||||
|
||||
config EFI_CUSTOM_SSDT_OVERLAYS
|
||||
bool "Load custom ACPI SSDT overlay from an EFI variable"
|
||||
depends on EFI_VARS && ACPI
|
||||
default ACPI_TABLE_UPGRADE
|
||||
help
|
||||
Allow loading of an ACPI SSDT overlay from an EFI variable specified
|
||||
by a kernel command line option.
|
||||
|
||||
See Documentation/admin-guide/acpi/ssdt-overlays.rst for more
|
||||
information.
|
||||
|
||||
endmenu
|
||||
|
||||
config UEFI_CPER
|
||||
|
|
|
@ -236,7 +236,7 @@ static void generic_ops_unregister(void)
|
|||
efivars_unregister(&generic_efivars);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_ACPI)
|
||||
#ifdef CONFIG_EFI_CUSTOM_SSDT_OVERLAYS
|
||||
#define EFIVAR_SSDT_NAME_MAX 16
|
||||
static char efivar_ssdt[EFIVAR_SSDT_NAME_MAX] __initdata;
|
||||
static int __init efivar_ssdt_setup(char *str)
|
||||
|
|
|
@ -2412,7 +2412,7 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
|
|||
|
||||
dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
|
||||
if (!dpu_enc)
|
||||
return ERR_PTR(ENOMEM);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
rc = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
|
||||
drm_enc_mode, NULL);
|
||||
|
|
|
@ -242,9 +242,8 @@ sun4i_hdmi_connector_detect(struct drm_connector *connector, bool force)
|
|||
struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
|
||||
unsigned long reg;
|
||||
|
||||
if (readl_poll_timeout(hdmi->base + SUN4I_HDMI_HPD_REG, reg,
|
||||
reg & SUN4I_HDMI_HPD_HIGH,
|
||||
0, 500000)) {
|
||||
reg = readl(hdmi->base + SUN4I_HDMI_HPD_REG);
|
||||
if (reg & SUN4I_HDMI_HPD_HIGH) {
|
||||
cec_phys_addr_invalidate(hdmi->cec_adap);
|
||||
return connector_status_disconnected;
|
||||
}
|
||||
|
|
|
@ -896,7 +896,7 @@ static int acpi_power_meter_add(struct acpi_device *device)
|
|||
|
||||
res = setup_attrs(resource);
|
||||
if (res)
|
||||
goto exit_free;
|
||||
goto exit_free_capability;
|
||||
|
||||
resource->hwmon_dev = hwmon_device_register(&device->dev);
|
||||
if (IS_ERR(resource->hwmon_dev)) {
|
||||
|
@ -909,6 +909,8 @@ static int acpi_power_meter_add(struct acpi_device *device)
|
|||
|
||||
exit_remove:
|
||||
remove_attrs(resource);
|
||||
exit_free_capability:
|
||||
free_capabilities(resource);
|
||||
exit_free:
|
||||
kfree(resource);
|
||||
exit:
|
||||
|
|
|
@ -47,8 +47,9 @@ static const u8 MAX6697_REG_CRIT[] = {
|
|||
* Map device tree / platform data register bit map to chip bit map.
|
||||
* Applies to alert register and over-temperature register.
|
||||
*/
|
||||
#define MAX6697_MAP_BITS(reg) ((((reg) & 0x7e) >> 1) | \
|
||||
#define MAX6697_ALERT_MAP_BITS(reg) ((((reg) & 0x7e) >> 1) | \
|
||||
(((reg) & 0x01) << 6) | ((reg) & 0x80))
|
||||
#define MAX6697_OVERT_MAP_BITS(reg) (((reg) >> 1) | (((reg) & 0x01) << 7))
|
||||
|
||||
#define MAX6697_REG_STAT(n) (0x44 + (n))
|
||||
|
||||
|
@ -587,12 +588,12 @@ static int max6697_init_chip(struct max6697_data *data,
|
|||
return ret;
|
||||
|
||||
ret = i2c_smbus_write_byte_data(client, MAX6697_REG_ALERT_MASK,
|
||||
MAX6697_MAP_BITS(pdata->alert_mask));
|
||||
MAX6697_ALERT_MAP_BITS(pdata->alert_mask));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = i2c_smbus_write_byte_data(client, MAX6697_REG_OVERT_MASK,
|
||||
MAX6697_MAP_BITS(pdata->over_temperature_mask));
|
||||
MAX6697_OVERT_MAP_BITS(pdata->over_temperature_mask));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -323,7 +323,8 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
|||
DEB2("BUS ERROR - SDA Stuck low\n");
|
||||
pca_reset(adap);
|
||||
goto out;
|
||||
case 0x90: /* Bus error - SCL stuck low */
|
||||
case 0x78: /* Bus error - SCL stuck low (PCA9665) */
|
||||
case 0x90: /* Bus error - SCL stuck low (PCA9564) */
|
||||
DEB2("BUS ERROR - SCL Stuck low\n");
|
||||
pca_reset(adap);
|
||||
goto out;
|
||||
|
|
|
@ -337,9 +337,9 @@ static int mlxcpld_i2c_wait_for_tc(struct mlxcpld_i2c_priv *priv)
|
|||
if (priv->smbus_block && (val & MLXCPLD_I2C_SMBUS_BLK_BIT)) {
|
||||
mlxcpld_i2c_read_comm(priv, MLXCPLD_LPCI2C_NUM_DAT_REG,
|
||||
&datalen, 1);
|
||||
if (unlikely(datalen > (I2C_SMBUS_BLOCK_MAX + 1))) {
|
||||
if (unlikely(datalen > I2C_SMBUS_BLOCK_MAX)) {
|
||||
dev_err(priv->dev, "Incorrect smbus block read message len\n");
|
||||
return -E2BIG;
|
||||
return -EPROTO;
|
||||
}
|
||||
} else {
|
||||
datalen = priv->xfer.data_len;
|
||||
|
|
|
@ -324,10 +324,8 @@ static int gic_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu)
|
|||
static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
|
||||
bool force)
|
||||
{
|
||||
void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3);
|
||||
unsigned int cpu, shift = (gic_irq(d) % 4) * 8;
|
||||
u32 val, mask, bit;
|
||||
unsigned long flags;
|
||||
void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + gic_irq(d);
|
||||
unsigned int cpu;
|
||||
|
||||
if (!force)
|
||||
cpu = cpumask_any_and(mask_val, cpu_online_mask);
|
||||
|
@ -337,13 +335,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
|
|||
if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids)
|
||||
return -EINVAL;
|
||||
|
||||
gic_lock_irqsave(flags);
|
||||
mask = 0xff << shift;
|
||||
bit = gic_cpu_map[cpu] << shift;
|
||||
val = readl_relaxed(reg) & ~mask;
|
||||
writel_relaxed(val | bit, reg);
|
||||
gic_unlock_irqrestore(flags);
|
||||
|
||||
writeb_relaxed(gic_cpu_map[cpu], reg);
|
||||
irq_data_update_effective_affinity(d, cpumask_of(cpu));
|
||||
|
||||
return IRQ_SET_MASK_OK_DONE;
|
||||
|
|
|
@ -789,7 +789,7 @@ static int dmz_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
|||
}
|
||||
|
||||
/* Set target (no write same support) */
|
||||
ti->max_io_len = dev->zone_nr_sectors << 9;
|
||||
ti->max_io_len = dev->zone_nr_sectors;
|
||||
ti->num_flush_bios = 1;
|
||||
ti->num_discard_bios = 1;
|
||||
ti->num_write_zeroes_bios = 1;
|
||||
|
|
|
@ -1987,7 +1987,6 @@ int cudbg_collect_dump_context(struct cudbg_init *pdbg_init,
|
|||
u8 mem_type[CTXT_INGRESS + 1] = { 0 };
|
||||
struct cudbg_buffer temp_buff = { 0 };
|
||||
struct cudbg_ch_cntxt *buff;
|
||||
u64 *dst_off, *src_off;
|
||||
u8 *ctx_buf;
|
||||
u8 i, k;
|
||||
int rc;
|
||||
|
@ -2056,8 +2055,11 @@ int cudbg_collect_dump_context(struct cudbg_init *pdbg_init,
|
|||
}
|
||||
|
||||
for (j = 0; j < max_ctx_qid; j++) {
|
||||
__be64 *dst_off;
|
||||
u64 *src_off;
|
||||
|
||||
src_off = (u64 *)(ctx_buf + j * SGE_CTXT_SIZE);
|
||||
dst_off = (u64 *)buff->data;
|
||||
dst_off = (__be64 *)buff->data;
|
||||
|
||||
/* The data is stored in 64-bit cpu order. Convert it
|
||||
* to big endian before parsing.
|
||||
|
|
|
@ -810,16 +810,16 @@ static bool is_addr_all_mask(u8 *ipmask, int family)
|
|||
struct in_addr *addr;
|
||||
|
||||
addr = (struct in_addr *)ipmask;
|
||||
if (addr->s_addr == 0xffffffff)
|
||||
if (ntohl(addr->s_addr) == 0xffffffff)
|
||||
return true;
|
||||
} else if (family == AF_INET6) {
|
||||
struct in6_addr *addr6;
|
||||
|
||||
addr6 = (struct in6_addr *)ipmask;
|
||||
if (addr6->s6_addr32[0] == 0xffffffff &&
|
||||
addr6->s6_addr32[1] == 0xffffffff &&
|
||||
addr6->s6_addr32[2] == 0xffffffff &&
|
||||
addr6->s6_addr32[3] == 0xffffffff)
|
||||
if (ntohl(addr6->s6_addr32[0]) == 0xffffffff &&
|
||||
ntohl(addr6->s6_addr32[1]) == 0xffffffff &&
|
||||
ntohl(addr6->s6_addr32[2]) == 0xffffffff &&
|
||||
ntohl(addr6->s6_addr32[3]) == 0xffffffff)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -47,7 +47,7 @@ static int fill_match_fields(struct adapter *adap,
|
|||
bool next_header)
|
||||
{
|
||||
unsigned int i, j;
|
||||
u32 val, mask;
|
||||
__be32 val, mask;
|
||||
int off, err;
|
||||
bool found;
|
||||
|
||||
|
@ -216,7 +216,7 @@ int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)
|
|||
const struct cxgb4_next_header *next;
|
||||
bool found = false;
|
||||
unsigned int i, j;
|
||||
u32 val, mask;
|
||||
__be32 val, mask;
|
||||
int off;
|
||||
|
||||
if (t->table[link_uhtid - 1].link_handle) {
|
||||
|
@ -230,10 +230,10 @@ int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)
|
|||
|
||||
/* Try to find matches that allow jumps to next header. */
|
||||
for (i = 0; next[i].jump; i++) {
|
||||
if (next[i].offoff != cls->knode.sel->offoff ||
|
||||
next[i].shift != cls->knode.sel->offshift ||
|
||||
next[i].mask != cls->knode.sel->offmask ||
|
||||
next[i].offset != cls->knode.sel->off)
|
||||
if (next[i].sel.offoff != cls->knode.sel->offoff ||
|
||||
next[i].sel.offshift != cls->knode.sel->offshift ||
|
||||
next[i].sel.offmask != cls->knode.sel->offmask ||
|
||||
next[i].sel.off != cls->knode.sel->off)
|
||||
continue;
|
||||
|
||||
/* Found a possible candidate. Find a key that
|
||||
|
@ -245,9 +245,9 @@ int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)
|
|||
val = cls->knode.sel->keys[j].val;
|
||||
mask = cls->knode.sel->keys[j].mask;
|
||||
|
||||
if (next[i].match_off == off &&
|
||||
next[i].match_val == val &&
|
||||
next[i].match_mask == mask) {
|
||||
if (next[i].key.off == off &&
|
||||
next[i].key.val == val &&
|
||||
next[i].key.mask == mask) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -38,12 +38,12 @@
|
|||
struct cxgb4_match_field {
|
||||
int off; /* Offset from the beginning of the header to match */
|
||||
/* Fill the value/mask pair in the spec if matched */
|
||||
int (*val)(struct ch_filter_specification *f, u32 val, u32 mask);
|
||||
int (*val)(struct ch_filter_specification *f, __be32 val, __be32 mask);
|
||||
};
|
||||
|
||||
/* IPv4 match fields */
|
||||
static inline int cxgb4_fill_ipv4_tos(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
f->val.tos = (ntohl(val) >> 16) & 0x000000FF;
|
||||
f->mask.tos = (ntohl(mask) >> 16) & 0x000000FF;
|
||||
|
@ -52,7 +52,7 @@ static inline int cxgb4_fill_ipv4_tos(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv4_frag(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
u32 mask_val;
|
||||
u8 frag_val;
|
||||
|
@ -74,7 +74,7 @@ static inline int cxgb4_fill_ipv4_frag(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv4_proto(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
f->val.proto = (ntohl(val) >> 16) & 0x000000FF;
|
||||
f->mask.proto = (ntohl(mask) >> 16) & 0x000000FF;
|
||||
|
@ -83,7 +83,7 @@ static inline int cxgb4_fill_ipv4_proto(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv4_src_ip(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.fip[0], &val, sizeof(u32));
|
||||
memcpy(&f->mask.fip[0], &mask, sizeof(u32));
|
||||
|
@ -92,7 +92,7 @@ static inline int cxgb4_fill_ipv4_src_ip(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv4_dst_ip(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.lip[0], &val, sizeof(u32));
|
||||
memcpy(&f->mask.lip[0], &mask, sizeof(u32));
|
||||
|
@ -111,7 +111,7 @@ static const struct cxgb4_match_field cxgb4_ipv4_fields[] = {
|
|||
|
||||
/* IPv6 match fields */
|
||||
static inline int cxgb4_fill_ipv6_tos(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
f->val.tos = (ntohl(val) >> 20) & 0x000000FF;
|
||||
f->mask.tos = (ntohl(mask) >> 20) & 0x000000FF;
|
||||
|
@ -120,7 +120,7 @@ static inline int cxgb4_fill_ipv6_tos(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_proto(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
f->val.proto = (ntohl(val) >> 8) & 0x000000FF;
|
||||
f->mask.proto = (ntohl(mask) >> 8) & 0x000000FF;
|
||||
|
@ -129,7 +129,7 @@ static inline int cxgb4_fill_ipv6_proto(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_src_ip0(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.fip[0], &val, sizeof(u32));
|
||||
memcpy(&f->mask.fip[0], &mask, sizeof(u32));
|
||||
|
@ -138,7 +138,7 @@ static inline int cxgb4_fill_ipv6_src_ip0(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_src_ip1(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.fip[4], &val, sizeof(u32));
|
||||
memcpy(&f->mask.fip[4], &mask, sizeof(u32));
|
||||
|
@ -147,7 +147,7 @@ static inline int cxgb4_fill_ipv6_src_ip1(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_src_ip2(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.fip[8], &val, sizeof(u32));
|
||||
memcpy(&f->mask.fip[8], &mask, sizeof(u32));
|
||||
|
@ -156,7 +156,7 @@ static inline int cxgb4_fill_ipv6_src_ip2(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_src_ip3(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.fip[12], &val, sizeof(u32));
|
||||
memcpy(&f->mask.fip[12], &mask, sizeof(u32));
|
||||
|
@ -165,7 +165,7 @@ static inline int cxgb4_fill_ipv6_src_ip3(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_dst_ip0(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.lip[0], &val, sizeof(u32));
|
||||
memcpy(&f->mask.lip[0], &mask, sizeof(u32));
|
||||
|
@ -174,7 +174,7 @@ static inline int cxgb4_fill_ipv6_dst_ip0(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_dst_ip1(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.lip[4], &val, sizeof(u32));
|
||||
memcpy(&f->mask.lip[4], &mask, sizeof(u32));
|
||||
|
@ -183,7 +183,7 @@ static inline int cxgb4_fill_ipv6_dst_ip1(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_dst_ip2(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.lip[8], &val, sizeof(u32));
|
||||
memcpy(&f->mask.lip[8], &mask, sizeof(u32));
|
||||
|
@ -192,7 +192,7 @@ static inline int cxgb4_fill_ipv6_dst_ip2(struct ch_filter_specification *f,
|
|||
}
|
||||
|
||||
static inline int cxgb4_fill_ipv6_dst_ip3(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
memcpy(&f->val.lip[12], &val, sizeof(u32));
|
||||
memcpy(&f->mask.lip[12], &mask, sizeof(u32));
|
||||
|
@ -216,7 +216,7 @@ static const struct cxgb4_match_field cxgb4_ipv6_fields[] = {
|
|||
|
||||
/* TCP/UDP match */
|
||||
static inline int cxgb4_fill_l4_ports(struct ch_filter_specification *f,
|
||||
u32 val, u32 mask)
|
||||
__be32 val, __be32 mask)
|
||||
{
|
||||
f->val.fport = ntohl(val) >> 16;
|
||||
f->mask.fport = ntohl(mask) >> 16;
|
||||
|
@ -237,19 +237,13 @@ static const struct cxgb4_match_field cxgb4_udp_fields[] = {
|
|||
};
|
||||
|
||||
struct cxgb4_next_header {
|
||||
unsigned int offset; /* Offset to next header */
|
||||
/* offset, shift, and mask added to offset above
|
||||
/* Offset, shift, and mask added to beginning of the header
|
||||
* to get to next header. Useful when using a header
|
||||
* field's value to jump to next header such as IHL field
|
||||
* in IPv4 header.
|
||||
*/
|
||||
unsigned int offoff;
|
||||
u32 shift;
|
||||
u32 mask;
|
||||
/* match criteria to make this jump */
|
||||
unsigned int match_off;
|
||||
u32 match_val;
|
||||
u32 match_mask;
|
||||
struct tc_u32_sel sel;
|
||||
struct tc_u32_key key;
|
||||
/* location of jump to make */
|
||||
const struct cxgb4_match_field *jump;
|
||||
};
|
||||
|
@ -258,26 +252,74 @@ struct cxgb4_next_header {
|
|||
* IPv4 header.
|
||||
*/
|
||||
static const struct cxgb4_next_header cxgb4_ipv4_jumps[] = {
|
||||
{ .offset = 0, .offoff = 0, .shift = 6, .mask = 0xF,
|
||||
.match_off = 8, .match_val = 0x600, .match_mask = 0xFF00,
|
||||
.jump = cxgb4_tcp_fields },
|
||||
{ .offset = 0, .offoff = 0, .shift = 6, .mask = 0xF,
|
||||
.match_off = 8, .match_val = 0x1100, .match_mask = 0xFF00,
|
||||
.jump = cxgb4_udp_fields },
|
||||
{ .jump = NULL }
|
||||
{
|
||||
/* TCP Jump */
|
||||
.sel = {
|
||||
.off = 0,
|
||||
.offoff = 0,
|
||||
.offshift = 6,
|
||||
.offmask = cpu_to_be16(0x0f00),
|
||||
},
|
||||
.key = {
|
||||
.off = 8,
|
||||
.val = cpu_to_be32(0x00060000),
|
||||
.mask = cpu_to_be32(0x00ff0000),
|
||||
},
|
||||
.jump = cxgb4_tcp_fields,
|
||||
},
|
||||
{
|
||||
/* UDP Jump */
|
||||
.sel = {
|
||||
.off = 0,
|
||||
.offoff = 0,
|
||||
.offshift = 6,
|
||||
.offmask = cpu_to_be16(0x0f00),
|
||||
},
|
||||
.key = {
|
||||
.off = 8,
|
||||
.val = cpu_to_be32(0x00110000),
|
||||
.mask = cpu_to_be32(0x00ff0000),
|
||||
},
|
||||
.jump = cxgb4_udp_fields,
|
||||
},
|
||||
{ .jump = NULL },
|
||||
};
|
||||
|
||||
/* Accept a rule with a jump directly past the 40 Bytes of IPv6 fixed header
|
||||
* to get to transport layer header.
|
||||
*/
|
||||
static const struct cxgb4_next_header cxgb4_ipv6_jumps[] = {
|
||||
{ .offset = 0x28, .offoff = 0, .shift = 0, .mask = 0,
|
||||
.match_off = 4, .match_val = 0x60000, .match_mask = 0xFF0000,
|
||||
.jump = cxgb4_tcp_fields },
|
||||
{ .offset = 0x28, .offoff = 0, .shift = 0, .mask = 0,
|
||||
.match_off = 4, .match_val = 0x110000, .match_mask = 0xFF0000,
|
||||
.jump = cxgb4_udp_fields },
|
||||
{ .jump = NULL }
|
||||
{
|
||||
/* TCP Jump */
|
||||
.sel = {
|
||||
.off = 40,
|
||||
.offoff = 0,
|
||||
.offshift = 0,
|
||||
.offmask = 0,
|
||||
},
|
||||
.key = {
|
||||
.off = 4,
|
||||
.val = cpu_to_be32(0x00000600),
|
||||
.mask = cpu_to_be32(0x0000ff00),
|
||||
},
|
||||
.jump = cxgb4_tcp_fields,
|
||||
},
|
||||
{
|
||||
/* UDP Jump */
|
||||
.sel = {
|
||||
.off = 40,
|
||||
.offoff = 0,
|
||||
.offshift = 0,
|
||||
.offmask = 0,
|
||||
},
|
||||
.key = {
|
||||
.off = 4,
|
||||
.val = cpu_to_be32(0x00001100),
|
||||
.mask = cpu_to_be32(0x0000ff00),
|
||||
},
|
||||
.jump = cxgb4_udp_fields,
|
||||
},
|
||||
{ .jump = NULL },
|
||||
};
|
||||
|
||||
struct cxgb4_link {
|
||||
|
|
|
@ -2742,7 +2742,7 @@ static noinline int t4_systim_to_hwstamp(struct adapter *adapter,
|
|||
|
||||
hwtstamps = skb_hwtstamps(skb);
|
||||
memset(hwtstamps, 0, sizeof(*hwtstamps));
|
||||
hwtstamps->hwtstamp = ns_to_ktime(be64_to_cpu(*((u64 *)data)));
|
||||
hwtstamps->hwtstamp = ns_to_ktime(get_unaligned_be64(data));
|
||||
|
||||
return RX_PTP_PKT_SUC;
|
||||
}
|
||||
|
|
|
@ -1338,7 +1338,7 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
|
|||
struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
|
||||
|
||||
if (pdata) {
|
||||
cancel_delayed_work(&pdata->carrier_check);
|
||||
cancel_delayed_work_sync(&pdata->carrier_check);
|
||||
netif_dbg(dev, ifdown, dev->net, "free pdata\n");
|
||||
kfree(pdata);
|
||||
pdata = NULL;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <trace/events/block.h>
|
||||
#include "nvme.h"
|
||||
|
@ -495,32 +496,48 @@ static ssize_t ana_state_show(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
DEVICE_ATTR_RO(ana_state);
|
||||
|
||||
static int nvme_set_ns_ana_state(struct nvme_ctrl *ctrl,
|
||||
static int nvme_lookup_ana_group_desc(struct nvme_ctrl *ctrl,
|
||||
struct nvme_ana_group_desc *desc, void *data)
|
||||
{
|
||||
struct nvme_ns *ns = data;
|
||||
struct nvme_ana_group_desc *dst = data;
|
||||
|
||||
if (ns->ana_grpid == le32_to_cpu(desc->grpid)) {
|
||||
nvme_update_ns_ana_state(desc, ns);
|
||||
return -ENXIO; /* just break out of the loop */
|
||||
}
|
||||
if (desc->grpid != dst->grpid)
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
*dst = *desc;
|
||||
return -ENXIO; /* just break out of the loop */
|
||||
}
|
||||
|
||||
void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id)
|
||||
{
|
||||
if (nvme_ctrl_use_ana(ns->ctrl)) {
|
||||
struct nvme_ana_group_desc desc = {
|
||||
.grpid = id->anagrpid,
|
||||
.state = 0,
|
||||
};
|
||||
|
||||
mutex_lock(&ns->ctrl->ana_lock);
|
||||
ns->ana_grpid = le32_to_cpu(id->anagrpid);
|
||||
nvme_parse_ana_log(ns->ctrl, ns, nvme_set_ns_ana_state);
|
||||
nvme_parse_ana_log(ns->ctrl, &desc, nvme_lookup_ana_group_desc);
|
||||
mutex_unlock(&ns->ctrl->ana_lock);
|
||||
if (desc.state) {
|
||||
/* found the group desc: update */
|
||||
nvme_update_ns_ana_state(&desc, ns);
|
||||
}
|
||||
} else {
|
||||
mutex_lock(&ns->head->lock);
|
||||
ns->ana_state = NVME_ANA_OPTIMIZED;
|
||||
nvme_mpath_set_live(ns);
|
||||
mutex_unlock(&ns->head->lock);
|
||||
}
|
||||
|
||||
if (bdi_cap_stable_pages_required(ns->queue->backing_dev_info)) {
|
||||
struct gendisk *disk = ns->head->disk;
|
||||
|
||||
if (disk)
|
||||
disk->queue->backing_dev_info->capabilities |=
|
||||
BDI_CAP_STABLE_WRITES;
|
||||
}
|
||||
}
|
||||
|
||||
void nvme_mpath_remove_disk(struct nvme_ns_head *head)
|
||||
|
|
|
@ -2853,6 +2853,7 @@ static void usbtest_disconnect(struct usb_interface *intf)
|
|||
|
||||
usb_set_intfdata(intf, NULL);
|
||||
dev_dbg(&intf->dev, "disconnect\n");
|
||||
kfree(dev->buf);
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
|
|
|
@ -10286,7 +10286,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
|||
path = btrfs_alloc_path();
|
||||
if (!path) {
|
||||
ret = -ENOMEM;
|
||||
goto out_put_group;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -10323,7 +10323,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
|||
ret = btrfs_orphan_add(trans, BTRFS_I(inode));
|
||||
if (ret) {
|
||||
btrfs_add_delayed_iput(inode);
|
||||
goto out_put_group;
|
||||
goto out;
|
||||
}
|
||||
clear_nlink(inode);
|
||||
/* One for the block groups ref */
|
||||
|
@ -10346,13 +10346,13 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
|||
|
||||
ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
|
||||
if (ret < 0)
|
||||
goto out_put_group;
|
||||
goto out;
|
||||
if (ret > 0)
|
||||
btrfs_release_path(path);
|
||||
if (ret == 0) {
|
||||
ret = btrfs_del_item(trans, tree_root, path);
|
||||
if (ret)
|
||||
goto out_put_group;
|
||||
goto out;
|
||||
btrfs_release_path(path);
|
||||
}
|
||||
|
||||
|
@ -10361,6 +10361,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
|||
&fs_info->block_group_cache_tree);
|
||||
RB_CLEAR_NODE(&block_group->cache_node);
|
||||
|
||||
/* Once for the block groups rbtree */
|
||||
btrfs_put_block_group(block_group);
|
||||
|
||||
if (fs_info->first_logical_byte == block_group->key.objectid)
|
||||
fs_info->first_logical_byte = (u64)-1;
|
||||
spin_unlock(&fs_info->block_group_cache_lock);
|
||||
|
@ -10494,10 +10497,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
|||
|
||||
ret = remove_block_group_free_space(trans, block_group);
|
||||
if (ret)
|
||||
goto out_put_group;
|
||||
|
||||
/* Once for the block groups rbtree */
|
||||
btrfs_put_block_group(block_group);
|
||||
goto out;
|
||||
|
||||
ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
|
||||
if (ret > 0)
|
||||
|
@ -10525,10 +10525,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
|
|||
free_extent_map(em);
|
||||
}
|
||||
|
||||
out_put_group:
|
||||
out:
|
||||
/* Once for the lookup reference */
|
||||
btrfs_put_block_group(block_group);
|
||||
out:
|
||||
btrfs_free_path(path);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -4601,9 +4601,14 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
|
|||
vol_info->nocase = master_tcon->nocase;
|
||||
vol_info->nohandlecache = master_tcon->nohandlecache;
|
||||
vol_info->local_lease = master_tcon->local_lease;
|
||||
vol_info->no_lease = master_tcon->no_lease;
|
||||
vol_info->resilient = master_tcon->use_resilient;
|
||||
vol_info->persistent = master_tcon->use_persistent;
|
||||
vol_info->no_linux_ext = !master_tcon->unix_ext;
|
||||
vol_info->linux_ext = master_tcon->posix_extensions;
|
||||
vol_info->sectype = master_tcon->ses->sectype;
|
||||
vol_info->sign = master_tcon->ses->sign;
|
||||
vol_info->seal = master_tcon->seal;
|
||||
|
||||
rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
|
||||
if (rc) {
|
||||
|
@ -4629,10 +4634,6 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
|
||||
if (tcon->posix_extensions)
|
||||
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
|
||||
|
||||
if (cap_unix(ses))
|
||||
reset_cifs_unix_caps(0, tcon, NULL, vol_info);
|
||||
|
||||
|
|
|
@ -1783,6 +1783,7 @@ cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
|
|||
FILE_UNIX_BASIC_INFO *info_buf_target;
|
||||
unsigned int xid;
|
||||
int rc, tmprc;
|
||||
bool new_target = d_really_is_negative(target_dentry);
|
||||
|
||||
if (flags & ~RENAME_NOREPLACE)
|
||||
return -EINVAL;
|
||||
|
@ -1859,8 +1860,13 @@ cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
|
|||
*/
|
||||
|
||||
unlink_target:
|
||||
/* Try unlinking the target dentry if it's not negative */
|
||||
if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
|
||||
/*
|
||||
* If the target dentry was created during the rename, try
|
||||
* unlinking it if it's not negative
|
||||
*/
|
||||
if (new_target &&
|
||||
d_really_is_positive(target_dentry) &&
|
||||
(rc == -EACCES || rc == -EEXIST)) {
|
||||
if (d_is_dir(target_dentry))
|
||||
tmprc = cifs_rmdir(target_dir, target_dentry);
|
||||
else
|
||||
|
|
|
@ -1206,6 +1206,9 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
iap->ia_mode = 0;
|
||||
iap->ia_mode = (iap->ia_mode & S_IALLUGO) | type;
|
||||
|
||||
if (!IS_POSIXACL(dirp))
|
||||
iap->ia_mode &= ~current_umask();
|
||||
|
||||
err = 0;
|
||||
host_err = 0;
|
||||
switch (type) {
|
||||
|
@ -1439,6 +1442,9 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (!IS_POSIXACL(dirp))
|
||||
iap->ia_mode &= ~current_umask();
|
||||
|
||||
host_err = vfs_create(dirp, dchild, iap->ia_mode, true);
|
||||
if (host_err < 0) {
|
||||
fh_drop_write(fhp);
|
||||
|
|
|
@ -34,8 +34,8 @@ struct alg_sock {
|
|||
|
||||
struct sock *parent;
|
||||
|
||||
unsigned int refcnt;
|
||||
unsigned int nokey_refcnt;
|
||||
atomic_t refcnt;
|
||||
atomic_t nokey_refcnt;
|
||||
|
||||
const struct af_alg_type *type;
|
||||
void *private;
|
||||
|
|
|
@ -489,6 +489,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,
|
|||
arch_kgdb_ops.disable_hw_break(regs);
|
||||
|
||||
acquirelock:
|
||||
rcu_read_lock();
|
||||
/*
|
||||
* Interrupts will be restored by the 'trap return' code, except when
|
||||
* single stepping.
|
||||
|
@ -545,6 +546,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,
|
|||
atomic_dec(&slaves_in_kgdb);
|
||||
dbg_touch_watchdogs();
|
||||
local_irq_restore(flags);
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
cpu_relax();
|
||||
|
@ -563,6 +565,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,
|
|||
raw_spin_unlock(&dbg_master_lock);
|
||||
dbg_touch_watchdogs();
|
||||
local_irq_restore(flags);
|
||||
rcu_read_unlock();
|
||||
|
||||
goto acquirelock;
|
||||
}
|
||||
|
@ -686,6 +689,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,
|
|||
raw_spin_unlock(&dbg_master_lock);
|
||||
dbg_touch_watchdogs();
|
||||
local_irq_restore(flags);
|
||||
rcu_read_unlock();
|
||||
|
||||
return kgdb_info[cpu].ret_state;
|
||||
}
|
||||
|
|
30
mm/slub.c
30
mm/slub.c
|
@ -652,6 +652,20 @@ static void slab_fix(struct kmem_cache *s, char *fmt, ...)
|
|||
va_end(args);
|
||||
}
|
||||
|
||||
static bool freelist_corrupted(struct kmem_cache *s, struct page *page,
|
||||
void *freelist, void *nextfree)
|
||||
{
|
||||
if ((s->flags & SLAB_CONSISTENCY_CHECKS) &&
|
||||
!check_valid_pointer(s, page, nextfree)) {
|
||||
object_err(s, page, freelist, "Freechain corrupt");
|
||||
freelist = NULL;
|
||||
slab_fix(s, "Isolate corrupted freechain");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p)
|
||||
{
|
||||
unsigned int off; /* Offset of last byte */
|
||||
|
@ -1351,6 +1365,11 @@ static inline void inc_slabs_node(struct kmem_cache *s, int node,
|
|||
static inline void dec_slabs_node(struct kmem_cache *s, int node,
|
||||
int objects) {}
|
||||
|
||||
static bool freelist_corrupted(struct kmem_cache *s, struct page *page,
|
||||
void *freelist, void *nextfree)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_SLUB_DEBUG */
|
||||
|
||||
/*
|
||||
|
@ -2042,6 +2061,14 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page,
|
|||
void *prior;
|
||||
unsigned long counters;
|
||||
|
||||
/*
|
||||
* If 'nextfree' is invalid, it is possible that the object at
|
||||
* 'freelist' is already corrupted. So isolate all objects
|
||||
* starting at 'freelist'.
|
||||
*/
|
||||
if (freelist_corrupted(s, page, freelist, nextfree))
|
||||
break;
|
||||
|
||||
do {
|
||||
prior = page->freelist;
|
||||
counters = page->counters;
|
||||
|
@ -5630,7 +5657,8 @@ static void memcg_propagate_slab_attrs(struct kmem_cache *s)
|
|||
*/
|
||||
if (buffer)
|
||||
buf = buffer;
|
||||
else if (root_cache->max_attr_size < ARRAY_SIZE(mbuf))
|
||||
else if (root_cache->max_attr_size < ARRAY_SIZE(mbuf) &&
|
||||
!IS_ENABLED(CONFIG_SLUB_STATS))
|
||||
buf = mbuf;
|
||||
else {
|
||||
buffer = (char *) get_zeroed_page(GFP_KERNEL);
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/huge_mm.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include "internal.h"
|
||||
|
||||
/*
|
||||
* swapper_space is a fiction, retained to simplify the path through
|
||||
|
@ -416,7 +417,7 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
|
|||
/*
|
||||
* call radix_tree_preload() while we can wait.
|
||||
*/
|
||||
err = radix_tree_maybe_preload(gfp_mask & GFP_KERNEL);
|
||||
err = radix_tree_maybe_preload(gfp_mask & GFP_RECLAIM_MASK);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in a new issue