From 4f4712d820ea2e8c49c230be87a60d984ece739a Mon Sep 17 00:00:00 2001 From: Eddie James Date: Thu, 21 Jun 2018 15:57:02 -0500 Subject: passthrough: only open /dev/occX during the operation The file handle was left open constantly, resulting in dead file handles when FSI is rescanned. Change-Id: I1ca8b330131eaad3e3672f5e8fbc3b994e8c34d6 Signed-off-by: Eddie James --- occ_pass_through.cpp | 20 +++++++++++++++++++- occ_pass_through.hpp | 3 +++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/occ_pass_through.cpp b/occ_pass_through.cpp index 4a7057b..424cc22 100644 --- a/occ_pass_through.cpp +++ b/occ_pass_through.cpp @@ -35,6 +35,12 @@ void PassThrough::openDevice() using namespace phosphor::logging; using namespace sdbusplus::org::open_power::OCC::Device::Error; + if (!occActive) + { + log("OCC is inactive; cannot perform pass-through"); + return; + } + fd = open(devicePath.c_str(), O_RDWR | O_NONBLOCK); if (fd < 0) { @@ -53,6 +59,7 @@ void PassThrough::closeDevice() if (fd >= 0) { close(fd); + fd = -1; } } @@ -63,6 +70,14 @@ std::vector PassThrough::send(std::vector command) std::vector response {}; + openDevice(); + + if (fd < 0) + { + // OCC is inactive; empty response + return response; + } + // OCC only understands [bytes] so need array of bytes. Doing this // because rest-server currently treats all int* as 32 bit integer. std::vector cmdInBytes; @@ -115,6 +130,8 @@ std::vector PassThrough::send(std::vector command) } } + closeDevice(); + return response; } @@ -131,10 +148,11 @@ void PassThrough::activeStatusEvent(sdbusplus::message::message& msg) // Extract the OccActive property if (sdbusplus::message::variant_ns::get(propertyMap->second)) { - this->openDevice(); + occActive = true; } else { + occActive = false; this->closeDevice(); } } diff --git a/occ_pass_through.hpp b/occ_pass_through.hpp index 205fc04..384a065 100644 --- a/occ_pass_through.hpp +++ b/occ_pass_through.hpp @@ -60,6 +60,9 @@ class PassThrough : public Iface */ std::string devicePath; + /** @brief Indicates whether or not the OCC is currently active */ + bool occActive = false; + /** brief file descriptor associated with occ device */ int fd = -1; -- cgit v1.2.1