{"action":"created","comment":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/106977971","pull_request_review_id":27925583,"id":106977971,"diff_hunk":"@@ -0,0 +1,913 @@\n+=====================================================================\n+2016-07-28 Draft 4\t\tZFS Multi-{Modifier,Mount} Protection\n+=====================================================================\n+Originally created 2009 by ricardo.correia@oracle.com\n+  ** references 1\n+Revised 2017 by {faaland1,bass6,behlendorf1}@llnl.gov\n+=====================================================================\n+\n+As stated in RFE 6710718 (multi-import protection for the DMU), it would be\n+desirable to have protection against more than 1 node having the same ZFS pool\n+open read/write simultaneously, in order to prevent catastrophic corruption in\n+case of malfunction of an HA mechanism in a failover scenario or simply in the\n+face of a mistake/misconfiguration by an administrator in a networked\n+environment.\n+\n+This proposal is based on a similar multi-mount protection mechanism\n+implemented for ext3/ldiskfs.  For consistency in acronyms, we suggest this\n+functionality should also be called MMP - multi-modifier protection.\n+\n+=== Introduction ===\n+\n+Currently, to prevent corruption due to multiple entities importing and\n+accessing the same ZFS pool at the same time, ZFS relies on reading the pool\n+status from the vdev label as well as the host id of the node that last\n+imported it. While this provides some amount of protection, it would be\n+desirable to have a more reliable mechanism that could protect from \"zpool\n+import -f\" overrides which is needed in failover scenarios, where the HA\n+mechanism may not be 100% reliable.\n+\n+Without having a proper external fencing/STONITH mechanism, it is impossible to\n+guarantee mutual exclusion on different nodes due to the impossibility of\n+determining whether a node has died or if it's just temporarily stuck or very\n+heavily loaded. However, it is possible to use a few techniques that minimize\n+the chances of a double spa_open() in read/write mode happening on different\n+nodes or, failing that, bring down the node once such a situation is detected\n+to hopefully do damage control.\n+\n+The mechanism here proposed will allow us to provide a very good amount of\n+protection against this problem while still being lightweight enough to be\n+enabled in high-performance environments.\n+\n+=== Use cases ===\n+\n+There should be made a distinction of which scenarios we are trying to avoid.\n+\n+The general desire is to prevent a ZFS pool, or devices within a pool, from\n+being opened in read/write mode by different nodes simultaneously.  There are\n+at least four ways this could happen easily:\n+\n+1) A node has a pool open and is alive, but another node forcibly imports the\n+pool erroneuosly, thinking the first node has died.  This is the most important\n+scenario that we are trying to avoid.\n+\n+The current design attempts to handle such issues by reading the host id from\n+the vdev labels when opening the pool, but in an HA environment the import is\n+typically issued with --force, defeating this.  Furthermore, in a Linux\n+environment, there is no such host id that can be relied upon.\n+\n+2) Different nodes trying to import a non-imported pool at the same time.\n+\n+These could occur in a lustre filesystem whose OSTs or MDTs use shared storage\n+and are configured for failover, and whose HA tool is misconfigured; or\n+manually, in error: e.g. an admin running zpool import on two nodes at the same\n+time.\n+\n+ZFS on Linux has two such non-imported states of a pool; exported, where a\n+zpool export has been issued; and closed but inactive, such as when the ZFS\n+modules were unloaded without a zpool export being performed first.  The\n+on-disk state is slightly different in these two cases, but they are equivalent\n+from an MMP perspective.\n+\n+3) Different nodes trying to add devices to an existing pool or create a new\n+pool, using a common set of unused devices.\n+\n+4) One node trying to add devices to an existing pool or create a new pool,\n+using devices already part of another pool.\n+\n+=== ext3/ldiskfs ===\n+\n+The existing multi-mount protection (MMP) mechanism in ext3/ldiskfs is based on\n+having a block in the filesystem (the MMP block) which is updated periodically\n+(e.g., every 5 seconds) to indicate that a node that has mounted the filesystem\n+is still alive. Using this heartbeat-like mechanism, it is possible for another\n+node that is attempting to mount the filesystem to check (among other things)\n+whether this block is changing and therefore determine if it should be safe to\n+mount the filesystem or not.\n+\n+For ZFS, there are several new considerations that must be taken into account,\n+one of them being the fact that a ZFS pool can have multiple devices.  Not all\n+of them may be accessible at a given point in time.  In addtion, there are\n+scenarios such as adding a device to an existing pool, or use of a hot spare,\n+where different nodes must not attempt to use the same device at the same time.\n+\n+Furthermore, we would like to take this opportunity to make a few improvements\n+to the previous design.\n+\n+=== Multi-modifier protection struct (MMP struct) ===\n+\n+The MMP structure is a piece of data periodically written to stable storage\n+that will allow a node that wants to open a pool in read/write mode to make an\n+educated guess of whether another node also has the pool currently open.  It\n+should contain at least the following data:\n+\n+struct mmp_struct {\n+      uint64_t mmp_magic;\n+      uint64_t mmp_pool_guid;\n+      uint64_t mmp_open_id;\n+      uint64_t mmp_seq;\n+      uint32_t mmp_interval;\n+      uint32_t mmp_delay;\n+      zio_eck_t mmp_eck;\n+\n+/* Nice-to-have fields: */\n+      char\t\tmmp_nodename[64];\n+};\n+\n+* mmp_magic:     Constant value used for sanity checking.\n+* mmp_pool_guid: Pool guid.\n+* mmp_open_id:   A random 64-bit value generated when opening the pool in\n+\t\t read/write mode. A special constant value (MMP_CLEAN_ID)\n+\t\t indicates the pool has been closed cleanly.\n+* mmp_seq:       A sequence number. Starts at 0 when a pool is first opened\n+\t\t and increases by at least 1, every mmp_interval period.\n+\t\t Also increases by at least 1, at each spa_sync.\n+* mmp_interval:  Fixed interval at which MMP blocks are being written\n+\t\t (in milliseconds, usually 5000).  They are also written\n+\t\t independently, based on pool change.\n+* mmp_delay:\t Delay being experienced (in milliseconds) by CPU scheduling\n+\t\t + I/O latency.\n+* mmp_eck:       Embedded checksum of the MMP data.  To work with existing\n+\t\t zio code, this will be stored at the end of the MMP block,\n+\t\t and is not part of the MMP block itself.\n+\n+Suggested fields:\n+\n+* mmp_nodename:  Hostname of the node that wrote this MMP block, for admin\n+                 notification purposes.\n+\n+All nodes must know reliably where to read this data, since these on-disk\n+structures are the communication medium between nodes.  This is simplest if the\n+data is written to a fixed on-disk position.","path":"doc/RFC-MMP.llnl.04.txt","position":141,"original_position":141,"commit_id":"dd9d402d77da4e58eb94a5fc252936f6d5de2afe","original_commit_id":"dd9d402d77da4e58eb94a5fc252936f6d5de2afe","user":{"login":"ofaaland","id":8368499,"avatar_url":"https://avatars3.githubusercontent.com/u/8368499?v=3","gravatar_id":"","url":"https://api.github.com/users/ofaaland","html_url":"https://github.com/ofaaland","followers_url":"https://api.github.com/users/ofaaland/followers","following_url":"https://api.github.com/users/ofaaland/following{/other_user}","gists_url":"https://api.github.com/users/ofaaland/gists{/gist_id}","starred_url":"https://api.github.com/users/ofaaland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ofaaland/subscriptions","organizations_url":"https://api.github.com/users/ofaaland/orgs","repos_url":"https://api.github.com/users/ofaaland/repos","events_url":"https://api.github.com/users/ofaaland/events{/privacy}","received_events_url":"https://api.github.com/users/ofaaland/received_events","type":"User","site_admin":false},"body":"Sorry, this ended up a little more suspenseful than it needed to be.  I'll say here where they go and refer to later discussion of the \"why\".","created_at":"2017-03-20T18:19:52Z","updated_at":"2017-03-20T18:19:52Z","html_url":"https://github.com/zfsonlinux/zfs/pull/5821#discussion_r106977971","pull_request_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821","_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/106977971"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/5821#discussion_r106977971"},"pull_request":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821"}}},"pull_request":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821","id":107701344,"html_url":"https://github.com/zfsonlinux/zfs/pull/5821","diff_url":"https://github.com/zfsonlinux/zfs/pull/5821.diff","patch_url":"https://github.com/zfsonlinux/zfs/pull/5821.patch","issue_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/5821","number":5821,"state":"open","locked":false,"title":"[WIP] MMP design documents","user":{"login":"ofaaland","id":8368499,"avatar_url":"https://avatars3.githubusercontent.com/u/8368499?v=3","gravatar_id":"","url":"https://api.github.com/users/ofaaland","html_url":"https://github.com/ofaaland","followers_url":"https://api.github.com/users/ofaaland/followers","following_url":"https://api.github.com/users/ofaaland/following{/other_user}","gists_url":"https://api.github.com/users/ofaaland/gists{/gist_id}","starred_url":"https://api.github.com/users/ofaaland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ofaaland/subscriptions","organizations_url":"https://api.github.com/users/ofaaland/orgs","repos_url":"https://api.github.com/users/ofaaland/repos","events_url":"https://api.github.com/users/ofaaland/events{/privacy}","received_events_url":"https://api.github.com/users/ofaaland/received_events","type":"User","site_admin":false},"body":"<!--- Provide a general summary of your changes in the Title above -->\r\n\r\n### Description\r\n<!--- Describe your changes in detail -->\r\nThese documents describe the design of a new feature, MMP, see https://github.com/zfsonlinux/zfs/issues/745.\r\n\r\nIt's not clear where these documents should go when they are finalized; this PR is just to allow comment.\r\n\r\nThey are revisions to the Correia proposal linked below, and additional materials created while working out the issues.\r\n\r\n### Motivation and Context\r\n<!--- Why is this change required? What problem does it solve? -->\r\n<!--- If it fixes an open issue, please link to the issue here. -->\r\nFrom Correia, 2009, https://bugzilla.lustre.org/show_bug.cgi?id=15350:\r\nIt would be desirable to have protection against more than 1 node having the same ZFS pool open read/write simultaneously, in order to prevent catastrophic corruption in case of malfunction of an HA mechanism in a failover scenario or simply in the face of a mistake/misconfiguration by an administrator in a networked environment.\r\n\r\n### How Has This Been Tested?\r\n<!--- Please describe in detail how you tested your changes. -->\r\n<!--- Include details of your testing environment, and the tests you ran to -->\r\n<!--- see how your change affects other areas of the code, etc. -->\r\n<!--- If your change is a performance enhancement, please provide benchmarks here. -->\r\n\r\n### Types of changes\r\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\r\n- [ ] Bug fix (non-breaking change which fixes an issue)\r\n- [ ] New feature (non-breaking change which adds functionality)\r\n- [ ] Performance enhancement (non-breaking change which improves efficiency)\r\n- [ ] Code cleanup (non-breaking change which makes code smaller or more readable)\r\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\r\n\r\n### Checklist:\r\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\r\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\r\n- [ ] My code follows the ZFS on Linux code style requirements.\r\n- [ ] I have updated the documentation accordingly.\r\n- [ ] I have read the **CONTRIBUTING** document.\r\n- [ ] I have added tests to cover my changes.\r\n- [ ] All new and existing tests passed.\r\n- [ ] Change has been approved by a ZFS on Linux member.\r\n","created_at":"2017-02-23T20:02:09Z","updated_at":"2017-03-20T18:19:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"735674361e20cc83ac6cc528d8e317926c63d759","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821/commits","review_comments_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821/comments","review_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/5821/comments","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/dd9d402d77da4e58eb94a5fc252936f6d5de2afe","head":{"label":"ofaaland:b_mmp_design","ref":"b_mmp_design","sha":"dd9d402d77da4e58eb94a5fc252936f6d5de2afe","user":{"login":"ofaaland","id":8368499,"avatar_url":"https://avatars3.githubusercontent.com/u/8368499?v=3","gravatar_id":"","url":"https://api.github.com/users/ofaaland","html_url":"https://github.com/ofaaland","followers_url":"https://api.github.com/users/ofaaland/followers","following_url":"https://api.github.com/users/ofaaland/following{/other_user}","gists_url":"https://api.github.com/users/ofaaland/gists{/gist_id}","starred_url":"https://api.github.com/users/ofaaland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ofaaland/subscriptions","organizations_url":"https://api.github.com/users/ofaaland/orgs","repos_url":"https://api.github.com/users/ofaaland/repos","events_url":"https://api.github.com/users/ofaaland/events{/privacy}","received_events_url":"https://api.github.com/users/ofaaland/received_events","type":"User","site_admin":false},"repo":{"id":39711169,"name":"zfs","full_name":"ofaaland/zfs","owner":{"login":"ofaaland","id":8368499,"avatar_url":"https://avatars3.githubusercontent.com/u/8368499?v=3","gravatar_id":"","url":"https://api.github.com/users/ofaaland","html_url":"https://github.com/ofaaland","followers_url":"https://api.github.com/users/ofaaland/followers","following_url":"https://api.github.com/users/ofaaland/following{/other_user}","gists_url":"https://api.github.com/users/ofaaland/gists{/gist_id}","starred_url":"https://api.github.com/users/ofaaland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ofaaland/subscriptions","organizations_url":"https://api.github.com/users/ofaaland/orgs","repos_url":"https://api.github.com/users/ofaaland/repos","events_url":"https://api.github.com/users/ofaaland/events{/privacy}","received_events_url":"https://api.github.com/users/ofaaland/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ofaaland/zfs","description":"Native ZFS for Linux","fork":true,"url":"https://api.github.com/repos/ofaaland/zfs","forks_url":"https://api.github.com/repos/ofaaland/zfs/forks","keys_url":"https://api.github.com/repos/ofaaland/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ofaaland/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ofaaland/zfs/teams","hooks_url":"https://api.github.com/repos/ofaaland/zfs/hooks","issue_events_url":"https://api.github.com/repos/ofaaland/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/ofaaland/zfs/events","assignees_url":"https://api.github.com/repos/ofaaland/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/ofaaland/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/ofaaland/zfs/tags","blobs_url":"https://api.github.com/repos/ofaaland/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ofaaland/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ofaaland/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/ofaaland/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ofaaland/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/ofaaland/zfs/languages","stargazers_url":"https://api.github.com/repos/ofaaland/zfs/stargazers","contributors_url":"https://api.github.com/repos/ofaaland/zfs/contributors","subscribers_url":"https://api.github.com/repos/ofaaland/zfs/subscribers","subscription_url":"https://api.github.com/repos/ofaaland/zfs/subscription","commits_url":"https://api.github.com/repos/ofaaland/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/ofaaland/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/ofaaland/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/ofaaland/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/ofaaland/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/ofaaland/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ofaaland/zfs/merges","archive_url":"https://api.github.com/repos/ofaaland/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ofaaland/zfs/downloads","issues_url":"https://api.github.com/repos/ofaaland/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/ofaaland/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/ofaaland/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/ofaaland/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ofaaland/zfs/labels{/name}","releases_url":"https://api.github.com/repos/ofaaland/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/ofaaland/zfs/deployments","created_at":"2015-07-26T02:46:33Z","updated_at":"2016-02-04T16:19:39Z","pushed_at":"2017-03-16T23:24:23Z","git_url":"git://github.com/ofaaland/zfs.git","ssh_url":"git@github.com:ofaaland/zfs.git","clone_url":"https://github.com/ofaaland/zfs.git","svn_url":"https://github.com/ofaaland/zfs","homepage":"http://zfsonlinux.org/","size":36431,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"zfsonlinux:master","ref":"master","sha":"6d82f98c3d9f83045a801df60f904421b101faa9","user":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars0.githubusercontent.com/u/575083?v=3","gravatar_id":"","url":"https://api.github.com/users/zfsonlinux","html_url":"https://github.com/zfsonlinux","followers_url":"https://api.github.com/users/zfsonlinux/followers","following_url":"https://api.github.com/users/zfsonlinux/following{/other_user}","gists_url":"https://api.github.com/users/zfsonlinux/gists{/gist_id}","starred_url":"https://api.github.com/users/zfsonlinux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zfsonlinux/subscriptions","organizations_url":"https://api.github.com/users/zfsonlinux/orgs","repos_url":"https://api.github.com/users/zfsonlinux/repos","events_url":"https://api.github.com/users/zfsonlinux/events{/privacy}","received_events_url":"https://api.github.com/users/zfsonlinux/received_events","type":"Organization","site_admin":false},"repo":{"id":437011,"name":"zfs","full_name":"zfsonlinux/zfs","owner":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars0.githubusercontent.com/u/575083?v=3","gravatar_id":"","url":"https://api.github.com/users/zfsonlinux","html_url":"https://github.com/zfsonlinux","followers_url":"https://api.github.com/users/zfsonlinux/followers","following_url":"https://api.github.com/users/zfsonlinux/following{/other_user}","gists_url":"https://api.github.com/users/zfsonlinux/gists{/gist_id}","starred_url":"https://api.github.com/users/zfsonlinux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zfsonlinux/subscriptions","organizations_url":"https://api.github.com/users/zfsonlinux/orgs","repos_url":"https://api.github.com/users/zfsonlinux/repos","events_url":"https://api.github.com/users/zfsonlinux/events{/privacy}","received_events_url":"https://api.github.com/users/zfsonlinux/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/zfsonlinux/zfs","description":"ZFS on Linux - the official OpenZFS implementation for Linux.","fork":false,"url":"https://api.github.com/repos/zfsonlinux/zfs","forks_url":"https://api.github.com/repos/zfsonlinux/zfs/forks","keys_url":"https://api.github.com/repos/zfsonlinux/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zfsonlinux/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zfsonlinux/zfs/teams","hooks_url":"https://api.github.com/repos/zfsonlinux/zfs/hooks","issue_events_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/zfsonlinux/zfs/events","assignees_url":"https://api.github.com/repos/zfsonlinux/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/zfsonlinux/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/zfsonlinux/zfs/tags","blobs_url":"https://api.github.com/repos/zfsonlinux/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zfsonlinux/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zfsonlinux/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/zfsonlinux/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/zfsonlinux/zfs/languages","stargazers_url":"https://api.github.com/repos/zfsonlinux/zfs/stargazers","contributors_url":"https://api.github.com/repos/zfsonlinux/zfs/contributors","subscribers_url":"https://api.github.com/repos/zfsonlinux/zfs/subscribers","subscription_url":"https://api.github.com/repos/zfsonlinux/zfs/subscription","commits_url":"https://api.github.com/repos/zfsonlinux/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/zfsonlinux/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/zfsonlinux/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/zfsonlinux/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zfsonlinux/zfs/merges","archive_url":"https://api.github.com/repos/zfsonlinux/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zfsonlinux/zfs/downloads","issues_url":"https://api.github.com/repos/zfsonlinux/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/zfsonlinux/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/zfsonlinux/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zfsonlinux/zfs/labels{/name}","releases_url":"https://api.github.com/repos/zfsonlinux/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/zfsonlinux/zfs/deployments","created_at":"2009-12-14T20:20:34Z","updated_at":"2017-03-20T02:00:36Z","pushed_at":"2017-03-20T13:23:37Z","git_url":"git://github.com/zfsonlinux/zfs.git","ssh_url":"git@github.com:zfsonlinux/zfs.git","clone_url":"https://github.com/zfsonlinux/zfs.git","svn_url":"https://github.com/zfsonlinux/zfs","homepage":"http://zfsonlinux.org/","size":36756,"stargazers_count":2311,"watchers_count":2311,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":561,"mirror_url":null,"open_issues_count":893,"forks":561,"open_issues":893,"watchers":2311,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/5821"},"issue":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/5821"},"comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/5821/comments"},"review_comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821/comments"},"review_comment":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5821/commits"},"statuses":{"href":"https://api.github.com/repos/zfsonlinux/zfs/statuses/dd9d402d77da4e58eb94a5fc252936f6d5de2afe"}}}}
{"actor":{"display_login":"ofaaland"}}