17 Oct, 2009

1 commit


11 Sep, 2009

1 commit

  • Commit b8313b6da7e2e7c7f47d93d8561969a3ff9ba0ea ("dm log: remove incorrect
    field from userspace table output") added a call to strstr() with a
    single-character "needle" string parameter.

    Unfortunately some versions of gcc replace such calls to strstr() by calls
    to strchr() behind our back. This causes linking errors if strchr() is
    defined as an inline function in (e.g. on m68k):

    | WARNING: "strchr" [drivers/md/dm-log-userspace.ko] undefined!

    Avoid this by explicitly calling strchr() instead.

    Signed-off-by: Geert Uytterhoeven
    Cc: stable@kernel.org
    Signed-off-by: Linus Torvalds

    Geert Uytterhoeven
     

05 Sep, 2009

3 commits

  • Device-mapper userspace logs (like the clustered log) are
    identified by a universally unique identifier (UUID). This
    identifier is used to associate requests from the kernel to
    a specific log in userspace. The UUID must be unique everywhere,
    since multiple machines may use this identifier when communicating
    about a particular log, as is the case for cluster logs.

    Sometimes, device-mapper/LVM may re-use a UUID. This is the
    case during pvmoves, when moving from one segment of an LV
    to another, or when resizing a mirror, etc. In these cases,
    a new log is created with the same UUID and loaded in the
    "inactive" slot. When a device-mapper "resume" is issued,
    the "live" table is deactivated and the new "inactive" table
    becomes "live". (The "inactive" table can also be removed
    via a device-mapper 'clear' command.)

    The above two issues were colliding. More than one log was being
    created with the same UUID, and there was no way to distinguish
    between them. So, sometimes the wrong log would be swapped
    out during the exchange.

    The solution is to create a locally unique identifier,
    'luid', to go along with the UUID. This new identifier is used
    to determine exactly which log is being referenced by the kernel
    when the log exchange is made. The identifier is not
    universally safe, but it does not need to be, since
    create/destroy/suspend/resume operations are bound to a specific
    machine; and these are the operations that make up the exchange.

    Signed-off-by: Jonathan Brassow
    Signed-off-by: Alasdair G Kergon

    Jonathan Brassow
     
  • The output of 'dmsetup table' includes an internal field that should not
    be there. This patch removes it. To make the fix simpler, we first
    reorder a constructor argument

    The 'device size' argument is generated internally. Currently it is
    placed as the last space-separated word of the constructor string.
    However, we need to use a version of the string without this word, so we
    move it to the beginning instead so it is trivial to skip past it.

    We keep a copy of the arguments passed to userspace for creating a log,
    just in case we need to resend them. These are the same arguments that
    are desired in the STATUSTYPE_TABLE request, except for one. When
    creating the userspace log, the userspace daemon must know the size of
    the mirror, so that is added to the arguments given in the constructor
    table. We were printing this extra argument out as well, which is a
    mistake.

    Signed-off-by: Jonathan Brassow
    Signed-off-by: Alasdair G Kergon

    Jonathan Brassow
     
  • Fix 'dmsetup table' output.

    There is a missing ' ' at the end of the string causing two
    words to run together.

    Signed-off-by: Jonathan Brassow
    Signed-off-by: Alasdair G Kergon

    Jonathan Brassow
     

22 Jun, 2009

1 commit

  • This patch contains a device-mapper mirror log module that forwards
    requests to userspace for processing.

    The structures used for communication between kernel and userspace are
    located in include/linux/dm-log-userspace.h. Due to the frequency,
    diversity, and 2-way communication nature of the exchanges between
    kernel and userspace, 'connector' was chosen as the interface for
    communication.

    The first log implementations written in userspace - "clustered-disk"
    and "clustered-core" - support clustered shared storage. A userspace
    daemon (in the LVM2 source code repository) uses openAIS/corosync to
    process requests in an ordered fashion with the rest of the nodes in the
    cluster so as to prevent log state corruption. Other implementations
    with no association to LVM or openAIS/corosync, are certainly possible.

    (Imagine if two machines are writing to the same region of a mirror.
    They would both mark the region dirty, but you need a cluster-aware
    entity that can handle properly marking the region clean when they are
    done. Otherwise, you might clear the region when the first machine is
    done, not the second.)

    Signed-off-by: Jonathan Brassow
    Cc: Evgeniy Polyakov
    Signed-off-by: Alasdair G Kergon

    Jonthan Brassow