10 Oct, 2007

1 commit

  • As bi_end_io is only called once when the reqeust is complete,
    the 'size' argument is now redundant. Remove it.

    Now there is no need for bio_endio to subtract the size completed
    from bi_size. So don't do that either.

    While we are at it, change bi_end_io to return void.

    Signed-off-by: Neil Brown
    Signed-off-by: Jens Axboe

    NeilBrown
     

13 Jul, 2007

3 commits

  • This patch causes device-mapper to reject any barrier requests. This is done
    since most of the targets won't handle this correctly anyway. So until the
    situation improves it is better to reject these requests at the first place.
    Since barrier requests won't get to the targets, the checks there can be
    removed.

    Cc: stable@kernel.org
    Signed-off-by: Stefan Bader
    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Linus Torvalds

    Stefan Bader
     
  • Allow invalid snapshots to be activated instead of failing.

    This allows userspace to reinstate any given snapshot state - for
    example after an unscheduled reboot - and clean up the invalid snapshot
    at its leisure.

    Cc: stable@kernel.org
    Signed-off-by: Milan Broz
    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Linus Torvalds

    Milan Broz
     
  • Use new KMEM_CACHE() macro and make the newly-exposed structure names more
    meaningful. Also remove some superfluous casts and inlines (let a modern
    compiler be the judge).

    Acked-by: Christoph Lameter
    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     

09 Dec, 2006

3 commits


08 Dec, 2006

1 commit

  • Replace all uses of kmem_cache_t with struct kmem_cache.

    The patch was generated using the following script:

    #!/bin/sh
    #
    # Replace one string by another in all the kernel sources.
    #

    set -e

    for file in `find * -name "*.c" -o -name "*.h"|xargs grep -l $1`; do
    quilt add $file
    sed -e "1,\$s/$1/$2/g" $file >/tmp/$$
    mv /tmp/$$ $file
    quilt refresh
    done

    The script was run like this

    sh replace kmem_cache_t "struct kmem_cache"

    Signed-off-by: Christoph Lameter
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Christoph Lameter
     

22 Nov, 2006

1 commit


03 Oct, 2006

8 commits

  • If a snapshot became invalid while there are outstanding pending_exceptions,
    when pending_complete() processes each one it forgets to remove the
    corresponding exception from its exception table before freeing it.

    Fix this by moving the 'out:' label up one statement so that
    remove_exception() is always called. Then __invalidate_exception() no longer
    needs to call it and its 'pe' argument become superfluous.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • Rename sibling_count to ref_count and introduce get and put functions.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • Add a workqueue so that I/O can be queued up to be flushed from a separate
    thread (e.g. if local interrupts are disabled).

    A new per-snapshot spinlock pe_lock is introduced to protect queued_bios.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Mark McLoughlin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • This patch rearranges the pending_complete() code so that the functional
    changes in subsequent patches are clearer.

    By consolidating the error and the non-error paths, we can move
    error_snapshot_bios() and __flush_bios() in line.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Mark McLoughlin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • This patch rearranges the snapshot_map code so that the functional changes in
    subsequent patches are clearer.

    The only functional change is to replace the existing read lock with a write
    lock which the next patch needs.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • Fix the error handling when store.read_metadata is called: the error should be
    returned immediately.

    Signed-off-by: Mark McLoughlin
    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mark McLoughlin
     
  • The chunk size of snapshots cannot be changed so it is redundant to require it
    as a parameter when activating an existing snapshot. Allow a value of zero in
    this case and ignore it. For a new snapshot, use a default value if zero is
    specified.

    Signed-off-by: Mark McLoughlin
    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mark McLoughlin
     
  • Fix ENOMEM error sign.

    Signed-off-by: Milan Broz
    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Milan Broz
     

01 Jul, 2006

1 commit


27 Jun, 2006

2 commits

  • Tidy device-mapper error messages to include context information
    automatically.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • Persistent snapshots currently store a private copy of the chunk size.
    Userspace also supplies the chunk size when loading a snapshot. Ensure
    consistency by only storing the chunk_size in one place instead of two.

    Currently the two sizes will differ if the chunk size supplied by userspace
    does not match the chunk size an existing snapshot actually uses. Amongst
    other problems, this causes an incorrect 'percentage full' to be reported.

    The patch ensures consistency by only storing the chunk_size in one place,
    removing it from struct pstore. Some initialisation is delayed until the
    correct chunk_size is known. If read_header() discovers that the wrong chunk
    size was supplied, the 'area' buffer (which the header already got read into)
    is reinitialised to the correct size.

    [akpm: too late for 2.6.17 - suitable for 2.6.17.x after it has settled]

    Signed-off-by: Alasdair G Kergon
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     

