Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F168289829
D56541.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D56541.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D56541: ctld: convert an EEXIST in kernel port creation to an update request
Attached
Detach File
Event Timeline
Log In to Comment