1. 28 1月, 2020 1 次提交
  2. 24 1月, 2020 14 次提交
    • C
      bcache: reap from tail of c->btree_cache in bch_mca_scan() · e3de0446
      Coly Li 提交于
      When shrink btree node cache from c->btree_cache in bch_mca_scan(),
      no matter the selected node is reaped or not, it will be rotated from
      the head to the tail of c->btree_cache list. But in bcache journal
      code, when flushing the btree nodes with oldest journal entry, btree
      nodes are iterated and slected from the tail of c->btree_cache list in
      btree_flush_write(). The list_rotate_left() in bch_mca_scan() will
      make btree_flush_write() iterate more nodes in c->btree_list in reverse
      order.
      
      This patch just reaps the selected btree node cache, and not move it
      from the head to the tail of c->btree_cache list. Then bch_mca_scan()
      will not mess up c->btree_cache list to btree_flush_write().
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      e3de0446
    • C
      bcache: reap c->btree_cache_freeable from the tail in bch_mca_scan() · d5c9c470
      Coly Li 提交于
      In order to skip the most recently freed btree node cahce, currently
      in bch_mca_scan() the first 3 caches in c->btree_cache_freeable list
      are skipped when shrinking bcache node caches in bch_mca_scan(). The
      related code in bch_mca_scan() is,
      
       737 list_for_each_entry_safe(b, t, &c->btree_cache_freeable, list) {
       738         if (nr <= 0)
       739                 goto out;
       740
       741         if (++i > 3 &&
       742             !mca_reap(b, 0, false)) {
                   		lines free cache memory
       746         }
       747         nr--;
       748 }
      
      The problem is, if virtual memory code calls bch_mca_scan() and
      the calculated 'nr' is 1 or 2, then in the above loop, nothing will
      be shunk. In such case, if slub/slab manager calls bch_mca_scan()
      for many times with small scan number, it does not help to shrink
      cache memory and just wasts CPU cycles.
      
      This patch just selects btree node caches from tail of the
      c->btree_cache_freeable list, then the newly freed host cache can
      still be allocated by mca_alloc(), and at least 1 node can be shunk.
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      d5c9c470
    • C
      bcache: remove member accessed from struct btree · 125d98ed
      Coly Li 提交于
      The member 'accessed' of struct btree is used in bch_mca_scan() when
      shrinking btree node caches. The original idea is, if b->accessed is
      set, clean it and look at next btree node cache from c->btree_cache
      list, and only shrink the caches whose b->accessed is cleaned. Then
      only cold btree node cache will be shrunk.
      
      But when I/O pressure is high, it is very probably that b->accessed
      of a btree node cache will be set again in bch_btree_node_get()
      before bch_mca_scan() selects it again. Then there is no chance for
      bch_mca_scan() to shrink enough memory back to slub or slab system.
      
      This patch removes member accessed from struct btree, then once a
      btree node ache is selected, it will be immediately shunk. By this
      change, bch_mca_scan() may release btree node cahce more efficiently.
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      125d98ed
    • C
      bcache: avoid unnecessary btree nodes flushing in btree_flush_write() · 2aa8c529
      Coly Li 提交于
      the commit 91be66e1 ("bcache: performance improvement for
      btree_flush_write()") was an effort to flushing btree node with oldest
      btree node faster in following methods,
      - Only iterate dirty btree nodes in c->btree_cache, avoid scanning a lot
        of clean btree nodes.
      - Take c->btree_cache as a LRU-like list, aggressively flushing all
        dirty nodes from tail of c->btree_cache util the btree node with
        oldest journal entry is flushed. This is to reduce the time of holding
        c->bucket_lock.
      
      Guoju Fang and Shuang Li reported that they observe unexptected extra
      write I/Os on cache device after applying the above patch. Guoju Fang
      provideed more detailed diagnose information that the aggressive
      btree nodes flushing may cause 10x more btree nodes to flush in his
      workload. He points out when system memory is large enough to hold all
      btree nodes in memory, c->btree_cache is not a LRU-like list any more.
      Then the btree node with oldest journal entry is very probably not-
      close to the tail of c->btree_cache list. In such situation much more
      dirty btree nodes will be aggressively flushed before the target node
      is flushed. When slow SATA SSD is used as cache device, such over-
      aggressive flushing behavior will cause performance regression.
      
      After spending a lot of time on debug and diagnose, I find the real
      condition is more complicated, aggressive flushing dirty btree nodes
      from tail of c->btree_cache list is not a good solution.
      - When all btree nodes are cached in memory, c->btree_cache is not
        a LRU-like list, the btree nodes with oldest journal entry won't
        be close to the tail of the list.
      - There can be hundreds dirty btree nodes reference the oldest journal
        entry, before flushing all the nodes the oldest journal entry cannot
        be reclaimed.
      When the above two conditions mixed together, a simply flushing from
      tail of c->btree_cache list is really NOT a good idea.
      
      Fortunately there is still chance to make btree_flush_write() work
      better. Here is how this patch avoids unnecessary btree nodes flushing,
      - Only acquire c->journal.lock when getting oldest journal entry of
        fifo c->journal.pin. In rested locations check the journal entries
        locklessly, so their values can be changed on other cores
        in parallel.
      - In loop list_for_each_entry_safe_reverse(), checking latest front
        point of fifo c->journal.pin. If it is different from the original
        point which we get with locking c->journal.lock, it means the oldest
        journal entry is reclaim on other cores. At this moment, all selected
        dirty nodes recorded in array btree_nodes[] are all flushed and clean
        on other CPU cores, it is unncessary to iterate c->btree_cache any
        longer. Just quit the list_for_each_entry_safe_reverse() loop and
        the following for-loop will skip all the selected clean nodes.
      - Find a proper time to quit the list_for_each_entry_safe_reverse()
        loop. Check the refcount value of orignial fifo front point, if the
        value is larger than selected node number of btree_nodes[], it means
        more matching btree nodes should be scanned. Otherwise it means no
        more matching btee nodes in rest of c->btree_cache list, the loop
        can be quit. If the original oldest journal entry is reclaimed and
        fifo front point is updated, the refcount of original fifo front point
        will be 0, then the loop will be quit too.
      - Not hold c->bucket_lock too long time. c->bucket_lock is also required
        for space allocation for cached data, hold it for too long time will
        block regular I/O requests. When iterating list c->btree_cache, even
        there are a lot of maching btree nodes, in order to not holding
        c->bucket_lock for too long time, only BTREE_FLUSH_NR nodes are
        selected and to flush in following for-loop.
      With this patch, only btree nodes referencing oldest journal entry
      are flushed to cache device, no aggressive flushing for  unnecessary
      btree node any more. And in order to avoid blocking regluar I/O
      requests, each time when btree_flush_write() called, at most only
      BTREE_FLUSH_NR btree nodes are selected to flush, even there are more
      maching btree nodes in list c->btree_cache.
      
      At last, one more thing to explain: Why it is safe to read front point
      of c->journal.pin without holding c->journal.lock inside the
      list_for_each_entry_safe_reverse() loop ?
      
      Here is my answer: When reading the front point of fifo c->journal.pin,
      we don't need to know the exact value of front point, we just want to
      check whether the value is different from the original front point
      (which is accurate value because we get it while c->jouranl.lock is
      held). For such purpose, it works as expected without holding
      c->journal.lock. Even the front point is changed on other CPU core and
      not updated to local core, and current iterating btree node has
      identical journal entry local as original fetched fifo front point, it
      is still safe. Because after holding mutex b->write_lock (with memory
      barrier) this btree node can be found as clean and skipped, the loop
      will quite latter when iterate on next node of list c->btree_cache.
      
      Fixes: 91be66e1 ("bcache: performance improvement for btree_flush_write()")
      Reported-by: NGuoju Fang <fangguoju@gmail.com>
      Reported-by: NShuang Li <psymon@bonuscloud.io>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      2aa8c529
    • C
      bcache: add code comments for state->pool in __btree_sort() · 7a0bc2a8
      Coly Li 提交于
      To explain the pages allocated from mempool state->pool can be
      swapped in __btree_sort(), because state->pool is a page pool,
      which allocates pages by alloc_pages() indeed.
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      7a0bc2a8
    • C
      bcache: use read_cache_page_gfp to read the superblock · 6321bef0
      Christoph Hellwig 提交于
      Avoid a pointless dependency on buffer heads in bcache by simply open
      coding reading a single page.  Also add a SB_OFFSET define for the
      byte offset of the superblock instead of using magic numbers.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      6321bef0
    • C
      bcache: store a pointer to the on-disk sb in the cache and cached_dev structures · 475389ae
      Christoph Hellwig 提交于
      This allows to properly build the superblock bio including the offset in
      the page using the normal bio helpers.  This fixes writing the superblock
      for page sizes larger than 4k where the sb write bio would need an offset
      in the bio_vec.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      475389ae
    • C
      bcache: return a pointer to the on-disk sb from read_super · cfa0c56d
      Christoph Hellwig 提交于
      Returning the properly typed actual data structure insteaf of the
      containing struct page will save the callers some work going
      forward.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      cfa0c56d
    • C
      bcache: transfer the sb_page reference to register_{bdev,cache} · fc8f19cc
      Christoph Hellwig 提交于
      Avoid an extra reference count roundtrip by transferring the sb_page
      ownership to the lower level register helpers.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      fc8f19cc
    • C
      bcache: fix use-after-free in register_bcache() · ae3cd299
      Coly Li 提交于
      The patch "bcache: rework error unwinding in register_bcache" introduces
      a use-after-free regression in register_bcache(). Here are current code,
      	2510 out_free_path:
      	2511         kfree(path);
      	2512 out_module_put:
      	2513         module_put(THIS_MODULE);
      	2514 out:
      	2515         pr_info("error %s: %s", path, err);
      	2516         return ret;
      If some error happens and the above code path is executed, at line 2511
      path is released, but referenced at line 2515. Then KASAN reports a use-
      after-free error message.
      
      This patch changes line 2515 in the following way to fix the problem,
      	2515         pr_info("error %s: %s", path?path:"", err);
      Signed-off-by: NColy Li <colyli@suse.de>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      ae3cd299
    • C
      bcache: properly initialize 'path' and 'err' in register_bcache() · 29cda393
      Coly Li 提交于
      Patch "bcache: rework error unwinding in register_bcache" from
      Christoph Hellwig changes the local variables 'path' and 'err'
      in undefined initial state. If the code in register_bcache() jumps
      to label 'out:' or 'out_module_put:' by goto, these two variables
      might be reference with undefined value by the following line,
      
      	out_module_put:
      	        module_put(THIS_MODULE);
      	out:
      	        pr_info("error %s: %s", path, err);
      	        return ret;
      
      Therefore this patch initializes these two local variables properly
      in register_bcache() to avoid such issue.
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      29cda393
    • C
      bcache: rework error unwinding in register_bcache · 50246693
      Christoph Hellwig 提交于
      Split the successful and error return path, and use one goto label for each
      resource to unwind.  This also fixes some small errors like leaking the
      module reference count in the reboot case (which seems entirely harmless)
      or printing the wrong warning messages for early failures.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      50246693
    • C
      bcache: use a separate data structure for the on-disk super block · a702a692
      Christoph Hellwig 提交于
      Split out an on-disk version struct cache_sb with the proper endianness
      annotations.  This fixes a fair chunk of sparse warnings, but there are
      some left due to the way the checksum is defined.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      a702a692
    • L
      bcache: cached_dev_free needs to put the sb page · e8547d42
      Liang Chen 提交于
      Same as cache device, the buffer page needs to be put while
      freeing cached_dev.  Otherwise a page would be leaked every
      time a cached_dev is stopped.
      Signed-off-by: NLiang Chen <liangchen.linux@gmail.com>
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NColy Li <colyli@suse.de>
      Signed-off-by: NJens Axboe <axboe@kernel.dk>
      e8547d42
  3. 17 1月, 2020 1 次提交
    • M
      dm writecache: improve performance of large linear writes on SSDs · dcd19507
      Mikulas Patocka 提交于
      When dm-writecache is used with SSD as a cache device, it would submit a
      separate bio for each written block. The I/Os would be merged by the disk
      scheduler, but this merging degrades performance.
      
      Improve dm-writecache performance by submitting larger bios - this is
      possible as long as there is consecutive free space on the cache
      device.
      
      Benchmark (arm64 with 64k page size, using /dev/ram0 as a cache device):
      
      fio --bs=512k --iodepth=32 --size=400M --direct=1 \
          --filename=/dev/mapper/cache --rw=randwrite --numjobs=1 --name=test
      
      block	old	new
      size	MiB/s	MiB/s
      ---------------------
      512	181	700
      1k	347	1256
      2k	644	2020
      4k	1183	2759
      8k	1852	3333
      16k	2469	3509
      32k	2974	3670
      64k	3404	3810
      Signed-off-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      dcd19507
  4. 16 1月, 2020 1 次提交
  5. 15 1月, 2020 9 次提交
    • A
      dm mpath: Add timeout mechanism for queue_if_no_path · be240ff5
      Anatol Pomazau 提交于
      Add a configurable timeout mechanism to disable queue_if_no_path without
      assistance from userspace multipathd.  This reimplements multipathd's
      no_path_retry mechanism in kernel space.  This is motivated by the
      desire to prevent processes from hanging indefinitely waiting for IO
      in cases where multipathd might be unable to respond (after a failure
      or for whatever reason).
      
      Despite replicating userspace multipathd's policy configuration in
      kernel space, it is important to prevent IOs from hanging forever,
      waiting for userspace that may be incapable of behaving correctly.
      
      Use of the provided "queue_if_no_path_timeout_secs" dm-multipath
      module parameter is optional.  This timeout mechanism is disabled by
      default (by being set to 0).
      Signed-off-by: NAnatol Pomazau <anatol@google.com>
      Co-developed-by: NGabriel Krisman Bertazi <krisman@collabora.com>
      Signed-off-by: NGabriel Krisman Bertazi <krisman@collabora.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      be240ff5
    • M
      dm thin: change data device's flush_bio to be member of struct pool · f06c03d1
      Mikulas Patocka 提交于
      With commit fe64369163c5 ("dm thin: don't allow changing data device
      during thin-pool load") it is now possible to re-parent the data
      device's flush_bio from the pool_c to pool structure.  Doing so offers
      improved lifetime guarantees for the flush_bio so that the call to
      dm_pool_register_pre_commit_callback can now be done safely from
      pool_ctr().
      
      Depends-on: fe64369163c5 ("dm thin: don't allow changing data device during thin-pool load")
      Signed-off-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      f06c03d1
    • M
      dm thin: don't allow changing data device during thin-pool reload · 873937e7
      Mikulas Patocka 提交于
      The existing code allows changing the data device when the thin-pool
      target is reloaded.
      
      This capability is not required and only complicates device lifetime
      guarantees. This can cause crashes like the one reported here:
      	https://bugzilla.redhat.com/show_bug.cgi?id=1788596
      where the kernel tries to issue a flush bio located in a structure that
      was already freed.
      
      Take the first step to simplifying the thin-pool's data device lifetime
      by disallowing changing it. Like the thin-pool's metadata device, the
      data device is now set in pool_create() and it cannot be changed for a
      given thin-pool.
      Signed-off-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      873937e7
    • M
      dm thin: fix use-after-free in metadata_pre_commit_callback · a4a8d286
      Mike Snitzer 提交于
      dm-thin uses struct pool to hold the state of the pool. There may be
      multiple pool_c's pointing to a given pool, each pool_c represents a
      loaded target. pool_c's may be created and destroyed arbitrarily and the
      pool contains a reference count of pool_c's pointing to it.
      
      Since commit 694cfe7f ("dm thin: Flush data device before
      committing metadata") a pointer to pool_c is passed to
      dm_pool_register_pre_commit_callback and this function stores it in
      pmd->pre_commit_context. If this pool_c is freed, but pool is not
      (because there is another pool_c referencing it), we end up in a
      situation where pmd->pre_commit_context structure points to freed
      pool_c. It causes a crash in metadata_pre_commit_callback.
      
      Fix this by moving the dm_pool_register_pre_commit_callback() from
      pool_ctr() to pool_preresume(). This way the in-core thin-pool metadata
      is only ever armed with callback data whose lifetime matches the
      active thin-pool target.
      
      In should be noted that this fix preserves the ability to load a
      thin-pool table that uses a different data block device (that contains
      the same data) -- though it is unclear if that capability is still
      useful and/or needed.
      
      Fixes: 694cfe7f ("dm thin: Flush data device before committing metadata")
      Cc: stable@vger.kernel.org
      Reported-by: NZdenek Kabelac <zkabelac@redhat.com>
      Reported-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      a4a8d286
    • M
      dm thin metadata: use pool locking at end of dm_pool_metadata_close · 44d8ebf4
      Mike Snitzer 提交于
      Ensure that the pool is locked during calls to __commit_transaction and
      __destroy_persistent_data_objects.  Just being consistent with locking,
      but reality is dm_pool_metadata_close is called once pool is being
      destroyed so access to pool shouldn't be contended.
      
      Also, use pmd_write_lock_in_core rather than __pmd_write_lock in
      dm_pool_commit_metadata and rename __pmd_write_lock to
      pmd_write_lock_in_core -- there was no need for the alias.
      
      In addition, verify that the pool is locked in __commit_transaction().
      
      Fixes: 873f258b ("dm thin metadata: do not write metadata if no changes occurred")
      Cc: stable@vger.kernel.org
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      44d8ebf4
    • M
      dm writecache: fix incorrect flush sequence when doing SSD mode commit · aa950920
      Mikulas Patocka 提交于
      When committing state, the function writecache_flush does the following:
      1. write metadata (writecache_commit_flushed)
      2. flush disk cache (writecache_commit_flushed)
      3. wait for data writes to complete (writecache_wait_for_ios)
      4. increase superblock seq_count
      5. write the superblock
      6. flush disk cache
      
      It may happen that at step 3, when we wait for some write to finish, the
      disk may report the write as finished, but the write only hit the disk
      cache and it is not yet stored in persistent storage. At step 5 we write
      the superblock - it may happen that the superblock is written before the
      write that we waited for in step 3. If the machine crashes, it may result
      in incorrect data being returned after reboot.
      
      In order to fix the bug, we must swap steps 2 and 3 in the above sequence,
      so that we first wait for writes to complete and then flush the disk
      cache.
      
      Fixes: 48debafe ("dm: add writecache target")
      Cc: stable@vger.kernel.org # 4.18+
      Signed-off-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      aa950920
    • M
      dm crypt: fix benbi IV constructor crash if used in authenticated mode · 4ea9471f
      Milan Broz 提交于
      If benbi IV is used in AEAD construction, for example:
        cryptsetup luksFormat <device> --cipher twofish-xts-benbi --key-size 512 --integrity=hmac-sha256
      the constructor uses wrong skcipher function and crashes:
      
       BUG: kernel NULL pointer dereference, address: 00000014
       ...
       EIP: crypt_iv_benbi_ctr+0x15/0x70 [dm_crypt]
       Call Trace:
        ? crypt_subkey_size+0x20/0x20 [dm_crypt]
        crypt_ctr+0x567/0xfc0 [dm_crypt]
        dm_table_add_target+0x15f/0x340 [dm_mod]
      
      Fix this by properly using crypt_aead_blocksize() in this case.
      
      Fixes: ef43aa38 ("dm crypt: add cryptographic data integrity protection (authenticated encryption)")
      Cc: stable@vger.kernel.org # v4.12+
      Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=941051Reported-by: NJerad Simpson <jbsimpson@gmail.com>
      Signed-off-by: NMilan Broz <gmazyland@gmail.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      4ea9471f
    • M
      dm crypt: Implement Elephant diffuser for Bitlocker compatibility · bbb16584
      Milan Broz 提交于
      Add experimental support for BitLocker encryption with CBC mode and
      additional Elephant diffuser.
      
      The mode was used in older Windows systems and it is provided mainly
      for compatibility reasons. The userspace support to activate these
      devices is being added to cryptsetup utility.
      
      Read-write activation of such a device is very simple, for example:
        echo <password> | cryptsetup bitlkOpen bitlk_image.img test
      
      The Elephant diffuser uses two rotations in opposite direction for
      data (Diffuser A and B) and also XOR operation with Sector key over
      the sector data; Sector key is derived from additional key data. The
      original public documentation is available here:
        http://download.microsoft.com/download/0/2/3/0238acaf-d3bf-4a6d-b3d6-0a0be4bbb36e/bitlockercipher200608.pdf
      
      The dm-crypt implementation is embedded to "elephant" IV (similar to
      tcw IV construction).
      
      Because we cannot modify original bio data for write (before
      encryption), an additional internal flag to pre-process data is
      added.
      Signed-off-by: NMilan Broz <gmazyland@gmail.com>
      Reviewed-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      bbb16584
    • J
      dm space map common: fix to ensure new block isn't already in use · 4feaef83
      Joe Thornber 提交于
      The space-maps track the reference counts for disk blocks allocated by
      both the thin-provisioning and cache targets.  There are variants for
      tracking metadata blocks and data blocks.
      
      Transactionality is implemented by never touching blocks from the
      previous transaction, so we can rollback in the event of a crash.
      
      When allocating a new block we need to ensure the block is free (has
      reference count of 0) in both the current and previous transaction.
      Prior to this fix we were doing this by searching for a free block in
      the previous transaction, and relying on a 'begin' counter to track
      where the last allocation in the current transaction was.  This
      'begin' field was not being updated in all code paths (eg, increment
      of a data block reference count due to breaking sharing of a neighbour
      block in the same btree leaf).
      
      This fix keeps the 'begin' field, but now it's just a hint to speed up
      the search.  Instead the current transaction is searched for a free
      block, and then the old transaction is double checked to ensure it's
      free.  Much simpler.
      
      This fixes reports of sm_disk_new_block()'s BUG_ON() triggering when
      DM thin-provisioning's snapshots are heavily used.
      Reported-by: NEric Wheeler <dm-devel@lists.ewheeler.net>
      Cc: stable@vger.kernel.org
      Signed-off-by: NJoe Thornber <ejt@redhat.com>
      Signed-off-by: NMike Snitzer <snitzer@redhat.com>
      4feaef83
  6. 14 1月, 2020 12 次提交
  7. 08 1月, 2020 2 次提交