mirror of
https://github.com/torvalds/linux.git
synced 2025-11-30 23:16:01 +07:00
Compare commits
41 Commits
2eba5e05d9
...
ac3fd01e4c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac3fd01e4c | ||
|
|
d0e88704d9 | ||
|
|
1af5c1d3a9 | ||
|
|
e624f73775 | ||
|
|
20739af073 | ||
|
|
d13f3ac64e | ||
|
|
0629dcf772 | ||
|
|
89edd36fd8 | ||
|
|
7e29f07760 | ||
|
|
ebd975458d | ||
|
|
a6ff0d85eb | ||
|
|
5703357ede | ||
|
|
141fbbecec | ||
|
|
14b46ba92b | ||
|
|
9f048fa487 | ||
|
|
3ded250b97 | ||
|
|
dde3a5d0f4 | ||
|
|
75f72fe289 | ||
|
|
7b5ab04f03 | ||
|
|
678e1cc2f4 | ||
|
|
f1f96511b1 | ||
|
|
90449f2d1e | ||
|
|
807e0d187d | ||
|
|
3c493b524f | ||
|
|
a24074ca88 | ||
|
|
ae8966b7b5 | ||
|
|
f39b6c468c | ||
|
|
e2cb69263e | ||
|
|
7b090e7b91 | ||
|
|
91f815b707 | ||
|
|
09782e72ee | ||
|
|
ebd729fef3 | ||
|
|
e6965188f8 | ||
|
|
e08969c4d6 | ||
|
|
d83f151275 | ||
|
|
2050280a4b | ||
|
|
5888533c60 | ||
|
|
1dba74abf3 | ||
|
|
69aeb50731 | ||
|
|
7363096a5a | ||
|
|
c6d99e4881 |
@@ -400,19 +400,30 @@ can report through the rotational axes (absolute and/or relative rx, ry, rz).
|
||||
All other axes retain their meaning. A device must not mix
|
||||
regular directional axes and accelerometer axes on the same event node.
|
||||
|
||||
INPUT_PROP_HAPTIC_TOUCHPAD
|
||||
--------------------------
|
||||
INPUT_PROP_PRESSUREPAD
|
||||
----------------------
|
||||
|
||||
The INPUT_PROP_PRESSUREPAD property indicates that the device provides
|
||||
simulated haptic feedback (e.g. a vibrator motor situated below the surface)
|
||||
instead of physical haptic feedback (e.g. a hinge). This property is only set
|
||||
if the device:
|
||||
|
||||
The INPUT_PROP_HAPTIC_TOUCHPAD property indicates that device:
|
||||
- supports simple haptic auto and manual triggering
|
||||
- can differentiate between at least 5 fingers
|
||||
- uses correct resolution for the X/Y (units and value)
|
||||
- reports correct force per touch, and correct units for them (newtons or grams)
|
||||
- follows the MT protocol type B
|
||||
|
||||
If the simulated haptic feedback is controllable by userspace the device must:
|
||||
|
||||
- support simple haptic auto and manual triggering, and
|
||||
- report correct force per touch, and correct units for them (newtons or grams), and
|
||||
- provide the EV_FF FF_HAPTIC force feedback effect.
|
||||
|
||||
Summing up, such devices follow the MS spec for input devices in
|
||||
Win8 and Win8.1, and in addition support the Simple haptic controller HID table,
|
||||
and report correct units for the pressure.
|
||||
Win8 and Win8.1, and in addition may support the Simple haptic controller HID
|
||||
table, and report correct units for the pressure.
|
||||
|
||||
Where applicable, this property is set in addition to INPUT_PROP_BUTTONPAD, it
|
||||
does not replace that property.
|
||||
|
||||
Guidelines
|
||||
==========
|
||||
|
||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 18
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "mips,mips24KEc";
|
||||
compatible = "mips,mips34Kc";
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -692,7 +692,7 @@ unsigned long mips_stack_top(void)
|
||||
/* Space for the VDSO, data page & GIC user page */
|
||||
if (current->thread.abi) {
|
||||
top -= PAGE_ALIGN(current->thread.abi->vdso->size);
|
||||
top -= PAGE_SIZE;
|
||||
top -= VDSO_NR_PAGES * PAGE_SIZE;
|
||||
top -= mips_gic_present() ? PAGE_SIZE : 0;
|
||||
|
||||
/* Space to randomize the VDSO base */
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sort.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cpu-type.h>
|
||||
@@ -508,54 +509,78 @@ static int __init set_ntlb(char *str)
|
||||
|
||||
__setup("ntlb=", set_ntlb);
|
||||
|
||||
/* Initialise all TLB entries with unique values */
|
||||
|
||||
/* Comparison function for EntryHi VPN fields. */
|
||||
static int r4k_vpn_cmp(const void *a, const void *b)
|
||||
{
|
||||
long v = *(unsigned long *)a - *(unsigned long *)b;
|
||||
int s = sizeof(long) > sizeof(int) ? sizeof(long) * 8 - 1: 0;
|
||||
return s ? (v != 0) | v >> s : v;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialise all TLB entries with unique values that do not clash with
|
||||
* what we have been handed over and what we'll be using ourselves.
|
||||
*/
|
||||
static void r4k_tlb_uniquify(void)
|
||||
{
|
||||
int entry = num_wired_entries();
|
||||
unsigned long tlb_vpns[1 << MIPS_CONF1_TLBS_SIZE];
|
||||
int tlbsize = current_cpu_data.tlbsize;
|
||||
int start = num_wired_entries();
|
||||
unsigned long vpn_mask;
|
||||
int cnt, ent, idx, i;
|
||||
|
||||
vpn_mask = GENMASK(cpu_vmbits - 1, 13);
|
||||
vpn_mask |= IS_ENABLED(CONFIG_64BIT) ? 3ULL << 62 : 1 << 31;
|
||||
|
||||
htw_stop();
|
||||
|
||||
for (i = start, cnt = 0; i < tlbsize; i++, cnt++) {
|
||||
unsigned long vpn;
|
||||
|
||||
write_c0_index(i);
|
||||
mtc0_tlbr_hazard();
|
||||
tlb_read();
|
||||
tlb_read_hazard();
|
||||
vpn = read_c0_entryhi();
|
||||
vpn &= vpn_mask & PAGE_MASK;
|
||||
tlb_vpns[cnt] = vpn;
|
||||
|
||||
/* Prevent any large pages from overlapping regular ones. */
|
||||
write_c0_pagemask(read_c0_pagemask() & PM_DEFAULT_MASK);
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_write_indexed();
|
||||
tlbw_use_hazard();
|
||||
}
|
||||
|
||||
sort(tlb_vpns, cnt, sizeof(tlb_vpns[0]), r4k_vpn_cmp, NULL);
|
||||
|
||||
write_c0_pagemask(PM_DEFAULT_MASK);
|
||||
write_c0_entrylo0(0);
|
||||
write_c0_entrylo1(0);
|
||||
|
||||
while (entry < current_cpu_data.tlbsize) {
|
||||
unsigned long asid_mask = cpu_asid_mask(¤t_cpu_data);
|
||||
unsigned long asid = 0;
|
||||
int idx;
|
||||
idx = 0;
|
||||
ent = tlbsize;
|
||||
for (i = start; i < tlbsize; i++)
|
||||
while (1) {
|
||||
unsigned long entryhi, vpn;
|
||||
|
||||
/* Skip wired MMID to make ginvt_mmid work */
|
||||
if (cpu_has_mmid)
|
||||
asid = MMID_KERNEL_WIRED + 1;
|
||||
entryhi = UNIQUE_ENTRYHI(ent);
|
||||
vpn = entryhi & vpn_mask & PAGE_MASK;
|
||||
|
||||
/* Check for match before using UNIQUE_ENTRYHI */
|
||||
do {
|
||||
if (cpu_has_mmid) {
|
||||
write_c0_memorymapid(asid);
|
||||
write_c0_entryhi(UNIQUE_ENTRYHI(entry));
|
||||
} else {
|
||||
write_c0_entryhi(UNIQUE_ENTRYHI(entry) | asid);
|
||||
}
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_probe();
|
||||
tlb_probe_hazard();
|
||||
idx = read_c0_index();
|
||||
/* No match or match is on current entry */
|
||||
if (idx < 0 || idx == entry)
|
||||
if (idx >= cnt || vpn < tlb_vpns[idx]) {
|
||||
write_c0_entryhi(entryhi);
|
||||
write_c0_index(i);
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_write_indexed();
|
||||
ent++;
|
||||
break;
|
||||
/*
|
||||
* If we hit a match, we need to try again with
|
||||
* a different ASID.
|
||||
*/
|
||||
asid++;
|
||||
} while (asid < asid_mask);
|
||||
|
||||
if (idx >= 0 && idx != entry)
|
||||
panic("Unable to uniquify TLB entry %d", idx);
|
||||
|
||||
write_c0_index(entry);
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_write_indexed();
|
||||
entry++;
|
||||
}
|
||||
} else if (vpn == tlb_vpns[idx]) {
|
||||
ent++;
|
||||
} else {
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
tlbw_use_hazard();
|
||||
htw_start();
|
||||
@@ -602,6 +627,7 @@ static void r4k_tlb_configure(void)
|
||||
|
||||
/* From this point on the ARC firmware is dead. */
|
||||
r4k_tlb_uniquify();
|
||||
local_flush_tlb_all();
|
||||
|
||||
/* Did I tell you that ARC SUCKS? */
|
||||
}
|
||||
|
||||
@@ -241,16 +241,22 @@ mips_pci_controller:
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Setup the Malta max (2GB) memory for PCI DMA in host bridge
|
||||
* in transparent addressing mode.
|
||||
* Set up memory mapping in host bridge for PCI DMA masters,
|
||||
* in transparent addressing mode. For EVA use the Malta
|
||||
* maximum of 2 GiB memory in the alias space at 0x80000000
|
||||
* as per PHYS_OFFSET. Otherwise use 256 MiB of memory in
|
||||
* the regular space, avoiding mapping the PCI MMIO window
|
||||
* for DMA as it seems to confuse the system controller's
|
||||
* logic, causing PCI MMIO to stop working.
|
||||
*/
|
||||
mask = PHYS_OFFSET | PCI_BASE_ADDRESS_MEM_PREFETCH;
|
||||
MSC_WRITE(MSC01_PCI_BAR0, mask);
|
||||
MSC_WRITE(MSC01_PCI_HEAD4, mask);
|
||||
mask = PHYS_OFFSET ? PHYS_OFFSET : 0xf0000000;
|
||||
MSC_WRITE(MSC01_PCI_BAR0,
|
||||
mask | PCI_BASE_ADDRESS_MEM_PREFETCH);
|
||||
MSC_WRITE(MSC01_PCI_HEAD4,
|
||||
PHYS_OFFSET | PCI_BASE_ADDRESS_MEM_PREFETCH);
|
||||
|
||||
mask &= MSC01_PCI_BAR0_SIZE_MSK;
|
||||
MSC_WRITE(MSC01_PCI_P2SCMSKL, mask);
|
||||
MSC_WRITE(MSC01_PCI_P2SCMAPL, mask);
|
||||
MSC_WRITE(MSC01_PCI_P2SCMAPL, PHYS_OFFSET);
|
||||
|
||||
/* Don't handle target retries indefinitely. */
|
||||
if ((data & MSC01_PCI_CFG_MAXRTRY_MSK) ==
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
#define ANDES_VENDOR_ID 0x31e
|
||||
#define MICROCHIP_VENDOR_ID 0x029
|
||||
#define MIPS_VENDOR_ID 0x127
|
||||
#define SIFIVE_VENDOR_ID 0x489
|
||||
#define THEAD_VENDOR_ID 0x5b7
|
||||
#define MIPS_VENDOR_ID 0x722
|
||||
|
||||
#endif
|
||||
|
||||
@@ -648,9 +648,9 @@ int sbi_debug_console_read(char *bytes, unsigned int num_bytes)
|
||||
|
||||
void __init sbi_init(void)
|
||||
{
|
||||
bool srst_power_off = false;
|
||||
int ret;
|
||||
|
||||
sbi_set_power_off();
|
||||
ret = sbi_get_spec_version();
|
||||
if (ret > 0)
|
||||
sbi_spec_version = ret;
|
||||
@@ -683,6 +683,7 @@ void __init sbi_init(void)
|
||||
sbi_probe_extension(SBI_EXT_SRST)) {
|
||||
pr_info("SBI SRST extension detected\n");
|
||||
register_platform_power_off(sbi_srst_power_off);
|
||||
srst_power_off = true;
|
||||
sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot;
|
||||
sbi_srst_reboot_nb.priority = 192;
|
||||
register_restart_handler(&sbi_srst_reboot_nb);
|
||||
@@ -702,4 +703,7 @@ void __init sbi_init(void)
|
||||
__sbi_send_ipi = __sbi_send_ipi_v01;
|
||||
__sbi_rfence = __sbi_rfence_v01;
|
||||
}
|
||||
|
||||
if (!srst_power_off)
|
||||
sbi_set_power_off();
|
||||
}
|
||||
|
||||
@@ -1325,8 +1325,6 @@ static void uncore_pci_sub_driver_init(void)
|
||||
continue;
|
||||
|
||||
pmu = &type->pmus[UNCORE_PCI_DEV_IDX(ids->driver_data)];
|
||||
if (!pmu)
|
||||
continue;
|
||||
|
||||
if (uncore_pci_get_dev_die_info(pci_sub_dev, &die))
|
||||
continue;
|
||||
|
||||
@@ -121,11 +121,11 @@ static SUNXI_CCU_GATE_HW(bus_r_ir_rx_clk, "bus-r-ir-rx",
|
||||
&r_apb0_clk.common.hw, 0x1cc, BIT(0), 0);
|
||||
|
||||
static SUNXI_CCU_GATE_HW(bus_r_dma_clk, "bus-r-dma",
|
||||
&r_apb0_clk.common.hw, 0x1dc, BIT(0), 0);
|
||||
&r_apb0_clk.common.hw, 0x1dc, BIT(0), CLK_IS_CRITICAL);
|
||||
static SUNXI_CCU_GATE_HW(bus_r_rtc_clk, "bus-r-rtc",
|
||||
&r_apb0_clk.common.hw, 0x20c, BIT(0), 0);
|
||||
static SUNXI_CCU_GATE_HW(bus_r_cpucfg_clk, "bus-r-cpucfg",
|
||||
&r_apb0_clk.common.hw, 0x22c, BIT(0), 0);
|
||||
&r_apb0_clk.common.hw, 0x22c, BIT(0), CLK_IS_CRITICAL);
|
||||
|
||||
static struct ccu_common *sun55i_a523_r_ccu_clks[] = {
|
||||
&r_ahb_clk.common,
|
||||
|
||||
@@ -300,7 +300,7 @@ static struct ccu_nm pll_audio0_4x_clk = {
|
||||
.m = _SUNXI_CCU_DIV(16, 6),
|
||||
.sdm = _SUNXI_CCU_SDM(pll_audio0_sdm_table, BIT(24),
|
||||
0x178, BIT(31)),
|
||||
.min_rate = 180000000U,
|
||||
.min_rate = 90000000U,
|
||||
.max_rate = 3000000000U,
|
||||
.common = {
|
||||
.reg = 0x078,
|
||||
|
||||
@@ -86,7 +86,7 @@ int hid_haptic_input_configured(struct hid_device *hdev,
|
||||
if (hi->application == HID_DG_TOUCHPAD) {
|
||||
if (haptic->auto_trigger_report &&
|
||||
haptic->manual_trigger_report) {
|
||||
__set_bit(INPUT_PROP_HAPTIC_TOUCHPAD, hi->input->propbit);
|
||||
__set_bit(INPUT_PROP_PRESSUREPAD, hi->input->propbit);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -261,6 +261,12 @@ static int cros_ec_keyb_work(struct notifier_block *nb,
|
||||
case EC_MKBP_EVENT_KEY_MATRIX:
|
||||
pm_wakeup_event(ckdev->dev, 0);
|
||||
|
||||
if (!ckdev->idev) {
|
||||
dev_warn_once(ckdev->dev,
|
||||
"Unexpected key matrix event\n");
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
if (ckdev->ec->event_size != ckdev->cols) {
|
||||
dev_err(ckdev->dev,
|
||||
"Discarded incomplete key matrix event.\n");
|
||||
|
||||
@@ -158,7 +158,7 @@ static int imx_sc_key_probe(struct platform_device *pdev)
|
||||
return error;
|
||||
}
|
||||
|
||||
error = devm_add_action_or_reset(&pdev->dev, imx_sc_key_action, &priv);
|
||||
error = devm_add_action_or_reset(&pdev->dev, imx_sc_key_action, priv);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
@@ -63,6 +63,9 @@
|
||||
#define BUTTON_PRESSED 0xb5
|
||||
#define COMMAND_VERSION 0xa9
|
||||
|
||||
/* 1 Status + 1 Color + 2 X + 2 Y = 6 bytes */
|
||||
#define NOTETAKER_PACKET_SIZE 6
|
||||
|
||||
/* in xy data packet */
|
||||
#define BATTERY_NO_REPORT 0x40
|
||||
#define BATTERY_LOW 0x41
|
||||
@@ -311,6 +314,12 @@ static int pegasus_probe(struct usb_interface *intf,
|
||||
}
|
||||
|
||||
pegasus->data_len = usb_maxpacket(dev, pipe);
|
||||
if (pegasus->data_len < NOTETAKER_PACKET_SIZE) {
|
||||
dev_err(&intf->dev, "packet size is too small (%d)\n",
|
||||
pegasus->data_len);
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL,
|
||||
&pegasus->data_dma);
|
||||
|
||||
@@ -796,17 +796,6 @@ int goodix_reset_no_int_sync(struct goodix_ts_data *ts)
|
||||
|
||||
usleep_range(6000, 10000); /* T4: > 5ms */
|
||||
|
||||
/*
|
||||
* Put the reset pin back in to input / high-impedance mode to save
|
||||
* power. Only do this in the non ACPI case since some ACPI boards
|
||||
* don't have a pull-up, so there the reset pin must stay active-high.
|
||||
*/
|
||||
if (ts->irq_pin_access_method == IRQ_PIN_ACCESS_GPIO) {
|
||||
error = gpiod_direction_input(ts->gpiod_rst);
|
||||
if (error)
|
||||
goto error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
@@ -957,14 +946,6 @@ static int goodix_add_acpi_gpio_mappings(struct goodix_ts_data *ts)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Normally we put the reset pin in input / high-impedance mode to save
|
||||
* power. But some x86/ACPI boards don't have a pull-up, so for the ACPI
|
||||
* case, leave the pin as is. This results in the pin not being touched
|
||||
* at all on x86/ACPI boards, except when needed for error-recover.
|
||||
*/
|
||||
ts->gpiod_rst_flags = GPIOD_ASIS;
|
||||
|
||||
return devm_acpi_dev_add_driver_gpios(dev, gpio_mapping);
|
||||
}
|
||||
#else
|
||||
@@ -989,12 +970,6 @@ static int goodix_get_gpio_config(struct goodix_ts_data *ts)
|
||||
return -EINVAL;
|
||||
dev = &ts->client->dev;
|
||||
|
||||
/*
|
||||
* By default we request the reset pin as input, leaving it in
|
||||
* high-impedance when not resetting the controller to save power.
|
||||
*/
|
||||
ts->gpiod_rst_flags = GPIOD_IN;
|
||||
|
||||
ts->avdd28 = devm_regulator_get(dev, "AVDD28");
|
||||
if (IS_ERR(ts->avdd28))
|
||||
return dev_err_probe(dev, PTR_ERR(ts->avdd28), "Failed to get AVDD28 regulator\n");
|
||||
@@ -1019,7 +994,7 @@ retry_get_irq_gpio:
|
||||
ts->gpiod_int = gpiod;
|
||||
|
||||
/* Get the reset line GPIO pin number */
|
||||
gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_RST_NAME, ts->gpiod_rst_flags);
|
||||
gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_RST_NAME, GPIOD_ASIS);
|
||||
if (IS_ERR(gpiod))
|
||||
return dev_err_probe(dev, PTR_ERR(gpiod), "Failed to get %s GPIO\n",
|
||||
GOODIX_GPIO_RST_NAME);
|
||||
@@ -1557,6 +1532,7 @@ MODULE_DEVICE_TABLE(i2c, goodix_ts_id);
|
||||
static const struct acpi_device_id goodix_acpi_match[] = {
|
||||
{ "GDIX1001", 0 },
|
||||
{ "GDIX1002", 0 },
|
||||
{ "GDIX1003", 0 },
|
||||
{ "GDX9110", 0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -88,7 +88,6 @@ struct goodix_ts_data {
|
||||
struct gpio_desc *gpiod_rst;
|
||||
int gpio_count;
|
||||
int gpio_int_idx;
|
||||
enum gpiod_flags gpiod_rst_flags;
|
||||
char id[GOODIX_ID_MAX_LEN + 1];
|
||||
char cfg_name[64];
|
||||
u16 version;
|
||||
|
||||
@@ -1109,7 +1109,7 @@ static irqreturn_t pmu_sbi_ovf_handler(int irq, void *dev)
|
||||
/* compute hardware counter index */
|
||||
hidx = info->csr - CSR_CYCLE;
|
||||
|
||||
/* check if the corresponding bit is set in sscountovf or overflow mask in shmem */
|
||||
/* check if the corresponding bit is set in scountovf or overflow mask in shmem */
|
||||
if (!(overflow & BIT(hidx)))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -2208,9 +2208,17 @@ sg_remove_sfp_usercontext(struct work_struct *work)
|
||||
write_lock_irqsave(&sfp->rq_list_lock, iflags);
|
||||
while (!list_empty(&sfp->rq_list)) {
|
||||
srp = list_first_entry(&sfp->rq_list, Sg_request, entry);
|
||||
sg_finish_rem_req(srp);
|
||||
list_del(&srp->entry);
|
||||
write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
|
||||
|
||||
sg_finish_rem_req(srp);
|
||||
/*
|
||||
* sg_rq_end_io() uses srp->parentfp. Hence, only clear
|
||||
* srp->parentfp after blk_mq_free_request() has been called.
|
||||
*/
|
||||
srp->parentfp = NULL;
|
||||
|
||||
write_lock_irqsave(&sfp->rq_list_lock, iflags);
|
||||
}
|
||||
write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
|
||||
|
||||
|
||||
@@ -894,6 +894,9 @@ static ssize_t tcm_loop_tpg_address_show(struct config_item *item,
|
||||
struct tcm_loop_tpg, tl_se_tpg);
|
||||
struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
|
||||
|
||||
if (!tl_hba->sh)
|
||||
return -ENODEV;
|
||||
|
||||
return snprintf(page, PAGE_SIZE, "%d:0:%d\n",
|
||||
tl_hba->sh->host_no, tl_tpg->tl_tpgt);
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ xrep_symlink_salvage_inline(
|
||||
sc->ip->i_disk_size == 1 && old_target[0] == '?')
|
||||
return 0;
|
||||
|
||||
nr = min(XFS_SYMLINK_MAXLEN, xfs_inode_data_fork_size(ip));
|
||||
nr = min(XFS_SYMLINK_MAXLEN, ifp->if_bytes);
|
||||
memcpy(target_buf, ifp->if_data, nr);
|
||||
return nr;
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */
|
||||
#define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */
|
||||
#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
|
||||
#define INPUT_PROP_HAPTIC_TOUCHPAD 0x07 /* is a haptic touchpad */
|
||||
#define INPUT_PROP_PRESSUREPAD 0x07 /* pressure triggers clicks */
|
||||
|
||||
#define INPUT_PROP_MAX 0x1f
|
||||
#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
|
||||
|
||||
@@ -11901,7 +11901,7 @@ static int cpu_clock_event_add(struct perf_event *event, int flags)
|
||||
|
||||
static void cpu_clock_event_del(struct perf_event *event, int flags)
|
||||
{
|
||||
cpu_clock_event_stop(event, flags);
|
||||
cpu_clock_event_stop(event, PERF_EF_UPDATE);
|
||||
}
|
||||
|
||||
static void cpu_clock_event_read(struct perf_event *event)
|
||||
|
||||
@@ -1152,16 +1152,15 @@ static bool report_idle_softirq(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ratelimit >= 10)
|
||||
return false;
|
||||
|
||||
/* On RT, softirq handling may be waiting on some lock */
|
||||
if (local_bh_blocked())
|
||||
return false;
|
||||
|
||||
pr_warn("NOHZ tick-stop error: local softirq work is pending, handler #%02x!!!\n",
|
||||
pending);
|
||||
ratelimit++;
|
||||
if (ratelimit < 10) {
|
||||
pr_warn("NOHZ tick-stop error: local softirq work is pending, handler #%02x!!!\n",
|
||||
pending);
|
||||
ratelimit++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3060,29 +3060,32 @@ static const struct attribute_group aux_clock_enable_attr_group = {
|
||||
static int __init tk_aux_sysfs_init(void)
|
||||
{
|
||||
struct kobject *auxo, *tko = kobject_create_and_add("time", kernel_kobj);
|
||||
int ret = -ENOMEM;
|
||||
|
||||
if (!tko)
|
||||
return -ENOMEM;
|
||||
return ret;
|
||||
|
||||
auxo = kobject_create_and_add("aux_clocks", tko);
|
||||
if (!auxo) {
|
||||
kobject_put(tko);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!auxo)
|
||||
goto err_clean;
|
||||
|
||||
for (int i = 0; i < MAX_AUX_CLOCKS; i++) {
|
||||
char id[2] = { [0] = '0' + i, };
|
||||
struct kobject *clk = kobject_create_and_add(id, auxo);
|
||||
|
||||
if (!clk)
|
||||
return -ENOMEM;
|
||||
|
||||
int ret = sysfs_create_group(clk, &aux_clock_enable_attr_group);
|
||||
goto err_clean;
|
||||
|
||||
ret = sysfs_create_group(clk, &aux_clock_enable_attr_group);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_clean;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_clean:
|
||||
kobject_put(auxo);
|
||||
kobject_put(tko);
|
||||
return ret;
|
||||
}
|
||||
late_initcall(tk_aux_sysfs_init);
|
||||
|
||||
|
||||
@@ -1458,10 +1458,11 @@ static int __try_to_del_timer_sync(struct timer_list *timer, bool shutdown)
|
||||
|
||||
base = lock_timer_base(timer, &flags);
|
||||
|
||||
if (base->running_timer != timer)
|
||||
if (base->running_timer != timer) {
|
||||
ret = detach_if_pending(timer, base, true);
|
||||
if (shutdown)
|
||||
timer->function = NULL;
|
||||
if (shutdown)
|
||||
timer->function = NULL;
|
||||
}
|
||||
|
||||
raw_spin_unlock_irqrestore(&base->lock, flags);
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ static void test_sha256_finup_2x(struct kunit *test)
|
||||
rand_bytes(data1_buf, max_data_len);
|
||||
rand_bytes(data2_buf, max_data_len);
|
||||
rand_bytes(salt, sizeof(salt));
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
|
||||
for (size_t i = 0; i < 500; i++) {
|
||||
size_t salt_len = rand_length(sizeof(salt));
|
||||
|
||||
@@ -210,12 +210,12 @@ static int selinux_lsm_notifier_avc_callback(u32 event)
|
||||
*/
|
||||
static void cred_init_security(void)
|
||||
{
|
||||
struct task_security_struct *tsec;
|
||||
struct cred_security_struct *crsec;
|
||||
|
||||
/* NOTE: the lsm framework zeros out the buffer on allocation */
|
||||
|
||||
tsec = selinux_cred(unrcu_pointer(current->real_cred));
|
||||
tsec->osid = tsec->sid = tsec->avdcache.sid = SECINITSID_KERNEL;
|
||||
crsec = selinux_cred(unrcu_pointer(current->real_cred));
|
||||
crsec->osid = crsec->sid = SECINITSID_KERNEL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -223,10 +223,10 @@ static void cred_init_security(void)
|
||||
*/
|
||||
static inline u32 cred_sid(const struct cred *cred)
|
||||
{
|
||||
const struct task_security_struct *tsec;
|
||||
const struct cred_security_struct *crsec;
|
||||
|
||||
tsec = selinux_cred(cred);
|
||||
return tsec->sid;
|
||||
crsec = selinux_cred(cred);
|
||||
return crsec->sid;
|
||||
}
|
||||
|
||||
static void __ad_net_init(struct common_audit_data *ad,
|
||||
@@ -437,15 +437,15 @@ static int may_context_mount_sb_relabel(u32 sid,
|
||||
struct superblock_security_struct *sbsec,
|
||||
const struct cred *cred)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(cred);
|
||||
const struct cred_security_struct *crsec = selinux_cred(cred);
|
||||
int rc;
|
||||
|
||||
rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
|
||||
rc = avc_has_perm(crsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
|
||||
FILESYSTEM__RELABELFROM, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
|
||||
rc = avc_has_perm(crsec->sid, sid, SECCLASS_FILESYSTEM,
|
||||
FILESYSTEM__RELABELTO, NULL);
|
||||
return rc;
|
||||
}
|
||||
@@ -454,9 +454,9 @@ static int may_context_mount_inode_relabel(u32 sid,
|
||||
struct superblock_security_struct *sbsec,
|
||||
const struct cred *cred)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(cred);
|
||||
const struct cred_security_struct *crsec = selinux_cred(cred);
|
||||
int rc;
|
||||
rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
|
||||
rc = avc_has_perm(crsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
|
||||
FILESYSTEM__RELABELFROM, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
@@ -1788,7 +1788,7 @@ out:
|
||||
* Determine the label for an inode that might be unioned.
|
||||
*/
|
||||
static int
|
||||
selinux_determine_inode_label(const struct task_security_struct *tsec,
|
||||
selinux_determine_inode_label(const struct cred_security_struct *crsec,
|
||||
struct inode *dir,
|
||||
const struct qstr *name, u16 tclass,
|
||||
u32 *_new_isid)
|
||||
@@ -1800,11 +1800,11 @@ selinux_determine_inode_label(const struct task_security_struct *tsec,
|
||||
(sbsec->behavior == SECURITY_FS_USE_MNTPOINT)) {
|
||||
*_new_isid = sbsec->mntpoint_sid;
|
||||
} else if ((sbsec->flags & SBLABEL_MNT) &&
|
||||
tsec->create_sid) {
|
||||
*_new_isid = tsec->create_sid;
|
||||
crsec->create_sid) {
|
||||
*_new_isid = crsec->create_sid;
|
||||
} else {
|
||||
const struct inode_security_struct *dsec = inode_security(dir);
|
||||
return security_transition_sid(tsec->sid,
|
||||
return security_transition_sid(crsec->sid,
|
||||
dsec->sid, tclass,
|
||||
name, _new_isid);
|
||||
}
|
||||
@@ -1817,7 +1817,7 @@ static int may_create(struct inode *dir,
|
||||
struct dentry *dentry,
|
||||
u16 tclass)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
struct inode_security_struct *dsec;
|
||||
struct superblock_security_struct *sbsec;
|
||||
u32 sid, newsid;
|
||||
@@ -1827,7 +1827,7 @@ static int may_create(struct inode *dir,
|
||||
dsec = inode_security(dir);
|
||||
sbsec = selinux_superblock(dir->i_sb);
|
||||
|
||||
sid = tsec->sid;
|
||||
sid = crsec->sid;
|
||||
|
||||
ad.type = LSM_AUDIT_DATA_DENTRY;
|
||||
ad.u.dentry = dentry;
|
||||
@@ -1838,7 +1838,7 @@ static int may_create(struct inode *dir,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = selinux_determine_inode_label(tsec, dir, &dentry->d_name, tclass,
|
||||
rc = selinux_determine_inode_label(crsec, dir, &dentry->d_name, tclass,
|
||||
&newsid);
|
||||
if (rc)
|
||||
return rc;
|
||||
@@ -2251,8 +2251,8 @@ static u32 ptrace_parent_sid(void)
|
||||
}
|
||||
|
||||
static int check_nnp_nosuid(const struct linux_binprm *bprm,
|
||||
const struct task_security_struct *old_tsec,
|
||||
const struct task_security_struct *new_tsec)
|
||||
const struct cred_security_struct *old_crsec,
|
||||
const struct cred_security_struct *new_crsec)
|
||||
{
|
||||
int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
|
||||
int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
|
||||
@@ -2262,7 +2262,7 @@ static int check_nnp_nosuid(const struct linux_binprm *bprm,
|
||||
if (!nnp && !nosuid)
|
||||
return 0; /* neither NNP nor nosuid */
|
||||
|
||||
if (new_tsec->sid == old_tsec->sid)
|
||||
if (new_crsec->sid == old_crsec->sid)
|
||||
return 0; /* No change in credentials */
|
||||
|
||||
/*
|
||||
@@ -2277,7 +2277,7 @@ static int check_nnp_nosuid(const struct linux_binprm *bprm,
|
||||
av |= PROCESS2__NNP_TRANSITION;
|
||||
if (nosuid)
|
||||
av |= PROCESS2__NOSUID_TRANSITION;
|
||||
rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
|
||||
rc = avc_has_perm(old_crsec->sid, new_crsec->sid,
|
||||
SECCLASS_PROCESS2, av, NULL);
|
||||
if (!rc)
|
||||
return 0;
|
||||
@@ -2288,8 +2288,8 @@ static int check_nnp_nosuid(const struct linux_binprm *bprm,
|
||||
* i.e. SIDs that are guaranteed to only be allowed a subset
|
||||
* of the permissions of the current SID.
|
||||
*/
|
||||
rc = security_bounded_transition(old_tsec->sid,
|
||||
new_tsec->sid);
|
||||
rc = security_bounded_transition(old_crsec->sid,
|
||||
new_crsec->sid);
|
||||
if (!rc)
|
||||
return 0;
|
||||
|
||||
@@ -2305,8 +2305,8 @@ static int check_nnp_nosuid(const struct linux_binprm *bprm,
|
||||
|
||||
static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
|
||||
{
|
||||
const struct task_security_struct *old_tsec;
|
||||
struct task_security_struct *new_tsec;
|
||||
const struct cred_security_struct *old_crsec;
|
||||
struct cred_security_struct *new_crsec;
|
||||
struct inode_security_struct *isec;
|
||||
struct common_audit_data ad;
|
||||
struct inode *inode = file_inode(bprm->file);
|
||||
@@ -2315,18 +2315,18 @@ static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
|
||||
/* SELinux context only depends on initial program or script and not
|
||||
* the script interpreter */
|
||||
|
||||
old_tsec = selinux_cred(current_cred());
|
||||
new_tsec = selinux_cred(bprm->cred);
|
||||
old_crsec = selinux_cred(current_cred());
|
||||
new_crsec = selinux_cred(bprm->cred);
|
||||
isec = inode_security(inode);
|
||||
|
||||
/* Default to the current task SID. */
|
||||
new_tsec->sid = old_tsec->sid;
|
||||
new_tsec->osid = old_tsec->sid;
|
||||
new_crsec->sid = old_crsec->sid;
|
||||
new_crsec->osid = old_crsec->sid;
|
||||
|
||||
/* Reset fs, key, and sock SIDs on execve. */
|
||||
new_tsec->create_sid = 0;
|
||||
new_tsec->keycreate_sid = 0;
|
||||
new_tsec->sockcreate_sid = 0;
|
||||
new_crsec->create_sid = 0;
|
||||
new_crsec->keycreate_sid = 0;
|
||||
new_crsec->sockcreate_sid = 0;
|
||||
|
||||
/*
|
||||
* Before policy is loaded, label any task outside kernel space
|
||||
@@ -2335,26 +2335,26 @@ static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
|
||||
* (if the policy chooses to set SECINITSID_INIT != SECINITSID_KERNEL).
|
||||
*/
|
||||
if (!selinux_initialized()) {
|
||||
new_tsec->sid = SECINITSID_INIT;
|
||||
new_crsec->sid = SECINITSID_INIT;
|
||||
/* also clear the exec_sid just in case */
|
||||
new_tsec->exec_sid = 0;
|
||||
new_crsec->exec_sid = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (old_tsec->exec_sid) {
|
||||
new_tsec->sid = old_tsec->exec_sid;
|
||||
if (old_crsec->exec_sid) {
|
||||
new_crsec->sid = old_crsec->exec_sid;
|
||||
/* Reset exec SID on execve. */
|
||||
new_tsec->exec_sid = 0;
|
||||
new_crsec->exec_sid = 0;
|
||||
|
||||
/* Fail on NNP or nosuid if not an allowed transition. */
|
||||
rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
|
||||
rc = check_nnp_nosuid(bprm, old_crsec, new_crsec);
|
||||
if (rc)
|
||||
return rc;
|
||||
} else {
|
||||
/* Check for a default transition on this program. */
|
||||
rc = security_transition_sid(old_tsec->sid,
|
||||
rc = security_transition_sid(old_crsec->sid,
|
||||
isec->sid, SECCLASS_PROCESS, NULL,
|
||||
&new_tsec->sid);
|
||||
&new_crsec->sid);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -2362,34 +2362,34 @@ static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
|
||||
* Fallback to old SID on NNP or nosuid if not an allowed
|
||||
* transition.
|
||||
*/
|
||||
rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
|
||||
rc = check_nnp_nosuid(bprm, old_crsec, new_crsec);
|
||||
if (rc)
|
||||
new_tsec->sid = old_tsec->sid;
|
||||
new_crsec->sid = old_crsec->sid;
|
||||
}
|
||||
|
||||
ad.type = LSM_AUDIT_DATA_FILE;
|
||||
ad.u.file = bprm->file;
|
||||
|
||||
if (new_tsec->sid == old_tsec->sid) {
|
||||
rc = avc_has_perm(old_tsec->sid, isec->sid,
|
||||
if (new_crsec->sid == old_crsec->sid) {
|
||||
rc = avc_has_perm(old_crsec->sid, isec->sid,
|
||||
SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
|
||||
if (rc)
|
||||
return rc;
|
||||
} else {
|
||||
/* Check permissions for the transition. */
|
||||
rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
|
||||
rc = avc_has_perm(old_crsec->sid, new_crsec->sid,
|
||||
SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = avc_has_perm(new_tsec->sid, isec->sid,
|
||||
rc = avc_has_perm(new_crsec->sid, isec->sid,
|
||||
SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Check for shared state */
|
||||
if (bprm->unsafe & LSM_UNSAFE_SHARE) {
|
||||
rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
|
||||
rc = avc_has_perm(old_crsec->sid, new_crsec->sid,
|
||||
SECCLASS_PROCESS, PROCESS__SHARE,
|
||||
NULL);
|
||||
if (rc)
|
||||
@@ -2401,7 +2401,7 @@ static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
|
||||
if (bprm->unsafe & LSM_UNSAFE_PTRACE) {
|
||||
u32 ptsid = ptrace_parent_sid();
|
||||
if (ptsid != 0) {
|
||||
rc = avc_has_perm(ptsid, new_tsec->sid,
|
||||
rc = avc_has_perm(ptsid, new_crsec->sid,
|
||||
SECCLASS_PROCESS,
|
||||
PROCESS__PTRACE, NULL);
|
||||
if (rc)
|
||||
@@ -2415,7 +2415,7 @@ static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
|
||||
/* Enable secure mode for SIDs transitions unless
|
||||
the noatsecure permission is granted between
|
||||
the two SIDs, i.e. ahp returns 0. */
|
||||
rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
|
||||
rc = avc_has_perm(old_crsec->sid, new_crsec->sid,
|
||||
SECCLASS_PROCESS, PROCESS__NOATSECURE,
|
||||
NULL);
|
||||
bprm->secureexec |= !!rc;
|
||||
@@ -2483,12 +2483,12 @@ static inline void flush_unauthorized_files(const struct cred *cred,
|
||||
*/
|
||||
static void selinux_bprm_committing_creds(const struct linux_binprm *bprm)
|
||||
{
|
||||
struct task_security_struct *new_tsec;
|
||||
struct cred_security_struct *new_crsec;
|
||||
struct rlimit *rlim, *initrlim;
|
||||
int rc, i;
|
||||
|
||||
new_tsec = selinux_cred(bprm->cred);
|
||||
if (new_tsec->sid == new_tsec->osid)
|
||||
new_crsec = selinux_cred(bprm->cred);
|
||||
if (new_crsec->sid == new_crsec->osid)
|
||||
return;
|
||||
|
||||
/* Close files for which the new task SID is not authorized. */
|
||||
@@ -2507,7 +2507,7 @@ static void selinux_bprm_committing_creds(const struct linux_binprm *bprm)
|
||||
* higher than the default soft limit for cases where the default is
|
||||
* lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
|
||||
*/
|
||||
rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
|
||||
rc = avc_has_perm(new_crsec->osid, new_crsec->sid, SECCLASS_PROCESS,
|
||||
PROCESS__RLIMITINH, NULL);
|
||||
if (rc) {
|
||||
/* protect against do_prlimit() */
|
||||
@@ -2529,12 +2529,12 @@ static void selinux_bprm_committing_creds(const struct linux_binprm *bprm)
|
||||
*/
|
||||
static void selinux_bprm_committed_creds(const struct linux_binprm *bprm)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
u32 osid, sid;
|
||||
int rc;
|
||||
|
||||
osid = tsec->osid;
|
||||
sid = tsec->sid;
|
||||
osid = crsec->osid;
|
||||
sid = crsec->sid;
|
||||
|
||||
if (sid == osid)
|
||||
return;
|
||||
@@ -2911,7 +2911,7 @@ static int selinux_dentry_create_files_as(struct dentry *dentry, int mode,
|
||||
{
|
||||
u32 newsid;
|
||||
int rc;
|
||||
struct task_security_struct *tsec;
|
||||
struct cred_security_struct *crsec;
|
||||
|
||||
rc = selinux_determine_inode_label(selinux_cred(old),
|
||||
d_inode(dentry->d_parent), name,
|
||||
@@ -2920,8 +2920,8 @@ static int selinux_dentry_create_files_as(struct dentry *dentry, int mode,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
tsec = selinux_cred(new);
|
||||
tsec->create_sid = newsid;
|
||||
crsec = selinux_cred(new);
|
||||
crsec->create_sid = newsid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2929,7 +2929,7 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
|
||||
const struct qstr *qstr,
|
||||
struct xattr *xattrs, int *xattr_count)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
struct superblock_security_struct *sbsec;
|
||||
struct xattr *xattr = lsm_get_xattr_slot(xattrs, xattr_count);
|
||||
u32 newsid, clen;
|
||||
@@ -2939,9 +2939,9 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
|
||||
|
||||
sbsec = selinux_superblock(dir->i_sb);
|
||||
|
||||
newsid = tsec->create_sid;
|
||||
newsid = crsec->create_sid;
|
||||
newsclass = inode_mode_to_security_class(inode->i_mode);
|
||||
rc = selinux_determine_inode_label(tsec, dir, qstr, newsclass, &newsid);
|
||||
rc = selinux_determine_inode_label(crsec, dir, qstr, newsclass, &newsid);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -3113,7 +3113,7 @@ static noinline int audit_inode_permission(struct inode *inode,
|
||||
static inline void task_avdcache_reset(struct task_security_struct *tsec)
|
||||
{
|
||||
memset(&tsec->avdcache.dir, 0, sizeof(tsec->avdcache.dir));
|
||||
tsec->avdcache.sid = tsec->sid;
|
||||
tsec->avdcache.sid = current_sid();
|
||||
tsec->avdcache.seqno = avc_policy_seqno();
|
||||
tsec->avdcache.dir_spot = TSEC_AVDC_DIR_SIZE - 1;
|
||||
}
|
||||
@@ -3137,7 +3137,7 @@ static inline int task_avdcache_search(struct task_security_struct *tsec,
|
||||
if (isec->sclass != SECCLASS_DIR)
|
||||
return -ENOENT;
|
||||
|
||||
if (unlikely(tsec->sid != tsec->avdcache.sid ||
|
||||
if (unlikely(current_sid() != tsec->avdcache.sid ||
|
||||
tsec->avdcache.seqno != avc_policy_seqno())) {
|
||||
task_avdcache_reset(tsec);
|
||||
return -ENOENT;
|
||||
@@ -3201,6 +3201,7 @@ static int selinux_inode_permission(struct inode *inode, int requested)
|
||||
{
|
||||
int mask;
|
||||
u32 perms;
|
||||
u32 sid = current_sid();
|
||||
struct task_security_struct *tsec;
|
||||
struct inode_security_struct *isec;
|
||||
struct avdc_entry *avdc;
|
||||
@@ -3213,8 +3214,8 @@ static int selinux_inode_permission(struct inode *inode, int requested)
|
||||
if (!mask)
|
||||
return 0;
|
||||
|
||||
tsec = selinux_cred(current_cred());
|
||||
if (task_avdcache_permnoaudit(tsec))
|
||||
tsec = selinux_task(current);
|
||||
if (task_avdcache_permnoaudit(tsec, sid))
|
||||
return 0;
|
||||
|
||||
isec = inode_security_rcu(inode, requested & MAY_NOT_BLOCK);
|
||||
@@ -3234,7 +3235,7 @@ static int selinux_inode_permission(struct inode *inode, int requested)
|
||||
struct av_decision avd;
|
||||
|
||||
/* Cache miss. */
|
||||
rc = avc_has_perm_noaudit(tsec->sid, isec->sid, isec->sclass,
|
||||
rc = avc_has_perm_noaudit(sid, isec->sid, isec->sclass,
|
||||
perms, 0, &avd);
|
||||
audited = avc_audit_required(perms, &avd, rc,
|
||||
(requested & MAY_ACCESS) ? FILE__AUDIT_ACCESS : 0,
|
||||
@@ -3285,9 +3286,9 @@ static int selinux_inode_getattr(const struct path *path)
|
||||
{
|
||||
struct task_security_struct *tsec;
|
||||
|
||||
tsec = selinux_cred(current_cred());
|
||||
tsec = selinux_task(current);
|
||||
|
||||
if (task_avdcache_permnoaudit(tsec))
|
||||
if (task_avdcache_permnoaudit(tsec, current_sid()))
|
||||
return 0;
|
||||
|
||||
return path_has_perm(current_cred(), path, FILE__GETATTR);
|
||||
@@ -3659,7 +3660,7 @@ static void selinux_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop)
|
||||
static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
|
||||
{
|
||||
struct lsm_prop prop;
|
||||
struct task_security_struct *tsec;
|
||||
struct cred_security_struct *crsec;
|
||||
struct cred *new_creds = *new;
|
||||
|
||||
if (new_creds == NULL) {
|
||||
@@ -3668,10 +3669,10 @@ static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tsec = selinux_cred(new_creds);
|
||||
crsec = selinux_cred(new_creds);
|
||||
/* Get label from overlay inode and set it in create_sid */
|
||||
selinux_inode_getlsmprop(d_inode(src), &prop);
|
||||
tsec->create_sid = prop.selinux.secid;
|
||||
crsec->create_sid = prop.selinux.secid;
|
||||
*new = new_creds;
|
||||
return 0;
|
||||
}
|
||||
@@ -3697,7 +3698,7 @@ static int selinux_inode_copy_up_xattr(struct dentry *dentry, const char *name)
|
||||
static int selinux_kernfs_init_security(struct kernfs_node *kn_dir,
|
||||
struct kernfs_node *kn)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
u32 parent_sid, newsid, clen;
|
||||
int rc;
|
||||
char *context;
|
||||
@@ -3725,8 +3726,8 @@ static int selinux_kernfs_init_security(struct kernfs_node *kn_dir,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (tsec->create_sid) {
|
||||
newsid = tsec->create_sid;
|
||||
if (crsec->create_sid) {
|
||||
newsid = crsec->create_sid;
|
||||
} else {
|
||||
u16 secclass = inode_mode_to_security_class(kn->mode);
|
||||
const char *kn_name;
|
||||
@@ -3737,7 +3738,7 @@ static int selinux_kernfs_init_security(struct kernfs_node *kn_dir,
|
||||
q.name = kn_name;
|
||||
q.hash_len = hashlen_string(kn_dir, kn_name);
|
||||
|
||||
rc = security_transition_sid(tsec->sid,
|
||||
rc = security_transition_sid(crsec->sid,
|
||||
parent_sid, secclass, &q,
|
||||
&newsid);
|
||||
if (rc)
|
||||
@@ -4151,7 +4152,10 @@ static int selinux_task_alloc(struct task_struct *task,
|
||||
u64 clone_flags)
|
||||
{
|
||||
u32 sid = current_sid();
|
||||
struct task_security_struct *old_tsec = selinux_task(current);
|
||||
struct task_security_struct *new_tsec = selinux_task(task);
|
||||
|
||||
*new_tsec = *old_tsec;
|
||||
return avc_has_perm(sid, sid, SECCLASS_PROCESS, PROCESS__FORK, NULL);
|
||||
}
|
||||
|
||||
@@ -4161,10 +4165,10 @@ static int selinux_task_alloc(struct task_struct *task,
|
||||
static int selinux_cred_prepare(struct cred *new, const struct cred *old,
|
||||
gfp_t gfp)
|
||||
{
|
||||
const struct task_security_struct *old_tsec = selinux_cred(old);
|
||||
struct task_security_struct *tsec = selinux_cred(new);
|
||||
const struct cred_security_struct *old_crsec = selinux_cred(old);
|
||||
struct cred_security_struct *crsec = selinux_cred(new);
|
||||
|
||||
*tsec = *old_tsec;
|
||||
*crsec = *old_crsec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4173,10 +4177,10 @@ static int selinux_cred_prepare(struct cred *new, const struct cred *old,
|
||||
*/
|
||||
static void selinux_cred_transfer(struct cred *new, const struct cred *old)
|
||||
{
|
||||
const struct task_security_struct *old_tsec = selinux_cred(old);
|
||||
struct task_security_struct *tsec = selinux_cred(new);
|
||||
const struct cred_security_struct *old_crsec = selinux_cred(old);
|
||||
struct cred_security_struct *crsec = selinux_cred(new);
|
||||
|
||||
*tsec = *old_tsec;
|
||||
*crsec = *old_crsec;
|
||||
}
|
||||
|
||||
static void selinux_cred_getsecid(const struct cred *c, u32 *secid)
|
||||
@@ -4195,7 +4199,7 @@ static void selinux_cred_getlsmprop(const struct cred *c, struct lsm_prop *prop)
|
||||
*/
|
||||
static int selinux_kernel_act_as(struct cred *new, u32 secid)
|
||||
{
|
||||
struct task_security_struct *tsec = selinux_cred(new);
|
||||
struct cred_security_struct *crsec = selinux_cred(new);
|
||||
u32 sid = current_sid();
|
||||
int ret;
|
||||
|
||||
@@ -4204,10 +4208,10 @@ static int selinux_kernel_act_as(struct cred *new, u32 secid)
|
||||
KERNEL_SERVICE__USE_AS_OVERRIDE,
|
||||
NULL);
|
||||
if (ret == 0) {
|
||||
tsec->sid = secid;
|
||||
tsec->create_sid = 0;
|
||||
tsec->keycreate_sid = 0;
|
||||
tsec->sockcreate_sid = 0;
|
||||
crsec->sid = secid;
|
||||
crsec->create_sid = 0;
|
||||
crsec->keycreate_sid = 0;
|
||||
crsec->sockcreate_sid = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -4219,7 +4223,7 @@ static int selinux_kernel_act_as(struct cred *new, u32 secid)
|
||||
static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
|
||||
{
|
||||
struct inode_security_struct *isec = inode_security(inode);
|
||||
struct task_security_struct *tsec = selinux_cred(new);
|
||||
struct cred_security_struct *crsec = selinux_cred(new);
|
||||
u32 sid = current_sid();
|
||||
int ret;
|
||||
|
||||
@@ -4229,7 +4233,7 @@ static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
|
||||
NULL);
|
||||
|
||||
if (ret == 0)
|
||||
tsec->create_sid = isec->sid;
|
||||
crsec->create_sid = isec->sid;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4744,15 +4748,15 @@ static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
|
||||
|
||||
/* socket security operations */
|
||||
|
||||
static int socket_sockcreate_sid(const struct task_security_struct *tsec,
|
||||
static int socket_sockcreate_sid(const struct cred_security_struct *crsec,
|
||||
u16 secclass, u32 *socksid)
|
||||
{
|
||||
if (tsec->sockcreate_sid > SECSID_NULL) {
|
||||
*socksid = tsec->sockcreate_sid;
|
||||
if (crsec->sockcreate_sid > SECSID_NULL) {
|
||||
*socksid = crsec->sockcreate_sid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return security_transition_sid(tsec->sid, tsec->sid,
|
||||
return security_transition_sid(crsec->sid, crsec->sid,
|
||||
secclass, NULL, socksid);
|
||||
}
|
||||
|
||||
@@ -4797,7 +4801,7 @@ static int sock_has_perm(struct sock *sk, u32 perms)
|
||||
static int selinux_socket_create(int family, int type,
|
||||
int protocol, int kern)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
u32 newsid;
|
||||
u16 secclass;
|
||||
int rc;
|
||||
@@ -4806,17 +4810,17 @@ static int selinux_socket_create(int family, int type,
|
||||
return 0;
|
||||
|
||||
secclass = socket_type_to_security_class(family, type, protocol);
|
||||
rc = socket_sockcreate_sid(tsec, secclass, &newsid);
|
||||
rc = socket_sockcreate_sid(crsec, secclass, &newsid);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
|
||||
return avc_has_perm(crsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
|
||||
}
|
||||
|
||||
static int selinux_socket_post_create(struct socket *sock, int family,
|
||||
int type, int protocol, int kern)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(sock));
|
||||
struct sk_security_struct *sksec;
|
||||
u16 sclass = socket_type_to_security_class(family, type, protocol);
|
||||
@@ -4824,7 +4828,7 @@ static int selinux_socket_post_create(struct socket *sock, int family,
|
||||
int err = 0;
|
||||
|
||||
if (!kern) {
|
||||
err = socket_sockcreate_sid(tsec, sclass, &sid);
|
||||
err = socket_sockcreate_sid(crsec, sclass, &sid);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@@ -6526,37 +6530,37 @@ static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
|
||||
static int selinux_lsm_getattr(unsigned int attr, struct task_struct *p,
|
||||
char **value)
|
||||
{
|
||||
const struct task_security_struct *tsec;
|
||||
const struct cred_security_struct *crsec;
|
||||
int error;
|
||||
u32 sid;
|
||||
u32 len;
|
||||
|
||||
rcu_read_lock();
|
||||
tsec = selinux_cred(__task_cred(p));
|
||||
crsec = selinux_cred(__task_cred(p));
|
||||
if (p != current) {
|
||||
error = avc_has_perm(current_sid(), tsec->sid,
|
||||
error = avc_has_perm(current_sid(), crsec->sid,
|
||||
SECCLASS_PROCESS, PROCESS__GETATTR, NULL);
|
||||
if (error)
|
||||
goto err_unlock;
|
||||
}
|
||||
switch (attr) {
|
||||
case LSM_ATTR_CURRENT:
|
||||
sid = tsec->sid;
|
||||
sid = crsec->sid;
|
||||
break;
|
||||
case LSM_ATTR_PREV:
|
||||
sid = tsec->osid;
|
||||
sid = crsec->osid;
|
||||
break;
|
||||
case LSM_ATTR_EXEC:
|
||||
sid = tsec->exec_sid;
|
||||
sid = crsec->exec_sid;
|
||||
break;
|
||||
case LSM_ATTR_FSCREATE:
|
||||
sid = tsec->create_sid;
|
||||
sid = crsec->create_sid;
|
||||
break;
|
||||
case LSM_ATTR_KEYCREATE:
|
||||
sid = tsec->keycreate_sid;
|
||||
sid = crsec->keycreate_sid;
|
||||
break;
|
||||
case LSM_ATTR_SOCKCREATE:
|
||||
sid = tsec->sockcreate_sid;
|
||||
sid = crsec->sockcreate_sid;
|
||||
break;
|
||||
default:
|
||||
error = -EOPNOTSUPP;
|
||||
@@ -6581,7 +6585,7 @@ err_unlock:
|
||||
|
||||
static int selinux_lsm_setattr(u64 attr, void *value, size_t size)
|
||||
{
|
||||
struct task_security_struct *tsec;
|
||||
struct cred_security_struct *crsec;
|
||||
struct cred *new;
|
||||
u32 mysid = current_sid(), sid = 0, ptsid;
|
||||
int error;
|
||||
@@ -6667,11 +6671,11 @@ static int selinux_lsm_setattr(u64 attr, void *value, size_t size)
|
||||
operation. See selinux_bprm_creds_for_exec for the execve
|
||||
checks and may_create for the file creation checks. The
|
||||
operation will then fail if the context is not permitted. */
|
||||
tsec = selinux_cred(new);
|
||||
crsec = selinux_cred(new);
|
||||
if (attr == LSM_ATTR_EXEC) {
|
||||
tsec->exec_sid = sid;
|
||||
crsec->exec_sid = sid;
|
||||
} else if (attr == LSM_ATTR_FSCREATE) {
|
||||
tsec->create_sid = sid;
|
||||
crsec->create_sid = sid;
|
||||
} else if (attr == LSM_ATTR_KEYCREATE) {
|
||||
if (sid) {
|
||||
error = avc_has_perm(mysid, sid,
|
||||
@@ -6679,22 +6683,22 @@ static int selinux_lsm_setattr(u64 attr, void *value, size_t size)
|
||||
if (error)
|
||||
goto abort_change;
|
||||
}
|
||||
tsec->keycreate_sid = sid;
|
||||
crsec->keycreate_sid = sid;
|
||||
} else if (attr == LSM_ATTR_SOCKCREATE) {
|
||||
tsec->sockcreate_sid = sid;
|
||||
crsec->sockcreate_sid = sid;
|
||||
} else if (attr == LSM_ATTR_CURRENT) {
|
||||
error = -EINVAL;
|
||||
if (sid == 0)
|
||||
goto abort_change;
|
||||
|
||||
if (!current_is_single_threaded()) {
|
||||
error = security_bounded_transition(tsec->sid, sid);
|
||||
error = security_bounded_transition(crsec->sid, sid);
|
||||
if (error)
|
||||
goto abort_change;
|
||||
}
|
||||
|
||||
/* Check permissions for the transition. */
|
||||
error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
|
||||
error = avc_has_perm(crsec->sid, sid, SECCLASS_PROCESS,
|
||||
PROCESS__DYNTRANSITION, NULL);
|
||||
if (error)
|
||||
goto abort_change;
|
||||
@@ -6709,7 +6713,7 @@ static int selinux_lsm_setattr(u64 attr, void *value, size_t size)
|
||||
goto abort_change;
|
||||
}
|
||||
|
||||
tsec->sid = sid;
|
||||
crsec->sid = sid;
|
||||
} else {
|
||||
error = -EINVAL;
|
||||
goto abort_change;
|
||||
@@ -6876,14 +6880,14 @@ static int selinux_inode_getsecctx(struct inode *inode, struct lsm_context *cp)
|
||||
static int selinux_key_alloc(struct key *k, const struct cred *cred,
|
||||
unsigned long flags)
|
||||
{
|
||||
const struct task_security_struct *tsec;
|
||||
const struct cred_security_struct *crsec;
|
||||
struct key_security_struct *ksec = selinux_key(k);
|
||||
|
||||
tsec = selinux_cred(cred);
|
||||
if (tsec->keycreate_sid)
|
||||
ksec->sid = tsec->keycreate_sid;
|
||||
crsec = selinux_cred(cred);
|
||||
if (crsec->keycreate_sid)
|
||||
ksec->sid = crsec->keycreate_sid;
|
||||
else
|
||||
ksec->sid = tsec->sid;
|
||||
ksec->sid = crsec->sid;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -7137,7 +7141,8 @@ static int selinux_bpf_token_create(struct bpf_token *token, union bpf_attr *att
|
||||
#endif
|
||||
|
||||
struct lsm_blob_sizes selinux_blob_sizes __ro_after_init = {
|
||||
.lbs_cred = sizeof(struct task_security_struct),
|
||||
.lbs_cred = sizeof(struct cred_security_struct),
|
||||
.lbs_task = sizeof(struct task_security_struct),
|
||||
.lbs_file = sizeof(struct file_security_struct),
|
||||
.lbs_inode = sizeof(struct inode_security_struct),
|
||||
.lbs_ipc = sizeof(struct ipc_security_struct),
|
||||
|
||||
@@ -37,13 +37,16 @@ struct avdc_entry {
|
||||
bool permissive; /* AVC permissive flag */
|
||||
};
|
||||
|
||||
struct task_security_struct {
|
||||
struct cred_security_struct {
|
||||
u32 osid; /* SID prior to last execve */
|
||||
u32 sid; /* current SID */
|
||||
u32 exec_sid; /* exec SID */
|
||||
u32 create_sid; /* fscreate SID */
|
||||
u32 keycreate_sid; /* keycreate SID */
|
||||
u32 sockcreate_sid; /* fscreate SID */
|
||||
} __randomize_layout;
|
||||
|
||||
struct task_security_struct {
|
||||
#define TSEC_AVDC_DIR_SIZE (1 << 2)
|
||||
struct {
|
||||
u32 sid; /* current SID for cached entries */
|
||||
@@ -54,10 +57,11 @@ struct task_security_struct {
|
||||
} avdcache;
|
||||
} __randomize_layout;
|
||||
|
||||
static inline bool task_avdcache_permnoaudit(struct task_security_struct *tsec)
|
||||
static inline bool task_avdcache_permnoaudit(struct task_security_struct *tsec,
|
||||
u32 sid)
|
||||
{
|
||||
return (tsec->avdcache.permissive_neveraudit &&
|
||||
tsec->sid == tsec->avdcache.sid &&
|
||||
sid == tsec->avdcache.sid &&
|
||||
tsec->avdcache.seqno == avc_policy_seqno());
|
||||
}
|
||||
|
||||
@@ -172,11 +176,17 @@ struct perf_event_security_struct {
|
||||
};
|
||||
|
||||
extern struct lsm_blob_sizes selinux_blob_sizes;
|
||||
static inline struct task_security_struct *selinux_cred(const struct cred *cred)
|
||||
static inline struct cred_security_struct *selinux_cred(const struct cred *cred)
|
||||
{
|
||||
return cred->security + selinux_blob_sizes.lbs_cred;
|
||||
}
|
||||
|
||||
static inline struct task_security_struct *
|
||||
selinux_task(const struct task_struct *task)
|
||||
{
|
||||
return task->security + selinux_blob_sizes.lbs_task;
|
||||
}
|
||||
|
||||
static inline struct file_security_struct *selinux_file(const struct file *file)
|
||||
{
|
||||
return file->f_security + selinux_blob_sizes.lbs_file;
|
||||
@@ -207,9 +217,9 @@ selinux_ipc(const struct kern_ipc_perm *ipc)
|
||||
*/
|
||||
static inline u32 current_sid(void)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
const struct cred_security_struct *crsec = selinux_cred(current_cred());
|
||||
|
||||
return tsec->sid;
|
||||
return crsec->sid;
|
||||
}
|
||||
|
||||
static inline struct superblock_security_struct *
|
||||
|
||||
@@ -167,7 +167,8 @@
|
||||
#define VSIP_TO_HVIP_SHIFT (IRQ_VS_SOFT - IRQ_S_SOFT)
|
||||
#define VSIP_VALID_MASK ((_AC(1, UL) << IRQ_S_SOFT) | \
|
||||
(_AC(1, UL) << IRQ_S_TIMER) | \
|
||||
(_AC(1, UL) << IRQ_S_EXT))
|
||||
(_AC(1, UL) << IRQ_S_EXT) | \
|
||||
(_AC(1, UL) << IRQ_PMU_OVF))
|
||||
|
||||
/* AIA CSR bits */
|
||||
#define TOPI_IID_SHIFT 16
|
||||
@@ -280,7 +281,7 @@
|
||||
#define CSR_HPMCOUNTER30H 0xc9e
|
||||
#define CSR_HPMCOUNTER31H 0xc9f
|
||||
|
||||
#define CSR_SSCOUNTOVF 0xda0
|
||||
#define CSR_SCOUNTOVF 0xda0
|
||||
|
||||
#define CSR_SSTATUS 0x100
|
||||
#define CSR_SIE 0x104
|
||||
|
||||
Reference in New Issue
Block a user