Page MenuHomeFreeBSD

D56541.diff
No OneTemporary

D56541.diff

diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh
--- a/usr.sbin/ctld/ctld.hh
+++ b/usr.sbin/ctld/ctld.hh
@@ -273,11 +273,11 @@
virtual void clear_references();
- bool kernel_add();
+ int kernel_add();
bool kernel_update(const port *oport);
bool kernel_remove();
- virtual bool kernel_create_port() = 0;
+ virtual int kernel_create_port() = 0;
virtual bool kernel_remove_port() = 0;
protected:
@@ -312,7 +312,7 @@
port(target), p_ioctl_pp(pp), p_ioctl_vp(vp) {}
~ioctl_port() override = default;
- bool kernel_create_port() override;
+ int kernel_create_port() override;
bool kernel_remove_port() override;
private:
@@ -325,7 +325,7 @@
port(target), p_pport(pp) {}
~kernel_port() override = default;
- bool kernel_create_port() override;
+ int kernel_create_port() override;
bool kernel_remove_port() override;
private:
@@ -616,7 +616,7 @@
void kernel_receive(struct pdu *pdu);
#endif
-bool ctl_create_port(const char *driver,
+int ctl_create_port(const char *driver,
const nvlist_t *nvl, uint32_t *ctl_port);
bool ctl_remove_port(const char *driver, nvlist_t *nvl);
diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc
--- a/usr.sbin/ctld/ctld.cc
+++ b/usr.sbin/ctld/ctld.cc
@@ -2146,8 +2146,19 @@
const auto oldit = oldconf->conf_ports.find(name);
if (oldit == oldconf->conf_ports.end() ||
oldit->second->is_dummy()) {
+ int error;
+
log_debugx("adding port \"%s\"", name.c_str());
- if (!newport->kernel_add()) {
+ error = newport->kernel_add();
+ if (error != 0 && errno == EEXIST) {
+ log_debugx("attempting to update existing port \"%s\"",
+ name.c_str());
+ error =
+ newport->kernel_update(oldit->second.get()) ?
+ 0 : -1;
+ }
+
+ if (error != 0) {
log_warnx("failed to add port %s",
name.c_str());
diff --git a/usr.sbin/ctld/iscsi.cc b/usr.sbin/ctld/iscsi.cc
--- a/usr.sbin/ctld/iscsi.cc
+++ b/usr.sbin/ctld/iscsi.cc
@@ -94,7 +94,7 @@
uint32_t ctl_port) :
portal_group_port(target, pg, ctl_port) {}
- bool kernel_create_port() override;
+ int kernel_create_port() override;
bool kernel_remove_port() override;
private:
@@ -251,7 +251,7 @@
module_loaded = true;
}
-bool
+int
iscsi_port::kernel_create_port()
{
struct portal_group *pg = p_portal_group;
diff --git a/usr.sbin/ctld/kernel.cc b/usr.sbin/ctld/kernel.cc
--- a/usr.sbin/ctld/kernel.cc
+++ b/usr.sbin/ctld/kernel.cc
@@ -763,7 +763,7 @@
return (true);
}
-bool
+int
ctl_create_port(const char *driver, const nvlist_t *nvl, uint32_t *ctl_port)
{
struct ctl_req req;
@@ -777,7 +777,7 @@
req.args = nvlist_pack(nvl, &req.args_len);
if (req.args == NULL) {
log_warn("error packing nvlist");
- return (false);
+ return (-1);
}
req.result = result_buf;
@@ -787,31 +787,33 @@
if (error != 0) {
log_warn("error issuing CTL_PORT_REQ ioctl");
- return (false);
+ return (-1);
}
if (req.status == CTL_LUN_ERROR || req.status == CTL_LUN_ERROR_EXISTS) {
log_warnx("error returned from port creation request: %s",
req.error_str);
- return (false);
+ errno = req.status == CTL_LUN_ERROR_EXISTS ? EEXIST : EINVAL;
+ return (-1);
}
if (req.status != CTL_LUN_OK) {
log_warnx("unknown port creation request status %d",
req.status);
- return (false);
+ errno = EINVAL;
+ return (-1);
}
freebsd::nvlist_up result_nvl(nvlist_unpack(result_buf, req.result_len,
0));
if (result_nvl == NULL) {
log_warnx("error unpacking result nvlist");
- return (false);
+ return (-1);
}
*ctl_port = nvlist_get_number(result_nvl.get(), "port_id");
- return (true);
+ return (0);
}
-bool
+int
ioctl_port::kernel_create_port()
{
freebsd::nvlist_up nvl(nvlist_create(0));
@@ -821,7 +823,7 @@
return (ctl_create_port("ioctl", nvl.get(), &p_ctl_port));
}
-bool
+int
kernel_port::kernel_create_port()
{
struct ctl_port_entry entry;
@@ -839,10 +841,10 @@
if (ioctl(ctl_fd, CTL_SET_PORT_WWNS, &entry) == -1)
log_warn("CTL_SET_PORT_WWNS ioctl failed");
}
- return (true);
+ return (0);
}
-bool
+int
port::kernel_add()
{
struct ctl_port_entry entry;
@@ -850,8 +852,8 @@
struct target *targ = p_target;
int error, i;
- if (!kernel_create_port())
- return (false);
+ if (kernel_create_port() != 0)
+ return (-1);
/* Explicitly enable mapping to block any access except allowed. */
lm.port = p_ctl_port;
@@ -879,10 +881,10 @@
error = ioctl(ctl_fd, CTL_ENABLE_PORT, &entry);
if (error != 0) {
log_warn("CTL_ENABLE_PORT ioctl failed");
- return (false);
+ return (-1);
}
- return (true);
+ return (0);
}
bool
diff --git a/usr.sbin/ctld/nvmf.cc b/usr.sbin/ctld/nvmf.cc
--- a/usr.sbin/ctld/nvmf.cc
+++ b/usr.sbin/ctld/nvmf.cc
@@ -71,7 +71,7 @@
uint32_t ctl_port) :
portal_group_port(target, pg, ctl_port) {}
- bool kernel_create_port() override;
+ int kernel_create_port() override;
bool kernel_remove_port() override;
private:
@@ -321,7 +321,7 @@
modules_loaded = true;
}
-bool
+int
nvmf_port::kernel_create_port()
{
struct portal_group *pg = p_portal_group;

File Metadata

Mime Type
text/plain
Expires
Fri, Aug 28, 10:50 AM (1 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37450171
Default Alt Text
D56541.diff (5 KB)

Event Timeline