Show a patch.

GET /api/patches/2839/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2839,
    "url": "https://patchwork.libcamera.org/api/patches/2839/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/2839/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20200217110324.7431-1-laurent.pinchart@ideasonboard.com>",
    "date": "2020-02-17T11:03:24",
    "name": "[libcamera-devel,v2] libcamera: device_enumerator: Don't stop if one device fails",
    "commit_ref": "68daa9302f90833ce345cb33ffcf075f23cbfc9a",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "e91156d23e2ab32036ea4256fb2edfd717b166cb",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/2839/mbox/",
    "series": [
        {
            "id": 678,
            "url": "https://patchwork.libcamera.org/api/series/678/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=678",
            "date": "2020-02-17T11:03:24",
            "name": "[libcamera-devel,v2] libcamera: device_enumerator: Don't stop if one device fails",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/678/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/2839/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/2839/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<laurent.pinchart@ideasonboard.com>",
        "Received": [
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 77CF660437\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2020 12:03:46 +0100 (CET)",
            "from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id F1C83563\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2020 12:03:45 +0100 (CET)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1581937426;\n\tbh=j4o9DoyxLt00ScSv8GxCPr2zC+Pp8zvw7ymCdv10pbE=;\n\th=From:To:Subject:Date:From;\n\tb=qeQ1Ei0NRe0eyRRYmLtSoT52QtdBYdJeheHSVc3kotel3n5dkNs07ZcDa2XzrABP5\n\tYFsZ5wWOGyxyV2qK9LKbRaiGdzSuJ5P01LHsJomTjw42MqredI5iAeGvGvAl9qcwdq\n\tfhmkawaz+dMz9+dTDk9MrP1CvjK+ALHTPf6HoL+s=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Mon, 17 Feb 2020 13:03:24 +0200",
        "Message-Id": "<20200217110324.7431-1-laurent.pinchart@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.24.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v2] libcamera: device_enumerator: Don't\n\tstop if one device fails",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "X-List-Received-Date": "Mon, 17 Feb 2020 11:03:46 -0000"
    },
    "content": "If one device fails to enumerate, which isn't supposed to happen under\nnormal conditions, both the sysfs and the udev enumerators stop\nenumeration of further devices. This potentially prevents working\ndevices from being detected and handled. Fix it by skipping the faulty\ndevice.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\nChanges since v1:\n\n- Add more warning messages to DeviceEnumeratorUdev\n- Use media->deviceNode() and print the driver name where appropriate\n---\n src/libcamera/device_enumerator_sysfs.cpp | 16 +++++++--------\n src/libcamera/device_enumerator_udev.cpp  | 25 ++++++++++++++++-------\n 2 files changed, 26 insertions(+), 15 deletions(-)",
    "diff": "diff --git a/src/libcamera/device_enumerator_sysfs.cpp b/src/libcamera/device_enumerator_sysfs.cpp\nindex ad26affb38a3..197ca235879b 100644\n--- a/src/libcamera/device_enumerator_sysfs.cpp\n+++ b/src/libcamera/device_enumerator_sysfs.cpp\n@@ -33,7 +33,6 @@ int DeviceEnumeratorSysfs::enumerate()\n {\n \tstruct dirent *ent;\n \tDIR *dir;\n-\tint ret = 0;\n \n \tstatic const char * const sysfs_dirs[] = {\n \t\t\"/sys/subsystem/media/devices\",\n@@ -74,14 +73,15 @@ int DeviceEnumeratorSysfs::enumerate()\n \t\t}\n \n \t\tstd::shared_ptr<MediaDevice> media = createDevice(devnode);\n-\t\tif (!media) {\n-\t\t\tret = -ENODEV;\n-\t\t\tbreak;\n-\t\t}\n+\t\tif (!media)\n+\t\t\tcontinue;\n \n \t\tif (populateMediaDevice(media) < 0) {\n-\t\t\tret = -ENODEV;\n-\t\t\tbreak;\n+\t\t\tLOG(DeviceEnumerator, Warning)\n+\t\t\t\t<< \"Failed to populate media device \"\n+\t\t\t\t<< media->deviceNode()\n+\t\t\t\t<< \" (\" << media->driver() << \"), skipping\";\n+\t\t\tcontinue;\n \t\t}\n \n \t\taddDevice(media);\n@@ -89,7 +89,7 @@ int DeviceEnumeratorSysfs::enumerate()\n \n \tclosedir(dir);\n \n-\treturn ret;\n+\treturn 0;\n }\n \n int DeviceEnumeratorSysfs::populateMediaDevice(const std::shared_ptr<MediaDevice> &media)\ndiff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp\nindex b2c5fd221dcd..87638c59761c 100644\n--- a/src/libcamera/device_enumerator_udev.cpp\n+++ b/src/libcamera/device_enumerator_udev.cpp\n@@ -82,8 +82,15 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev)\n \t\t\treturn -ENODEV;\n \n \t\tint ret = populateMediaDevice(media);\n-\t\tif (ret == 0)\n-\t\t\taddDevice(media);\n+\t\tif (ret < 0) {\n+\t\t\tLOG(DeviceEnumerator, Warning)\n+\t\t\t\t<< \"Failed to populate media device \"\n+\t\t\t\t<< media->deviceNode()\n+\t\t\t\t<< \" (\" << media->driver() << \"), skipping\";\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\taddDevice(media);\n \t\treturn 0;\n \t}\n \n@@ -141,14 +148,18 @@ int DeviceEnumeratorUdev::enumerate()\n \t\tdevnode = udev_device_get_devnode(dev);\n \t\tif (!devnode) {\n \t\t\tudev_device_unref(dev);\n-\t\t\tret = -ENODEV;\n-\t\t\tgoto done;\n+\t\t\tLOG(DeviceEnumerator, Warning)\n+\t\t\t\t<< \"Failed to get device node for '\"\n+\t\t\t\t<< syspath << \"', skipping\";\n+\t\t\tcontinue;\n \t\t}\n \n-\t\tret = addUdevDevice(dev);\n+\t\tif (addUdevDevice(dev) < 0)\n+\t\t\tLOG(DeviceEnumerator, Warning)\n+\t\t\t\t<< \"Failed to add device for '\"\n+\t\t\t\t<< syspath << \"', skipping\";\n+\n \t\tudev_device_unref(dev);\n-\t\tif (ret < 0)\n-\t\t\tbreak;\n \t}\n \n done:\n",
    "prefixes": [
        "libcamera-devel",
        "v2"
    ]
}