Merge 5.10.3 into android12-5.10
Changes in 5.10.3 net: ipconfig: Avoid spurious blank lines in boot log x86/split-lock: Avoid returning with interrupts enabled exfat: Avoid allocating upcase table using kcalloc() soc/tegra: fuse: Fix index bug in get_process_id usb: mtu3: fix memory corruption in mtu3_debugfs_regset() USB: serial: option: add interface-number sanity check to flag handling USB: gadget: f_acm: add support for SuperSpeed Plus USB: gadget: f_midi: setup SuperSpeed Plus descriptors usb: gadget: f_fs: Re-use SS descriptors for SuperSpeedPlus USB: gadget: f_rndis: fix bitrate for SuperSpeed and above usb: chipidea: ci_hdrc_imx: Pass DISABLE_DEVICE_STREAMING flag to imx6ul ARM: dts: exynos: fix roles of USB 3.0 ports on Odroid XU ARM: dts: exynos: fix USB 3.0 VBUS control and over-current pins on Exynos5410 ARM: dts: exynos: fix USB 3.0 pins supply being turned off on Odroid XU coresight: tmc-etf: Fix NULL ptr dereference in tmc_enable_etf_sink_perf() coresight: tmc-etr: Check if page is valid before dma_map_page() coresight: tmc-etr: Fix barrier packet insertion for perf buffer coresight: etb10: Fix possible NULL ptr dereference in etb_enable_perf() coresight: etm4x: Skip setting LPOVERRIDE bit for qcom, skip-power-up coresight: etm4x: Fix accesses to TRCVMIDCTLR1 coresight: etm4x: Fix accesses to TRCCIDCTLR1 coresight: etm4x: Fix accesses to TRCPROCSELR coresight: etm4x: Handle TRCVIPCSSCTLR accesses f2fs: fix to seek incorrect data offset in inline data file f2fs: init dirty_secmap incorrectly scsi: megaraid_sas: Check user-provided offsets HID: i2c-hid: add Vero K147 to descriptor override serial_core: Check for port state when tty is in error state fscrypt: remove kernel-internal constants from UAPI header fscrypt: add fscrypt_is_nokey_name() ubifs: prevent creating duplicate encrypted filenames ext4: prevent creating duplicate encrypted filenames f2fs: prevent creating duplicate encrypted filenames Bluetooth: Fix slab-out-of-bounds read in hci_le_direct_adv_report_evt() quota: Sanity-check quota file headers on load fs: quota: fix array-index-out-of-bounds bug by passing correct argument to vfs_cleanup_quota_inode() media: msi2500: assign SPI bus number dynamically crypto: af_alg - avoid undefined behavior accessing salg_name nl80211: validate key indexes for cfg80211_registered_device md: fix a warning caused by a race between concurrent md_ioctl()s Linux 5.10.3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ia12e3bc535549040a55f8dfb70921d99882e79f5
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 2
|
SUBLEVEL = 3
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
|
@@ -327,6 +327,8 @@
|
|||||||
regulator-name = "vddq_lcd";
|
regulator-name = "vddq_lcd";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
|
/* Supplies also GPK and GPJ */
|
||||||
|
regulator-always-on;
|
||||||
};
|
};
|
||||||
|
|
||||||
ldo8_reg: LDO8 {
|
ldo8_reg: LDO8 {
|
||||||
@@ -637,11 +639,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&usbdrd_dwc3_0 {
|
&usbdrd_dwc3_0 {
|
||||||
dr_mode = "host";
|
dr_mode = "peripheral";
|
||||||
};
|
};
|
||||||
|
|
||||||
&usbdrd_dwc3_1 {
|
&usbdrd_dwc3_1 {
|
||||||
dr_mode = "peripheral";
|
dr_mode = "host";
|
||||||
};
|
};
|
||||||
|
|
||||||
&usbdrd3_0 {
|
&usbdrd3_0 {
|
||||||
|
@@ -560,6 +560,34 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
usb3_1_oc: usb3-1-oc {
|
||||||
|
samsung,pins = "gpk2-4", "gpk2-5";
|
||||||
|
samsung,pin-function = <EXYNOS_PIN_FUNC_2>;
|
||||||
|
samsung,pin-pud = <EXYNOS_PIN_PULL_UP>;
|
||||||
|
samsung,pin-drv = <EXYNOS5420_PIN_DRV_LV1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3_1_vbusctrl: usb3-1-vbusctrl {
|
||||||
|
samsung,pins = "gpk2-6", "gpk2-7";
|
||||||
|
samsung,pin-function = <EXYNOS_PIN_FUNC_2>;
|
||||||
|
samsung,pin-pud = <EXYNOS_PIN_PULL_DOWN>;
|
||||||
|
samsung,pin-drv = <EXYNOS5420_PIN_DRV_LV1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3_0_oc: usb3-0-oc {
|
||||||
|
samsung,pins = "gpk3-0", "gpk3-1";
|
||||||
|
samsung,pin-function = <EXYNOS_PIN_FUNC_2>;
|
||||||
|
samsung,pin-pud = <EXYNOS_PIN_PULL_UP>;
|
||||||
|
samsung,pin-drv = <EXYNOS5420_PIN_DRV_LV1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3_0_vbusctrl: usb3-0-vbusctrl {
|
||||||
|
samsung,pins = "gpk3-2", "gpk3-3";
|
||||||
|
samsung,pin-function = <EXYNOS_PIN_FUNC_2>;
|
||||||
|
samsung,pin-pud = <EXYNOS_PIN_PULL_DOWN>;
|
||||||
|
samsung,pin-drv = <EXYNOS5420_PIN_DRV_LV1>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&pinctrl_2 {
|
&pinctrl_2 {
|
||||||
|
@@ -390,6 +390,8 @@
|
|||||||
&usbdrd3_0 {
|
&usbdrd3_0 {
|
||||||
clocks = <&clock CLK_USBD300>;
|
clocks = <&clock CLK_USBD300>;
|
||||||
clock-names = "usbdrd30";
|
clock-names = "usbdrd30";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&usb3_0_oc>, <&usb3_0_vbusctrl>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&usbdrd_phy0 {
|
&usbdrd_phy0 {
|
||||||
@@ -401,6 +403,8 @@
|
|||||||
&usbdrd3_1 {
|
&usbdrd3_1 {
|
||||||
clocks = <&clock CLK_USBD301>;
|
clocks = <&clock CLK_USBD301>;
|
||||||
clock-names = "usbdrd30";
|
clock-names = "usbdrd30";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&usb3_1_oc>, <&usb3_1_vbusctrl>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&usbdrd_dwc3_1 {
|
&usbdrd_dwc3_1 {
|
||||||
|
@@ -299,11 +299,12 @@ DEFINE_IDTENTRY_ERRORCODE(exc_alignment_check)
|
|||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
if (handle_user_split_lock(regs, error_code))
|
if (handle_user_split_lock(regs, error_code))
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
do_trap(X86_TRAP_AC, SIGBUS, "alignment check", regs,
|
do_trap(X86_TRAP_AC, SIGBUS, "alignment check", regs,
|
||||||
error_code, BUS_ADRALN, NULL);
|
error_code, BUS_ADRALN, NULL);
|
||||||
|
|
||||||
|
out:
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -147,7 +147,7 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|||||||
const u32 allowed = CRYPTO_ALG_KERN_DRIVER_ONLY;
|
const u32 allowed = CRYPTO_ALG_KERN_DRIVER_ONLY;
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
struct alg_sock *ask = alg_sk(sk);
|
struct alg_sock *ask = alg_sk(sk);
|
||||||
struct sockaddr_alg *sa = (void *)uaddr;
|
struct sockaddr_alg_new *sa = (void *)uaddr;
|
||||||
const struct af_alg_type *type;
|
const struct af_alg_type *type;
|
||||||
void *private;
|
void *private;
|
||||||
int err;
|
int err;
|
||||||
@@ -155,7 +155,11 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|||||||
if (sock->state == SS_CONNECTED)
|
if (sock->state == SS_CONNECTED)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (addr_len < sizeof(*sa))
|
BUILD_BUG_ON(offsetof(struct sockaddr_alg_new, salg_name) !=
|
||||||
|
offsetof(struct sockaddr_alg, salg_name));
|
||||||
|
BUILD_BUG_ON(offsetof(struct sockaddr_alg, salg_name) != sizeof(*sa));
|
||||||
|
|
||||||
|
if (addr_len < sizeof(*sa) + 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* If caller uses non-allowed flag, return error. */
|
/* If caller uses non-allowed flag, return error. */
|
||||||
@@ -163,7 +167,7 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
sa->salg_type[sizeof(sa->salg_type) - 1] = 0;
|
sa->salg_type[sizeof(sa->salg_type) - 1] = 0;
|
||||||
sa->salg_name[sizeof(sa->salg_name) + addr_len - sizeof(*sa) - 1] = 0;
|
sa->salg_name[addr_len - sizeof(*sa) - 1] = 0;
|
||||||
|
|
||||||
type = alg_get_type(sa->salg_type);
|
type = alg_get_type(sa->salg_type);
|
||||||
if (PTR_ERR(type) == -ENOENT) {
|
if (PTR_ERR(type) == -ENOENT) {
|
||||||
|
@@ -405,6 +405,14 @@ static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = {
|
|||||||
},
|
},
|
||||||
.driver_data = (void *)&sipodev_desc
|
.driver_data = (void *)&sipodev_desc
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Vero K147",
|
||||||
|
.matches = {
|
||||||
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "VERO"),
|
||||||
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "K147"),
|
||||||
|
},
|
||||||
|
.driver_data = (void *)&sipodev_desc
|
||||||
|
},
|
||||||
{ } /* Terminate list */
|
{ } /* Terminate list */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -176,6 +176,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
|
struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
|
||||||
struct perf_output_handle *handle = data;
|
struct perf_output_handle *handle = data;
|
||||||
|
struct cs_buffers *buf = etm_perf_sink_config(handle);
|
||||||
|
|
||||||
spin_lock_irqsave(&drvdata->spinlock, flags);
|
spin_lock_irqsave(&drvdata->spinlock, flags);
|
||||||
|
|
||||||
@@ -186,7 +187,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get a handle on the pid of the process to monitor */
|
/* Get a handle on the pid of the process to monitor */
|
||||||
pid = task_pid_nr(handle->event->owner);
|
pid = buf->pid;
|
||||||
|
|
||||||
if (drvdata->pid != -1 && drvdata->pid != pid) {
|
if (drvdata->pid != -1 && drvdata->pid != pid) {
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
@@ -383,6 +384,7 @@ static void *etb_alloc_buffer(struct coresight_device *csdev,
|
|||||||
if (!buf)
|
if (!buf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
buf->pid = task_pid_nr(event->owner);
|
||||||
buf->snapshot = overwrite;
|
buf->snapshot = overwrite;
|
||||||
buf->nr_pages = nr_pages;
|
buf->nr_pages = nr_pages;
|
||||||
buf->data_pages = pages;
|
buf->data_pages = pages;
|
||||||
|
@@ -124,7 +124,7 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
|
|||||||
if (coresight_timeout(drvdata->base, TRCSTATR, TRCSTATR_IDLE_BIT, 1))
|
if (coresight_timeout(drvdata->base, TRCSTATR, TRCSTATR_IDLE_BIT, 1))
|
||||||
dev_err(etm_dev,
|
dev_err(etm_dev,
|
||||||
"timeout while waiting for Idle Trace Status\n");
|
"timeout while waiting for Idle Trace Status\n");
|
||||||
|
if (drvdata->nr_pe)
|
||||||
writel_relaxed(config->pe_sel, drvdata->base + TRCPROCSELR);
|
writel_relaxed(config->pe_sel, drvdata->base + TRCPROCSELR);
|
||||||
writel_relaxed(config->cfg, drvdata->base + TRCCONFIGR);
|
writel_relaxed(config->cfg, drvdata->base + TRCCONFIGR);
|
||||||
/* nothing specific implemented */
|
/* nothing specific implemented */
|
||||||
@@ -141,6 +141,7 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
|
|||||||
writel_relaxed(config->viiectlr, drvdata->base + TRCVIIECTLR);
|
writel_relaxed(config->viiectlr, drvdata->base + TRCVIIECTLR);
|
||||||
writel_relaxed(config->vissctlr,
|
writel_relaxed(config->vissctlr,
|
||||||
drvdata->base + TRCVISSCTLR);
|
drvdata->base + TRCVISSCTLR);
|
||||||
|
if (drvdata->nr_pe_cmp)
|
||||||
writel_relaxed(config->vipcssctlr,
|
writel_relaxed(config->vipcssctlr,
|
||||||
drvdata->base + TRCVIPCSSCTLR);
|
drvdata->base + TRCVIPCSSCTLR);
|
||||||
for (i = 0; i < drvdata->nrseqstate - 1; i++)
|
for (i = 0; i < drvdata->nrseqstate - 1; i++)
|
||||||
@@ -187,12 +188,14 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
|
|||||||
writeq_relaxed(config->ctxid_pid[i],
|
writeq_relaxed(config->ctxid_pid[i],
|
||||||
drvdata->base + TRCCIDCVRn(i));
|
drvdata->base + TRCCIDCVRn(i));
|
||||||
writel_relaxed(config->ctxid_mask0, drvdata->base + TRCCIDCCTLR0);
|
writel_relaxed(config->ctxid_mask0, drvdata->base + TRCCIDCCTLR0);
|
||||||
|
if (drvdata->numcidc > 4)
|
||||||
writel_relaxed(config->ctxid_mask1, drvdata->base + TRCCIDCCTLR1);
|
writel_relaxed(config->ctxid_mask1, drvdata->base + TRCCIDCCTLR1);
|
||||||
|
|
||||||
for (i = 0; i < drvdata->numvmidc; i++)
|
for (i = 0; i < drvdata->numvmidc; i++)
|
||||||
writeq_relaxed(config->vmid_val[i],
|
writeq_relaxed(config->vmid_val[i],
|
||||||
drvdata->base + TRCVMIDCVRn(i));
|
drvdata->base + TRCVMIDCVRn(i));
|
||||||
writel_relaxed(config->vmid_mask0, drvdata->base + TRCVMIDCCTLR0);
|
writel_relaxed(config->vmid_mask0, drvdata->base + TRCVMIDCCTLR0);
|
||||||
|
if (drvdata->numvmidc > 4)
|
||||||
writel_relaxed(config->vmid_mask1, drvdata->base + TRCVMIDCCTLR1);
|
writel_relaxed(config->vmid_mask1, drvdata->base + TRCVMIDCCTLR1);
|
||||||
|
|
||||||
if (!drvdata->skip_power_up) {
|
if (!drvdata->skip_power_up) {
|
||||||
@@ -779,7 +782,7 @@ static void etm4_init_arch_data(void *info)
|
|||||||
* LPOVERRIDE, bit[23] implementation supports
|
* LPOVERRIDE, bit[23] implementation supports
|
||||||
* low-power state override
|
* low-power state override
|
||||||
*/
|
*/
|
||||||
if (BMVAL(etmidr5, 23, 23))
|
if (BMVAL(etmidr5, 23, 23) && (!drvdata->skip_power_up))
|
||||||
drvdata->lpoverride = true;
|
drvdata->lpoverride = true;
|
||||||
else
|
else
|
||||||
drvdata->lpoverride = false;
|
drvdata->lpoverride = false;
|
||||||
@@ -1178,6 +1181,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
|
|||||||
state = drvdata->save_state;
|
state = drvdata->save_state;
|
||||||
|
|
||||||
state->trcprgctlr = readl(drvdata->base + TRCPRGCTLR);
|
state->trcprgctlr = readl(drvdata->base + TRCPRGCTLR);
|
||||||
|
if (drvdata->nr_pe)
|
||||||
state->trcprocselr = readl(drvdata->base + TRCPROCSELR);
|
state->trcprocselr = readl(drvdata->base + TRCPROCSELR);
|
||||||
state->trcconfigr = readl(drvdata->base + TRCCONFIGR);
|
state->trcconfigr = readl(drvdata->base + TRCCONFIGR);
|
||||||
state->trcauxctlr = readl(drvdata->base + TRCAUXCTLR);
|
state->trcauxctlr = readl(drvdata->base + TRCAUXCTLR);
|
||||||
@@ -1194,6 +1198,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
|
|||||||
state->trcvictlr = readl(drvdata->base + TRCVICTLR);
|
state->trcvictlr = readl(drvdata->base + TRCVICTLR);
|
||||||
state->trcviiectlr = readl(drvdata->base + TRCVIIECTLR);
|
state->trcviiectlr = readl(drvdata->base + TRCVIIECTLR);
|
||||||
state->trcvissctlr = readl(drvdata->base + TRCVISSCTLR);
|
state->trcvissctlr = readl(drvdata->base + TRCVISSCTLR);
|
||||||
|
if (drvdata->nr_pe_cmp)
|
||||||
state->trcvipcssctlr = readl(drvdata->base + TRCVIPCSSCTLR);
|
state->trcvipcssctlr = readl(drvdata->base + TRCVIPCSSCTLR);
|
||||||
state->trcvdctlr = readl(drvdata->base + TRCVDCTLR);
|
state->trcvdctlr = readl(drvdata->base + TRCVDCTLR);
|
||||||
state->trcvdsacctlr = readl(drvdata->base + TRCVDSACCTLR);
|
state->trcvdsacctlr = readl(drvdata->base + TRCVDSACCTLR);
|
||||||
@@ -1240,9 +1245,11 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
|
|||||||
state->trcvmidcvr[i] = readq(drvdata->base + TRCVMIDCVRn(i));
|
state->trcvmidcvr[i] = readq(drvdata->base + TRCVMIDCVRn(i));
|
||||||
|
|
||||||
state->trccidcctlr0 = readl(drvdata->base + TRCCIDCCTLR0);
|
state->trccidcctlr0 = readl(drvdata->base + TRCCIDCCTLR0);
|
||||||
|
if (drvdata->numcidc > 4)
|
||||||
state->trccidcctlr1 = readl(drvdata->base + TRCCIDCCTLR1);
|
state->trccidcctlr1 = readl(drvdata->base + TRCCIDCCTLR1);
|
||||||
|
|
||||||
state->trcvmidcctlr0 = readl(drvdata->base + TRCVMIDCCTLR0);
|
state->trcvmidcctlr0 = readl(drvdata->base + TRCVMIDCCTLR0);
|
||||||
|
if (drvdata->numvmidc > 4)
|
||||||
state->trcvmidcctlr1 = readl(drvdata->base + TRCVMIDCCTLR1);
|
state->trcvmidcctlr1 = readl(drvdata->base + TRCVMIDCCTLR1);
|
||||||
|
|
||||||
state->trcclaimset = readl(drvdata->base + TRCCLAIMCLR);
|
state->trcclaimset = readl(drvdata->base + TRCCLAIMCLR);
|
||||||
@@ -1283,6 +1290,7 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
|
|||||||
writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET);
|
writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET);
|
||||||
|
|
||||||
writel_relaxed(state->trcprgctlr, drvdata->base + TRCPRGCTLR);
|
writel_relaxed(state->trcprgctlr, drvdata->base + TRCPRGCTLR);
|
||||||
|
if (drvdata->nr_pe)
|
||||||
writel_relaxed(state->trcprocselr, drvdata->base + TRCPROCSELR);
|
writel_relaxed(state->trcprocselr, drvdata->base + TRCPROCSELR);
|
||||||
writel_relaxed(state->trcconfigr, drvdata->base + TRCCONFIGR);
|
writel_relaxed(state->trcconfigr, drvdata->base + TRCCONFIGR);
|
||||||
writel_relaxed(state->trcauxctlr, drvdata->base + TRCAUXCTLR);
|
writel_relaxed(state->trcauxctlr, drvdata->base + TRCAUXCTLR);
|
||||||
@@ -1299,6 +1307,7 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
|
|||||||
writel_relaxed(state->trcvictlr, drvdata->base + TRCVICTLR);
|
writel_relaxed(state->trcvictlr, drvdata->base + TRCVICTLR);
|
||||||
writel_relaxed(state->trcviiectlr, drvdata->base + TRCVIIECTLR);
|
writel_relaxed(state->trcviiectlr, drvdata->base + TRCVIIECTLR);
|
||||||
writel_relaxed(state->trcvissctlr, drvdata->base + TRCVISSCTLR);
|
writel_relaxed(state->trcvissctlr, drvdata->base + TRCVISSCTLR);
|
||||||
|
if (drvdata->nr_pe_cmp)
|
||||||
writel_relaxed(state->trcvipcssctlr, drvdata->base + TRCVIPCSSCTLR);
|
writel_relaxed(state->trcvipcssctlr, drvdata->base + TRCVIPCSSCTLR);
|
||||||
writel_relaxed(state->trcvdctlr, drvdata->base + TRCVDCTLR);
|
writel_relaxed(state->trcvdctlr, drvdata->base + TRCVDCTLR);
|
||||||
writel_relaxed(state->trcvdsacctlr, drvdata->base + TRCVDSACCTLR);
|
writel_relaxed(state->trcvdsacctlr, drvdata->base + TRCVDSACCTLR);
|
||||||
@@ -1350,9 +1359,11 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
|
|||||||
drvdata->base + TRCVMIDCVRn(i));
|
drvdata->base + TRCVMIDCVRn(i));
|
||||||
|
|
||||||
writel_relaxed(state->trccidcctlr0, drvdata->base + TRCCIDCCTLR0);
|
writel_relaxed(state->trccidcctlr0, drvdata->base + TRCCIDCCTLR0);
|
||||||
|
if (drvdata->numcidc > 4)
|
||||||
writel_relaxed(state->trccidcctlr1, drvdata->base + TRCCIDCCTLR1);
|
writel_relaxed(state->trccidcctlr1, drvdata->base + TRCCIDCCTLR1);
|
||||||
|
|
||||||
writel_relaxed(state->trcvmidcctlr0, drvdata->base + TRCVMIDCCTLR0);
|
writel_relaxed(state->trcvmidcctlr0, drvdata->base + TRCVMIDCCTLR0);
|
||||||
|
if (drvdata->numvmidc > 4)
|
||||||
writel_relaxed(state->trcvmidcctlr1, drvdata->base + TRCVMIDCCTLR1);
|
writel_relaxed(state->trcvmidcctlr1, drvdata->base + TRCVMIDCCTLR1);
|
||||||
|
|
||||||
writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET);
|
writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET);
|
||||||
|
@@ -87,6 +87,7 @@ enum cs_mode {
|
|||||||
* struct cs_buffer - keep track of a recording session' specifics
|
* struct cs_buffer - keep track of a recording session' specifics
|
||||||
* @cur: index of the current buffer
|
* @cur: index of the current buffer
|
||||||
* @nr_pages: max number of pages granted to us
|
* @nr_pages: max number of pages granted to us
|
||||||
|
* @pid: PID this cs_buffer belongs to
|
||||||
* @offset: offset within the current buffer
|
* @offset: offset within the current buffer
|
||||||
* @data_size: how much we collected in this run
|
* @data_size: how much we collected in this run
|
||||||
* @snapshot: is this run in snapshot mode
|
* @snapshot: is this run in snapshot mode
|
||||||
@@ -95,6 +96,7 @@ enum cs_mode {
|
|||||||
struct cs_buffers {
|
struct cs_buffers {
|
||||||
unsigned int cur;
|
unsigned int cur;
|
||||||
unsigned int nr_pages;
|
unsigned int nr_pages;
|
||||||
|
pid_t pid;
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
local_t data_size;
|
local_t data_size;
|
||||||
bool snapshot;
|
bool snapshot;
|
||||||
|
@@ -227,6 +227,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
|
struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
|
||||||
struct perf_output_handle *handle = data;
|
struct perf_output_handle *handle = data;
|
||||||
|
struct cs_buffers *buf = etm_perf_sink_config(handle);
|
||||||
|
|
||||||
spin_lock_irqsave(&drvdata->spinlock, flags);
|
spin_lock_irqsave(&drvdata->spinlock, flags);
|
||||||
do {
|
do {
|
||||||
@@ -243,7 +244,7 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get a handle on the pid of the process to monitor */
|
/* Get a handle on the pid of the process to monitor */
|
||||||
pid = task_pid_nr(handle->event->owner);
|
pid = buf->pid;
|
||||||
|
|
||||||
if (drvdata->pid != -1 && drvdata->pid != pid) {
|
if (drvdata->pid != -1 && drvdata->pid != pid) {
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
@@ -399,6 +400,7 @@ static void *tmc_alloc_etf_buffer(struct coresight_device *csdev,
|
|||||||
if (!buf)
|
if (!buf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
buf->pid = task_pid_nr(event->owner);
|
||||||
buf->snapshot = overwrite;
|
buf->snapshot = overwrite;
|
||||||
buf->nr_pages = nr_pages;
|
buf->nr_pages = nr_pages;
|
||||||
buf->data_pages = pages;
|
buf->data_pages = pages;
|
||||||
|
@@ -217,6 +217,8 @@ static int tmc_pages_alloc(struct tmc_pages *tmc_pages,
|
|||||||
} else {
|
} else {
|
||||||
page = alloc_pages_node(node,
|
page = alloc_pages_node(node,
|
||||||
GFP_KERNEL | __GFP_ZERO, 0);
|
GFP_KERNEL | __GFP_ZERO, 0);
|
||||||
|
if (!page)
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
paddr = dma_map_page(real_dev, page, 0, PAGE_SIZE, dir);
|
paddr = dma_map_page(real_dev, page, 0, PAGE_SIZE, dir);
|
||||||
if (dma_mapping_error(real_dev, paddr))
|
if (dma_mapping_error(real_dev, paddr))
|
||||||
@@ -1550,7 +1552,7 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
|
|||||||
|
|
||||||
/* Insert barrier packets at the beginning, if there was an overflow */
|
/* Insert barrier packets at the beginning, if there was an overflow */
|
||||||
if (lost)
|
if (lost)
|
||||||
tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
|
tmc_etr_buf_insert_barrier_packet(etr_buf, offset);
|
||||||
tmc_etr_sync_perf_buffer(etr_perf, offset, size);
|
tmc_etr_sync_perf_buffer(etr_perf, offset, size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -7590,8 +7590,11 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
|
|||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
WARN_ON_ONCE(test_bit(MD_CLOSING, &mddev->flags));
|
if (test_and_set_bit(MD_CLOSING, &mddev->flags)) {
|
||||||
set_bit(MD_CLOSING, &mddev->flags);
|
mutex_unlock(&mddev->open_mutex);
|
||||||
|
err = -EBUSY;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
did_set_md_closing = true;
|
did_set_md_closing = true;
|
||||||
mutex_unlock(&mddev->open_mutex);
|
mutex_unlock(&mddev->open_mutex);
|
||||||
sync_blockdev(bdev);
|
sync_blockdev(bdev);
|
||||||
|
@@ -1230,7 +1230,7 @@ static int msi2500_probe(struct usb_interface *intf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
dev->master = master;
|
dev->master = master;
|
||||||
master->bus_num = 0;
|
master->bus_num = -1;
|
||||||
master->num_chipselect = 1;
|
master->num_chipselect = 1;
|
||||||
master->transfer_one_message = msi2500_transfer_one_message;
|
master->transfer_one_message = msi2500_transfer_one_message;
|
||||||
spi_master_set_devdata(master, dev);
|
spi_master_set_devdata(master, dev);
|
||||||
|
@@ -8095,7 +8095,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
|
|||||||
int error = 0, i;
|
int error = 0, i;
|
||||||
void *sense = NULL;
|
void *sense = NULL;
|
||||||
dma_addr_t sense_handle;
|
dma_addr_t sense_handle;
|
||||||
unsigned long *sense_ptr;
|
void *sense_ptr;
|
||||||
u32 opcode = 0;
|
u32 opcode = 0;
|
||||||
int ret = DCMD_SUCCESS;
|
int ret = DCMD_SUCCESS;
|
||||||
|
|
||||||
@@ -8218,6 +8218,13 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ioc->sense_len) {
|
if (ioc->sense_len) {
|
||||||
|
/* make sure the pointer is part of the frame */
|
||||||
|
if (ioc->sense_off >
|
||||||
|
(sizeof(union megasas_frame) - sizeof(__le64))) {
|
||||||
|
error = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len,
|
sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len,
|
||||||
&sense_handle, GFP_KERNEL);
|
&sense_handle, GFP_KERNEL);
|
||||||
if (!sense) {
|
if (!sense) {
|
||||||
@@ -8225,12 +8232,11 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
sense_ptr =
|
sense_ptr = (void *)cmd->frame + ioc->sense_off;
|
||||||
(unsigned long *) ((unsigned long)cmd->frame + ioc->sense_off);
|
|
||||||
if (instance->consistent_mask_64bit)
|
if (instance->consistent_mask_64bit)
|
||||||
*sense_ptr = cpu_to_le64(sense_handle);
|
put_unaligned_le64(sense_handle, sense_ptr);
|
||||||
else
|
else
|
||||||
*sense_ptr = cpu_to_le32(sense_handle);
|
put_unaligned_le32(sense_handle, sense_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -94,7 +94,7 @@ static int get_process_id(int value, const u32 *speedos, unsigned int num)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for (i = 0; i < num; i++)
|
||||||
if (value < speedos[num])
|
if (value < speedos[i])
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@@ -1467,6 +1467,10 @@ static void uart_set_ldisc(struct tty_struct *tty)
|
|||||||
{
|
{
|
||||||
struct uart_state *state = tty->driver_data;
|
struct uart_state *state = tty->driver_data;
|
||||||
struct uart_port *uport;
|
struct uart_port *uport;
|
||||||
|
struct tty_port *port = &state->port;
|
||||||
|
|
||||||
|
if (!tty_port_initialized(port))
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_lock(&state->port.mutex);
|
mutex_lock(&state->port.mutex);
|
||||||
uport = uart_port_check(state);
|
uport = uart_port_check(state);
|
||||||
|
@@ -57,7 +57,8 @@ static const struct ci_hdrc_imx_platform_flag imx6sx_usb_data = {
|
|||||||
|
|
||||||
static const struct ci_hdrc_imx_platform_flag imx6ul_usb_data = {
|
static const struct ci_hdrc_imx_platform_flag imx6ul_usb_data = {
|
||||||
.flags = CI_HDRC_SUPPORTS_RUNTIME_PM |
|
.flags = CI_HDRC_SUPPORTS_RUNTIME_PM |
|
||||||
CI_HDRC_TURN_VBUS_EARLY_ON,
|
CI_HDRC_TURN_VBUS_EARLY_ON |
|
||||||
|
CI_HDRC_DISABLE_DEVICE_STREAMING,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ci_hdrc_imx_platform_flag imx7d_usb_data = {
|
static const struct ci_hdrc_imx_platform_flag imx7d_usb_data = {
|
||||||
|
@@ -1329,6 +1329,7 @@ static long ffs_epfile_ioctl(struct file *file, unsigned code,
|
|||||||
switch (epfile->ffs->gadget->speed) {
|
switch (epfile->ffs->gadget->speed) {
|
||||||
case USB_SPEED_SUPER_PLUS:
|
case USB_SPEED_SUPER_PLUS:
|
||||||
case USB_SPEED_SUPER:
|
case USB_SPEED_SUPER:
|
||||||
|
case USB_SPEED_SUPER_PLUS:
|
||||||
desc_idx = 2;
|
desc_idx = 2;
|
||||||
break;
|
break;
|
||||||
case USB_SPEED_HIGH:
|
case USB_SPEED_HIGH:
|
||||||
@@ -3175,7 +3176,8 @@ static int _ffs_func_bind(struct usb_configuration *c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (likely(super)) {
|
if (likely(super)) {
|
||||||
func->function.ss_descriptors = vla_ptr(vlabuf, d, ss_descs);
|
func->function.ss_descriptors = func->function.ssp_descriptors =
|
||||||
|
vla_ptr(vlabuf, d, ss_descs);
|
||||||
ss_len = ffs_do_descs(ffs->ss_descs_count,
|
ss_len = ffs_do_descs(ffs->ss_descs_count,
|
||||||
vla_ptr(vlabuf, d, raw_descs) + fs_len + hs_len,
|
vla_ptr(vlabuf, d, raw_descs) + fs_len + hs_len,
|
||||||
d_raw_descs__sz - fs_len - hs_len,
|
d_raw_descs__sz - fs_len - hs_len,
|
||||||
@@ -3589,6 +3591,7 @@ static void ffs_func_unbind(struct usb_configuration *c,
|
|||||||
func->function.fs_descriptors = NULL;
|
func->function.fs_descriptors = NULL;
|
||||||
func->function.hs_descriptors = NULL;
|
func->function.hs_descriptors = NULL;
|
||||||
func->function.ss_descriptors = NULL;
|
func->function.ss_descriptors = NULL;
|
||||||
|
func->function.ssp_descriptors = NULL;
|
||||||
func->interfaces_nums = NULL;
|
func->interfaces_nums = NULL;
|
||||||
|
|
||||||
ffs_event_add(ffs, FUNCTIONFS_UNBIND);
|
ffs_event_add(ffs, FUNCTIONFS_UNBIND);
|
||||||
|
@@ -1048,6 +1048,7 @@ static int f_midi_bind(struct usb_configuration *c, struct usb_function *f)
|
|||||||
f->ss_descriptors = usb_copy_descriptors(midi_function);
|
f->ss_descriptors = usb_copy_descriptors(midi_function);
|
||||||
if (!f->ss_descriptors)
|
if (!f->ss_descriptors)
|
||||||
goto fail_f_midi;
|
goto fail_f_midi;
|
||||||
|
|
||||||
if (gadget_is_superspeed_plus(c->cdev->gadget)) {
|
if (gadget_is_superspeed_plus(c->cdev->gadget)) {
|
||||||
f->ssp_descriptors = usb_copy_descriptors(midi_function);
|
f->ssp_descriptors = usb_copy_descriptors(midi_function);
|
||||||
if (!f->ssp_descriptors)
|
if (!f->ssp_descriptors)
|
||||||
|
@@ -127,7 +127,7 @@ static void mtu3_debugfs_regset(struct mtu3 *mtu, void __iomem *base,
|
|||||||
struct debugfs_regset32 *regset;
|
struct debugfs_regset32 *regset;
|
||||||
struct mtu3_regset *mregs;
|
struct mtu3_regset *mregs;
|
||||||
|
|
||||||
mregs = devm_kzalloc(mtu->dev, sizeof(*regset), GFP_KERNEL);
|
mregs = devm_kzalloc(mtu->dev, sizeof(*mregs), GFP_KERNEL);
|
||||||
if (!mregs)
|
if (!mregs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@@ -563,6 +563,9 @@ static void option_instat_callback(struct urb *urb);
|
|||||||
|
|
||||||
/* Device flags */
|
/* Device flags */
|
||||||
|
|
||||||
|
/* Highest interface number which can be used with NCTRL() and RSVD() */
|
||||||
|
#define FLAG_IFNUM_MAX 7
|
||||||
|
|
||||||
/* Interface does not support modem-control requests */
|
/* Interface does not support modem-control requests */
|
||||||
#define NCTRL(ifnum) ((BIT(ifnum) & 0xff) << 8)
|
#define NCTRL(ifnum) ((BIT(ifnum) & 0xff) << 8)
|
||||||
|
|
||||||
@@ -2101,6 +2104,14 @@ static struct usb_serial_driver * const serial_drivers[] = {
|
|||||||
|
|
||||||
module_usb_serial_driver(serial_drivers, option_ids);
|
module_usb_serial_driver(serial_drivers, option_ids);
|
||||||
|
|
||||||
|
static bool iface_is_reserved(unsigned long device_flags, u8 ifnum)
|
||||||
|
{
|
||||||
|
if (ifnum > FLAG_IFNUM_MAX)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return device_flags & RSVD(ifnum);
|
||||||
|
}
|
||||||
|
|
||||||
static int option_probe(struct usb_serial *serial,
|
static int option_probe(struct usb_serial *serial,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
@@ -2117,7 +2128,7 @@ static int option_probe(struct usb_serial *serial,
|
|||||||
* the same class/subclass/protocol as the serial interfaces. Look at
|
* the same class/subclass/protocol as the serial interfaces. Look at
|
||||||
* the Windows driver .INF files for reserved interface numbers.
|
* the Windows driver .INF files for reserved interface numbers.
|
||||||
*/
|
*/
|
||||||
if (device_flags & RSVD(iface_desc->bInterfaceNumber))
|
if (iface_is_reserved(device_flags, iface_desc->bInterfaceNumber))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2133,6 +2144,14 @@ static int option_probe(struct usb_serial *serial,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool iface_no_modem_control(unsigned long device_flags, u8 ifnum)
|
||||||
|
{
|
||||||
|
if (ifnum > FLAG_IFNUM_MAX)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return device_flags & NCTRL(ifnum);
|
||||||
|
}
|
||||||
|
|
||||||
static int option_attach(struct usb_serial *serial)
|
static int option_attach(struct usb_serial *serial)
|
||||||
{
|
{
|
||||||
struct usb_interface_descriptor *iface_desc;
|
struct usb_interface_descriptor *iface_desc;
|
||||||
@@ -2148,7 +2167,7 @@ static int option_attach(struct usb_serial *serial)
|
|||||||
|
|
||||||
iface_desc = &serial->interface->cur_altsetting->desc;
|
iface_desc = &serial->interface->cur_altsetting->desc;
|
||||||
|
|
||||||
if (!(device_flags & NCTRL(iface_desc->bInterfaceNumber)))
|
if (!iface_no_modem_control(device_flags, iface_desc->bInterfaceNumber))
|
||||||
data->use_send_setup = 1;
|
data->use_send_setup = 1;
|
||||||
|
|
||||||
if (device_flags & ZLP)
|
if (device_flags & ZLP)
|
||||||
|
@@ -27,6 +27,9 @@
|
|||||||
#define FSCRYPT_CONTEXT_V1 1
|
#define FSCRYPT_CONTEXT_V1 1
|
||||||
#define FSCRYPT_CONTEXT_V2 2
|
#define FSCRYPT_CONTEXT_V2 2
|
||||||
|
|
||||||
|
/* Keep this in sync with include/uapi/linux/fscrypt.h */
|
||||||
|
#define FSCRYPT_MODE_MAX FSCRYPT_MODE_ADIANTUM
|
||||||
|
|
||||||
struct fscrypt_context_v1 {
|
struct fscrypt_context_v1 {
|
||||||
u8 version; /* FSCRYPT_CONTEXT_V1 */
|
u8 version; /* FSCRYPT_CONTEXT_V1 */
|
||||||
u8 contents_encryption_mode;
|
u8 contents_encryption_mode;
|
||||||
@@ -521,9 +524,9 @@ struct fscrypt_master_key {
|
|||||||
* Per-mode encryption keys for the various types of encryption policies
|
* Per-mode encryption keys for the various types of encryption policies
|
||||||
* that use them. Allocated and derived on-demand.
|
* that use them. Allocated and derived on-demand.
|
||||||
*/
|
*/
|
||||||
struct fscrypt_prepared_key mk_direct_keys[__FSCRYPT_MODE_MAX + 1];
|
struct fscrypt_prepared_key mk_direct_keys[FSCRYPT_MODE_MAX + 1];
|
||||||
struct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[__FSCRYPT_MODE_MAX + 1];
|
struct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[FSCRYPT_MODE_MAX + 1];
|
||||||
struct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[__FSCRYPT_MODE_MAX + 1];
|
struct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[FSCRYPT_MODE_MAX + 1];
|
||||||
|
|
||||||
/* Hash key for inode numbers. Initialized only when needed. */
|
/* Hash key for inode numbers. Initialized only when needed. */
|
||||||
siphash_key_t mk_ino_hash_key;
|
siphash_key_t mk_ino_hash_key;
|
||||||
|
@@ -61,7 +61,7 @@ int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* ... in case we looked up no-key name before key was added */
|
/* ... in case we looked up no-key name before key was added */
|
||||||
if (dentry->d_flags & DCACHE_NOKEY_NAME)
|
if (fscrypt_is_nokey_name(dentry))
|
||||||
return -ENOKEY;
|
return -ENOKEY;
|
||||||
|
|
||||||
if (!fscrypt_has_permitted_context(dir, inode))
|
if (!fscrypt_has_permitted_context(dir, inode))
|
||||||
@@ -86,7 +86,8 @@ int __fscrypt_prepare_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* ... in case we looked up no-key name(s) before key was added */
|
/* ... in case we looked up no-key name(s) before key was added */
|
||||||
if ((old_dentry->d_flags | new_dentry->d_flags) & DCACHE_NOKEY_NAME)
|
if (fscrypt_is_nokey_name(old_dentry) ||
|
||||||
|
fscrypt_is_nokey_name(new_dentry))
|
||||||
return -ENOKEY;
|
return -ENOKEY;
|
||||||
|
|
||||||
if (old_dir != new_dir) {
|
if (old_dir != new_dir) {
|
||||||
|
@@ -44,7 +44,7 @@ static void free_master_key(struct fscrypt_master_key *mk)
|
|||||||
|
|
||||||
wipe_master_key_secret(&mk->mk_secret);
|
wipe_master_key_secret(&mk->mk_secret);
|
||||||
|
|
||||||
for (i = 0; i <= __FSCRYPT_MODE_MAX; i++) {
|
for (i = 0; i <= FSCRYPT_MODE_MAX; i++) {
|
||||||
fscrypt_destroy_prepared_key(&mk->mk_direct_keys[i]);
|
fscrypt_destroy_prepared_key(&mk->mk_direct_keys[i]);
|
||||||
fscrypt_destroy_prepared_key(&mk->mk_iv_ino_lblk_64_keys[i]);
|
fscrypt_destroy_prepared_key(&mk->mk_iv_ino_lblk_64_keys[i]);
|
||||||
fscrypt_destroy_prepared_key(&mk->mk_iv_ino_lblk_32_keys[i]);
|
fscrypt_destroy_prepared_key(&mk->mk_iv_ino_lblk_32_keys[i]);
|
||||||
|
@@ -56,6 +56,8 @@ static struct fscrypt_mode *
|
|||||||
select_encryption_mode(const union fscrypt_policy *policy,
|
select_encryption_mode(const union fscrypt_policy *policy,
|
||||||
const struct inode *inode)
|
const struct inode *inode)
|
||||||
{
|
{
|
||||||
|
BUILD_BUG_ON(ARRAY_SIZE(fscrypt_modes) != FSCRYPT_MODE_MAX + 1);
|
||||||
|
|
||||||
if (S_ISREG(inode->i_mode))
|
if (S_ISREG(inode->i_mode))
|
||||||
return &fscrypt_modes[fscrypt_policy_contents_mode(policy)];
|
return &fscrypt_modes[fscrypt_policy_contents_mode(policy)];
|
||||||
|
|
||||||
@@ -175,7 +177,7 @@ static int setup_per_mode_enc_key(struct fscrypt_info *ci,
|
|||||||
unsigned int hkdf_infolen = 0;
|
unsigned int hkdf_infolen = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (WARN_ON(mode_num > __FSCRYPT_MODE_MAX))
|
if (WARN_ON(mode_num > FSCRYPT_MODE_MAX))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
prep_key = &keys[mode_num];
|
prep_key = &keys[mode_num];
|
||||||
|
@@ -175,7 +175,10 @@ static bool fscrypt_supported_v2_policy(const struct fscrypt_policy_v2 *policy,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (policy->flags & ~FSCRYPT_POLICY_FLAGS_VALID) {
|
if (policy->flags & ~(FSCRYPT_POLICY_FLAGS_PAD_MASK |
|
||||||
|
FSCRYPT_POLICY_FLAG_DIRECT_KEY |
|
||||||
|
FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 |
|
||||||
|
FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32)) {
|
||||||
fscrypt_warn(inode, "Unsupported encryption flags (0x%02x)",
|
fscrypt_warn(inode, "Unsupported encryption flags (0x%02x)",
|
||||||
policy->flags);
|
policy->flags);
|
||||||
return false;
|
return false;
|
||||||
|
@@ -659,7 +659,7 @@ static int exfat_load_upcase_table(struct super_block *sb,
|
|||||||
unsigned char skip = false;
|
unsigned char skip = false;
|
||||||
unsigned short *upcase_table;
|
unsigned short *upcase_table;
|
||||||
|
|
||||||
upcase_table = kcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL);
|
upcase_table = kvcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL);
|
||||||
if (!upcase_table)
|
if (!upcase_table)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@@ -715,7 +715,7 @@ static int exfat_load_default_upcase_table(struct super_block *sb)
|
|||||||
unsigned short uni = 0, *upcase_table;
|
unsigned short uni = 0, *upcase_table;
|
||||||
unsigned int index = 0;
|
unsigned int index = 0;
|
||||||
|
|
||||||
upcase_table = kcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL);
|
upcase_table = kvcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL);
|
||||||
if (!upcase_table)
|
if (!upcase_table)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@@ -803,5 +803,5 @@ load_default:
|
|||||||
|
|
||||||
void exfat_free_upcase_table(struct exfat_sb_info *sbi)
|
void exfat_free_upcase_table(struct exfat_sb_info *sbi)
|
||||||
{
|
{
|
||||||
kfree(sbi->vol_utbl);
|
kvfree(sbi->vol_utbl);
|
||||||
}
|
}
|
||||||
|
@@ -2302,6 +2302,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
|
|||||||
if (!dentry->d_name.len)
|
if (!dentry->d_name.len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (fscrypt_is_nokey_name(dentry))
|
||||||
|
return -ENOKEY;
|
||||||
|
|
||||||
#ifdef CONFIG_UNICODE
|
#ifdef CONFIG_UNICODE
|
||||||
if (sb_has_strict_encoding(sb) && IS_CASEFOLDED(dir) &&
|
if (sb_has_strict_encoding(sb) && IS_CASEFOLDED(dir) &&
|
||||||
sb->s_encoding && utf8_validate(sb->s_encoding, &dentry->d_name))
|
sb->s_encoding && utf8_validate(sb->s_encoding, &dentry->d_name))
|
||||||
|
@@ -3254,6 +3254,8 @@ bool f2fs_empty_dir(struct inode *dir);
|
|||||||
|
|
||||||
static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
|
static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
|
||||||
{
|
{
|
||||||
|
if (fscrypt_is_nokey_name(dentry))
|
||||||
|
return -ENOKEY;
|
||||||
return f2fs_do_add_link(d_inode(dentry->d_parent), &dentry->d_name,
|
return f2fs_do_add_link(d_inode(dentry->d_parent), &dentry->d_name,
|
||||||
inode, inode->i_ino, inode->i_mode);
|
inode, inode->i_ino, inode->i_mode);
|
||||||
}
|
}
|
||||||
|
@@ -412,9 +412,14 @@ static loff_t f2fs_seek_block(struct file *file, loff_t offset, int whence)
|
|||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* handle inline data case */
|
/* handle inline data case */
|
||||||
if (f2fs_has_inline_data(inode) && whence == SEEK_HOLE) {
|
if (f2fs_has_inline_data(inode)) {
|
||||||
|
if (whence == SEEK_HOLE) {
|
||||||
data_ofs = isize;
|
data_ofs = isize;
|
||||||
goto found;
|
goto found;
|
||||||
|
} else if (whence == SEEK_DATA) {
|
||||||
|
data_ofs = offset;
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pgofs = (pgoff_t)(offset >> PAGE_SHIFT);
|
pgofs = (pgoff_t)(offset >> PAGE_SHIFT);
|
||||||
|
@@ -4544,7 +4544,7 @@ static void init_dirty_segmap(struct f2fs_sb_info *sbi)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&dirty_i->seglist_lock);
|
mutex_lock(&dirty_i->seglist_lock);
|
||||||
for (segno = 0; segno < MAIN_SECS(sbi); segno += blks_per_sec) {
|
for (segno = 0; segno < MAIN_SEGS(sbi); segno += sbi->segs_per_sec) {
|
||||||
valid_blocks = get_valid_blocks(sbi, segno, true);
|
valid_blocks = get_valid_blocks(sbi, segno, true);
|
||||||
secno = GET_SEC_FROM_SEG(sbi, segno);
|
secno = GET_SEC_FROM_SEG(sbi, segno);
|
||||||
|
|
||||||
|
@@ -2455,7 +2455,7 @@ int dquot_resume(struct super_block *sb, int type)
|
|||||||
ret = dquot_load_quota_sb(sb, cnt, dqopt->info[cnt].dqi_fmt_id,
|
ret = dquot_load_quota_sb(sb, cnt, dqopt->info[cnt].dqi_fmt_id,
|
||||||
flags);
|
flags);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
vfs_cleanup_quota_inode(sb, type);
|
vfs_cleanup_quota_inode(sb, cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -157,6 +157,25 @@ static int v2_read_file_info(struct super_block *sb, int type)
|
|||||||
qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
|
qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
|
||||||
qinfo->dqi_ops = &v2r1_qtree_ops;
|
qinfo->dqi_ops = &v2r1_qtree_ops;
|
||||||
}
|
}
|
||||||
|
ret = -EUCLEAN;
|
||||||
|
/* Some sanity checks of the read headers... */
|
||||||
|
if ((loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits >
|
||||||
|
i_size_read(sb_dqopt(sb)->files[type])) {
|
||||||
|
quota_error(sb, "Number of blocks too big for quota file size (%llu > %llu).",
|
||||||
|
(loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits,
|
||||||
|
i_size_read(sb_dqopt(sb)->files[type]));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (qinfo->dqi_free_blk >= qinfo->dqi_blocks) {
|
||||||
|
quota_error(sb, "Free block number too big (%u >= %u).",
|
||||||
|
qinfo->dqi_free_blk, qinfo->dqi_blocks);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (qinfo->dqi_free_entry >= qinfo->dqi_blocks) {
|
||||||
|
quota_error(sb, "Block with free entry too big (%u >= %u).",
|
||||||
|
qinfo->dqi_free_entry, qinfo->dqi_blocks);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out:
|
out:
|
||||||
up_read(&dqopt->dqio_sem);
|
up_read(&dqopt->dqio_sem);
|
||||||
|
@@ -271,6 +271,15 @@ done:
|
|||||||
return d_splice_alias(inode, dentry);
|
return d_splice_alias(inode, dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ubifs_prepare_create(struct inode *dir, struct dentry *dentry,
|
||||||
|
struct fscrypt_name *nm)
|
||||||
|
{
|
||||||
|
if (fscrypt_is_nokey_name(dentry))
|
||||||
|
return -ENOKEY;
|
||||||
|
|
||||||
|
return fscrypt_setup_filename(dir, &dentry->d_name, 0, nm);
|
||||||
|
}
|
||||||
|
|
||||||
static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||||
bool excl)
|
bool excl)
|
||||||
{
|
{
|
||||||
@@ -294,7 +303,7 @@ static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_budg;
|
goto out_budg;
|
||||||
|
|
||||||
@@ -954,7 +963,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_budg;
|
goto out_budg;
|
||||||
|
|
||||||
@@ -1039,7 +1048,7 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||||
if (err) {
|
if (err) {
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
goto out_budg;
|
goto out_budg;
|
||||||
@@ -1123,7 +1132,7 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
|
err = ubifs_prepare_create(dir, dentry, &nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_budg;
|
goto out_budg;
|
||||||
|
|
||||||
|
@@ -111,6 +111,35 @@ static inline void fscrypt_handle_d_move(struct dentry *dentry)
|
|||||||
dentry->d_flags &= ~DCACHE_NOKEY_NAME;
|
dentry->d_flags &= ~DCACHE_NOKEY_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fscrypt_is_nokey_name() - test whether a dentry is a no-key name
|
||||||
|
* @dentry: the dentry to check
|
||||||
|
*
|
||||||
|
* This returns true if the dentry is a no-key dentry. A no-key dentry is a
|
||||||
|
* dentry that was created in an encrypted directory that hasn't had its
|
||||||
|
* encryption key added yet. Such dentries may be either positive or negative.
|
||||||
|
*
|
||||||
|
* When a filesystem is asked to create a new filename in an encrypted directory
|
||||||
|
* and the new filename's dentry is a no-key dentry, it must fail the operation
|
||||||
|
* with ENOKEY. This includes ->create(), ->mkdir(), ->mknod(), ->symlink(),
|
||||||
|
* ->rename(), and ->link(). (However, ->rename() and ->link() are already
|
||||||
|
* handled by fscrypt_prepare_rename() and fscrypt_prepare_link().)
|
||||||
|
*
|
||||||
|
* This is necessary because creating a filename requires the directory's
|
||||||
|
* encryption key, but just checking for the key on the directory inode during
|
||||||
|
* the final filesystem operation doesn't guarantee that the key was available
|
||||||
|
* during the preceding dentry lookup. And the key must have already been
|
||||||
|
* available during the dentry lookup in order for it to have been checked
|
||||||
|
* whether the filename already exists in the directory and for the new file's
|
||||||
|
* dentry not to be invalidated due to it incorrectly having the no-key flag.
|
||||||
|
*
|
||||||
|
* Return: %true if the dentry is a no-key name
|
||||||
|
*/
|
||||||
|
static inline bool fscrypt_is_nokey_name(const struct dentry *dentry)
|
||||||
|
{
|
||||||
|
return dentry->d_flags & DCACHE_NOKEY_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
/* crypto.c */
|
/* crypto.c */
|
||||||
void fscrypt_enqueue_decrypt_work(struct work_struct *);
|
void fscrypt_enqueue_decrypt_work(struct work_struct *);
|
||||||
|
|
||||||
@@ -244,6 +273,11 @@ static inline void fscrypt_handle_d_move(struct dentry *dentry)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool fscrypt_is_nokey_name(const struct dentry *dentry)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* crypto.c */
|
/* crypto.c */
|
||||||
static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
|
static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
#define FSCRYPT_POLICY_FLAG_DIRECT_KEY 0x04
|
#define FSCRYPT_POLICY_FLAG_DIRECT_KEY 0x04
|
||||||
#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 0x08
|
#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 0x08
|
||||||
#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32 0x10
|
#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32 0x10
|
||||||
#define FSCRYPT_POLICY_FLAGS_VALID 0x1F
|
|
||||||
|
|
||||||
/* Encryption algorithms */
|
/* Encryption algorithms */
|
||||||
#define FSCRYPT_MODE_AES_256_XTS 1
|
#define FSCRYPT_MODE_AES_256_XTS 1
|
||||||
@@ -28,7 +27,7 @@
|
|||||||
#define FSCRYPT_MODE_AES_128_CBC 5
|
#define FSCRYPT_MODE_AES_128_CBC 5
|
||||||
#define FSCRYPT_MODE_AES_128_CTS 6
|
#define FSCRYPT_MODE_AES_128_CTS 6
|
||||||
#define FSCRYPT_MODE_ADIANTUM 9
|
#define FSCRYPT_MODE_ADIANTUM 9
|
||||||
#define __FSCRYPT_MODE_MAX 9
|
/* If adding a mode number > 9, update FSCRYPT_MODE_MAX in fscrypt_private.h */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Legacy policy version; ad-hoc KDF and no key verification.
|
* Legacy policy version; ad-hoc KDF and no key verification.
|
||||||
@@ -180,7 +179,7 @@ struct fscrypt_get_key_status_arg {
|
|||||||
#define FS_POLICY_FLAGS_PAD_32 FSCRYPT_POLICY_FLAGS_PAD_32
|
#define FS_POLICY_FLAGS_PAD_32 FSCRYPT_POLICY_FLAGS_PAD_32
|
||||||
#define FS_POLICY_FLAGS_PAD_MASK FSCRYPT_POLICY_FLAGS_PAD_MASK
|
#define FS_POLICY_FLAGS_PAD_MASK FSCRYPT_POLICY_FLAGS_PAD_MASK
|
||||||
#define FS_POLICY_FLAG_DIRECT_KEY FSCRYPT_POLICY_FLAG_DIRECT_KEY
|
#define FS_POLICY_FLAG_DIRECT_KEY FSCRYPT_POLICY_FLAG_DIRECT_KEY
|
||||||
#define FS_POLICY_FLAGS_VALID FSCRYPT_POLICY_FLAGS_VALID
|
#define FS_POLICY_FLAGS_VALID 0x07 /* contains old flags only */
|
||||||
#define FS_ENCRYPTION_MODE_INVALID 0 /* never used */
|
#define FS_ENCRYPTION_MODE_INVALID 0 /* never used */
|
||||||
#define FS_ENCRYPTION_MODE_AES_256_XTS FSCRYPT_MODE_AES_256_XTS
|
#define FS_ENCRYPTION_MODE_AES_256_XTS FSCRYPT_MODE_AES_256_XTS
|
||||||
#define FS_ENCRYPTION_MODE_AES_256_GCM 2 /* never used */
|
#define FS_ENCRYPTION_MODE_AES_256_GCM 2 /* never used */
|
||||||
|
@@ -24,6 +24,22 @@ struct sockaddr_alg {
|
|||||||
__u8 salg_name[64];
|
__u8 salg_name[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Linux v4.12 and later removed the 64-byte limit on salg_name[]; it's now an
|
||||||
|
* arbitrary-length field. We had to keep the original struct above for source
|
||||||
|
* compatibility with existing userspace programs, though. Use the new struct
|
||||||
|
* below if support for very long algorithm names is needed. To do this,
|
||||||
|
* allocate 'sizeof(struct sockaddr_alg_new) + strlen(algname) + 1' bytes, and
|
||||||
|
* copy algname (including the null terminator) into salg_name.
|
||||||
|
*/
|
||||||
|
struct sockaddr_alg_new {
|
||||||
|
__u16 salg_family;
|
||||||
|
__u8 salg_type[14];
|
||||||
|
__u32 salg_feat;
|
||||||
|
__u32 salg_mask;
|
||||||
|
__u8 salg_name[];
|
||||||
|
};
|
||||||
|
|
||||||
struct af_alg_iv {
|
struct af_alg_iv {
|
||||||
__u32 ivlen;
|
__u32 ivlen;
|
||||||
__u8 iv[0];
|
__u8 iv[0];
|
||||||
|
@@ -5868,21 +5868,19 @@ static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
|
|||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
u8 num_reports = skb->data[0];
|
u8 num_reports = skb->data[0];
|
||||||
void *ptr = &skb->data[1];
|
struct hci_ev_le_direct_adv_info *ev = (void *)&skb->data[1];
|
||||||
|
|
||||||
|
if (!num_reports || skb->len < num_reports * sizeof(*ev) + 1)
|
||||||
|
return;
|
||||||
|
|
||||||
hci_dev_lock(hdev);
|
hci_dev_lock(hdev);
|
||||||
|
|
||||||
while (num_reports--) {
|
for (; num_reports; num_reports--, ev++)
|
||||||
struct hci_ev_le_direct_adv_info *ev = ptr;
|
|
||||||
|
|
||||||
process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
|
process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
|
||||||
ev->bdaddr_type, &ev->direct_addr,
|
ev->bdaddr_type, &ev->direct_addr,
|
||||||
ev->direct_addr_type, ev->rssi, NULL, 0,
|
ev->direct_addr_type, ev->rssi, NULL, 0,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
ptr += sizeof(*ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
hci_dev_unlock(hdev);
|
hci_dev_unlock(hdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1441,7 +1441,7 @@ static int __init ip_auto_config(void)
|
|||||||
int retries = CONF_OPEN_RETRIES;
|
int retries = CONF_OPEN_RETRIES;
|
||||||
#endif
|
#endif
|
||||||
int err;
|
int err;
|
||||||
unsigned int i;
|
unsigned int i, count;
|
||||||
|
|
||||||
/* Initialise all name servers and NTP servers to NONE (but only if the
|
/* Initialise all name servers and NTP servers to NONE (but only if the
|
||||||
* "ip=" or "nfsaddrs=" kernel command line parameters weren't decoded,
|
* "ip=" or "nfsaddrs=" kernel command line parameters weren't decoded,
|
||||||
@@ -1575,7 +1575,7 @@ static int __init ip_auto_config(void)
|
|||||||
if (ic_dev_mtu)
|
if (ic_dev_mtu)
|
||||||
pr_cont(", mtu=%d", ic_dev_mtu);
|
pr_cont(", mtu=%d", ic_dev_mtu);
|
||||||
/* Name servers (if any): */
|
/* Name servers (if any): */
|
||||||
for (i = 0; i < CONF_NAMESERVERS_MAX; i++) {
|
for (i = 0, count = 0; i < CONF_NAMESERVERS_MAX; i++) {
|
||||||
if (ic_nameservers[i] != NONE) {
|
if (ic_nameservers[i] != NONE) {
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
pr_info(" nameserver%u=%pI4",
|
pr_info(" nameserver%u=%pI4",
|
||||||
@@ -1583,12 +1583,14 @@ static int __init ip_auto_config(void)
|
|||||||
else
|
else
|
||||||
pr_cont(", nameserver%u=%pI4",
|
pr_cont(", nameserver%u=%pI4",
|
||||||
i, &ic_nameservers[i]);
|
i, &ic_nameservers[i]);
|
||||||
|
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
if (i + 1 == CONF_NAMESERVERS_MAX)
|
if ((i + 1 == CONF_NAMESERVERS_MAX) && count > 0)
|
||||||
pr_cont("\n");
|
pr_cont("\n");
|
||||||
}
|
}
|
||||||
/* NTP servers (if any): */
|
/* NTP servers (if any): */
|
||||||
for (i = 0; i < CONF_NTP_SERVERS_MAX; i++) {
|
for (i = 0, count = 0; i < CONF_NTP_SERVERS_MAX; i++) {
|
||||||
if (ic_ntp_servers[i] != NONE) {
|
if (ic_ntp_servers[i] != NONE) {
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
pr_info(" ntpserver%u=%pI4",
|
pr_info(" ntpserver%u=%pI4",
|
||||||
@@ -1596,8 +1598,10 @@ static int __init ip_auto_config(void)
|
|||||||
else
|
else
|
||||||
pr_cont(", ntpserver%u=%pI4",
|
pr_cont(", ntpserver%u=%pI4",
|
||||||
i, &ic_ntp_servers[i]);
|
i, &ic_ntp_servers[i]);
|
||||||
|
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
if (i + 1 == CONF_NTP_SERVERS_MAX)
|
if ((i + 1 == CONF_NTP_SERVERS_MAX) && count > 0)
|
||||||
pr_cont("\n");
|
pr_cont("\n");
|
||||||
}
|
}
|
||||||
#endif /* !SILENT */
|
#endif /* !SILENT */
|
||||||
|
@@ -433,6 +433,8 @@ void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev);
|
|||||||
|
|
||||||
/* internal helpers */
|
/* internal helpers */
|
||||||
bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher);
|
bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher);
|
||||||
|
bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev,
|
||||||
|
int key_idx, bool pairwise);
|
||||||
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
||||||
struct key_params *params, int key_idx,
|
struct key_params *params, int key_idx,
|
||||||
bool pairwise, const u8 *mac_addr);
|
bool pairwise, const u8 *mac_addr);
|
||||||
|
@@ -4260,9 +4260,6 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (key.idx < 0)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (info->attrs[NL80211_ATTR_MAC])
|
if (info->attrs[NL80211_ATTR_MAC])
|
||||||
mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
||||||
|
|
||||||
@@ -4278,6 +4275,10 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
|||||||
key.type != NL80211_KEYTYPE_GROUP)
|
key.type != NL80211_KEYTYPE_GROUP)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!cfg80211_valid_key_idx(rdev, key.idx,
|
||||||
|
key.type == NL80211_KEYTYPE_PAIRWISE))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!rdev->ops->del_key)
|
if (!rdev->ops->del_key)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
@@ -272,18 +272,53 @@ bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
static bool
|
||||||
struct key_params *params, int key_idx,
|
cfg80211_igtk_cipher_supported(struct cfg80211_registered_device *rdev)
|
||||||
bool pairwise, const u8 *mac_addr)
|
|
||||||
{
|
{
|
||||||
int max_key_idx = 5;
|
struct wiphy *wiphy = &rdev->wiphy;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (wiphy_ext_feature_isset(&rdev->wiphy,
|
for (i = 0; i < wiphy->n_cipher_suites; i++) {
|
||||||
|
switch (wiphy->cipher_suites[i]) {
|
||||||
|
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||||
|
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||||
|
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||||
|
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev,
|
||||||
|
int key_idx, bool pairwise)
|
||||||
|
{
|
||||||
|
int max_key_idx;
|
||||||
|
|
||||||
|
if (pairwise)
|
||||||
|
max_key_idx = 3;
|
||||||
|
else if (wiphy_ext_feature_isset(&rdev->wiphy,
|
||||||
NL80211_EXT_FEATURE_BEACON_PROTECTION) ||
|
NL80211_EXT_FEATURE_BEACON_PROTECTION) ||
|
||||||
wiphy_ext_feature_isset(&rdev->wiphy,
|
wiphy_ext_feature_isset(&rdev->wiphy,
|
||||||
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
||||||
max_key_idx = 7;
|
max_key_idx = 7;
|
||||||
|
else if (cfg80211_igtk_cipher_supported(rdev))
|
||||||
|
max_key_idx = 5;
|
||||||
|
else
|
||||||
|
max_key_idx = 3;
|
||||||
|
|
||||||
if (key_idx < 0 || key_idx > max_key_idx)
|
if (key_idx < 0 || key_idx > max_key_idx)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
||||||
|
struct key_params *params, int key_idx,
|
||||||
|
bool pairwise, const u8 *mac_addr)
|
||||||
|
{
|
||||||
|
if (!cfg80211_valid_key_idx(rdev, key_idx, pairwise))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||||
|
Reference in New Issue
Block a user