Create a new routine that generically writes a string to
a sysfs file. Use that routine to interface with the kernel's
new (v3.?) ctlr_create/delete interfaces.
---
fcoemon.c | 76 ++++++++++++++++++++++++++------------------------
include/fcoe_utils.h | 16 +++++++----
lib/fcoe_utils.c | 19 +++++++++++++
3 files changed, 68 insertions(+), 43 deletions(-)
diff --git a/fcoemon.c b/fcoemon.c
index d3e1a34..d647e7d 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -2514,31 +2514,6 @@ static void fcm_cli_reply(struct sock_info *r, int
status)
r->fromlen);
}
-static enum fcoe_status fcm_fcoe_if_action(char *path, char *ifname)
-{
- FILE *fp = NULL;
- enum fcoe_status ret = EFAIL;
-
- fp = fopen(path, "w");
- if (!fp) {
- FCM_LOG_ERR(errno, "%s: Failed to open path %s\n",
- progname, path);
- goto err_out;
- }
-
- if (EOF == fputs(ifname, fp)) {
- FCM_LOG_ERR(errno, "%s: Failed to write %s to path %s.\n",
- progname, ifname, path);
- goto out;
- }
-
- ret = SUCCESS;
-out:
- fclose(fp);
-err_out:
- return ret;
-}
-
void fcm_vlan_disc_timeout(void *arg)
{
struct fcoe_port *p = arg;
@@ -2564,6 +2539,16 @@ int fcm_start_vlan_disc(struct fcoe_port *p)
return 0;
}
+static enum fcoe_status fcm_write_str_to_ctlr_attr(const char *ctlr,
+ const char *attr,
+ const char *str)
+{
+ char path[MAX_PATH_LEN];
+
+ sprintf(path, "%s/%s/%s", FCOE_DEVICES, ctlr, attr);
+ return fcm_write_str_to_sysfs_file(path, str);
+}
+
/*
*
* Input: action = 1 Destroy the FCoE interface
@@ -2580,19 +2565,36 @@ static void fcm_fcoe_action(struct fcm_netif *ff,
struct fcoe_port *p)
switch (p->action) {
case FCP_CREATE_IF:
FCM_LOG_DBG("OP: CREATE %s\n", p->ifname);
- rc = fcm_fcoe_if_action(FCOE_CREATE, ifname);
+ rc = fcm_write_str_to_sysfs_file(FCOE_CREATE, ifname);
+ if (rc) {
+ FCM_LOG_DBG("Failed to create FCoE interface "
+ "for %s, rc is %d\n", p->ifname, rc);
+ break;
+ }
+
/*
* This call validates that the interface name
* has an active fcoe session by checking for
* the fc_host in sysfs.
*/
- if (fcoe_find_fchost(ifname, p->fchost, FCHOSTBUFLEN))
+ if (fcoe_find_fchost(ifname, p->fchost, FCHOSTBUFLEN)) {
FCM_LOG_DBG("Failed to find fc_host for %s\n",
p->ifname);
- if (fcoe_find_ctlr(p->fchost, p->ctlr, FCHOSTBUFLEN))
+ break;
+ }
+ if (fcoe_find_ctlr(p->fchost, p->ctlr, FCHOSTBUFLEN)) {
FCM_LOG_DBG("Failed to get ctlr for %s\n", p->ifname);
+ break;
+ }
+
+ if (!rc)
+ rc = fcm_write_str_to_ctlr_attr(p->ctlr, FCOE_START,
"1");
+
+ else
+ fcm_write_str_to_sysfs_file(FCOE_DESTROY, ifname);
+
+ FCM_LOG_DBG("OP: create %s for fchost:%s on ctlr:%s for
%s\n",
+ (rc) ? "failed" : "succeeded", p->fchost,
p->ctlr, p->ifname);
- FCM_LOG_DBG("OP: created fchost:%s on ctlr:%s for %s\n",
- p->fchost, p->ctlr, p->ifname);
break;
case FCP_DESTROY_IF:
FCM_LOG_DBG("OP: DESTROY %s\n", p->ifname);
@@ -2609,12 +2611,12 @@ static void fcm_fcoe_action(struct fcm_netif *ff,
struct fcoe_port *p)
rc = SUCCESS;
break;
}
- rc = fcm_fcoe_if_action(FCOE_DESTROY, ifname);
+ rc = fcm_write_str_to_sysfs_file(FCOE_DESTROY, ifname);
p->fchost[0] = '\0';
break;
case FCP_ENABLE_IF:
FCM_LOG_DBG("OP: ENABLE %s\n", p->ifname);
- rc = fcm_fcoe_if_action(FCOE_ENABLE, ifname);
+ rc = fcm_write_str_to_ctlr_attr(p->ctlr, FCOE_ENABLE, "1");
break;
case FCP_DISABLE_IF:
FCM_LOG_DBG("OP: DISABLE %s\n", p->ifname);
@@ -2630,7 +2632,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct
fcoe_port *p)
}
break;
}
- rc = fcm_fcoe_if_action(FCOE_DISABLE, ifname);
+ rc = fcm_write_str_to_ctlr_attr(p->ctlr, FCOE_DISABLE, "1");
break;
case FCP_RESET_IF:
FCM_LOG_DBG("OP: RESET %s\n", p->ifname);
@@ -2642,7 +2644,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct
fcoe_port *p)
sprintf(path, "%s/%s/issue_lip", SYSFS_FCHOST, p->fchost);
FCM_LOG_DBG("OP: RESET %s\n", path);
- rc = fcm_fcoe_if_action(path, "1");
+ rc = fcm_write_str_to_sysfs_file(path, "1");
break;
case FCP_SCAN_IF:
FCM_LOG_DBG("OP: SCAN %s\n", p->ifname);
@@ -2654,7 +2656,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct
fcoe_port *p)
sprintf(path, "%s/%s/device/scsi_host/%s/scan",
SYSFS_FCHOST, p->fchost, p->fchost);
FCM_LOG_DBG("OP: SCAN %s\n", path);
- rc = fcm_fcoe_if_action(path, "- - -");
+ rc = fcm_write_str_to_sysfs_file(path, "- - -");
break;
case FCP_VLAN_DISC:
FCM_LOG_DBG("OP: VLAN DISC %s\n", p->ifname);
@@ -3443,7 +3445,7 @@ static int fcoe_check_ctlr(char *fchost, const char
*dname, int len)
char path[MAX_PATH_LEN];
int rc = -EINVAL;
- sprintf(path, "%s/%s", SYSFS_DEVICES, dname);
+ sprintf(path, "%s/%s", FCOE_DEVICES, dname);
status = n = scandir(path, &namelist, fchost_filter, alphasort);
for (n-- ; n >= 0 ; n--) {
if (rc) {
@@ -3471,7 +3473,7 @@ enum fcoe_status fcoe_find_ctlr(char *fchost, char *ctlr,
int len)
struct dirent **namelist;
int rc = ENOFCOECONN;
- status = n = scandir(SYSFS_DEVICES, &namelist, ctlr_filter, alphasort);
+ status = n = scandir(FCOE_DEVICES, &namelist, ctlr_filter, alphasort);
for (n-- ; n >= 0 ; n--) {
if (rc) {
/* check ctlr against known host */
diff --git a/include/fcoe_utils.h b/include/fcoe_utils.h
index 5f99073..da86724 100644
--- a/include/fcoe_utils.h
+++ b/include/fcoe_utils.h
@@ -38,13 +38,15 @@
#define SYSFS_MOUNT "/sys"
#define SYSFS_NET SYSFS_MOUNT "/class/net"
#define SYSFS_FCHOST SYSFS_MOUNT "/class/fc_host"
-#define SYSFS_DEVICES SYSFS_MOUNT "/bus/fcoe/devices"
-#define SYSFS_FCOE SYSFS_MOUNT "/module/libfcoe/parameters"
+#define SYSFS_FCOE SYSFS_MOUNT "/bus/fcoe"
+#define FCOE_DEVICES SYSFS_FCOE "/devices"
-#define FCOE_CREATE SYSFS_FCOE "/create"
-#define FCOE_DESTROY SYSFS_FCOE "/destroy"
-#define FCOE_ENABLE SYSFS_FCOE "/enable"
-#define FCOE_DISABLE SYSFS_FCOE "/disable"
+#define FCOE_CREATE SYSFS_FCOE "/ctlr_create"
+#define FCOE_DESTROY SYSFS_FCOE "/ctlr_destroy"
+
+#define FCOE_START "/start"
+#define FCOE_ENABLE "/enable"
+#define FCOE_DISABLE "/disable"
#define FCHOSTBUFLEN 64
@@ -84,4 +86,6 @@ int check_symbolic_name_for_interface(const char
*symbolic_name,
const char *ifname);
char *get_ifname_from_symbolic_name(const char *symbolic_name);
int fcoe_sysfs_read(char *buf, int size, const char *path);
+enum fcoe_status fcm_write_str_to_sysfs_file(const char *path, const char
*str);
+
#endif /* _FCOE_UTILS_H_ */
diff --git a/lib/fcoe_utils.c b/lib/fcoe_utils.c
index 0ebc854..27828a8 100644
--- a/lib/fcoe_utils.c
+++ b/lib/fcoe_utils.c
@@ -193,3 +193,22 @@ int check_symbolic_name_for_interface(const char
*symbolic_name,
return rc;
}
+
+enum fcoe_status fcm_write_str_to_sysfs_file(const char *path, const char *str)
+{
+ FILE *fp = NULL;
+ enum fcoe_status ret = EFAIL;
+
+ fp = fopen(path, "w");
+ if (!fp)
+ goto err_out;
+
+ if (EOF == fputs(str, fp))
+ goto out;
+
+ ret = SUCCESS;
+out:
+ fclose(fp);
+err_out:
+ return ret;
+}
_______________________________________________
devel mailing list
[email protected]
https://lists.open-fcoe.org/mailman/listinfo/devel