Merge 6.3-rc5 into driver-core-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 3 Apr 2023 07:33:30 +0000 (09:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 3 Apr 2023 07:33:30 +0000 (09:33 +0200)
We need the fixes in here for testing, as well as the driver core
changes for documentation updates to build on.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
14 files changed:
1  2 
MAINTAINERS
block/genhd.c
drivers/ata/pata_parport/pata_parport.c
drivers/block/ublk_drv.c
drivers/char/tpm/tpm-chip.c
drivers/char/tpm/tpm.h
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/hwmon/hwmon.c
drivers/i2c/i2c-dev.c
drivers/nvme/host/core.c
drivers/scsi/sd.c
drivers/soc/qcom/rmtfs_mem.c
drivers/tty/vt/vt.c
drivers/vhost/vdpa.c

diff --combined MAINTAINERS
@@@ -73,7 -73,7 +73,7 @@@ Tips for patch submitter
        and ideally, should come with a patch proposal. Please do not send
        automated reports to this list either. Such bugs will be handled
        better and faster in the usual public places. See
-       Documentation/admin-guide/security-bugs.rst for details.
+       Documentation/process/security-bugs.rst for details.
  
  8.    Happy hacking.
  
@@@ -5971,7 -5971,7 +5971,7 @@@ F:      include/linux/dm-*.
  F:    include/uapi/linux/dm-*.h
  
  DEVLINK
- M:    Jiri Pirko <jiri@nvidia.com>
+ M:    Jiri Pirko <jiri@resnulli.us>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/devlink
@@@ -6318,9 -6318,7 +6318,9 @@@ F:      drivers/base
  F:    fs/debugfs/
  F:    fs/sysfs/
  F:    include/linux/debugfs.h
 +F:    include/linux/fwnode.h
  F:    include/linux/kobj*
 +F:    include/linux/property.h
  F:    lib/kobj*
  
  DRIVERS FOR OMAP ADAPTIVE VOLTAGE SCALING (AVS)
@@@ -8218,6 -8216,7 +8218,7 @@@ F:      drivers/net/ethernet/freescale/dpa
  
  FREESCALE QORIQ DPAA FMAN DRIVER
  M:    Madalin Bucur <madalin.bucur@nxp.com>
+ R:    Sean Anderson <sean.anderson@seco.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/fsl-fman.txt
@@@ -9873,10 -9872,10 +9874,10 @@@ M:   Christian Brauner <brauner@kernel.or
  M:    Seth Forshee <sforshee@kernel.org>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
- T:    git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
  F:    Documentation/filesystems/idmappings.rst
- F:    tools/testing/selftests/mount_setattr/
  F:    include/linux/mnt_idmapping.*
+ F:    tools/testing/selftests/mount_setattr/
  
  IDT VersaClock 5 CLOCK DRIVER
  M:    Luca Ceresoli <luca@lucaceresoli.net>
@@@ -14658,10 -14657,8 +14659,8 @@@ F:  net/ipv4/nexthop.
  
  NFC SUBSYSTEM
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
- L:    linux-nfc@lists.01.org (subscribers-only)
  L:    netdev@vger.kernel.org
  S:    Maintained
- B:    mailto:linux-nfc@lists.01.org
  F:    Documentation/devicetree/bindings/net/nfc/
  F:    drivers/nfc/
  F:    include/linux/platform_data/nfcmrvl.h
@@@ -14672,7 -14669,6 +14671,6 @@@ F:   net/nfc
  NFC VIRTUAL NCI DEVICE DRIVER
  M:    Bongsu Jeon <bongsu.jeon@samsung.com>
  L:    netdev@vger.kernel.org
- L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Supported
  F:    drivers/nfc/virtual_ncidev.c
  F:    tools/testing/selftests/nci/
@@@ -14874,12 -14870,12 +14872,12 @@@ M:        Sagi Grimberg <sagi@grimberg.me
  L:    linux-nvme@lists.infradead.org
  S:    Supported
  W:    http://git.infradead.org/nvme.git
- T:    git://git.infradead.org/nvme.git
+ T:    git git://git.infradead.org/nvme.git
  F:    Documentation/nvme/
- F:    drivers/nvme/host/
  F:    drivers/nvme/common/
- F:    include/linux/nvme.h
+ F:    drivers/nvme/host/
  F:    include/linux/nvme-*.h
+ F:    include/linux/nvme.h
  F:    include/uapi/linux/nvme_ioctl.h
  
  NVM EXPRESS FABRICS AUTHENTICATION
@@@ -14914,7 -14910,7 +14912,7 @@@ M:   Chaitanya Kulkarni <kch@nvidia.com
  L:    linux-nvme@lists.infradead.org
  S:    Supported
  W:    http://git.infradead.org/nvme.git
- T:    git://git.infradead.org/nvme.git
+ T:    git git://git.infradead.org/nvme.git
  F:    drivers/nvme/target/
  
  NVMEM FRAMEWORK
@@@ -15044,7 -15040,6 +15042,6 @@@ F:   Documentation/devicetree/bindings/so
  F:    sound/soc/codecs/tfa989x.c
  
  NXP-NCI NFC DRIVER
- L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Orphan
  F:    Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
  F:    drivers/nfc/nxp-nci
@@@ -15081,7 -15076,7 +15078,7 @@@ F:   Documentation/hwmon/nzxt-smart2.rs
  F:    drivers/hwmon/nzxt-smart2.c
  
  OBJAGG
- M:    Jiri Pirko <jiri@nvidia.com>
+ M:    Jiri Pirko <jiri@resnulli.us>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    include/linux/objagg.h
@@@ -15855,7 -15850,7 +15852,7 @@@ F:   drivers/video/logo/logo_parisc
  F:    include/linux/hp_sdc.h
  
  PARMAN
- M:    Jiri Pirko <jiri@nvidia.com>
+ M:    Jiri Pirko <jiri@resnulli.us>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    include/linux/parman.h
@@@ -16393,6 -16388,7 +16390,7 @@@ R:   Alexander Shishkin <alexander.shishk
  R:    Jiri Olsa <jolsa@kernel.org>
  R:    Namhyung Kim <namhyung@kernel.org>
  R:    Ian Rogers <irogers@google.com>
+ R:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-perf-users@vger.kernel.org
  L:    linux-kernel@vger.kernel.org
  S:    Supported
@@@ -17991,7 -17987,7 +17989,7 @@@ F:   Documentation/devicetree/bindings/sp
  F:    Documentation/devicetree/bindings/usb/microchip,mpfs-musb.yaml
  F:    arch/riscv/boot/dts/microchip/
  F:    drivers/char/hw_random/mpfs-rng.c
- F:    drivers/clk/microchip/clk-mpfs.c
+ F:    drivers/clk/microchip/clk-mpfs*.c
  F:    drivers/i2c/busses/i2c-microchip-corei2c.c
  F:    drivers/mailbox/mailbox-mpfs.c
  F:    drivers/pci/controller/pcie-microchip-host.c
@@@ -18292,8 -18288,9 +18290,9 @@@ F:   drivers/s390/block/dasd
  F:    include/linux/dasd_mod.h
  
  S390 IOMMU (PCI)
+ M:    Niklas Schnelle <schnelle@linux.ibm.com>
  M:    Matthew Rosato <mjrosato@linux.ibm.com>
M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
R:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
  F:    drivers/iommu/s390-iommu.c
@@@ -18488,7 -18485,6 +18487,6 @@@ F:   include/media/drv-intf/s3c_camif.
  
  SAMSUNG S3FWRN5 NFC DRIVER
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
- L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
  F:    drivers/nfc/s3fwrn5
@@@ -18803,7 -18799,7 +18801,7 @@@ F:   include/uapi/linux/sed
  SECURITY CONTACT
  M:    Security Officers <security@kernel.org>
  S:    Supported
- F:    Documentation/admin-guide/security-bugs.rst
+ F:    Documentation/process/security-bugs.rst
  
  SECURITY SUBSYSTEM
  M:    Paul Moore <paul@paul-moore.com>
@@@ -19151,9 -19147,7 +19149,7 @@@ W:   http://www.brownhat.org/sis900.htm
  F:    drivers/net/ethernet/sis/sis900.*
  
  SIS FRAMEBUFFER DRIVER
- M:    Thomas Winischhofer <thomas@winischhofer.net>
- S:    Maintained
- W:    http://www.winischhofer.net/linuxsisvga.shtml
+ S:    Orphan
  F:    Documentation/fb/sisfb.rst
  F:    drivers/video/fbdev/sis/
  F:    include/video/sisfb.h
@@@ -19865,13 -19859,6 +19861,6 @@@ S:  Maintaine
  W:    http://wiki.laptop.org/go/DCON
  F:    drivers/staging/olpc_dcon/
  
- STAGING - REALTEK RTL8188EU DRIVERS
- M:    Larry Finger <Larry.Finger@lwfinger.net>
- M:    Phillip Potter <phil@philpotter.co.uk>
- R:    Pavel Skripkin <paskripkin@gmail.com>
- S:    Supported
- F:    drivers/staging/r8188eu/
  STAGING - REALTEK RTL8712U DRIVERS
  M:    Larry Finger <Larry.Finger@lwfinger.net>
  M:    Florian Schilhabel <florian.c.schilhabel@googlemail.com>.
@@@ -20655,7 -20642,6 +20644,6 @@@ F:   sound/soc/codecs/tscs*.
  TENSILICA XTENSA PORT (xtensa)
  M:    Chris Zankel <chris@zankel.net>
  M:    Max Filippov <jcmvbkbc@gmail.com>
- L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
  T:    git https://github.com/jcmvbkbc/linux-xtensa.git
  F:    arch/xtensa/
@@@ -20991,7 -20977,6 +20979,6 @@@ F:   drivers/iio/magnetometer/tmag5273.
  TI TRF7970A NFC DRIVER
  M:    Mark Greer <mgreer@animalcreek.com>
  L:    linux-wireless@vger.kernel.org
- L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Supported
  F:    Documentation/devicetree/bindings/net/nfc/ti,trf7970a.yaml
  F:    drivers/nfc/trf7970a.c
@@@ -21653,6 -21638,7 +21640,7 @@@ USB OVER IP DRIVE
  M:    Valentina Manea <valentina.manea.m@gmail.com>
  M:    Shuah Khan <shuah@kernel.org>
  M:    Shuah Khan <skhan@linuxfoundation.org>
+ R:    Hongren Zheng <i@zenithal.me>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
  F:    Documentation/usb/usbip_protocol.rst
@@@ -23047,7 -23033,6 +23035,6 @@@ F:   drivers/gpio/gpio-xra1403.
  
  XTENSA XTFPGA PLATFORM SUPPORT
  M:    Max Filippov <jcmvbkbc@gmail.com>
- L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
  F:    drivers/spi/spi-xtensa-xtfpga.c
  F:    sound/soc/xtensa/xtfpga-i2s.c
diff --combined block/genhd.c
@@@ -385,7 -385,7 +385,7 @@@ int disk_scan_partitions(struct gendis
        if (IS_ERR(bdev))
                ret =  PTR_ERR(bdev);
        else
-               blkdev_put(bdev, mode);
+               blkdev_put(bdev, mode & ~FMODE_EXCL);
  
        if (!(mode & FMODE_EXCL))
                bd_abort_claiming(disk->part0, disk_scan_partitions);
@@@ -466,10 -466,12 +466,10 @@@ int __must_check device_add_disk(struc
        if (ret)
                goto out_device_del;
  
 -      if (!sysfs_deprecated) {
 -              ret = sysfs_create_link(block_depr, &ddev->kobj,
 -                                      kobject_name(&ddev->kobj));
 -              if (ret)
 -                      goto out_device_del;
 -      }
 +      ret = sysfs_create_link(block_depr, &ddev->kobj,
 +                              kobject_name(&ddev->kobj));
 +      if (ret)
 +              goto out_device_del;
  
        /*
         * avoid probable deadlock caused by allocating memory with
@@@ -552,7 -554,8 +552,7 @@@ out_put_holder_dir
  out_del_integrity:
        blk_integrity_del(disk);
  out_del_block_link:
 -      if (!sysfs_deprecated)
 -              sysfs_remove_link(block_depr, dev_name(ddev));
 +      sysfs_remove_link(block_depr, dev_name(ddev));
  out_device_del:
        device_del(ddev);
  out_free_ext_minor:
@@@ -654,7 -657,8 +654,7 @@@ void del_gendisk(struct gendisk *disk
  
        part_stat_set_all(disk->part0, 0);
        disk->part0->bd_stamp = 0;
 -      if (!sysfs_deprecated)
 -              sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
 +      sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
        pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
        device_del(disk_to_dev(disk));
  
@@@ -899,6 -903,7 +899,6 @@@ static int __init genhd_device_init(voi
  {
        int error;
  
 -      block_class.dev_kobj = sysfs_dev_block_kobj;
        error = class_register(&block_class);
        if (unlikely(error))
                return error;
        register_blkdev(BLOCK_EXT_MAJOR, "blkext");
  
        /* create top-level block dir */
 -      if (!sysfs_deprecated)
 -              block_depr = kobject_create_and_add("block", NULL);
 +      block_depr = kobject_create_and_add("block", NULL);
        return 0;
  }
  
@@@ -381,6 -381,7 +381,7 @@@ static void pata_parport_dev_release(st
  {
        struct pi_adapter *pi = container_of(dev, struct pi_adapter, dev);
  
+       ida_free(&pata_parport_bus_dev_ids, dev->id);
        kfree(pi);
  }
  
@@@ -433,23 -434,27 +434,27 @@@ static struct pi_adapter *pi_init_one(s
        if (bus_for_each_dev(&pata_parport_bus_type, NULL, &match, pi_find_dev))
                return NULL;
  
+       id = ida_alloc(&pata_parport_bus_dev_ids, GFP_KERNEL);
+       if (id < 0)
+               return NULL;
        pi = kzalloc(sizeof(struct pi_adapter), GFP_KERNEL);
-       if (!pi)
+       if (!pi) {
+               ida_free(&pata_parport_bus_dev_ids, id);
                return NULL;
+       }
  
        /* set up pi->dev before pi_probe_unit() so it can use dev_printk() */
        pi->dev.parent = &pata_parport_bus;
        pi->dev.bus = &pata_parport_bus_type;
        pi->dev.driver = &pr->driver;
        pi->dev.release = pata_parport_dev_release;
-       id = ida_alloc(&pata_parport_bus_dev_ids, GFP_KERNEL);
-       if (id < 0)
-               return NULL; /* pata_parport_dev_release will do kfree(pi) */
        pi->dev.id = id;
        dev_set_name(&pi->dev, "pata_parport.%u", pi->dev.id);
        if (device_register(&pi->dev)) {
                put_device(&pi->dev);
-               goto out_ida_free;
+               /* pata_parport_dev_release will do ida_free(dev->id) and kfree(pi) */
+               return NULL;
        }
  
        pi->proto = pr;
        pi->port = parport->base;
  
        par_cb.private = pi;
-       pi->pardev = parport_register_dev_model(parport, DRV_NAME, &par_cb,
-                                               pi->dev.id);
+       pi->pardev = parport_register_dev_model(parport, DRV_NAME, &par_cb, id);
        if (!pi->pardev)
                goto out_module_put;
  
  
        pi_connect(pi);
        if (ata_host_activate(host, 0, NULL, 0, &pata_parport_sht))
-               goto out_unreg_parport;
+               goto out_disconnect;
  
        return pi;
  
- out_unreg_parport:
+ out_disconnect:
        pi_disconnect(pi);
+ out_unreg_parport:
        parport_unregister_device(pi->pardev);
        if (pi->proto->release_proto)
                pi->proto->release_proto(pi);
@@@ -500,8 -505,7 +505,7 @@@ out_module_put
        module_put(pi->proto->owner);
  out_unreg_dev:
        device_unregister(&pi->dev);
- out_ida_free:
-       ida_free(&pata_parport_bus_dev_ids, pi->dev.id);
+       /* pata_parport_dev_release will do ida_free(dev->id) and kfree(pi) */
        return NULL;
  }
  
@@@ -554,7 -558,8 +558,7 @@@ void pata_parport_unregister_driver(str
  }
  EXPORT_SYMBOL_GPL(pata_parport_unregister_driver);
  
 -static ssize_t new_device_store(struct bus_type *bus, const char *buf,
 -                              size_t count)
 +static ssize_t new_device_store(const struct bus_type *bus, const char *buf, size_t count)
  {
        char port[12] = "auto";
        char protocol[8] = "auto";
@@@ -625,11 -630,11 +629,10 @@@ static void pi_remove_one(struct devic
        pi_disconnect(pi);
        pi_release(pi);
        device_unregister(dev);
-       ida_free(&pata_parport_bus_dev_ids, dev->id);
-       /* pata_parport_dev_release will do kfree(pi) */
+       /* pata_parport_dev_release will do ida_free(dev->id) and kfree(pi) */
  }
  
 -static ssize_t delete_device_store(struct bus_type *bus, const char *buf,
 -                                 size_t count)
 +static ssize_t delete_device_store(const struct bus_type *bus, const char *buf, size_t count)
  {
        struct device *dev;
  
        }
  
        pi_remove_one(dev);
+       put_device(dev);
        mutex_unlock(&pi_mutex);
  
        return count;
diff --combined drivers/block/ublk_drv.c
@@@ -715,7 -715,8 +715,8 @@@ static void __ublk_fail_req(struct ublk
        }
  }
  
- static void ubq_complete_io_cmd(struct ublk_io *io, int res)
+ static void ubq_complete_io_cmd(struct ublk_io *io, int res,
+                               unsigned issue_flags)
  {
        /* mark this cmd owned by ublksrv */
        io->flags |= UBLK_IO_FLAG_OWNED_BY_SRV;
        io->flags &= ~UBLK_IO_FLAG_ACTIVE;
  
        /* tell ublksrv one io request is coming */
-       io_uring_cmd_done(io->cmd, res, 0);
+       io_uring_cmd_done(io->cmd, res, 0, issue_flags);
  }
  
  #define UBLK_REQUEUE_DELAY_MS 3
@@@ -744,7 -745,8 +745,8 @@@ static inline void __ublk_abort_rq(stru
        mod_delayed_work(system_wq, &ubq->dev->monitor_work, 0);
  }
  
- static inline void __ublk_rq_task_work(struct request *req)
+ static inline void __ublk_rq_task_work(struct request *req,
+                                      unsigned issue_flags)
  {
        struct ublk_queue *ubq = req->mq_hctx->driver_data;
        int tag = req->tag;
                        pr_devel("%s: need get data. op %d, qid %d tag %d io_flags %x\n",
                                        __func__, io->cmd->cmd_op, ubq->q_id,
                                        req->tag, io->flags);
-                       ubq_complete_io_cmd(io, UBLK_IO_RES_NEED_GET_DATA);
+                       ubq_complete_io_cmd(io, UBLK_IO_RES_NEED_GET_DATA, issue_flags);
                        return;
                }
                /*
                        mapped_bytes >> 9;
        }
  
-       ubq_complete_io_cmd(io, UBLK_IO_RES_OK);
+       ubq_complete_io_cmd(io, UBLK_IO_RES_OK, issue_flags);
  }
  
- static inline void ublk_forward_io_cmds(struct ublk_queue *ubq)
+ static inline void ublk_forward_io_cmds(struct ublk_queue *ubq,
+                                       unsigned issue_flags)
  {
        struct llist_node *io_cmds = llist_del_all(&ubq->io_cmds);
        struct ublk_rq_data *data, *tmp;
  
        io_cmds = llist_reverse_order(io_cmds);
        llist_for_each_entry_safe(data, tmp, io_cmds, node)
-               __ublk_rq_task_work(blk_mq_rq_from_pdu(data));
+               __ublk_rq_task_work(blk_mq_rq_from_pdu(data), issue_flags);
  }
  
  static inline void ublk_abort_io_cmds(struct ublk_queue *ubq)
                __ublk_abort_rq(ubq, blk_mq_rq_from_pdu(data));
  }
  
- static void ublk_rq_task_work_cb(struct io_uring_cmd *cmd)
+ static void ublk_rq_task_work_cb(struct io_uring_cmd *cmd, unsigned issue_flags)
  {
        struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
        struct ublk_queue *ubq = pdu->ubq;
  
-       ublk_forward_io_cmds(ubq);
+       ublk_forward_io_cmds(ubq, issue_flags);
  }
  
  static void ublk_rq_task_work_fn(struct callback_head *work)
                        struct ublk_rq_data, work);
        struct request *req = blk_mq_rq_from_pdu(data);
        struct ublk_queue *ubq = req->mq_hctx->driver_data;
+       unsigned issue_flags = IO_URING_F_UNLOCKED;
  
-       ublk_forward_io_cmds(ubq);
+       ublk_forward_io_cmds(ubq, issue_flags);
  }
  
  static void ublk_queue_cmd(struct ublk_queue *ubq, struct request *rq)
@@@ -1111,7 -1115,8 +1115,8 @@@ static void ublk_cancel_queue(struct ub
                struct ublk_io *io = &ubq->ios[i];
  
                if (io->flags & UBLK_IO_FLAG_ACTIVE)
-                       io_uring_cmd_done(io->cmd, UBLK_IO_RES_ABORT, 0);
+                       io_uring_cmd_done(io->cmd, UBLK_IO_RES_ABORT, 0,
+                                               IO_URING_F_UNLOCKED);
        }
  
        /* all io commands are canceled */
@@@ -1351,7 -1356,7 +1356,7 @@@ static int ublk_ch_uring_cmd(struct io_
        return -EIOCBQUEUED;
  
   out:
-       io_uring_cmd_done(cmd, ret, 0);
+       io_uring_cmd_done(cmd, ret, 0, issue_flags);
        pr_devel("%s: complete: cmd op %d, tag %d ret %x io_flags %x\n",
                        __func__, cmd_op, tag, ret, io->flags);
        return -EIOCBQUEUED;
@@@ -1602,17 -1607,18 +1607,18 @@@ static int ublk_ctrl_start_dev(struct u
                set_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
  
        get_device(&ub->cdev_dev);
+       ub->dev_info.state = UBLK_S_DEV_LIVE;
        ret = add_disk(disk);
        if (ret) {
                /*
                 * Has to drop the reference since ->free_disk won't be
                 * called in case of add_disk failure.
                 */
+               ub->dev_info.state = UBLK_S_DEV_DEAD;
                ublk_put_device(ub);
                goto out_put_disk;
        }
        set_bit(UB_STATE_USED, &ub->state);
-       ub->dev_info.state = UBLK_S_DEV_LIVE;
  out_put_disk:
        if (ret)
                put_disk(disk);
@@@ -2233,7 -2239,7 +2239,7 @@@ static int ublk_ctrl_uring_cmd(struct i
        if (ub)
                ublk_put_device(ub);
   out:
-       io_uring_cmd_done(cmd, ret, 0);
+       io_uring_cmd_done(cmd, ret, 0, issue_flags);
        pr_devel("%s: cmd done ret %d cmd_op %x, dev id %d qid %d\n",
                        __func__, ret, cmd->cmd_op, header->dev_id, header->queue_id);
        return -EIOCBQUEUED;
@@@ -2266,7 -2272,7 +2272,7 @@@ static int __init ublk_init(void
        if (ret)
                goto unregister_mis;
  
 -      ublk_chr_class = class_create(THIS_MODULE, "ublk-char");
 +      ublk_chr_class = class_create("ublk-char");
        if (IS_ERR(ublk_chr_class)) {
                ret = PTR_ERR(ublk_chr_class);
                goto free_chrdev_region;
@@@ -282,7 -282,7 +282,7 @@@ static void tpm_dev_release(struct devi
   *
   * Return: always 0 (i.e. success)
   */
 -static int tpm_class_shutdown(struct device *dev)
 +int tpm_class_shutdown(struct device *dev)
  {
        struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev);
  
@@@ -337,6 -337,7 +337,6 @@@ struct tpm_chip *tpm_chip_alloc(struct 
        device_initialize(&chip->dev);
  
        chip->dev.class = tpm_class;
 -      chip->dev.class->shutdown_pre = tpm_class_shutdown;
        chip->dev.release = tpm_dev_release;
        chip->dev.parent = pdev;
        chip->dev.groups = chip->groups;
@@@ -510,6 -511,63 +510,63 @@@ static int tpm_add_legacy_sysfs(struct 
        return 0;
  }
  
+ /*
+  * Some AMD fTPM versions may cause stutter
+  * https://www.amd.com/en/support/kb/faq/pa-410
+  *
+  * Fixes are available in two series of fTPM firmware:
+  * 6.x.y.z series: 6.0.18.6 +
+  * 3.x.y.z series: 3.57.y.5 +
+  */
+ static bool tpm_amd_is_rng_defective(struct tpm_chip *chip)
+ {
+       u32 val1, val2;
+       u64 version;
+       int ret;
+       if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
+               return false;
+       ret = tpm_request_locality(chip);
+       if (ret)
+               return false;
+       ret = tpm2_get_tpm_pt(chip, TPM2_PT_MANUFACTURER, &val1, NULL);
+       if (ret)
+               goto release;
+       if (val1 != 0x414D4400U /* AMD */) {
+               ret = -ENODEV;
+               goto release;
+       }
+       ret = tpm2_get_tpm_pt(chip, TPM2_PT_FIRMWARE_VERSION_1, &val1, NULL);
+       if (ret)
+               goto release;
+       ret = tpm2_get_tpm_pt(chip, TPM2_PT_FIRMWARE_VERSION_2, &val2, NULL);
+ release:
+       tpm_relinquish_locality(chip);
+       if (ret)
+               return false;
+       version = ((u64)val1 << 32) | val2;
+       if ((version >> 48) == 6) {
+               if (version >= 0x0006000000180006ULL)
+                       return false;
+       } else if ((version >> 48) == 3) {
+               if (version >= 0x0003005700000005ULL)
+                       return false;
+       } else {
+               return false;
+       }
+       dev_warn(&chip->dev,
+                "AMD fTPM version 0x%llx causes system stutter; hwrng disabled\n",
+                version);
+       return true;
+ }
  static int tpm_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
  {
        struct tpm_chip *chip = container_of(rng, struct tpm_chip, hwrng);
  
  static int tpm_add_hwrng(struct tpm_chip *chip)
  {
-       if (!IS_ENABLED(CONFIG_HW_RANDOM_TPM) || tpm_is_firmware_upgrade(chip))
+       if (!IS_ENABLED(CONFIG_HW_RANDOM_TPM) || tpm_is_firmware_upgrade(chip) ||
+           tpm_amd_is_rng_defective(chip))
                return 0;
  
        snprintf(chip->hwrng_name, sizeof(chip->hwrng_name),
diff --combined drivers/char/tpm/tpm.h
@@@ -150,6 -150,79 +150,79 @@@ enum tpm_sub_capabilities 
        TPM_CAP_PROP_TIS_DURATION = 0x120,
  };
  
+ enum tpm2_pt_props {
+       TPM2_PT_NONE = 0x00000000,
+       TPM2_PT_GROUP = 0x00000100,
+       TPM2_PT_FIXED = TPM2_PT_GROUP * 1,
+       TPM2_PT_FAMILY_INDICATOR = TPM2_PT_FIXED + 0,
+       TPM2_PT_LEVEL = TPM2_PT_FIXED + 1,
+       TPM2_PT_REVISION = TPM2_PT_FIXED + 2,
+       TPM2_PT_DAY_OF_YEAR = TPM2_PT_FIXED + 3,
+       TPM2_PT_YEAR = TPM2_PT_FIXED + 4,
+       TPM2_PT_MANUFACTURER = TPM2_PT_FIXED + 5,
+       TPM2_PT_VENDOR_STRING_1 = TPM2_PT_FIXED + 6,
+       TPM2_PT_VENDOR_STRING_2 = TPM2_PT_FIXED + 7,
+       TPM2_PT_VENDOR_STRING_3 = TPM2_PT_FIXED + 8,
+       TPM2_PT_VENDOR_STRING_4 = TPM2_PT_FIXED + 9,
+       TPM2_PT_VENDOR_TPM_TYPE = TPM2_PT_FIXED + 10,
+       TPM2_PT_FIRMWARE_VERSION_1 = TPM2_PT_FIXED + 11,
+       TPM2_PT_FIRMWARE_VERSION_2 = TPM2_PT_FIXED + 12,
+       TPM2_PT_INPUT_BUFFER = TPM2_PT_FIXED + 13,
+       TPM2_PT_HR_TRANSIENT_MIN = TPM2_PT_FIXED + 14,
+       TPM2_PT_HR_PERSISTENT_MIN = TPM2_PT_FIXED + 15,
+       TPM2_PT_HR_LOADED_MIN = TPM2_PT_FIXED + 16,
+       TPM2_PT_ACTIVE_SESSIONS_MAX = TPM2_PT_FIXED + 17,
+       TPM2_PT_PCR_COUNT = TPM2_PT_FIXED + 18,
+       TPM2_PT_PCR_SELECT_MIN = TPM2_PT_FIXED + 19,
+       TPM2_PT_CONTEXT_GAP_MAX = TPM2_PT_FIXED + 20,
+       TPM2_PT_NV_COUNTERS_MAX = TPM2_PT_FIXED + 22,
+       TPM2_PT_NV_INDEX_MAX = TPM2_PT_FIXED + 23,
+       TPM2_PT_MEMORY = TPM2_PT_FIXED + 24,
+       TPM2_PT_CLOCK_UPDATE = TPM2_PT_FIXED + 25,
+       TPM2_PT_CONTEXT_HASH = TPM2_PT_FIXED + 26,
+       TPM2_PT_CONTEXT_SYM = TPM2_PT_FIXED + 27,
+       TPM2_PT_CONTEXT_SYM_SIZE = TPM2_PT_FIXED + 28,
+       TPM2_PT_ORDERLY_COUNT = TPM2_PT_FIXED + 29,
+       TPM2_PT_MAX_COMMAND_SIZE = TPM2_PT_FIXED + 30,
+       TPM2_PT_MAX_RESPONSE_SIZE = TPM2_PT_FIXED + 31,
+       TPM2_PT_MAX_DIGEST = TPM2_PT_FIXED + 32,
+       TPM2_PT_MAX_OBJECT_CONTEXT = TPM2_PT_FIXED + 33,
+       TPM2_PT_MAX_SESSION_CONTEXT = TPM2_PT_FIXED + 34,
+       TPM2_PT_PS_FAMILY_INDICATOR = TPM2_PT_FIXED + 35,
+       TPM2_PT_PS_LEVEL = TPM2_PT_FIXED + 36,
+       TPM2_PT_PS_REVISION = TPM2_PT_FIXED + 37,
+       TPM2_PT_PS_DAY_OF_YEAR = TPM2_PT_FIXED + 38,
+       TPM2_PT_PS_YEAR = TPM2_PT_FIXED + 39,
+       TPM2_PT_SPLIT_MAX = TPM2_PT_FIXED + 40,
+       TPM2_PT_TOTAL_COMMANDS = TPM2_PT_FIXED + 41,
+       TPM2_PT_LIBRARY_COMMANDS = TPM2_PT_FIXED + 42,
+       TPM2_PT_VENDOR_COMMANDS = TPM2_PT_FIXED + 43,
+       TPM2_PT_NV_BUFFER_MAX = TPM2_PT_FIXED + 44,
+       TPM2_PT_MODES = TPM2_PT_FIXED + 45,
+       TPM2_PT_MAX_CAP_BUFFER = TPM2_PT_FIXED + 46,
+       TPM2_PT_VAR = TPM2_PT_GROUP * 2,
+       TPM2_PT_PERMANENT = TPM2_PT_VAR + 0,
+       TPM2_PT_STARTUP_CLEAR = TPM2_PT_VAR + 1,
+       TPM2_PT_HR_NV_INDEX = TPM2_PT_VAR + 2,
+       TPM2_PT_HR_LOADED = TPM2_PT_VAR + 3,
+       TPM2_PT_HR_LOADED_AVAIL = TPM2_PT_VAR + 4,
+       TPM2_PT_HR_ACTIVE = TPM2_PT_VAR + 5,
+       TPM2_PT_HR_ACTIVE_AVAIL = TPM2_PT_VAR + 6,
+       TPM2_PT_HR_TRANSIENT_AVAIL = TPM2_PT_VAR + 7,
+       TPM2_PT_HR_PERSISTENT = TPM2_PT_VAR + 8,
+       TPM2_PT_HR_PERSISTENT_AVAIL = TPM2_PT_VAR + 9,
+       TPM2_PT_NV_COUNTERS = TPM2_PT_VAR + 10,
+       TPM2_PT_NV_COUNTERS_AVAIL = TPM2_PT_VAR + 11,
+       TPM2_PT_ALGORITHM_SET = TPM2_PT_VAR + 12,
+       TPM2_PT_LOADED_CURVES = TPM2_PT_VAR + 13,
+       TPM2_PT_LOCKOUT_COUNTER = TPM2_PT_VAR + 14,
+       TPM2_PT_MAX_AUTH_FAIL = TPM2_PT_VAR + 15,
+       TPM2_PT_LOCKOUT_INTERVAL = TPM2_PT_VAR + 16,
+       TPM2_PT_LOCKOUT_RECOVERY = TPM2_PT_VAR + 17,
+       TPM2_PT_NV_WRITE_RECOVERY = TPM2_PT_VAR + 18,
+       TPM2_PT_AUDIT_COUNTER_0 = TPM2_PT_VAR + 19,
+       TPM2_PT_AUDIT_COUNTER_1 = TPM2_PT_VAR + 20,
+ };
  
  /* 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - 18
   * bytes, but 128 is still a relatively large number of random bytes and
@@@ -183,7 -256,6 +256,7 @@@ int tpm1_get_pcr_allocation(struct tpm_
  unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
  int tpm_pm_suspend(struct device *dev);
  int tpm_pm_resume(struct device *dev);
 +int tpm_class_shutdown(struct device *dev);
  
  static inline void tpm_msleep(unsigned int delay_msec)
  {
@@@ -93,7 -93,7 +93,7 @@@ int kfd_chardev_init(void
        if (err < 0)
                goto err_register_chrdev;
  
 -      kfd_class = class_create(THIS_MODULE, kfd_dev_name);
 +      kfd_class = class_create(kfd_dev_name);
        err = PTR_ERR(kfd_class);
        if (IS_ERR(kfd_class))
                goto err_class_create;
@@@ -1312,14 -1312,14 +1312,14 @@@ static int kfd_ioctl_map_memory_to_gpu(
                args->n_success = i+1;
        }
  
-       mutex_unlock(&p->mutex);
        err = amdgpu_amdkfd_gpuvm_sync_memory(dev->adev, (struct kgd_mem *) mem, true);
        if (err) {
                pr_debug("Sync memory failed, wait interrupted by user signal\n");
                goto sync_memory_failed;
        }
  
+       mutex_unlock(&p->mutex);
        /* Flush TLBs after waiting for the page table updates to complete */
        for (i = 0; i < args->n_devices; i++) {
                peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]);
@@@ -1335,9 -1335,9 +1335,9 @@@ get_process_device_data_failed
  bind_process_to_device_failed:
  get_mem_obj_from_handle_failed:
  map_memory_to_gpu_failed:
+ sync_memory_failed:
        mutex_unlock(&p->mutex);
  copy_from_user_failed:
- sync_memory_failed:
        kfree(devices_arr);
  
        return err;
@@@ -1351,6 -1351,7 +1351,7 @@@ static int kfd_ioctl_unmap_memory_from_
        void *mem;
        long err = 0;
        uint32_t *devices_arr = NULL, i;
+       bool flush_tlb;
  
        if (!args->n_devices) {
                pr_debug("Device IDs array empty\n");
                }
                args->n_success = i+1;
        }
-       mutex_unlock(&p->mutex);
  
-       if (kfd_flush_tlb_after_unmap(pdd->dev)) {
+       flush_tlb = kfd_flush_tlb_after_unmap(pdd->dev);
+       if (flush_tlb) {
                err = amdgpu_amdkfd_gpuvm_sync_memory(pdd->dev->adev,
                                (struct kgd_mem *) mem, true);
                if (err) {
                        pr_debug("Sync memory failed, wait interrupted by user signal\n");
                        goto sync_memory_failed;
                }
+       }
+       mutex_unlock(&p->mutex);
  
+       if (flush_tlb) {
                /* Flush TLBs after waiting for the page table updates to complete */
                for (i = 0; i < args->n_devices; i++) {
                        peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]);
  bind_process_to_device_failed:
  get_mem_obj_from_handle_failed:
  unmap_memory_from_gpu_failed:
+ sync_memory_failed:
        mutex_unlock(&p->mutex);
  copy_from_user_failed:
- sync_memory_failed:
        kfree(devices_arr);
        return err;
  }
diff --combined drivers/hwmon/hwmon.c
@@@ -138,6 -138,7 +138,6 @@@ static void hwmon_dev_release(struct de
  
  static struct class hwmon_class = {
        .name = "hwmon",
 -      .owner = THIS_MODULE,
        .dev_groups = hwmon_dev_attr_groups,
        .dev_release = hwmon_dev_release,
  };
@@@ -756,6 -757,7 +756,7 @@@ __hwmon_device_register(struct device *
        struct hwmon_device *hwdev;
        const char *label;
        struct device *hdev;
+       struct device *tdev = dev;
        int i, err, id;
  
        /* Complain about invalid characters in hwmon name attribute */
        hwdev->name = name;
        hdev->class = &hwmon_class;
        hdev->parent = dev;
-       hdev->of_node = dev ? dev->of_node : NULL;
+       while (tdev && !tdev->of_node)
+               tdev = tdev->parent;
+       hdev->of_node = tdev ? tdev->of_node : NULL;
        hwdev->chip = chip;
        dev_set_drvdata(hdev, drvdata);
        dev_set_name(hdev, HWMON_ID_FORMAT, id);
  
        INIT_LIST_HEAD(&hwdev->tzdata);
  
-       if (dev && dev->of_node && chip && chip->ops->read &&
+       if (hdev->of_node && chip && chip->ops->read &&
            chip->info[0]->type == hwmon_chip &&
            (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
                err = hwmon_thermal_register_sensors(hdev);
diff --combined drivers/i2c/i2c-dev.c
@@@ -646,7 -646,7 +646,7 @@@ static void i2cdev_dev_release(struct d
        kfree(i2c_dev);
  }
  
- static int i2cdev_attach_adapter(struct device *dev, void *dummy)
+ static int i2cdev_attach_adapter(struct device *dev)
  {
        struct i2c_adapter *adap;
        struct i2c_dev *i2c_dev;
@@@ -685,7 -685,7 +685,7 @@@ err_put_i2c_dev
        return NOTIFY_DONE;
  }
  
- static int i2cdev_detach_adapter(struct device *dev, void *dummy)
+ static int i2cdev_detach_adapter(struct device *dev)
  {
        struct i2c_adapter *adap;
        struct i2c_dev *i2c_dev;
@@@ -711,9 -711,9 +711,9 @@@ static int i2cdev_notifier_call(struct 
  
        switch (action) {
        case BUS_NOTIFY_ADD_DEVICE:
-               return i2cdev_attach_adapter(dev, NULL);
+               return i2cdev_attach_adapter(dev);
        case BUS_NOTIFY_DEL_DEVICE:
-               return i2cdev_detach_adapter(dev, NULL);
+               return i2cdev_detach_adapter(dev);
        }
  
        return NOTIFY_DONE;
@@@ -725,6 -725,18 +725,18 @@@ static struct notifier_block i2cdev_not
  
  /* ------------------------------------------------------------------------- */
  
+ static int __init i2c_dev_attach_adapter(struct device *dev, void *dummy)
+ {
+       i2cdev_attach_adapter(dev);
+       return 0;
+ }
+ static int __exit i2c_dev_detach_adapter(struct device *dev, void *dummy)
+ {
+       i2cdev_detach_adapter(dev);
+       return 0;
+ }
  /*
   * module load/unload record keeping
   */
@@@ -739,7 -751,7 +751,7 @@@ static int __init i2c_dev_init(void
        if (res)
                goto out;
  
 -      i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");
 +      i2c_dev_class = class_create("i2c-dev");
        if (IS_ERR(i2c_dev_class)) {
                res = PTR_ERR(i2c_dev_class);
                goto out_unreg_chrdev;
                goto out_unreg_class;
  
        /* Bind to already existing adapters right away */
-       i2c_for_each_dev(NULL, i2cdev_attach_adapter);
+       i2c_for_each_dev(NULL, i2c_dev_attach_adapter);
  
        return 0;
  
@@@ -768,7 -780,7 +780,7 @@@ out
  static void __exit i2c_dev_exit(void)
  {
        bus_unregister_notifier(&i2c_bus_type, &i2cdev_notifier);
-       i2c_for_each_dev(NULL, i2cdev_detach_adapter);
+       i2c_for_each_dev(NULL, i2c_dev_detach_adapter);
        class_destroy(i2c_dev_class);
        unregister_chrdev_region(MKDEV(I2C_MAJOR, 0), I2C_MINORS);
  }
diff --combined drivers/nvme/host/core.c
@@@ -781,16 -781,26 +781,26 @@@ static blk_status_t nvme_setup_discard(
                range = page_address(ns->ctrl->discard_page);
        }
  
-       __rq_for_each_bio(bio, req) {
-               u64 slba = nvme_sect_to_lba(ns, bio->bi_iter.bi_sector);
-               u32 nlb = bio->bi_iter.bi_size >> ns->lba_shift;
-               if (n < segments) {
-                       range[n].cattr = cpu_to_le32(0);
-                       range[n].nlb = cpu_to_le32(nlb);
-                       range[n].slba = cpu_to_le64(slba);
+       if (queue_max_discard_segments(req->q) == 1) {
+               u64 slba = nvme_sect_to_lba(ns, blk_rq_pos(req));
+               u32 nlb = blk_rq_sectors(req) >> (ns->lba_shift - 9);
+               range[0].cattr = cpu_to_le32(0);
+               range[0].nlb = cpu_to_le32(nlb);
+               range[0].slba = cpu_to_le64(slba);
+               n = 1;
+       } else {
+               __rq_for_each_bio(bio, req) {
+                       u64 slba = nvme_sect_to_lba(ns, bio->bi_iter.bi_sector);
+                       u32 nlb = bio->bi_iter.bi_size >> ns->lba_shift;
+                       if (n < segments) {
+                               range[n].cattr = cpu_to_le32(0);
+                               range[n].nlb = cpu_to_le32(nlb);
+                               range[n].slba = cpu_to_le64(slba);
+                       }
+                       n++;
                }
-               n++;
        }
  
        if (WARN_ON_ONCE(n != segments)) {
@@@ -3053,7 -3063,8 +3063,8 @@@ static int nvme_init_non_mdts_limits(st
        else
                ctrl->max_zeroes_sectors = 0;
  
-       if (nvme_ctrl_limited_cns(ctrl))
+       if (ctrl->subsys->subtype != NVME_NQN_NVME ||
+           nvme_ctrl_limited_cns(ctrl))
                return 0;
  
        id = kzalloc(sizeof(*id), GFP_KERNEL);
@@@ -5381,14 -5392,14 +5392,14 @@@ static int __init nvme_core_init(void
        if (result < 0)
                goto destroy_delete_wq;
  
 -      nvme_class = class_create(THIS_MODULE, "nvme");
 +      nvme_class = class_create("nvme");
        if (IS_ERR(nvme_class)) {
                result = PTR_ERR(nvme_class);
                goto unregister_chrdev;
        }
        nvme_class->dev_uevent = nvme_class_uevent;
  
 -      nvme_subsys_class = class_create(THIS_MODULE, "nvme-subsystem");
 +      nvme_subsys_class = class_create("nvme-subsystem");
        if (IS_ERR(nvme_subsys_class)) {
                result = PTR_ERR(nvme_subsys_class);
                goto destroy_class;
        if (result < 0)
                goto destroy_subsys_class;
  
 -      nvme_ns_chr_class = class_create(THIS_MODULE, "nvme-generic");
 +      nvme_ns_chr_class = class_create("nvme-generic");
        if (IS_ERR(nvme_ns_chr_class)) {
                result = PTR_ERR(nvme_ns_chr_class);
                goto unregister_generic_ns;
diff --combined drivers/scsi/sd.c
@@@ -587,6 -587,7 +587,6 @@@ ATTRIBUTE_GROUPS(sd_disk)
  
  static struct class sd_disk_class = {
        .name           = "scsi_disk",
 -      .owner          = THIS_MODULE,
        .dev_release    = scsi_disk_release,
        .dev_groups     = sd_disk_groups,
  };
@@@ -2987,8 -2988,13 +2987,13 @@@ static void sd_read_block_characteristi
        }
  
        if (sdkp->device->type == TYPE_ZBC) {
-               /* Host-managed */
+               /*
+                * Host-managed: Per ZBC and ZAC specifications, writes in
+                * sequential write required zones of host-managed devices must
+                * be aligned to the device physical block size.
+                */
                disk_set_zoned(sdkp->disk, BLK_ZONED_HM);
+               blk_queue_zone_write_granularity(q, sdkp->physical_block_size);
        } else {
                sdkp->zoned = zoned;
                if (sdkp->zoned == 1) {
@@@ -126,6 -126,7 +126,6 @@@ static int qcom_rmtfs_mem_release(struc
  }
  
  static struct class rmtfs_class = {
 -      .owner          = THIS_MODULE,
        .name           = "rmtfs",
  };
  
@@@ -175,7 -176,8 +175,8 @@@ static int qcom_rmtfs_mem_probe(struct 
        struct reserved_mem *rmem;
        struct qcom_rmtfs_mem *rmtfs_mem;
        u32 client_id;
-       u32 num_vmids, vmid[NUM_MAX_VMIDS];
+       u32 vmid[NUM_MAX_VMIDS];
+       int num_vmids;
        int ret, i;
  
        rmem = of_reserved_mem_lookup(node);
        }
  
        num_vmids = of_property_count_u32_elems(node, "qcom,vmid");
-       if (num_vmids < 0) {
-               dev_err(&pdev->dev, "failed to count qcom,vmid elements: %d\n", ret);
+       if (num_vmids == -EINVAL) {
+               /* qcom,vmid is optional */
+               num_vmids = 0;
+       } else if (num_vmids < 0) {
+               dev_err(&pdev->dev, "failed to count qcom,vmid elements: %d\n", num_vmids);
                goto remove_cdev;
        } else if (num_vmids > NUM_MAX_VMIDS) {
                dev_warn(&pdev->dev,
diff --combined drivers/tty/vt/vt.c
@@@ -4241,7 -4241,7 +4241,7 @@@ static int __init vtconsole_class_init(
  {
        int i;
  
 -      vtconsole_class = class_create(THIS_MODULE, "vtconsole");
 +      vtconsole_class = class_create("vtconsole");
        if (IS_ERR(vtconsole_class)) {
                pr_warn("Unable to create vt console class; errno = %ld\n",
                        PTR_ERR(vtconsole_class));
@@@ -4545,6 -4545,9 +4545,9 @@@ static int con_font_get(struct vc_data 
        int c;
        unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
  
+       if (vpitch > max_font_height)
+               return -EINVAL;
        if (op->data) {
                font.data = kvmalloc(max_font_size, GFP_KERNEL);
                if (!font.data)
diff --combined drivers/vhost/vdpa.c
@@@ -1140,7 -1140,7 +1140,7 @@@ static int vhost_vdpa_alloc_domain(stru
        struct vdpa_device *vdpa = v->vdpa;
        const struct vdpa_config_ops *ops = vdpa->config;
        struct device *dma_dev = vdpa_get_dma_dev(vdpa);
 -      struct bus_type *bus;
 +      const struct bus_type *bus;
        int ret;
  
        /* Device want to do DMA by itself */
  
  err_attach:
        iommu_domain_free(v->domain);
+       v->domain = NULL;
        return ret;
  }
  
@@@ -1213,6 -1214,7 +1214,7 @@@ static void vhost_vdpa_cleanup(struct v
                        vhost_vdpa_remove_as(v, asid);
        }
  
+       vhost_vdpa_free_domain(v);
        vhost_dev_cleanup(&v->vdev);
        kfree(v->vdev.vqs);
  }
@@@ -1285,7 -1287,6 +1287,6 @@@ static int vhost_vdpa_release(struct in
        vhost_vdpa_clean_irq(v);
        vhost_vdpa_reset(v);
        vhost_dev_stop(&v->vdev);
-       vhost_vdpa_free_domain(v);
        vhost_vdpa_config_put(v);
        vhost_vdpa_cleanup(v);
        mutex_unlock(&d->mutex);