Linux 5.15.201
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.201 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/PCI/endpoint/pci-ntb-howto.rst | 11 Makefile | 2 drivers/bus/fsl-mc/fsl-mc-bus.c | 10 drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c | 2 drivers/crypto/omap-crypto.c | 2 drivers/crypto/virtio/virtio_crypto_algs.c | 2 drivers/crypto/virtio/virtio_crypto_core.c | 5 drivers/gpio/gpio-omap.c | 22 drivers/gpio/gpio-sprd.c | 8 drivers/gpio/gpiolib-acpi.c | 1 drivers/gpu/drm/tegra/hdmi.c | 4 drivers/gpu/drm/tegra/sor.c | 4 drivers/net/wireguard/device.c | 1 drivers/pci/endpoint/pci-ep-cfs.c | 54 -- drivers/platform/x86/classmate-laptop.c | 32 + drivers/platform/x86/panasonic-laptop.c | 4 drivers/scsi/qla2xxx/qla_bsg.c | 25 drivers/scsi/qla2xxx/qla_def.h | 50 + drivers/scsi/qla2xxx/qla_gbl.h | 9 drivers/scsi/qla2xxx/qla_gs.c | 578 +++++++--------------- drivers/scsi/qla2xxx/qla_init.c | 31 - drivers/scsi/qla2xxx/qla_isr.c | 29 - drivers/scsi/qla2xxx/qla_os.c | 18 drivers/usb/serial/option.c | 6 drivers/video/fbdev/riva/riva_hw.c | 3 drivers/video/fbdev/smscufx.c | 8 fs/btrfs/block-group.c | 6 fs/btrfs/space-info.c | 20 fs/btrfs/space-info.h | 6 fs/cifs/cifs_dfs_ref.c | 16 fs/f2fs/data.c | 12 fs/f2fs/sysfs.c | 65 ++ fs/ksmbd/transport_tcp.c | 3 fs/nilfs2/sufile.c | 4 fs/romfs/super.c | 5 net/dsa/dsa2.c | 21 net/mptcp/pm_netlink.c | 16 sound/pci/hda/patch_realtek.c | 4 sound/soc/fsl/fsl_xcvr.c | 3 tools/testing/selftests/net/mptcp/pm_netlink.sh | 4 tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 11 41 files changed, 571 insertions(+), 546 deletions(-)
Alban Bedel (1):
gpiolib: acpi: Fix gpio count with string references
Anil Gurumurthy (5):
scsi: qla2xxx: Validate sp before freeing associated memory
scsi: qla2xxx: Delay module unload while fabric scan in progress
scsi: qla2xxx: Query FW again before proceeding with login
scsi: qla2xxx: Fix bsg_done() causing double free
scsi: qla2xxx: Free sp in error path to fix system crash
Bibo Mao (2):
crypto: virtio - Add spinlock protection with virtqueue notification
crypto: virtio - Remove duplicated virtqueue_kick in virtio_crypto_skcipher_crypt_req
Boris Burkov (1):
btrfs: fix racy bitfield write in btrfs_clear_space_info_full()
Brahmajit Das (1):
drm/tegra: hdmi: sor: Fix error: variable ‘j’ set but not used
Chao Yu (1):
f2fs: fix to avoid UAF in f2fs_write_end_io()
Chelsy Ratnawat (1):
bus: fsl-mc: Replace snprintf and sprintf with sysfs_emit in sysfs show functions
Christophe JAILLET (1):
PCI: endpoint: Remove unused field in struct pci_epf_group
Damien Le Moal (1):
PCI: endpoint: Automatically create a function specific attributes group
Daniel Borkmann (1):
Revert "wireguard: device: enable threaded NAPI"
Danilo Krummrich (1):
gpio: omap: do not register driver in probe()
Deepanshu Kartikey (1):
romfs: check sb_set_blocksize() return value
Edward Adam Davis (1):
nilfs2: Fix potential block overflow that cause system hang
Eric Dumazet (1):
mptcp: fix race in mptcp_pm_nl_flush_addrs_doit()
Fabio Porcedda (1):
USB: serial: option: add Telit FN920C04 RNDIS compositions
Gleb Chesnokov (1):
scsi: qla2xxx: Use named initializers for port_[d]state_str
Greg Kroah-Hartman (2):
fbdev: smscufx: properly copy ioctl memory to kernelspace Linux 5.15.201
Guangshuo Li (1):
fbdev: rivafb: fix divide error in nv3_arb()
Gui-Dong Han (1):
bus: fsl-mc: fix use-after-free in driver_override_show()
Henrique Carvalho (1):
smb: server: fix leak of active_num_conn in ksmbd_tcp_new_connection()
Kees Cook (1):
crypto: omap - Allocate OMAP_CRYPTO_FORCE_COPY scatterlists correctly
Liu Song (1):
PCI: endpoint: Avoid creating sub-groups asynchronously
Matthieu Baerts (NGI0) (1):
selftests: mptcp: pm: ensure unknown flags are ignored
Paulo Alcantara (1):
smb: client: set correct id, uid and cruid for multiuser automounts
Quinn Tran (2):
scsi: qla2xxx: Remove dead code (GNN ID)
scsi: qla2xxx: Reduce fabric scan duplicate code
Rafael J. Wysocki (2):
platform/x86: classmate-laptop: Add missing NULL pointer checks platform/x86: panasonic-laptop: Fix sysfs group leak in error path
Thorsten Blum (1):
crypto: octeontx - Fix length check to avoid truncation in ucode_load_store
Tim Guttzeit (1):
ALSA: hda/realtek: Fix headset mic for TongFang X6AR55xU
Vladimir Oltean (1):
net: dsa: free routing table on probe failure
Xuewen Yan (1):
gpio: sprd: Change sprd_gpio lock to raw_spin_lock
Yongpeng Yang (1):
f2fs: fix out-of-bounds access in sysfs attribute read/write
Ziyi Guo (1):
ASoC: fsl_xcvr: fix missing lock in fsl_xcvr_mode_put()
Greg Kroah-Hartman
maintainerDocumentation/PCI/endpoint/pci-ntb-howto.rst +4 -7
@@ -88,13 +88,10 @@ commands can be used:: # echo 0x104c > functions/pci_epf_ntb/func1/vendorid # echo 0xb00d > functions/pci_epf_ntb/func1/deviceid -In order to configure NTB specific attributes, a new sub-directory to func1 -should be created:: - - # mkdir functions/pci_epf_ntb/func1/pci_epf_ntb.0/ - -The NTB function driver will populate this directory with various attributes -that can be configured by the user:: +The PCI endpoint framework also automatically creates a sub-directory in the +function attribute directory. This sub-directory has the same name as the name +of the function device and is populated with the following NTB specific +attributes that can be configured by the user:: # ls functions/pci_epf_ntb/func1/pci_epf_ntb.0/ db_count mw1 mw2 mw3 mw4 num_mws
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 200 +SUBLEVEL = 201 EXTRAVERSION = NAME = Trick or Treat
drivers/bus/fsl-mc/fsl-mc-bus.c +7 -3
@@ -156,8 +156,8 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, {struct fsl_mc_device *mc_dev =to_fsl_mc_device (dev); -return sprintf (buf,"fsl-mc:v%08Xd%s\n" , mc_dev->obj_desc.vendor, - mc_dev->obj_desc.type); +return sysfs_emit (buf,"fsl-mc:v%08Xd%s\n" , mc_dev->obj_desc.vendor, + mc_dev->obj_desc.type); }static DEVICE_ATTR_RO (modalias);
@@ -199,8 +199,12 @@ static ssize_t driver_override_show(struct device *dev, struct device_attribute *attr, char *buf) { struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); +ssize_t len; -return snprintf (buf,PAGE_SIZE ,"%s\n" , mc_dev->driver_override); +device_lock (dev); + len =sysfs_emit (buf,"%s\n" , mc_dev->driver_override); +device_unlock (dev); +return len; }static DEVICE_ATTR_RW (driver_override);
drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c +1 -1
@@ -1337,7 +1337,7 @@ static ssize_t ucode_load_store(struct device *dev,int del_grp_idx =-1 ;int ucode_idx =0 ; -if (strlen (buf) >OTX_CPT_UCODE_NAME_LENGTH ) +if (count >=OTX_CPT_UCODE_NAME_LENGTH )return -EINVAL ; eng_grps = container_of(attr, struct otx_cpt_eng_grps, ucode_load_attr);
drivers/crypto/omap-crypto.c +1 -1
@@ -21,7 +21,7 @@ static int omap_crypto_copy_sg_lists(int total, int bs,struct scatterlist *tmp;if (!(flags &OMAP_CRYPTO_FORCE_SINGLE_ENTRY )) { - new_sg =kmalloc_array (n,sizeof (*sg),GFP_KERNEL ); + new_sg =kmalloc_array (n,sizeof (*new_sg),GFP_KERNEL );if (!new_sg)return -ENOMEM ;
drivers/crypto/virtio/virtio_crypto_algs.c +0 -2
@@ -569,8 +569,6 @@ int virtio_crypto_skcipher_crypt_req(if (ret <0 )return ret; -virtqueue_kick (data_vq->vq); -return 0 ; }
drivers/crypto/virtio/virtio_crypto_core.c +5 -0
@@ -27,15 +27,20 @@ static void virtcrypto_done_task(unsigned long data)struct data_queue *data_vq = (struct data_queue *)data;struct virtqueue *vq = data_vq->vq;struct virtio_crypto_request *vc_req; +unsigned long flags;unsigned int len; +spin_lock_irqsave (&data_vq->lock, flags);do {virtqueue_disable_cb (vq);while ((vc_req =virtqueue_get_buf (vq, &len)) !=NULL ) { +spin_unlock_irqrestore (&data_vq->lock, flags);if (vc_req->alg_cb) vc_req->alg_cb (vc_req, len); +spin_lock_irqsave (&data_vq->lock, flags); } }while (!virtqueue_enable_cb (vq)); +spin_unlock_irqrestore (&data_vq->lock, flags); }static void virtcrypto_dataq_callback (struct virtqueue *vq)
drivers/gpio/gpio-omap.c +18 -4
@@ -762,10 +762,13 @@ static struct platform_device omap_mpuio_device = {static inline void omap_mpuio_init (struct gpio_bank *bank) { -platform_set_drvdata (&omap_mpuio_device, bank); +static bool registered; -if (platform_driver_register (&omap_mpuio_driver) ==0 ) - (void )platform_device_register (&omap_mpuio_device); +platform_set_drvdata (&omap_mpuio_device, bank); +if (!registered) { + (void )platform_device_register (&omap_mpuio_device); + registered = true; + } }/*---------------------------------------------------------------------*/
@@ -1574,13 +1577,24 @@ static struct platform_driver omap_gpio_driver = {*/ static int __init omap_gpio_drv_reg (void ) { -return platform_driver_register (&omap_gpio_driver); +int ret; + + ret =platform_driver_register (&omap_mpuio_driver); +if (ret) +return ret; + + ret =platform_driver_register (&omap_gpio_driver); +if (ret) +platform_driver_unregister (&omap_mpuio_driver); + +return ret; }postcore_initcall (omap_gpio_drv_reg); static void __exit omap_gpio_exit(void) {platform_driver_unregister (&omap_gpio_driver); +platform_driver_unregister (&omap_mpuio_driver); }module_exit (omap_gpio_exit);
drivers/gpio/gpio-sprd.c +4 -4
@@ -35,7 +35,7 @@struct sprd_gpio {struct gpio_chip chip;void __iomem *base; -spinlock_t lock; +raw_spinlock_t lock;int irq; };
@@ -54,7 +54,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,unsigned long flags;u32 tmp; -spin_lock_irqsave (&sprd_gpio->lock, flags); +raw_spin_lock_irqsave (&sprd_gpio->lock, flags); tmp =readl_relaxed (base + reg);if (val)
@@ -63,7 +63,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset, tmp &= ~BIT (SPRD_GPIO_BIT (offset));writel_relaxed (tmp, base + reg); -spin_unlock_irqrestore (&sprd_gpio->lock, flags); +raw_spin_unlock_irqrestore (&sprd_gpio->lock, flags); }static int sprd_gpio_read (struct gpio_chip *chip,unsigned int offset,u16 reg)
@@ -231,7 +231,7 @@ static int sprd_gpio_probe(struct platform_device *pdev)if (IS_ERR (sprd_gpio->base))return PTR_ERR (sprd_gpio->base); -spin_lock_init (&sprd_gpio->lock); +raw_spin_lock_init (&sprd_gpio->lock); sprd_gpio->chip.label =dev_name (&pdev->dev); sprd_gpio->chip.ngpio =SPRD_GPIO_NR ;
drivers/gpio/gpiolib-acpi.c +1 -0
@@ -1369,6 +1369,7 @@ static int acpi_gpio_package_count(const union acpi_object *obj)while (element < end) {switch (element->type) {case ACPI_TYPE_LOCAL_REFERENCE : +case ACPI_TYPE_STRING : element +=3 ; fallthrough;case ACPI_TYPE_INTEGER :
drivers/gpu/drm/tegra/hdmi.c +2 -2
@@ -635,7 +635,7 @@ static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data, {const u8 *ptr = data;unsigned long offset; -size_t i, j; +size_t i;u32 value;switch (ptr[0 ]) {
@@ -668,7 +668,7 @@ static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data,* - subpack_low: bytes 0 - 3 * - subpack_high: bytes 4 - 6 (with byte 7 padded to 0x00) */ -for (i =3 , j =0 ; i < size; i +=7 , j +=8 ) { +for (i =3 ; i < size; i +=7 ) {size_t rem = size - i, num =min_t (size_t, rem,4 ); value =tegra_hdmi_subpack (&ptr[i], num);
drivers/gpu/drm/tegra/sor.c +2 -2
@@ -1860,7 +1860,7 @@ static void tegra_sor_hdmi_write_infopack(struct tegra_sor *sor, {const u8 *ptr = data;unsigned long offset; -size_t i, j; +size_t i;u32 value;switch (ptr[0 ]) {
@@ -1893,7 +1893,7 @@ static void tegra_sor_hdmi_write_infopack(struct tegra_sor *sor,* - subpack_low: bytes 0 - 3 * - subpack_high: bytes 4 - 6 (with byte 7 padded to 0x00) */ -for (i =3 , j =0 ; i < size; i +=7 , j +=8 ) { +for (i =3 ; i < size; i +=7 ) {size_t rem = size - i, num =min_t (size_t, rem,4 ); value =tegra_sor_hdmi_subpack (&ptr[i], num);
drivers/net/wireguard/device.c +0 -1
@@ -352,7 +352,6 @@ static int wg_newlink(struct net *src_net, struct net_device *dev,if (ret <0 ) goto err_free_handshake_queue; -dev_set_threaded (dev, true); ret =register_netdevice (dev);if (ret <0 ) goto err_uninit_ratelimiter;
drivers/pci/endpoint/pci-ep-cfs.c +23 -31
99 lines not on this page · raw message
drivers/platform/x86/classmate-laptop.c +32 -0
@@ -208,7 +208,12 @@ static ssize_t cmpc_accel_sensitivity_show_v4(struct device *dev, acpi =to_acpi_device (dev); inputdev =dev_get_drvdata (&acpi->dev); +if (!inputdev) +return -ENXIO ; + accel =dev_get_drvdata (&inputdev->dev); +if (!accel) +return -ENXIO ;return sprintf (buf,"%d\n" , accel->sensitivity); }
@@ -225,7 +230,12 @@ static ssize_t cmpc_accel_sensitivity_store_v4(struct device *dev, acpi =to_acpi_device (dev); inputdev =dev_get_drvdata (&acpi->dev); +if (!inputdev) +return -ENXIO ; + accel =dev_get_drvdata (&inputdev->dev); +if (!accel) +return -ENXIO ; r =kstrtoul (buf,0 , &sensitivity);if (r)
@@ -257,7 +267,12 @@ static ssize_t cmpc_accel_g_select_show_v4(struct device *dev, acpi =to_acpi_device (dev); inputdev =dev_get_drvdata (&acpi->dev); +if (!inputdev) +return -ENXIO ; + accel =dev_get_drvdata (&inputdev->dev); +if (!accel) +return -ENXIO ;return sprintf (buf,"%d\n" , accel->g_select); }
@@ -274,7 +289,12 @@ static ssize_t cmpc_accel_g_select_store_v4(struct device *dev, acpi =to_acpi_device (dev); inputdev =dev_get_drvdata (&acpi->dev); +if (!inputdev) +return -ENXIO ; + accel =dev_get_drvdata (&inputdev->dev); +if (!accel) +return -ENXIO ; r =kstrtoul (buf,0 , &g_select);if (r)
@@ -303,6 +323,8 @@ static int cmpc_accel_open_v4(struct input_dev *input) acpi =to_acpi_device (input->dev.parent); accel =dev_get_drvdata (&input->dev); +if (!accel) +return -ENXIO ;cmpc_accel_set_sensitivity_v4 (acpi->handle, accel->sensitivity);cmpc_accel_set_g_select_v4 (acpi->handle, accel->g_select);
@@ -551,7 +573,12 @@ static ssize_t cmpc_accel_sensitivity_show(struct device *dev, acpi =to_acpi_device (dev); inputdev =dev_get_drvdata (&acpi->dev); +if (!inputdev) +return -ENXIO ; + accel =dev_get_drvdata (&inputdev->dev); +if (!accel) +return -ENXIO ;return sprintf (buf,"%d\n" , accel->sensitivity); }
@@ -568,7 +595,12 @@ static ssize_t cmpc_accel_sensitivity_store(struct device *dev, acpi =to_acpi_device (dev); inputdev =dev_get_drvdata (&acpi->dev); +if (!inputdev) +return -ENXIO ; + accel =dev_get_drvdata (&inputdev->dev); +if (!accel) +return -ENXIO ; r =kstrtoul (buf,0 , &sensitivity);if (r)
drivers/platform/x86/panasonic-laptop.c +3 -1
@@ -1073,7 +1073,7 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) -1, NULL, 0);if (IS_ERR (pcc->platform)) { result =PTR_ERR (pcc->platform); - goto out_backlight; + goto out_sysfs; } result =device_create_file (&pcc->platform->dev, &dev_attr_cdpower);
@@ -1089,6 +1089,8 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) out_platform:platform_device_unregister (pcc->platform); +out_sysfs: +sysfs_remove_group (&device->dev.kobj, &pcc_attr_group); out_backlight:backlight_device_unregister (pcc->backlight); out_input:
drivers/scsi/qla2xxx/qla_bsg.c +15 -10
@@ -1546,8 +1546,9 @@ qla2x00_update_optrom(struct bsg_job *bsg_job) ha->optrom_buffer =NULL ; ha->optrom_state =QLA_SWAITING ;mutex_unlock (&ha->optrom_mutex); -bsg_job_done (bsg_job, bsg_reply->result, - bsg_reply->reply_payload_rcv_len); +if (!rval) +bsg_job_done (bsg_job, bsg_reply->result, + bsg_reply->reply_payload_rcv_len);return rval; }
@@ -2525,8 +2526,9 @@ qla2x00_manage_host_stats(struct bsg_job *bsg_job) sizeof(struct ql_vnd_mng_host_stats_resp)); bsg_reply->result =DID_OK ; -bsg_job_done (bsg_job, bsg_reply->result, - bsg_reply->reply_payload_rcv_len); +if (!ret) +bsg_job_done (bsg_job, bsg_reply->result, + bsg_reply->reply_payload_rcv_len);return ret; }
@@ -2615,8 +2617,9 @@ qla2x00_get_host_stats(struct bsg_job *bsg_job) bsg_job->reply_payload.sg_cnt, data, response_len); bsg_reply->result =DID_OK ; -bsg_job_done (bsg_job, bsg_reply->result, - bsg_reply->reply_payload_rcv_len); +if (!ret) +bsg_job_done (bsg_job, bsg_reply->result, + bsg_reply->reply_payload_rcv_len);kfree (data); host_stat_out:
@@ -2715,8 +2718,9 @@ qla2x00_get_tgt_stats(struct bsg_job *bsg_job) bsg_job->reply_payload.sg_cnt, data, response_len); bsg_reply->result =DID_OK ; -bsg_job_done (bsg_job, bsg_reply->result, - bsg_reply->reply_payload_rcv_len); +if (!ret) +bsg_job_done (bsg_job, bsg_reply->result, + bsg_reply->reply_payload_rcv_len); tgt_stat_out:kfree (data);
@@ -2777,8 +2781,9 @@ qla2x00_manage_host_port(struct bsg_job *bsg_job) bsg_job->reply_payload.sg_cnt, &rsp_data, sizeof(struct ql_vnd_mng_host_port_resp)); bsg_reply->result =DID_OK ; -bsg_job_done (bsg_job, bsg_reply->result, - bsg_reply->reply_payload_rcv_len); +if (!ret) +bsg_job_done (bsg_job, bsg_reply->result, + bsg_reply->reply_payload_rcv_len);return ret; }
drivers/scsi/qla2xxx/qla_def.h +29 -21
82 lines not on this page · raw message
drivers/scsi/qla2xxx/qla_gbl.h +3 -6
@@ -727,12 +727,9 @@ void qla24xx_handle_gpsc_event(scsi_qla_host_t *, struct event_arg *);int qla2x00_mgmt_svr_login (scsi_qla_host_t *);void qla24xx_handle_gffid_event (scsi_qla_host_t *vha,struct event_arg *ea);int qla24xx_async_gffid (scsi_qla_host_t *vha,fc_port_t *fcport,bool ); -int qla24xx_async_gpnft (scsi_qla_host_t *,u8 ,srb_t *); -void qla24xx_async_gpnft_done (scsi_qla_host_t *,srb_t *); -void qla24xx_async_gnnft_done (scsi_qla_host_t *,srb_t *); -int qla24xx_async_gnnid (scsi_qla_host_t *,fc_port_t *); -void qla24xx_handle_gnnid_event (scsi_qla_host_t *,struct event_arg *); -int qla24xx_post_gnnid_work (struct scsi_qla_host *,fc_port_t *); +int qla_fab_async_scan (scsi_qla_host_t *,srb_t *); +void qla_fab_scan_start (struct scsi_qla_host *); +void qla_fab_scan_finish (scsi_qla_host_t *,srb_t *);int qla24xx_post_gfpnid_work (struct scsi_qla_host *,fc_port_t *);int qla24xx_async_gfpnid (scsi_qla_host_t *,fc_port_t *);void qla24xx_handle_gfpnid_event (scsi_qla_host_t *,struct event_arg *);
drivers/scsi/qla2xxx/qla_gs.c +200 -378
734 lines not on this page · raw message
drivers/scsi/qla2xxx/qla_init.c +19 -12
@@ -1725,12 +1725,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) }break ;default : -if (wwn ==0 ) { -ql_dbg (ql_dbg_disc, vha,0xffff , -"%s %d %8phC post GNNID\n" , - __func__, __LINE__, fcport->port_name); -qla24xx_post_gnnid_work (vha, fcport); - }else if (fcport->loop_id ==FC_NO_LOOP_ID ) { +if (fcport->loop_id ==FC_NO_LOOP_ID ) {ql_dbg (ql_dbg_disc, vha,0x20bd ,"%s %d %8phC post gnl\n" , __func__, __LINE__, fcport->port_name);
@@ -2473,8 +2468,23 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) ea->sp->gen1, fcport->rscn_gen, ea->data[0], ea->data[1], ea->iop[0], ea->iop[1]); -if ((fcport->fw_login_state ==DSC_LS_PLOGI_PEND ) || - (fcport->fw_login_state ==DSC_LS_PRLI_PEND )) { +if (fcport->fw_login_state ==DSC_LS_PLOGI_PEND ) { +ql_dbg (ql_dbg_disc, vha,0x20ea , +"%s %d %8phC Remote is trying to login\n" , + __func__, __LINE__, fcport->port_name); +/* +* If we get here, there is port thats already logged in, +* but it's state has not moved ahead. Recheck with FW on +* what state it is in and proceed ahead +*/ +if (!N2N_TOPO (vha->hw)) { + fcport->fw_login_state =DSC_LS_PRLI_COMP ; +qla24xx_post_gpdb_work (vha, fcport,0 ); + } +return ; + } + +if (fcport->fw_login_state ==DSC_LS_PRLI_PEND ) {ql_dbg (ql_dbg_disc, vha,0x20ea ,"%s %d %8phC Remote is trying to login\n" , __func__, __LINE__, fcport->port_name);
@@ -6447,10 +6457,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)if (USE_ASYNC_SCAN (ha)) {/* start of scan begins here */ vha->scan.rscn_gen_end =atomic_read (&vha->rscn_gen); - rval =qla24xx_async_gpnft (vha,FC4_TYPE_FCP_SCSI , -NULL ); -if (rval) -set_bit (LOOP_RESYNC_NEEDED , &vha->dpc_flags); +qla_fab_scan_start (vha); }else {list_for_each_entry (fcport, &vha->vp_fcports, list) fcport->scan_state =QLA_FCPORT_SCAN ;
drivers/scsi/qla2xxx/qla_isr.c +22 -7
@@ -49,11 +49,11 @@ qla27xx_process_purex_fpin(struct scsi_qla_host *vha, struct purex_item *item) }const char *const port_state_str[] = { -"Unknown" , -"UNCONFIGURED" , -"DEAD" , -"LOST" , -"ONLINE" + [FCS_UNKNOWN ] ="Unknown" , + [FCS_UNCONFIGURED ] ="UNCONFIGURED" , + [FCS_DEVICE_DEAD ] ="DEAD" , + [FCS_DEVICE_LOST ] ="LOST" , + [FCS_ONLINE ] ="ONLINE" }; static void
@@ -1524,13 +1524,28 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)/* Port logout */ fcport =qla2x00_find_fcport_by_loopid (vha, mb[1 ]); -if (!fcport) +if (!fcport) { +ql_dbg (ql_dbg_async, vha,0x5011 , +"Could not find fcport:%04x %04x %04x\n" , + mb[1 ], mb[2 ], mb[3 ]);break ; -if (atomic_read (&fcport->state) !=FCS_ONLINE ) + } + +if (atomic_read (&fcport->state) !=FCS_ONLINE ) { +ql_dbg (ql_dbg_async, vha,0x5012 , +"Port state is not online State:0x%x \n" , +atomic_read (&fcport->state)); +ql_dbg (ql_dbg_async, vha,0x5012 , +"Scheduling session for deletion \n" ); + fcport->logout_on_delete =0 ; +qlt_schedule_sess_for_deletion (fcport);break ; + } +ql_dbg (ql_dbg_async, vha,0x508a ,"Marking port lost loopid=%04x portid=%06x.\n" , fcport->loop_id, fcport->d_id.b24); +if (qla_ini_mode_enabled (vha)) { fcport->logout_on_delete =0 ;qlt_schedule_sess_for_deletion (fcport);
drivers/scsi/qla2xxx/qla_os.c +6 -12
@@ -1216,7 +1216,8 @@ qla2x00_wait_for_hba_ready(scsi_qla_host_t *vha)while ((qla2x00_reset_active (vha) || ha->dpc_active || ha->flags.mbox_busy) ||test_bit (FX00_RESET_RECOVERY , &vha->dpc_flags) || -test_bit (FX00_TARGET_SCAN , &vha->dpc_flags)) { +test_bit (FX00_TARGET_SCAN , &vha->dpc_flags) || + (vha->scan.scan_flags &SF_SCANNING )) {if (test_bit (UNLOADING , &base_vha->dpc_flags))break ;msleep (1000 );
@@ -5489,18 +5490,11 @@ qla2x00_do_work(struct scsi_qla_host *vha)qla2x00_async_prlo_done (vha, e->u.logio.fcport, e->u.logio.data);break ; -case QLA_EVT_GPNFT : -qla24xx_async_gpnft (vha, e->u.gpnft.fc4_type, - e->u.gpnft.sp); +case QLA_EVT_SCAN_CMD : +qla_fab_async_scan (vha, e->u.iosb.sp);break ; -case QLA_EVT_GPNFT_DONE : -qla24xx_async_gpnft_done (vha, e->u.iosb.sp); -break ; -case QLA_EVT_GNNFT_DONE : -qla24xx_async_gnnft_done (vha, e->u.iosb.sp); -break ; -case QLA_EVT_GNNID : -qla24xx_async_gnnid (vha, e->u.fcport.fcport); +case QLA_EVT_SCAN_FINISH : +qla_fab_scan_finish (vha, e->u.iosb.sp);break ;case QLA_EVT_GFPNID :qla24xx_async_gfpnid (vha, e->u.fcport.fcport);
drivers/usb/serial/option.c +6 -0
@@ -1401,12 +1401,16 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a0, 0xff), /* Telit FN20C04 (rmnet) */ .driver_info = RSVD(0) | NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a1, 0xff), /* Telit FN20C04 (RNDIS) */ + .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a2, 0xff), /* Telit FN920C04 (MBIM) */ .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a3, 0xff), /* Telit FN920C04 (ECM) */ .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a4, 0xff), /* Telit FN20C04 (rmnet) */ .driver_info = RSVD(0) | NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a6, 0xff), /* Telit FN920C04 (RNDIS) */ + .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a7, 0xff), /* Telit FN920C04 (MBIM) */ .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a8, 0xff), /* Telit FN920C04 (ECM) */
@@ -1415,6 +1419,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10aa, 0xff), /* Telit FN920C04 (MBIM) */ .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10ab, 0xff), /* Telit FN920C04 (RNDIS) */ + .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) }, { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10b0, 0xff, 0xff, 0x30), /* Telit FE990B (rmnet) */ .driver_info = NCTRL(5) }, { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10b0, 0xff, 0xff, 0x40) },
drivers/video/fbdev/riva/riva_hw.c +3 -0
@@ -436,6 +436,9 @@ static char nv3_arb(nv3_fifo_info * res_info, nv3_sim_state * state, nv3_arb_in vmisses =2 ; eburst_size = state->memory_width *1 ; mburst_size =32 ; +if (!state->mclk_khz) +return (0 ); + gns =1000000 * (gmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz; ainfo->by_gfacc = gns*ainfo->gdrain_rate/1000000 ; ainfo->wcmocc =0 ;
drivers/video/fbdev/smscufx.c +6 -2
@@ -986,7 +986,6 @@ static int ufx_ops_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) {struct ufx_data *dev = info->par; -struct dloarea *area =NULL ;if (!atomic_read (&dev->usb_active))return 0 ;
@@ -1001,6 +1000,10 @@ static int ufx_ops_ioctl(struct fb_info *info, unsigned int cmd,/* TODO: Help propose a standard fb.h ioctl to report mmap damage */ if (cmd ==UFX_IOCTL_REPORT_DAMAGE ) { + struct dloarea *area __free(kfree) = kmalloc(sizeof(*area), GFP_KERNEL); +if (!area) +return -ENOMEM ; +/* If we have a damage-aware client, turn fb_defio "off" * To avoid perf imact of unnecessary page fault handling. * Done by resetting the delay for this fb_info to a very
@@ -1010,7 +1013,8 @@ static int ufx_ops_ioctl(struct fb_info *info, unsigned int cmd,if (info->fbdefio) info->fbdefio->delay =UFX_DEFIO_WRITE_DISABLE ; - area = (struct dloarea *)arg; +if (copy_from_user (area, (u8 __user *)arg,sizeof (*area))) +return -EFAULT ;if (area->x <0 ) area->x =0 ;
fs/btrfs/block-group.c +3 -3
@@ -3699,7 +3699,7 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags,mutex_unlock (&fs_info->chunk_mutex); }else {/* Proceed with allocation */ - space_info->chunk_alloc =1 ; + space_info->chunk_alloc = true; wait_for_alloc = false;spin_unlock (&space_info->lock); }
@@ -3735,7 +3735,7 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags,spin_lock (&space_info->lock);if (ret <0 ) {if (ret == -ENOSPC ) - space_info->full =1 ; + space_info->full = true;else goto out; }else {
@@ -3745,7 +3745,7 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags, space_info->force_alloc =CHUNK_ALLOC_NO_FORCE ; out: - space_info->chunk_alloc =0 ; + space_info->chunk_alloc = false;spin_unlock (&space_info->lock);mutex_unlock (&fs_info->chunk_mutex);
fs/btrfs/space-info.c +10 -10
@@ -178,7 +178,7 @@ void btrfs_clear_space_info_full(struct btrfs_fs_info *info)struct btrfs_space_info *found;list_for_each_entry (found, head, list) - found->full =0 ; + found->full = false; }static int create_space_info (struct btrfs_fs_info *info,u64 flags)
@@ -271,7 +271,7 @@ void btrfs_update_space_info(struct btrfs_fs_info *info, u64 flags, found->bytes_readonly += bytes_readonly; found->bytes_zone_unusable += bytes_zone_unusable;if (total_bytes >0 ) - found->full =0 ; + found->full = false;btrfs_try_granting_tickets (info, found);spin_unlock (&found->lock); *space_info = found;
@@ -941,7 +941,7 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work)spin_lock (&space_info->lock); to_reclaim =btrfs_calc_reclaim_metadata_size (fs_info, space_info);if (!to_reclaim) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -953,7 +953,7 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work)flush_space (fs_info, space_info, to_reclaim, flush_state, false);spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -996,7 +996,7 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work) flush_state =FLUSH_DELAYED_ITEMS_NR ; commit_cycles--; }else { - space_info->flush =0 ; + space_info->flush = false; } }else { flush_state =FLUSH_DELAYED_ITEMS_NR ;
@@ -1158,7 +1158,7 @@ static void btrfs_async_reclaim_data_space(struct work_struct *work)spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1169,7 +1169,7 @@ static void btrfs_async_reclaim_data_space(struct work_struct *work)flush_space (fs_info, space_info,U64_MAX ,ALLOC_CHUNK_FORCE , false);spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1182,7 +1182,7 @@ static void btrfs_async_reclaim_data_space(struct work_struct *work) data_flush_states[flush_state], false);spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1199,7 +1199,7 @@ static void btrfs_async_reclaim_data_space(struct work_struct *work)if (maybe_fail_all_tickets (fs_info, space_info)) flush_state =0 ;else - space_info->flush =0 ; + space_info->flush = false; }else { flush_state =0 ; }
@@ -1510,7 +1510,7 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_info,*/ maybe_clamp_preempt (fs_info, space_info); - space_info->flush =1 ; + space_info->flush = true; trace_btrfs_trigger_flush(fs_info, space_info->flags, orig_bytes, flush,
fs/btrfs/space-info.h +3 -3
@@ -28,11 +28,11 @@ struct btrfs_space_info {flushing. The value is >> clamp, so turns out to be a 2^clamp divisor. */ - unsigned int full:1; /* indicates that we cannot allocate any more +bool full;/* indicates that we cannot allocate any more chunks for this space */ - unsigned int chunk_alloc:1; /* set if we are allocating a chunk */ +bool chunk_alloc;/* set if we are allocating a chunk */ - unsigned int flush:1; /* set if we are trying to make space */ +bool flush;/* set if we are trying to make space */ unsigned int force_alloc;/* set if we need to force a chunk alloc for this space */
fs/cifs/cifs_dfs_ref.c +16 -0
@@ -258,6 +258,21 @@ char *cifs_compose_mount_options(const char *sb_mountdata, goto compose_mount_options_out; } +static void fs_context_set_ids (struct smb3_fs_context *ctx) +{ +kuid_t uid =current_fsuid (); +kgid_t gid =current_fsgid (); + +if (ctx->multiuser) { +if (!ctx->uid_specified) + ctx->linux_uid = uid; +if (!ctx->gid_specified) + ctx->linux_gid = gid; + } +if (!ctx->cruid_specified) + ctx->cred_uid = uid; +} +/* * Create a vfsmount that we can automount */
@@ -309,6 +324,7 @@ static struct vfsmount *cifs_dfs_do_automount(struct path *path) tmp.source = full_path; tmp.UNC = tmp.prepath =NULL ; +fs_context_set_ids (&tmp); rc =smb3_fs_context_dup (ctx, &tmp);if (rc) { mnt =ERR_PTR (rc);
fs/f2fs/data.c +9 -3
@@ -341,14 +341,20 @@ static void f2fs_write_end_io(struct bio *bio) page->index != nid_of_node(page));dec_page_count (sbi, type); + +/* +* we should access sbi before end_page_writeback() to +* avoid racing w/ kill_f2fs_super() +*/ +if (type ==F2FS_WB_CP_DATA && !get_pages (sbi, type) && +wq_has_sleeper (&sbi->cp_wait)) +wake_up (&sbi->cp_wait); +if (f2fs_in_warm_node_list (sbi, page))f2fs_del_fsync_node_entry (sbi, page);clear_page_private_gcing (page);end_page_writeback (page); } -if (!get_pages (sbi,F2FS_WB_CP_DATA ) && -wq_has_sleeper (&sbi->cp_wait)) -wake_up (&sbi->cp_wait);bio_put (bio); }
fs/f2fs/sysfs.c +58 -7
116 lines not on this page · raw message
fs/ksmbd/transport_tcp.c +2 -1
@@ -41,6 +41,7 @@ static struct ksmbd_transport_ops ksmbd_tcp_transport_ops;static void tcp_stop_kthread (struct task_struct *kthread);static struct interface *alloc_iface (char *ifname); +static void ksmbd_tcp_disconnect (struct ksmbd_transport *t);#define KSMBD_TRANS (t) (&(t)->transport)#define TCP_TRANS (t) ((struct tcp_transport *)container_of(t, \
@@ -207,7 +208,7 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)if (IS_ERR (handler)) {pr_err ("cannot start conn thread\n" ); rc =PTR_ERR (handler); -free_transport (t); +ksmbd_tcp_disconnect (KSMBD_TRANS (t)); }return rc;
fs/nilfs2/sufile.c +4 -0
@@ -1091,6 +1091,9 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range)else end_block = start_block + len -1 ; +if (end_block < nilfs->ns_first_data_block) + goto out; + segnum =nilfs_get_segnum_of_block (nilfs, start_block); segnum_end =nilfs_get_segnum_of_block (nilfs, end_block);
@@ -1188,6 +1191,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) out_sem:up_read (&NILFS_MDT (sufile)->mi_sem); +out: range->len = ndiscarded << nilfs->ns_blocksize_bits;return ret; }
fs/romfs/super.c +4 -1
@@ -467,7 +467,10 @@ static int romfs_fill_super(struct super_block *sb, struct fs_context *fc)#ifdef CONFIG_BLOCK if (!sb->s_mtd) { -sb_set_blocksize (sb,ROMBSIZE ); +if (!sb_set_blocksize (sb,ROMBSIZE )) { +errorf (fc,"romfs: unable to set blocksize\n" ); +return -EINVAL ; + } }else { sb->s_blocksize =ROMBSIZE ; sb->s_blocksize_bits =blksize_bits (ROMBSIZE );
net/dsa/dsa2.c +14 -7
@@ -1079,6 +1079,16 @@ static void dsa_tree_teardown_lags(struct dsa_switch_tree *dst)kfree (dst->lags); } +static void dsa_tree_teardown_routing_table (struct dsa_switch_tree *dst) +{ +struct dsa_link *dl, *next; + +list_for_each_entry_safe (dl, next, &dst->rtable, list) { +list_del (&dl->list); +kfree (dl); + } +} +static int dsa_tree_setup (struct dsa_switch_tree *dst) {bool complete;
@@ -1096,7 +1106,7 @@ static int dsa_tree_setup(struct dsa_switch_tree *dst) err =dsa_tree_setup_cpu_ports (dst);if (err) -return err; + goto teardown_rtable; err =dsa_tree_setup_switches (dst);if (err)
@@ -1123,14 +1133,14 @@ static int dsa_tree_setup(struct dsa_switch_tree *dst)dsa_tree_teardown_switches (dst); teardown_cpu_ports:dsa_tree_teardown_cpu_ports (dst); +teardown_rtable: +dsa_tree_teardown_routing_table (dst);return err; }static void dsa_tree_teardown (struct dsa_switch_tree *dst) { -struct dsa_link *dl, *next; -if (!dst->setup)return ;
@@ -1144,10 +1154,7 @@ static void dsa_tree_teardown(struct dsa_switch_tree *dst)dsa_tree_teardown_cpu_ports (dst); -list_for_each_entry_safe (dl, next, &dst->rtable, list) { -list_del (&dl->list); -kfree (dl); - } +dsa_tree_teardown_routing_table (dst);pr_info ("DSA: tree %d torn down\n" , dst->index);
net/mptcp/pm_netlink.c +13 -3
@@ -1656,16 +1656,26 @@ static void __reset_counters(struct pm_nl_pernet *pernet)static int mptcp_nl_cmd_flush_addrs (struct sk_buff *skb,struct genl_info *info) {struct pm_nl_pernet *pernet =genl_info_pm_nl (info); -LIST_HEAD (free_list); +struct list_head free_list;spin_lock_bh (&pernet->lock); -list_splice_init (&pernet->local_addr_list, &free_list); + free_list = pernet->local_addr_list; +INIT_LIST_HEAD_RCU (&pernet->local_addr_list);__reset_counters (pernet); pernet->next_id =1 ;bitmap_zero (pernet->id_bitmap,MAX_ADDR_ID +1 );spin_unlock_bh (&pernet->lock); -mptcp_nl_remove_addrs_list (sock_net (skb->sk), &free_list); + +if (free_list.next == &pernet->local_addr_list) +return 0 ; +synchronize_rcu (); + +/* Adjust the pointers to free_list instead of pernet->local_addr_list */ + free_list.prev->next = &free_list; + free_list.next->prev = &free_list; + +mptcp_nl_remove_addrs_list (sock_net (skb->sk), &free_list);__flush_addrs (&free_list);return 0 ; }
sound/pci/hda/patch_realtek.c +4 -0
@@ -10133,6 +10133,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { {0x12, 0x90a60140}, {0x19, 0x04a11030}, {0x21, 0x04211020}), + SND_HDA_PIN_QUIRK(0x10ec0274, 0x1d05, "TongFang", ALC274_FIXUP_HP_HEADSET_MIC, + {0x17, 0x90170110}, + {0x19, 0x03a11030}, + {0x21, 0x03211020}), SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT, ALC282_STANDARD_PINS, {0x12, 0x90a609c0},
sound/soc/fsl/fsl_xcvr.c +3 -0
@@ -203,10 +203,13 @@ static int fsl_xcvr_mode_put(struct snd_kcontrol *kcontrol, xcvr->mode =snd_soc_enum_item_to_val (e, item[0 ]); +down_read (&card->snd_card->controls_rwsem);fsl_xcvr_activate_ctl (dai, fsl_xcvr_arc_mode_kctl.name, (xcvr->mode ==FSL_XCVR_MODE_ARC ));fsl_xcvr_activate_ctl (dai, fsl_xcvr_earc_capds_kctl.name, (xcvr->mode ==FSL_XCVR_MODE_EARC )); +up_read (&card->snd_card->controls_rwsem); +/* Allow playback for SPDIF only */ rtd =snd_soc_get_pcm_runtime (card, card->dai_link); rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count =
tools/testing/selftests/net/mptcp/pm_netlink.sh +4 -0
@@ -124,6 +124,10 @@ id 8 flags signal 10.0.1.8" "id limit" ip netns exec $ns1 ./pm_nl_ctl flush check "ip netns exec $ns1 ./pm_nl_ctl dump" "" "flush addrs" +ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1 flags unknown +check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags 10.0.1.1" "ignore unknown flags" +ip netns exec $ns1 ./pm_nl_ctl flush + ip netns exec $ns1 ./pm_nl_ctl limits 9 1 check "ip netns exec $ns1 ./pm_nl_ctl limits" "$default_limits" "rcv addrs above hard limit"
tools/testing/selftests/net/mptcp/pm_nl_ctl.c +11 -0
@@ -22,6 +22,8 @@#define MPTCP_PM_NAME "mptcp_pm"#endif +#define MPTCP_PM_ADDR_FLAG_UNKNOWN _BITUL(7) +static void syntax (char *argv[]) {fprintf (stderr,"%s add|get|set|del|flush|dump|accept [<args>]\n" , argv[0 ]);
@@ -238,6 +240,8 @@ int add_addr(int fd, int pm_family, int argc, char *argv[]) flags |=MPTCP_PM_ADDR_FLAG_BACKUP ; else if (!strcmp(tok, "fullmesh")) flags |=MPTCP_PM_ADDR_FLAG_FULLMESH ; + else if (!strcmp(tok, "unknown")) + flags |=MPTCP_PM_ADDR_FLAG_UNKNOWN ; else error(1, errno, "unknown flag %s", argv[arg]);
@@ -436,6 +440,13 @@ static void print_addr(struct rtattr *attrs, int len)printf ("," ); } +if (flags &MPTCP_PM_ADDR_FLAG_UNKNOWN ) { +printf ("unknown" ); + flags &= ~MPTCP_PM_ADDR_FLAG_UNKNOWN ; +if (flags) +printf ("," ); + } +/* bump unknown flags, if any */ if (flags)printf ("0x%x" , flags);