)]}'
{
  "log": [
    {
      "commit": "612fc47090e4bcff953806c855fe21f5c594aa7e",
      "tree": "f2b1539ceb508f6ff876b29c9b464f0a93528702",
      "parents": [
        "c39f708cb41e3493cc432f7c7d9317c8ad2218b5"
      ],
      "author": {
        "name": "hyeeun.jun@samsung.com",
        "email": "hyeeun.jun@samsung.com",
        "time": "Wed Jan 29 17:10:17 2020 +0900"
      },
      "committer": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Wed Jun 17 13:39:21 2020 +0100"
      },
      "message": "Fix Deadlock Issue On AppFuseBridge\n\nThere are two locks used by AppFuseBridge.\nFirst is it\u0027s object lock, and the second is a mutex lock in app fuse library.\nThere are two oppsite routines to get those locks.\n\n  (Thread A) Got Java lock -\u003e Try to get Native lock\n  (Thread B)        Got Native lock -\u003e Try to get Java lock\n\nThe order must be followed to obtain two locks.\nIf not, the dead lock will be caused.\nTherefore we change the routine to get the mutex lock first, and the object lock later.\n\nSigned-off-by: hyeeun.jun@samsung.com \u003chyeeun.jun@samsung.com\u003e\nBug: https://issuetracker.google.com/issues/145707568\nBug: 157535024\nTest: atest --test-mapping apex/blobstore\n\nChange-Id: I0ab002da9a0b7ca2f518d50ab477a080cabe3788\n"
    },
    {
      "commit": "b6d9fbddc6d77f57c8630ec372bdb9890679b7be",
      "tree": "c30638fab0617ac752ce9ed94f5efdc5a7e1de3e",
      "parents": [
        "4d63d1b7bba07ea2120f9402c3ba7a1f0cc2b3bd",
        "c9e873f2747108cc6f010791c86569367d0bef44"
      ],
      "author": {
        "name": "Anton Hansson",
        "email": "hansson@google.com",
        "time": "Fri May 31 15:59:39 2019 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri May 31 15:59:39 2019 +0000"
      },
      "message": "Merge \"Close /dev/fuse FD before calling onClosed\" into qt-dev"
    },
    {
      "commit": "c9e873f2747108cc6f010791c86569367d0bef44",
      "tree": "e11ead722f4dcf19d82d745d7603de669a448b4b",
      "parents": [
        "cc18faf4d67c4f24474fcd621a083e31d8509a13"
      ],
      "author": {
        "name": "Anton Hansson",
        "email": "hansson@google.com",
        "time": "Fri May 31 13:22:34 2019 +0100"
      },
      "committer": {
        "name": "Anton Hansson",
        "email": "hansson@google.com",
        "time": "Fri May 31 15:58:45 2019 +0000"
      },
      "message": "Close /dev/fuse FD before calling onClosed\n\nThis works around a deadlock when a bridge that is about to be closed\nis reused for a new call to openFile. The call to open() ends up holding\nthe vold lock, waiting for appfuse to respond. The appfuse event loop\ncalls onClosed(), which ends up calling vold.unmountAppFuse(), which\ncannot get the lock.\n\nClosing this file descriptor causes any current calls to open() on its\nmount path to fail with either ECONNABORTED or ENOTCONN, allowing the\nevent loop to make progress, call onClosed() and unmount the path.\n\nNote that the failed call to open() will result in a retry, which\nwill create a new appfuse bridge. This is not ideal but not a new\nproblem -- the common case here is that that each call to\nopenProxyFileDescriptor creates a new bridge. This should ideally\nbe improved.\n\nBug: 132344997\nTest: flick through info of photos with location info attached\nExempt-From-Owner-Approval: verbal approval of approach\nChange-Id: I878e5cf86f18c5233f8505f52eb9db076bd72d01\n"
    },
    {
      "commit": "ca0d4ffbe38a1997d8b1555210a184a5e0d112f4",
      "tree": "a93cce816d72ec97df379bb9aa3b4c001dad235e",
      "parents": [
        "cc18faf4d67c4f24474fcd621a083e31d8509a13"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri May 31 12:51:05 2019 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri May 31 12:51:05 2019 +0900"
      },
      "message": "Fix BridgeEpollController to handles EAGAIN correctly\n\nWhen reading/writing proxy FD, if it returns EAGAIN,\nBridgeEpollController updates epoll entries to observe specific FD\nevents. Before updating epoll entries, BridgeEpollController checks if\nit really needs to update by comparing |state_| and |last_state_|.\n|last_state_| has not been updated correctly so it resulted in wrong\nepoll settings and keeps blocking the event loop.\n\nBug: 134104939\nTest: atest libappfuse_test\nChange-Id: I1c4a0164c1c016baf24ecfd523476ced981d3b28\n"
    },
    {
      "commit": "f47c91053ffb0c4477a6dc7271dae0b20b6223c3",
      "tree": "d7ed67c141d97abed134334e07fb2cc48bbb9830",
      "parents": [
        "8fe0eb46c0b98d26ad816c9d1f27dbe1e5c1d9f3"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Dec 17 09:32:23 2018 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Dec 17 09:32:23 2018 -0800"
      },
      "message": "use epoll_create1(EPOLL_CLOEXEC)\n\nepoll_create(0) leaks file descriptors. Use epoll_create1(EPOLL_CLOEXEC)\ninstead.\n\nBug: 120983106\nTest: compiles and boots\nChange-Id: I2a733d4482d6a74ceb3254e501cdb5f6de0cd5dc\n"
    },
    {
      "commit": "926acb637fe8dccbff33e9d2063e039e62a3ba3a",
      "tree": "e3e9dc518977162e86cc63a98bf2ebc3f705c7d5",
      "parents": [
        "d7ca9138926f5f409cfe6ae98d2e343a4bcd0063"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jul 14 16:41:45 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jul 14 16:44:16 2017 +0900"
      },
      "message": "Remove ScopedLogSeverity for debugging\n\nThe ScopedLogSeverity was added to observe APCT failures, which turned\nout to be a compiler optimization error.\n\nBug: 62429763\nTest: None\nChange-Id: Ibb45d018d8eaf4b29cb417da80ae5f0b000dda8e\n"
    },
    {
      "commit": "afa345325647e66dc7add78f7100dc81bd066dbb",
      "tree": "0ce95a8d9d3a94cf48b2ff1d231fd76b01a5bc93",
      "parents": [
        "7b1d736dac3eb1b3b75cfd1904a29cc9ec09c75d"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jun 15 15:48:07 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jun 20 00:25:28 2017 +0000"
      },
      "message": "Skip FUSE request from /dev/fuse if unique\u003d0\n\nAPCT log shows that we got FUSE request unique\u003d0 and replying to such\nrequest causes a EINVAL.\n\nThe possible reasons of getting unique\u003d0 here are:\n\n * /dev/fuse actually submits such requests. In this case, not replying\n   to such request probabbly safe as the kernel cannot wait corresponding\n   response without a unique number. We can observing the kernel code to\n   find out what unique\u003d0 actually means.\n * Memory corruption happens and unique number are cleared with zero.\n   In this case, if we skip unique\u003d0 request, libappfuse does not reply\n   to the kernel request and APCT result will become timeout .\n\nTo see which case happens, the CL ScopedLogSeverity to output\nverbose logs and lets FuseBridgeLoop skip a request from /dev/fuse if unique\u003d0.\n\nBug: 62429763\nTest: libappfuse_tests\nChange-Id: I8c4d532564b690d55573b92260170b0cd68150ab\n"
    },
    {
      "commit": "e5a1556d402789dc02aa041c8d04d0b23a0ce68e",
      "tree": "aaee25a43666860c95eba19a4442516f9b682002",
      "parents": [
        "435baf5d00162b6f14ada5f243ae49c62714d03f"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jun 09 13:12:21 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jun 12 10:37:08 2017 +0900"
      },
      "message": "Add more logs for writing failures.\n\nBug: 62429763\nTest: libappfuse_test\nChange-Id: Ie0eabd09ae9ad3f8ba8c4f38f871dad16b5c58ff\n"
    },
    {
      "commit": "96c6aa4f20717535921a927401cbfa16b56c193b",
      "tree": "14d7d213b10f16d2feac08238d112ee9a5c5f5f2",
      "parents": [
        "2b9a3391d0928f49d264d920e6ba0288e2e83e44"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 06 15:37:20 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Mar 23 16:22:03 2017 +0900"
      },
      "message": "Enable FuseBridgeLoop to accept new mount point after starting\n\nThe CL turns StartFuseBridgeLoop function into FuseBridgeLoop class, and\nadds a method adding new appfuse mount to the loop.\n\nAfter doing this, one FuseBridgeLoop can process FUSE commands from\nmultiple AppFuse mounts.\n\nBug: 34903085\nTest: libappfuse_test\nChange-Id: I54f11f54bc26c551281b9c32e9bb91f8f043774c\n"
    },
    {
      "commit": "691739b334f3efab38f82f2922ee4039462fec25",
      "tree": "7aaa276c9bbe559aa28f4aebcf311b6105f3ddf0",
      "parents": [
        "30e68088951f17ad54c1d15576835ff4eb622c4c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 15 15:42:05 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 17 09:49:51 2016 +0900"
      },
      "message": "Remove FuseBridgeLoop class.\n\nBug: 32779923\nTest: libappfuse_test\nChange-Id: I29a76701d141ae061ec1fe32993d27460a0c694a\n"
    },
    {
      "commit": "30e68088951f17ad54c1d15576835ff4eb622c4c",
      "tree": "2798f1f86672712a3e16d35ca3e3bbf0c3046d09",
      "parents": [
        "335502453d9b37c9c853dd3ac904d945b04e01ee"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 15 09:31:21 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 17 09:10:53 2016 +0900"
      },
      "message": "Stops the loop when all files are closed.\n\nThe CL changes FuseBridgeLoop so that it exits when all files opened on\nthe AppFuse mount point are closed. Note that the client code will\nunmount the FUSE mount point after the loop exits.\n\nBug: 32260320\nTest: libappfuse_test\nChange-Id: I4965fbb48de8a280c6306e70757a07376b1956a7\n"
    },
    {
      "commit": "a0aecda12b9a76aa15a8c5175e15538574a05af7",
      "tree": "ac1e8eda1f03a8922445ae13d6d7a4173158c4ec",
      "parents": [
        "b5ce6f02dd11b42c03884dd9531c6c8a80bcecda"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 08 10:17:51 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 15 09:47:31 2016 +0900"
      },
      "message": "Add FuseAppLoop to libappfuse.\n\nThe class is used at the app side (StorageManager) to parse FUSE\ncommands.\n\nBug: 32260320\nTest: libappfuse_test\nChange-Id: I1ae2904d3290a041f1efbf8fc10ba032eda5449c\n"
    },
    {
      "commit": "c6134762975204ceebcf7949e364484833714345",
      "tree": "ed01ec85a5175e2985e5e62986500da138d09d1d",
      "parents": [
        "7f8e819ded361e963df7aa648ca2c6d49c7b46b6"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Oct 27 14:57:55 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Oct 27 15:04:15 2016 +0900"
      },
      "message": "Add FuseBridgeLoop to libappfuse.\n\nThe CL adds FuseBridgeLoop class to libappfuse, which is used in the\nsystem service to proxy fuse commands to applications.\n\nBug: 29970149\nTest: libappfuse_test\nChange-Id: I0708f608b3868721ab16ba4028fd2c17a6735af7\n"
    }
  ]
}
