{"action":"created","comment":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/75173745","id":75173745,"diff_hunk":"@@ -0,0 +1,911 @@\n+/*\n+ * CDDL HEADER START\n+ *\n+ * The contents of this file are subject to the terms of the\n+ * Common Development and Distribution License (the \"License\").\n+ * You may not use this file except in compliance with the License.\n+ *\n+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE\n+ * or http://www.opensolaris.org/os/licensing.\n+ * See the License for the specific language governing permissions\n+ * and limitations under the License.\n+ *\n+ * When distributing Covered Code, include this CDDL HEADER in each\n+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.\n+ * If applicable, add the following below this CDDL HEADER, with the\n+ * fields enclosed by brackets \"[]\" replaced with your own identifying\n+ * information: Portions Copyright [yyyy] [name of copyright owner]\n+ *\n+ * CDDL HEADER END\n+ */\n+/*\n+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.\n+ * Copyright (c) 2012 by Delphix. All rights reserved.\n+ * Copyright 2014 Nexenta Systems, Inc. All rights reserved.\n+ * Copyright (c) 2016, Intel Corporation.\n+ */\n+\n+/*\n+ * ZFS syseventd module.\n+ *\n+ * file origin: openzfs/usr/src/cmd/syseventd/modules/zfs_mod/zfs_mod.c\n+ *\n+ * The purpose of this module is to identify when devices are added to the\n+ * system, and appropriately online or replace the affected vdevs.\n+ *\n+ * When a device is added to the system:\n+ *\n+ * \t1. Search for any vdevs whose devid matches that of the newly added\n+ *\t   device.\n+ *\n+ * \t2. If no vdevs are found, then search for any vdevs whose udev path\n+ *\t   matches that of the new device.\n+ *\n+ *\t3. If no vdevs match by either method, then ignore the event.\n+ *\n+ * \t4. Attempt to online the device with a flag to indicate that it should\n+ *\t   be unspared when resilvering completes.  If this succeeds, then the\n+ *\t   same device was inserted and we should continue normally.\n+ *\n+ *\t5. If the pool does not have the 'autoreplace' property set, attempt to\n+ *\t   online the device again without the unspare flag, which will\n+ *\t   generate a FMA fault.\n+ *\n+ *\t6. If the pool has the 'autoreplace' property set, and the matching vdev\n+ *\t   is a whole disk, then label the new disk and attempt a 'zpool\n+ *\t   replace'.\n+ *\n+ * The module responds to EC_DEV_ADD events.  The special ESC_ZFS_VDEV_CHECK\n+ * event indicates that a device failed to open during pool load, but the\n+ * autoreplace property was set.  In this case, we deferred the associated\n+ * FMA fault until our module had a chance to process the autoreplace logic.\n+ * If the device could not be replaced, then the second online attempt will\n+ * trigger the FMA fault that we skipped earlier.\n+ *\n+ * ZFS on Linux porting notes:\n+ *\tIn lieu of a thread pool, just spawn a thread on demmand.\n+ *\tLinux udev provides a disk insert for both the disk and the partition\n+ *\n+ */\n+\n+#include <ctype.h>\n+#include <devid.h>\n+#include <fcntl.h>\n+#include <libnvpair.h>\n+#include <libzfs.h>\n+#include <limits.h>\n+#include <stddef.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <syslog.h>\n+#include <sys/list.h>\n+#include <sys/sunddi.h>\n+#include <sys/sysevent/eventdefs.h>\n+#include <sys/sysevent/dev.h>\n+#include <pthread.h>\n+#include <unistd.h>\n+#include \"zfs_agents.h\"\n+#include \"../zed_log.h\"\n+\n+#define\tDEV_BYID_PATH\t\"/dev/disk/by-id/\"\n+#define\tDEV_BYPATH_PATH\t\"/dev/disk/by-path/\"\n+\n+typedef void (*zfs_process_func_t)(zpool_handle_t *, nvlist_t *, boolean_t);\n+\n+libzfs_handle_t *g_zfshdl;\n+list_t g_pool_list;\t/* list of unavailable pools at initialization */\n+list_t g_device_list;\t/* list of disks with asynchronous label request */\n+boolean_t g_enumeration_done;\n+pthread_t g_zfs_tid;\n+\n+typedef struct unavailpool {\n+\tzpool_handle_t\t*uap_zhp;\n+\tpthread_t\tuap_enable_tid;\t/* dataset enable thread if activated */\n+\tlist_node_t\tuap_node;\n+} unavailpool_t;\n+\n+typedef struct pendingdev {\n+\tchar\t\tpd_physpath[128];\n+\tlist_node_t\tpd_node;\n+} pendingdev_t;\n+\n+static int\n+zfs_toplevel_state(zpool_handle_t *zhp)\n+{\n+\tnvlist_t *nvroot;\n+\tvdev_stat_t *vs;\n+\tunsigned int c;\n+\n+\tverify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),\n+\t    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);\n+\tverify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_VDEV_STATS,\n+\t    (uint64_t **)&vs, &c) == 0);\n+\treturn (vs->vs_state);\n+}\n+\n+static int\n+zfs_unavail_pool(zpool_handle_t *zhp, void *data)\n+{\n+\tzed_log_msg(LOG_INFO, \"zfs_unavail_pool: examining '%s' (state %d)\",\n+\t    zpool_get_name(zhp), (int)zfs_toplevel_state(zhp));\n+\n+\tif (zfs_toplevel_state(zhp) < VDEV_STATE_DEGRADED) {\n+\t\tunavailpool_t *uap;\n+\t\tuap = malloc(sizeof (unavailpool_t));\n+\t\tuap->uap_zhp = zhp;\n+\t\tuap->uap_enable_tid = 0;\n+\t\tlist_insert_tail((list_t *)data, uap);\n+\t} else {\n+\t\tzpool_close(zhp);\n+\t}\n+\treturn (0);\n+}\n+\n+/*\n+ * Remove partition suffix from a vdev path.  Partition suffixes may take three\n+ * forms: \"-partX\", \"pX\", or \"X\", where X is a string of digits.  The second\n+ * case only occurs when the suffix is preceded by a digit, i.e. \"md0p0\" The\n+ * third case only occurs when preceded by a string matching the regular\n+ * expression \"^([hsv]|xv)d[a-z]+\", i.e. a scsi, ide, virtio or xen disk.\n+ */\n+static void\n+zfs_strip_partition(char *path)\n+{\n+\tchar *part = NULL, *d = NULL;\n+\n+\tpath = strrchr(path, '/');\n+\tpath++;\n+\n+\tif ((part = strstr(path, \"-part\")) && part != path) {\n+\t\td = part + 5;\n+\t} else if ((part = strrchr(path, 'p')) &&\n+\t    part > path + 1 && isdigit(*(part-1))) {\n+\t\td = part + 1;\n+\t} else if ((path[0] == 'h' || path[0] == 's' || path[0] == 'v') &&\n+\t    path[1] == 'd') {\n+\t\tfor (d = &path[2]; isalpha(*d); part = ++d);\n+\t} else if (strncmp(\"xvd\", path, 3) == 0) {\n+\t\tfor (d = &path[3]; isalpha(*d); part = ++d);\n+\t}\n+\tif (part && d && *d != '\\0') {\n+\t\tfor (; isdigit(*d); d++);\n+\t\tif (*d == '\\0')\n+\t\t\t*part = '\\0';\n+\t}\n+}","path":"cmd/zed/agents/zfs_mod.c","position":175,"original_position":175,"commit_id":"de3bde3cc5e227969361939ec1c1f82bde356fa7","original_commit_id":"f53e9f6c5c1f9ea0fac5ddfb1016d826be3229fc","user":{"login":"behlendorf","id":148917,"avatar_url":"https://avatars.githubusercontent.com/u/148917?v=3","gravatar_id":"","url":"https://api.github.com/users/behlendorf","html_url":"https://github.com/behlendorf","followers_url":"https://api.github.com/users/behlendorf/followers","following_url":"https://api.github.com/users/behlendorf/following{/other_user}","gists_url":"https://api.github.com/users/behlendorf/gists{/gist_id}","starred_url":"https://api.github.com/users/behlendorf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/behlendorf/subscriptions","organizations_url":"https://api.github.com/users/behlendorf/orgs","repos_url":"https://api.github.com/users/behlendorf/repos","events_url":"https://api.github.com/users/behlendorf/events{/privacy}","received_events_url":"https://api.github.com/users/behlendorf/received_events","type":"User","site_admin":false},"body":"Why not use the existing `strip_partition` function in libzfs.so?  The zed already links against the library and it would be easy to add to the public header file.","created_at":"2016-08-17T17:59:30Z","updated_at":"2016-08-17T17:59:30Z","html_url":"https://github.com/zfsonlinux/zfs/pull/4673#discussion_r75173745","pull_request_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673","_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/75173745"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/4673#discussion_r75173745"},"pull_request":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673"}}},"pull_request":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673","id":70801574,"html_url":"https://github.com/zfsonlinux/zfs/pull/4673","diff_url":"https://github.com/zfsonlinux/zfs/pull/4673.diff","patch_url":"https://github.com/zfsonlinux/zfs/pull/4673.patch","issue_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/4673","number":4673,"state":"open","locked":false,"title":"WIP - ZED FMA integration (phase one)","user":{"login":"don-brady","id":12415697,"avatar_url":"https://avatars.githubusercontent.com/u/12415697?v=3","gravatar_id":"","url":"https://api.github.com/users/don-brady","html_url":"https://github.com/don-brady","followers_url":"https://api.github.com/users/don-brady/followers","following_url":"https://api.github.com/users/don-brady/following{/other_user}","gists_url":"https://api.github.com/users/don-brady/gists{/gist_id}","starred_url":"https://api.github.com/users/don-brady/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/don-brady/subscriptions","organizations_url":"https://api.github.com/users/don-brady/orgs","repos_url":"https://api.github.com/users/don-brady/repos","events_url":"https://api.github.com/users/don-brady/events{/privacy}","received_events_url":"https://api.github.com/users/don-brady/received_events","type":"User","site_admin":false},"body":"This is a work in progress for bringing the illumos FMA diagnosis and logic into ZED.  This first phase brings over the ZFS SLM module (`zfs_mod.c`) to handle auto operations in response to disk events. Disk event monitoring is via libudev and provides the expected schema for `zfs_mod`. Also leverages the recently added _devid_ and _phys_path_ strings in the vdev label.\r\n\r\n_Notes:_\r\n- A pool must currently use persistent paths (i.e. not /dev/sdN) to participate\r\n- During auto replace, the gpt disk labeling is asynchronous and leverages the fact that there will be a disk add event seen for the partitions\r\n- The _diagnosis engine_ and _retire agent_ are slated for a phase two (coming soon)\r\n- Multipath devices is a work in progress and will likely not work as expected\r\n- Hint: use `\"zed -Fv\"` to observe the interaction and flow through the `zfs_mod` agent and disk events\r\n- The _auto-replace_ operation  is not the same as _hot-sparing_ which is handled by different code\r\n\r\n**Functionality Summary**\r\n\r\nOperation | Event Class | Matches\r\n------------ | ------------- | -------------\r\nauto-online | EC_DEV_ADD.ESC_DISK | vdev guid or devid\r\nauto-replace | EC_DEV_ADD.ESC_DISK | phys_path\r\nauto-expand | EC_DEV_STATUS.ESC_DEV_DLE | vdev guid\r\nvdev check/replace | EC_ZFS.ESC_ZFS_VDEV_CHECK | vdev guid\r\n\r\nPlease feel free to use and add comments!  Thanks.\r\n\r\n","created_at":"2016-05-20T04:57:26Z","updated_at":"2016-08-17T17:59:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"07f807eb81f23a16fcd7aea4e9ab5f8d1b76b653","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673/commits","review_comments_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673/comments","review_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/4673/comments","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/de3bde3cc5e227969361939ec1c1f82bde356fa7","head":{"label":"don-brady:zed-fma-phase1","ref":"zed-fma-phase1","sha":"de3bde3cc5e227969361939ec1c1f82bde356fa7","user":{"login":"don-brady","id":12415697,"avatar_url":"https://avatars.githubusercontent.com/u/12415697?v=3","gravatar_id":"","url":"https://api.github.com/users/don-brady","html_url":"https://github.com/don-brady","followers_url":"https://api.github.com/users/don-brady/followers","following_url":"https://api.github.com/users/don-brady/following{/other_user}","gists_url":"https://api.github.com/users/don-brady/gists{/gist_id}","starred_url":"https://api.github.com/users/don-brady/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/don-brady/subscriptions","organizations_url":"https://api.github.com/users/don-brady/orgs","repos_url":"https://api.github.com/users/don-brady/repos","events_url":"https://api.github.com/users/don-brady/events{/privacy}","received_events_url":"https://api.github.com/users/don-brady/received_events","type":"User","site_admin":false},"repo":{"id":35576270,"name":"zfs","full_name":"don-brady/zfs","owner":{"login":"don-brady","id":12415697,"avatar_url":"https://avatars.githubusercontent.com/u/12415697?v=3","gravatar_id":"","url":"https://api.github.com/users/don-brady","html_url":"https://github.com/don-brady","followers_url":"https://api.github.com/users/don-brady/followers","following_url":"https://api.github.com/users/don-brady/following{/other_user}","gists_url":"https://api.github.com/users/don-brady/gists{/gist_id}","starred_url":"https://api.github.com/users/don-brady/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/don-brady/subscriptions","organizations_url":"https://api.github.com/users/don-brady/orgs","repos_url":"https://api.github.com/users/don-brady/repos","events_url":"https://api.github.com/users/don-brady/events{/privacy}","received_events_url":"https://api.github.com/users/don-brady/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/don-brady/zfs","description":"Native ZFS for Linux","fork":true,"url":"https://api.github.com/repos/don-brady/zfs","forks_url":"https://api.github.com/repos/don-brady/zfs/forks","keys_url":"https://api.github.com/repos/don-brady/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/don-brady/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/don-brady/zfs/teams","hooks_url":"https://api.github.com/repos/don-brady/zfs/hooks","issue_events_url":"https://api.github.com/repos/don-brady/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/don-brady/zfs/events","assignees_url":"https://api.github.com/repos/don-brady/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/don-brady/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/don-brady/zfs/tags","blobs_url":"https://api.github.com/repos/don-brady/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/don-brady/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/don-brady/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/don-brady/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/don-brady/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/don-brady/zfs/languages","stargazers_url":"https://api.github.com/repos/don-brady/zfs/stargazers","contributors_url":"https://api.github.com/repos/don-brady/zfs/contributors","subscribers_url":"https://api.github.com/repos/don-brady/zfs/subscribers","subscription_url":"https://api.github.com/repos/don-brady/zfs/subscription","commits_url":"https://api.github.com/repos/don-brady/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/don-brady/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/don-brady/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/don-brady/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/don-brady/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/don-brady/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/don-brady/zfs/merges","archive_url":"https://api.github.com/repos/don-brady/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/don-brady/zfs/downloads","issues_url":"https://api.github.com/repos/don-brady/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/don-brady/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/don-brady/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/don-brady/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/don-brady/zfs/labels{/name}","releases_url":"https://api.github.com/repos/don-brady/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/don-brady/zfs/deployments","created_at":"2015-05-13T21:58:38Z","updated_at":"2016-03-16T23:19:41Z","pushed_at":"2016-08-16T21:57:17Z","git_url":"git://github.com/don-brady/zfs.git","ssh_url":"git@github.com:don-brady/zfs.git","clone_url":"https://github.com/don-brady/zfs.git","svn_url":"https://github.com/don-brady/zfs","homepage":"http://zfsonlinux.org/","size":31804,"stargazers_count":1,"watchers_count":1,"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":1,"default_branch":"master"}},"base":{"label":"zfsonlinux:master","ref":"master","sha":"e35c5a8265e791d5856ef24e567cde5879844dc5","user":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars.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://avatars.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":"2016-08-17T10:38:47Z","pushed_at":"2016-08-17T17:58:38Z","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":58088,"stargazers_count":1987,"watchers_count":1987,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":497,"mirror_url":null,"open_issues_count":1011,"forks":497,"open_issues":1011,"watchers":1987,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/4673"},"issue":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/4673"},"comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/4673/comments"},"review_comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673/comments"},"review_comment":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/4673/commits"},"statuses":{"href":"https://api.github.com/repos/zfsonlinux/zfs/statuses/de3bde3cc5e227969361939ec1c1f82bde356fa7"}}}}
{"actor":{"display_login":"behlendorf"}}