Skip to content
  1. Mar 17, 2023
    • Bart Van Assche's avatar
      scsi: core: Remove the /proc/scsi/${proc_name} directory earlier · 17e98a5e
      Bart Van Assche authored
      [ Upstream commit fc663711 ]
      
      Remove the /proc/scsi/${proc_name} directory earlier to fix a race
      condition between unloading and reloading kernel modules. This fixes a bug
      introduced in 2009 by commit 77c01976 ("[SCSI] fix /proc memory leak in
      the SCSI core").
      
      Fix the following kernel warning:
      
      proc_dir_entry 'scsi/scsi_debug' already registered
      WARNING: CPU: 19 PID: 27986 at fs/proc/generic.c:376 proc_register+0x27d/0x2e0
      Call Trace:
       proc_mkdir+0xb5/0xe0
       scsi_proc_hostdir_add+0xb5/0x170
       scsi_host_alloc+0x683/0x6c0
       sdebug_driver_probe+0x6b/0x2d0 [scsi_debug]
       really_probe+0x159/0x540
       __driver_probe_device+0xdc/0x230
       driver_probe_device+0x4f/0x120
       __device_attach_driver+0xef/0x180
       bus_for_each_drv+0xe5/0x130
       __device_attach+0x127/0x290
       device_initial_probe+0x17/0x20
       bus_probe_device+0x110/0x130
       device_add+0x673/0xc80
       device_register+0x1e/0x30
       sdebug_add_host_helper+0x1a7/0x3b0 [scsi_debug]
       scsi_debug_init+0x64f/0x1000 [scsi_debug]
       do_one_initcall+0xd7/0x470
       do_init_module+0xe7/0x330
       load_module+0x122a/0x12c0
       __do_sys_finit_module+0x124/0x1a0
       __x64_sys_finit_module+0x46/0x50
       do_syscall_64+0x38/0x80
       entry_SYSCALL_64_after_hwframe+0x46/0xb0
      
      Link: https://lore.kernel.org/r/20230210205200.36973-3-bvanassche@acm.org
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: Yi Zhang <yi.zhang@redhat.com>
      Cc: stable@vger.kernel.org
      Fixes: 77c01976
      
       ("[SCSI] fix /proc memory leak in the SCSI core")
      Reported-by: default avatarYi Zhang <yi.zhang@redhat.com>
      Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      17e98a5e
    • Liao Chang's avatar
      riscv: Add header include guards to insn.h · 0d14555f
      Liao Chang authored
      [ Upstream commit 8ac6e619 ]
      
      Add header include guards to insn.h to prevent repeating declaration of
      any identifiers in insn.h.
      
      Fixes: edde5584
      
       ("riscv: Add SW single-step support for KDB")
      Signed-off-by: default avatarLiao Chang <liaochang1@huawei.com>
      Reviewed-by: default avatarAndrew Jones <ajones@ventanamicro.com>
      Fixes: c9c1af3f
      
       ("RISC-V: rename parse_asm.h to insn.h")
      Reviewed-by: default avatarConor Dooley <conor.dooley@microchip.com>
      Link: https://lore.kernel.org/r/20230129094242.282620-1-liaochang1@huawei.com
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      0d14555f
    • Yu Kuai's avatar
      block: fix scan partition for exclusively open device again · 82f713e8
      Yu Kuai authored
      [ Upstream commit e5cfefa9 ]
      
      As explained in commit 36369f46 ("block: Do not reread partition table
      on exclusively open device"), reread partition on the device that is
      exclusively opened by someone else is problematic.
      
      This patch will make sure partition scan will only be proceed if current
      thread open the device exclusively, or the device is not opened
      exclusively, and in the later case, other scanners and exclusive openers
      will be blocked temporarily until partition scan is done.
      
      Fixes: 10c70d95
      
       ("block: remove the bd_openers checks in blk_drop_partitions")
      Cc: <stable@vger.kernel.org>
      Suggested-by: default avatarJan Kara <jack@suse.cz>
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Link: https://lore.kernel.org/r/20230217022200.3092987-3-yukuai1@huaweicloud.com
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      82f713e8
    • Yu Kuai's avatar
      block: Revert "block: Do not reread partition table on exclusively open device" · 573e58f5
      Yu Kuai authored
      [ Upstream commit 0f77b29a ]
      
      This reverts commit 36369f46
      
      .
      
      This patch can't fix the problem in a corner case that device can be
      opened exclusively after the checking and before blkdev_get_by_dev().
      We'll use a new solution to fix the problem in the next patch, and
      the new solution doesn't need to change apis.
      
      Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
      Acked-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20230217022200.3092987-2-yukuai1@huaweicloud.com
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Stable-dep-of: e5cfefa9
      
       ("block: fix scan partition for exclusively open device again")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      573e58f5
    • Ville Syrjälä's avatar
      drm/i915: Populate encoder->devdata for DSI on icl+ · 783c225e
      Ville Syrjälä authored
      [ Upstream commit 14e591a1
      
       ]
      
      We now have some eDP+DSI dual panel systems floating around
      where the DSI panel is the secondary LFP and thus needs to
      consult "panel type 2" in VBT in order to locate all the
      other panel type dependant stuff correctly.
      
      To that end we need to pass in the devdata to
      intel_bios_init_panel_late(), otherwise it'll just assume
      we want the primary panel type. So let's try to just populate
      the vbt.ports[] stuff and encoder->devdata for icl+ DSI
      panels as well.
      
      We can't do this on older platforms as there we risk a DSI
      port aliasing with a HDMI/DP port, which is a totally legal
      thing as the DSI ports live in their own little parallel
      universe.
      
      Cc: stable@vger.kernel.org
      Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/8016
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20230207064337.18697-3-ville.syrjala@linux.intel.com
      Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
      (cherry picked from commit ba00eb6a
      
      )
      Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      783c225e
    • Ville Syrjälä's avatar
      drm/i915: Do panel VBT init early if the VBT declares an explicit panel type · bd61a84b
      Ville Syrjälä authored
      [ Upstream commit 3f9ffce5
      
       ]
      
      Lots of ADL machines out there with bogus VBTs that declare
      two eDP child devices. In order for those to work we need to
      figure out which power sequencer to use before we try the EDID
      read. So let's do the panel VBT init early if we can, falling
      back to the post-EDID init otherwise.
      
      The post-EDID init panel_type=0xff approach of assuming the
      power sequencer should already be enabled doesn't really work
      with multiple eDP panels, and currently we just end up using
      the same power sequencer for both eDP ports, which at least
      confuses the wakeref tracking, and potentially also causes us
      to toggle the VDD for the panel when we should not.
      
      Cc: Animesh Manna <animesh.manna@intel.com>
      Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20221125173156.31689-3-ville.syrjala@linux.intel.com
      Stable-dep-of: 14e591a1
      
       ("drm/i915: Populate encoder->devdata for DSI on icl+")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      bd61a84b
    • Ville Syrjälä's avatar
      drm/i915: Introduce intel_panel_init_alloc() · e340197a
      Ville Syrjälä authored
      [ Upstream commit f70f8153
      
       ]
      
      Introduce a place where we can initialize connector->panel
      after it's been allocated. We already have a intel_panel_init()
      so had to get creative with the name and came up with
      intel_panel_init_alloc().
      
      Cc: Animesh Manna <animesh.manna@intel.com>
      Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20221125173156.31689-2-ville.syrjala@linux.intel.com
      Stable-dep-of: 14e591a1
      
       ("drm/i915: Populate encoder->devdata for DSI on icl+")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e340197a
    • Mika Westerberg's avatar
      spi: intel: Check number of chip selects after reading the descriptor · 87228e1c
      Mika Westerberg authored
      [ Upstream commit 574fbb95
      
       ]
      
      The flash decriptor contains the number of flash components that we use
      to figure out how many flash chips there are connected. Therefore we
      need to read it first before deciding how many chip selects the
      controller has.
      
      Reported-by: default avatarMarcin Witkowski <marcin.witkowski@intel.com>
      Fixes: 3f03c618
      
       ("spi: intel: Add support for second flash chip")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
      Link: https://lore.kernel.org/r/20230215110040.42186-1-mika.westerberg@linux.intel.com
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      87228e1c
    • Corey Minyard's avatar
      ipmi:ssif: Add a timer between request retries · 9858e0fb
      Corey Minyard authored
      [ Upstream commit 00bb7e76
      
       ]
      
      The IPMI spec has a time (T6) specified between request retries.  Add
      the handling for that.
      
      Reported by: Tony Camuso <tcamuso@redhat.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9858e0fb
    • Corey Minyard's avatar
      ipmi:ssif: Increase the message retry time · 8a676b6e
      Corey Minyard authored
      [ Upstream commit 39721d62
      
       ]
      
      The spec states that the minimum message retry time is 60ms, but it was
      set to 20ms.  Correct it.
      
      Reported by: Tony Camuso <tcamuso@redhat.com>
      Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
      Stable-dep-of: 00bb7e76
      
       ("ipmi:ssif: Add a timer between request retries")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8a676b6e
    • Corey Minyard's avatar
      ipmi:ssif: Remove rtc_us_timer · f12869ff
      Corey Minyard authored
      [ Upstream commit 9e8b8992
      
       ]
      
      It was cruft left over from older handling of run to completion.
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f12869ff
    • Dmitry Torokhov's avatar
      Input: exc3000 - properly stop timer on shutdown · 526a177a
      Dmitry Torokhov authored
      [ Upstream commit 79c81d13 ]
      
      We need to stop the timer on driver unbind or probe failures, otherwise
      we get UAF/Oops.
      
      Fixes: 7e577a17
      
       ("Input: add I2C attached EETI EXC3000 multi touch driver")
      Reported-by: default avatar"Stahl, Michael" <mstahl@moba.de>
      Link: https://lore.kernel.org/r/Y9dK57BFqtlf8NmN@google.com
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      526a177a
    • Manivannan Sadhasivam's avatar
      bus: mhi: ep: Change state_lock to mutex · 86e9eb69
      Manivannan Sadhasivam authored
      [ Upstream commit 1ddc7618 ]
      
      state_lock, the spinlock type is meant to protect race against concurrent
      MHI state transitions. In mhi_ep_set_m0_state(), while the state_lock is
      being held, the channels are resumed in mhi_ep_resume_channels() if the
      previous state was M3. This causes sleeping in atomic bug, since
      mhi_ep_resume_channels() use mutex internally.
      
      Since the state_lock is supposed to be held throughout the state change,
      it is not ideal to drop the lock before calling mhi_ep_resume_channels().
      So to fix this issue, let's change the type of state_lock to mutex. This
      would also allow holding the lock throughout all state transitions thereby
      avoiding any potential race.
      
      Cc: <stable@vger.kernel.org> # 5.19
      Fixes: e4b7b5f0
      
       ("bus: mhi: ep: Add support for suspending and resuming channels")
      Reported-by: default avatarDan Carpenter <error27@gmail.com>
      Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
      Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      86e9eb69
    • Manivannan Sadhasivam's avatar
      bus: mhi: ep: Power up/down MHI stack during MHI RESET · b6dc68ac
      Manivannan Sadhasivam authored
      [ Upstream commit 47a1dcae
      
       ]
      
      During graceful shutdown scenario, host will issue MHI RESET to the
      endpoint device before initiating shutdown. In that case, it makes sense
      to completely power down the MHI stack as sooner or later the access to
      MMIO registers will be prohibited. Also, the stack needs to be powered
      up in the case of SYS_ERR to recover the device.
      
      Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
      Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
      Link: https://lore.kernel.org/r/20221228161704.255268-2-manivannan.sadhasivam@linaro.org
      Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
      Stable-dep-of: 1ddc7618
      
       ("bus: mhi: ep: Change state_lock to mutex")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b6dc68ac
    • Jan Kara's avatar
      udf: Fix off-by-one error when discarding preallocation · 9ee18ff0
      Jan Kara authored
      [ Upstream commit f54aa97f ]
      
      The condition determining whether the preallocation can be used had
      an off-by-one error so we didn't discard preallocation when new
      allocation was just following it. This can then confuse code in
      inode_getblk().
      
      CC: stable@vger.kernel.org
      Fixes: 16d05565
      
       ("udf: Discard preallocation before extending file with a hole")
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9ee18ff0
    • Alexander Aring's avatar
      fs: dlm: fix race setting stop tx flag · a926daa8
      Alexander Aring authored
      [ Upstream commit 16427211 ]
      
      This patch sets the stop tx flag before we commit the dlm message.
      This flag will report about unexpected transmissions after we
      send the DLM_FIN message out, which should be the last message sent.
      When we commit the dlm fin message, it could be that we already
      got an ack back and the CLOSED state change already happened.
      We should not set this flag when we are in CLOSED state. To avoid this
      race we simply set the tx flag before the state change can be in
      progress by moving it before dlm_midcomms_commit_mhandle().
      
      Cc: stable@vger.kernel.org
      Fixes: 489d8e55
      
       ("fs: dlm: add reliable connection if reconnect")
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a926daa8
    • Alexander Aring's avatar
      fs: dlm: be sure to call dlm_send_queue_flush() · 3c1bc8de
      Alexander Aring authored
      [ Upstream commit 7354fa4e ]
      
      If we release a midcomms node structure, there should be nothing left
      inside the dlm midcomms send queue. However, sometimes this is not true
      because I believe some DLM_FIN message was not acked... if we run
      into a shutdown timeout, then we should be sure there is no pending send
      dlm message inside this queue when releasing midcomms node structure.
      
      Cc: stable@vger.kernel.org
      Fixes: 489d8e55
      
       ("fs: dlm: add reliable connection if reconnect")
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3c1bc8de
    • Alexander Aring's avatar
      fs: dlm: use WARN_ON_ONCE() instead of WARN_ON() · 29682b8a
      Alexander Aring authored
      [ Upstream commit 775af207
      
       ]
      
      To not get the console spammed about WARN_ON() of invalid states in the
      dlm midcomms hot path handling we switch to WARN_ON_ONCE() to get it
      only once that there might be an issue with the midcomms state handling.
      
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Stable-dep-of: 7354fa4e
      
       ("fs: dlm: be sure to call dlm_send_queue_flush()")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      29682b8a
    • Alexander Aring's avatar
      fs: dlm: fix use after free in midcomms commit · a3b0e9ac
      Alexander Aring authored
      [ Upstream commit 724b6bab ]
      
      While working on processing dlm message in softirq context I experienced
      the following KASAN use-after-free warning:
      
      [  151.760477] ==================================================================
      [  151.761803] BUG: KASAN: use-after-free in dlm_midcomms_commit_mhandle+0x19d/0x4b0
      [  151.763414] Read of size 4 at addr ffff88811a980c60 by task lock_torture/1347
      
      [  151.765284] CPU: 7 PID: 1347 Comm: lock_torture Not tainted 6.1.0-rc4+ #2828
      [  151.766778] Hardware name: Red Hat KVM/RHEL-AV, BIOS 1.16.0-3.module+el8.7.0+16134+e5908aa2 04/01/2014
      [  151.768726] Call Trace:
      [  151.769277]  <TASK>
      [  151.769748]  dump_stack_lvl+0x5b/0x86
      [  151.770556]  print_report+0x180/0x4c8
      [  151.771378]  ? kasan_complete_mode_report_info+0x7c/0x1e0
      [  151.772241]  ? dlm_midcomms_commit_mhandle+0x19d/0x4b0
      [  151.773069]  kasan_report+0x93/0x1a0
      [  151.773668]  ? dlm_midcomms_commit_mhandle+0x19d/0x4b0
      [  151.774514]  __asan_load4+0x7e/0xa0
      [  151.775089]  dlm_midcomms_commit_mhandle+0x19d/0x4b0
      [  151.775890]  ? create_message.isra.29.constprop.64+0x57/0xc0
      [  151.776770]  send_common+0x19f/0x1b0
      [  151.777342]  ? remove_from_waiters+0x60/0x60
      [  151.778017]  ? lock_downgrade+0x410/0x410
      [  151.778648]  ? __this_cpu_preempt_check+0x13/0x20
      [  151.779421]  ? rcu_lockdep_current_cpu_online+0x88/0xc0
      [  151.780292]  _convert_lock+0x46/0x150
      [  151.780893]  convert_lock+0x7b/0xc0
      [  151.781459]  dlm_lock+0x3ac/0x580
      [  151.781993]  ? 0xffffffffc0540000
      [  151.782522]  ? torture_stop+0x120/0x120 [dlm_locktorture]
      [  151.783379]  ? dlm_scan_rsbs+0xa70/0xa70
      [  151.784003]  ? preempt_count_sub+0xd6/0x130
      [  151.784661]  ? is_module_address+0x47/0x70
      [  151.785309]  ? torture_stop+0x120/0x120 [dlm_locktorture]
      [  151.786166]  ? 0xffffffffc0540000
      [  151.786693]  ? lockdep_init_map_type+0xc3/0x360
      [  151.787414]  ? 0xffffffffc0540000
      [  151.787947]  torture_dlm_lock_sync.isra.3+0xe9/0x150 [dlm_locktorture]
      [  151.789004]  ? torture_stop+0x120/0x120 [dlm_locktorture]
      [  151.789858]  ? 0xffffffffc0540000
      [  151.790392]  ? lock_torture_cleanup+0x20/0x20 [dlm_locktorture]
      [  151.791347]  ? delay_tsc+0x94/0xc0
      [  151.791898]  torture_ex_iter+0xc3/0xea [dlm_locktorture]
      [  151.792735]  ? torture_start+0x30/0x30 [dlm_locktorture]
      [  151.793606]  lock_torture+0x177/0x270 [dlm_locktorture]
      [  151.794448]  ? torture_dlm_lock_sync.isra.3+0x150/0x150 [dlm_locktorture]
      [  151.795539]  ? lock_torture_stats+0x80/0x80 [dlm_locktorture]
      [  151.796476]  ? do_raw_spin_lock+0x11e/0x1e0
      [  151.797152]  ? mark_held_locks+0x34/0xb0
      [  151.797784]  ? _raw_spin_unlock_irqrestore+0x30/0x70
      [  151.798581]  ? __kthread_parkme+0x79/0x110
      [  151.799246]  ? trace_preempt_on+0x2a/0xf0
      [  151.799902]  ? __kthread_parkme+0x79/0x110
      [  151.800579]  ? preempt_count_sub+0xd6/0x130
      [  151.801271]  ? __kasan_check_read+0x11/0x20
      [  151.801963]  ? __kthread_parkme+0xec/0x110
      [  151.802630]  ? lock_torture_stats+0x80/0x80 [dlm_locktorture]
      [  151.803569]  kthread+0x192/0x1d0
      [  151.804104]  ? kthread_complete_and_exit+0x30/0x30
      [  151.804881]  ret_from_fork+0x1f/0x30
      [  151.805480]  </TASK>
      
      [  151.806111] Allocated by task 1347:
      [  151.806681]  kasan_save_stack+0x26/0x50
      [  151.807308]  kasan_set_track+0x25/0x30
      [  151.807920]  kasan_save_alloc_info+0x1e/0x30
      [  151.808609]  __kasan_slab_alloc+0x63/0x80
      [  151.809263]  kmem_cache_alloc+0x1ad/0x830
      [  151.809916]  dlm_allocate_mhandle+0x17/0x20
      [  151.810590]  dlm_midcomms_get_mhandle+0x96/0x260
      [  151.811344]  _create_message+0x95/0x180
      [  151.811994]  create_message.isra.29.constprop.64+0x57/0xc0
      [  151.812880]  send_common+0x129/0x1b0
      [  151.813467]  _convert_lock+0x46/0x150
      [  151.814074]  convert_lock+0x7b/0xc0
      [  151.814648]  dlm_lock+0x3ac/0x580
      [  151.815199]  torture_dlm_lock_sync.isra.3+0xe9/0x150 [dlm_locktorture]
      [  151.816258]  torture_ex_iter+0xc3/0xea [dlm_locktorture]
      [  151.817129]  lock_torture+0x177/0x270 [dlm_locktorture]
      [  151.817986]  kthread+0x192/0x1d0
      [  151.818518]  ret_from_fork+0x1f/0x30
      
      [  151.819369] Freed by task 1336:
      [  151.819890]  kasan_save_stack+0x26/0x50
      [  151.820514]  kasan_set_track+0x25/0x30
      [  151.821128]  kasan_save_free_info+0x2e/0x50
      [  151.821812]  __kasan_slab_free+0x107/0x1a0
      [  151.822483]  kmem_cache_free+0x204/0x5e0
      [  151.823152]  dlm_free_mhandle+0x18/0x20
      [  151.823781]  dlm_mhandle_release+0x2e/0x40
      [  151.824454]  rcu_core+0x583/0x1330
      [  151.825047]  rcu_core_si+0xe/0x20
      [  151.825594]  __do_softirq+0xf4/0x5c2
      
      [  151.826450] Last potentially related work creation:
      [  151.827238]  kasan_save_stack+0x26/0x50
      [  151.827870]  __kasan_record_aux_stack+0xa2/0xc0
      [  151.828609]  kasan_record_aux_stack_noalloc+0xb/0x20
      [  151.829415]  call_rcu+0x4c/0x760
      [  151.829954]  dlm_mhandle_delete+0x97/0xb0
      [  151.830718]  dlm_process_incoming_buffer+0x2fc/0xb30
      [  151.831524]  process_dlm_messages+0x16e/0x470
      [  151.832245]  process_one_work+0x505/0xa10
      [  151.832905]  worker_thread+0x67/0x650
      [  151.833507]  kthread+0x192/0x1d0
      [  151.834046]  ret_from_fork+0x1f/0x30
      
      [  151.834900] The buggy address belongs to the object at ffff88811a980c30
                      which belongs to the cache dlm_mhandle of size 88
      [  151.836894] The buggy address is located 48 bytes inside of
                      88-byte region [ffff88811a980c30, ffff88811a980c88)
      
      [  151.839007] The buggy address belongs to the physical page:
      [  151.839904] page:0000000076cf5d62 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x11a980
      [  151.841378] flags: 0x8000000000000200(slab|zone=2)
      [  151.842141] raw: 8000000000000200 0000000000000000 dead000000000122 ffff8881089b43c0
      [  151.843401] raw: 0000000000000000 0000000000220022 00000001ffffffff 0000000000000000
      [  151.844640] page dumped because: kasan: bad access detected
      
      [  151.845822] Memory state around the buggy address:
      [  151.846602]  ffff88811a980b00: fb fb fb fb fc fc fc fc fa fb fb fb fb fb fb fb
      [  151.847761]  ffff88811a980b80: fb fb fb fc fc fc fc fa fb fb fb fb fb fb fb fb
      [  151.848921] >ffff88811a980c00: fb fb fc fc fc fc fa fb fb fb fb fb fb fb fb fb
      [  151.850076]                                                        ^
      [  151.851085]  ffff88811a980c80: fb fc fc fc fc fa fb fb fb fb fb fb fb fb fb fb
      [  151.852269]  ffff88811a980d00: fc fc fc fc fa fb fb fb fb fb fb fb fb fb fb fc
      [  151.853428] ==================================================================
      [  151.855618] Disabling lock debugging due to kernel taint
      
      It is accessing a mhandle in dlm_midcomms_commit_mhandle() and the mhandle
      was freed by a call_rcu() call in dlm_process_incoming_buffer(),
      dlm_mhandle_delete(). It looks like it was freed because an ack of
      this message was received. There is a short race between committing the
      dlm message to be transmitted and getting an ack back. If the ack is
      faster than returning from dlm_midcomms_commit_msg_3_2(), then we run
      into a use-after free because we still need to reference the mhandle when
      calling srcu_read_unlock().
      
      To avoid that, we don't allow that mhandle to be freed between
      dlm_midcomms_commit_msg_3_2() and srcu_read_unlock() by using rcu read
      lock. We can do that because mhandle is protected by rcu handling.
      
      Cc: stable@vger.kernel.org
      Fixes: 489d8e55
      
       ("fs: dlm: add reliable connection if reconnect")
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a3b0e9ac
    • Alexander Aring's avatar
      fd: dlm: trace send/recv of dlm message and rcom · 387c3038
      Alexander Aring authored
      [ Upstream commit e01c4b7b
      
       ]
      
      This patch adds tracepoints for send and recv cases of dlm messages and
      dlm rcom messages. In case of send and dlm message we add the dlm rsb
      resource name this dlm messages belongs to. This has the advantage to
      follow dlm messages on a per lock basis. In case of recv message the
      resource name can be extracted by follow the send message sequence
      number.
      
      The dlm message DLM_MSG_PURGE doesn't belong to a lock request and will
      not set the resource name in a dlm_message trace. The same for all rcom
      messages.
      
      There is additional handling required for this debugging functionality
      which is tried to be small as possible. Also the midcomms layer gets
      aware of lock resource names, for now this is required to make a
      connection between sequence number and lock resource names. It is for
      debugging purpose only.
      
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Stable-dep-of: 724b6bab
      
       ("fs: dlm: fix use after free in midcomms commit")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      387c3038
    • Alexander Aring's avatar
      fs: dlm: use packet in dlm_mhandle · 8885e12a
      Alexander Aring authored
      [ Upstream commit 5b787667
      
       ]
      
      To allow more than just dereferencing the inner header we directly point
      to the inner dlm packet which allows us to dereference the header, rcom
      or message structure.
      
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Stable-dep-of: 724b6bab
      
       ("fs: dlm: fix use after free in midcomms commit")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8885e12a
    • Alexander Aring's avatar
      fs: dlm: remove send repeat remove handling · cb2849ca
      Alexander Aring authored
      [ Upstream commit 57a5724e
      
       ]
      
      This patch removes the send repeat remove handling. This handling is
      there to repeatingly DLM_MSG_REMOVE messages in cases the dlm stack
      thinks it was not received at the first time. In cases of message drops
      this functionality is necessary, but since the DLM midcomms layer
      guarantees there are no messages drops between cluster nodes this
      feature became not strict necessary anymore. Due message
      delays/processing it could be that two send_repeat_remove() are sent out
      while the other should be still on it's way. We remove the repeat remove
      handling because we are sure that the message cannot be dropped due
      communication errors.
      
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Stable-dep-of: 724b6bab
      
       ("fs: dlm: fix use after free in midcomms commit")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cb2849ca
    • Alexander Aring's avatar
      fs: dlm: start midcomms before scand · 14c5a584
      Alexander Aring authored
      [ Upstream commit aad633dc ]
      
      The scand kthread can send dlm messages out, especially dlm remove
      messages to free memory for unused rsb on other nodes. To send out dlm
      messages, midcomms must be initialized. This patch moves the midcomms
      start before scand is started.
      
      Cc: stable@vger.kernel.org
      Fixes: e7fd4179
      
       ("[DLM] The core of the DLM for GFS2/CLVM")
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      14c5a584
    • Alexander Aring's avatar
      fs: dlm: add midcomms init/start functions · f7889206
      Alexander Aring authored
      [ Upstream commit 8b0188b0
      
       ]
      
      This patch introduces leftovers of init, start, stop and exit
      functionality. The dlm application layer should always call the midcomms
      layer which getting aware of such event and redirect it to the lowcomms
      layer. Some functionality which is currently handled inside the start
      functionality of midcomms and lowcomms should be handled in the init
      functionality as it only need to be initialized once when dlm is loaded.
      
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Stable-dep-of: aad633dc
      
       ("fs: dlm: start midcomms before scand")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f7889206
    • Alexander Aring's avatar
      fs: dlm: fix log of lowcomms vs midcomms · e7935f5a
      Alexander Aring authored
      [ Upstream commit 3e54c9e8
      
       ]
      
      This patch will fix a small issue when printing out that
      dlm_midcomms_start() failed to start and it was printing out that the
      dlm subcomponent lowcomms was failed but lowcomms is behind the midcomms
      layer.
      
      Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
      Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
      Stable-dep-of: aad633dc
      
       ("fs: dlm: start midcomms before scand")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e7935f5a
    • Sean Christopherson's avatar
      KVM: VMX: Do _all_ initialization before exposing /dev/kvm to userspace · e136e969
      Sean Christopherson authored
      [ Upstream commit e32b1200
      
       ]
      
      Call kvm_init() only after _all_ setup is complete, as kvm_init() exposes
      /dev/kvm to userspace and thus allows userspace to create VMs (and call
      other ioctls).  E.g. KVM will encounter a NULL pointer when attempting to
      add a vCPU to the per-CPU loaded_vmcss_on_cpu list if userspace is able to
      create a VM before vmx_init() configures said list.
      
       BUG: kernel NULL pointer dereference, address: 0000000000000008
       #PF: supervisor write access in kernel mode
       #PF: error_code(0x0002) - not-present page
       PGD 0 P4D 0
       Oops: 0002 [#1] SMP
       CPU: 6 PID: 1143 Comm: stable Not tainted 6.0.0-rc7+ #988
       Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
       RIP: 0010:vmx_vcpu_load_vmcs+0x68/0x230 [kvm_intel]
        <TASK>
        vmx_vcpu_load+0x16/0x60 [kvm_intel]
        kvm_arch_vcpu_load+0x32/0x1f0 [kvm]
        vcpu_load+0x2f/0x40 [kvm]
        kvm_arch_vcpu_create+0x231/0x310 [kvm]
        kvm_vm_ioctl+0x79f/0xe10 [kvm]
        ? handle_mm_fault+0xb1/0x220
        __x64_sys_ioctl+0x80/0xb0
        do_syscall_64+0x2b/0x50
        entry_SYSCALL_64_after_hwframe+0x46/0xb0
       RIP: 0033:0x7f5a6b05743b
        </TASK>
       Modules linked in: vhost_net vhost vhost_iotlb tap kvm_intel(+) kvm irqbypass
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20221130230934.1014142-15-seanjc@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e136e969
    • Sean Christopherson's avatar
      KVM: x86: Move guts of kvm_arch_init() to standalone helper · adc0dd8b
      Sean Christopherson authored
      [ Upstream commit 4f8396b9
      
       ]
      
      Move the guts of kvm_arch_init() to a new helper, kvm_x86_vendor_init(),
      so that VMX can do _all_ arch and vendor initialization before calling
      kvm_init().  Calling kvm_init() must be the _very_ last step during init,
      as kvm_init() exposes /dev/kvm to userspace, i.e. allows creating VMs.
      
      No functional change intended.
      
      Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20221130230934.1014142-14-seanjc@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Stable-dep-of: e32b1200
      
       ("KVM: VMX: Do _all_ initialization before exposing /dev/kvm to userspace")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      adc0dd8b
    • Sean Christopherson's avatar
      KVM: VMX: Don't bother disabling eVMCS static key on module exit · 5daa32be
      Sean Christopherson authored
      [ Upstream commit da66de44
      
       ]
      
      Don't disable the eVMCS static key on module exit, kvm_intel.ko owns the
      key so there can't possibly be users after the kvm_intel.ko is unloaded,
      at least not without much bigger issues.
      
      Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20221130230934.1014142-12-seanjc@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Stable-dep-of: e32b1200
      
       ("KVM: VMX: Do _all_ initialization before exposing /dev/kvm to userspace")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5daa32be
    • Sean Christopherson's avatar
      KVM: VMX: Reset eVMCS controls in VP assist page during hardware disabling · afb26bfc
      Sean Christopherson authored
      [ Upstream commit 2916b70f
      
       ]
      
      Reset the eVMCS controls in the per-CPU VP assist page during hardware
      disabling instead of waiting until kvm-intel's module exit.  The controls
      are activated if and only if KVM creates a VM, i.e. don't need to be
      reset if hardware is never enabled.
      
      Doing the reset during hardware disabling will naturally fix a potential
      NULL pointer deref bug once KVM disables CPU hotplug while enabling and
      disabling hardware (which is necessary to fix a variety of bugs).  If the
      kernel is running as the root partition, the VP assist page is unmapped
      during CPU hot unplug, and so KVM's clearing of the eVMCS controls needs
      to occur with CPU hot(un)plug disabled, otherwise KVM could attempt to
      write to a CPU's VP assist page after it's unmapped.
      
      Reported-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
      Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
      Reviewed-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
      Message-Id: <20221130230934.1014142-11-seanjc@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Stable-dep-of: e32b1200
      
       ("KVM: VMX: Do _all_ initialization before exposing /dev/kvm to userspace")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      afb26bfc
    • Fedor Pchelkin's avatar
      nfc: change order inside nfc_se_io error path · 4d72cdd6
      Fedor Pchelkin authored
      commit 7d834b4d upstream.
      
      cb_context should be freed on the error path in nfc_se_io as stated by
      commit 25ff6f8a
      
       ("nfc: fix memory leak of se_io context in
      nfc_genl_se_io").
      
      Make the error path in nfc_se_io unwind everything in reverse order, i.e.
      free the cb_context after unlocking the device.
      
      Suggested-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
      Signed-off-by: default avatarFedor Pchelkin <pchelkin@ispras.ru>
      Reviewed-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
      Link: https://lore.kernel.org/r/20230306212650.230322-1-pchelkin@ispras.ru
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4d72cdd6
    • Lee Jones's avatar
      HID: uhid: Over-ride the default maximum data buffer value with our own · 4cd8ffa4
      Lee Jones authored
      commit 1c5d4221
      
       upstream.
      
      The default maximum data buffer size for this interface is UHID_DATA_MAX
      (4k).  When data buffers are being processed, ensure this value is used
      when ensuring the sanity, rather than a value between the user provided
      value and HID_MAX_BUFFER_SIZE (16k).
      
      Signed-off-by: default avatarLee Jones <lee@kernel.org>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4cd8ffa4
    • Lee Jones's avatar
      HID: core: Provide new max_buffer_size attribute to over-ride the default · 5a144cfe
      Lee Jones authored
      commit b1a37ed0
      
       upstream.
      
      Presently, when a report is processed, its proposed size, provided by
      the user of the API (as Report Size * Report Count) is compared against
      the subsystem default HID_MAX_BUFFER_SIZE (16k).  However, some
      low-level HID drivers allocate a reduced amount of memory to their
      buffers (e.g. UHID only allocates UHID_DATA_MAX (4k) buffers), rending
      this check inadequate in some cases.
      
      In these circumstances, if the received report ends up being smaller
      than the proposed report size, the remainder of the buffer is zeroed.
      That is, the space between sizeof(csize) (size of the current report)
      and the rsize (size proposed i.e. Report Size * Report Count), which can
      be handled up to HID_MAX_BUFFER_SIZE (16k).  Meaning that memset()
      shoots straight past the end of the buffer boundary and starts zeroing
      out in-use values, often resulting in calamity.
      
      This patch introduces a new variable into 'struct hid_ll_driver' where
      individual low-level drivers can over-ride the default maximum value of
      HID_MAX_BUFFER_SIZE (16k) with something more sympathetic to the
      interface.
      
      Signed-off-by: default avatarLee Jones <lee@kernel.org>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5a144cfe
    • Zhihao Cheng's avatar
      ext4: zero i_disksize when initializing the bootloader inode · 9cb27b1e
      Zhihao Cheng authored
      commit f5361da1
      
       upstream.
      
      If the boot loader inode has never been used before, the
      EXT4_IOC_SWAP_BOOT inode will initialize it, including setting the
      i_size to 0.  However, if the "never before used" boot loader has a
      non-zero i_size, then i_disksize will be non-zero, and the
      inconsistency between i_size and i_disksize can trigger a kernel
      warning:
      
       WARNING: CPU: 0 PID: 2580 at fs/ext4/file.c:319
       CPU: 0 PID: 2580 Comm: bb Not tainted 6.3.0-rc1-00004-g703695902cfa
       RIP: 0010:ext4_file_write_iter+0xbc7/0xd10
       Call Trace:
        vfs_write+0x3b1/0x5c0
        ksys_write+0x77/0x160
        __x64_sys_write+0x22/0x30
        do_syscall_64+0x39/0x80
      
      Reproducer:
       1. create corrupted image and mount it:
             mke2fs -t ext4 /tmp/foo.img 200
             debugfs -wR "sif <5> size 25700" /tmp/foo.img
             mount -t ext4 /tmp/foo.img /mnt
             cd /mnt
             echo 123 > file
       2. Run the reproducer program:
             posix_memalign(&buf, 1024, 1024)
             fd = open("file", O_RDWR | O_DIRECT);
             ioctl(fd, EXT4_IOC_SWAP_BOOT);
             write(fd, buf, 1024);
      
      Fix this by setting i_disksize as well as i_size to zero when
      initiaizing the boot loader inode.
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=217159
      Cc: stable@kernel.org
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Link: https://lore.kernel.org/r/20230308032643.641113-1-chengzhihao1@huawei.com
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9cb27b1e
    • Ye Bin's avatar
      ext4: fix WARNING in ext4_update_inline_data · 35161cec
      Ye Bin authored
      commit 2b96b4a5
      
       upstream.
      
      Syzbot found the following issue:
      EXT4-fs (loop0): mounted filesystem 00000000-0000-0000-0000-000000000000 without journal. Quota mode: none.
      fscrypt: AES-256-CTS-CBC using implementation "cts-cbc-aes-aesni"
      fscrypt: AES-256-XTS using implementation "xts-aes-aesni"
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 5071 at mm/page_alloc.c:5525 __alloc_pages+0x30a/0x560 mm/page_alloc.c:5525
      Modules linked in:
      CPU: 1 PID: 5071 Comm: syz-executor263 Not tainted 6.2.0-rc1-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/26/2022
      RIP: 0010:__alloc_pages+0x30a/0x560 mm/page_alloc.c:5525
      RSP: 0018:ffffc90003c2f1c0 EFLAGS: 00010246
      RAX: ffffc90003c2f220 RBX: 0000000000000014 RCX: 0000000000000000
      RDX: 0000000000000028 RSI: 0000000000000000 RDI: ffffc90003c2f248
      RBP: ffffc90003c2f2d8 R08: dffffc0000000000 R09: ffffc90003c2f220
      R10: fffff52000785e49 R11: 1ffff92000785e44 R12: 0000000000040d40
      R13: 1ffff92000785e40 R14: dffffc0000000000 R15: 1ffff92000785e3c
      FS:  0000555556c0d300(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f95d5e04138 CR3: 00000000793aa000 CR4: 00000000003506f0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       <TASK>
       __alloc_pages_node include/linux/gfp.h:237 [inline]
       alloc_pages_node include/linux/gfp.h:260 [inline]
       __kmalloc_large_node+0x95/0x1e0 mm/slab_common.c:1113
       __do_kmalloc_node mm/slab_common.c:956 [inline]
       __kmalloc+0xfe/0x190 mm/slab_common.c:981
       kmalloc include/linux/slab.h:584 [inline]
       kzalloc include/linux/slab.h:720 [inline]
       ext4_update_inline_data+0x236/0x6b0 fs/ext4/inline.c:346
       ext4_update_inline_dir fs/ext4/inline.c:1115 [inline]
       ext4_try_add_inline_entry+0x328/0x990 fs/ext4/inline.c:1307
       ext4_add_entry+0x5a4/0xeb0 fs/ext4/namei.c:2385
       ext4_add_nondir+0x96/0x260 fs/ext4/namei.c:2772
       ext4_create+0x36c/0x560 fs/ext4/namei.c:2817
       lookup_open fs/namei.c:3413 [inline]
       open_last_lookups fs/namei.c:3481 [inline]
       path_openat+0x12ac/0x2dd0 fs/namei.c:3711
       do_filp_open+0x264/0x4f0 fs/namei.c:3741
       do_sys_openat2+0x124/0x4e0 fs/open.c:1310
       do_sys_open fs/open.c:1326 [inline]
       __do_sys_openat fs/open.c:1342 [inline]
       __se_sys_openat fs/open.c:1337 [inline]
       __x64_sys_openat+0x243/0x290 fs/open.c:1337
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Above issue happens as follows:
      ext4_iget
         ext4_find_inline_data_nolock ->i_inline_off=164 i_inline_size=60
      ext4_try_add_inline_entry
         __ext4_mark_inode_dirty
            ext4_expand_extra_isize_ea ->i_extra_isize=32 s_want_extra_isize=44
               ext4_xattr_shift_entries
      	 ->after shift i_inline_off is incorrect, actually is change to 176
      ext4_try_add_inline_entry
        ext4_update_inline_dir
          get_max_inline_xattr_value_size
            if (EXT4_I(inode)->i_inline_off)
      	entry = (struct ext4_xattr_entry *)((void *)raw_inode +
      			EXT4_I(inode)->i_inline_off);
              free += EXT4_XATTR_SIZE(le32_to_cpu(entry->e_value_size));
      	->As entry is incorrect, then 'free' may be negative
         ext4_update_inline_data
            value = kzalloc(len, GFP_NOFS);
            -> len is unsigned int, maybe very large, then trigger warning when
               'kzalloc()'
      
      To resolve the above issue we need to update 'i_inline_off' after
      'ext4_xattr_shift_entries()'.  We do not need to set
      EXT4_STATE_MAY_INLINE_DATA flag here, since ext4_mark_inode_dirty()
      already sets this flag if needed.  Setting EXT4_STATE_MAY_INLINE_DATA
      when it is needed may trigger a BUG_ON in ext4_writepages().
      
      Reported-by: default avatar <syzbot+d30838395804afc2fa6f@syzkaller.appspotmail.com>
      Cc: stable@kernel.org
      Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
      Reviewed-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20230307015253.2232062-3-yebin@huaweicloud.com
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      35161cec
    • Ye Bin's avatar
      ext4: move where set the MAY_INLINE_DATA flag is set · 50a70036
      Ye Bin authored
      commit 1dcdce59
      
       upstream.
      
      The only caller of ext4_find_inline_data_nolock() that needs setting of
      EXT4_STATE_MAY_INLINE_DATA flag is ext4_iget_extra_inode().  In
      ext4_write_inline_data_end() we just need to update inode->i_inline_off.
      Since we are going to add one more caller that does not need to set
      EXT4_STATE_MAY_INLINE_DATA, just move setting of EXT4_STATE_MAY_INLINE_DATA
      out to ext4_iget_extra_inode().
      
      Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
      Cc: stable@kernel.org
      Reviewed-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20230307015253.2232062-2-yebin@huaweicloud.com
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      50a70036
    • Darrick J. Wong's avatar
      ext4: fix another off-by-one fsmap error on 1k block filesystems · eb3a695a
      Darrick J. Wong authored
      commit c993799b
      
       upstream.
      
      Apparently syzbot figured out that issuing this FSMAP call:
      
      struct fsmap_head cmd = {
      	.fmh_count	= ...;
      	.fmh_keys	= {
      		{ .fmr_device = /* ext4 dev */, .fmr_physical = 0, },
      		{ .fmr_device = /* ext4 dev */, .fmr_physical = 0, },
      	},
      ...
      };
      ret = ioctl(fd, FS_IOC_GETFSMAP, &cmd);
      
      Produces this crash if the underlying filesystem is a 1k-block ext4
      filesystem:
      
      kernel BUG at fs/ext4/ext4.h:3331!
      invalid opcode: 0000 [#1] PREEMPT SMP
      CPU: 3 PID: 3227965 Comm: xfs_io Tainted: G        W  O       6.2.0-rc8-achx
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014
      RIP: 0010:ext4_mb_load_buddy_gfp+0x47c/0x570 [ext4]
      RSP: 0018:ffffc90007c03998 EFLAGS: 00010246
      RAX: ffff888004978000 RBX: ffffc90007c03a20 RCX: ffff888041618000
      RDX: 0000000000000000 RSI: 00000000000005a4 RDI: ffffffffa0c99b11
      RBP: ffff888012330000 R08: ffffffffa0c2b7d0 R09: 0000000000000400
      R10: ffffc90007c03950 R11: 0000000000000000 R12: 0000000000000001
      R13: 00000000ffffffff R14: 0000000000000c40 R15: ffff88802678c398
      FS:  00007fdf2020c880(0000) GS:ffff88807e100000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007ffd318a5fe8 CR3: 000000007f80f001 CR4: 00000000001706e0
      Call Trace:
       <TASK>
       ext4_mballoc_query_range+0x4b/0x210 [ext4 dfa189daddffe8fecd3cdfd00564e0f265a8ab80]
       ext4_getfsmap_datadev+0x713/0x890 [ext4 dfa189daddffe8fecd3cdfd00564e0f265a8ab80]
       ext4_getfsmap+0x2b7/0x330 [ext4 dfa189daddffe8fecd3cdfd00564e0f265a8ab80]
       ext4_ioc_getfsmap+0x153/0x2b0 [ext4 dfa189daddffe8fecd3cdfd00564e0f265a8ab80]
       __ext4_ioctl+0x2a7/0x17e0 [ext4 dfa189daddffe8fecd3cdfd00564e0f265a8ab80]
       __x64_sys_ioctl+0x82/0xa0
       do_syscall_64+0x2b/0x80
       entry_SYSCALL_64_after_hwframe+0x46/0xb0
      RIP: 0033:0x7fdf20558aff
      RSP: 002b:00007ffd318a9e30 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
      RAX: ffffffffffffffda RBX: 00000000000200c0 RCX: 00007fdf20558aff
      RDX: 00007fdf1feb2010 RSI: 00000000c0c0583b RDI: 0000000000000003
      RBP: 00005625c0634be0 R08: 00005625c0634c40 R09: 0000000000000001
      R10: 0000000000000000 R11: 0000000000000246 R12: 00007fdf1feb2010
      R13: 00005625be70d994 R14: 0000000000000800 R15: 0000000000000000
      
      For GETFSMAP calls, the caller selects a physical block device by
      writing its block number into fsmap_head.fmh_keys[01].fmr_device.
      To query mappings for a subrange of the device, the starting byte of the
      range is written to fsmap_head.fmh_keys[0].fmr_physical and the last
      byte of the range goes in fsmap_head.fmh_keys[1].fmr_physical.
      
      IOWs, to query what mappings overlap with bytes 3-14 of /dev/sda, you'd
      set the inputs as follows:
      
      	fmh_keys[0] = { .fmr_device = major(8, 0), .fmr_physical = 3},
      	fmh_keys[1] = { .fmr_device = major(8, 0), .fmr_physical = 14},
      
      Which would return you whatever is mapped in the 12 bytes starting at
      physical offset 3.
      
      The crash is due to insufficient range validation of keys[1] in
      ext4_getfsmap_datadev.  On 1k-block filesystems, block 0 is not part of
      the filesystem, which means that s_first_data_block is nonzero.
      ext4_get_group_no_and_offset subtracts this quantity from the blocknr
      argument before cracking it into a group number and a block number
      within a group.  IOWs, block group 0 spans blocks 1-8192 (1-based)
      instead of 0-8191 (0-based) like what happens with larger blocksizes.
      
      The net result of this encoding is that blocknr < s_first_data_block is
      not a valid input to this function.  The end_fsb variable is set from
      the keys that are copied from userspace, which means that in the above
      example, its value is zero.  That leads to an underflow here:
      
      	blocknr = blocknr - le32_to_cpu(es->s_first_data_block);
      
      The division then operates on -1:
      
      	offset = do_div(blocknr, EXT4_BLOCKS_PER_GROUP(sb)) >>
      		EXT4_SB(sb)->s_cluster_bits;
      
      Leaving an impossibly large group number (2^32-1) in blocknr.
      ext4_getfsmap_check_keys checked that keys[0].fmr_physical and
      keys[1].fmr_physical are in increasing order, but
      ext4_getfsmap_datadev adjusts keys[0].fmr_physical to be at least
      s_first_data_block.  This implies that we have to check it again after
      the adjustment, which is the piece that I forgot.
      
      Reported-by: default avatar <syzbot+6be2b977c89f79b6b153@syzkaller.appspotmail.com>
      Fixes: 4a495624
      
       ("ext4: fix off-by-one fsmap error on 1k block filesystems")
      Link: https://syzkaller.appspot.com/bug?id=79d5768e9bfe362911ac1a5057a36fc6b5c30002
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
      Link: https://lore.kernel.org/r/Y+58NPTH7VNGgzdd@magnolia
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      eb3a695a
    • Eric Whitney's avatar
      ext4: fix RENAME_WHITEOUT handling for inline directories · f3b8cc21
      Eric Whitney authored
      commit c9f62c8b upstream.
      
      A significant number of xfstests can cause ext4 to log one or more
      warning messages when they are run on a test file system where the
      inline_data feature has been enabled.  An example:
      
      "EXT4-fs warning (device vdc): ext4_dirblock_csum_set:425: inode
       #16385: comm fsstress: No space for directory leaf checksum. Please
      run e2fsck -D."
      
      The xfstests include: ext4/057, 058, and 307; generic/013, 051, 068,
      070, 076, 078, 083, 232, 269, 270, 390, 461, 475, 476, 482, 579, 585,
      589, 626, 631, and 650.
      
      In this situation, the warning message indicates a bug in the code that
      performs the RENAME_WHITEOUT operation on a directory entry that has
      been stored inline.  It doesn't detect that the directory is stored
      inline, and incorrectly attempts to compute a dirent block checksum on
      the whiteout inode when creating it.  This attempt fails as a result
      of the integrity checking in get_dirent_tail (usually due to a failure
      to match the EXT4_FT_DIR_CSUM magic cookie), and the warning message
      is then emitted.
      
      Fix this by simply collecting the inlined data state at the time the
      search for the source directory entry is performed.  Existing code
      handles the rest, and this is sufficient to eliminate all spurious
      warning messages produced by the tests above.  Go one step further
      and do the same in the code that resets the source directory entry in
      the event of failure.  The inlined state should be present in the
      "old" struct, but given the possibility of a race there's no harm
      in taking a conservative approach and getting that information again
      since the directory entry is being reread anyway.
      
      Fixes: b7ff91fd
      
       ("ext4: find old entry again if failed to rename whiteout")
      Cc: stable@kernel.org
      Signed-off-by: default avatarEric Whitney <enwlinux@gmail.com>
      Reviewed-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20230210173244.679890-1-enwlinux@gmail.com
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f3b8cc21
    • Eric Biggers's avatar
      ext4: fix cgroup writeback accounting with fs-layer encryption · f327490e
      Eric Biggers authored
      commit ffec85d5 upstream.
      
      When writing a page from an encrypted file that is using
      filesystem-layer encryption (not inline encryption), ext4 encrypts the
      pagecache page into a bounce page, then writes the bounce page.
      
      It also passes the bounce page to wbc_account_cgroup_owner().  That's
      incorrect, because the bounce page is a newly allocated temporary page
      that doesn't have the memory cgroup of the original pagecache page.
      This makes wbc_account_cgroup_owner() not account the I/O to the owner
      of the pagecache page as it should.
      
      Fix this by always passing the pagecache page to
      wbc_account_cgroup_owner().
      
      Fixes: 001e4a87
      
       ("ext4: implement cgroup writeback support")
      Cc: stable@vger.kernel.org
      Reported-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Acked-by: default avatarTejun Heo <tj@kernel.org>
      Link: https://lore.kernel.org/r/20230203005503.141557-1-ebiggers@kernel.org
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f327490e
    • Hans de Goede's avatar
      staging: rtl8723bs: Pass correct parameters to cfg80211_get_bss() · f0417bf1
      Hans de Goede authored
      commit d17789ed
      
       upstream.
      
      To last 2 parameters to cfg80211_get_bss() should be of
      the enum ieee80211_bss_type resp. enum ieee80211_privacy types,
      which WLAN_CAPABILITY_ESS very much is not.
      
      Fix both cfg80211_get_bss() calls in ioctl_cfg80211.c to pass
      the right parameters.
      
      Note that the second call was already somewhat fixed by commenting
      out WLAN_CAPABILITY_ESS and passing in 0 instead. This was still
      not entirely correct though since that would limit returned
      BSS-es to ESS type BSS-es with privacy on.
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Link: https://lore.kernel.org/r/20230306153512.162104-2-hdegoede@redhat.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f0417bf1
    • Hans de Goede's avatar
      staging: rtl8723bs: Fix key-store index handling · 4a6d23b7
      Hans de Goede authored
      commit 05cbcc41
      
       upstream.
      
      There are 2 issues with the key-store index handling
      
      1. The non WEP key stores can store keys with indexes 0 - BIP_MAX_KEYID,
         this means that they should be an array with BIP_MAX_KEYID + 1
         entries. But some of the arrays where just BIP_MAX_KEYID entries
         big. While one other array was hardcoded to a size of 6 entries,
         instead of using the BIP_MAX_KEYID define.
      
      2. The rtw_cfg80211_set_encryption() and wpa_set_encryption() functions
         index check where checking that the passed in key-index would fit
         inside both the WEP key store (which only has 4 entries) as well as
         in the non WEP key stores. This breaks any attempts to set non WEP
         keys with index 4 or 5.
      
      Issue 2. specifically breaks wifi connection with some access points
      which advertise PMF support. Without this fix connecting to these
      access points fails with the following wpa_supplicant messages:
      
       nl80211: kernel reports: key addition failed
       wlan0: WPA: Failed to configure IGTK to the driver
       wlan0: RSN: Failed to configure IGTK
       wlan0: CTRL-EVENT-DISCONNECTED bssid=... reason=1 locally_generated=1
      
      Fix 1. by using the right size for the key-stores. After this 2. can
      safely be fixed by checking the right max-index value depending on the
      used algorithm, fixing wifi not working with some PMF capable APs.
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Link: https://lore.kernel.org/r/20230306153512.162104-1-hdegoede@redhat.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4a6d23b7