mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Merge c6cbefd65a ("wifi: iwlwifi: mvm: Fix a race in scan abort flow") into android14-6.1-lts
Steps on the way to 6.1.113 Change-Id: I4cc09033acf2fb15352e1e61d5fe51107cd22bce Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -211,13 +211,10 @@ static void __loop_update_dio(struct loop_device *lo, bool dio)
|
||||
if (lo->lo_state == Lo_bound)
|
||||
blk_mq_freeze_queue(lo->lo_queue);
|
||||
lo->use_dio = use_dio;
|
||||
if (use_dio) {
|
||||
blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, lo->lo_queue);
|
||||
if (use_dio)
|
||||
lo->lo_flags |= LO_FLAGS_DIRECT_IO;
|
||||
} else {
|
||||
blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);
|
||||
else
|
||||
lo->lo_flags &= ~LO_FLAGS_DIRECT_IO;
|
||||
}
|
||||
if (lo->lo_state == Lo_bound)
|
||||
blk_mq_unfreeze_queue(lo->lo_queue);
|
||||
}
|
||||
@@ -2034,14 +2031,6 @@ static int loop_add(int i)
|
||||
|
||||
blk_queue_max_hw_sectors(lo->lo_queue, BLK_DEF_MAX_SECTORS);
|
||||
|
||||
/*
|
||||
* By default, we do buffer IO, so it doesn't make sense to enable
|
||||
* merge because the I/O submitted to backing file is handled page by
|
||||
* page. For directio mode, merge does help to dispatch bigger request
|
||||
* to underlayer disk. We will enable merge once directio is enabled.
|
||||
*/
|
||||
blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);
|
||||
|
||||
/*
|
||||
* Disable partition scanning by default. The in-kernel partition
|
||||
* scanning can be requested individually per-device during its
|
||||
|
||||
@@ -92,7 +92,7 @@ static int btmrvl_sdio_probe_of(struct device *dev,
|
||||
} else {
|
||||
ret = devm_request_irq(dev, cfg->irq_bt,
|
||||
btmrvl_wake_irq_bt,
|
||||
0, "bt_wake", card);
|
||||
IRQF_NO_AUTOEN, "bt_wake", card);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"Failed to request irq_bt %d (%d)\n",
|
||||
@@ -101,7 +101,6 @@ static int btmrvl_sdio_probe_of(struct device *dev,
|
||||
|
||||
/* Configure wakeup (enabled by default) */
|
||||
device_init_wakeup(dev, true);
|
||||
disable_irq(cfg->irq_bt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -548,23 +548,11 @@ static int xiic_bus_busy(struct xiic_i2c *i2c)
|
||||
return (sr & XIIC_SR_BUS_BUSY_MASK) ? -EBUSY : 0;
|
||||
}
|
||||
|
||||
static int xiic_busy(struct xiic_i2c *i2c)
|
||||
static int xiic_wait_not_busy(struct xiic_i2c *i2c)
|
||||
{
|
||||
int tries = 3;
|
||||
int err;
|
||||
|
||||
if (i2c->tx_msg || i2c->rx_msg)
|
||||
return -EBUSY;
|
||||
|
||||
/* In single master mode bus can only be busy, when in use by this
|
||||
* driver. If the register indicates bus being busy for some reason we
|
||||
* should ignore it, since bus will never be released and i2c will be
|
||||
* stuck forever.
|
||||
*/
|
||||
if (i2c->singlemaster) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* for instance if previous transfer was terminated due to TX error
|
||||
* it might be that the bus is on it's way to become available
|
||||
* give it at most 3 ms to wake
|
||||
@@ -672,9 +660,35 @@ static int xiic_start_xfer(struct xiic_i2c *i2c, struct i2c_msg *msgs, int num)
|
||||
|
||||
mutex_lock(&i2c->lock);
|
||||
|
||||
ret = xiic_busy(i2c);
|
||||
if (ret)
|
||||
if (i2c->tx_msg || i2c->rx_msg) {
|
||||
dev_err(i2c->adap.dev.parent,
|
||||
"cannot start a transfer while busy\n");
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* In single master mode bus can only be busy, when in use by this
|
||||
* driver. If the register indicates bus being busy for some reason we
|
||||
* should ignore it, since bus will never be released and i2c will be
|
||||
* stuck forever.
|
||||
*/
|
||||
if (!i2c->singlemaster) {
|
||||
ret = xiic_wait_not_busy(i2c);
|
||||
if (ret) {
|
||||
/* If the bus is stuck in a busy state, such as due to spurious low
|
||||
* pulses on the bus causing a false start condition to be detected,
|
||||
* then try to recover by re-initializing the controller and check
|
||||
* again if the bus is still busy.
|
||||
*/
|
||||
dev_warn(i2c->adap.dev.parent, "I2C bus busy timeout, reinitializing\n");
|
||||
ret = xiic_reinit(i2c);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = xiic_wait_not_busy(i2c);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
i2c->tx_msg = msgs;
|
||||
i2c->rx_msg = NULL;
|
||||
@@ -704,10 +718,8 @@ static int xiic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
return err;
|
||||
|
||||
err = xiic_start_xfer(i2c, msgs, num);
|
||||
if (err < 0) {
|
||||
dev_err(adap->dev.parent, "Error xiic_start_xfer\n");
|
||||
if (err < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = wait_for_completion_timeout(&i2c->completion, XIIC_XFER_TIMEOUT);
|
||||
mutex_lock(&i2c->lock);
|
||||
|
||||
@@ -145,7 +145,8 @@ static int bcm2835_mbox_probe(struct platform_device *pdev)
|
||||
spin_lock_init(&mbox->lock);
|
||||
|
||||
ret = devm_request_irq(dev, irq_of_parse_and_map(dev->of_node, 0),
|
||||
bcm2835_mbox_irq, 0, dev_name(dev), mbox);
|
||||
bcm2835_mbox_irq, IRQF_NO_SUSPEND, dev_name(dev),
|
||||
mbox);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register a mailbox IRQ handler: %d\n",
|
||||
ret);
|
||||
|
||||
@@ -159,7 +159,7 @@ static const struct of_device_id rockchip_mbox_of_match[] = {
|
||||
{ .compatible = "rockchip,rk3368-mailbox", .data = &rk3368_drv_data},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rockchp_mbox_of_match);
|
||||
MODULE_DEVICE_TABLE(of, rockchip_mbox_of_match);
|
||||
|
||||
static int rockchip_mbox_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
||||
@@ -962,15 +962,8 @@ ctrl_fail:
|
||||
|
||||
void usbtv_video_free(struct usbtv *usbtv)
|
||||
{
|
||||
mutex_lock(&usbtv->vb2q_lock);
|
||||
mutex_lock(&usbtv->v4l2_lock);
|
||||
|
||||
usbtv_stop(usbtv);
|
||||
vb2_video_unregister_device(&usbtv->vdev);
|
||||
v4l2_device_disconnect(&usbtv->v4l2_dev);
|
||||
|
||||
mutex_unlock(&usbtv->v4l2_lock);
|
||||
mutex_unlock(&usbtv->vb2q_lock);
|
||||
|
||||
v4l2_device_put(&usbtv->v4l2_dev);
|
||||
}
|
||||
|
||||
@@ -28,9 +28,8 @@ ice_sched_add_root_node(struct ice_port_info *pi,
|
||||
if (!root)
|
||||
return -ENOMEM;
|
||||
|
||||
/* coverity[suspicious_sizeof] */
|
||||
root->children = devm_kcalloc(ice_hw_to_dev(hw), hw->max_children[0],
|
||||
sizeof(*root), GFP_KERNEL);
|
||||
sizeof(*root->children), GFP_KERNEL);
|
||||
if (!root->children) {
|
||||
devm_kfree(ice_hw_to_dev(hw), root);
|
||||
return -ENOMEM;
|
||||
@@ -181,10 +180,9 @@ ice_sched_add_node(struct ice_port_info *pi, u8 layer,
|
||||
if (!node)
|
||||
return -ENOMEM;
|
||||
if (hw->max_children[layer]) {
|
||||
/* coverity[suspicious_sizeof] */
|
||||
node->children = devm_kcalloc(ice_hw_to_dev(hw),
|
||||
hw->max_children[layer],
|
||||
sizeof(*node), GFP_KERNEL);
|
||||
sizeof(*node->children), GFP_KERNEL);
|
||||
if (!node->children) {
|
||||
devm_kfree(ice_hw_to_dev(hw), node);
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -482,7 +482,9 @@ ltq_etop_tx(struct sk_buff *skb, struct net_device *dev)
|
||||
unsigned long flags;
|
||||
u32 byte_offset;
|
||||
|
||||
len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
|
||||
if (skb_put_padto(skb, ETH_ZLEN))
|
||||
return NETDEV_TX_OK;
|
||||
len = skb->len;
|
||||
|
||||
if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) || ch->skb[ch->dma.desc]) {
|
||||
netdev_err(dev, "tx ring full\n");
|
||||
|
||||
@@ -23,6 +23,9 @@ struct mlx5e_tir_builder *mlx5e_tir_builder_alloc(bool modify)
|
||||
struct mlx5e_tir_builder *builder;
|
||||
|
||||
builder = kvzalloc(sizeof(*builder), GFP_KERNEL);
|
||||
if (!builder)
|
||||
return NULL;
|
||||
|
||||
builder->modify = modify;
|
||||
|
||||
return builder;
|
||||
|
||||
@@ -633,7 +633,6 @@ mlx5e_sq_xmit_mpwqe(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
return;
|
||||
|
||||
err_unmap:
|
||||
mlx5e_dma_unmap_wqe_err(sq, 1);
|
||||
sq->stats->dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
mlx5e_tx_flush(sq);
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
pci_write_config_dword((dev)->pdev, (dev)->vsc_addr + (offset), (val))
|
||||
#define VSC_MAX_RETRIES 2048
|
||||
|
||||
/* Reading VSC registers can take relatively long time.
|
||||
* Yield the cpu every 128 registers read.
|
||||
*/
|
||||
#define VSC_GW_READ_BLOCK_COUNT 128
|
||||
|
||||
enum {
|
||||
VSC_CTRL_OFFSET = 0x4,
|
||||
VSC_COUNTER_OFFSET = 0x8,
|
||||
@@ -273,6 +278,7 @@ int mlx5_vsc_gw_read_block_fast(struct mlx5_core_dev *dev, u32 *data,
|
||||
{
|
||||
unsigned int next_read_addr = 0;
|
||||
unsigned int read_addr = 0;
|
||||
unsigned int count = 0;
|
||||
|
||||
while (read_addr < length) {
|
||||
if (mlx5_vsc_gw_read_fast(dev, read_addr, &next_read_addr,
|
||||
@@ -280,6 +286,10 @@ int mlx5_vsc_gw_read_block_fast(struct mlx5_core_dev *dev, u32 *data,
|
||||
return read_addr;
|
||||
|
||||
read_addr = next_read_addr;
|
||||
if (++count == VSC_GW_READ_BLOCK_COUNT) {
|
||||
cond_resched();
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
@@ -45,8 +45,12 @@ void sparx5_ifh_parse(u32 *ifh, struct frame_info *info)
|
||||
fwd = (fwd >> 5);
|
||||
info->src_port = FIELD_GET(GENMASK(7, 1), fwd);
|
||||
|
||||
/*
|
||||
* Bit 270-271 are occasionally unexpectedly set by the hardware,
|
||||
* clear bits before extracting timestamp
|
||||
*/
|
||||
info->timestamp =
|
||||
((u64)xtr_hdr[2] << 24) |
|
||||
((u64)(xtr_hdr[2] & GENMASK(5, 0)) << 24) |
|
||||
((u64)xtr_hdr[3] << 16) |
|
||||
((u64)xtr_hdr[4] << 8) |
|
||||
((u64)xtr_hdr[5] << 0);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include "stmmac.h"
|
||||
#include "stmmac_pcs.h"
|
||||
#include "dwmac4.h"
|
||||
@@ -469,7 +470,7 @@ static int dwmac4_write_vlan_filter(struct net_device *dev,
|
||||
u8 index, u32 data)
|
||||
{
|
||||
void __iomem *ioaddr = (void __iomem *)dev->base_addr;
|
||||
int i, timeout = 10;
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
if (index >= hw->num_vlan)
|
||||
@@ -485,16 +486,15 @@ static int dwmac4_write_vlan_filter(struct net_device *dev,
|
||||
|
||||
writel(val, ioaddr + GMAC_VLAN_TAG);
|
||||
|
||||
for (i = 0; i < timeout; i++) {
|
||||
val = readl(ioaddr + GMAC_VLAN_TAG);
|
||||
if (!(val & GMAC_VLAN_TAG_CTRL_OB))
|
||||
return 0;
|
||||
udelay(1);
|
||||
ret = readl_poll_timeout(ioaddr + GMAC_VLAN_TAG, val,
|
||||
!(val & GMAC_VLAN_TAG_CTRL_OB),
|
||||
1000, 500000);
|
||||
if (ret) {
|
||||
netdev_err(dev, "Timeout accessing MAC_VLAN_Tag_Filter\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
netdev_err(dev, "Timeout accessing MAC_VLAN_Tag_Filter\n");
|
||||
|
||||
return -EBUSY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwmac4_add_hw_vlan_rx_fltr(struct net_device *dev,
|
||||
|
||||
@@ -101,6 +101,7 @@ config IEEE802154_CA8210_DEBUGFS
|
||||
|
||||
config IEEE802154_MCR20A
|
||||
tristate "MCR20A transceiver driver"
|
||||
select REGMAP_SPI
|
||||
depends on IEEE802154_DRIVERS && MAC802154
|
||||
depends on SPI
|
||||
help
|
||||
|
||||
@@ -1306,16 +1306,13 @@ mcr20a_probe(struct spi_device *spi)
|
||||
irq_type = IRQF_TRIGGER_FALLING;
|
||||
|
||||
ret = devm_request_irq(&spi->dev, spi->irq, mcr20a_irq_isr,
|
||||
irq_type, dev_name(&spi->dev), lp);
|
||||
irq_type | IRQF_NO_AUTOEN, dev_name(&spi->dev), lp);
|
||||
if (ret) {
|
||||
dev_err(&spi->dev, "could not request_irq for mcr20a\n");
|
||||
ret = -ENODEV;
|
||||
goto free_dev;
|
||||
}
|
||||
|
||||
/* disable_irq by default and wait for starting hardware */
|
||||
disable_irq(spi->irq);
|
||||
|
||||
ret = ieee802154_register_hw(hw);
|
||||
if (ret) {
|
||||
dev_crit(&spi->dev, "ieee802154_register_hw failed\n");
|
||||
|
||||
@@ -2269,7 +2269,7 @@ static bool ppp_channel_bridge_input(struct channel *pch, struct sk_buff *skb)
|
||||
if (!pchb)
|
||||
goto out_rcu;
|
||||
|
||||
spin_lock(&pchb->downl);
|
||||
spin_lock_bh(&pchb->downl);
|
||||
if (!pchb->chan) {
|
||||
/* channel got unregistered */
|
||||
kfree_skb(skb);
|
||||
@@ -2281,7 +2281,7 @@ static bool ppp_channel_bridge_input(struct channel *pch, struct sk_buff *skb)
|
||||
kfree_skb(skb);
|
||||
|
||||
outl:
|
||||
spin_unlock(&pchb->downl);
|
||||
spin_unlock_bh(&pchb->downl);
|
||||
out_rcu:
|
||||
rcu_read_unlock();
|
||||
|
||||
|
||||
@@ -1365,11 +1365,11 @@ void ath9k_get_et_stats(struct ieee80211_hw *hw,
|
||||
struct ath_softc *sc = hw->priv;
|
||||
int i = 0;
|
||||
|
||||
data[i++] = (sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_BE)].tx_pkts_all +
|
||||
data[i++] = ((u64)sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_BE)].tx_pkts_all +
|
||||
sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_BK)].tx_pkts_all +
|
||||
sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_VI)].tx_pkts_all +
|
||||
sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_VO)].tx_pkts_all);
|
||||
data[i++] = (sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_BE)].tx_bytes_all +
|
||||
data[i++] = ((u64)sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_BE)].tx_bytes_all +
|
||||
sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_BK)].tx_bytes_all +
|
||||
sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_VI)].tx_bytes_all +
|
||||
sc->debug.stats.txstats[PR_QNUM(IEEE80211_AC_VO)].tx_bytes_all);
|
||||
|
||||
@@ -718,8 +718,7 @@ static void ath9k_hif_usb_rx_cb(struct urb *urb)
|
||||
}
|
||||
|
||||
resubmit:
|
||||
skb_reset_tail_pointer(skb);
|
||||
skb_trim(skb, 0);
|
||||
__skb_set_length(skb, 0);
|
||||
|
||||
usb_anchor_urb(urb, &hif_dev->rx_submitted);
|
||||
ret = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@@ -756,8 +755,7 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
|
||||
case -ESHUTDOWN:
|
||||
goto free_skb;
|
||||
default:
|
||||
skb_reset_tail_pointer(skb);
|
||||
skb_trim(skb, 0);
|
||||
__skb_set_length(skb, 0);
|
||||
|
||||
goto resubmit;
|
||||
}
|
||||
|
||||
@@ -1111,6 +1111,19 @@ struct iwl_umac_scan_abort {
|
||||
__le32 flags;
|
||||
} __packed; /* SCAN_ABORT_CMD_UMAC_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_umac_scan_abort_status
|
||||
*
|
||||
* @IWL_UMAC_SCAN_ABORT_STATUS_SUCCESS: scan was successfully aborted
|
||||
* @IWL_UMAC_SCAN_ABORT_STATUS_IN_PROGRESS: scan abort is in progress
|
||||
* @IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND: nothing to abort
|
||||
*/
|
||||
enum iwl_umac_scan_abort_status {
|
||||
IWL_UMAC_SCAN_ABORT_STATUS_SUCCESS = 0,
|
||||
IWL_UMAC_SCAN_ABORT_STATUS_IN_PROGRESS,
|
||||
IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_umac_scan_complete
|
||||
* @uid: scan id, &enum iwl_umac_scan_uid_offsets
|
||||
|
||||
@@ -3037,13 +3037,23 @@ void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm,
|
||||
mvm->scan_start);
|
||||
}
|
||||
|
||||
static int iwl_mvm_umac_scan_abort(struct iwl_mvm *mvm, int type)
|
||||
static int iwl_mvm_umac_scan_abort(struct iwl_mvm *mvm, int type, bool *wait)
|
||||
{
|
||||
struct iwl_umac_scan_abort cmd = {};
|
||||
struct iwl_umac_scan_abort abort_cmd = {};
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = WIDE_ID(IWL_ALWAYS_LONG_GROUP, SCAN_ABORT_UMAC),
|
||||
.len = { sizeof(abort_cmd), },
|
||||
.data = { &abort_cmd, },
|
||||
.flags = CMD_SEND_IN_RFKILL,
|
||||
};
|
||||
|
||||
int uid, ret;
|
||||
u32 status = IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
*wait = true;
|
||||
|
||||
/* We should always get a valid index here, because we already
|
||||
* checked that this type of scan was running in the generic
|
||||
* code.
|
||||
@@ -3052,17 +3062,28 @@ static int iwl_mvm_umac_scan_abort(struct iwl_mvm *mvm, int type)
|
||||
if (WARN_ON_ONCE(uid < 0))
|
||||
return uid;
|
||||
|
||||
cmd.uid = cpu_to_le32(uid);
|
||||
abort_cmd.uid = cpu_to_le32(uid);
|
||||
|
||||
IWL_DEBUG_SCAN(mvm, "Sending scan abort, uid %u\n", uid);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm,
|
||||
WIDE_ID(IWL_ALWAYS_LONG_GROUP, SCAN_ABORT_UMAC),
|
||||
CMD_SEND_IN_RFKILL, sizeof(cmd), &cmd);
|
||||
ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status);
|
||||
|
||||
IWL_DEBUG_SCAN(mvm, "Scan abort: ret=%d, status=%u\n", ret, status);
|
||||
if (!ret)
|
||||
mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT;
|
||||
|
||||
IWL_DEBUG_SCAN(mvm, "Scan abort: ret=%d\n", ret);
|
||||
/* Handle the case that the FW is no longer familiar with the scan that
|
||||
* is to be stopped. In such a case, it is expected that the scan
|
||||
* complete notification was already received but not yet processed.
|
||||
* In such a case, there is no need to wait for a scan complete
|
||||
* notification and the flow should continue similar to the case that
|
||||
* the scan was really aborted.
|
||||
*/
|
||||
if (status == IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND) {
|
||||
mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT;
|
||||
*wait = false;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3072,6 +3093,7 @@ static int iwl_mvm_scan_stop_wait(struct iwl_mvm *mvm, int type)
|
||||
static const u16 scan_done_notif[] = { SCAN_COMPLETE_UMAC,
|
||||
SCAN_OFFLOAD_COMPLETE, };
|
||||
int ret;
|
||||
bool wait = true;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
@@ -3083,7 +3105,7 @@ static int iwl_mvm_scan_stop_wait(struct iwl_mvm *mvm, int type)
|
||||
IWL_DEBUG_SCAN(mvm, "Preparing to stop scan, type %x\n", type);
|
||||
|
||||
if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN))
|
||||
ret = iwl_mvm_umac_scan_abort(mvm, type);
|
||||
ret = iwl_mvm_umac_scan_abort(mvm, type, &wait);
|
||||
else
|
||||
ret = iwl_mvm_lmac_scan_abort(mvm);
|
||||
|
||||
@@ -3091,6 +3113,10 @@ static int iwl_mvm_scan_stop_wait(struct iwl_mvm *mvm, int type)
|
||||
IWL_DEBUG_SCAN(mvm, "couldn't stop scan type %d\n", type);
|
||||
iwl_remove_notification(&mvm->notif_wait, &wait_scan_done);
|
||||
return ret;
|
||||
} else if (!wait) {
|
||||
IWL_DEBUG_SCAN(mvm, "no need to wait for scan type %d\n", type);
|
||||
iwl_remove_notification(&mvm->notif_wait, &wait_scan_done);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return iwl_wait_notification(&mvm->notif_wait, &wait_scan_done,
|
||||
|
||||
@@ -823,17 +823,17 @@ static int bam_dmux_probe(struct platform_device *pdev)
|
||||
ret = devm_request_threaded_irq(dev, pc_ack_irq, NULL, bam_dmux_pc_ack_irq,
|
||||
IRQF_ONESHOT, NULL, dmux);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_disable_pm;
|
||||
|
||||
ret = devm_request_threaded_irq(dev, dmux->pc_irq, NULL, bam_dmux_pc_irq,
|
||||
IRQF_ONESHOT, NULL, dmux);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_disable_pm;
|
||||
|
||||
ret = irq_get_irqchip_state(dmux->pc_irq, IRQCHIP_STATE_LINE_LEVEL,
|
||||
&dmux->pc_state);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_disable_pm;
|
||||
|
||||
/* Check if remote finished initialization before us */
|
||||
if (dmux->pc_state) {
|
||||
@@ -844,6 +844,11 @@ static int bam_dmux_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_disable_pm:
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_dont_use_autosuspend(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bam_dmux_remove(struct platform_device *pdev)
|
||||
|
||||
@@ -94,7 +94,6 @@ static bool ceph_dirty_folio(struct address_space *mapping, struct folio *folio)
|
||||
|
||||
/* dirty the head */
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
BUG_ON(ci->i_wr_ref == 0); // caller should hold Fw reference
|
||||
if (__ceph_have_pending_cap_snap(ci)) {
|
||||
struct ceph_cap_snap *capsnap =
|
||||
list_last_entry(&ci->i_cap_snaps,
|
||||
|
||||
56
fs/dax.c
56
fs/dax.c
@@ -1221,6 +1221,62 @@ static vm_fault_t dax_pmd_load_hole(struct xa_state *xas, struct vm_fault *vmf,
|
||||
}
|
||||
#endif /* CONFIG_FS_DAX_PMD */
|
||||
|
||||
static s64 dax_unshare_iter(struct iomap_iter *iter)
|
||||
{
|
||||
struct iomap *iomap = &iter->iomap;
|
||||
const struct iomap *srcmap = iomap_iter_srcmap(iter);
|
||||
loff_t pos = iter->pos;
|
||||
loff_t length = iomap_length(iter);
|
||||
int id = 0;
|
||||
s64 ret = 0;
|
||||
void *daddr = NULL, *saddr = NULL;
|
||||
|
||||
/* don't bother with blocks that are not shared to start with */
|
||||
if (!(iomap->flags & IOMAP_F_SHARED))
|
||||
return length;
|
||||
/* don't bother with holes or unwritten extents */
|
||||
if (srcmap->type == IOMAP_HOLE || srcmap->type == IOMAP_UNWRITTEN)
|
||||
return length;
|
||||
|
||||
id = dax_read_lock();
|
||||
ret = dax_iomap_direct_access(iomap, pos, length, &daddr, NULL);
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
|
||||
ret = dax_iomap_direct_access(srcmap, pos, length, &saddr, NULL);
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
|
||||
ret = copy_mc_to_kernel(daddr, saddr, length);
|
||||
if (ret)
|
||||
ret = -EIO;
|
||||
|
||||
out_unlock:
|
||||
dax_read_unlock(id);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dax_file_unshare(struct inode *inode, loff_t pos, loff_t len,
|
||||
const struct iomap_ops *ops)
|
||||
{
|
||||
struct iomap_iter iter = {
|
||||
.inode = inode,
|
||||
.pos = pos,
|
||||
.flags = IOMAP_WRITE | IOMAP_UNSHARE | IOMAP_DAX,
|
||||
};
|
||||
loff_t size = i_size_read(inode);
|
||||
int ret;
|
||||
|
||||
if (pos < 0 || pos >= size)
|
||||
return 0;
|
||||
|
||||
iter.len = min(len, size - pos);
|
||||
while ((ret = iomap_iter(&iter, ops)) > 0)
|
||||
iter.processed = dax_unshare_iter(&iter);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dax_file_unshare);
|
||||
|
||||
static int dax_memzero(struct iomap_iter *iter, loff_t pos, size_t size)
|
||||
{
|
||||
const struct iomap *iomap = &iter->iomap;
|
||||
|
||||
@@ -2098,6 +2098,9 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)
|
||||
loff_t isize;
|
||||
int ret;
|
||||
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EBADF;
|
||||
|
||||
if (!inode_owner_or_capable(mnt_userns, inode))
|
||||
return -EACCES;
|
||||
|
||||
@@ -2204,6 +2207,9 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
|
||||
struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
|
||||
int ret;
|
||||
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EBADF;
|
||||
|
||||
if (!inode_owner_or_capable(mnt_userns, inode))
|
||||
return -EACCES;
|
||||
|
||||
@@ -2236,6 +2242,9 @@ static int f2fs_ioc_abort_atomic_write(struct file *filp)
|
||||
struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
|
||||
int ret;
|
||||
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EBADF;
|
||||
|
||||
if (!inode_owner_or_capable(mnt_userns, inode))
|
||||
return -EACCES;
|
||||
|
||||
|
||||
@@ -1101,11 +1101,15 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
|
||||
struct iomap_iter iter = {
|
||||
.inode = inode,
|
||||
.pos = pos,
|
||||
.len = len,
|
||||
.flags = IOMAP_WRITE | IOMAP_UNSHARE,
|
||||
};
|
||||
loff_t size = i_size_read(inode);
|
||||
int ret;
|
||||
|
||||
if (pos < 0 || pos >= size)
|
||||
return 0;
|
||||
|
||||
iter.len = min(len, size - pos);
|
||||
while ((ret = iomap_iter(&iter, ops)) > 0)
|
||||
iter.processed = iomap_unshare_iter(&iter);
|
||||
return ret;
|
||||
|
||||
@@ -1693,8 +1693,12 @@ xfs_reflink_unshare(
|
||||
|
||||
inode_dio_wait(inode);
|
||||
|
||||
error = iomap_file_unshare(inode, offset, len,
|
||||
&xfs_buffered_write_iomap_ops);
|
||||
if (IS_DAX(inode))
|
||||
error = dax_file_unshare(inode, offset, len,
|
||||
&xfs_dax_write_iomap_ops);
|
||||
else
|
||||
error = iomap_file_unshare(inode, offset, len,
|
||||
&xfs_buffered_write_iomap_ops);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -205,6 +205,8 @@ static inline void dax_unlock_mapping_entry(struct address_space *mapping,
|
||||
}
|
||||
#endif
|
||||
|
||||
int dax_file_unshare(struct inode *inode, loff_t pos, loff_t len,
|
||||
const struct iomap_ops *ops);
|
||||
int dax_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
|
||||
const struct iomap_ops *ops);
|
||||
int dax_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
|
||||
|
||||
@@ -1642,7 +1642,7 @@ enum nft_flowtable_flags {
|
||||
*
|
||||
* @NFTA_FLOWTABLE_TABLE: name of the table containing the expression (NLA_STRING)
|
||||
* @NFTA_FLOWTABLE_NAME: name of this flow table (NLA_STRING)
|
||||
* @NFTA_FLOWTABLE_HOOK: netfilter hook configuration(NLA_U32)
|
||||
* @NFTA_FLOWTABLE_HOOK: netfilter hook configuration (NLA_NESTED)
|
||||
* @NFTA_FLOWTABLE_USE: number of references to this flow table (NLA_U32)
|
||||
* @NFTA_FLOWTABLE_HANDLE: object handle (NLA_U64)
|
||||
* @NFTA_FLOWTABLE_FLAGS: flags (NLA_U32)
|
||||
|
||||
@@ -1883,10 +1883,9 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname,
|
||||
|
||||
switch (optname) {
|
||||
case HCI_DATA_DIR:
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
|
||||
err = -EFAULT;
|
||||
err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, len);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
if (opt)
|
||||
hci_pi(sk)->cmsg_mask |= HCI_CMSG_DIR;
|
||||
@@ -1895,10 +1894,9 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
|
||||
case HCI_TIME_STAMP:
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
|
||||
err = -EFAULT;
|
||||
err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, len);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
if (opt)
|
||||
hci_pi(sk)->cmsg_mask |= HCI_CMSG_TSTAMP;
|
||||
@@ -1916,11 +1914,9 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname,
|
||||
uf.event_mask[1] = *((u32 *) f->event_mask + 1);
|
||||
}
|
||||
|
||||
len = min_t(unsigned int, len, sizeof(uf));
|
||||
if (copy_from_sockptr(&uf, optval, len)) {
|
||||
err = -EFAULT;
|
||||
err = bt_copy_from_sockptr(&uf, sizeof(uf), optval, len);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!capable(CAP_NET_RAW)) {
|
||||
uf.type_mask &= hci_sec_filter.type_mask;
|
||||
@@ -1979,10 +1975,9 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
|
||||
err = -EFAULT;
|
||||
err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, len);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
hci_pi(sk)->mtu = opt;
|
||||
break;
|
||||
|
||||
@@ -3808,7 +3808,7 @@ static void qdisc_pkt_len_init(struct sk_buff *skb)
|
||||
sizeof(_tcphdr), &_tcphdr);
|
||||
if (likely(th))
|
||||
hdr_len += __tcp_hdrlen(th);
|
||||
} else {
|
||||
} else if (shinfo->gso_type & SKB_GSO_UDP_L4) {
|
||||
struct udphdr _udphdr;
|
||||
|
||||
if (skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
@@ -3816,10 +3816,14 @@ static void qdisc_pkt_len_init(struct sk_buff *skb)
|
||||
hdr_len += sizeof(struct udphdr);
|
||||
}
|
||||
|
||||
if (shinfo->gso_type & SKB_GSO_DODGY)
|
||||
gso_segs = DIV_ROUND_UP(skb->len - hdr_len,
|
||||
shinfo->gso_size);
|
||||
if (unlikely(shinfo->gso_type & SKB_GSO_DODGY)) {
|
||||
int payload = skb->len - hdr_len;
|
||||
|
||||
/* Malicious packet. */
|
||||
if (payload <= 0)
|
||||
return;
|
||||
gso_segs = DIV_ROUND_UP(payload, shinfo->gso_size);
|
||||
}
|
||||
qdisc_skb_cb(skb)->pkt_len += (gso_segs - 1) * hdr_len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -644,11 +644,11 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
|
||||
if (skb_cow_head(skb, 0))
|
||||
goto free_skb;
|
||||
|
||||
tnl_params = (const struct iphdr *)skb->data;
|
||||
|
||||
if (!pskb_network_may_pull(skb, pull_len))
|
||||
if (!pskb_may_pull(skb, pull_len))
|
||||
goto free_skb;
|
||||
|
||||
tnl_params = (const struct iphdr *)skb->data;
|
||||
|
||||
/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
|
||||
skb_pull(skb, pull_len);
|
||||
skb_reset_mac_header(skb);
|
||||
|
||||
@@ -52,8 +52,9 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
{
|
||||
struct iphdr *iph;
|
||||
|
||||
local_bh_disable();
|
||||
if (this_cpu_read(nf_skb_duplicated))
|
||||
return;
|
||||
goto out;
|
||||
/*
|
||||
* Copy the skb, and route the copy. Will later return %XT_CONTINUE for
|
||||
* the original skb, which should continue on its way as if nothing has
|
||||
@@ -61,7 +62,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
*/
|
||||
skb = pskb_copy(skb, GFP_ATOMIC);
|
||||
if (skb == NULL)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
/* Avoid counting cloned packets towards the original connection. */
|
||||
@@ -90,6 +91,8 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
} else {
|
||||
kfree_skb(skb);
|
||||
}
|
||||
out:
|
||||
local_bh_enable();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_dup_ipv4);
|
||||
|
||||
|
||||
@@ -47,11 +47,12 @@ static bool nf_dup_ipv6_route(struct net *net, struct sk_buff *skb,
|
||||
void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
const struct in6_addr *gw, int oif)
|
||||
{
|
||||
local_bh_disable();
|
||||
if (this_cpu_read(nf_skb_duplicated))
|
||||
return;
|
||||
goto out;
|
||||
skb = pskb_copy(skb, GFP_ATOMIC);
|
||||
if (skb == NULL)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
nf_reset_ct(skb);
|
||||
@@ -69,6 +70,8 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum,
|
||||
} else {
|
||||
kfree_skb(skb);
|
||||
}
|
||||
out:
|
||||
local_bh_enable();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_dup_ipv6);
|
||||
|
||||
|
||||
@@ -8546,8 +8546,10 @@ static int sctp_listen_start(struct sock *sk, int backlog)
|
||||
*/
|
||||
inet_sk_set_state(sk, SCTP_SS_LISTENING);
|
||||
if (!ep->base.bind_addr.port) {
|
||||
if (sctp_autobind(sk))
|
||||
if (sctp_autobind(sk)) {
|
||||
inet_sk_set_state(sk, SCTP_SS_CLOSED);
|
||||
return -EAGAIN;
|
||||
}
|
||||
} else {
|
||||
if (sctp_get_port(sk, inet_sk(sk)->inet_num)) {
|
||||
inet_sk_set_state(sk, SCTP_SS_CLOSED);
|
||||
|
||||
@@ -967,8 +967,8 @@ static void snd_mixer_oss_slot_free(struct snd_mixer_oss_slot *chn)
|
||||
struct slot *p = chn->private_data;
|
||||
if (p) {
|
||||
if (p->allocated && p->assigned) {
|
||||
kfree_const(p->assigned->name);
|
||||
kfree_const(p->assigned);
|
||||
kfree(p->assigned->name);
|
||||
kfree(p->assigned);
|
||||
}
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
@@ -1379,7 +1379,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
|
||||
struct nid_path *path;
|
||||
hda_nid_t pin = pins[i];
|
||||
|
||||
if (!spec->obey_preferred_dacs) {
|
||||
if (!spec->preferred_dacs) {
|
||||
path = snd_hda_get_path_from_idx(codec, path_idx[i]);
|
||||
if (path) {
|
||||
badness += assign_out_path_ctls(codec, path);
|
||||
@@ -1391,7 +1391,7 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
|
||||
if (dacs[i]) {
|
||||
if (is_dac_already_used(codec, dacs[i]))
|
||||
badness += bad->shared_primary;
|
||||
} else if (spec->obey_preferred_dacs) {
|
||||
} else if (spec->preferred_dacs) {
|
||||
badness += BAD_NO_PRIMARY_DAC;
|
||||
}
|
||||
|
||||
|
||||
@@ -820,6 +820,23 @@ static const struct hda_pintbl cxt_pincfg_sws_js201d[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
/* pincfg quirk for Tuxedo Sirius;
|
||||
* unfortunately the (PCI) SSID conflicts with System76 Pangolin pang14,
|
||||
* which has incompatible pin setup, so we check the codec SSID (luckily
|
||||
* different one!) and conditionally apply the quirk here
|
||||
*/
|
||||
static void cxt_fixup_sirius_top_speaker(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix,
|
||||
int action)
|
||||
{
|
||||
/* ignore for incorrectly picked-up pang14 */
|
||||
if (codec->core.subsystem_id == 0x278212b3)
|
||||
return;
|
||||
/* set up the top speaker pin */
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
snd_hda_codec_set_pincfg(codec, 0x1d, 0x82170111);
|
||||
}
|
||||
|
||||
static const struct hda_fixup cxt_fixups[] = {
|
||||
[CXT_PINCFG_LENOVO_X200] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
@@ -980,11 +997,8 @@ static const struct hda_fixup cxt_fixups[] = {
|
||||
.v.pins = cxt_pincfg_sws_js201d,
|
||||
},
|
||||
[CXT_PINCFG_TOP_SPEAKER] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x1d, 0x82170111 },
|
||||
{ }
|
||||
},
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cxt_fixup_sirius_top_speaker,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -583,6 +583,7 @@ static void alc_shutup_pins(struct hda_codec *codec)
|
||||
switch (codec->core.vendor_id) {
|
||||
case 0x10ec0236:
|
||||
case 0x10ec0256:
|
||||
case 0x10ec0257:
|
||||
case 0x19e58326:
|
||||
case 0x10ec0283:
|
||||
case 0x10ec0285:
|
||||
|
||||
@@ -286,6 +286,9 @@ static int mchp_pdmc_chmap_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
if (!substream)
|
||||
return -ENODEV;
|
||||
|
||||
if (!substream->runtime)
|
||||
return 0; /* just for avoiding error from alsactl restore */
|
||||
|
||||
map = mchp_pdmc_chmap_get(substream, info);
|
||||
if (!map)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -731,6 +731,7 @@ static int imx_card_probe(struct platform_device *pdev)
|
||||
|
||||
data->plat_data = plat_data;
|
||||
data->card.dev = &pdev->dev;
|
||||
data->card.owner = THIS_MODULE;
|
||||
|
||||
dev_set_drvdata(&pdev->dev, &data->card);
|
||||
snd_soc_card_set_drvdata(&data->card, data);
|
||||
|
||||
@@ -25,12 +25,31 @@ logread_pid=$!
|
||||
trap 'kill $logread_pid; rm -f $logfile $rulefile' EXIT
|
||||
exec 3<"$logfile"
|
||||
|
||||
lsplit='s/^\(.*\) entries=\([^ ]*\) \(.*\)$/pfx="\1"\nval="\2"\nsfx="\3"/'
|
||||
summarize_logs() {
|
||||
sum=0
|
||||
while read line; do
|
||||
eval $(sed "$lsplit" <<< "$line")
|
||||
[[ $sum -gt 0 ]] && {
|
||||
[[ "$pfx $sfx" == "$tpfx $tsfx" ]] && {
|
||||
let "sum += val"
|
||||
continue
|
||||
}
|
||||
echo "$tpfx entries=$sum $tsfx"
|
||||
}
|
||||
tpfx="$pfx"
|
||||
tsfx="$sfx"
|
||||
sum=$val
|
||||
done
|
||||
echo "$tpfx entries=$sum $tsfx"
|
||||
}
|
||||
|
||||
do_test() { # (cmd, log)
|
||||
echo -n "testing for cmd: $1 ... "
|
||||
cat <&3 >/dev/null
|
||||
$1 >/dev/null || exit 1
|
||||
sleep 0.1
|
||||
res=$(diff -a -u <(echo "$2") - <&3)
|
||||
res=$(diff -a -u <(echo "$2") <(summarize_logs <&3))
|
||||
[ $? -eq 0 ] && { echo "OK"; return; }
|
||||
echo "FAIL"
|
||||
grep -v '^\(---\|+++\|@@\)' <<< "$res"
|
||||
@@ -129,31 +148,17 @@ do_test 'nft reset rules t1 c2' \
|
||||
'table=t1 family=2 entries=3 op=nft_reset_rule'
|
||||
|
||||
do_test 'nft reset rules table t1' \
|
||||
'table=t1 family=2 entries=3 op=nft_reset_rule
|
||||
table=t1 family=2 entries=3 op=nft_reset_rule
|
||||
table=t1 family=2 entries=3 op=nft_reset_rule'
|
||||
'table=t1 family=2 entries=9 op=nft_reset_rule'
|
||||
|
||||
do_test 'nft reset rules t2 c3' \
|
||||
'table=t2 family=2 entries=189 op=nft_reset_rule
|
||||
table=t2 family=2 entries=188 op=nft_reset_rule
|
||||
table=t2 family=2 entries=126 op=nft_reset_rule'
|
||||
'table=t2 family=2 entries=503 op=nft_reset_rule'
|
||||
|
||||
do_test 'nft reset rules t2' \
|
||||
'table=t2 family=2 entries=3 op=nft_reset_rule
|
||||
table=t2 family=2 entries=3 op=nft_reset_rule
|
||||
table=t2 family=2 entries=186 op=nft_reset_rule
|
||||
table=t2 family=2 entries=188 op=nft_reset_rule
|
||||
table=t2 family=2 entries=129 op=nft_reset_rule'
|
||||
'table=t2 family=2 entries=509 op=nft_reset_rule'
|
||||
|
||||
do_test 'nft reset rules' \
|
||||
'table=t1 family=2 entries=3 op=nft_reset_rule
|
||||
table=t1 family=2 entries=3 op=nft_reset_rule
|
||||
table=t1 family=2 entries=3 op=nft_reset_rule
|
||||
table=t2 family=2 entries=3 op=nft_reset_rule
|
||||
table=t2 family=2 entries=3 op=nft_reset_rule
|
||||
table=t2 family=2 entries=180 op=nft_reset_rule
|
||||
table=t2 family=2 entries=188 op=nft_reset_rule
|
||||
table=t2 family=2 entries=135 op=nft_reset_rule'
|
||||
'table=t1 family=2 entries=9 op=nft_reset_rule
|
||||
table=t2 family=2 entries=509 op=nft_reset_rule'
|
||||
|
||||
# resetting sets and elements
|
||||
|
||||
@@ -177,13 +182,11 @@ do_test 'nft reset counters t1' \
|
||||
'table=t1 family=2 entries=1 op=nft_reset_obj'
|
||||
|
||||
do_test 'nft reset counters t2' \
|
||||
'table=t2 family=2 entries=342 op=nft_reset_obj
|
||||
table=t2 family=2 entries=158 op=nft_reset_obj'
|
||||
'table=t2 family=2 entries=500 op=nft_reset_obj'
|
||||
|
||||
do_test 'nft reset counters' \
|
||||
'table=t1 family=2 entries=1 op=nft_reset_obj
|
||||
table=t2 family=2 entries=341 op=nft_reset_obj
|
||||
table=t2 family=2 entries=159 op=nft_reset_obj'
|
||||
table=t2 family=2 entries=500 op=nft_reset_obj'
|
||||
|
||||
# resetting quotas
|
||||
|
||||
@@ -194,13 +197,11 @@ do_test 'nft reset quotas t1' \
|
||||
'table=t1 family=2 entries=1 op=nft_reset_obj'
|
||||
|
||||
do_test 'nft reset quotas t2' \
|
||||
'table=t2 family=2 entries=315 op=nft_reset_obj
|
||||
table=t2 family=2 entries=185 op=nft_reset_obj'
|
||||
'table=t2 family=2 entries=500 op=nft_reset_obj'
|
||||
|
||||
do_test 'nft reset quotas' \
|
||||
'table=t1 family=2 entries=1 op=nft_reset_obj
|
||||
table=t2 family=2 entries=314 op=nft_reset_obj
|
||||
table=t2 family=2 entries=186 op=nft_reset_obj'
|
||||
table=t2 family=2 entries=500 op=nft_reset_obj'
|
||||
|
||||
# deleting rules
|
||||
|
||||
|
||||
Reference in New Issue
Block a user