28 Mar, 2006

5 commits

  • Before removing a snapshot, wait for the completion of any kcopyd jobs using
    it.

    Do this by maintaining a count (nr_jobs) of how many outstanding jobs each
    kcopyd_client has.

    The snapshot destructor first unregisters the snapshot so that no new kcopyd
    jobs (created by writes to the origin) will reference that particular
    snapshot. kcopyd_client_destroy() is now run next to wait for the completion
    of any outstanding jobs before the snapshot exception structures (that those
    jobs reference) are freed.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • We don't know what type sector_t has. Sometimes it's unsigned long, sometimes
    it's unsigned long long. For example on ppc64 it's unsigned long with
    CONFIG_LBD=n and on x86_64 it's unsigned long long with CONFIG_LBD=n.

    The way to handle all of this is to always use unsigned long long and to
    always typecast the sector_t when printing it.

    Acked-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     
  • When a snapshot becomes invalid, s->valid is set to 0. In this state, a
    snapshot can no longer be accessed.

    When s->lock is acquired, before doing anything else, s->valid must be checked
    to ensure the snapshot remains valid.

    This patch eliminates some races (that may cause panics) by adding some
    missing checks. At the same time, some unnecessary levels of indentation are
    removed and snapshot invalidation is moved into a single function that always
    generates a device-mapper event.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • The siblings "list" is used unsafely at the moment.

    Firstly, only the element on the list being changed gets locked (via the
    snapshot lock), not the next and previous elements which have pointers that
    are also being changed.

    Secondly, if you have two or more snapshots and write to the same chunk a
    second time before every snapshot has finished making its private copy of the
    data, if you're unlucky, _origin_write() could attempt its list_merge() and
    dereference a 'last' pointer to a pending_exception structure that has just
    been freed.

    Analysis reveals that the list is actually only there for reference counting.
    If 5 pending_exceptions are needed in origin_write, then the 5 are joined
    together into a 5-element list - without a separate list head because there's
    nowhere suitable to store it. As the pending_exceptions complete, they are
    removed from the list one-by-one and any contents of origin_bios get moved
    across to one of the remaining pending_exceptions on the list. Whichever one
    is last is detected because list_empty() is then true and the origin_bios get
    submitted.

    The fix proposed here uses an alternative reference counting mechanism by
    choosing one of the pending_exceptions as primary and maintaining an atomic
    counter there.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • Say you have several snapshots of the same origin and then you issue a write
    to some place in the origin for the first time.

    Before the device-mapper snapshot target lets the write go through to the
    underlying device, it needs to make a copy of the data that is about to be
    overwritten. Each snapshot is independent, so it makes one copy for each
    snapshot.

    __origin_write() loops through each snapshot and checks to see whether a copy
    is needed for that snapshot. (A copy is only needed the first time that data
    changes.)

    If a copy is needed, the code allocates a 'pending_exception' structure
    holding the details. It links these together for all the snapshots, then
    works its way through this list and submits the copying requests to the kcopyd
    thread by calling start_copy(). When each request is completed, the original
    pending_exception structure gets freed in pending_complete().

    If you're very unlucky, this structure can get freed *before* the submission
    process has finished walking the list.

    This patch:

    1) Creates a new temporary list pe_queue to hold the pending exception
    structures;

    2) Does all the bookkeeping up-front, then walks through the new list
    safely and calls start_copy() for each pending_exception that needed it;

    3) Avoids attempting to add pe->siblings to the list if it's already
    connected.

    [NB This does not fix all the races in this code. More patches will follow.]

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     

27 Mar, 2006

1 commit

  • Modify well over a dozen mempool users to call mempool_create_slab_pool()
    rather than calling mempool_create() with extra arguments, saving about 30
    lines of code and increasing readability.

    Signed-off-by: Matthew Dobson
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Matthew Dobson
     

02 Feb, 2006

2 commits

  • The snapshot and origin targets are incapable of handling barriers and need to
    indicate this.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     
  • Move snapshot metadata loading to happen when the table is created instead of
    when the device is resumed. Writes to the origin device don't trigger
    exceptions until each snapshot table becomes active when resume() is called on
    each snapshot.

    If you're using lvm2, for this patch to work properly you should update to
    lvm2 version 2.02.01 or later and device-mapper version 1.02.02 or later.

    Signed-off-by: Alasdair G Kergon
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alasdair G Kergon
     

15 Jan, 2006

1 commit


07 Jan, 2006

1 commit


13 Jul, 2005

2 commits


17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds