{"action":"created","comment":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/85622578","pull_request_review_id":6331261,"id":85622578,"diff_hunk":"@@ -0,0 +1,722 @@\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+/*\n+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.\n+ *\n+ * Copyright (c) 2016, Intel Corporation.\n+ */\n+\n+#include <sys/types.h>\n+#include <sys/fm/protocol.h>\n+#include <uuid/uuid.h>\n+#include <signal.h>\n+#include <strings.h>\n+#include <time.h>\n+\n+#include \"fmd_api.h\"\n+#include \"fmd_serd.h\"\n+\n+#include \"zfs_agents.h\"\n+#include \"../zed_log.h\"\n+\n+/*\n+ * This file imlements the minimal FMD module API required to support the\n+ * fault logic modules in ZED. This support includes module registration,\n+ * memory allocation, module property accessors, basic case management,\n+ * one-shot timers and SERD engines.\n+ *\n+ * In the ZED runtime, the modules are called from a single thread so no\n+ * locking is required in this emulated FMD environment.\n+ */\n+\n+typedef struct fmd_modstat {\n+\tfmd_stat_t\tms_accepted;\t/* total events accepted by module */\n+\tfmd_stat_t\tms_caseopen;\t/* cases currently open */\n+\tfmd_stat_t\tms_casesolved;\t/* total cases solved by module */\n+\tfmd_stat_t\tms_caseclosed;\t/* total cases closed by module */\n+} fmd_modstat_t;\n+\n+typedef struct fmd_module {\n+\tconst char\t*mod_name;\t/* basename of module (ro) */\n+\tconst fmd_hdl_info_t *mod_info;\t/* module info registered with handle */\n+\tvoid\t\t*mod_spec;\t/* fmd_hdl_get/setspecific data value */\n+\tfmd_stat_t\t*mod_ustat;\t/* module specific custom stats */\n+\tuint_t\t\tmod_ustat_cnt;\t/* count of ustat stats */\n+\tfmd_modstat_t\tmod_stats;\t/* fmd built-in per-module statistics */\n+\tfmd_serd_hash_t\tmod_serds;\t/* hash of serd engs owned by module */\n+\tchar\t\t*mod_vers;\t/* a copy of module version string */\n+} fmd_module_t;\n+\n+/*\n+ * ZED has two FMD hardwired module instances\n+ */\n+fmd_module_t\tzfs_retire_module;\n+fmd_module_t\tzfs_diagnosis_module;\n+\n+/*\n+ * Register a module with fmd and finish module initialization.\n+ * Returns an integer indicating whether it succeeded (zero) or\n+ * failed (non-zero).\n+ */\n+int\n+fmd_hdl_register(fmd_hdl_t *hdl, int version, const fmd_hdl_info_t *mip)\n+{\n+\tfmd_module_t *mp = (fmd_module_t *)hdl;\n+\n+\tmp->mod_info = mip;\n+\tmp->mod_name = mip->fmdi_desc + 4;\t/* drop 'ZFS ' prefix */\n+\tmp->mod_spec = NULL;\n+\n+\t/* bare minimum module stats */\n+\t(void) strcpy(mp->mod_stats.ms_accepted.fmds_name, \"fmd.accepted\");\n+\t(void) strcpy(mp->mod_stats.ms_caseopen.fmds_name, \"fmd.caseopen\");\n+\t(void) strcpy(mp->mod_stats.ms_casesolved.fmds_name, \"fmd.casesolved\");\n+\t(void) strcpy(mp->mod_stats.ms_caseclosed.fmds_name, \"fmd.caseclosed\");\n+\n+\tfmd_serd_hash_create(&mp->mod_serds);\n+\n+\tfmd_hdl_debug(hdl, \"register module\");\n+\n+\treturn (0);\n+}\n+\n+void\n+fmd_hdl_unregister(fmd_hdl_t *hdl)\n+{\n+\tfmd_module_t *mp = (fmd_module_t *)hdl;\n+\tfmd_modstat_t *msp = &mp->mod_stats;\n+\tconst fmd_hdl_ops_t *ops = mp->mod_info->fmdi_ops;\n+\n+\t/* dump generic module stats */\n+\tfmd_hdl_debug(hdl, \"%s: %llu\", msp->ms_accepted.fmds_name,\n+\t    msp->ms_accepted.fmds_value.ui64);\n+\tif (ops->fmdo_close != NULL) {\n+\t\tfmd_hdl_debug(hdl, \"%s: %llu\", msp->ms_caseopen.fmds_name,\n+\t\t    msp->ms_caseopen.fmds_value.ui64);\n+\t\tfmd_hdl_debug(hdl, \"%s: %llu\", msp->ms_casesolved.fmds_name,\n+\t\t    msp->ms_casesolved.fmds_value.ui64);\n+\t\tfmd_hdl_debug(hdl, \"%s: %llu\", msp->ms_caseclosed.fmds_name,\n+\t\t    msp->ms_caseclosed.fmds_value.ui64);\n+\t}\n+\n+\t/* dump module specific stats */\n+\tif (mp->mod_ustat != NULL) {\n+\t\tint i;\n+\n+\t\tfor (i = 0; i < mp->mod_ustat_cnt; i++) {\n+\t\t\tfmd_hdl_debug(hdl, \"%s: %llu\",\n+\t\t\t    mp->mod_ustat[i].fmds_name,\n+\t\t\t    mp->mod_ustat[i].fmds_value.ui64);\n+\t\t}\n+\t}\n+\n+\tfmd_serd_hash_destroy(&mp->mod_serds);\n+\n+\tfmd_hdl_debug(hdl, \"unregister module\");\n+}\n+\n+/*\n+ * fmd_hdl_setspecific() is used to associate a data pointer with\n+ * the specified handle for the duration of the module's lifetime.\n+ * This pointer can be retrieved using fmd_hdl_getspecific().\n+ */\n+void\n+fmd_hdl_setspecific(fmd_hdl_t *hdl, void *spec)\n+{\n+\tfmd_module_t *mp = (fmd_module_t *)hdl;\n+\n+\tmp->mod_spec = spec;\n+}\n+\n+/*\n+ * Return the module-specific data pointer previously associated\n+ * with the handle using fmd_hdl_setspecific().\n+ */\n+void *\n+fmd_hdl_getspecific(fmd_hdl_t *hdl)\n+{\n+\tfmd_module_t *mp = (fmd_module_t *)hdl;\n+\n+\treturn (mp->mod_spec);\n+}\n+\n+void *\n+fmd_hdl_alloc(fmd_hdl_t *hdl, size_t size, int flags)\n+{\n+\treturn (malloc(size));\n+}\n+\n+void *\n+fmd_hdl_zalloc(fmd_hdl_t *hdl, size_t size, int flags)\n+{\n+\tvoid *data = fmd_hdl_alloc(hdl, size, flags);\n+\n+\tif (data != NULL)\n+\t\tbzero(data, size);\n+\n+\treturn (data);\n+}\n+\n+void\n+fmd_hdl_free(fmd_hdl_t *hdl, void *data, size_t size)\n+{\n+\tfree(data);\n+}\n+\n+/* Debugging aid to differentiate module log entries */\n+#ifdef\tDEBUG\n+#define\tANSI_MAGENTA\t\"\\x1b[35m\"\n+#define\tANSI_GREEN\t\"\\x1b[32m\"\n+#define\tANSI_RESET\t\"\\x1b[0m\"\n+#else\n+#define\tANSI_MAGENTA\t\"\"\n+#define\tANSI_GREEN\t\"\"\n+#define\tANSI_RESET\t\"\"\n+#endif\n+\n+/*\n+ * Record a debug message using the specified format.\n+ */\n+void\n+fmd_hdl_debug(fmd_hdl_t *hdl, const char *format, ...)\n+{\n+\tchar message[256];\n+\tva_list vargs;\n+\tfmd_module_t *mp = (fmd_module_t *)hdl;\n+\tfmd_module_t *de = (fmd_module_t *)fmd_module_hdl(\"zfs-diagnosis\");\n+\n+\tva_start(vargs, format);\n+\t(void) vsnprintf(message, sizeof (message), format, vargs);\n+\tva_end(vargs);\n+\n+\tzed_log_msg(LOG_INFO, \"%s%s:%s %s\",\n+\t    (mp == de) ? ANSI_MAGENTA : ANSI_GREEN,\n+\t    mp->mod_name, ANSI_RESET, message);\n+}\n+\n+/* Property Retrieval */\n+\n+int32_t\n+fmd_prop_get_int32(fmd_hdl_t *hdl, const char *name)\n+{\n+\t/*\n+\t * This can be looked up in mp->modinfo->fmdi_props\n+\t * For now we just hard code in initial bringup.\n+\t */\n+\tif (strcmp(name, \"spare_on_remove\") == 0)\n+\t\treturn (1);\n+\telse\n+\t\treturn (10);\t/* N = 10 events */\n+}\n+\n+int64_t\n+fmd_prop_get_int64(fmd_hdl_t *hdl, const char *name)\n+{\n+\t/*\n+\t * These can be looked up in mp->modinfo->fmdi_props\n+\t * For now we just hard code in initial bringup.\n+\t */\n+\tif (strcmp(name, \"remove_timeout\") == 0)\n+\t\treturn (15ULL * 1000ULL * 1000ULL * 1000ULL);\t/* 15 sec */\n+\n+\tif (strcmp(name, \"io_T\") == 0 || strcmp(name, \"checksum_T\") == 0)\n+\t\treturn (1000ULL * 1000ULL * 1000ULL * 600ULL);\t/* 10 min */\n+\n+\treturn (0);\n+}\n+\n+/* FMD Statistics */\n+\n+fmd_stat_t *\n+fmd_stat_create(fmd_hdl_t *hdl, uint_t flags, uint_t argc, fmd_stat_t *argv)","path":"cmd/zed/agents/fmd_api.c","position":250,"original_position":250,"commit_id":"636d6e7e0cd580e537fe0abc4728e8b3692559b1","original_commit_id":"636d6e7e0cd580e537fe0abc4728e8b3692559b1","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":"Hey, didn't pick those. :) ...moving to something less misleading.","created_at":"2016-10-28T22:53:18Z","updated_at":"2016-10-28T22:53:18Z","html_url":"https://github.com/zfsonlinux/zfs/pull/5343#discussion_r85622578","pull_request_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343","_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/85622578"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/5343#discussion_r85622578"},"pull_request":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343"}}},"pull_request":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343","id":91133349,"html_url":"https://github.com/zfsonlinux/zfs/pull/5343","diff_url":"https://github.com/zfsonlinux/zfs/pull/5343.diff","patch_url":"https://github.com/zfsonlinux/zfs/pull/5343.patch","issue_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/5343","number":5343,"state":"open","locked":false,"title":"Add illumos FMD ZFS logic to ZED -- phase 2 (WIP)","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":"### Fault Management Logic for ZED\r\n\r\nThe integration of Fault Management Daemon (FMD) logic from illumos\r\nis being deployed in three phases. This logic is encapsulated in several\r\nsoftware modules inside ZED.  This phase 2 portion primarily entails the\r\n_Diagnosis Engine_ and the _Retire Agent_ modules. It also includes\r\ninfrastructure to support a crude FMD environment to host these modules.\r\n\r\n1. The **Diagnosis Engine** consumes I/O and checksum ereports and\r\nfeeds them into a SERD engine which will generate a corresponding\r\nfault diagnosis when the SERD engine fires. All the diagnosis state\r\ndata is collected into cases, one case per-vdev being tracked.\r\n\r\n2. The **Retire Agent** responds to diagnosed faults by isolating the\r\nfaulty VDEV. It will notify the ZFS kernel module of the new VDEV\r\nstate (degraded or faulted). This agent is also responsible for\r\nmanaging hot spares across pools. When it encounters a device\r\nfault or a device removal it replaces the device with an appropriate\r\nspare if available.\r\n\r\n### Implementation Notes\r\n\r\n* The FMD module API required for logic modules is emulated and implemented\r\n  in the `fmd_api.c` and `fmd_serd.c` source files. This support includes\r\n  module registration, memory allocation, module property accessors, basic\r\n  case management, one-shot timers and SERD engines.\r\n\r\n* The event subscriptions for the modules (located in a module specific\r\n  configuration file on illumos) are currently hard-coded into the ZED\r\n  `zfs_agent_dispatch()` function.\r\n\r\n* The FMD modules are called one at a time from a single thread that\r\n  consumes events queued to the modules. These events are sourced from\r\n  the normal ZED events and also include events posted from the diagnosis\r\n  engine and the libudev disk event monitor.\r\n\r\n* The FMD code modules have minimal changes and were intentionally left\r\n  as similar as possible to their upstream source files.\r\n\r\n* The sysevent namespace in ZED differs from illumos. For example:\r\n    * illumos uses `\"resource.sysevent.EC_zfs.ESC_ZFS_vdev_remove\"`\r\n    * Linux uses `\"sysevent.fs.zfs.vdev_remove\"`\r\n\r\n* The FMD Modules port was produced by **Intel Federal, LLC** under award\r\n  number B609815 between the **U.S. Department of Energy** (DOE) and Intel\r\n  Federal, LLC.","created_at":"2016-10-27T04:57:54Z","updated_at":"2016-10-28T22:53:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0c7afea57b4f10aa403eaffd0286a24577d69f10","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343/commits","review_comments_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343/comments","review_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/5343/comments","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/636d6e7e0cd580e537fe0abc4728e8b3692559b1","head":{"label":"don-brady:zed-fmd-phase-2","ref":"zed-fmd-phase-2","sha":"636d6e7e0cd580e537fe0abc4728e8b3692559b1","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-10-27T00:07:43Z","pushed_at":"2016-10-27T04:41:32Z","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":32925,"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":"c6a89b58a997a2b2c672542542e675447efcf4e4","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-10-26T20:12:07Z","pushed_at":"2016-10-28T17:58:10Z","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":60941,"stargazers_count":2093,"watchers_count":2093,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":527,"mirror_url":null,"open_issues_count":912,"forks":527,"open_issues":912,"watchers":2093,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/5343"},"issue":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/5343"},"comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/5343/comments"},"review_comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343/comments"},"review_comment":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/5343/commits"},"statuses":{"href":"https://api.github.com/repos/zfsonlinux/zfs/statuses/636d6e7e0cd580e537fe0abc4728e8b3692559b1"}}}}
{"actor":{"display_login":"don-brady"}}