)]}'
{
  "log": [
    {
      "commit": "cb0f9bbc855097e0c8248643015b837255fd569a",
      "tree": "cc42fe9dc7a6011c2b9e9ee0fd26f9f2454e1746",
      "parents": [
        "9c568d0fc0e290529180e3fc0452f0ac489e5053"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 12 15:58:47 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Sep 29 13:06:26 2017 -0700"
      },
      "message": "init: run vendor commands in a separate SELinux context\n\nOne of the major aspects of treble is the compartmentalization of system\nand vendor components, however init leaves a huge gap here, as vendor\ninit scripts run in the same context as system init scripts and thus can\naccess and modify the same properties, files, etc as the system can.\n\nThis change is meant to close that gap.  It forks a separate \u0027subcontext\u0027\ninit that runs in a different SELinux context with permissions that match\nwhat vendors should have access to.  Commands get sent over a socket to\nthis \u0027subcontext\u0027 init that then runs them in this SELinux context and\nreturns the result.\n\nNote that not all commands run in the subcontext; some commands such as\nthose dealing with services only make sense in the context of the main\ninit process.\n\nBug: 62875318\nTest: init unit tests, boot bullhead, boot sailfish\n\nChange-Id: Idf4a4ebf98842d27b8627f901f961ab9eb412aee\n"
    },
    {
      "commit": "4a679454d7055c09ea7c491e265b475bce582a65",
      "tree": "f514470510111d1448131b539e9f4267011a3f45",
      "parents": [
        "f5dba11085eec3a9f5c3d2f97c8d41e2708eca96"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 26 16:30:03 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 26 16:30:03 2017 -0700"
      },
      "message": "init: cleanup exit() uses\n\nPrimarily, this fixes a bug where a forked child of property service\nuses exit() instead of _exit, which has the unintended consequences of\nrunning the global destructors of init proper, which leads to\nunintended cleanup.\n\nSecondly, this replaces the remaining calls of exit() that really\nshould be LOG(FATAL).\n\nTest: boot sailfish\nChange-Id: I779228e7d44a73186bc7685bb723c4b9278a0a2d\n"
    },
    {
      "commit": "3633a4014a1a315000c3e6dee36b419473ab44b9",
      "tree": "6c81c821307ac04cb0253b7a723ce8bb5866bd2f",
      "parents": [
        "19731103556cd33095cff8074191d4693bc0c74a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Sep 13 14:39:45 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Sep 15 21:07:41 2017 +0000"
      },
      "message": "init: fix crash when reboot is triggered by a builtin\n\nBuiltin commands may set the sys.powerctl property, which causes\nreboot to be immediately processed.  Unfortunately, part of the reboot\nprocessing involves clearing the action queue, so when this scenario\nhappens, ActionManager::ExecuteOneCommand() can abort due to its state\nbeing unexpectedly changed.\n\nLonger term, the real fix here is to split init and property service.\nIn this case, the property sets will be sent to property service and\nthe reboot will only be processed once property service responds back\nto init that the property has been set.  Since that will not happen\nwithin the action queue, there will be no risk of failure.\n\nShort term, this change sets a flag in init to shutdown the device\nbefore the next action is run, which defers the shutdown enough to fix\nthe crash, but continues to prevent any further commands from running.\n\nBug: 65374456\nTest: force bullhead into the repro case and observe that it no longer\n      repros\n\nChange-Id: I89c73dad8d7912a845d694b095cab061b8dcc05e\n"
    },
    {
      "commit": "9f97f4794027d8143b7d4f2d3ad4f80ca72ca77a",
      "tree": "d3483bb93fd2fe22fd5b71b0668145ce9571ef29",
      "parents": [
        "6139592321a489607534d9f51533d33908d75ba4"
      ],
      "author": {
        "name": "Luis Hector Chavez",
        "email": "lhchavez@google.com",
        "time": "Wed Sep 06 13:43:57 2017 -0700"
      },
      "committer": {
        "name": "Luis Hector Chavez",
        "email": "lhchavez@google.com",
        "time": "Thu Sep 07 10:47:04 2017 -0700"
      },
      "message": "init: Allow clean system shutdown upon SIGTERM\n\nThis allows Android to cleanly shutdown when running in a PID namespace\nin a way that does not rely on adbd running. This is useful to allow\nAndroid to be running in a container and its lifetime managed by an\nOCI-compliant tool.\n\nBug: 65415372\nTest: `kill -TERM 1` as root is correctly dropped.\nTest: `kill -TERM 1` from the init PID namespace causes init to cleanly shutdown.\nChange-Id: Ia66ebdb436221919081bc4723337c0c7f1e53b09\n"
    },
    {
      "commit": "30bf4b75003a6ca3e290be71ec87545bea82c760",
      "tree": "0cfd7245bc87da1f049200b46bf47809529ca906",
      "parents": [
        "32d2eae8b91d1316dc3c8c3890dc0d60c4cb716d",
        "1ca83249a1748c2458664afa76962e2bb9cdb553"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 28 21:45:38 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Aug 28 21:45:38 2017 +0000"
      },
      "message": "Merge \"init: fix signal handling and LOG(FATAL) in child processes\""
    },
    {
      "commit": "1ca83249a1748c2458664afa76962e2bb9cdb553",
      "tree": "1d2c4ba2a20ae722b75a775e84a9cc63035c29e8",
      "parents": [
        "2732a7e0232d77efbf19d7053f5e5d5d39719910"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 15:10:48 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 15:10:48 2017 -0700"
      },
      "message": "init: fix signal handling and LOG(FATAL) in child processes\n\nChild processes inherit the signal handlers and the \u0027Aborter\u0027 for\nlogging from their parent process.  In the case of init, fork()\u0027ed\nprocesses, will attempt to reboot the system if they receive a fatal\nsignal or if they call LOG(FATAL).  This is not the correct behavior;\nthese processes should terminate due to the provided signal like other\nprocesses on the system.\n\nThis is particularly important as there are multiple LOG(FATAL) calls\nin service.cpp for failures after fork() but before execv() when a\nservice is started.\n\nNote, that pthread_atfork() is not a viable solution since clone() is\nused in some cases instead of fork() and atfork handlers are not\ncalled with clone().\n\nTest: LOG(FATAL) from a child process of init and see that it\n      terminates due to a signal correctly\nTest: LOG(FATAL) from init proper and see that it reboots to the\n      bootloader\n\nChange-Id: I875ebd7a5f6b3f5e3e2c028af3306917c4409db3\n"
    },
    {
      "commit": "702ca9ada2ac3c5d61bd7ae4e13a0e986a472fcb",
      "tree": "44de14089904da4c986e1feb1952c6ebe949ddd4",
      "parents": [
        "2732a7e0232d77efbf19d7053f5e5d5d39719910"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 10:36:52 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 11:01:52 2017 -0700"
      },
      "message": "init: log all failures of Service::Start()\n\nThe move to returning Result from Service::Start() for better context\nwhen starting process through init\u0027s builtins stops Service::Start()\nfailures from being logged from other contexts.  This change adds\nthose logs along with their context.\n\nTest: boot bullhead, fail to start services via `setprop ctl.start`,\n      see the expected error in dmesg\n\nChange-Id: I45294f6abf00852f3d4c549a32eaf4920a51e6f0\n"
    },
    {
      "commit": "6de21f11125941ea1b94fdeec754bacea3916fd5",
      "tree": "c230a45f1202300f86ff3551e852612a3519ad73",
      "parents": [
        "7f16cad877571ce8ef0808dcdb81234d61b771ca"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 22 15:41:03 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 23 10:09:21 2017 -0700"
      },
      "message": "init: cleanup environment handling\n\nInit keep its own copy of the environment that it uses for execve when\nstarting services.  This is unnecessary however as libc already has\nfunctions that mutate the environment and the environment that init\nuses is clean for starting services.  This change removes init\u0027s copy\nof the environment and uses the libc functions instead.\n\nThis also makes small clean-up to the way the Service class stores\nservice specific environment variables.\n\nTest: boot bullhead\nChange-Id: I7c98a0b7aac9fa8f195ae33bd6a7515bb56faf78\n"
    },
    {
      "commit": "d8db7ab80d8a79c89393fa0c4ab343e85312d8d5",
      "tree": "7e24955cfa97e2da61bf3a503acdf650f0f94d17",
      "parents": [
        "334929b525370a8a008b276e81e7ba573af7808f"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 17 17:28:30 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 17 18:16:51 2017 -0700"
      },
      "message": "init: replace panic() with LOG(FATAL)\n\nTest: boot bullhead\nTest: Introduce LOG(FATAL) at various points of init and ensure that\n      it reboots to the bootloader successfully\nTest: Introduce LOG(FATAL) during DoReboot() and ensure that it reboots\n      instead of recursing infinitely\nTest: Ensure that fatal signals reboot to bootloader\n\nChange-Id: I409005b6fab379df2d635e3e33d2df48a1a97df3\n"
    },
    {
      "commit": "557946e57c375b05deb5ba07b739f27abc70697e",
      "tree": "a073dadfaa7529739187ae7264abc21b881c8b97",
      "parents": [
        "11a3aeeae3dc887b889d4086d4d26d95c324c08d"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 01 13:50:23 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 14 14:07:39 2017 -0700"
      },
      "message": "init: use Result\u003cT\u003e for builtin functions\n\nWe currently throw out the return values from builtin functions and\noccasionally log errors with no supporting context.  This change uses\nthe newly introduced Result\u003cT\u003e class to communicate a successful result\nor an error back to callers in order to print an error with clear\ncontext when a builtin fails.\n\nExample:\n\ninit: Command \u0027write /sys/class/leds/vibrator/trigger transient\u0027 action\u003dinit (/init.rc:245) took 0ms and failed: Unable to write to file \u0027/sys/class/leds/vibrator/trigger\u0027: open() failed: No such file or directory\n\nTest: boot bullhead\nMerged-In: Idc18f331d2d646629c6093c1e0f2996cf9b42aec\nChange-Id: Idc18f331d2d646629c6093c1e0f2996cf9b42aec\n"
    },
    {
      "commit": "0c8d6d27304d1d6e5f8f0a3feb1f60872ac278f2",
      "tree": "8f629ae15142dbf05ace2a81016337c352daad13",
      "parents": [
        "bb2f03f3446024f7d09153f8f32f4ad9093b824b"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 10 12:22:44 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 14 09:40:01 2017 -0700"
      },
      "message": "init: split security functions out of init.cpp\n\nThis change splits out the selinux initialization and supporting\nfunctionality into selinux.cpp and splits the security related\ninitialization of the rng, etc to security.cpp.  It also provides\nadditional documentation for SEPolicy loading as this has been\nrequested by some teams.\n\nIt additionally cleans up sehandle and sehandle_prop.  The former is\nstatic within selinux.cpp and new wrapper functions are created around\nselabel_lookup*() to better serve the users.  The latter is moved to\nproperty_service.cpp as it is isolated to that file for its usage.\n\nTest: boot bullhead\nMerged-In: Idc95d493cebc681fbe686b5160502f36af149f60\nChange-Id: Idc95d493cebc681fbe686b5160502f36af149f60\n"
    },
    {
      "commit": "1f87cd1bd0f4f32f51b5526182c504a926635dc3",
      "tree": "47b74f33119f7ea9186bbeb677ace5643789b171",
      "parents": [
        "af6a262020cc3f85e9c65e38b8dbd6959864cb79"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 11 13:22:37 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 11 13:22:37 2017 -0700"
      },
      "message": "init: fix format issue\n\nTrying to limit merge conflicts later...\n\nTest: build\nChange-Id: I802f2cf86b8432f65ad4dcd45bfd543ee5091775\n"
    },
    {
      "commit": "7c4609cfb3052f95d3a7322bf991c48059a769cd",
      "tree": "62da1f5b44967cd0ecd93912c6ca9859f203e36e",
      "parents": [
        "c34afb1cd57607aaa9dd862399c6ffb75cde80a5"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 03 15:45:51 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 04 20:12:56 2017 +0000"
      },
      "message": "init: more unique_fd, less goto\n\nTest: boot bullhead\nChange-Id: I3c31ca045538d9c9dbbf9c8f27f63033344627fd\n"
    },
    {
      "commit": "2a2a8d9ec04676974a2c1edfc0715e8b1a66f903",
      "tree": "25381c322c736e32c75bd8d636e7d6fa2316dad5",
      "parents": [
        "eb3fa921916f2505d85fe42b780a890f7358f482",
        "911b9b1d6ead5f2e4c4158af0cd8787f4d458ddf"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 01 20:15:02 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Aug 01 20:15:02 2017 +0000"
      },
      "message": "Merge changes Ibd57c103,I81f1e8ac,Ia6e546fe\n\n* changes:\n  init: rename ServiceManager to ServiceList and clean it up\n  init: move reaping from ServiceManager to signal_handler.cpp\n  init: move exec operations out of ServiceManager\n"
    },
    {
      "commit": "911b9b1d6ead5f2e4c4158af0cd8787f4d458ddf",
      "tree": "9c9f3942859bac913c2b182b145a005769631342",
      "parents": [
        "eeee83106bfbd719b52817c2ebb460ce38bcc494"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 27 16:20:58 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 01 11:06:17 2017 -0700"
      },
      "message": "init: rename ServiceManager to ServiceList and clean it up\n\nServiceManager is essentially just a list now that the rest of its\nfunctionality has been moved elsewhere, so the class is renamed\nappropriately.\n\nThe ServiceList::Find* functions have been cleaned up into a single\nsmaller interface.\nThe ServiceList::ForEach functions have been removed in favor of\nServiceList itself being directly iterable.\n\nTest: boot bullhead\nChange-Id: Ibd57c103338f03b83d81e8b48ea0e46cd48fd8f0\n"
    },
    {
      "commit": "3b81f2d623c6cba45ad07fa91338d346d9b96482",
      "tree": "2cce7c9eb83f99d12e464d7919e76b1f61602ca8",
      "parents": [
        "d269e3a795fbb0ecb7b2c6dff720f9b356365a22"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 28 14:48:41 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 01 11:06:04 2017 -0700"
      },
      "message": "init: move exec operations out of ServiceManager\n\nThese can be implemented without ServiceManager, so we remove them and\nmake ServiceManager slightly less of a God class.\n\nTest: boot bullhead\nTest: init unit tests\nChange-Id: Ia6e546fe5292255412245256f7d230af4ece135f\n"
    },
    {
      "commit": "eb3fa921916f2505d85fe42b780a890f7358f482",
      "tree": "7ba86f16a1644c9006803f2ffad24531c0090e5e",
      "parents": [
        "c7ba2bb5a380aa54443814551d22aa48670d7aed",
        "d269e3a795fbb0ecb7b2c6dff720f9b356365a22"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 01 16:53:52 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Aug 01 16:53:52 2017 +0000"
      },
      "message": "Merge \"init: fix process restarting\""
    },
    {
      "commit": "d269e3a795fbb0ecb7b2c6dff720f9b356365a22",
      "tree": "0b83435f1057734ee586152589939846aeb3cdaf",
      "parents": [
        "379123f9ab0182f1bce883c0a6dd14a7ccd7f546"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 31 13:23:18 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 31 16:00:18 2017 -0700"
      },
      "message": "init: fix process restarting\n\nThe time data types associated with restarting processes halfway moved\nto std::chrono and halfway didn\u0027t.  In this intermediate state, the\ntimes would get converted from nanoseconds to seconds then to\nmilliseconds.  The precision lost when converting to seconds would\ncause the main loop of init to spin whenever a process was within a\nsecond of being restarted.\n\nThis patch cleans up this logic and uses nanoseconds and milliseconds\nexplicitly, with a ceiling to milliseconds to prevent unneeded\nspinning.\n\nTest: boot bullhead, kill processes, see that they restart sanely.\n\nChange-Id: I0b017ba0e50c09704b0c5cdfcde1dba461804593\n"
    },
    {
      "commit": "6fa0884188dbc27b59b2fa3f86fb317bb1381252",
      "tree": "f77f535b2ce7df9df96483c8fe0c0b2aef4e2c4b",
      "parents": [
        "379123f9ab0182f1bce883c0a6dd14a7ccd7f546",
        "c01022a62e6517b1e7ea7231305a0ab996bd2964"
      ],
      "author": {
        "name": "Bo Hu",
        "email": "bohu@google.com",
        "time": "Sat Jul 29 06:58:07 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Sat Jul 29 06:58:07 2017 +0000"
      },
      "message": "Merge \"Allow the use of a custom Android DT directory\""
    },
    {
      "commit": "c01022a62e6517b1e7ea7231305a0ab996bd2964",
      "tree": "e69b4b58ddfc7435a31956864fc3fa1c561f543a",
      "parents": [
        "603cae8b4812c21b92f559d190c7d21534dbeef7"
      ],
      "author": {
        "name": "Yu Ning",
        "email": "yu.ning@intel.com",
        "time": "Wed Jul 26 17:54:08 2017 +0800"
      },
      "committer": {
        "name": "Yu Ning",
        "email": "yu.ning@intel.com",
        "time": "Fri Jul 28 11:10:48 2017 +0800"
      },
      "message": "Allow the use of a custom Android DT directory\n\nOn platforms that use ACPI instead of Device Tree (DT), such as\nRanchu x86/x86_64, /proc/device-tree/firmware/android/ does not\nexist. As a result, Android O is unable to mount /system, etc.\nat the first stage of init:\n\n init: First stage mount skipped (missing/incompatible fstab in\n device tree)\n\nThose platforms may create another directory that mimics the layout\nof the standard DT directory in procfs, and store early mount\nconfiguration there. E.g., Ranchu x86/x86_64 creates one in sysfs\nusing information encoded in the ACPI tables:\n\n https://android-review.googlesource.com/442472\n https://android-review.googlesource.com/443432\n https://android-review.googlesource.com/442393\n https://android-review.googlesource.com/442395\n\nTherefore, instead of hardcoding the Android DT path, load it from\nthe kernel command line using a new Android-specific property key\n(\"androidboot.android_dt_dir\"). If no such property exists, fall\nback to the standard procfs path (so no change is needed for DT-\naware platforms).\n\nNote that init/ and fs_mgr/ each have their own copy of the Android\nDT path, because they do not share any global state. A future CL\nshould remove the duplication by refactoring.\n\nWith this CL as well as the above ones, the said warning is gone,\nbut early mount fails. That is a separate bug, though, and will be\naddressed by another CL.\n\nTest: Boot patched sdk_phone_x86-userdebug system image with patched\n      Goldfish 3.18 x86 kernel in patched Android Emulator, verify\n      the \"init: First stage mount skipped\" warning no longer shows\n      in dmesg.\n\nChange-Id: Ib6df577319503ec1ca778de2b5458cc72ce07415\nSigned-off-by: Yu Ning \u003cyu.ning@intel.com\u003e\n"
    },
    {
      "commit": "67dee626e0185096bbaf73042f1a891ce436f714",
      "tree": "7d8dac0fe94f641494ea33e97ca00e0fb444795b",
      "parents": [
        "29b94116855b96e24beeb993396b251a1f85127a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 27 12:54:48 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 27 13:23:32 2017 -0700"
      },
      "message": "init: remove Parser singleton and related cleanup\n\n* Remove the Parser singleton (Hooray!)\n* Rename parser.* to tokenizer.* as this is actually a tokenizer\n* Rename init_parser.* to parser.* as this is a generic parser\n* Move contents of init_parser_test.cpp to service_test.cpp as this\n  actually is a test of the parsing in MakeExecOneshotService() and\n  nothing related to (init_)parser.cpp\n\nTest: boot bullhead\nTest: bool sailfish\nTest: init unit tests\nChange-Id: I4fe39e6483f58ebd3ce5ee715a45dbba0acf5d91\n"
    },
    {
      "commit": "9f1980e2fce85683ee4f3d5a331ba44d3141a3f3",
      "tree": "fdf4cf86885b1bc805f68e868c76e9c42f10f745",
      "parents": [
        "603cae8b4812c21b92f559d190c7d21534dbeef7",
        "af1a9bfb8f4461ba9a28e4df62a55b054d1eebca"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Jul 25 20:18:51 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Jul 25 20:18:51 2017 +0000"
      },
      "message": "Merge \"init: add support for global seccomp boot option\""
    },
    {
      "commit": "af1a9bfb8f4461ba9a28e4df62a55b054d1eebca",
      "tree": "bcdb5ffe53a61170c39532d72e704b27ae7e3054",
      "parents": [
        "e3d470b81d3bbb4e6507c92ee94bc98907d08c29"
      ],
      "author": {
        "name": "Steve Muckle",
        "email": "smuckle@google.com",
        "time": "Mon Jul 17 15:14:02 2017 -0700"
      },
      "committer": {
        "name": "Steve Muckle",
        "email": "smuckle@google.com",
        "time": "Mon Jul 24 13:33:54 2017 -0700"
      },
      "message": "init: add support for global seccomp boot option\n\nSetting androidboot.seccomp\u003dglobal on the kernel command line shall\nenable seccomp for all processes rather than just in zygote. Doing\nthis has a performance impact, for now it shall just be used to audit\nsyscall usage during testing.\n\nBug: 37960259\nChange-Id: I6b9fc95e9bec5e2bcfe6ef0b4343a5b422e30152\n"
    },
    {
      "commit": "278b15c84c6a7b23472cddb42f95315644e37414",
      "tree": "1b96b47b35ed39bbe5d89b79535c0941f1849e01",
      "parents": [
        "a022ea424dd439e174eeb420dac916c0e9d65861"
      ],
      "author": {
        "name": "Jin Qian",
        "email": "jinqian@google.com",
        "time": "Fri Jun 09 13:25:46 2017 -0700"
      },
      "committer": {
        "name": "Jin Qian",
        "email": "jinqian@google.com",
        "time": "Thu Jul 20 11:53:44 2017 -0700"
      },
      "message": "init: rename mke2fs tools with _static suffix\n\nWe build a static version for recovery mode. Give them\ndifferent names to avoid conflicts with regular version\nin /system/bin/\n\nBug: 35219933\nChange-Id: I738655ad9b9ad71c63ae604d9a4d659b0b671121\n(cherry picked from commit a2421041bfae954ab30aa2f735dc77758ff531e4)\n"
    },
    {
      "commit": "a022ea424dd439e174eeb420dac916c0e9d65861",
      "tree": "d2d978281813f79d4f9848629b6771da38814b4a",
      "parents": [
        "d13547347fb77433887be0cc6cabbcc0e9fcf63f",
        "dd6a85ccd54dec45bb555a68923a6facb308ecc5"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Jul 18 21:16:30 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Jul 18 21:16:30 2017 +0000"
      },
      "message": "Merge \"uml: init: add USER_MODE_LINUX cflag, USER_MODE_LINUX case in init.cpp\""
    },
    {
      "commit": "dd6a85ccd54dec45bb555a68923a6facb308ecc5",
      "tree": "d419dd1f719a4d7a31ecda8bb144ba71648dbb1d",
      "parents": [
        "3f4cea940d8672b02b900841add416b122a32c7f"
      ],
      "author": {
        "name": "Quang Luong",
        "email": "qal@google.com",
        "time": "Mon Jul 17 18:03:13 2017 -0700"
      },
      "committer": {
        "name": "Quang Luong",
        "email": "qal@google.com",
        "time": "Tue Jul 18 18:18:31 2017 +0000"
      },
      "message": "uml: init: add USER_MODE_LINUX cflag, USER_MODE_LINUX case in init.cpp\n\nModified Android.mk to define cflag \"USER_MODE_LINUX\" if\nTARGET_USER_MODE_LINUX :\u003d true in BoardCofig.mk.\nModified set_mmap_rnd_bits_action to return 0 if \"USER_MODE_LINUX\" is\ndefined. This is needed since uml does not support the mmap_rnd_bits\nsysctl, and init would otherwise crash without this check.\n\nTest: manual\n\nBug: 32523022\nChange-Id: I409ef64a1fa253bfb3f9fb59d0267be159819bb8\nSigned-off-by: Quang Luong \u003cqal@google.com\u003e\n"
    },
    {
      "commit": "ede0d538501dfc78c741fb3b0645406636d1d1fd",
      "tree": "8b00e4bc64471d59a20d762345683721b0214e62",
      "parents": [
        "c31963b5c255d57e162f4666f80b438ac74413ac"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 06 14:20:11 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 10 09:28:24 2017 -0700"
      },
      "message": "Move Timer from init to libbase\n\nTest: boot bullhead\nTest: new libbase unit tests\n\nChange-Id: Ic398a1daa1fe92c10ea7bc1e6ac3f781cee9a5b5\n"
    },
    {
      "commit": "eeab491efd8f456324f88e444f228b1016712e45",
      "tree": "ac3a5db1273c871d2d96aabbc44187b275e87c56",
      "parents": [
        "6333cd093809cbfb70309eff4710a1152c67ec86"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Tue Jun 27 22:08:45 2017 -0700"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Jul 05 14:49:57 2017 -0700"
      },
      "message": "init: Support custom shutdown actions\n\nWe have been seeing panics and errors during shutdown sequence in\nsome vendor\u0027s platform, and it is required to disable error handling\nduring shutdown.\n\nThis CL separates the shutdown request to execute another \"shutdown\"\ntrigger at the beginning of shutdown stage. And vendor can use this\ntrigger to add custom commands needed for shutting down gracefully.\n\nBug: 38203024\nBug: 62084631\nTest: device reboot/shutdown\nChange-Id: I3fac4ed59f06667d86e477ee55ed391cf113717f\n"
    },
    {
      "commit": "81f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33",
      "tree": "994dda570ae23534eb95913a17747e2f90f4ad7b",
      "parents": [
        "84c2eebbdd889fdb7208069c48ba06a2b5a71bf4"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jun 22 12:53:17 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jun 23 13:21:20 2017 -0700"
      },
      "message": "init: create android::init:: namespace\n\nWith some small fixups along the way\n\nTest: Boot bullhead\nTest: init unit tests\nChange-Id: I7beaa473cfa9397f845f810557d1631b4a462d6a\n"
    },
    {
      "commit": "1c3a53f03ca3c2c647f83cd8b8ae7e18c5c7bc69",
      "tree": "9fc09a4a34648a35479a68a717c18edb28e51e26",
      "parents": [
        "07a57f0f283938c5e558d79c62d4c2d4c24d3d03"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jun 22 16:50:31 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jun 22 17:24:22 2017 -0700"
      },
      "message": "init: cleanup some string usage\n\n1) property_set() takes const std::string\u0026 for both of its arguments,\n   so stop using .c_str() with its parameters\n2) Simplify a few places where StringPrintf() is used to concatenate strings\n3) Use std::to_string() instead of StringPrintf() where it\u0027s better suited\n\nTest: Boot bullhead\nTest: init unit tests\nChange-Id: I68ebda0e469f6230c8f9ad3c8d5f9444e0c4fdfd\n"
    },
    {
      "commit": "d2fd54e0ffb377ec07f5fc87907356644ec0fdf6",
      "tree": "8ac88947231428cfc8769700e62f2c73eb6e5113",
      "parents": [
        "d105aa8496a3ba26a9f3a3126aa2163d9bfdac16"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 07 14:32:30 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 20 00:02:05 2017 +0000"
      },
      "message": "Move restorecon() of /sys from init to ueventd.\n\nueventd already does restorecon() for /sys/{block,class,devices}, so\ninstead of duplicating this effort with init, move the restorecon()\nthat init does for all of /sys to ueventd.\n\nBug: 62420036\nChange-Id: I6125f8ff5316a0cf45872d1100d089d71802958f\nMerged-In: I6125f8ff5316a0cf45872d1100d089d71802958f\nTest: Boot sailfish, bullhead\n"
    },
    {
      "commit": "ed506f7356346b74eabcf45e207f9afe54b63089",
      "tree": "510ac5eaeaa29f52d32eebe15d867a87d8f872a3",
      "parents": [
        "0f185bb1484e22cf270c5807d0228880281e408f"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu May 25 15:58:59 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu May 25 16:17:19 2017 -0700"
      },
      "message": "ueventd: Break devices.cpp into discrete classes\n\ndevices.cpp handles too many things for creating one class.  This\nchange breaks it up into various files and classes.\n\n* Parsing is moved to ueventd_parser.cpp\n* Reading from the uevent socket and Cold booting is moved to a\n  UeventListener class, in uevent_listener.cpp\n* Firmware handling is moved to firmware_handler.cpp\n* The remaining contents form a DeviceHandler class within devices.cpp\n\nBug: 33785894\n\nTest: boot bullhead x40, observe no major differences in /dev and /sys\nTest: boot sailfish x40, observe no major differences in /dev and /sys\nTest: init unit tests\n\nChange-Id: I846a2e5995fbb344c7a8e349065c18a934fa6aba\n"
    },
    {
      "commit": "81824ebf1f9fbae84da63df946d2a4b5e13838ad",
      "tree": "1dbcc7fafa64c7f0530cd6364dcef796c7319fb4",
      "parents": [
        "f218210f6e312e0d175d9f4501dc705108496a4f",
        "f8627cea7fd13ab5217aa97258b30199d189f0bb"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat May 13 00:28:25 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Sat May 13 00:28:28 2017 +0000"
      },
      "message": "Merge \"Add libkeyutils.\""
    },
    {
      "commit": "f8627cea7fd13ab5217aa97258b30199d189f0bb",
      "tree": "bc5848fe2e646c707553163344442614250e7241",
      "parents": [
        "cc22a8e5a25e63fa61e1236ef4df28bfea05be35"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue May 09 17:09:06 2017 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 10 10:40:11 2017 -0700"
      },
      "message": "Add libkeyutils.\n\nAlso move init over to it.\n\nBug: http://b/37991155\nTest: builds+boots\nChange-Id: I5113a9d96a5ce0a0f3bad71134d6cc4f7b41a57e\n"
    },
    {
      "commit": "482f36cf74c0461bbad4a33df27d1b8e72ccc2d2",
      "tree": "d0ade431b56e65db325e9b777d10fa7810185b59",
      "parents": [
        "cc22a8e5a25e63fa61e1236ef4df28bfea05be35"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon May 08 13:38:15 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue May 09 02:25:32 2017 +0000"
      },
      "message": "init: remove restorecon() from util.cpp\n\nrestorecon() has become nothing more than a small wrapper around\nselinux_android_restore().  This itself isn\u0027t super problematic, but\nit is an obstacle for compiling util.cpp on the host as that function\nis not available on the host.\n\nBug: 36970783\nTest: Boot bullhead\nMerged-In: I7e209ece6898f9a0d5eb9e5d5d8155c2f1ba9faf\nChange-Id: I7e209ece6898f9a0d5eb9e5d5d8155c2f1ba9faf\n"
    },
    {
      "commit": "2cbbe9f7a35efdc94e8e34ef92eb6f70a85887fe",
      "tree": "215ecac00aa47fbac652e5e7bc99761176884b84",
      "parents": [
        "517e1f17cfec2143d4d10a64b1496a550acf3ea2"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu May 04 18:17:33 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri May 05 14:37:12 2017 -0700"
      },
      "message": "init: do not log directly from read_file() and write_file()\n\nTheir callers may be able to add more context, so use an error string\nto record the error.\n\nBug: 38038887\nTest: boot bullhead\nTest: Init unit tests\nChange-Id: I46690d1c66e00a4b15cadc6fd0d6b50e990388c3\n"
    },
    {
      "commit": "e2629c5682bdd680cbca94ac496f34be4a891a8d",
      "tree": "bc389d3fb5075549e0b07318a621321bfb9b8933",
      "parents": [
        "c7988b1f684d7c0b86a0e3d58228ebc45297c858",
        "2d019f859b5b4c29eb59794c731316cefa99994d"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Thu May 04 02:07:02 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu May 04 02:07:02 2017 +0000"
      },
      "message": "Merge \"init: manually restorecon mke2fs tools on ramdisk\""
    },
    {
      "commit": "2d019f859b5b4c29eb59794c731316cefa99994d",
      "tree": "2b7e14dfb0ad4b0e33bf31202aa936a225010bb7",
      "parents": [
        "5ad06cbb1c934997e2c0af0608d7c80ce4ee477c"
      ],
      "author": {
        "name": "Jin Qian",
        "email": "jinqian@google.com",
        "time": "Wed May 03 11:52:20 2017 -0700"
      },
      "committer": {
        "name": "Jin Qian",
        "email": "jinqian@google.com",
        "time": "Wed May 03 16:15:45 2017 -0700"
      },
      "message": "init: manually restorecon mke2fs tools on ramdisk\n\nFiles in the ramdisk by default have the rootfs label and must be\nmanually restoreconed.\n\nBug: 35219933\nChange-Id: I2a749f128dc3a609907101ce703747f8990b4386\n"
    },
    {
      "commit": "4599627492aa90e537fe681c1f2f439a29549382",
      "tree": "d28fb9beda3fd0840210e71e7257fafa4c08c847",
      "parents": [
        "d392ac160cb207b7351c359c99cb095fdfb5eecb"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue May 02 14:44:39 2017 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed May 03 21:51:04 2017 +0000"
      },
      "message": "init: setup keyring before ueventd starts\n\nInvent keyutils.h to supply capability to set session keyring.\nThe keyring will hold things like the FBE encryption keys.\n\nTest: gTest logd-unit-tests --gtest_filter\u003dlogd.statistics\nBug: 37751120\nBug: 36645158\nChange-Id: Ieb44fa8f53dda6cf506a6243498c72d7f7f3cde7\n"
    },
    {
      "commit": "26ed9cb7062c852749b18cd4b5873d07a3389d00",
      "tree": "8e3d8b51654781200cce37994ed19d3273592ebd",
      "parents": [
        "d0013343e930e0052d4dd4736edd29d84eadc770"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 17 13:25:29 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 25 17:14:23 2017 +0000"
      },
      "message": "init: rename \u0027Trigger\u0027 to \u0027Event\u0027 and convert to std::variant\n\nThe term \u0027trigger\u0027 should be used in \u0027Action\u0027 to indicate what causes\nthe \u0027Action\u0027 to be executed.\n\nThe term \u0027event\u0027 should be used in ActionManager\u0027s queue to indicate\na state change that is checked against the \u0027triggers\u0027 of an \u0027Action\u0027 to\nsee if it should execute.\n\nConvert the previous Trigger class to std::variant, as the latter is\nbetter suited for this use.\n\nChange-Id: I2558367c8318b536aa69fcec93793f1c12857ef5\n"
    },
    {
      "commit": "f1bd536efd84cea06e09b14f8d8a8d04daa1fe79",
      "tree": "084e163530b014f9c08df2f3d21823da56df4703",
      "parents": [
        "bcd36a20d484fd0cde1cd6b69aefa167900b7088",
        "fd18a452be7d89bc0338035708bded57e4ca5595"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Apr 25 00:31:40 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Apr 25 00:31:41 2017 +0000"
      },
      "message": "Merge \"init: set ro.boot.avb_version in recovery mode\""
    },
    {
      "commit": "bcd36a20d484fd0cde1cd6b69aefa167900b7088",
      "tree": "f50a59ced1b1f498fa68ef50f338d05b562102c0",
      "parents": [
        "5002a48ceeb4cce3ec2c240ac89df8c4ec502c70",
        "d262017fef0761e6cf6d1e449fa088338cdc68e6"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Apr 25 00:31:25 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Apr 25 00:31:27 2017 +0000"
      },
      "message": "Merge \"init: moving early mount logic into init_first_stage.cpp\""
    },
    {
      "commit": "fd18a452be7d89bc0338035708bded57e4ca5595",
      "tree": "50ac02dbeec979409a8b216197126c44a3801ccc",
      "parents": [
        "d262017fef0761e6cf6d1e449fa088338cdc68e6"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Mon Apr 24 18:36:25 2017 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Mon Apr 24 23:10:59 2017 +0800"
      },
      "message": "init: set ro.boot.avb_version in recovery mode\n\nPreviously we set ro.boot.avb_version during the first stage mount in normal mode:\n  - https://android-review.googlesource.com/#/c/371774/\n\nAs the first stage mount is not performed in recovery mode, we need to set the\nproperty separately in recovery mode.\n\nBug: 37414003\n\nTest: first stage mount /vendor with vboot 2.0 (avb) on bullhead in normal mode\nTest: first stage mount /system with without verity on bullhead in normal mode\nTest: checks ro.boot.avb_version is 1.0 on bullhead in recovery mode\n\nTest: first mount /vendor with with vboot 1.0 on sailfish in normal mode\nTest: checks ro.boot.avb_version doesn\u0027t exist on sailfish in recovery mode\n\nChange-Id: I262e75b8b557c4de7609b4049ccb01793644245e\n"
    },
    {
      "commit": "d262017fef0761e6cf6d1e449fa088338cdc68e6",
      "tree": "c0e9f515713055bef40b1833628d239192282a0f",
      "parents": [
        "d272ca38f6649c0c12ce4bbffbac1c6378cdf2d5"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Mon Apr 17 22:17:09 2017 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Mon Apr 24 23:10:10 2017 +0800"
      },
      "message": "init: moving early mount logic into init_first_stage.cpp\n\nAlso renames \"early mount\" to \"first stage mount\" to prevent confusion\nwith \"mount_all --early\", which is run in the init second stage.\n\nAlso creates a base class: FirstStageMount and two derived classes:\nFirstStageMountVBootV1 and FirstStageMountVBootV2 to replace/refactor\nexisting functions:\n\n   - early_mount() -\u003e DoFirstStageMount() and FirstStageMount::DoFirstStageMount()\n\n   - vboot_1_0_early_partitions -\u003e FirstStageMountVBootV1::GetRequiredDevices()\n   - vboot_2_0_early_partitions -\u003e FirstStageMountVBootV2::GetRequiredDevices()\n\n   - vboot_1_0_mount_partitions -\u003e\n       FirstStageMount::MountPartitions() and\n       FirstStageMountVBootV1::SetUpDmVerity()\n\n   - vboot_2_0_mount_partitions -\u003e\n       FirstStageMount::MountPartitions() and\n       FirstStageMountVBootV2::SetUpDmVerity()\n\nBug: 37413399\nTest: first stage mount /vendor with vboot 2.0 (avb) on bullhead\nTest: first stage mount /system with without verity on bullhead\nTest: first stage mount /vendor with with vboot 1.0 on sailfish\nChange-Id: I6584bdf7d832c9fbc8740f97c9b8b94e68a90783\n"
    },
    {
      "commit": "30a6f276fd8850b0a78689d7bff3cb06a18cb286",
      "tree": "6d07dc78662207e7300c42c9362dc7b198d98194",
      "parents": [
        "a0bf415cad6dddcc1cdb154a95c795b5a8ecb7aa"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Apr 19 15:31:58 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Apr 21 18:26:40 2017 -0700"
      },
      "message": "init: clean up the SectionParser interface and Parser class\n\nRemove the dependency on Action and Service from what should be a\ngeneric Parser class.\n\nMake ActionParser, ImportParser, and ServiceParser take a pointer to\ntheir associated classes instead of accessing them through a\nsingleton.\n\nMisc fixes to SectionParser Interface:\n1) Make SectionParser::ParseLineSection() non-const as it always should\nhave been.\n2) Use Rvalue references where appropriate\n3) Remove extra std::string\u0026 filename in SectionParser::EndFile()\n4) Only have SectionParser::ParseSection() as pure virtual\n\nDocument SectionParser.\n\nMake ImportParser report the filename and line number of failed imports.\n\nMake ServiceParser report the filename and line number of duplicated services.\n\nTest: Boot bullhead\n\nChange-Id: I86568a5b375fb4f27f4cb235ed1e37635f01d630\n"
    },
    {
      "commit": "98ad32a967079be80a101458d8a29d7ecefbb547",
      "tree": "64c0d213fc7c4f81f1424aa601792c5628c2989b",
      "parents": [
        "b7826a74f246ac148c3f5c6ad73e3fc8728a0bfe"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 17 16:34:20 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 17 16:40:06 2017 -0700"
      },
      "message": "init: handle sys.powerctl immediately\n\nCurrently if a process sets the sys.powerctl property, init adds this\nproperty change into the event queue, just like any other property.\nThe actual logic to shutdown the device is not executed until init\ngets to the action associated with the property change.\n\nThis is bad for multiple reasons, but explicitly causes deadlock in\nthe follow scenario:\n\nA service is started with `exec` or `exec_start`\nThe same service sets sys.powerctl indicating to the system to\nshutdown\nThe same service then waits infinitely\n\nIn this case, init doesn\u0027t process any further commands until the exec\nservice completes, including the command to reboot the device.\n\nThis change causes init to immediately handle sys.powerctl and reboot\nthe device regardless of the state of the event queue, wait for exec,\nor wait for property conditions.\n\nBug: 37209359\nBug: 37415192\n\nTest: Init reboots normally\nTest: Update verifier can reboot the system\nChange-Id: Iff2295aed970840f47e56c4bacc93001b791fa35\n"
    },
    {
      "commit": "1a898c25f96150787b39d9a08ebdb9ab6fcb3846",
      "tree": "bbbd06698ef825c1fbf58b3fa3cf0cf1d39cf42c",
      "parents": [
        "82bd278dc4ed6e62b0aebec84cb2bde793823b35"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Thu Apr 13 21:17:48 2017 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Sat Apr 15 09:47:31 2017 +0800"
      },
      "message": "Set libavb version into system property for Treble OTA\n\nSet ro.boot.avb_version to \"AVB_VERSION_MAJOR.AVB_VERSION_MINOR\".\nDuring Treble OTA match, the major version must be the same as that in\nthe avb metadata on disk, while the minor version can be equal or\ngreater to that in the avb metadata on disk.\n\nSee how avb versioning work on the following link:\n\n  https://android-review.googlesource.com/#/c/342757/\n\nAlso renames AvbHashtreeDisabled() -\u003e hashtree_disabled().\n\nBug: 35322304\nTest: Early mount with AVB, checks [ro.boot.avb_version]: [1.0] exists.\nTest: Not enable AVB, checks [ro.boot.avb_version] doesn\u0027t exists.\n\nChange-Id: I5aaf476ca53c4fe817779518ba14b68ebcfdc6d6\n"
    },
    {
      "commit": "e3e48214b718d5c6bb76d50c56344b222a23a234",
      "tree": "17a260d247cd0b2d5f2c1f5c238c8fdb5896358e",
      "parents": [
        "e771b69e72ad464c511c504cc9e9da2ada790873"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 11 13:53:37 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Apr 14 10:23:52 2017 -0700"
      },
      "message": "ueventd: replace char* with std::string in struct uevent\n\nBug: 36250207\n\nTest: Boot bullhead\nTest: Boot sailfish, observe no boot time regression\nTest: init unit tests\n\nChange-Id: Ib82833bea56bdafbe1d7a045126aaa91a8725d98\n"
    },
    {
      "commit": "8bba52fc4bf1f2f84add7af5d9527ae923cf8ecc",
      "tree": "88ef483de82763a357798f75e39a568ce2bda83e",
      "parents": [
        "80d1ad17ed5dd1ca63cc3cca24e801c9f63bc48f"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Thu Apr 06 21:01:40 2017 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Fri Apr 14 12:10:20 2017 +0800"
      },
      "message": "init: support early_mount with vboot 2.0 (external/avb/libavb)\n\nlibavb requires verifying AVB metadata on all verified partitions at\nonce. For example, /vbmeta, /boot, /system and /vendor. We need to\ninvoke device_init() for those partitions even if we only want to early\nmount some of them, like /vendor and /system.\n\nThis CL gets all AVB partitions and the early mount partitions from\ndevice tree through \"firmware/android/vbmeta\" and \"firmware/fstab\",\nrespectively. The following is an example to early mount /vendor\npartition on bullhead:\n\nfirmware {\n    android {\n        compatible \u003d \"android,firmware\";\n        vbmeta {\n            compatible \u003d \"android,vbmeta\";\n            parts \u003d \"boot,system,vendor\";\n            by_name_prefix\u003d\"/dev/block/platform/soc.0/f9824900.sdhci/by-name\"\n        };\n        fstab {\n            compatible \u003d \"android,fstab\";\n            vendor {\n                compatible \u003d \"android,vendor\";\n                dev \u003d \"/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor\";\n                type \u003d \"ext4\";\n                mnt_flags \u003d \"ro,barrier\u003d1,inode_readahead_blks\u003d8\";\n                fsmgr_flags \u003d \"wait,avb\";\n            };\n        };\n    };\n};\n\nBug: 33254008\nTest: early mount /vendor with vboot 2.0 (AVB) on bullhead\nTest: early mount /system without dm-verity on bullhead\nTest: early mount /vendor with vboot 1.0 on sailfish\n\nChange-Id: I89a1f77c97124f309346b33d9e700544b92ecf05\n"
    },
    {
      "commit": "72ca48e5cbbf557778a417b2109ef560c70d3b8e",
      "tree": "0d273a213caeef32eb55f793c9a28a33a66db2b5",
      "parents": [
        "9ef4417c8ea24cfe561103902a8eb9fa455d1677",
        "bf2dd482412cb7b93f52d2ed2d9be9a32fa8d2f9"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Apr 10 20:51:57 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Apr 10 20:51:59 2017 +0000"
      },
      "message": "Merge \"crash_dump: during early boot, output to kmsg on userdebug.\""
    },
    {
      "commit": "a74635d33e0b15407850351a3e911294b37ff7c0",
      "tree": "47bf62d67f2a217e292fbbcc3775990b45a0b718",
      "parents": [
        "ab5ab1ebd4b3bce1a7c95077bdaed8557f4071ab",
        "299231152ed1b7bb6f59d8a780d6818e20fda83b"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Fri Apr 07 14:25:32 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Apr 07 14:25:33 2017 +0000"
      },
      "message": "Merge \"Reflect move of mapping file to /system.\""
    },
    {
      "commit": "3f5eaae526413a29de899270714469c76dc91ec8",
      "tree": "c7de454140682dad1661449b29badf31f001e345",
      "parents": [
        "b15882faab26af76f0bca30c2ce4ef4890eb4502"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Apr 06 16:30:22 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Apr 06 18:06:34 2017 -0700"
      },
      "message": "init: more header cleanup\n\nRemove includes of \"log.h\" that really want \u003candroid-base/logging.h\u003e\nFix header include order\nRemove headers included in .cpp files that their associated .h already includes\nRemove some unused headers\n\nTest: boot bullhead\nChange-Id: I2b415adfe86a5c8bbe4fb1ebc53c7b0ee2253824\n"
    },
    {
      "commit": "bf2dd482412cb7b93f52d2ed2d9be9a32fa8d2f9",
      "tree": "13e597ec30c32adb760606ef1ddb99bc0a989aa4",
      "parents": [
        "ebc87c98e35327e7403ed767c935a8e6a02b6f03"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Mar 28 13:07:15 2017 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Apr 06 15:00:52 2017 -0700"
      },
      "message": "crash_dump: during early boot, output to kmsg on userdebug.\n\nCrashes that happen before tombstoned is running are extremely hard to\ndiagnose, because tombstones aren\u0027t written to disk, and the window of\nopportunity to get logs via `adb logcat` is small (potentially\nnonexistent).\n\nSolve this by adding a world-writable /dev/kmsg_debug on userdebug\nbuilds, and writing to it in addition to logcat when tombstoned hasn\u0027t\nstarted yet.\n\nBug: http://b/36574794\nTest: stop tombstoned; crasher; dmesg\nChange-Id: Ib22c02a002afb602933155fb2c9b7a8abbe9ed38\n"
    },
    {
      "commit": "299231152ed1b7bb6f59d8a780d6818e20fda83b",
      "tree": "64b023e7ce7f3062898f1934b3d7e5965dccda7a",
      "parents": [
        "ebc87c98e35327e7403ed767c935a8e6a02b6f03"
      ],
      "author": {
        "name": "Dan Cashman",
        "email": "dcashman@google.com",
        "time": "Thu Apr 06 09:51:23 2017 -0700"
      },
      "committer": {
        "name": "Dan Cashman",
        "email": "dcashman@google.com",
        "time": "Thu Apr 06 12:52:33 2017 -0700"
      },
      "message": "Reflect move of mapping file to /system.\n\nBug: 36783775\nTest: boot device with matching sha256 and non-matching and verify that\ndevice boots and uses either precompiled or compiled policy as needed. Also\nverify that mapping_sepolicy.cil has moved.\n\n(cherry-pick of commit: 39ffec779a0556e4e2637154e61cae0896359f7a)\nChange-Id: I9c3df2e7ed3f0eadd98e98529ebed360fec66dba\n"
    },
    {
      "commit": "e78ea77f6992013b16fd57c07548b53129cdd12f",
      "tree": "cd63b894d0409391b8601954b8b79497c4e576b9",
      "parents": [
        "c65f842cd1a3b8451370ed037a29bdd41c938765"
      ],
      "author": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Fri Mar 24 11:43:02 2017 -0700"
      },
      "committer": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Thu Mar 30 14:24:12 2017 -0700"
      },
      "message": "bootstat: Refactor init/utils/boot_clock into base/chrono_utils.\n\nUse this for bootstat and init. This replaces the custom uptime parser in\nbootstat.\n\nThis is a reland of aosp/338325 with a stubbed implementation for Darwin.\n\nThis change also has clang_format fixes (automatic).\n\nBug: 34352037\nTest: chrono_utils_test\nChange-Id: I72a62a3ca1ccfc0a4ccc6294ff1776c263144686\n"
    },
    {
      "commit": "7ef60b4ed4d7533fdf7e4c535d7300ec2920c6fe",
      "tree": "71adeba9fb63f6979f4dee377855b7c8a82f549a",
      "parents": [
        "6fb2ef1d03ffad5b9253647daf0fcc6888b2aac4"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Mar 29 10:31:26 2017 -0700"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Mar 29 16:01:31 2017 -0700"
      },
      "message": "init: consolidate restorecon after selinux initialization in single function\n\nTest: Boot sailfish\nChange-Id: I423028f12a84c4e0c12c9bdde52b6d795d45b620\n(cherry picked from commit 74df5bab1622fab9310f4e7f18b31d3db2133992)\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "8772b3686efad95dc53afca5004fcd62c2797638",
      "tree": "1c4327eb457bf0af133b093c253441a3cc7b9921",
      "parents": [
        "7bcce1e3c00edc8309f6e3c6cad1f24ec58d0d2b",
        "1e2d8c7fce132773da8058f7210c0d990c4cb1a9"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Mar 29 18:39:30 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Mar 29 18:39:32 2017 +0000"
      },
      "message": "Merge changes from topic \u0027exec-start-update-verifier\u0027\n\n* changes:\n  init.rc: launch update_verifier with exec_start\n  init: add exec_start command\n"
    },
    {
      "commit": "ccf23537eeacfa47e5f18dd3b75089886d177c1b",
      "tree": "cadcde5aa295377ca4613fde651a20e2e8bb7a26",
      "parents": [
        "ec16825cb8130420dbdd0ca7086f5f1c7ad469a8"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Mar 28 16:40:41 2017 -0700"
      },
      "committer": {
        "name": "Keun-young Park",
        "email": "keunyoung@google.com",
        "time": "Wed Mar 29 10:07:54 2017 -0700"
      },
      "message": "init: replace property_get with its android::base equivalent\n\nSlowly try to decouple property_service.cpp from the rest of init.\n\nTest: Boot bullhead\nChange-Id: I267ae0b057bca0bf657b97cb8bfbb18199282729\n"
    },
    {
      "commit": "1ec1bd918ccebf64aaa40b5ef1c1a497c75aa85e",
      "tree": "27bc28a5f09412cca820cc06327144cb4671b287",
      "parents": [
        "b15429c0eade8a5f9b456c5f0aa57eec697e9ff2"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Mar 28 16:22:33 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Mar 28 16:22:33 2017 -0700"
      },
      "message": "init: remove unused cutils includes\n\nTest: Boot bullhead\nChange-Id: I629f9c3863f00fa38f87a68442c2380d28764718\n"
    },
    {
      "commit": "b27004aa05039b5196f1e878169dca41b68aadd6",
      "tree": "a859e2269ff0b19e4ff92634507be14eab7de084",
      "parents": [
        "b15429c0eade8a5f9b456c5f0aa57eec697e9ff2"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 27 16:27:30 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 27 17:41:27 2017 -0700"
      },
      "message": "init: add exec_start command\n\nExec services may also want to set other service flags such as\npriority.  Instead of expanding the exec syntax to handle this, create\na new command, exec_start, that will treat an existing service\ndefinition as an exec service.  The new exec_start command will start\nthe service then halt init from executing further commands until the\nservice has exited.\n\nThis change additionally encapsulates the waiting_for_exec logic into\nServiceManager and removes the ambiguous \u0027bool\u0027 return value from\nReap() which previously indicated if a Reaped service was an exec\nservice or not.\n\nBug: 36511808\nBug: 36102163\nTest: Bullhead boots, services run with exec_start as they do exec.\n\nChange-Id: I44f775cf1c1dd81d5c715f44fdc150c651a2c80a\n"
    },
    {
      "commit": "77ddcd5a3f0de96b6e14fe0dea9cc57e970ee858",
      "tree": "d8f0789bcee66a23d80c89e1f60d7c7ab4caf4e2",
      "parents": [
        "2af784bf202085d0ed03497f596b4447f37bd25c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Mar 23 16:54:38 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Mar 23 17:17:54 2017 -0700"
      },
      "message": "init: Prevent spin loop while waiting for exec or property\n\nCurrently, when we are waiting for an exec service or a property, if\nthere are either any services to be restarted or any more commands to\nbe run, we set the epoll_timeout to handle these events.  However, we\ndon\u0027t actually restart and processes or execute any commands while\nwaiting, so this essentially turns this waiting into a spin loop,\nparticularly in the common case of having more commands to execute,\nwhere epoll_timeout is set to 0.\n\nThe change only sets epoll_timeout if we\u0027re not waiting.\n\nNote that the only way to stop waiting for an exec service or a\nproperty is for a signal or property to be delivered to init, which\nhappens through the epoll fds, so it\u0027s safe to indefinitely wait for\nepoll to return.\n\nTest: Boot bullhead\nChange-Id: Iae3b217eb28182038b464fd39df8e7d27b5e23ff\n"
    },
    {
      "commit": "663fdfc1b2406fd6f88a89b998b300e5de8d5b05",
      "tree": "6d98abbb037203e3af18756cb365760927ef625d",
      "parents": [
        "5a258e72febb9c9aa8634a342759b30013a53d10"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Mar 10 14:46:38 2017 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Mar 21 13:42:17 2017 -0700"
      },
      "message": "init: reboot to bootloader on crash for development builds\n\nCurrently, if init crashes, the kernel panics.  During development, we\nwould like to catch this crash before the kernel panics and reboot\ninto bootloader. This will prevent boot looping bad configurations,\nparticularly desired in test labs where manual intervention would\notherwise be required to reset the devices.\n\nKeep the existing behavior for user builds, as init crashes should be\nrare for production builds and rebooting the device is the correct\nbehavior for end users.\n\nBug: 34147472\nTest: Boot bullhead userdebug, force init to crash, check that the\n      device is in bootloader\nTest: Boot bullhead user, force init to crash, check that the kernel\n      panics and the device reboots as it did previously\nChange-Id: Iab3d45ed0d1f82ffaad2a0835d9ca537c0516421\n"
    },
    {
      "commit": "34e70410ee70a0e95ab8318636000e8e28554fe1",
      "tree": "51cb44fd76770e116bdbab35572c7905e26a6104",
      "parents": [
        "e323976e747c28b78b5e1be565317f500e0f5c06"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Mar 16 18:08:56 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Mar 17 10:58:17 2017 -0700"
      },
      "message": "init: cleanup is_first_stage conditionals\n\nA recent change to the is_first_stage conditionals created a unneeded\nelse { } block as both the code in the else { } block and any code\nthat runs after it are both in the second stage of init.  A first step\nto clean this up is to remove this else block.\n\nSecondly, given the above confusion, it makes sense to simplify the two\nif (is_first_stage) conditions into one, which only now requires\nduplicating one line to initialize logging and the actual \"init\nfirst/second stage started!\" logs.\n\nLastly, there are a few commands ran at the beginning of both init\nstages that do not need to be,\n\n* boot_clock::time_point start_time \u003d boot_clock::now();\nThis is only used in the first stage so keep it there\n\n* umask(0);\numasks are preserved across execve() so it only needs to be set in the\nfirst stage\n\n* chmod(\"/proc/cmdline\", 0440);\nThis needs to be moved until after /proc is mounted in the first\nstage, but otherwise only needs to be done once\n\nTest: Boot bullhead, check umask, check cmdline permissions, check\nboot time property\n\nChange-Id: Idb7df1d4330960ce282d9609f5c62281ee2638b9\n"
    },
    {
      "commit": "d8a7257b14086a9070aa521b41118570ee4f4aaa",
      "tree": "ffc59394943a5a65fcb2939925270b661496ab50",
      "parents": [
        "2bc00140be22f08964102068a736358fe8dde5da"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 13 12:24:49 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 13 12:24:49 2017 -0700"
      },
      "message": "init: fix DumpState() logging\n\nFix two formatting issues in Action::DumpState(),\n\nOld:\non ro.crypto.state\u003dencrypted ro.crypto.type\u003dfile zygote-start\nNew:\non ro.crypto.state\u003dencrypted \u0026\u0026 ro.crypto.type\u003dfile \u0026\u0026 zygote-start\n\nOld:\non boot\n  %sifup lo\n  %shostname localhost\n  %sdomainname localdomain\n  %swrite /proc/sys/vm/overcommit_memory 1\nNew:\non boot\n  ifup lo\n  hostname localhost\n  domainname localdomain\n  write /proc/sys/vm/overcommit_memory 1\n\nAlso, now that we\u0027re importing many small rc files, it no longer makes\nsense to call Parser::DumpState() after each import.  Therefore, move\nthe conditional to call Parser::DumpState() to after /init.rc and its\nimports are parsed and after the late imports are parsed.\n\nTest: Boot bullhead with DumpState() enabled and check the output\nChange-Id: I0b81305b8938aa1a7133d7dd2055f34f47609cf9\n"
    },
    {
      "commit": "a71dfec4c286b60c41a7ff61a6bfc8c59968895f",
      "tree": "ec56dccfdd34c37ccf425110df28f18df189b8ae",
      "parents": [
        "c1b3c8ef2629eac2a73aa4a95bf43a66edf4cd0f"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Mar 09 10:56:58 2017 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Mar 09 11:11:23 2017 -0800"
      },
      "message": "Remove hard-coded policy version from secilc step\n\nThis change makes init\u0027s SELinux policy compilation step target the\nhighest SELinux policy language version supported by the kernel.\nPrior to this change the version was simply hard-coded in init.\n\nP. S. clang-format (part of presubmit for this change) is being\ncounter-productive trying to format the section with secilc\nparameters. The resulting layout is harder to read. This commit thus\ndisables clang-format for this section of code and formats the code\nfor improved readability.\n\nTest: Remove precompiled policy, device boots up, no new denials.\n      Added log statement to print out the policy version passed\n      into secilc -- it printed 30, as expected.\nBug: 31363362\n\nChange-Id: I151017b5211712861bafb662525e794a44026dd2\n"
    },
    {
      "commit": "2d19aeb13a666fc3e5317e19ea0e0d0a1730c425",
      "tree": "4881a5c77b130e7e969e82d31033536079515bf4",
      "parents": [
        "5811a434fc079a50fbf830dc001b0cb46fd4f2d0"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Mar 07 14:12:01 2017 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Mar 08 12:25:25 2017 -0800"
      },
      "message": "Use precompiled sepolicy when available\n\nNOTE: This change affects only devices which use SELinux kernel policy\nsplit over system and vendor directories/partitions.\n\nPrior to this change, init compiled sepolicy from *.cil files on every\nboot, thus slowing boot down by about 400 ms. This change enables init\nto skip the step compilation and thus avoid spending the 400 ms. The\nskipping occurs only if the device\u0027s vendor partition includes an\nacceptable precompiled policy file. If no acceptable policy is found,\nthe compilation step takes place same as before.\n\nBecause such devices support updating system and vendor partitions\nindependently of each other, the vendor partition\u0027s precompiled policy\nis only used if it was compiled against the system partition\u0027s policy.\nThe exact mechanism is that both partitions include a file containing\nthe SHA-256 digest of the system partition\u0027s policy\n(plat_sepolicy.cil) and the precompiled policy is considered usable\nonly if the two digests are identical.\n\nTest: Device with monolithic policy boots up just fine\nTest: Device with split policy and with matching precompiled policy\n      boots up just fine and getprop ro.boottime.init.selinux returns\n      a number below 100 ms. No \"Compiling SELinux policy\" message in\n      dmesg.\nTest: Device with split policy and with non-matching precompiled\n      policy boots up just fine and getpropr ro.boottime.init.selinux\n      returns a number above 400 ms. There is a \"Compiling SELinux\n      policy\" message in dmesg. The non-matching policy was obtained\n      by adding an allow rule to system/sepolicy, building a new\n      system image using make systemimage and then flashing it onto\n      the device.\nBug: 31363362\nChange-Id: Ic2e81a83051689b5cd5ef1299ba6aaa1b1df1bdc\n"
    },
    {
      "commit": "1185050767eb3e92d28e298e3f55f6bb29282ac7",
      "tree": "7dab72960cf778953fef290a2fdfbcdacb8c2e2f",
      "parents": [
        "f5dea8b393e2ac3a5c67dbcd9d565c85da9bded2"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Sun Mar 05 14:28:27 2017 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Sun Mar 05 14:29:16 2017 -0800"
      },
      "message": "Log stderr of secilc\n\nThis makes init log stderr of secilc invoked to compile SELinux\npolicy. Having an explanation for why secilc failed is very useful for\ndebugging boot issues.\n\nTest: Device with PRODUCT_FULL_TREBLE boots up just fine\nTest: Modified init.cpp to reference non-existent .cil file on a device\n      with PRODUCT_FULL_TREBLE and confirmed that dmesg now contains the\n      error message from secilc saying that the file was not found.\nBug: 31363362\n\nChange-Id: I6a3b3576daf0d6fd09e2c79bc43ae63850f44a00\n"
    },
    {
      "commit": "c2a4c9ab9abe2022d753db799dc713ee5c4e5c4c",
      "tree": "ffdc1474f10660559534d8740a52e3f24a7e135d",
      "parents": [
        "0ab93fdf3ae8af8bb9d8535bbcd5ec1808bf796f"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Thu Mar 02 12:43:10 2017 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Fri Mar 03 10:35:10 2017 -0800"
      },
      "message": "Track the move of split SELinux policy CIL files\n\nThe three CIL files comprising split sepolicy are being moved from the\nroot directory to system and vendor directories based on whether the\nfile is for platform/system policy or non-platform/vendor policy.\n\nTest: Device boots, no additional SELinux denials. This test was run\n      for a device which has split policy and for a device which has\n      monolithic policy.\nBug: 31363362\nChange-Id: Ica49f0beae56be0f1cea7117e48bf2f6af8b848b\n"
    },
    {
      "commit": "056eca201b093a8b3436f8020a49b1161d7c1f4c",
      "tree": "d6e9a08d7e59aae1f4f94a50d7ceaa94536b3051",
      "parents": [
        "a02a42ecb1c2bf57cf8731d9adc6354c885f2e49",
        "16696e201b20010d7de97265224e83401861d9ad"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Thu Mar 02 01:02:14 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Mar 02 01:02:15 2017 +0000"
      },
      "message": "Merge \"Use split SELinux policy at boot, if available\""
    },
    {
      "commit": "16696e201b20010d7de97265224e83401861d9ad",
      "tree": "84c4d10a0b10575c06aeb4fc22388af63ac60b9f",
      "parents": [
        "dfbae6ddbbc1dfaf9ba2b712f0de2cba786b092c"
      ],
      "author": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Tue Feb 28 12:32:20 2017 -0800"
      },
      "committer": {
        "name": "Alex Klyubin",
        "email": "klyubin@google.com",
        "time": "Wed Mar 01 14:07:40 2017 -0800"
      },
      "message": "Use split SELinux policy at boot, if available\n\nThis modifies init\u0027s loading of SELinux policy into the kernel to\nload the split (platform/system vs non-platform/vendor) policy if it\u0027s\npresent. If the split policy is not present, the usual monolithic\npolicy is loaded into the kernel, same as before.\n\nSplit policy is loaded by first compiling it from CIL form using\nsecilc compiler into the conventional monolithic/compiled form which\nis then loaded into the kernel.\n\nThe build system has not yet been modified to place split policy onto\ndevices. Thus, this commit currently has no effect. For testing split\npolicy, build plat_sepolicy.cil, nonplat_sepolicy.cil, and\nmapping_sepolicy.cil, and place them into the root directory of the\ndevice.\n\nThe following tests were performed for a device with monolithic policy\nand for the same device with split policy.\n\nTest: Device boots, no new denials\nTest: Play Movies plays back movies\nTest: Load ip6.me im Chrome\nBug: 31363362\nChange-Id: I9a75a48ac88f3392abc36669f91b0803e88cd147\n"
    },
    {
      "commit": "32232724fbb21bba8aafa9e40036ace7f1c619db",
      "tree": "80fbf46bbcc27a6125621570ac657020164b53c1",
      "parents": [
        "b6cb9b0457bf4101f8872d88935b5a7ee6d6ea4a"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Wed Mar 01 18:24:46 2017 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Thu Mar 02 00:30:58 2017 +0800"
      },
      "message": "init: skip early mount in recovery mode\n\nWe don\u0027t need early mount in recovery mode for security considerations,\ne.g., users should explicitly select \u0027mount /system\u0027 from the recovery\nmenu. This CL checks the existence of file \"/sbin/recovery\" and skip\nearly mount when it is found.\n\nBug: 35853576\nTest: early mount /vendor without dm-verity on sailfish\nTest: early mount not happen in recovery mode on sailfish\nChange-Id: I69cc96f6fd0de6ce493082921738a958dd571115\n"
    },
    {
      "commit": "f719c255faf831357fe7ee5e3f8b23f4be7caee3",
      "tree": "a79f392af3143c1719a7ec694a47d443af479cf8",
      "parents": [
        "dfbae6ddbbc1dfaf9ba2b712f0de2cba786b092c",
        "d4beed22e844cca43028de13ed67ead8281c1fab"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Feb 28 01:29:12 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Feb 28 01:29:13 2017 +0000"
      },
      "message": "Merge \"init: early_mount: removing hard-coded paths\""
    },
    {
      "commit": "d4beed22e844cca43028de13ed67ead8281c1fab",
      "tree": "f4162207479f2e05d091a5eb8bd201e2a97b973d",
      "parents": [
        "16f4fb9c4e2e916a91dc87b77a7c062866a4a8ff"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Sat Feb 18 18:33:13 2017 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Mon Feb 27 13:09:06 2017 +0800"
      },
      "message": "init: early_mount: removing hard-coded paths\n\nCurrent early mount has some hard-coded paths that are not easy to extend\nwhen we switch verified boot to AVB (external/avb/libavb). This CL uses some\nC++ containers to replace those fixed paths.\n\nBug: 33254008\nTest: early mount /vendor with dm-verity on sailfish\nTest: early mount /vendor without dm-verity on sailfish\nTest: early mount /vendor with dm-verity on bullhead\n\nChange-Id: I32a22fe486d7649e33bb23c9018ddc0428df6069\n"
    },
    {
      "commit": "4ec72cc25fe889818977ea00d2e97c17a04818a5",
      "tree": "c8c3dd7612a57c6cd19ac78955af0efd4957034b",
      "parents": [
        "dbb40b64e9832c6bb808f73f384902aa356f0756"
      ],
      "author": {
        "name": "Jaekyun Seok",
        "email": "jaekyun@google.com",
        "time": "Wed Feb 22 20:37:57 2017 +0900"
      },
      "committer": {
        "name": "Jaekyun Seok",
        "email": "jaekyun@google.com",
        "time": "Sat Feb 25 08:06:12 2017 +0900"
      },
      "message": "Treblize init.rc location\n\nTreblization requires to locate partner-specific modules in its own\npartition. So their own init.rc file could be located in /odm or\n/vendor.\nThis CL is to support those locations for the init.rc.\nAdditionally thic CL modified import parser to support importing a\nrelative path.\n\nTest: building succeeded and tested on sailfish with enabling early\nmount.\nBug: 35269867\n\nChange-Id: I1bce924a32c8a2b53fb5d981d35d758cf9ddd9a6\n"
    },
    {
      "commit": "c20c0c2cdd593f6b54bf467167a5f2ed3c602ab8",
      "tree": "531c5f764b840765aed05bc29083c197d31fff8f",
      "parents": [
        "4bd3facbb1e79055f92e2ea8d42cb81552ffc6bb"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Feb 23 16:09:34 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Feb 23 16:48:43 2017 -0800"
      },
      "message": "early_mount: fs_mgr: move all fstab logic into fs_mgr\n\nWith init parsing fstab fragments from kernel separately, the fs_mgr\nwould completely miss the device tree entries. That leads to things like\n\u0027adb remount\u0027 to go through without warning for verity even if /system\nis verified. This happens because \u0027verity_update_state\u0027 completely\nmisses the partitions passed to android through the device tree.\n\nsolution is to teach fs_mgr about device tree fstab entries and add 2\nnew public APIs.\n\n1. fs_mgr_read_fstab_dt() - reads device tree and returns fstab\ngenerated from it.\n\n2. fs_mgr_read_fstab_default() - reads both device tree fstab and\n/fstab.{ro.hardware} and returns the combined table.\n\nThis also reduces the hardcoded /fstab.{ro.hardware} occurence only to\nfs_mgr and for eveyone who wants to read the \"default\" fstab must be\nchanged to call fs_mgr_read_fstab_default() instead. e.g. adb.\n\nb/27805372\n\nTest: Angler was used since it has 2 early mounted partitions instead of\none. 1 verified and 1 unverified.\n- Boot angler successfully without early mount\n- Boot angler successfully with /vendor early mount and test if \u0027adb\nremount\u0027 warns us about verity\n- Boot angler successfully with both /system and /vendor early mounted\nand ensure \u0027adb remount\u0027 warns us about verity.\n- check partitions.system.verified status after /system early mount ot\nensure it is set to VERITY_MODE_DEFAULT.\n- \u0027adb disable-verity\u0027 with early mounted /system doesn\u0027t work due to\nmissing changes in adb\n\nTODO:\nchange adb to use the new fs_mgr_read_fstab_default() API\n\nChange-Id: I82038d87c7a44488e938acce2cc1082c08f6f73a\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "e9da79bd4466d5bf0d445b90915a9f18942fc7fe",
      "tree": "d18d6ebeb3119857cedd534cafce5e3783281b54",
      "parents": [
        "05ff38ba43eb7a882873312f12fc019b42f37b34"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Feb 16 18:13:38 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Feb 22 11:30:35 2017 -0800"
      },
      "message": "init: early_mount: create device node for verity metadata partition\n\nMost devices pass the veritymode through \u0027androidboot.veritymode\u0027 kernel\ncmdline partition. However, for those who don\u0027t, the verity state is\nread from a different block device whose path it passed to \"verify\u003d\"\nfs_mgr option in fstab.\n\nThis change add support for such a case if the partition that needs to\nbe mounted early requires this additional block device to load the\nverity state from.\n\nNote that, there can only be 1 partition to get the verity state\nregardless of the number of partitions we enable verity for.\n\nBug: 27805372\n\nTest: Test angler by removing the metdata argument in fstab when it\nboots fine. Tested by adding the argument when it fails to boot as\nveritymode gets set to EIO during early mount due to lack of access to\nproperties as expected.\n\nTODO: fs_mgr must pull the veritymode from kernel cmdline or device tree\nby itself\n\nChange-Id: I9e62b8c1bf2c0ae0365677df697a0cbe9e5810c1\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "05ff38ba43eb7a882873312f12fc019b42f37b34",
      "tree": "630a81bbc8fd8f3daaaee1abdcef72eb39a288e3",
      "parents": [
        "0a3e36fbb19315de6208560e239dbc7cccbba214"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Feb 16 17:04:11 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Feb 22 11:22:53 2017 -0800"
      },
      "message": "init: early_mount: disallow partitions to be verified at boot\n\nWhile technically possible, the verification at boot basically will\nblock init for as long as the entire partition is read while nothing\nelse is running. Disallow that as this is not going to be used anywhere.\n\nBug: 27805372\nTest: boot angler with verifyatboot fs_mgr option for early mounted\nvendor partition. That resulted in a panic() as expected.\n\nChange-Id: I9da5caa163cae8bce6dbfb630f0ed5605ea044a0\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "0a3e36fbb19315de6208560e239dbc7cccbba214",
      "tree": "ffc22f868b746c00cc4aaddabe6166e816abdc5f",
      "parents": [
        "4129f20aafe07431a5950271cf7b9014bee53550"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Feb 15 15:45:01 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Feb 22 11:22:53 2017 -0800"
      },
      "message": "init: early_mount: add support to mount verity enabled partitions early\n\nsupport mounting partitions early regardless of their \"verified\" status.\nuses the newly exported fs_mgr APIs to split verity setup and mount\noperations.\n\nb/27805372\n\nTest:\n Angler:\n - Early mount /vendor without dm-verity\n Sailfish:\n - Early mount /vendor without dm-verity\n - Early mount /vendor with dm-verity\n\nTODO:\n add support for metadata partition used in angler\nto load dm-verity data\n\nChange-Id: Ie2768d4d895c19d045293c573773ee7bb03fff99\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "763512795d8bdecae97962f2eadbc67624e40d32",
      "tree": "c59441d1109e0e39bc4e8cf35ead5eabc4b69bac",
      "parents": [
        "141e98474eefc43ce01fa1d7928b4313cfcfe1ed"
      ],
      "author": {
        "name": "bowgotsai",
        "email": "bowgotsai@google.com",
        "time": "Tue Feb 14 22:06:20 2017 +0800"
      },
      "committer": {
        "name": "Iliyan Malchev",
        "email": "malchev@google.com",
        "time": "Thu Feb 16 05:18:12 2017 +0000"
      },
      "message": "Set libavb version into system property for Treble OTA\n\nTreble allows framework-only (system.img) OTA. To libavb statically\nlinked in init/fs_mgr cannot parse the AVB metadata of system.img, add\nthis property for the Treble OTA match process.\n\nBug: 35236019\nTest: Normal boots, use \u0027adb shell getprop\u0027 to check the property is set.\nTest: Recovery boots, press \u0027Mount system\u0027 and use \u0027adb shell getprop\u0027\n      to check the property is set\n\nChange-Id: I552be229c4efd45088d93252ac67176606f75d4d\n"
    },
    {
      "commit": "1549257ff55a47e2288d14e5ce48e6a8c8c36e2d",
      "tree": "723601d9c92b6ff8420accf3958abb7d3d6d1cf8",
      "parents": [
        "91cf0bd5c04cdd6cb78d95f3e464dcc068ba8566",
        "fc86f2442f99fcfc43527531768f69f56596f24a"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Feb 14 20:34:34 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Feb 14 20:34:35 2017 +0000"
      },
      "message": "Merge changes from topic \u0027pre-early-mount\u0027\n\n* changes:\n  init: fstab: add support to read fstab entries from device tree\n  init: early_mount: add support to mount non-verity partitions early\n  init: remove the existing early_mount code\n  init: refactor: add support for doing early coldboot\n  ueventd: make selinux labeling optional for device creation\n"
    },
    {
      "commit": "c8ac0677734270f0b12d85ecf23b1de49054890c",
      "tree": "d28d14e07cfa47388dea9ccded51df626c430edc",
      "parents": [
        "7c92e484503f239000ef97ef5b067907fbeaa4a6"
      ],
      "author": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Tue Feb 14 19:20:20 2017 +0000"
      },
      "committer": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Tue Feb 14 19:20:20 2017 +0000"
      },
      "message": "Revert \"bootstat: Refactor init/utils/boot_clock into base/chrono_utils.\"\n\nThis reverts commit 7c92e484503f239000ef97ef5b067907fbeaa4a6.\n\nMac sdk still broken (despite testing locally).\n\nChange-Id: I7d9206e15997cd0efe081bd3fa17d53d2b20ec32\n"
    },
    {
      "commit": "7c92e484503f239000ef97ef5b067907fbeaa4a6",
      "tree": "1bdbaa087da8202bd1eb6a97bdfcf0aa67f2e1ec",
      "parents": [
        "a3e4977325763b4a6fd290ee01b9ce133df8ab93"
      ],
      "author": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Mon Feb 13 15:47:21 2017 -0800"
      },
      "committer": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Mon Feb 13 15:47:21 2017 -0800"
      },
      "message": "bootstat: Refactor init/utils/boot_clock into base/chrono_utils.\n\nUse this for bootstat and init. This replaces the custom uptime parser in\nbootstat.\n\nThis is a reland of aosp/332854 with a fix for Darwin.\n\nBug: 34352037\nTest: chrono_utils_test\nChange-Id: Ib2567d8df0e460ab59753ac1c053dd7f9f1008a7\n"
    },
    {
      "commit": "fc86f2442f99fcfc43527531768f69f56596f24a",
      "tree": "f51c04a39323f88769feba19d3ae323dc3038a09",
      "parents": [
        "35403ebaf85aa229973275be9f5229d453799811"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Feb 09 19:19:31 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Mon Feb 13 12:35:39 2017 -0800"
      },
      "message": "init: fstab: add support to read fstab entries from device tree\n\nfor early mount, we need a way to tell init where to find vendor,\nodm partitions (also system in case of non-A/B devices). Also, that\nneeds to be independent of kernel cmdline since the cmdline will likely\nexceed its limit.\n\nThe change adds support for parse and create fstab entries that can be\ndirectly sent to the fs_mgr for mounting partitions early in init first\nstage.\n\nSample DT entry to mount vendor partition early on angler-\n\nfirmware {\n    android {\n        compatible \u003d \"android,firmware\";\n        fstab {\n            compatible \u003d \"android,fstab\";\n            vendor {\n                compatible \u003d \"android,vendor\";\n                dev \u003d \"/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor\";\n                type \u003d \"ext4\";\n                mnt_flags \u003d \"ro,barrier\u003d1,inode_readahead_blks\u003d8\";\n                fsmgr_flags \u003d \"wait\";\n            };\n        };\n    };\n};\n\nb/27805372\n\nTest: Boot angler and sailfish with early \"vendor\" partition mount by\nadding aforementioned DT node and enable CONFIG_PROC_DEVICETREE in kernel\n\nChange-Id: I669013e3fdb157e88719436534f63989dec95d60\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "35403ebaf85aa229973275be9f5229d453799811",
      "tree": "1612fd19b32ac01fe4fcdbbbb1280ab5b66c5cc9",
      "parents": [
        "44a3ee2cd1d73e8577d5612285c9000b47e848b6"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Feb 08 20:27:12 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Mon Feb 13 11:17:51 2017 -0800"
      },
      "message": "init: early_mount: add support to mount non-verity partitions early\n\nThis is done by parsing \u0027androidboot.fstab\u003d\u003cfstab\u003e\u0027 kernel cmdline\noption to get the fstab file that *only* specifies partitions to be\nmounted early (i.e. in init\u0027s first stage).\n\nNote that, the same fstab file may not be used as an argument to\nmount_all later in the boot as that will cause fs_mgr to fail with\nEBUSY.\n\nTODO:\n- Possibly add a new mount_mode so the same fstab can be used for\nearly_mount, \u0027mount_all --early/--late\u0027 etc.\n- Add support for dm-verity enabled partitions to mount early.\n- Add support for getting fstab arguments through DT instead of kernel\ncmdline.\n\nBug: 27805372\n\nTest:\nBoot angler by passing a seperate fstab file using the kernel\ncmdline option to mount vendor partition early, remove the vendor\npartition entry from the main fstab file for the test.\n\nBoot sailfish by passing a seperate fstab entry via device tree\nto mount vendor partition early. Remove vendor partition entry from\nthe main fstab file for the test\n\nChange-Id: I18785b893c54c8cee960ab44d5e8f83e5d624aa8\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "44a3ee2cd1d73e8577d5612285c9000b47e848b6",
      "tree": "df170fd21223c87b1107cdbb852097db99a55a0c",
      "parents": [
        "957e4ab0b5c5f0ed006a287ba7cc387ce7db4d27"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Wed Feb 08 15:49:47 2017 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Feb 09 15:39:06 2017 -0800"
      },
      "message": "init: remove the existing early_mount code\n\nkeeps parts of the code that are still needed for the fs_mgr\n+ dt based implementation\n\nb/27805372\n\nTest: boot angler, sailfish without regressions\n\nChange-Id: I1b08f8b7b4f2e67118d328443a5011c0f5ead919\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "0e3167e203ae89817cc30ba4a5a2d328716b4826",
      "tree": "b265be245dfd10cf677fe78bdedfec2e70da7336",
      "parents": [
        "ec5d6cb8fdcabaaaba2836712f5b7ee58321c3b8"
      ],
      "author": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Wed Feb 08 14:16:25 2017 -0800"
      },
      "committer": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Wed Feb 08 14:16:51 2017 -0800"
      },
      "message": "Revert \"bootstat: Remove custom uptime parser in favor of elapsedRealtime.\"\n\nThis reverts commit 26f40c04c3ad80e2bc449990010d39d1c1b9a5f0.\n\nThis change broke the Darwin SDK target.\n\nTest: none\nChange-Id: Ia54fe2c31da8d8fa2825e023b035fb8321dcd457\n"
    },
    {
      "commit": "26f40c04c3ad80e2bc449990010d39d1c1b9a5f0",
      "tree": "dc8aae8ca90822f9f9f578c40255fc7c93db76df",
      "parents": [
        "564aeca94e18cd708f93619551e05b3d59d4abe2"
      ],
      "author": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Mon Feb 06 10:46:54 2017 -0800"
      },
      "committer": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Tue Feb 07 15:43:32 2017 -0800"
      },
      "message": "bootstat: Remove custom uptime parser in favor of elapsedRealtime.\n\nRefactored init/utils/boot_clock into base/chrono_utils.\n\nBug: 34352037\nTest: none\nChange-Id: Ied0c00867336b85922369d7ff37520e3d28fc61e\n"
    },
    {
      "commit": "2d0fdaaafc5d2925b8ef7708a950f6b599892b54",
      "tree": "bda4830736d62b96c5326c70048dc8256e77c847",
      "parents": [
        "d85cf0fb7ded4001ae5a342d058dfa5e2e272eab"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Thu Feb 02 10:52:39 2017 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Fri Feb 03 10:40:39 2017 -0800"
      },
      "message": "init: clean up exec command\n\nAdd wait time log for exec service execution time\nFix memory leak when exec service failed to start\n\nTest: on marlin\nBug: 34518530\nChange-Id: I01736bd9b1429414f3dc91dd5d02d88a681f0985\n"
    },
    {
      "commit": "c4af05f8a3d67b9a4288a2b37c7fc16755497f6b",
      "tree": "176edafb4d5aa72c1ce4724c2b0b811fccdc22da",
      "parents": [
        "d25e4c581907abebfc380310fae07bc48e945974"
      ],
      "author": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Wed Feb 01 10:40:15 2017 -0800"
      },
      "committer": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Thu Feb 02 09:27:49 2017 -0800"
      },
      "message": "Revert \"Enable seccomp in init with generated policy\"\n\nThis reverts commit db929bf9b740b3b7c02cf0acc07fee94406f3b3f.\n\nSeccomp is now inserted at the zygote level, not in init\n\nBug: 34710876\nTest: Boots, seccomp policy in zygote \u0026 zygote64 but not init\nChange-Id: I9075a79793171a4eaccf6228e9ff3398c791f8bd\n"
    },
    {
      "commit": "132ac31b4738094e62cc1744e75f3756a035302c",
      "tree": "b7d531a891dc862df3201509d7a30db0b58277c4",
      "parents": [
        "afe25958b66f6186ada566a7c4af6b776b00cc42"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Jan 25 16:27:03 2017 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Feb 01 16:11:33 2017 -0800"
      },
      "message": "init: add wait_for_prop builtin command\n\nThere are many use cases from vendors to exec service in background and then\nuse a shell scriprt to wait for the command done.\n\nThis CL is to add a wait_for_prop command to suppor those use cases.\n\nBug: 34746108\nTest: on marlin\nChange-Id: Ia81290b0928f9d375710d2daa546714f0cd65b72\n"
    },
    {
      "commit": "d04b1ac006c74998cb03f2f8f432ed1f1bfdf609",
      "tree": "61eb70f4c38f1be2b6c59fe0076ca66e3c8920a7",
      "parents": [
        "9cd890e9b7a1ae1d354815f529a0b3df1dd07aea",
        "7a5db4ec7f83f4156edc6db2c79181e9fc4f6658"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Mon Jan 30 19:16:16 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Jan 30 19:16:17 2017 +0000"
      },
      "message": "Merge \"init: split property context into platform \u0026 non-platform components\""
    },
    {
      "commit": "27c052263c827150b1d371c72abee5974c000ac2",
      "tree": "f4e7f8f94db29eb92f98ac3cd3a27d868c833871",
      "parents": [
        "fc267f865e1475030f777a3640bd1cf46dc766b0"
      ],
      "author": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Thu Jan 26 11:55:44 2017 -0800"
      },
      "committer": {
        "name": "James Hawkins",
        "email": "jhawkins@google.com",
        "time": "Fri Jan 27 08:26:14 2017 -0800"
      },
      "message": "boottime/init: Report ro.boottime.init* properties in milliseconds.\n\n* Nanosecond precision ended up being harder to grok.\n* This change modifies the Timer class to have duration_ms instead of\nduration_ns.\n\nBug: 34466121\nTest: adb logcat | grep bootstat\nChange-Id: Ibd1c27dc3cb29d838a956e342281b2fb98d752a6\n"
    },
    {
      "commit": "7a5db4ec7f83f4156edc6db2c79181e9fc4f6658",
      "tree": "2bb8fb166bbe32f61eb9721fde06e55e9bb91890",
      "parents": [
        "1cb8d9df6c82c26c1af0d44082d21f53bffae7bc"
      ],
      "author": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Tue Dec 27 17:40:53 2016 -0800"
      },
      "committer": {
        "name": "Sandeep Patil",
        "email": "sspatil@google.com",
        "time": "Thu Jan 26 15:31:10 2017 -0800"
      },
      "message": "init: split property context into platform \u0026 non-platform components\n\nBug: 33746484\nTest: Successfully boot with original service and property contexts.\nTest: Successfully boot with split serivce and property contexts.\nTest: \u0027getprop -Z\u0027\nChange-Id: Ib9c087115040c1609aa64a3ed66d4e67e937e33d\nSigned-off-by: Sandeep Patil \u003csspatil@google.com\u003e\n"
    },
    {
      "commit": "571cd23fa8379989c52c927376787f596489249e",
      "tree": "e45027bcf5cdfe0586835182c4f901f0e270626e",
      "parents": [
        "038b8f086fef1e8d7462581f986bb00eaf913262",
        "959aeb17d5a533042bc0af02df5801b551509237"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Jan 24 03:59:12 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Jan 24 03:59:13 2017 +0000"
      },
      "message": "Merge \"init: add ro.boot.init_rc\""
    },
    {
      "commit": "44f7e4f42190fdb5309b818d5acc0ff6b0f87249",
      "tree": "37a3f9c1c79ff98819f3a967357ca7b410aa615d",
      "parents": [
        "8dbab358f01ed0957ff4d5b1c505981dfe93d5de"
      ],
      "author": {
        "name": "Dave Weinstein",
        "email": "olorin@google.com",
        "time": "Thu Jan 19 18:03:34 2017 -0800"
      },
      "committer": {
        "name": "Dave Weinstein",
        "email": "olorin@google.com",
        "time": "Fri Jan 20 09:40:43 2017 -0800"
      },
      "message": "Move the kptr_restrict setting from init.rc to init.cpp.\n\nAlso ensure that it uses the highest supported value, and\nabort if the value is not above a minimum threshold.\n\nTest: Tested against the curent kernel (maximum value of 2,\n      set to 0 by the kernel initially) and against a\n      modified kernel (maximum value of 4, set to 4 by the\n      kernel initially)\n\nBug: 30368199\nChange-Id: I608db577258b68b390ffe96f452e1f7c0bc9ad8a\n"
    },
    {
      "commit": "959aeb17d5a533042bc0af02df5801b551509237",
      "tree": "34fe1fa1b075a3602012c5b8a4ab6ed0b4573dc2",
      "parents": [
        "bde89da5fc19c071f377939679cbad48bffdf4f7"
      ],
      "author": {
        "name": "Hung-ying Tyan",
        "email": "tyanh@google.com",
        "time": "Wed Jan 18 09:39:36 2017 +0800"
      },
      "committer": {
        "name": "Hung-ying Tyan",
        "email": "tyanh@google.com",
        "time": "Wed Jan 18 09:39:36 2017 +0800"
      },
      "message": "init: add ro.boot.init_rc\n\nSoC vendors and ODMs need a way to run different init scripts under\ndifferent boot modes. This patch adds a new ro.boot.init_rc kernel\ncmdline argument to support this.\n\nBug: 26639863\nTest: Tested on bullhead with androidboot.init_rc given a\nnon-existent .rc file which leads to expected boot failures.\nBoot succeeds if androidboot.init_rc is not specified.\n\nChange-Id: I2bca1cc3de6720feced041fe87266fb8afcce8b0\n"
    },
    {
      "commit": "01519a207cffb27517963d13ce9a021dacecdb45",
      "tree": "896142da38267c6f8f5ebef6eeb49ba4b0242bea",
      "parents": [
        "7e6d30e5f20b56e3d585727068a891ce167788aa"
      ],
      "author": {
        "name": "Tao Bao",
        "email": "tbao@google.com",
        "time": "Tue Jan 17 18:03:58 2017 +0000"
      },
      "committer": {
        "name": "Tao Bao",
        "email": "tbao@google.com",
        "time": "Tue Jan 17 20:16:45 2017 +0000"
      },
      "message": "Revert \"init: add ro.boot.init_rc\"\n\nThis reverts commit 7e6d30e5f20b56e3d585727068a891ce167788aa.\n\nBug: 26639863\nBug: 34318089\nChange-Id: Ie71d773ee7c6c6a90e8298f8e0798eacba12d0be\n"
    },
    {
      "commit": "7e6d30e5f20b56e3d585727068a891ce167788aa",
      "tree": "8f2eea270ec75c6c0df102baeb357fd5fdab13ab",
      "parents": [
        "abc26ed753bf313950984e1d9e520cb0088adefa"
      ],
      "author": {
        "name": "Hung-ying Tyan",
        "email": "tyanh@google.com",
        "time": "Tue Dec 20 16:58:23 2016 +0800"
      },
      "committer": {
        "name": "Hung-ying Tyan",
        "email": "tyanh@google.com",
        "time": "Thu Jan 12 10:08:30 2017 +0800"
      },
      "message": "init: add ro.boot.init_rc\n\nSoC vendors and ODMs need a way to run different init scripts under\ndifferent boot modes. This patch adds a new ro.boot.init_rc kernel\ncmdline argument to support this.\n\nThis patch also changes late-init trigger. Now late-init is only\ntriggered in \"normal\" boot (where boot mode is not specified). This is\nto make AOSP init.rc re-usable in other boot modes as the operations\nin late-init are less common.\n\nBug: 26639863\nTest: Tested on bullhead with\n  androidboot.init_rc \u003d {non-existent .rc file}\n  and/or\n  androidboot.init_rc \u003d {none empty string}\n  both of which lead to expected boot failures.\n  Boot succeeds if androidboot.init_rc is not specified.\nChange-Id: Ie5f08c3914f2f825ad3c401fde6741459668c523\n"
    },
    {
      "commit": "db929bf9b740b3b7c02cf0acc07fee94406f3b3f",
      "tree": "734e7e55da8c5aa667fd113c492fbcb8608f4793",
      "parents": [
        "d5583867c61867252d4a8d794704f9c2d40bbca8"
      ],
      "author": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Fri Oct 21 13:13:02 2016 -0700"
      },
      "committer": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Tue Jan 10 10:09:38 2017 -0800"
      },
      "message": "Enable seccomp in init with generated policy\n\nTest: Ran script to test performance - https://b.corp.google.com/issues/32313202#comment3\n      Saw no significant regression with this change on or off\n      Removed chroot from SYSCALLS.TXT - chroot blocked\n      Boot time appears reasonable\n      Device boots with no SECCOMP blockings\n      Measured per syscall time of 100ns\n      Empirically counted \u003c100,000 syscalls a second under heavy load\n\nBug: 32313202\nChange-Id: Icfcfbcb72b2de1b38f1ad6a82e8ece3bd1c9e7ec\n"
    },
    {
      "commit": "77f0e9fda8839a21a4d360f128fe9af820b8819c",
      "tree": "2700a76901856fedfb1a6254dc319e365b9c6aff",
      "parents": [
        "491c3871a08b32b43b6f202eb6ca5a7dd6b7cafd"
      ],
      "author": {
        "name": "Jorge Lucangeli Obes",
        "email": "jorgelo@google.com",
        "time": "Wed Dec 28 14:07:02 2016 -0500"
      },
      "committer": {
        "name": "Jorge Lucangeli Obes",
        "email": "jorgelo@google.com",
        "time": "Wed Dec 28 14:16:54 2016 -0500"
      },
      "message": "init: Make \u0027write_file\u0027 return bool to match \u0027read_file\u0027.\n\nThe mismatch of return values makes reasoning about the correctness of\nCLs like https://android-review.googlesource.com/317923 quite hard.\n\nBug: 33941660\nTest: Init builds, HiKey boots.\nChange-Id: Ia4b8a9af420682997b154a594892740181980921\n"
    }
  ],
  "next": "c249794628d4ebf721cf74065a75ece696398802"
}
