)]}'
{
  "log": [
    {
      "commit": "d4a789474a6213d1b55b363fb1787b0abf877bba",
      "tree": "cce6f1ade81778ef63921b2ed9c37b7bf2e5524d",
      "parents": [
        "2e966ed22c3c56227f8a7322d7b008945352e6ab"
      ],
      "author": {
        "name": "Wu Fengguang",
        "email": "fengguang.wu@intel.com",
        "time": "Thu Apr 02 16:46:06 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Apr 02 16:46:06 2009 -0400"
      },
      "message": "Btrfs: fix typos in comments\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n\n"
    },
    {
      "commit": "b9473439d3e84d9fc1a0a83faca69cc1b7566341",
      "tree": "bef8321b80589026b617d61d0fabaf545d459269",
      "parents": [
        "89573b9c516b24af8a3b9958dd5afca8fa874e3d"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Mar 13 11:00:37 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 16:14:28 2009 -0400"
      },
      "message": "Btrfs: leave btree locks spinning more often\n\nbtrfs_mark_buffer dirty would set dirty bits in the extent_io tree\nfor the buffers it was dirtying.  This may require a kmalloc and it\nwas not atomic.  So, anyone who called btrfs_mark_buffer_dirty had to\nset any btree locks they were holding to blocking first.\n\nThis commit changes dirty tracking for extent buffers to just use a flag\nin the extent buffer.  Now that we have one and only one extent buffer\nper page, this can be safely done without losing dirty bits along the way.\n\nThis also introduces a path-\u003eleave_spinning flag that callers of\nbtrfs_search_slot can use to indicate they will properly deal with a\npath returned where all the locks are spinning instead of blocking.\n\nMany of the btree search callers now expect spinning paths,\nresulting in better btree concurrency overall.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "66d7e85ea7c3628189d19b265495358f756cb463",
      "tree": "ffd9484c6e80f90bcf0c4da2f41dda57c8d6eac5",
      "parents": [
        "7f366cfecfc126731f8ac505d72026d691dac79a"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Mar 12 20:12:45 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 16:14:27 2009 -0400"
      },
      "message": "Btrfs: Check for a blocking lock before taking the spin\n\nThis reduces contention on the extent buffer spin locks by testing for a\nblocking lock before trying to take the spinlock.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "b9447ef80bd301b932ac4d85c9622e929de5fd62",
      "tree": "6d0bb1f287ed09f7850b77e2f622c3bebb35112b",
      "parents": [
        "4e06bdd6cbd5105376e7caf4e683ed131e777389"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Mar 09 11:45:38 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Mar 09 11:45:38 2009 -0400"
      },
      "message": "Btrfs: fix spinlock assertions on UP systems\n\nbtrfs_tree_locked was being used to make sure a given extent_buffer was\nproperly locked in a few places.  But, it wasn\u0027t correct for UP compiled\nkernels.\n\nThis switches it to using assert_spin_locked instead, and renames it to\nbtrfs_assert_tree_locked to better reflect how it was really being used.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "4008c04a07c73ec3cb1be4c1391d2159a8f75d6d",
      "tree": "c0b10a7287ac810bfc406541e32b850ad4580248",
      "parents": [
        "3f3420df505e47751ef76a652b5cb660e5360d6f"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Feb 12 14:09:45 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Feb 12 14:09:45 2009 -0500"
      },
      "message": "Btrfs: make a lockdep class for the extent buffer locks\n\nBtrfs is currently using spin_lock_nested with a nested value based\non the tree depth of the block.  But, this doesn\u0027t quite work because\nthe max tree depth is bigger than what spin_lock_nested can deal with,\nand because locks are sometimes taken before the level field is filled in.\n\nThe solution here is to use lockdep_set_class_and_name instead, and to\nset the class before unlocking the pages when the block is read from the\ndisk and just after init of a freshly allocated tree block.\n\nbtrfs_clear_path_blocking is also changed to take the locks in the proper\norder, and it also makes sure all the locks currently held are properly\nset to blocking before it tries to retake the spinlocks.  Otherwise, lockdep\ngets upset about bad lock orderin.\n\nThe lockdep magic cam from Peter Zijlstra \u003cpeterz@infradead.org\u003e\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "284b066af41579f62649048fdec5c5e7091703e6",
      "tree": "e34185c911cb50b0ade04f804056ffbe2a6e04ae",
      "parents": [
        "42f15d77df8a7e8a2feb15041d5d30710ee7f951"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Feb 09 16:22:03 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Feb 09 16:22:03 2009 -0500"
      },
      "message": "Btrfs: don\u0027t use spin_is_contended\n\nBtrfs was using spin_is_contended to see if it should drop locks before\ndoing extent allocations during btrfs_search_slot.  The idea was to avoid\nexpensive searches in the tree unless the lock was actually contended.\n\nBut, spin_is_contended is specific to the ticket spinlocks on x86, so this\nis causing compile errors everywhere else.\n\nIn practice, the contention could easily appear some time after we started\ndoing the extent allocation, and it makes more sense to always drop the lock\ninstead.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "b4ce94de9b4d64e8ab3cf155d13653c666e22b9b",
      "tree": "ebc44a9554a50b495b091cb0979d79fd29e50fe7",
      "parents": [
        "c487685d7c18a8481900755aa5c56a7a74193101"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Feb 04 09:25:08 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Feb 04 09:25:08 2009 -0500"
      },
      "message": "Btrfs: Change btree locking to use explicit blocking points\n\nMost of the btrfs metadata operations can be protected by a spinlock,\nbut some operations still need to schedule.\n\nSo far, btrfs has been using a mutex along with a trylock loop,\nmost of the time it is able to avoid going for the full mutex, so\nthe trylock loop is a big performance gain.\n\nThis commit is step one for getting rid of the blocking locks entirely.\nbtrfs_tree_lock takes a spinlock, and the code explicitly switches\nto a blocking lock when it starts an operation that can schedule.\n\nWe\u0027ll be able get rid of the blocking locks in smaller pieces over time.\nTracing allows us to find the most common cause of blocking, so we\ncan start with the hot spots first.\n\nThe basic idea is:\n\nbtrfs_tree_lock() returns with the spin lock held\n\nbtrfs_set_lock_blocking() sets the EXTENT_BUFFER_BLOCKING bit in\nthe extent buffer flags, and then drops the spin lock.  The buffer is\nstill considered locked by all of the btrfs code.\n\nIf btrfs_tree_lock gets the spinlock but finds the blocking bit set, it drops\nthe spin lock and waits on a wait queue for the blocking bit to go away.\n\nMuch of the code that needs to set the blocking bit finishes without actually\nblocking a good percentage of the time.  So, an adaptive spin is still\nused against the blocking bit to avoid very high context switch rates.\n\nbtrfs_clear_lock_blocking() clears the blocking bit and returns\nwith the spinlock held again.\n\nbtrfs_tree_unlock() can be called on either blocking or spinning locks,\nit does the right thing based on the blocking bit.\n\nctree.c has a helper function to set/clear all the locked buffers in a\npath as blocking.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "d397712bcc6a759a560fd247e6053ecae091f958",
      "tree": "9da8daebb870d8b8b1843507c4621715e23dd31a",
      "parents": [
        "1f3c79a28c8837e8572b98f6d14142d9a6133c56"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Jan 05 21:25:51 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Jan 05 21:25:51 2009 -0500"
      },
      "message": "Btrfs: Fix checkpatch.pl warnings\n\nThere were many, most are fixed now.  struct-funcs.c generates some warnings\nbut these are bogus.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "d352ac68148b69937d39ca5d48bcc4478e118dbf",
      "tree": "7951dd7311999d9e77766acdc7f8e93de97874d8",
      "parents": [
        "9a5e1ea1e1e539e244a54afffc330fc368376ab9"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Sep 29 15:18:18 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Sep 29 15:18:18 2008 -0400"
      },
      "message": "Btrfs: add and improve comments\n\nThis improves the comments at the top of many functions.  It didn\u0027t\ndive into the guts of functions because I was trying to\navoid merging problems with the new allocator and back reference work.\n\nextent-tree.c and volumes.c were both skipped, and there is definitely\nmore work todo in cleaning and commenting the code.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "65b51a009e29e64c0951f21ea17fdc66bbb0fbd7",
      "tree": "800926527fad4c12ca64083816f33be3d716ec13",
      "parents": [
        "18e35e0ab337ec99c7e03e9ae917745a352c0bb1"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Aug 01 15:11:20 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:06 2008 -0400"
      },
      "message": "btrfs_search_slot: reduce lock contention by cowing in two stages\n\nA btree block cow has two parts, the first is to allocate a destination\nblock and the second is to copy the old bock over.\n\nThe first part needs locks in the extent allocation tree, and may need to\ndo IO.  This changeset splits that into a separate function that can be\ncalled without any tree locks held.\n\nbtrfs_search_slot is changed to drop its path and start over if it has\nto COW a contended block.  This often means that many writers will\npre-alloc a new destination for a the same contended block, but they\ncache their prealloc for later use on lower levels in the tree.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "bcc63abbf3e9bf948a1b0129b3e6120ec7d7f698",
      "tree": "1c66dc210f948f79c86786368d2c75b57482875d",
      "parents": [
        "33958dc6d38fb4ca7e62273855fcb2db7e616263"
      ],
      "author": {
        "name": "Yan",
        "email": "zheng.yan@oracle.com",
        "time": "Wed Jul 30 16:29:20 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:05 2008 -0400"
      },
      "message": "Btrfs: implement memory reclaim for leaf reference cache\n\nThe memory reclaiming issue happens when snapshot exists. In that\ncase, some cache entries may not be used during old snapshot dropping,\nso they will remain in the cache until umount.\n\nThe patch adds a field to struct btrfs_leaf_ref to record create time. Besides,\nthe patch makes all dead roots of a given snapshot linked together in order of\ncreate time. After a old snapshot was completely dropped, we check the dead\nroot list and remove all cache entries created before the oldest dead root in\nthe list.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "4881ee5a2e995c6a8999b56de70aa3834369d8ee",
      "tree": "bdc4e616fccb851656b16345b9bde8515ee4cff5",
      "parents": [
        "89642229a582a5c2b6d2ed8ec16986387d9a9047"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Jul 24 09:51:08 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:05 2008 -0400"
      },
      "message": "Btrfs: Fix some build problems on 2.6.18 based enterprise kernels\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "6dddcbeb28b34620ad033f1e8d9f6960bafdd7d2",
      "tree": "f13d7162e219b4028e941cac904999f729e197b2",
      "parents": [
        "f421950f86bf96a11fef932e167ab2e70d4c43a0"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Jul 22 11:18:09 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:05 2008 -0400"
      },
      "message": "Btrfs: Use mutex_lock_nested for tree locking\n\nLockdep has the notion of locking subclasses so that you can identify\nlocks you expect to be taken after other locks of the same class.  This\nchanges the per-extent buffer btree locking routines to use a subclass based\non the level in the tree.\n\nUnfortunately, lockdep can only handle 8 total subclasses, and the btrfs\nmax level is also 8.  So when lockdep is on, use a lower max level.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "a61e6f29dc7c9d56a776a518eed92bbc61848263",
      "tree": "6856ad3e5822eacfc2ac94693b6023ef81567fd2",
      "parents": [
        "6af118ce51b52ceda357c671550c79628b9c4a65"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Jul 22 11:18:08 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:05 2008 -0400"
      },
      "message": "Btrfs: Use a mutex in the extent buffer for tree block locking\n\nThis replaces the use of the page cache lock bit for locking, which wasn\u0027t\nsuitable for block size \u003c page size and couldn\u0027t be used recursively.\n\nThe mutexes alone don\u0027t fix either problem, but they are the first step.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "f9efa9c784aa3b801feb367f72c6867d26fb348e",
      "tree": "d9f678310c6c8a4daf2003fa4f6b4164111dbbd7",
      "parents": [
        "3f157a2fd2ad731e1ed9964fecdc5f459f04a4a4"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Jun 25 16:14:04 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:04 2008 -0400"
      },
      "message": "Btrfs: Reduce contention on the root node\n\nThis calls unlock_up sooner in btrfs_search_slot in order to decrease the\namount of work done with the higher level tree locks held.\n\nAlso, it changes btrfs_tree_lock to spin for a big against the page lock\nbefore scheduling.  This makes a big difference in context switch rate under\nhighly contended workloads.\n\nLonger term, a better locking structure is needed than the page lock.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "925baeddc5b0764a53f2214a1253251bab0e0324",
      "tree": "0e069bf9cc1c4ecd17c812fd1fb81bf807909ee6",
      "parents": [
        "1cc127b5d1b71453091859301de4a7dd6ee96fa8"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Jun 25 16:01:30 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:03 2008 -0400"
      },
      "message": "Btrfs: Start btree concurrency work.\n\nThe allocation trees and the chunk trees are serialized via their own\ndedicated mutexes.  This means allocation location is still not very\nfine grained.\n\nThe main FS btree is protected by locks on each block in the btree.  Locks\nare taken top / down, and as processing finishes on a given level of the\ntree, the lock is released after locking the lower level.\n\nThe end result of a search is now a path where only the lowest level\nis locked.  Releasing or freeing the path drops any locks held.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    }
  ]
}
