On Oct 8, 2012, at 7:47 PM, Eddie Wai <eddie....@broadcom.com> wrote:

> For the case when iscsid is invoked for the first time after pivot root
> during iSCSI boot, the boot connection would fail to re-connect if the
> ibft/iscsi_boot sysfs entry contains tagged vlan.
> 
> The problem was caused by the lack of such info in the iscsi_session sysfs
> for sync_session to inherit from.
> 
> The proposed solution is as follows:
> 1. Utilize unique ifacename identifier for boot specific connections:
>   old iface.name for the boot connection: <transport>.<MAC>
>   new iface.name for the boot connection: <transport>.<MAC>.boot
> 
> 2. Upon sync_session, the session's ifacename will then be used to compare
>   against the MAC+'boot' ifacename as generated from the ibft/iscsi_boot
>   sysfs entries.  Upon a match, the additional params from the boot nic will
>   then get passed to the sync_session's iface record for the reconnection 
> request.
> 
> Signed-off-by: Eddie Wai <eddie....@broadcom.com>
> ---
> usr/iface.c  |    2 +-
> usr/iscsid.c |   38 +++++++++++++++++++++++++++++++++++++-
> 2 files changed, 38 insertions(+), 2 deletions(-)
> 
> diff --git a/usr/iface.c b/usr/iface.c
> index c86892e..98b1aed 100644
> --- a/usr/iface.c
> +++ b/usr/iface.c
> @@ -956,7 +956,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
>       strcpy(iface->transport_name, t->name);
> 
>       memset(iface->name, 0, sizeof(iface->name));
> -     snprintf(iface->name, sizeof(iface->name), "%s.%s",
> +     snprintf(iface->name, sizeof(iface->name), "%s.%s.boot",


This will not work for qla4xxx/be2iscsi. We actually needed to change that so 
that it matches the kernel based iface naming.


>                iface->transport_name, context->mac);
>       strlcpy(iface->hwaddress, context->mac,
>               sizeof(iface->hwaddress));
> diff --git a/usr/iscsid.c b/usr/iscsid.c
> index b4bb65b..295a29e 100644
> --- a/usr/iscsid.c
> +++ b/usr/iscsid.c
> @@ -51,6 +51,7 @@
> #include "discoveryd.h"
> #include "iscsid_req.h"
> #include "iscsi_err.h"
> +#include "fw_context.h"
> 
> /* global config info */
> struct iscsi_daemon_config daemon_config;
> @@ -186,6 +187,30 @@ setup_rec_from_negotiated_values(node_rec_t *rec, struct 
> session_info *info)
>       }
> }
> 
> +static int iscsi_match_boot(struct iface_rec *iface,
> +                         struct list_head *targets)
> +{
> +     struct boot_context *context;
> +     int rc = -ENODEV;
> +
> +     if (!iface)
> +             return rc;
> +     if (!strstr(iface->name, ".boot"))
> +             return rc;
> +
> +     /* Find the matching boot nic */
> +     list_for_each_entry(context, targets, list) {
> +             if (strstr(iface->name, context->mac)) {
> +                     iface->vlan_id = atoi(context->vlan);
> +                     strlcpy(iface->gateway, context->gateway, NI_MAXHOST);
> +                     strlcpy(iface->subnet_mask, context->mask, NI_MAXHOST);
> +                     log_debug(1, "iscsi_match_boot found\n");
> +                     return 0;
> +             }
> +     }
> +     return rc;
> +}
> +
> static int sync_session(void *data, struct session_info *info)
> {
>       node_rec_t rec, sysfsrec;
> @@ -193,6 +218,7 @@ static int sync_session(void *data, struct session_info 
> *info)
>       iscsiadm_rsp_t rsp;
>       struct iscsi_transport *t;
>       int rc, retries = 0;
> +     struct list_head *boot_targets = data;
> 
>       log_debug(7, "sync session [%d][%s,%s.%d][%s]\n", info->sid,
>                 info->targetname, info->persistent_address,
> @@ -269,6 +295,12 @@ static int sync_session(void *data, struct session_info 
> *info)
>        * app.
>        */
>       strcpy(rec.iface.iname, info->iface.iname);
> +
> +     /* In the case the session is from boot, extract the additional
> +        boot iface info */
> +     if (iscsi_match_boot(&rec.iface, boot_targets))
> +             log_debug(1, "Could not get boot entry.\n");
> +
>       memset(&req, 0, sizeof(req));
>       req.command = MGMT_IPC_SESSION_SYNC;
>       req.u.session.sid = info->sid;
> @@ -348,6 +380,7 @@ int main(int argc, char *argv[])
>       struct sigaction sa_new;
>       int control_fd;
>       pid_t pid;
> +     LIST_HEAD(boot_targets);
> 
>       while ((ch = getopt_long(argc, argv, "c:i:fd:nu:g:p:vh", long_options,
>                                &longindex)) >= 0) {
> @@ -511,7 +544,10 @@ int main(int argc, char *argv[])
>       if (pid == 0) {
>               int nr_found = 0;
>               /* child */
> -             iscsi_sysfs_for_each_session(NULL, &nr_found, sync_session);
> +             fw_get_targets(&boot_targets);
> +             iscsi_sysfs_for_each_session(&boot_targets, &nr_found,
> +                                          sync_session);

You can boot from targets that are not in fw. For example with RHEL you can 
pass in the boot info on the command line or have it passed in the dhcp root 
option. You would want to rename some of the functions/vars to reflect this is 
only for the fw booted targets.



-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-iscsi@googlegroups.com.
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/open-iscsi?hl=en.

Reply via email to