1. 11 10月, 2012 2 次提交
  2. 02 8月, 2012 1 次提交
    • N
      md/raid1: submit IO from originating thread instead of md thread. · f54a9d0e
      NeilBrown 提交于
      queuing writes to the md thread means that all requests go through the
      one processor which may not be able to keep up with very high request
      rates.
      
      So use the plugging infrastructure to submit all requests on unplug.
      If a 'schedule' is needed, we fall back on the old approach of handing
      the requests to the thread for it to handle.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      f54a9d0e
  3. 22 5月, 2012 22 次提交
    • N
      md/bitmap: record the space available for the bitmap in the superblock. · 1dff2b87
      NeilBrown 提交于
      Now that bitmaps can grow and shrink it is best if we record
      how much space is available.  This means that when
      we reduce the size of the bitmap we won't "lose" the space
      for late when we might want to increase the size of the bitmap
      again.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      1dff2b87
    • N
      md/bitmap: make sure reshape request are reflected in superblock. · b81a0404
      NeilBrown 提交于
      As a reshape may change the sync_size and/or chunk_size, we need
      to update these whenever we write out the bitmap superblock.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      b81a0404
    • N
      md/bitmap: add bitmap_resize function to allow bitmap resizing. · d60b479d
      NeilBrown 提交于
      This function will allocate the new data structures and copy
      bits across from old to new, allowing for the possibility that the
      chunksize has changed.
      
      Use the same function for performing the initial allocation
      of the structures.  This improves test coverage.
      
      When bitmap_resize is used to resize an existing bitmap, it
      only copies '1' bits in, not '0' bits.
      So when allocating the bitmap, ensure everything is initialised
      to ZERO.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      d60b479d
    • N
      md/bitmap: use DIV_ROUND_UP instead of open-code · 15702d7f
      NeilBrown 提交于
      Also take the opportunity to simplify CHUNK_BLOCK_RATIO.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      15702d7f
    • N
      md/bitmap: create a 'struct bitmap_counts' substructure of 'struct bitmap' · 40cffcc0
      NeilBrown 提交于
      The new "struct bitmap_counts" contains all the fields that are
      related to counting the number of active writes in each bitmap chunk.
      
      Having this separate will make it easier to change the chunksize
      or overall size of a bitmap atomically.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      40cffcc0
    • N
      md/bitmap: make bitmap bitops atomic. · 63c68268
      NeilBrown 提交于
      This allows us to remove spinlock protection which is
      more heavy-weight than simple atomics.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      63c68268
    • N
      md/bitmap: make _page_attr bitops atomic. · bdfd1140
      NeilBrown 提交于
      Using e.g. set_bit instead of __set_bit and using test_and_clear_bit
      allow us to remove some locking and contract other locked ranges.
      
      It is rare that we set or clear a lot of these bits, so gain should
      outweigh any cost.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      bdfd1140
    • N
      md/bitmap: merge bitmap_file_unmap and bitmap_file_put. · fae7d326
      NeilBrown 提交于
      There functions really do one thing together: release the
      'bitmap_storage'.  So make them just one function.
      
      Since we removed the locking (previous patch), we don't need to zero
      any fields before freeing them, so it all becomes a bit simpler.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      fae7d326
    • N
      md/bitmap: remove async freeing of bitmap file. · 62f82faa
      NeilBrown 提交于
      There is no real value in freeing things the moment there is an error.
      It is just as good to free the bitmap file and pages when the bitmap
      is explicitly removed (and replaced?) or at shutdown.
      
      With this gone, the bitmap will only disappear when the array is
      quiescent, so we can remove some locking.
      
      As the 'filemap' doesn't disappear now, include extra checks before
      trying to write any of it out.
      Also remove the check for "has it disappeared" in
      bitmap_daemon_write().
      Signed-off-by: NNeilBrown <neilb@suse.de>
      62f82faa
    • N
      md/bitmap: convert some spin_lock_irqsave to spin_lock_irq · 74667123
      NeilBrown 提交于
      All of these sites can only be called from process context with
      irqs enabled, so using irqsave/irqrestore just adds noise.
      Remove it.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      74667123
    • N
      md/bitmap: use set_bit, test_bit, etc for operation on bitmap->flags. · b405fe91
      NeilBrown 提交于
      We currently use '&' and '|' which isn't the norm in the kernel
      and doesn't allow easy atomicity.
      So change to bit numbers and {set,clear,test}_bit.
      This allows us to remove a spinlock/unlock (which was dubious anyway)
      and some other simplifications.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      b405fe91
    • N
      md/bitmap: remove single-bit manipulation on sb->state · 84e92345
      NeilBrown 提交于
      Just do single-bit manipulations on bitmap->flags and copy whole
      value between that and sb->state.
      
      This will allow next patch which changes how bit manipulations are
      performed on bitmap->flags.
      
      This does result in BITMAP_STALE not being set in sb by
      bitmap_read_sb, however as the setting is determined by other
      information in the 'sb' we do not lose information this way.
      Normally, bitmap_load will be called shortly which will clear
      BITMAP_STALE anyway.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      84e92345
    • N
      md/bitmap: remove bitmap_mask_state · edbb79df
      NeilBrown 提交于
      This function isn't really needed.  It sets or clears a flag in both
      bitmap->flags and sb->state.
      However both times it is called, bitmap_update_sb is called soon
      afterwards which copies bitmap->flags to sb->state.
      So just make changes to bitmap->flags, and open-code those rather than
      hiding in a function.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      edbb79df
    • N
      md/bitmap: move storage allocation from bitmap_load to bitmap_create. · bc9891a8
      NeilBrown 提交于
      We should allocate memory for the storage-bitmap at create-time, not
      load time.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      bc9891a8
    • N
      md/bitmap: separate bitmap file allocation to its own function. · d1244cb0
      NeilBrown 提交于
      This will allow allocation before swapping in a new bitmap.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      d1244cb0
    • N
      md/bitmap: store bytes in file rather than just in last page. · 9b1215c1
      NeilBrown 提交于
      This number is more generally useful, and bytes-in-last-page is
      easily extracted from it.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      9b1215c1
    • N
      md/bitmap: move some fields of 'struct bitmap' into a 'storage' substruct. · 1ec885cd
      NeilBrown 提交于
      This new 'struct bitmap_storage' reflects the external storage of the
      bitmap.
      Having this clearly defined will make it easier to change the storage
      used while the array is active.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      1ec885cd
    • N
      md/bitmap: change *_page_attr() to take a page number, not a page. · d189122d
      NeilBrown 提交于
      Most often we have the page number, not the page.  And that is what
      the  *_page_attr() functions really want.  So change the arguments to
      take that number.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      d189122d
    • N
      md/bitmap: centralise allocation of bitmap file pages. · 27581e5a
      NeilBrown 提交于
      Instead of allocating pages in read_sb_page, read_page and
      bitmap_read_sb, allocate them all in bitmap_init_from disk.
      
      Also replace the hack of calling "attach_page_buffers(page, NULL)" to
      ensure that free_buffer() won't complain, by putting a test for
      PagePrivate in free_buffer().
      Signed-off-by: NNeilBrown <neilb@suse.de>
      27581e5a
    • N
      md/bitmap: allow a bitmap with no backing storage. · ef99bf48
      NeilBrown 提交于
      An md bitmap comprises two parts
       - internal counting of active writes per 'chunk'.
       - external storage of whether there are any active writes on
         each chunk
      
      The second requires the first, but the first doesn't require the
      second.
      
      Not having backing storage means that the bitmap cannot expedite
      resync after a crash, but it still allows us to expedite the recovery
      of a recently-removed device.
      
      So: allow a bitmap to exist even if there is no backing device.
      In that case we default to 128M chunks.
      
      A particular value of this is that we can remove and re-add a bitmap
      (possibly of a different granularity) on a degraded array, and not
      lose the information needed to fast-recover the missing device.
      
      We don't actually activate these bitmaps yet - that will come
      in a later patch.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      ef99bf48
    • N
      md/bitmap: add new 'space' attribute for bitmaps. · 6409bb05
      NeilBrown 提交于
      If we are to allow bitmaps to be resized when the array is resized,
      we need to know how much space there is.
      
      So create an attribute to store this information and set appropriate
      defaults.
      
      It can be set more precisely via sysfs, or future metadata extensions
      may allow it to be recorded.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      6409bb05
    • N
      md/bitmap: disentangle two different 'pending' flags. · bf07bb7d
      NeilBrown 提交于
      There are two different 'pending' concepts in the handling of the
      write intent bitmap.
      
      Firstly, a 'page' from the bitmap (which container PAGE_SIZE*8 bits)
      may have changes (bits cleared) that should be written in due course.
      There is no hurry for these and the page will transition from
      PENDING to NEEDWRITE and will then be written, though if it ever
      becomes DIRTY it will be written much sooner and PENDING will be
      cleared.
      
      Secondly, a page of counters - which contains PAGE_SIZE/2 counters, one
      for each bit, can usefully have a 'pending' flag which indicates if
      any of the counters are low (2 or 1) and ready to be processed by
      bitmap_daemon_work().  If this flag is clear we can skip the whole
      page.
      
      These two concepts are currently combined in the bitmap-file flag.
      This causes a tighter connection between the counters and the bitmap
      file than I would like - as I want to add some flexibility to the
      bitmap file.
      
      So introduce a new flag with the page-of-counters, and rewrite
      bitmap_daemon_work() so that it handles the two different 'pending'
      concepts separately.
      
      This also allows us to clear BITMAP_PAGE_PENDING when we write out
      a dirty page, which may occasionally reduce the number of times we
      write a page.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      bf07bb7d
  4. 04 5月, 2012 1 次提交
  5. 12 4月, 2012 2 次提交
  6. 20 3月, 2012 1 次提交
  7. 19 3月, 2012 7 次提交
  8. 23 12月, 2011 3 次提交
    • N
      md/bitmap: be more consistent when setting new bits in memory bitmap. · 915c420d
      NeilBrown 提交于
      For each active region corresponding to a bit in the bitmap with have
      a 14bit counter (and some flags).
      This counts
         number of active writes + bit in the on-disk bitmap + delay-needed.
      
      The "delay-needed" is because we always want a delay before clearing a
      bit.  So the number here is normally number of active writes plus 2.
      If there have been no writes for a while, we drop to 1.
      If still no writes we clear the bit and drop to 0.
      
      So for consistency, when setting bit from the on-disk bitmap or by
      request from user-space it is best to set the counter to '2' to start
      with.
      
      In particular we might also set the NEEDED_MASK flag at this time, and
      in all other cases NEEDED_MASK is only set when the counter is 2 or
      more.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      915c420d
    • N
      md/bitmap: daemon_work cleanup. · 2e61ebbc
      NeilBrown 提交于
      We have a variable 'mddev' in this function, but repeatedly get the
      same value by dereferencing bitmap->mddev.
      There is room for simplification here...
      Signed-off-by: NNeilBrown <neilb@suse.de>
      2e61ebbc
    • N
      md/bitmap: It is OK to clear bits during recovery. · 961902c0
      NeilBrown 提交于
      commit d0a4bb49 introduced a
      regression which is annoying but fairly harmless.
      
      When writing to an array that is undergoing recovery (a spare
      in being integrated into the array), writing to the array will
      set bits in the bitmap, but they will not be cleared when the
      write completes.
      
      For bits covering areas that have not been recovered yet this is not a
      problem as the recovery will clear the bits.  However bits set in
      already-recovered region will stay set and never be cleared.
      This doesn't risk data integrity.  The only negatives are:
       - next time there is a crash, more resyncing than necessary will
         be done.
       - the bitmap doesn't look clean, which is confusing.
      
      While an array is recovering we don't want to update the
      'events_cleared' setting in the bitmap but we do still want to clear
      bits that have very recently been set - providing they were written to
      the recovering device.
      
      So split those two needs - which previously both depended on 'success'
      and always clear the bit of the write went to all devices.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      961902c0
  9. 23 11月, 2011 1 次提交
    • N
      md/lock: ensure updates to page_attrs are properly locked. · 7c8f4247
      NeilBrown 提交于
      Page attributes are set using __set_bit rather than set_bit as
      it normally called under a spinlock so the extra atomicity is not
      needed.
      
      However there are two places where we might set or clear page
      attributes without holding the spinlock.
      So add the spinlock in those cases.
      
      This might be the cause of occasional reports that bits a aren't
      getting clear properly - theory is that BITMAP_PAGE_PENDING gets lost
      when BITMAP_PAGE_NEEDWRITE is set or cleared.  This is an
      inconvenience, not a threat to data safety.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      7c8f4247