Merge ec7b2e7b36
("i2c: i801: unregister tco_pdev in i801_probe() error path") into android11-5.4-lts
Steps on the way to 5.4.258 Change-Id: I62d8abfa7b4b354b8205212c08264431faaeb479 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
74e7ad6a22
@ -247,6 +247,11 @@ static bool stepping_handler(struct pt_regs *regs, struct perf_event *bp,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle a DABR or DAWR exception.
|
||||||
|
*
|
||||||
|
* Called in atomic context.
|
||||||
|
*/
|
||||||
int hw_breakpoint_handler(struct die_args *args)
|
int hw_breakpoint_handler(struct die_args *args)
|
||||||
{
|
{
|
||||||
int rc = NOTIFY_STOP;
|
int rc = NOTIFY_STOP;
|
||||||
@ -315,6 +320,8 @@ NOKPROBE_SYMBOL(hw_breakpoint_handler);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle single-step exceptions following a DABR hit.
|
* Handle single-step exceptions following a DABR hit.
|
||||||
|
*
|
||||||
|
* Called in atomic context.
|
||||||
*/
|
*/
|
||||||
static int single_step_dabr_instruction(struct die_args *args)
|
static int single_step_dabr_instruction(struct die_args *args)
|
||||||
{
|
{
|
||||||
@ -355,6 +362,8 @@ NOKPROBE_SYMBOL(single_step_dabr_instruction);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle debug exception notifications.
|
* Handle debug exception notifications.
|
||||||
|
*
|
||||||
|
* Called in atomic context.
|
||||||
*/
|
*/
|
||||||
int hw_breakpoint_exceptions_notify(
|
int hw_breakpoint_exceptions_notify(
|
||||||
struct notifier_block *unused, unsigned long val, void *data)
|
struct notifier_block *unused, unsigned long val, void *data)
|
||||||
|
@ -2901,18 +2901,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
|||||||
postreset(slave, classes);
|
postreset(slave, classes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* clear cached SError */
|
||||||
* Some controllers can't be frozen very well and may set spurious
|
|
||||||
* error conditions during reset. Clear accumulated error
|
|
||||||
* information and re-thaw the port if frozen. As reset is the
|
|
||||||
* final recovery action and we cross check link onlineness against
|
|
||||||
* device classification later, no hotplug event is lost by this.
|
|
||||||
*/
|
|
||||||
spin_lock_irqsave(link->ap->lock, flags);
|
spin_lock_irqsave(link->ap->lock, flags);
|
||||||
memset(&link->eh_info, 0, sizeof(link->eh_info));
|
link->eh_info.serror = 0;
|
||||||
if (slave)
|
if (slave)
|
||||||
memset(&slave->eh_info, 0, sizeof(link->eh_info));
|
slave->eh_info.serror = 0;
|
||||||
ap->pflags &= ~ATA_PFLAG_EH_PENDING;
|
|
||||||
spin_unlock_irqrestore(link->ap->lock, flags);
|
spin_unlock_irqrestore(link->ap->lock, flags);
|
||||||
|
|
||||||
if (ap->pflags & ATA_PFLAG_FROZEN)
|
if (ap->pflags & ATA_PFLAG_FROZEN)
|
||||||
|
@ -4544,7 +4544,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MAINTENANCE_IN:
|
case MAINTENANCE_IN:
|
||||||
if (scsicmd[1] == MI_REPORT_SUPPORTED_OPERATION_CODES)
|
if ((scsicmd[1] & 0x1f) == MI_REPORT_SUPPORTED_OPERATION_CODES)
|
||||||
ata_scsi_rbuf_fill(&args, ata_scsiop_maint_in);
|
ata_scsi_rbuf_fill(&args, ata_scsiop_maint_in);
|
||||||
else
|
else
|
||||||
ata_scsi_set_invalid_field(dev, cmd, 1, 0xff);
|
ata_scsi_set_invalid_field(dev, cmd, 1, 0xff);
|
||||||
|
@ -1873,6 +1873,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||||||
"SMBus I801 adapter at %04lx", priv->smba);
|
"SMBus I801 adapter at %04lx", priv->smba);
|
||||||
err = i2c_add_adapter(&priv->adapter);
|
err = i2c_add_adapter(&priv->adapter);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
platform_device_unregister(priv->tco_pdev);
|
||||||
i801_acpi_remove(priv);
|
i801_acpi_remove(priv);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1117,15 +1117,15 @@ static int i40e_quiesce_vf_pci(struct i40e_vf *vf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* i40e_getnum_vf_vsi_vlan_filters
|
* __i40e_getnum_vf_vsi_vlan_filters
|
||||||
* @vsi: pointer to the vsi
|
* @vsi: pointer to the vsi
|
||||||
*
|
*
|
||||||
* called to get the number of VLANs offloaded on this VF
|
* called to get the number of VLANs offloaded on this VF
|
||||||
**/
|
**/
|
||||||
static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
static int __i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
||||||
{
|
{
|
||||||
struct i40e_mac_filter *f;
|
struct i40e_mac_filter *f;
|
||||||
int num_vlans = 0, bkt;
|
u16 num_vlans = 0, bkt;
|
||||||
|
|
||||||
hash_for_each(vsi->mac_filter_hash, bkt, f, hlist) {
|
hash_for_each(vsi->mac_filter_hash, bkt, f, hlist) {
|
||||||
if (f->vlan >= 0 && f->vlan <= I40E_MAX_VLANID)
|
if (f->vlan >= 0 && f->vlan <= I40E_MAX_VLANID)
|
||||||
@ -1135,6 +1135,23 @@ static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
|||||||
return num_vlans;
|
return num_vlans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i40e_getnum_vf_vsi_vlan_filters
|
||||||
|
* @vsi: pointer to the vsi
|
||||||
|
*
|
||||||
|
* wrapper for __i40e_getnum_vf_vsi_vlan_filters() with spinlock held
|
||||||
|
**/
|
||||||
|
static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
||||||
|
{
|
||||||
|
int num_vlans;
|
||||||
|
|
||||||
|
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||||
|
num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi);
|
||||||
|
spin_unlock_bh(&vsi->mac_filter_hash_lock);
|
||||||
|
|
||||||
|
return num_vlans;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* i40e_get_vlan_list_sync
|
* i40e_get_vlan_list_sync
|
||||||
* @vsi: pointer to the VSI
|
* @vsi: pointer to the VSI
|
||||||
@ -1144,15 +1161,15 @@ static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
|||||||
*
|
*
|
||||||
* Called to get number of VLANs and VLAN list present in mac_filter_hash.
|
* Called to get number of VLANs and VLAN list present in mac_filter_hash.
|
||||||
**/
|
**/
|
||||||
static void i40e_get_vlan_list_sync(struct i40e_vsi *vsi, int *num_vlans,
|
static void i40e_get_vlan_list_sync(struct i40e_vsi *vsi, u16 *num_vlans,
|
||||||
s16 **vlan_list)
|
s16 **vlan_list)
|
||||||
{
|
{
|
||||||
struct i40e_mac_filter *f;
|
struct i40e_mac_filter *f;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int bkt;
|
int bkt;
|
||||||
|
|
||||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||||
*num_vlans = i40e_getnum_vf_vsi_vlan_filters(vsi);
|
*num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi);
|
||||||
*vlan_list = kcalloc(*num_vlans, sizeof(**vlan_list), GFP_ATOMIC);
|
*vlan_list = kcalloc(*num_vlans, sizeof(**vlan_list), GFP_ATOMIC);
|
||||||
if (!(*vlan_list))
|
if (!(*vlan_list))
|
||||||
goto err;
|
goto err;
|
||||||
@ -1179,11 +1196,11 @@ static void i40e_get_vlan_list_sync(struct i40e_vsi *vsi, int *num_vlans,
|
|||||||
**/
|
**/
|
||||||
static i40e_status
|
static i40e_status
|
||||||
i40e_set_vsi_promisc(struct i40e_vf *vf, u16 seid, bool multi_enable,
|
i40e_set_vsi_promisc(struct i40e_vf *vf, u16 seid, bool multi_enable,
|
||||||
bool unicast_enable, s16 *vl, int num_vlans)
|
bool unicast_enable, s16 *vl, u16 num_vlans)
|
||||||
{
|
{
|
||||||
|
i40e_status aq_ret, aq_tmp = 0;
|
||||||
struct i40e_pf *pf = vf->pf;
|
struct i40e_pf *pf = vf->pf;
|
||||||
struct i40e_hw *hw = &pf->hw;
|
struct i40e_hw *hw = &pf->hw;
|
||||||
i40e_status aq_ret;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* No VLAN to set promisc on, set on VSI */
|
/* No VLAN to set promisc on, set on VSI */
|
||||||
@ -1232,6 +1249,9 @@ i40e_set_vsi_promisc(struct i40e_vf *vf, u16 seid, bool multi_enable,
|
|||||||
vf->vf_id,
|
vf->vf_id,
|
||||||
i40e_stat_str(&pf->hw, aq_ret),
|
i40e_stat_str(&pf->hw, aq_ret),
|
||||||
i40e_aq_str(&pf->hw, aq_err));
|
i40e_aq_str(&pf->hw, aq_err));
|
||||||
|
|
||||||
|
if (!aq_tmp)
|
||||||
|
aq_tmp = aq_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
aq_ret = i40e_aq_set_vsi_uc_promisc_on_vlan(hw, seid,
|
aq_ret = i40e_aq_set_vsi_uc_promisc_on_vlan(hw, seid,
|
||||||
@ -1245,8 +1265,15 @@ i40e_set_vsi_promisc(struct i40e_vf *vf, u16 seid, bool multi_enable,
|
|||||||
vf->vf_id,
|
vf->vf_id,
|
||||||
i40e_stat_str(&pf->hw, aq_ret),
|
i40e_stat_str(&pf->hw, aq_ret),
|
||||||
i40e_aq_str(&pf->hw, aq_err));
|
i40e_aq_str(&pf->hw, aq_err));
|
||||||
|
|
||||||
|
if (!aq_tmp)
|
||||||
|
aq_tmp = aq_ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (aq_tmp)
|
||||||
|
aq_ret = aq_tmp;
|
||||||
|
|
||||||
return aq_ret;
|
return aq_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,7 +1295,7 @@ static i40e_status i40e_config_vf_promiscuous_mode(struct i40e_vf *vf,
|
|||||||
i40e_status aq_ret = I40E_SUCCESS;
|
i40e_status aq_ret = I40E_SUCCESS;
|
||||||
struct i40e_pf *pf = vf->pf;
|
struct i40e_pf *pf = vf->pf;
|
||||||
struct i40e_vsi *vsi;
|
struct i40e_vsi *vsi;
|
||||||
int num_vlans;
|
u16 num_vlans;
|
||||||
s16 *vl;
|
s16 *vl;
|
||||||
|
|
||||||
vsi = i40e_find_vsi_from_id(pf, vsi_id);
|
vsi = i40e_find_vsi_from_id(pf, vsi_id);
|
||||||
|
@ -2841,8 +2841,6 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
size_t alloc_size;
|
size_t alloc_size;
|
||||||
|
|
||||||
node = dev_to_node(&pdev->dev);
|
node = dev_to_node(&pdev->dev);
|
||||||
if (node == NUMA_NO_NODE)
|
|
||||||
set_dev_node(&pdev->dev, first_memory_node);
|
|
||||||
|
|
||||||
dev = kzalloc_node(sizeof(*dev), GFP_KERNEL, node);
|
dev = kzalloc_node(sizeof(*dev), GFP_KERNEL, node);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
|
@ -897,6 +897,13 @@ static int nxp_fspi_default_setup(struct nxp_fspi *f)
|
|||||||
fspi_writel(f, FSPI_AHBCR_PREF_EN | FSPI_AHBCR_RDADDROPT,
|
fspi_writel(f, FSPI_AHBCR_PREF_EN | FSPI_AHBCR_RDADDROPT,
|
||||||
base + FSPI_AHBCR);
|
base + FSPI_AHBCR);
|
||||||
|
|
||||||
|
/* Reset the FLSHxCR1 registers. */
|
||||||
|
reg = FSPI_FLSHXCR1_TCSH(0x3) | FSPI_FLSHXCR1_TCSS(0x3);
|
||||||
|
fspi_writel(f, reg, base + FSPI_FLSHA1CR1);
|
||||||
|
fspi_writel(f, reg, base + FSPI_FLSHA2CR1);
|
||||||
|
fspi_writel(f, reg, base + FSPI_FLSHB1CR1);
|
||||||
|
fspi_writel(f, reg, base + FSPI_FLSHB2CR1);
|
||||||
|
|
||||||
/* AHB Read - Set lut sequence ID for all CS. */
|
/* AHB Read - Set lut sequence ID for all CS. */
|
||||||
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA1CR2);
|
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA1CR2);
|
||||||
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA2CR2);
|
fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA2CR2);
|
||||||
|
@ -1865,7 +1865,10 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
|
|||||||
skip_rx = true;
|
skip_rx = true;
|
||||||
|
|
||||||
if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
|
if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
|
||||||
if (irqd_is_wakeup_set(irq_get_irq_data(port->irq)))
|
struct irq_data *d;
|
||||||
|
|
||||||
|
d = irq_get_irq_data(port->irq);
|
||||||
|
if (d && irqd_is_wakeup_set(d))
|
||||||
pm_wakeup_event(tport->tty->dev, 0);
|
pm_wakeup_event(tport->tty->dev, 0);
|
||||||
if (!up->dma || handle_rx_dma(up, iir))
|
if (!up->dma || handle_rx_dma(up, iir))
|
||||||
status = serial8250_rx_chars(up, status);
|
status = serial8250_rx_chars(up, status);
|
||||||
|
@ -2032,7 +2032,7 @@ config FB_COBALT
|
|||||||
|
|
||||||
config FB_SH7760
|
config FB_SH7760
|
||||||
bool "SH7760/SH7763/SH7720/SH7721 LCDC support"
|
bool "SH7760/SH7763/SH7720/SH7721 LCDC support"
|
||||||
depends on FB && (CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7763 \
|
depends on FB=y && (CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7763 \
|
||||||
|| CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721)
|
|| CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721)
|
||||||
select FB_CFB_FILLRECT
|
select FB_CFB_FILLRECT
|
||||||
select FB_CFB_COPYAREA
|
select FB_CFB_COPYAREA
|
||||||
|
@ -413,6 +413,20 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
|
|||||||
return time_left;
|
return time_left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns true if the watchdog was running */
|
||||||
|
static bool iTCO_wdt_set_running(struct iTCO_wdt_private *p)
|
||||||
|
{
|
||||||
|
u16 val;
|
||||||
|
|
||||||
|
/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is enabled */
|
||||||
|
val = inw(TCO1_CNT(p));
|
||||||
|
if (!(val & BIT(11))) {
|
||||||
|
set_bit(WDOG_HW_RUNNING, &p->wddev.status);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kernel Interfaces
|
* Kernel Interfaces
|
||||||
*/
|
*/
|
||||||
@ -501,9 +515,6 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
|
|||||||
return -ENODEV; /* Cannot reset NO_REBOOT bit */
|
return -ENODEV; /* Cannot reset NO_REBOOT bit */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the NO_REBOOT bit to prevent later reboots, just for sure */
|
|
||||||
p->update_no_reboot_bit(p->no_reboot_priv, true);
|
|
||||||
|
|
||||||
if (turn_SMI_watchdog_clear_off >= p->iTCO_version) {
|
if (turn_SMI_watchdog_clear_off >= p->iTCO_version) {
|
||||||
/*
|
/*
|
||||||
* Bit 13: TCO_EN -> 0
|
* Bit 13: TCO_EN -> 0
|
||||||
@ -555,8 +566,13 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
|
|||||||
watchdog_set_drvdata(&p->wddev, p);
|
watchdog_set_drvdata(&p->wddev, p);
|
||||||
platform_set_drvdata(pdev, p);
|
platform_set_drvdata(pdev, p);
|
||||||
|
|
||||||
/* Make sure the watchdog is not running */
|
if (!iTCO_wdt_set_running(p)) {
|
||||||
iTCO_wdt_stop(&p->wddev);
|
/*
|
||||||
|
* If the watchdog was not running set NO_REBOOT now to
|
||||||
|
* prevent later reboots.
|
||||||
|
*/
|
||||||
|
p->update_no_reboot_bit(p->no_reboot_priv, true);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check that the heartbeat value is within it's range;
|
/* Check that the heartbeat value is within it's range;
|
||||||
if not reset to the default */
|
if not reset to the default */
|
||||||
|
@ -73,10 +73,8 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff,
|
|||||||
struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
|
struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
|
||||||
|
|
||||||
err = nilfs_dat_translate(nilfs->ns_dat, vbn, &pbn);
|
err = nilfs_dat_translate(nilfs->ns_dat, vbn, &pbn);
|
||||||
if (unlikely(err)) { /* -EIO, -ENOMEM, -ENOENT */
|
if (unlikely(err)) /* -EIO, -ENOMEM, -ENOENT */
|
||||||
brelse(bh);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_buffer(bh);
|
lock_buffer(bh);
|
||||||
@ -102,6 +100,8 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff,
|
|||||||
failed:
|
failed:
|
||||||
unlock_page(bh->b_page);
|
unlock_page(bh->b_page);
|
||||||
put_page(bh->b_page);
|
put_page(bh->b_page);
|
||||||
|
if (unlikely(err))
|
||||||
|
brelse(bh);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,7 +782,9 @@ union bpf_attr {
|
|||||||
* performed again, if the helper is used in combination with
|
* performed again, if the helper is used in combination with
|
||||||
* direct packet access.
|
* direct packet access.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative error in case of failure.
|
* 0 on success, or a negative error in case of failure. Positive
|
||||||
|
* error indicates a potential drop or congestion in the target
|
||||||
|
* device. The particular positive error codes are not defined.
|
||||||
*
|
*
|
||||||
* u64 bpf_get_current_pid_tgid(void)
|
* u64 bpf_get_current_pid_tgid(void)
|
||||||
* Return
|
* Return
|
||||||
|
@ -89,6 +89,11 @@ static int ncsi_aen_handler_lsc(struct ncsi_dev_priv *ndp,
|
|||||||
if ((had_link == has_link) || chained)
|
if ((had_link == has_link) || chained)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (had_link)
|
||||||
|
netif_carrier_off(ndp->ndev.dev);
|
||||||
|
else
|
||||||
|
netif_carrier_on(ndp->ndev.dev);
|
||||||
|
|
||||||
if (!ndp->multi_package && !nc->package->multi_channel) {
|
if (!ndp->multi_package && !nc->package->multi_channel) {
|
||||||
if (had_link) {
|
if (had_link) {
|
||||||
ndp->flags |= NCSI_DEV_RESHUFFLE;
|
ndp->flags |= NCSI_DEV_RESHUFFLE;
|
||||||
|
@ -117,6 +117,7 @@ struct inode_smack {
|
|||||||
struct task_smack {
|
struct task_smack {
|
||||||
struct smack_known *smk_task; /* label for access control */
|
struct smack_known *smk_task; /* label for access control */
|
||||||
struct smack_known *smk_forked; /* label when forked */
|
struct smack_known *smk_forked; /* label when forked */
|
||||||
|
struct smack_known *smk_transmuted;/* label when transmuted */
|
||||||
struct list_head smk_rules; /* per task access rules */
|
struct list_head smk_rules; /* per task access rules */
|
||||||
struct mutex smk_rules_lock; /* lock for the rules */
|
struct mutex smk_rules_lock; /* lock for the rules */
|
||||||
struct list_head smk_relabel; /* transit allowed labels */
|
struct list_head smk_relabel; /* transit allowed labels */
|
||||||
|
@ -983,8 +983,9 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
|
|||||||
const struct qstr *qstr, const char **name,
|
const struct qstr *qstr, const char **name,
|
||||||
void **value, size_t *len)
|
void **value, size_t *len)
|
||||||
{
|
{
|
||||||
|
struct task_smack *tsp = smack_cred(current_cred());
|
||||||
struct inode_smack *issp = smack_inode(inode);
|
struct inode_smack *issp = smack_inode(inode);
|
||||||
struct smack_known *skp = smk_of_current();
|
struct smack_known *skp = smk_of_task(tsp);
|
||||||
struct smack_known *isp = smk_of_inode(inode);
|
struct smack_known *isp = smk_of_inode(inode);
|
||||||
struct smack_known *dsp = smk_of_inode(dir);
|
struct smack_known *dsp = smk_of_inode(dir);
|
||||||
int may;
|
int may;
|
||||||
@ -993,20 +994,34 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
|
|||||||
*name = XATTR_SMACK_SUFFIX;
|
*name = XATTR_SMACK_SUFFIX;
|
||||||
|
|
||||||
if (value && len) {
|
if (value && len) {
|
||||||
rcu_read_lock();
|
/*
|
||||||
may = smk_access_entry(skp->smk_known, dsp->smk_known,
|
* If equal, transmuting already occurred in
|
||||||
&skp->smk_rules);
|
* smack_dentry_create_files_as(). No need to check again.
|
||||||
rcu_read_unlock();
|
*/
|
||||||
|
if (tsp->smk_task != tsp->smk_transmuted) {
|
||||||
|
rcu_read_lock();
|
||||||
|
may = smk_access_entry(skp->smk_known, dsp->smk_known,
|
||||||
|
&skp->smk_rules);
|
||||||
|
rcu_read_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the access rule allows transmutation and
|
* In addition to having smk_task equal to smk_transmuted,
|
||||||
* the directory requests transmutation then
|
* if the access rule allows transmutation and the directory
|
||||||
* by all means transmute.
|
* requests transmutation then by all means transmute.
|
||||||
* Mark the inode as changed.
|
* Mark the inode as changed.
|
||||||
*/
|
*/
|
||||||
if (may > 0 && ((may & MAY_TRANSMUTE) != 0) &&
|
if ((tsp->smk_task == tsp->smk_transmuted) ||
|
||||||
smk_inode_transmutable(dir)) {
|
(may > 0 && ((may & MAY_TRANSMUTE) != 0) &&
|
||||||
isp = dsp;
|
smk_inode_transmutable(dir))) {
|
||||||
|
/*
|
||||||
|
* The caller of smack_dentry_create_files_as()
|
||||||
|
* should have overridden the current cred, so the
|
||||||
|
* inode label was already set correctly in
|
||||||
|
* smack_inode_alloc_security().
|
||||||
|
*/
|
||||||
|
if (tsp->smk_task != tsp->smk_transmuted)
|
||||||
|
isp = dsp;
|
||||||
issp->smk_flags |= SMK_INODE_CHANGED;
|
issp->smk_flags |= SMK_INODE_CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1440,10 +1455,19 @@ static int smack_inode_getsecurity(struct inode *inode,
|
|||||||
struct super_block *sbp;
|
struct super_block *sbp;
|
||||||
struct inode *ip = (struct inode *)inode;
|
struct inode *ip = (struct inode *)inode;
|
||||||
struct smack_known *isp;
|
struct smack_known *isp;
|
||||||
|
struct inode_smack *ispp;
|
||||||
|
size_t label_len;
|
||||||
|
char *label = NULL;
|
||||||
|
|
||||||
if (strcmp(name, XATTR_SMACK_SUFFIX) == 0)
|
if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) {
|
||||||
isp = smk_of_inode(inode);
|
isp = smk_of_inode(inode);
|
||||||
else {
|
} else if (strcmp(name, XATTR_SMACK_TRANSMUTE) == 0) {
|
||||||
|
ispp = smack_inode(inode);
|
||||||
|
if (ispp->smk_flags & SMK_INODE_TRANSMUTE)
|
||||||
|
label = TRANS_TRUE;
|
||||||
|
else
|
||||||
|
label = "";
|
||||||
|
} else {
|
||||||
/*
|
/*
|
||||||
* The rest of the Smack xattrs are only on sockets.
|
* The rest of the Smack xattrs are only on sockets.
|
||||||
*/
|
*/
|
||||||
@ -1465,13 +1489,18 @@ static int smack_inode_getsecurity(struct inode *inode,
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!label)
|
||||||
|
label = isp->smk_known;
|
||||||
|
|
||||||
|
label_len = strlen(label);
|
||||||
|
|
||||||
if (alloc) {
|
if (alloc) {
|
||||||
*buffer = kstrdup(isp->smk_known, GFP_KERNEL);
|
*buffer = kstrdup(label, GFP_KERNEL);
|
||||||
if (*buffer == NULL)
|
if (*buffer == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
return strlen(isp->smk_known);
|
return label_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4516,7 +4545,7 @@ static int smack_inode_copy_up(struct dentry *dentry, struct cred **new)
|
|||||||
/*
|
/*
|
||||||
* Get label from overlay inode and set it in create_sid
|
* Get label from overlay inode and set it in create_sid
|
||||||
*/
|
*/
|
||||||
isp = smack_inode(d_inode(dentry->d_parent));
|
isp = smack_inode(d_inode(dentry));
|
||||||
skp = isp->smk_inode;
|
skp = isp->smk_inode;
|
||||||
tsp->smk_task = skp;
|
tsp->smk_task = skp;
|
||||||
*new = new_creds;
|
*new = new_creds;
|
||||||
@ -4567,8 +4596,10 @@ static int smack_dentry_create_files_as(struct dentry *dentry, int mode,
|
|||||||
* providing access is transmuting use the containing
|
* providing access is transmuting use the containing
|
||||||
* directory label instead of the process label.
|
* directory label instead of the process label.
|
||||||
*/
|
*/
|
||||||
if (may > 0 && (may & MAY_TRANSMUTE))
|
if (may > 0 && (may & MAY_TRANSMUTE)) {
|
||||||
ntsp->smk_task = isp->smk_inode;
|
ntsp->smk_task = isp->smk_inode;
|
||||||
|
ntsp->smk_transmuted = ntsp->smk_task;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2237,6 +2237,7 @@ static struct snd_pci_quirk power_save_blacklist[] = {
|
|||||||
SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0),
|
SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0),
|
||||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */
|
/* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0),
|
SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0),
|
||||||
|
SND_PCI_QUIRK(0x17aa, 0x316e, "Lenovo ThinkCentre M70q", 0),
|
||||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1689623 */
|
/* https://bugzilla.redhat.com/show_bug.cgi?id=1689623 */
|
||||||
SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0),
|
SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0),
|
||||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */
|
/* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */
|
||||||
|
@ -782,7 +782,9 @@ union bpf_attr {
|
|||||||
* performed again, if the helper is used in combination with
|
* performed again, if the helper is used in combination with
|
||||||
* direct packet access.
|
* direct packet access.
|
||||||
* Return
|
* Return
|
||||||
* 0 on success, or a negative error in case of failure.
|
* 0 on success, or a negative error in case of failure. Positive
|
||||||
|
* error indicates a potential drop or congestion in the target
|
||||||
|
* device. The particular positive error codes are not defined.
|
||||||
*
|
*
|
||||||
* u64 bpf_get_current_pid_tgid(void)
|
* u64 bpf_get_current_pid_tgid(void)
|
||||||
* Return
|
* Return
|
||||||
|
Loading…
Reference in New Issue
Block a user