)]}'
{
  "log": [
    {
      "commit": "263c6ca007a6693fb724a24c5a55716c49d33573",
      "tree": "5fce498f80244db3944b3a21bba207572afd2f93",
      "parents": [
        "3591538fb272d2432d112d47d7e0ddd0be4cded2"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Dec 05 10:43:42 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:13:09 2012 -0500"
      },
      "message": "rbd: rename __rbd_update_snaps to __rbd_refresh_header\n\nThis function rereads the entire header and handles any changes in\nit, not just changes in snapshots.\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\nReviewed-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "3591538fb272d2432d112d47d7e0ddd0be4cded2",
      "tree": "11b8dbe116875b4596b8415d0bd7b073f36858d6",
      "parents": [
        "b06e6a6be796bc365a19b0ac5176b553c13abf2f"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Dec 05 18:25:13 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:13:03 2012 -0500"
      },
      "message": "rbd: fix snapshot size type\n\nSnapshot sizes should be the same type as regular image sizes. This\nonly affects their displayed size in sysfs, not the reported size of\nan actual block device sizes.\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\nReviewed-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "b06e6a6be796bc365a19b0ac5176b553c13abf2f",
      "tree": "5a53dceb7eed8932d097ceeb2fcbe9665e7e3b48",
      "parents": [
        "77dfe99fe3cb0b2b0545e19e2d57b7a9134ee3c0"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Nov 21 18:16:52 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:12:58 2012 -0500"
      },
      "message": "rbd: remove conditional snapid parameters\n\nThe snapid parameters passed to rbd_do_op() and rbd_req_sync_op()\nare now always either a valid snapid or an explicit CEPH_NOSNAP.\n\n[elder@dreamhost.com: Rephrased the description]\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\nReviewed-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "77dfe99fe3cb0b2b0545e19e2d57b7a9134ee3c0",
      "tree": "ad80a6b7d9a9be1880c44e3a91f6d42f674c2fd6",
      "parents": [
        "403f24d3d51760a8b9368d595fa5f48c309f1a0f"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Nov 21 13:04:42 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:12:52 2012 -0500"
      },
      "message": "rbd: store snapshot id instead of index\n\nWhen a device was open at a snapshot, and snapshots were deleted or\nadded, data from the wrong snapshot could be read. Instead of\nassuming the snap context is constant, store the actual snap id when\nthe device is initialized, and rely on the OSDs to signal an error\nif we try reading from a snapshot that was deleted.\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\nReviewed-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "403f24d3d51760a8b9368d595fa5f48c309f1a0f",
      "tree": "672324db44b12186b91235f293b971bb00cf377d",
      "parents": [
        "50f7c4c967d0b5acd8e7ba6ab654dc4a7ac869ac"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Dec 05 10:47:13 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:12:46 2012 -0500"
      },
      "message": "rbd: protect read of snapshot sequence number\n\nThis is updated whenever a snapshot is added or deleted, and the\nsnapc pointer is changed with every refresh of the header.\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\nReviewed-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "50f7c4c967d0b5acd8e7ba6ab654dc4a7ac869ac",
      "tree": "a37aa5a2aad9e434bf6b77e0b65601b6e30589b2",
      "parents": [
        "f8ad495a8a0277b88c59bf38319e5e944aaf5a4a"
      ],
      "author": {
        "name": "Xi Wang",
        "email": "xi.wang@gmail.com",
        "time": "Fri Apr 20 15:49:44 2012 -0500"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:12:41 2012 -0500"
      },
      "message": "rbd: fix integer overflow in rbd_header_from_disk()\n\nondisk-\u003esnap_count is read from disk via rbd_req_sync_read() and thus\nneeds validation.  Otherwise, a bogus `snap_count\u0027 could overflow the\nkmalloc() size, leading to memory corruption.\n\nAlso use `u32\u0027 consistently for `snap_count\u0027.\n\n[elder@dreamhost.com: changed to use UINT_MAX rather than ULONG_MAX]\n\nSigned-off-by: Xi Wang \u003cxi.wang@gmail.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "f8ad495a8a0277b88c59bf38319e5e944aaf5a4a",
      "tree": "af5cff21e0e0d9dd944abd1cf9f4da21d46e0f1c",
      "parents": [
        "76aa542fb90e3e91edb1146d10ca7cf2cae8e7e9"
      ],
      "author": {
        "name": "Dan Carpenter",
        "email": "dan.carpenter@oracle.com",
        "time": "Fri Apr 20 15:49:44 2012 -0500"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Mon May 14 12:12:35 2012 -0500"
      },
      "message": "rbd: use gfp_flags parameter in rbd_header_from_disk()\n\nWe should use the gfp_flags that the caller specified instead of\nGFP_KERNEL here.\n\nThere is only one caller and it uses GFP_KERNEL, so this change is\njust a cleanup and doesn\u0027t change how the code works.\n\nSigned-off-by: Dan Carpenter \u003cdan.carpenter@oracle.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "3469ac1aa3a2f1e2586a412923c414779a0af854",
      "tree": "b271456518130622e6d394cf50939c132f1a1d0d",
      "parents": [
        "cd9d9f5df6098c50726200d4185e9e8da32785b3"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@inktank.com",
        "time": "Mon May 07 15:33:36 2012 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@inktank.com",
        "time": "Mon May 07 15:33:36 2012 -0700"
      },
      "message": "ceph: drop support for preferred_osd pgs\n\nThis was an ill-conceived feature that has been removed from Ceph.  Do\nthis gracefully:\n\n - reject attempts to specify a preferred_osd via the ioctl\n - stop exposing this information via virtual xattrs\n - always fill in -1 for requests, in case we talk to an older server\n - don\u0027t calculate preferred_osd placements/pgids\n\nReviewed-by: Alex Elder \u003celder@inktank.com\u003e\nSigned-off-by: Sage Weil \u003csage@inktank.com\u003e\n"
    },
    {
      "commit": "cd9d9f5df6098c50726200d4185e9e8da32785b3",
      "tree": "94e4c7035fc7c7f6596a8f3b59fa27e19a45d4f0",
      "parents": [
        "c666601a935b94cc0f3310339411b6940de751ba"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Wed Apr 04 13:35:44 2012 -0500"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Apr 05 15:43:58 2012 -0500"
      },
      "message": "rbd: don\u0027t hold spinlock during messenger flush\n\nA recent change made changes to the rbd_client_list be protected by\na spinlock.  Unfortunately in rbd_put_client(), the lock is taken\nbefore possibly dropping the last reference to an rbd_client, and on\nthe last reference that eventually calls flush_workqueue() which can\nsleep.\n\nThe problem was flagged by a debug spinlock warning:\n    BUG: spinlock wrong CPU on CPU#3, rbd/27814\n\nThe solution is to move the spinlock acquisition and release inside\nrbd_client_release(), which is the spot where it\u0027s really needed for\nprotecting the removal of the rbd_client from the client list.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nReviewed-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "c666601a935b94cc0f3310339411b6940de751ba",
      "tree": "da8afdd9c553dc349f1a1cdd94ab05d4b5dc5449",
      "parents": [
        "3489b42a72a41d477665ab37f196ae9257180abb"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Nov 21 17:11:12 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:52 2012 -0500"
      },
      "message": "rbd: move snap_rwsem to the device, rename to header_rwsem\n\nA new temporary header is allocated each time the header changes, but\nonly the changed properties are copied over. We don\u0027t need a new\nsemaphore for each header update.\n\nThis addresses http://tracker.newdream.net/issues/2174\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\nReviewed-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "32eec68d2f233e8a6ae1cd326022f6862e2b9ce3",
      "tree": "03a1f313541374d091bfa09e6028f18bb8c77c18",
      "parents": [
        "593a9e7b34fa62d703b473ae923a9681556cdf74"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Wed Feb 08 16:11:14 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:50 2012 -0500"
      },
      "message": "rbd: don\u0027t drop the rbd_id too early\n\nCurrently an rbd device\u0027s id is released when it is removed, but it\nis done before the code is run to clean up sysfs-related files (such\nas /sys/bus/rbd/devices/1).\n\nIt\u0027s possible that an rbd is still in use after the rbd_remove()\ncall has been made.  It\u0027s essentially the same as an active inode\nthat stays around after it has been removed--until its final close\noperation.  This means that the id shows up as free for reuse at a\ntime it should not be.\n\nThe effect of this was seen by Jens Rehpoehler, who:\n    - had a filesystem mounted on an rbd device\n    - unmapped that filesystem (without unmounting)\n    - found that the mount still worked properly\n    - but hit a panic when he attempted to re-map a new rbd device\n\nThis re-map attempt found the previously-unmapped id available.\nThe subsequent attempt to reuse it was met with a panic while\nattempting to (re-)install the sysfs entry for the new mapped\ndevice.\n\nFix this by holding off \"putting\" the rbd id, until the rbd_device\nrelease function is called--when the last reference is finally\ndropped.\n\nNote: This fixes: http://tracker.newdream.net/issues/1907\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "593a9e7b34fa62d703b473ae923a9681556cdf74",
      "tree": "966050a350368a6c622e45a3ddd7d4fe5f857d08",
      "parents": [
        "00f1f36ffa29a6b8e0529770bce2a44585ab3af0"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Feb 07 12:03:37 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:50 2012 -0500"
      },
      "message": "rbd: small changes\n\nHere is another set of small code tidy-ups:\n    - Define SECTOR_SHIFT and SECTOR_SIZE, and use these symbolic\n      names throughout.  Tell the blk_queue system our physical\n      block size, in the (unlikely) event we want to use something\n      other than the default.\n    - Delete the definition of struct rbd_info, which is never used.\n    - Move the definition of dev_to_rbd() down in its source file,\n      just above where it gets first used, and change its name to\n      dev_to_rbd_dev().\n    - Replace an open-coded operation in rbd_dev_release() to use\n      dev_to_rbd_dev() instead.\n    - Calculate the segment size for a given rbd_device just once in\n      rbd_init_disk().\n    - Use the \u0027%zd\u0027 conversion specifier in rbd_snap_size_show(),\n      since the value formatted is a size_t.\n    - Switch to the \u0027%llu\u0027 conversion specifier in rbd_snap_id_show().\n      since the value formatted is unsigned.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "00f1f36ffa29a6b8e0529770bce2a44585ab3af0",
      "tree": "573bed76392a12b4568adcf704ec7b77e108be08",
      "parents": [
        "fed4c143ba8f08c8bddfdc7c69738e691a06d565"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Feb 07 12:03:36 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:50 2012 -0500"
      },
      "message": "rbd: do some refactoring\n\nA few blocks of code are rearranged a bit here:\n    - In rbd_header_from_disk():\n\t- Don\u0027t bother computing snap_count until we\u0027re sure the\n\t  on-disk header starts with a good signature.\n\t- Move a few independent lines of code so they are *after* a\n\t  check for a failed memory allocation.\n\t- Get rid of unnecessary local variable \"ret\".\n    - Make a few other changes in rbd_read_header(), similar to the\n      above--just moving things around a bit while preserving the\n      functionality.\n    - In rbd_rq_fn(), just assign rq in the while loop\u0027s controlling\n      expression rather than duplicating it before and at the end of\n      the loop body.  This allows the use of \"continue\" rather than\n      \"goto next\" in a number of spots.\n    - Rearrange the logic in snap_by_name().  End result is the same.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "fed4c143ba8f08c8bddfdc7c69738e691a06d565",
      "tree": "2c4e649eaa7ea7a73fa29d603c019d7df7fa287a",
      "parents": [
        "7ef3214af220515b8fe223ec92ec017d2e5607a7"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Feb 07 12:03:36 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:50 2012 -0500"
      },
      "message": "rbd: fix module sysfs setup/teardown code\n\nOnce rbd_bus_type is registered, it allows an \"add\" operation via\nthe /sys/bus/rbd/add bus attribute, and adding a new rbd device that\nway establishes a connection between the device and rbd_root_dev.\nBut rbd_root_dev is not registered until after the rbd_bus_type\nregistration is complete.  This could (in principle anyway) result\nin an invalid state.\n\nSince rbd_root_dev has no tie to rbd_bus_type we can reorder these\ntwo initializations and never be faced with this scenario.\n\nIn addition, unregister the device in the event the bus registration\nfails at module init time.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "7ef3214af220515b8fe223ec92ec017d2e5607a7",
      "tree": "74911dc83a10f824d0e2cbd83896bb32b0fc566b",
      "parents": [
        "5214ecc45cf9b9f1365b189bcb63e441e3865334"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:50 2012 -0500"
      },
      "message": "rbd: don\u0027t allocate mon_addrs buffer in rbd_add()\n\nThe mon_addrs buffer in rbd_add is used to hold a copy of the\nmonitor IP addresses supplied via /sys/bus/rbd/add.  That is\npassed to rbd_get_client(), which never modifies it (nor do\nany of the functions it gets passed to thereafter)--the mon_addr\nparameter to rbd_get_client() is a pointer to constant data, so it\ncan\u0027t be modifed.  Furthermore, rbd_get_client() has the length of\nthe mon_addrs buffer and that is used to ensure nothing goes beyond\nits end.\n\nBased on all this, there is no reason that a buffer needs to\nbe used to hold a copy of the mon_addrs provided via\n/sys/bus/rbd/add.   Instead, the location within that passed-in\nbuffer can be provided, along with the length of the \"token\"\ntherein which represents the monitor IP\u0027s.\n\nA small change to rbd_add_parse_args() allows the address within the\nbuffer to be passed back, and the length is already returned.  This\nnow means that, at least from the perspective of this interface,\nthere is no such thing as a list of monitor addresses that is too\nlong.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "5214ecc45cf9b9f1365b189bcb63e441e3865334",
      "tree": "68e7ca8cb6e3e1698e788d35dcbe16320bdbb3ea",
      "parents": [
        "81a897937827a81107861d50c77b4d04ff8b43a2"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:49 2012 -0500"
      },
      "message": "rbd: have rbd_parse_args() report found mon_addrs size\n\nThe argument parsing routine already computes the size of the\nmon_addrs buffer it extracts from the \"command.\"  Pass it to the\ncaller so it can use it to provide the length to rbd_get_client().\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "81a897937827a81107861d50c77b4d04ff8b43a2",
      "tree": "f639600c9760a9db47e73b9a680bbfd8bba0b85f",
      "parents": [
        "e28fff268e7d40ea7a936478c97ce41b6c22815f"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:49 2012 -0500"
      },
      "message": "rbd: do a few checks at build time\n\nThis is a bit gratuitous, but there are a few things that can be\nverified at build time rather than run time, so do that.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "e28fff268e7d40ea7a936478c97ce41b6c22815f",
      "tree": "bf228f2fa056b5fcbe41c06b07f960cf8a0cc757",
      "parents": [
        "a725f65e52de73defb3c7033c471c48c56ca6cdd"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:49 2012 -0500"
      },
      "message": "rbd: don\u0027t use sscanf() in rbd_add_parse_args()\n\nMake use of a few simple helper routines to parse the arguments\nrather than sscanf().  This will treat both missing and too-long\narguments as invalid input (rather than silently truncating the\ninput in the too-long case).  In time this can also be used by\nrbd_add() to use the passed-in buffer in place, rather than copying\nits contents into new buffers.\n\nIt appears to me that the sscanf() previously used would not\ncorrectly handle a supplied snapshot--the two final \"%s\" conversion\nspecifications were not separated by a space, and I\u0027m not sure\nhow sscanf() handles that situation.  It may not be well-defined.\nSo that may be a bug this change fixes (but I didn\u0027t verify that).\n\nThe sizes of the mon_addrs and options buffers are now passed to\nrbd_add_parse_args(), so they can be supplied to copy_token().\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "a725f65e52de73defb3c7033c471c48c56ca6cdd",
      "tree": "38b1561838f74e4faab94f9828cfc57dc2027e0d",
      "parents": [
        "27cc25943fb359241546e7bb7a3ab1c2f35796a2"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:48 2012 -0500"
      },
      "message": "rbd: encapsulate argument parsing for rbd_add()\n\nMove the code that parses the arguments provided to rbd_add() (which\nare supplied via /sys/bus/rbd/add) into a separate function.\n\nAlso rename the \"mon_dev_name\" variable in rbd_add() to be\n\"mon_addrs\".   The variable represents a list of one or more\ncomma-separated monitor IP addresses, each with an optional port\nnumber.  I think \"mon_addrs\" captures that notion a little better.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\n"
    },
    {
      "commit": "27cc25943fb359241546e7bb7a3ab1c2f35796a2",
      "tree": "b5b957d4732a9fc3cc4b9eff33344eb5faabde2e",
      "parents": [
        "60571c7d556b10db7e555bd4b6765647af5c41e8"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:48 2012 -0500"
      },
      "message": "rbd: simplify error handling in rbd_add()\n\nIf a couple pointers are initialized to NULL then a single\n\"out_nomem\" label can be used for all of the memory allocation\nfailure cases in rbd_add().\n\nAlso, get rid of the \"irc\" local variable there.  There is no\nreal need for \"rc\" to be type ssize_t, and it can be used in\nthe spot \"irc\" was.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "60571c7d556b10db7e555bd4b6765647af5c41e8",
      "tree": "34e5f4f677693791efc489ca9005356cd4477a01",
      "parents": [
        "d720bcb0a8f246eb441ba9d4f341bc16746556c6"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:48 2012 -0500"
      },
      "message": "rbd: reduce memory used for rbd_dev fields\n\nThe length of the string containing the monitor address\nspecification(s) will never exceed the length of the string passed\nin to rbd_add().  The same holds true for the ceph + rbd options\nstring.  So reduce the amount of memory allocated for these to\nthat length rather than the maximum (1024 bytes).\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "d720bcb0a8f246eb441ba9d4f341bc16746556c6",
      "tree": "9df53a7ff220547c7150be803c8a3e8cca0664b1",
      "parents": [
        "f0f8cef5a30504eaeba5588a9115b46c824d91a3"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:30 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:48 2012 -0500"
      },
      "message": "rbd: have rbd_get_client() return a rbd_client\n\nSince rbd_get_client() currently returns an error code.  It assigns\nthe rbd_client field of the rbd_device structure it is passed if\nsuccessful.  Instead, have it return the created rbd_client\nstructure and return a pointer-coded error if there is an error.\nThis makes the assignment of the client pointer more obvious at the\ncall site.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "f0f8cef5a30504eaeba5588a9115b46c824d91a3",
      "tree": "fa7e9d2a8dfb9e15ab85bf92420527deea0bd3ef",
      "parents": [
        "432b858749631dc011ac919dace4b0705ba8cecf"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:48 2012 -0500"
      },
      "message": "rbd: a few simple changes\n\nHere are a few very simple cleanups:\n    - Add a \"RBD_\" prefix to the two driver name string definitions.\n    - Move the definition of struct rbd_request below struct rbd_req_coll\n      to avoid the need for an empty declaration of the latter.\n    - Move and group the definitions of rbd_root_dev_release() and\n      rbd_root_dev, as well as rbd_bus_type and rbd_bus_attrs[],\n      close to the top of the file.  Arrange the latter so\n      rbd_bus_type.bus_attrs can be initialized statically.\n    - Get rid of an unnecessary local variable in rbd_open().\n    - Rework some hokey logic in rbd_bus_add_dev(), so the value of\n      \"ret\" at the end is either 0 or -ENOENT to avoid the need for\n      the code duplication that was there.\n    - Rename a goto target in rbd_add().\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "432b858749631dc011ac919dace4b0705ba8cecf",
      "tree": "9e16e9ac876b6d0460f40a0df832c0aa1fc8271a",
      "parents": [
        "bc534d86be71aaf8dfac46131420ab1c47387d42"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:48 2012 -0500"
      },
      "message": "rbd: rename \"node_lock\"\n\nThe spinlock used to protect rbd_client_list is named \"node_lock\".\nRename it to \"rbd_client_list_lock\" to make it more obvious what\nit\u0027s for.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "bc534d86be71aaf8dfac46131420ab1c47387d42",
      "tree": "196d43864c2c1033b30d4ae03cb946793cf29b19",
      "parents": [
        "d97081b0c7bdb55371994cc6690217bf393eb63e"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: move ctl_mutex lock inside rbd_client_create()\n\nSince rbd_client_create() is only called in one place, move the\nacquisition of the mutex around that call inside that function.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "d97081b0c7bdb55371994cc6690217bf393eb63e",
      "tree": "a520fd2d821202175749fc9a0dd9b1b4a1fa2ac8",
      "parents": [
        "e6994d3ddedf1a9f35cb43655bb4b5810e71199a"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: move ctl_mutex lock inside rbd_get_client()\n\nSince rbd_get_client() is only called in one place, move the\nacquisition of the mutex around that call inside that function.\n\nFurthermore, within rbd_get_client(), it appears the mutex only\nneeds to be held while calling rbd_client_create().  (Moving\nthe lock inside that function will wait for the next patch.)\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "e6994d3ddedf1a9f35cb43655bb4b5810e71199a",
      "tree": "0e0af19765412596516550b3a95c32ff67be6d47",
      "parents": [
        "d184f6bfde1428ad4a690d49b28afc9ab4d57b35"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: release client list lock sooner\n\nIn rbd_get_client(), if a client is reused, a number of things\nget done while still holding the list lock unnecessarily.\n\nThis just moves a few things that need no lock protection outside\nthe lock.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "d184f6bfde1428ad4a690d49b28afc9ab4d57b35",
      "tree": "fd3156df944edc90146143e5cea416d34c8fcd47",
      "parents": [
        "499afd5b8e742792fda6bd7730c738ad83aecf6b"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: restore previous rbd id sequence behavior\n\nIt used to be that selecting a new unique identifier for an added\nrbd device required searching all existing ones to find the highest\nid is used.  A recent change made that unnecessary, but made it\nso that id\u0027s used were monotonically non-decreasing.  It\u0027s a bit\nmore pleasant to have smaller rbd id\u0027s though, and this change\nmakes ids get allocated as they were before--each new id is one more\nthan the maximum currently in use.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "499afd5b8e742792fda6bd7730c738ad83aecf6b",
      "tree": "a3cac0fa73a3251e80d8c6eb2e0eb9addbcc5e22",
      "parents": [
        "e124a82f3c4efc2cc2bae68a2bf30020fb8c4fc2"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Feb 02 08:13:29 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: tie rbd_dev_list changes to rbd_id operations\n\nThe only time entries are added to or removed from the global\nrbd_dev_list is exactly when a \"put\" or \"get\" operation is being\nperformed on a rbd_dev\u0027s id.  So just move the list management code\ninto get/put routines.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "e124a82f3c4efc2cc2bae68a2bf30020fb8c4fc2",
      "tree": "9c1b768d2871b181bcc21d89bedf9bf9dbc6d998",
      "parents": [
        "1ddbe94eda58597cb6dd464b455cb62d3f68be7b"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: protect the rbd_dev_list with a spinlock\n\nThe rbd_dev_list is just a simple list of all the current\nrbd_devices.  Using the ctl_mutex as a concurrency guard is\noverkill.  Instead, use a spinlock for that specific purpose.\n\nThis also reduces the window that the ctl_mutex needs to be held in\nrbd_add().\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "1ddbe94eda58597cb6dd464b455cb62d3f68be7b",
      "tree": "02a6b829191d218ed861f81b0dcedb8deef53ff4",
      "parents": [
        "b7f23c361b65a0bdcc81acd8d38471b7810df3ff"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:44 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: rework calculation of new rbd id\u0027s\n\nIn order to select a new unique identifier for an added rbd device,\nthe list of all existing ones is searched and a value one greater\nthan the highest id is used.\n\nThe list search can be avoided by using an atomic variable that\nkeeps track of the current highest id.  Using a get/put model for\nid\u0027s we can limit the boundless growth of id numbers a bit by\narranging to reuse the current highest id once it gets released.\nAdd these calls to \"put\" the id when an rbd is getting removed.\n\nNote that this changes the pattern of device id\u0027s used--new values\nwill never be below the highest one seen so far (even if there\nexists an unused lower one).  I assert this is OK because the key\nproperty of an rbd id is its uniqueness, not its magnitude.\n\nRegardless, a follow-on patch will restore the old way of doing\nthings, I just think this commit just makes the incremental change\nto atomics a little easier to understand.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "b7f23c361b65a0bdcc81acd8d38471b7810df3ff",
      "tree": "6ff42f4ebe263453ba14d61d6b0cf56c98d22e42",
      "parents": [
        "cc9d734c3d1b39c6a557673469aea26364060226"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:43 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: encapsulate new rbd id selection\n\nMove the loop that finds a new unique rbd id to use into\nits own helper function.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "cc9d734c3d1b39c6a557673469aea26364060226",
      "tree": "67cc35424a31e6be289f118732f45e15c9432dad",
      "parents": [
        "1dbb439913f0fc0bc30d36411a4a3b3202c0aab1"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Nov 21 18:19:13 2011 -0800"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: use a single value of snap_name to mean no snap\n\nThere\u0027s already a constant for this anyway.\n\nSince rbd_header_set_snap() is only used to set the rbd device\nsnap_name field, just do that within that function rather than\nhaving it take the snap_name as an argument.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n\nv2: Changed interface rbd_header_set_snap() so it explicitly updates\n    the snap_name in the rbd_device.  Also added a BUILD_BUG_ON()\n    to verify the size of the snap_name field is sufficient for\n    SNAP_HEAD_NAME.\n"
    },
    {
      "commit": "1dbb439913f0fc0bc30d36411a4a3b3202c0aab1",
      "tree": "7da9c0818f6ce8cff9068732fed25fd62d05ebd0",
      "parents": [
        "ee57741c5209154b8ef124bcaa2496da1b69a988"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Jan 24 10:08:37 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: do not duplicate ceph_client pointer in rbd_device\n\nThe rbd_device structure maintains a duplicate copy of the\nceph_client pointer maintained in its rbd_client structure.  There\nappears to be no good reason for this, and its presence presents a\nrisk of them getting out of synch or otherwise misused.  So kill it\noff, and use the rbd_client copy only.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "ee57741c5209154b8ef124bcaa2496da1b69a988",
      "tree": "248a6e7bf259bb849f885f1ff4a82be74ab4913b",
      "parents": [
        "2107978668de13da484f7abc3f03516494c7fca9"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Jan 24 10:08:36 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:47 2012 -0500"
      },
      "message": "rbd: make ceph_parse_options() return a pointer\n\nceph_parse_options() takes the address of a pointer as an argument\nand uses it to return the address of an allocated structure if\nsuccessful.  With this interface is not evident at call sites that\nthe pointer is always initialized.  Change the interface to return\nthe address instead (or a pointer-coded error code) to make the\nvalidity of the returned pointer obvious.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "2107978668de13da484f7abc3f03516494c7fca9",
      "tree": "0b3d054845849b221ffed4aad38a3e7449121e79",
      "parents": [
        "18fa8b3feaac772925263b04b1429d80e2dfd779"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Jan 24 10:08:36 2012 -0600"
      },
      "committer": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Thu Mar 22 10:47:46 2012 -0500"
      },
      "message": "rbd: a few small cleanups\n\nSome minor cleanups in \"drivers/block/rbd.c:\n    - Use the more meaningful \"RBD_MAX_OBJ_NAME_LEN\" in place if \"96\"\n      in the definition of RBD_MAX_MD_NAME_LEN.\n    - Use DEFINE_SPINLOCK() to define and initialize node_lock.\n    - Drop a needless (char *) cast in parse_rbd_opts_token().\n    - Make a few minor formatting changes.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "6c073a7ee250118b8be3a2379c96fd7f78382b06",
      "tree": "b398bd9cad821a3543df835e5a0110f270acafb9",
      "parents": [
        "ff05f603c3238010769787f3ba54c48c290ed3e5",
        "d23a4b3fd6ef70b80411b39b8c8bc548a219ce70"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Feb 02 15:47:33 2012 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Feb 02 15:47:33 2012 -0800"
      },
      "message": "Merge branch \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client\n\n* \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:\n  rbd: fix safety of rbd_put_client()\n  rbd: fix a memory leak in rbd_get_client()\n  ceph: create a new session lock to avoid lock inversion\n  ceph: fix length validation in parse_reply_info()\n  ceph: initialize client debugfs outside of monc-\u003emutex\n  ceph: change \"ceph.layout\" xattr to be \"ceph.file.layout\"\n"
    },
    {
      "commit": "d23a4b3fd6ef70b80411b39b8c8bc548a219ce70",
      "tree": "f42dbc4c8544acce987e35df5b3002f1def54cff",
      "parents": [
        "97bb59a03dd6767fcc00be09b0c6d9e5294eeea6"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Sun Jan 29 13:57:43 2012 -0600"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu Feb 02 12:56:59 2012 -0800"
      },
      "message": "rbd: fix safety of rbd_put_client()\n\nThe rbd_client structure uses a kref to arrange for cleaning up and\nfreeing an instance when its last reference is dropped.  The cleanup\nroutine is rbd_client_release(), and one of the things it does is\ndelete the rbd_client from rbd_client_list.  It acquires node_lock\nto do so, but the way it is done is still not safe.\n\nThe problem is that when attempting to reuse an existing rbd_client,\nthe structure found might already be in the process of getting\ndestroyed and cleaned up.\n\nHere\u0027s the scenario, with \"CLIENT\" representing an existing\nrbd_client that\u0027s involved in the race:\n\n Thread on CPU A                | Thread on CPU B\n ---------------                | ---------------\n rbd_put_client(CLIENT)         | rbd_get_client()\n   kref_put()                   |   (acquires node_lock)\n     kref-\u003erefcount becomes 0   |   __rbd_client_find() returns CLIENT\n     calls rbd_client_release() |   kref_get(\u0026CLIENT-\u003ekref);\n                                |   (releases node_lock)\n       (acquires node_lock)     |\n       deletes CLIENT from list | ...and starts using CLIENT...\n       (releases node_lock)     |\n       and frees CLIENT         | \u003c-- but CLIENT gets freed here\n\nFix this by having rbd_put_client() acquire node_lock.  The result\ncould still be improved, but at least it avoids this problem.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "97bb59a03dd6767fcc00be09b0c6d9e5294eeea6",
      "tree": "f04006e8040913d49fb1841ed93abed6d84308a1",
      "parents": [
        "d8fb02abdc39f92a1066313e2b17047876afa8f9"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Tue Jan 24 10:08:36 2012 -0600"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu Feb 02 12:49:27 2012 -0800"
      },
      "message": "rbd: fix a memory leak in rbd_get_client()\n\nIf an existing rbd client is found to be suitable for use in\nrbd_get_client(), the rbd_options structure is not being\nfreed as it should.  Fix that.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "0e805a1d857799352e51e8697c0b1a30aec16913",
      "tree": "bc6ad83e25af597f40b03170026c3e5d331c2814",
      "parents": [
        "a40dc6cc2e121abcbd1b22583ef5447763df510c"
      ],
      "author": {
        "name": "Alex Elder",
        "email": "elder@dreamhost.com",
        "time": "Wed Jan 11 19:42:15 2012 -0800"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu Jan 12 11:00:50 2012 -0800"
      },
      "message": "rbd: initialize snap_rwsem in rbd_add()\n\nNew rbd device structures get initialized in rbd_add().  Many of\nthe fields rely on being initially zero-filled.  However we lockdep\nwas noticing that the rw_semaphore embedded in the header field\nwas not getting properly initialized.  Fix that.\n\nSigned-off-by: Alex Elder \u003celder@dreamhost.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "51703306b3b9ea7c05728040998521e47358147b",
      "tree": "aa76b79a9dcde9269b61524953a57b7d1328bcea",
      "parents": [
        "81e759fbf7715514c32e563789db1d9d47fd55fb"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Mon Oct 24 16:28:27 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Dec 07 10:46:19 2011 -0800"
      },
      "message": "rbd: remove buggy rollback functionality\n\nThis doesn\u0027t interact with resizing well, since it doesn\u0027t set the\nsize of the device to the size at the snapshot. It\u0027s also an expensive\noperation to be synchronous. Rollback can still be done with the\nuserspace rbd tool.\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\n"
    },
    {
      "commit": "81e759fbf7715514c32e563789db1d9d47fd55fb",
      "tree": "076296ce4a9c12c400e0a0de39d80844ced3aa14",
      "parents": [
        "2151937d7ce491bfbe269a1ae742c6686904474c"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Tue Nov 15 14:49:53 2011 -0800"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Dec 07 10:46:10 2011 -0800"
      },
      "message": "rbd: return an error when an invalid header is read\n\nThis protects against opening future rbd images that have incompatible format changes.\n\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\n"
    },
    {
      "commit": "97d2eb13a019ec09cc1a7ea2d3705c0b117b3c0d",
      "tree": "86f6382941f8cfc41647d33d87bec7bc1407c18c",
      "parents": [
        "68d99b2c8efcb6ed3807a55569300c53b5f88be5",
        "339573406737461cfb17bebabf7ba536a302d841"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Oct 28 16:42:18 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Oct 28 16:42:18 2011 -0700"
      },
      "message": "Merge branch \u0027for-linus\u0027 of git://ceph.newdream.net/git/ceph-client\n\n* \u0027for-linus\u0027 of git://ceph.newdream.net/git/ceph-client:\n  libceph: fix double-free of page vector\n  ceph: fix 32-bit ino numbers\n  libceph: force resend of osd requests if we skip an osdmap\n  ceph: use kernel DNS resolver\n  ceph: fix ceph_monc_init memory leak\n  ceph: let the set_layout ioctl set single traits\n  Revert \"ceph: don\u0027t truncate dirty pages in invalidate work thread\"\n  ceph: replace leading spaces with tabs\n  libceph: warn on msg allocation failures\n  libceph: don\u0027t complain on msgpool alloc failures\n  libceph: always preallocate mon connection\n  libceph: create messenger with client\n  ceph: document ioctls\n  ceph: implement (optional) max read size\n  ceph: rename rsize -\u003e rasize\n  ceph: make readpages fully async\n"
    },
    {
      "commit": "6ab00d465a1c8c02c2216f8220727282f3aa50b5",
      "tree": "b4cc08e1be5ffe0a60d9090d86f7f0d05b1f6e36",
      "parents": [
        "6a8ea4706adb4b4d8f77a8da5f9778b65fbf6f48"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue Aug 09 09:41:59 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue Oct 25 16:10:15 2011 -0700"
      },
      "message": "libceph: create messenger with client\n\nThis simplifies the init/shutdown paths, and makes client-\u003emsgr available\nduring the rest of the setup process.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "e060c38434b2caa78efe7cedaff4191040b65a15",
      "tree": "407361230bf6733f63d8e788e4b5e6566ee04818",
      "parents": [
        "10e4ac572eeffe5317019bd7330b6058a400dfc2",
        "cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941"
      ],
      "author": {
        "name": "Jiri Kosina",
        "email": "jkosina@suse.cz",
        "time": "Thu Sep 15 15:08:05 2011 +0200"
      },
      "committer": {
        "name": "Jiri Kosina",
        "email": "jkosina@suse.cz",
        "time": "Thu Sep 15 15:08:18 2011 +0200"
      },
      "message": "Merge branch \u0027master\u0027 into for-next\n\nFast-forward merge with Linus to be able to merge patches\nbased on more recent version of the tree.\n"
    },
    {
      "commit": "699324871fcc3650f2023c5e36cb119a92d7894b",
      "tree": "7115a8183a4fd00b6f0ea1ae3b8f3dfbcf1c454b",
      "parents": [
        "ca4a04cf3dd0cecb5e7188ed7796cc55fc13aeb1"
      ],
      "author": {
        "name": "Justin P. Mattock",
        "email": "justinmattock@gmail.com",
        "time": "Tue Jul 26 23:06:29 2011 -0700"
      },
      "committer": {
        "name": "Jiri Kosina",
        "email": "jkosina@suse.cz",
        "time": "Thu Sep 15 14:50:49 2011 +0200"
      },
      "message": "treewide: remove extra semicolons from various parts of the kernel\n\nThis is a resend from the original, changing the title from PATCH to\nRFC(since this is a review for commit, and I should have put that the first go around).\nand also removing some of the commit\u0027s with ia64 and bash since it is significant.\nlet me know if I might have missed anything etc..\n\nSigned-off-by: Justin P. Mattock \u003cjustinmattock@gmail.com\u003e\nSigned-off-by: Jiri Kosina \u003cjkosina@suse.cz\u003e\n"
    },
    {
      "commit": "029bcbd8b076fd19787b8c73e58dd0a6f2c0caf1",
      "tree": "305128db78ecfb09e6a236caeeac1fbb9ece1175",
      "parents": [
        "e9852227431a0ed6ceda064f33e4218757acab6c"
      ],
      "author": {
        "name": "Josh Durgin",
        "email": "josh.durgin@dreamhost.com",
        "time": "Fri Jul 22 11:35:23 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue Jul 26 11:29:35 2011 -0700"
      },
      "message": "rbd: set blk_queue request sizes to object size\n\nThis improves performance since more requests can be merged.\n\nReviewed-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\nSigned-off-by: Josh Durgin \u003cjosh.durgin@dreamhost.com\u003e\n"
    },
    {
      "commit": "79e3057c4c9d32b88e6745fd220d91b0a8b2030b",
      "tree": "fb6f4bff64c4e6014af3bdaa5284e921d24111bd",
      "parents": [
        "2f90b852e3ae73889d7f6de6ecf429b9b6a6b103"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Tue Jul 12 16:56:57 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue Jul 26 11:29:04 2011 -0700"
      },
      "message": "rbd: cancel watch request when releasing the device\n\nWe were missing this cleanup, so when a device was released\nthe osd didn\u0027t clean up its watchers list, so following notifications\ncould be slow as osd needed to timeout on the client.\n\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "9db4b3e32778400555d5cc6fb61d4058902d37f7",
      "tree": "06080e941734876ae0c1c4d353a50a160a940907",
      "parents": [
        "45e3d3eeb6578e523e100622266945ecd71723bb"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue Apr 19 22:49:06 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 11:52:08 2011 -0700"
      },
      "message": "rbd: handle online resize of underlying rbd image\n\nIf we get a notification that the image header has changed, check for\na change in the image size.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "aedfec59eed37d1ff7ce09b303b668234e9a7f8e",
      "tree": "92e3e6e638acd63b07aab244cdd30826277001be",
      "parents": [
        "916d4d672779de8e42346fff338617c7b841e8e5"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu May 12 20:57:03 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 11:52:03 2011 -0700"
      },
      "message": "rbd: use snprintf for disk-\u003edisk_name\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "916d4d672779de8e42346fff338617c7b841e8e5",
      "tree": "aa323878aa43221442b03137614f5f0a4251171c",
      "parents": [
        "13143d2d1cffd243a6d778000b02ab4938ac751a"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu May 12 16:10:50 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 11:52:01 2011 -0700"
      },
      "message": "rbd: cleanup: make kfree match kmalloc\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "13143d2d1cffd243a6d778000b02ab4938ac751a",
      "tree": "223cf7b9a80b5803af1a88d83868fa357ab96866",
      "parents": [
        "9d6fcb081a4770c3772c51c59c7251c22716d7bb"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu May 12 16:08:30 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu May 19 11:25:05 2011 -0700"
      },
      "message": "rbd: warn on update_snaps failure on notify\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "1fec70932d867416ffe620dd17005f168cc84eb5",
      "tree": "921f08b555d2b71e7356034aae65bed4ed37e2df",
      "parents": [
        "11f770027b5c0de16544f3ec82b5c6f9f8d5a644"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Fri May 13 13:52:56 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Fri May 13 13:52:57 2011 -0700"
      },
      "message": "rbd: fix split bio handling\n\nThe rbd driver currently splits bios when they span an object boundary.\nHowever, the blk_end_request expects the completions to roll up the results\nin block device order, and the split rbd/ceph ops can complete in any\norder.  This patch adds a struct rbd_req_coll to track completion of split\nrequests and ensures that the results are passed back up to the block layer\nin order.\n\nThis fixes errors where the file system gets completion of a read operation\nthat spans an object boundary before the data has actually arrived.  The\nbug is easily reproduced with iozone with a working set larger than\navailable RAM.\n\nReported-by: Fyodor Ustinov \u003cufm@ufm.su\u003e\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "11f770027b5c0de16544f3ec82b5c6f9f8d5a644",
      "tree": "7a64ef3a9a47ddd19dd22d50059a266cf626ddee",
      "parents": [
        "446cc6345d3de6571bdd0840f48aca441488a28d"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu May 12 16:13:54 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu May 12 20:59:14 2011 -0700"
      },
      "message": "rbd: fix leak of ops struct\n\nThe ops vector must be freed by the rbd_do_request caller.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "4ad12621e442b7a072e81270808f617cb65c5672",
      "tree": "eecdd1d51f525b9b07c70f8fbcf08c9ede3b8f79",
      "parents": [
        "8c71897be2ddfd84969412635ca42fa9e137f7b6"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 03 09:23:36 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 03 09:28:13 2011 -0700"
      },
      "message": "libceph: fix ceph_osdc_alloc_request error checks\n\nceph_osdc_alloc_request returns NULL on failure.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "59c2be1e4d42c0d4949cecdeef3f37070a1fbc13",
      "tree": "919f191a2f2840b510dce246210564bf45200616",
      "parents": [
        "a40c4f10e3fb96030358e49abd010c1f08446fa3"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Mon Mar 21 15:10:11 2011 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue Mar 22 11:33:56 2011 -0700"
      },
      "message": "rbd: use watch/notify for changes in rbd header\n\nSend notifications when we change the rbd header (e.g. create a snapshot)\nand wait for such notifications.  This allows synchronizing the snapshot\ncreation between different rbd clients/rools.\n\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "766fc43973b16f9becb6b7402b3e052dbb84adee",
      "tree": "47a0b50d6fd7fac744a69dbeaf78e80e3d17fc7b",
      "parents": [
        "f363e45fd1184219b472ea549cb7e192e24ef4d2"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Fri Jan 07 14:58:42 2011 -0800"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Jan 12 15:15:18 2011 -0800"
      },
      "message": "rbd: fix cleanup when trying to mount inexistent image\n\nPreviously we didn\u0027t clean up the sysfs entry that was just\ncreated.\n\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "dfc5606dc51381186de765243bab340c8e021868",
      "tree": "663aa59ad40f1ff2e87fcd5256a7cc6aab7b1c00",
      "parents": [
        "3561d43fd289f590fdae672e5eb831b8d5cf0bf6"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Fri Nov 19 14:51:04 2010 -0800"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Dec 01 15:53:22 2010 -0800"
      },
      "message": "rbd: replace the rbd sysfs interface\n\nThe new interface creates directories per mapped image\nand under each it creates a subdir per available snapshot.\nThis allows keeping a cleaner interface within the sysfs\nguidelines. The ABI documentation was updated too.\n\nAcked-by: Greg Kroah-Hartman \u003cgregkh@suse.de\u003e\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "85b5aaa624aac568b8a3a88dbe4de6628c7cc527",
      "tree": "7051c9532750eb81fb76e1473a09fd82ba1f314c",
      "parents": [
        "b8d0638a98aa4a42ff322234b882487cd74e5c52"
      ],
      "author": {
        "name": "Dan Carpenter",
        "email": "error27@gmail.com",
        "time": "Mon Oct 11 21:15:11 2010 +0200"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Oct 20 15:38:25 2010 -0700"
      },
      "message": "rbd: passing wrong variable to bvec_kunmap_irq()\n\nWe should be passing \"buf\" here insead of \"bv\".  This is tricky because\nit\u0027s not the same as kmap() and kunmap().  GCC does warn about it if you\ncompile on i386 with CONFIG_HIGHMEM.\n\nSigned-off-by: Dan Carpenter \u003cerror27@gmail.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "b8d0638a98aa4a42ff322234b882487cd74e5c52",
      "tree": "4ab89ab0a293d404466106dd6bced5d68c171ce1",
      "parents": [
        "240634e9b3a8ae2a9e2b7effeea3b9a5b30d68fb"
      ],
      "author": {
        "name": "Dan Carpenter",
        "email": "error27@gmail.com",
        "time": "Mon Oct 11 21:14:23 2010 +0200"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Oct 20 15:38:24 2010 -0700"
      },
      "message": "rbd: null vs ERR_PTR\n\nceph_alloc_page_vector() returns ERR_PTR(-ENOMEM) on errors.\n\nSigned-off-by: Dan Carpenter \u003cerror27@gmail.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    },
    {
      "commit": "f4cf3deef4c474381e8fee2e6099d49edd9105cb",
      "tree": "fbf21efa48b062e3a4af9a91c564f05e2b63090c",
      "parents": [
        "28f259b7cd78eb29d38b7ae6b475d656e08fd348"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Mon Sep 27 10:51:53 2010 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Oct 20 15:38:20 2010 -0700"
      },
      "message": "block: rbd: removing unnecessary test\n\nrbd_get_segment() can\u0027t return a negative value, we don\u0027t need to check\nthe return output.\n\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "28f259b7cd78eb29d38b7ae6b475d656e08fd348",
      "tree": "4cbefc4ad9562af2c221b6fec52bb560772f0a40",
      "parents": [
        "496e59553c51ce18acc836de070106b583926b87"
      ],
      "author": {
        "name": "Vasiliy Kulikov",
        "email": "segooon@gmail.com",
        "time": "Sun Sep 26 12:59:37 2010 +0400"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Oct 20 15:38:19 2010 -0700"
      },
      "message": "block: rbd: fixed may leaks\n\nrbd_client_create() doesn\u0027t free rbdc, this leads to many leaks.\n\nseg_len in rbd_do_op() is unsigned, so (seg_len \u003c 0) makes no sense.\nAlso if fixed check fails then seg_name is leaked.\n\nSigned-off-by: Vasiliy Kulikov \u003csegooon@gmail.com\u003e\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\n"
    },
    {
      "commit": "602adf400201636e95c3fed9f31fba54a3d7e844",
      "tree": "1b10046664d2c380a595ceaaafab2eed835dc937",
      "parents": [
        "3d14c5d2b6e15c21d8e5467dc62d33127c23a644"
      ],
      "author": {
        "name": "Yehuda Sadeh",
        "email": "yehuda@hq.newdream.net",
        "time": "Thu Aug 12 16:11:25 2010 -0700"
      },
      "committer": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Wed Oct 20 15:38:13 2010 -0700"
      },
      "message": "rbd: introduce rados block device (rbd), based on libceph\n\nThe rados block device (rbd), based on osdblk, creates a block device\nthat is backed by objects stored in the Ceph distributed object storage\ncluster.  Each device consists of a single metadata object and data\nstriped over many data objects.\n\nThe rbd driver supports read-only snapshots.\n\nSigned-off-by: Yehuda Sadeh \u003cyehuda@hq.newdream.net\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\n"
    }
  ]
}
