1. 17 Apr, 2019 7 commits
    • Eric Biggers's avatar
      fscrypt: cache decrypted symlink target in ->i_link · 2c58d548
      Eric Biggers authored
      Path lookups that traverse encrypted symlink(s) are very slow because
      each encrypted symlink needs to be decrypted each time it's followed.
      This also involves dropping out of rcu-walk mode.
      
      Make encrypted symlinks faster by caching the decrypted symlink target
      in ->i_link.  The first call to fscrypt_get_symlink() sets it.  Then,
      the existing VFS path lookup code uses the non-NULL ->i_link to take the
      fast path where ->get_link() isn't called, and lookups in rcu-walk mode
      remain in rcu-walk mode.
      
      Also set ->i_link immediately when a new encrypted symlink is created.
      
      To safely free the symlink target after an RCU grace period has elapsed,
      introduce a new function fscrypt_free_inode(), and make the relevant
      filesystems call it just before actually freeing the inode.
      
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      2c58d548
    • Eric Biggers's avatar
      vfs: use READ_ONCE() to access ->i_link · 4c4f7c19
      Eric Biggers authored
      Use 'READ_ONCE(inode->i_link)' to explicitly support filesystems caching
      the symlink target in ->i_link later if it was unavailable at iget()
      time, or wasn't easily available.  I'll be doing this in fscrypt, to
      improve the performance of encrypted symlinks on ext4, f2fs, and ubifs.
      
      ->i_link will start NULL and may later be set to a non-NULL value by a
      smp_store_release() or cmpxchg_release().  READ_ONCE() is needed on the
      read side.  smp_load_acquire() is unnecessary because only a data
      dependency barrier is required.  (Thanks to Al for pointing this out.)
      Acked-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      4c4f7c19
    • Eric Biggers's avatar
      fscrypt: fix race where ->lookup() marks plaintext dentry as ciphertext · b01531db
      Eric Biggers authored
      ->lookup() in an encrypted directory begins as follows:
      
      1. fscrypt_prepare_lookup():
          a. Try to load the directory's encryption key.
          b. If the key is unavailable, mark the dentry as a ciphertext name
             via d_flags.
      2. fscrypt_setup_filename():
          a. Try to load the directory's encryption key.
          b. If the key is available, encrypt the name (treated as a plaintext
             name) to get the on-disk name.  Otherwise decode the name
             (treated as a ciphertext name) to get the on-disk name.
      
      But if the key is concurrently added, it may be found at (2a) but not at
      (1a).  In this case, the dentry will be wrongly marked as a ciphertext
      name even though it was actually treated as plaintext.
      
      This will cause the dentry to be wrongly invalidated on the next lookup,
      potentially causing problems.  For example, if the racy ->lookup() was
      part of sys_mount(), then the new mount will be detached when anything
      tries to access it.  This is despite the mountpoint having a plaintext
      path, which should remain valid now that the key was added.
      
      Of course, this is only possible if there's a userspace race.  Still,
      the additional kernel-side race is confusing and unexpected.
      
      Close the kernel-side race by changing fscrypt_prepare_lookup() to also
      set the on-disk filename (step 2b), consistent with the d_flags update.
      
      Fixes: 28b4c263 ("ext4 crypto: revalidate dentry after adding or removing the key")
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      b01531db
    • Eric Biggers's avatar
      fscrypt: only set dentry_operations on ciphertext dentries · d456a33f
      Eric Biggers authored
      Plaintext dentries are always valid, so only set fscrypt_d_ops on
      ciphertext dentries.
      
      Besides marginally improved performance, this allows overlayfs to use an
      fscrypt-encrypted upperdir, provided that all the following are true:
      
          (1) The fscrypt encryption key is placed in the keyring before
      	mounting overlayfs, and remains while the overlayfs is mounted.
      
          (2) The overlayfs workdir uses the same encryption policy.
      
          (3) No dentries for the ciphertext names of subdirectories have been
      	created in the upperdir or workdir yet.  (Since otherwise
      	d_splice_alias() will reuse the old dentry with ->d_op set.)
      
      One potential use case is using an ephemeral encryption key to encrypt
      all files created or changed by a container, so that they can be
      securely erased ("crypto-shredded") after the container stops.
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      d456a33f
    • Eric Biggers's avatar
      fs, fscrypt: clear DCACHE_ENCRYPTED_NAME when unaliasing directory · 0bf3d5c1
      Eric Biggers authored
      Make __d_move() clear DCACHE_ENCRYPTED_NAME on the source dentry.  This
      is needed for when d_splice_alias() moves a directory's encrypted alias
      to its decrypted alias as a result of the encryption key being added.
      
      Otherwise, the decrypted alias will incorrectly be invalidated on the
      next lookup, causing problems such as unmounting a mount the user just
      mount()ed there.
      
      Note that we don't have to support arbitrary moves of this flag because
      fscrypt doesn't allow dentries with DCACHE_ENCRYPTED_NAME to be the
      source or target of a rename().
      
      Fixes: 28b4c263 ("ext4 crypto: revalidate dentry after adding or removing the key")
      Reported-by: default avatarSarthak Kukreti <sarthakkukreti@chromium.org>
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      0bf3d5c1
    • Eric Biggers's avatar
      fscrypt: fix race allowing rename() and link() of ciphertext dentries · 968dd6d0
      Eric Biggers authored
      Close some race conditions where fscrypt allowed rename() and link() on
      ciphertext dentries that had been looked up just prior to the key being
      concurrently added.  It's better to return -ENOKEY in this case.
      
      This avoids doing the nonsensical thing of encrypting the names a second
      time when searching for the actual on-disk dir entries.  It also
      guarantees that DCACHE_ENCRYPTED_NAME dentries are never rename()d, so
      the dcache won't have support all possible combinations of moving
      DCACHE_ENCRYPTED_NAME around during __d_move().
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      968dd6d0
    • Eric Biggers's avatar
      fscrypt: clean up and improve dentry revalidation · 6cc24868
      Eric Biggers authored
      Make various improvements to fscrypt dentry revalidation:
      
      - Don't try to handle the case where the per-directory key is removed,
        as this can't happen without the inode (and dentries) being evicted.
      
      - Flag ciphertext dentries rather than plaintext dentries, since it's
        ciphertext dentries that need the special handling.
      
      - Avoid doing unnecessary work for non-ciphertext dentries.
      
      - When revalidating ciphertext dentries, try to set up the directory's
        i_crypt_info to make sure the key is really still absent, rather than
        invalidating all negative dentries as the previous code did.  An old
        comment suggested we can't do this for locking reasons, but AFAICT
        this comment was outdated and it actually works fine.
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      6cc24868
  2. 16 Apr, 2019 3 commits
    • Eric Biggers's avatar
      fscrypt: use READ_ONCE() to access ->i_crypt_info · e37a784d
      Eric Biggers authored
      ->i_crypt_info starts out NULL and may later be locklessly set to a
      non-NULL value by the cmpxchg() in fscrypt_get_encryption_info().
      
      But ->i_crypt_info is used directly, which technically is incorrect.
      It's a data race, and it doesn't include the data dependency barrier
      needed to safely dereference the pointer on at least one architecture.
      
      Fix this by using READ_ONCE() instead.  Note: we don't need to use
      smp_load_acquire(), since dereferencing the pointer only requires a data
      dependency barrier, which is already included in READ_ONCE().  We also
      don't need READ_ONCE() in places where ->i_crypt_info is unconditionally
      dereferenced, since it must have already been checked.
      
      Also downgrade the cmpxchg() to cmpxchg_release(), since RELEASE
      semantics are sufficient on the write side.
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      e37a784d
    • Eric Biggers's avatar
      fscrypt: remove WARN_ON_ONCE() when decryption fails · ff5d3a97
      Eric Biggers authored
      If decrypting a block fails, fscrypt did a WARN_ON_ONCE().  But WARN is
      meant for kernel bugs, which this isn't; this could be hit by fuzzers
      using fault injection, for example.  Also, there is already a proper
      warning message logged in fscrypt_do_page_crypto(), so the WARN doesn't
      add much.
      
      Just remove the unnessary WARN.
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      ff5d3a97
    • Eric Biggers's avatar
      fscrypt: drop inode argument from fscrypt_get_ctx() · cd0265fc
      Eric Biggers authored
      The only reason the inode is being passed to fscrypt_get_ctx() is to
      verify that the encryption key is available.  However, all callers
      already ensure this because if we get as far as trying to do I/O to an
      encrypted file without the key, there's already a bug.
      
      Therefore, remove this unnecessary argument.
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      cd0265fc
  3. 14 Apr, 2019 6 commits
    • Linus Torvalds's avatar
      Linux 5.1-rc5 · dc4060a5
      Linus Torvalds authored
      dc4060a5
    • Linus Torvalds's avatar
      Merge branch 'page-refs' (page ref overflow) · 6b3a7077
      Linus Torvalds authored
      Merge page ref overflow branch.
      
      Jann Horn reported that he can overflow the page ref count with
      sufficient memory (and a filesystem that is intentionally extremely
      slow).
      
      Admittedly it's not exactly easy.  To have more than four billion
      references to a page requires a minimum of 32GB of kernel memory just
      for the pointers to the pages, much less any metadata to keep track of
      those pointers.  Jann needed a total of 140GB of memory and a specially
      crafted filesystem that leaves all reads pending (in order to not ever
      free the page references and just keep adding more).
      
      Still, we have a fairly straightforward way to limit the two obvious
      user-controllable sources of page references: direct-IO like page
      references gotten through get_user_pages(), and the splice pipe page
      duplication.  So let's just do that.
      
      * branch page-refs:
        fs: prevent page refcount overflow in pipe_buf_get
        mm: prevent get_user_pages() from overflowing page refcount
        mm: add 'try_get_page()' helper function
        mm: make page ref count overflow check tighter and more explicit
      6b3a7077
    • Matthew Wilcox's avatar
      fs: prevent page refcount overflow in pipe_buf_get · 15fab63e
      Matthew Wilcox authored
      Change pipe_buf_get() to return a bool indicating whether it succeeded
      in raising the refcount of the page (if the thing in the pipe is a page).
      This removes another mechanism for overflowing the page refcount.  All
      callers converted to handle a failure.
      Reported-by: default avatarJann Horn <jannh@google.com>
      Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
      Cc: stable@kernel.org
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      15fab63e
    • Linus Torvalds's avatar
      mm: prevent get_user_pages() from overflowing page refcount · 8fde12ca
      Linus Torvalds authored
      If the page refcount wraps around past zero, it will be freed while
      there are still four billion references to it.  One of the possible
      avenues for an attacker to try to make this happen is by doing direct IO
      on a page multiple times.  This patch makes get_user_pages() refuse to
      take a new page reference if there are already more than two billion
      references to the page.
      Reported-by: default avatarJann Horn <jannh@google.com>
      Acked-by: default avatarMatthew Wilcox <willy@infradead.org>
      Cc: stable@kernel.org
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      8fde12ca
    • Linus Torvalds's avatar
      mm: add 'try_get_page()' helper function · 88b1a17d
      Linus Torvalds authored
      This is the same as the traditional 'get_page()' function, but instead
      of unconditionally incrementing the reference count of the page, it only
      does so if the count was "safe".  It returns whether the reference count
      was incremented (and is marked __must_check, since the caller obviously
      has to be aware of it).
      
      Also like 'get_page()', you can't use this function unless you already
      had a reference to the page.  The intent is that you can use this
      exactly like get_page(), but in situations where you want to limit the
      maximum reference count.
      
      The code currently does an unconditional WARN_ON_ONCE() if we ever hit
      the reference count issues (either zero or negative), as a notification
      that the conditional non-increment actually happened.
      
      NOTE! The count access for the "safety" check is inherently racy, but
      that doesn't matter since the buffer we use is basically half the range
      of the reference count (ie we look at the sign of the count).
      Acked-by: default avatarMatthew Wilcox <willy@infradead.org>
      Cc: Jann Horn <jannh@google.com>
      Cc: stable@kernel.org
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      88b1a17d
    • Linus Torvalds's avatar
      mm: make page ref count overflow check tighter and more explicit · f958d7b5
      Linus Torvalds authored
      We have a VM_BUG_ON() to check that the page reference count doesn't
      underflow (or get close to overflow) by checking the sign of the count.
      
      That's all fine, but we actually want to allow people to use a "get page
      ref unless it's already very high" helper function, and we want that one
      to use the sign of the page ref (without triggering this VM_BUG_ON).
      
      Change the VM_BUG_ON to only check for small underflows (or _very_ close
      to overflowing), and ignore overflows which have strayed into negative
      territory.
      Acked-by: default avatarMatthew Wilcox <willy@infradead.org>
      Cc: Jann Horn <jannh@google.com>
      Cc: stable@kernel.org
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      f958d7b5
  4. 13 Apr, 2019 14 commits
  5. 12 Apr, 2019 10 commits
    • Leonard Crestez's avatar
      clk: imx: Fix PLL_1416X not rounding rates · f89b9e1b
      Leonard Crestez authored
      Code which initializes the "clk_init_data.ops" checks pll->rate_table
      before that field is ever assigned to so it always picks
      "clk_pll1416x_min_ops".
      
      This breaks dynamic rate rounding for features such as cpufreq.
      
      Fix by checking pll_clk->rate_table instead, here pll_clk refers to
      the constant initialization data coming from per-soc clk driver.
      Signed-off-by: default avatarLeonard Crestez <leonard.crestez@nxp.com>
      Fixes: 8646d4dc ("clk: imx: Add PLLs driver for imx8mm soc")
      Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
      f89b9e1b
    • Weiyi Lu's avatar
      clk: mediatek: fix clk-gate flag setting · b3cf181c
      Weiyi Lu authored
      CLK_SET_RATE_PARENT would be dropped.
      Merge two flag setting together to correct the error.
      
      Fixes: 5a1cc4c2 ("clk: mediatek: Add flags to mtk_gate")
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarWeiyi Lu <weiyi.lu@mediatek.com>
      Reviewed-by: default avatarMatthias Brugger <matthias.bgg@gmail.com>
      Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
      b3cf181c
    • Linus Torvalds's avatar
      Merge tag 'dma-mapping-5.1-1' of git://git.infradead.org/users/hch/dma-mapping · 8ee15f32
      Linus Torvalds authored
      Pull dma-mapping fixes from Christoph Hellwig:
       "Fix a sparc64 sun4v_pci regression introduced in this merged window,
        and a dma-debug stracktrace regression from the big refactor last
        merge window"
      
      * tag 'dma-mapping-5.1-1' of git://git.infradead.org/users/hch/dma-mapping:
        dma-debug: only skip one stackframe entry
        sparc64/pci_sun4v: fix ATU checks for large DMA masks
      8ee15f32
    • Linus Torvalds's avatar
      Merge tag 'iommu-fix-v5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu · 4876191c
      Linus Torvalds authored
      Pull IOMMU fix from Joerg Roedel:
       "Fix an AMD IOMMU issue where the driver didn't correctly setup the
        exclusion range in the hardware registers, resulting in exclusion
        ranges being one page too big.
      
        This can cause data corruption of the address of that last page is
        used by DMA operations"
      
      * tag 'iommu-fix-v5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
        iommu/amd: Set exclusion range correctly
      4876191c
    • Linus Torvalds's avatar
      Merge tag 'clang-format-for-linus-v5.1-rc5' of git://github.com/ojeda/linux · 8e72d95d
      Linus Torvalds authored
      Pull clang-format update from Miguel Ojeda:
       "The usual roughly-per-release .clang-format macro list update"
      
      * tag 'clang-format-for-linus-v5.1-rc5' of git://github.com/ojeda/linux:
        clang-format: Update with the latest for_each macro list
      8e72d95d
    • Linus Torvalds's avatar
      Merge tag 'mmc-v5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc · ea951a94
      Linus Torvalds authored
      Pull MMC host fixes from Ulf Hansson:
      
       - alcor: Stabilize data write requests
      
       - sdhci-omap: Fix command error path during tuning
      
      * tag 'mmc-v5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
        mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning
        mmc: alcor: don't write data before command has completed
      ea951a94
    • Linus Torvalds's avatar
      Merge tag 'sound-5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound · 372686e6
      Linus Torvalds authored
      Pull sound fixes from Takashi Iwai:
       "Well, this one became unpleasantly larger than previous pull requests,
        but it's a kind of usual pattern: now it contains a collection of ASoC
        fixes, and nothing to worry too much.
      
        The fixes for ASoC core (DAPM, DPCM, topology) are all small and just
        covering corner cases. The rest changes are driver-specific, many of
        which are for x86 platforms and new drivers like STM32, in addition to
        the usual fixups for HD-audio"
      
      * tag 'sound-5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (66 commits)
        ASoC: wcd9335: Fix missing regmap requirement
        ALSA: hda: Fix racy display power access
        ASoC: pcm: fix error handling when try_module_get() fails.
        ASoC: stm32: sai: fix master clock management
        ASoC: Intel: kbl: fix wrong number of channels
        ALSA: hda - Add two more machines to the power_save_blacklist
        ASoC: pcm: update module refcount if module_get_upon_open is set
        ASoC: core: conditionally increase module refcount on component open
        ASoC: stm32: fix sai driver name initialisation
        ASoC: topology: Use the correct dobj to free enum control values and texts
        ALSA: seq: Fix OOB-reads from strlcpy
        ASoC: intel: skylake: add remove() callback for component driver
        ASoC: cs35l35: Disable regulators on driver removal
        ALSA: xen-front: Do not use stream buffer size before it is set
        ASoC: rockchip: pdm: change dma burst to 8
        ASoC: rockchip: pdm: fix regmap_ops hang issue
        ASoC: simple-card: don't select DPCM via simple-audio-card
        ASoC: audio-graph-card: don't select DPCM via audio-graph-card
        ASoC: tlv320aic32x4: Change author's name
        ALSA: hda/realtek - Add quirk for Tuxedo XC 1509
        ...
      372686e6
    • Linus Torvalds's avatar
      Merge tag 'acpi-5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm · f2a73469
      Linus Torvalds authored
      Pull ACPI fix from Rafael Wysocki:
       "Fix an ACPICA issue introduced during the 4.20 development cycle and
        causing some systems to crash because of leftover operation region
        data still maintained after the operation region in question has gone
        away (Erik Schmauss)"
      
      * tag 'acpi-5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
        ACPICA: Namespace: remove address node from global list after method termination
      f2a73469
    • Linus Torvalds's avatar
      Merge tag 'drm-fixes-2019-04-12' of git://anongit.freedesktop.org/drm/drm · 58890f31
      Linus Torvalds authored
      Pull drm fixes from Dave Airlie:
       "Fixes across the driver spectrum this week, the mediatek fbdev support
        might be a bit late for this round, but I looked over it and it's not
        very large and seems like a useful feature for them.
      
        Otherwise the main thing is a regression fix for i915 5.0 bug that
        caused black screens on a bunch of Dell XPS 15s I think, I know at
        least Fedora is waiting for this to land, and the udl fix is also for
        a regression since 5.0 where unplugging the device would end badly.
      
        core:
         - make atomic hooks optional
      
        i915:
         - Revert a 5.0 regression where some eDP panels stopped working
         - DSI related fixes for platforms up to IceLake
         - GVT (regression fix, warning fix, use-after free fix)
      
        amdgpu:
         - Cursor fixes
         - missing PCI ID fix for KFD
         - XGMI fix
         - shadow buffer handling after reset fix
      
        udl:
         - fix unplugging device crashes.
      
        mediatek:
         - stabilise MT2701 HDMI support
         - fbdev support
      
        tegra:
         - fix for build regression in rc1.
      
        sun4i:
         - Allwinner A6 max freq improvements
         - null ptr deref fix
      
        dw-hdmi:
         - SCDC configuration improvements
      
        omap:
         - CEC clock management policy fix"
      
      * tag 'drm-fixes-2019-04-12' of git://anongit.freedesktop.org/drm/drm: (32 commits)
        gpu: host1x: Fix compile error when IOMMU API is not available
        drm/i915/gvt: Roundup fb->height into tile's height at calucation fb->size
        drm/i915/dp: revert back to max link rate and lane count on eDP
        drm/i915/icl: Fix port disable sequence for mipi-dsi
        drm/i915/icl: Ungate ddi clocks before IO enable
        drm/mediatek: no change parent rate in round_rate() for MT2701 hdmi phy
        drm/mediatek: using new factor for tvdpll for MT2701 hdmi phy
        drm/mediatek: remove flag CLK_SET_RATE_PARENT for MT2701 hdmi phy
        drm/mediatek: make implementation of recalc_rate() for MT2701 hdmi phy
        drm/mediatek: fix the rate and divder of hdmi phy for MT2701
        drm/mediatek: fix possible object reference leak
        drm/i915: Get power refs in encoder->get_power_domains()
        drm/i915: Fix pipe_bpp readout for BXT/GLK DSI
        drm/amd/display: Fix negative cursor pos programming (v2)
        drm/sun4i: tcon top: Fix NULL/invalid pointer dereference in sun8i_tcon_top_un/bind
        drm/udl: add a release method and delay modeset teardown
        drm/i915/gvt: Prevent use-after-free in ppgtt_free_all_spt()
        drm/i915/gvt: Annotate iomem usage
        drm/sun4i: DW HDMI: Lower max. supported rate for H6
        Revert "Documentation/gpu/meson: Remove link to meson_canvas.c"
        ...
      58890f31
    • Will Deacon's avatar
      arm64: futex: Fix FUTEX_WAKE_OP atomic ops with non-zero result value · 045afc24
      Will Deacon authored
      Rather embarrassingly, our futex() FUTEX_WAKE_OP implementation doesn't
      explicitly set the return value on the non-faulting path and instead
      leaves it holding the result of the underlying atomic operation. This
      means that any FUTEX_WAKE_OP atomic operation which computes a non-zero
      value will be reported as having failed. Regrettably, I wrote the buggy
      code back in 2011 and it was upstreamed as part of the initial arm64
      support in 2012.
      
      The reasons we appear to get away with this are:
      
        1. FUTEX_WAKE_OP is rarely used and therefore doesn't appear to get
           exercised by futex() test applications
      
        2. If the result of the atomic operation is zero, the system call
           behaves correctly
      
        3. Prior to version 2.25, the only operation used by GLIBC set the
           futex to zero, and therefore worked as expected. From 2.25 onwards,
           FUTEX_WAKE_OP is not used by GLIBC at all.
      
      Fix the implementation by ensuring that the return value is either 0
      to indicate that the atomic operation completed successfully, or -EFAULT
      if we encountered a fault when accessing the user mapping.
      
      Cc: <stable@kernel.org>
      Fixes: 6170a974 ("arm64: Atomic operations")
      Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
      045afc24