)]}'
{
  "log": [
    {
      "commit": "2175bb06dc6cf2af9c098a1770561f9e63edae4e",
      "tree": "579c8d4b3f4f92efee919953dab2c78cea8c21ea",
      "parents": [
        "201a15428bd54f83eccec8b7c64a04b8f9431204"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:38 2009 +0000"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:38 2009 +0000"
      },
      "message": "FS-Cache: Add a retirement stat counter\n\nAdd a stat counter to count retirement events rather than ordinary release\nevents (the retire argument to fscache_relinquish_cookie()).\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "1bccf513ac49d44604ba1cddcc29f5886e70f1b6",
      "tree": "096ba75a3d02018c5f6e1857aaf1d41471733850",
      "parents": [
        "6897e3df8fc37bd4a58bbcdef8306da7fc175584"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:25 2009 +0000"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:25 2009 +0000"
      },
      "message": "FS-Cache: Fix lock misorder in fscache_write_op()\n\nFS-Cache has two structs internally for keeping track of the internal state of\na cached file: the fscache_cookie struct, which represents the netfs\u0027s state,\nand fscache_object struct, which represents the cache\u0027s state.  Each has a\npointer that points to the other (when both are in existence), and each has a\nspinlock for pointer maintenance.\n\nSince netfs operations approach these structures from the cookie side, they get\nthe cookie lock first, then the object lock.  Cache operations, on the other\nhand, approach from the object side, and get the object lock first.  It is not\nthen permitted for a cache operation to get the cookie lock whilst it is\nholding the object lock lest deadlock occur; instead, it must do one of two\nthings:\n\n (1) increment the cookie usage counter, drop the object lock and then get both\n     locks in order, or\n\n (2) simply hold the object lock as certain parts of the cookie may not be\n     altered whilst the object lock is held.\n\nIt is also not permitted to follow either pointer without holding the lock at\nthe end you start with.  To break the pointers between the cookie and the\nobject, both locks must be held.\n\nfscache_write_op(), however, violates the locking rules: It attempts to get the\ncookie lock without (a) checking that the cookie pointer is a valid pointer,\nand (b) holding the object lock to protect the cookie pointer whilst it follows\nit.  This is so that it can access the pending page store tree without\ninterference from __fscache_write_page().\n\nThis is fixed by splitting the cookie lock, such that the page store tracking\ntree is protected by its own lock, and checking that the cookie pointer is\nnon-NULL before we attempt to follow it whilst holding the object lock.\n\nThe new lock is subordinate to both the cookie lock and the object lock, and so\nshould be taken after those.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "b34df792b4e9e311db47fad27949095d0629c197",
      "tree": "c0d513580d5d714066666993224970916e1f9358",
      "parents": [
        "7e311a207d596b9273d811149d6e3e14f05ac4c0"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:14 2009 +0000"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:14 2009 +0000"
      },
      "message": "FS-Cache: Use radix tree preload correctly in tracking of pages to be stored\n\n__fscache_write_page() attempts to load the radix tree preallocation pool for\nthe CPU it is on before calling radix_tree_insert(), as the insertion must be\ndone inside a pair of spinlocks.\n\nUse of the preallocation pool, however, is contingent on the radix tree being\ninitialised without __GFP_WAIT specified.  __fscache_acquire_cookie() was\npassing GFP_NOFS to INIT_RADIX_TREE() - but that includes __GFP_WAIT.\n\nThe solution is to AND out __GFP_WAIT.\n\nAdditionally, the banner comment to radix_tree_preload() is altered to make\nnote of this prerequisite.  Possibly there should be a WARN_ON() too.\n\nWithout this fix, I have seen the following recursive deadlock caused by\nradix_tree_insert() attempting to allocate memory inside the spinlocked\nregion, which resulted in FS-Cache being called back into to release memory -\nwhich required the spinlock already held.\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n[ INFO: possible recursive locking detected ]\n2.6.32-rc6-cachefs #24\n---------------------------------------------\nnfsiod/7916 is trying to acquire lock:\n (\u0026cookie-\u003elock){+.+.-.}, at: [\u003cffffffffa0076872\u003e] __fscache_uncache_page+0xdb/0x160 [fscache]\n\nbut task is already holding lock:\n (\u0026cookie-\u003elock){+.+.-.}, at: [\u003cffffffffa0076acc\u003e] __fscache_write_page+0x15c/0x3f3 [fscache]\n\nother info that might help us debug this:\n5 locks held by nfsiod/7916:\n #0:  (nfsiod){+.+.+.}, at: [\u003cffffffff81048290\u003e] worker_thread+0x19a/0x2e2\n #1:  (\u0026task-\u003eu.tk_work#2){+.+.+.}, at: [\u003cffffffff81048290\u003e] worker_thread+0x19a/0x2e2\n #2:  (\u0026cookie-\u003elock){+.+.-.}, at: [\u003cffffffffa0076acc\u003e] __fscache_write_page+0x15c/0x3f3 [fscache]\n #3:  (\u0026object-\u003elock#2){+.+.-.}, at: [\u003cffffffffa0076b07\u003e] __fscache_write_page+0x197/0x3f3 [fscache]\n #4:  (\u0026cookie-\u003estores_lock){+.+...}, at: [\u003cffffffffa0076b0f\u003e] __fscache_write_page+0x19f/0x3f3 [fscache]\n\nstack backtrace:\nPid: 7916, comm: nfsiod Not tainted 2.6.32-rc6-cachefs #24\nCall Trace:\n [\u003cffffffff8105ac7f\u003e] __lock_acquire+0x1649/0x16e3\n [\u003cffffffff81059ded\u003e] ? __lock_acquire+0x7b7/0x16e3\n [\u003cffffffff8100e27d\u003e] ? dump_trace+0x248/0x257\n [\u003cffffffff8105ad70\u003e] lock_acquire+0x57/0x6d\n [\u003cffffffffa0076872\u003e] ? __fscache_uncache_page+0xdb/0x160 [fscache]\n [\u003cffffffff8135467c\u003e] _spin_lock+0x2c/0x3b\n [\u003cffffffffa0076872\u003e] ? __fscache_uncache_page+0xdb/0x160 [fscache]\n [\u003cffffffffa0076872\u003e] __fscache_uncache_page+0xdb/0x160 [fscache]\n [\u003cffffffffa0077eb7\u003e] ? __fscache_check_page_write+0x0/0x71 [fscache]\n [\u003cffffffffa00b4755\u003e] nfs_fscache_release_page+0x86/0xc4 [nfs]\n [\u003cffffffffa00907f0\u003e] nfs_release_page+0x3c/0x41 [nfs]\n [\u003cffffffff81087ffb\u003e] try_to_release_page+0x32/0x3b\n [\u003cffffffff81092c2b\u003e] shrink_page_list+0x316/0x4ac\n [\u003cffffffff81058a9b\u003e] ? mark_held_locks+0x52/0x70\n [\u003cffffffff8135451b\u003e] ? _spin_unlock_irq+0x2b/0x31\n [\u003cffffffff81093153\u003e] shrink_inactive_list+0x392/0x67c\n [\u003cffffffff81058a9b\u003e] ? mark_held_locks+0x52/0x70\n [\u003cffffffff810934ca\u003e] shrink_list+0x8d/0x8f\n [\u003cffffffff81093744\u003e] shrink_zone+0x278/0x33c\n [\u003cffffffff81052c70\u003e] ? ktime_get_ts+0xad/0xba\n [\u003cffffffff8109453b\u003e] try_to_free_pages+0x22e/0x392\n [\u003cffffffff8109184c\u003e] ? isolate_pages_global+0x0/0x212\n [\u003cffffffff8108e16b\u003e] __alloc_pages_nodemask+0x3dc/0x5cf\n [\u003cffffffff810ae24a\u003e] cache_alloc_refill+0x34d/0x6c1\n [\u003cffffffff811bcf74\u003e] ? radix_tree_node_alloc+0x52/0x5c\n [\u003cffffffff810ae929\u003e] kmem_cache_alloc+0xb2/0x118\n [\u003cffffffff811bcf74\u003e] radix_tree_node_alloc+0x52/0x5c\n [\u003cffffffff811bcfd5\u003e] radix_tree_insert+0x57/0x19c\n [\u003cffffffffa0076b53\u003e] __fscache_write_page+0x1e3/0x3f3 [fscache]\n [\u003cffffffffa00b4248\u003e] __nfs_readpage_to_fscache+0x58/0x11e [nfs]\n [\u003cffffffffa009bb77\u003e] nfs_readpage_release+0x34/0x9b [nfs]\n [\u003cffffffffa009c0d9\u003e] nfs_readpage_release_full+0x32/0x4b [nfs]\n [\u003cffffffffa0006cff\u003e] rpc_release_calldata+0x12/0x14 [sunrpc]\n [\u003cffffffffa0006e2d\u003e] rpc_free_task+0x59/0x61 [sunrpc]\n [\u003cffffffffa0006f03\u003e] rpc_async_release+0x10/0x12 [sunrpc]\n [\u003cffffffff810482e5\u003e] worker_thread+0x1ef/0x2e2\n [\u003cffffffff81048290\u003e] ? worker_thread+0x19a/0x2e2\n [\u003cffffffff81352433\u003e] ? thread_return+0x3e/0x101\n [\u003cffffffffa0006ef3\u003e] ? rpc_async_release+0x0/0x12 [sunrpc]\n [\u003cffffffff8104bff5\u003e] ? autoremove_wake_function+0x0/0x34\n [\u003cffffffff81058d25\u003e] ? trace_hardirqs_on+0xd/0xf\n [\u003cffffffff810480f6\u003e] ? worker_thread+0x0/0x2e2\n [\u003cffffffff8104bd21\u003e] kthread+0x7a/0x82\n [\u003cffffffff8100beda\u003e] child_rip+0xa/0x20\n [\u003cffffffff8100b87c\u003e] ? restore_args+0x0/0x30\n [\u003cffffffff8104c2b9\u003e] ? add_wait_queue+0x15/0x44\n [\u003cffffffff8104bca7\u003e] ? kthread+0x0/0x82\n [\u003cffffffff8100bed0\u003e] ? child_rip+0x0/0x20\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "7e311a207d596b9273d811149d6e3e14f05ac4c0",
      "tree": "96c766e56e73df02a430bc0df72066413838fed0",
      "parents": [
        "52bd75fdb135d6133d878ae60c6e7e3f4ebc1cfc"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:11 2009 +0000"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:11 2009 +0000"
      },
      "message": "FS-Cache: Clear netfs pointers in cookie after detaching object, not before\n\nClear the pointers from the fscache_cookie struct to netfs private data after\nclearing the pointer to the cookie from the fscache_object struct and\nreleasing the object lock, rather than before.\n\nThis allows the netfs private data pointers to be relied on simply by holding\nthe object lock, rather than having to hold the cookie lock.  This is makes\nthings simpler as the cookie lock has to be taken before the object lock, but\nsometimes the object pointer is all that the code has.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "52bd75fdb135d6133d878ae60c6e7e3f4ebc1cfc",
      "tree": "4fad4fa37ce533c520a4575e5b7df90e19c6a666",
      "parents": [
        "4fbf4291aa15926cd4fdca0ffe9122e89d0459db"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:08 2009 +0000"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:08 2009 +0000"
      },
      "message": "FS-Cache: Add counters for entry/exit to/from cache operation functions\n\nCount entries to and exits from cache operation table functions.  Maintain\nthese as a single counter that\u0027s added to or removed from as appropriate.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "4fbf4291aa15926cd4fdca0ffe9122e89d0459db",
      "tree": "ec2195c39ef8117acea598af4a5c20c77f67aa0b",
      "parents": [
        "440f0affe247e9990c8f8778f1861da4fd7d5e50"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:04 2009 +0000"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Thu Nov 19 18:11:04 2009 +0000"
      },
      "message": "FS-Cache: Allow the current state of all objects to be dumped\n\nAllow the current state of all fscache objects to be dumped by doing:\n\n\tcat /proc/fs/fscache/objects\n\nBy default, all objects and all fields will be shown.  This can be restricted\nby adding a suitable key to one of the caller\u0027s keyrings (such as the session\nkeyring):\n\n\tkeyctl add user fscache:objlist \"\u003crestrictions\u003e\" @s\n\nThe \u003crestrictions\u003e are:\n\n\tK\tShow hexdump of object key (don\u0027t show if not given)\n\tA\tShow hexdump of object aux data (don\u0027t show if not given)\n\nAnd paired restrictions:\n\n\tC\tShow objects that have a cookie\n\tc\tShow objects that don\u0027t have a cookie\n\tB\tShow objects that are busy\n\tb\tShow objects that aren\u0027t busy\n\tW\tShow objects that have pending writes\n\tw\tShow objects that don\u0027t have pending writes\n\tR\tShow objects that have outstanding reads\n\tr\tShow objects that don\u0027t have outstanding reads\n\tS\tShow objects that have slow work queued\n\ts\tShow objects that don\u0027t have slow work queued\n\nIf neither side of a restriction pair is given, then both are implied.  For\nexample:\n\n\tkeyctl add user fscache:objlist KB @s\n\nshows objects that are busy, and lists their object keys, but does not dump\ntheir auxiliary data.  It also implies \"CcWwRrSs\", but as \u0027B\u0027 is given, \u0027b\u0027 is\nnot implied.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "ccc4fc3d11e91477036d1f82bfa2d442f6ce77f0",
      "tree": "c3ead4b385f9efce6e2688832dfb76391e18345d",
      "parents": [
        "36c9559022850f919269564a74bf17fdabf4bb30"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 03 16:42:38 2009 +0100"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 03 16:42:38 2009 +0100"
      },
      "message": "FS-Cache: Implement the cookie management part of the netfs API\n\nImplement the cookie management part of the FS-Cache netfs client API.  The\ndocumentation and API header file were added in a previous patch.\n\nThis patch implements the following three functions:\n\n (1) fscache_acquire_cookie().\n\n     Acquire a cookie to represent an object to the netfs.  If the object in\n     question is a non-index object, then that object and its parent indices\n     will be created on disk at this point if they don\u0027t already exist.  Index\n     creation is deferred because an index may reside in multiple caches.\n\n (2) fscache_relinquish_cookie().\n\n     Retire or release a cookie previously acquired.  At this point, the\n     object on disk may be destroyed.\n\n (3) fscache_update_cookie().\n\n     Update the in-cache representation of a cookie.  This is used to update\n     the auxiliary data for coherency management purposes.\n\nWith this patch it is possible to have a netfs instruct a cache backend to\nlook up, validate and create metadata on disk and to destroy it again.\nThe ability to actually store and retrieve data in the objects so created is\nadded in later patches.\n\nNote that these functions will never return an error.  _All_ errors are\nhandled internally to FS-Cache.\n\nThe worst that can happen is that fscache_acquire_cookie() may return a NULL\npointer - which is considered a negative cookie pointer and can be passed back\nto any function that takes a cookie without harm.  A negative cookie pointer\nmerely suppresses caching at that level.\n\nThe stub in linux/fscache.h will detect inline the negative cookie pointer and\nabort the operation as fast as possible.  This means that the compiler doesn\u0027t\nhave to set up for a call in that case.\n\nSee the documentation in Documentation/filesystems/caching/netfs-api.txt for\nmore information.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: Steve Dickson \u003csteved@redhat.com\u003e\nAcked-by: Trond Myklebust \u003cTrond.Myklebust@netapp.com\u003e\nAcked-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\nTested-by: Daire Byrne \u003cDaire.Byrne@framestore.com\u003e\n"
    },
    {
      "commit": "955d00917f0c094e0f2fb88df967e980ab66b8ca",
      "tree": "c6109684239fd45462e494fb4f26aa8e2e651922",
      "parents": [
        "4c515dd47ab41be3f89e757d441661795470b376"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 03 16:42:38 2009 +0100"
      },
      "committer": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Apr 03 16:42:38 2009 +0100"
      },
      "message": "FS-Cache: Provide a slab for cookie allocation\n\nProvide a slab from which can be allocated the FS-Cache cookies that will be\npresented to the netfs.\n\nAlso provide a slab constructor and a function to recursively discard a cookie\nand its ancestor chain.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: Steve Dickson \u003csteved@redhat.com\u003e\nAcked-by: Trond Myklebust \u003cTrond.Myklebust@netapp.com\u003e\nAcked-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\nTested-by: Daire Byrne \u003cDaire.Byrne@framestore.com\u003e\n"
    }
  ]
}
