Open-iscs原始碼分析之---iscsiadm.c
login處理... main(int argc, char **argv) { ...... printf("anycom: iscsiadmin.c 2332"); rc = exec_node_op(op, do_login, do_logout, do_show, do_rescan, do_stats, info_level, rec, name, value); ...... } 切換到: static int exec_node_op(int op, int do_login, int do_logout, int do_show, int do_rescan, int do_stats, int info_level, struct node_rec *rec, char *name, char *value) { .... //其它所有註冊工作都在這兒完成的。 if (login_portals(rec)) rc = -1; .... }
就是呼叫這個了.... static int login_portals(struct node_rec *pattern_rec) { .... INIT_LIST_HEAD(&rec_list); ret = for_each_rec(pattern_rec, &rec_list, link_recs); err = __login_portals(NULL, &nr_found, &rec_list, login_portal); .... }static int __login_portals(void *data, int *nr_found, struct list_head *rec_list, int (* login_fn)(void *, struct list_head *, struct node_rec *)){ struct node_rec *curr_rec, *tmp; struct list_head login_list; int ret = 0, err; *nr_found = 0; INIT_LIST_HEAD(&login_list); list_for_each_entry(curr_rec, rec_list, list) { err = login_fn(data, &login_list, curr_rec);////////////////////這裡的login_fn()就是login_portal if (err > 0 && !ret) ret = err; if (!err) (*nr_found)++; } printf("\nanycom: ---------------------------------------------------------iscsiadmin.c 682\n"); err = iscsid_login_reqs_wait(&login_list);//-========================後面是等回覆了。 if (err && !ret) ret = err; printf("\nanycom: iscsiadmin.c 687 over\n");///到這裡login就完成了,接著把rec們,都刪掉。 list_for_each_entry_safe(curr_rec, tmp, rec_list, list) { list_del(&curr_rec->list); free(curr_rec); } return ret;}
也就是呼叫的這個 static int login_portal(void *data, struct list_head *list, struct node_rec *rec) { ... ===============================轉到\usr\util.c了================================ rc = iscsid_req_by_rec_async(MGMT_IPC_SESSION_LOGIN, rec, &fd); ... } ===============================轉到\usr\util.c================================ int iscsid_req_by_rec_async(iscsiadm_cmd_e cmd, node_rec_t *rec, int *fd) { iscsiadm_req_t req; //////////////////////轉遞的引數轉變成 iscsiadm_reg_t 型別了 //新開了一個iscsiadm_reg_t // memset(&req, 0, sizeof(iscsiadm_req_t)); req.command = cmd; memcpy(&req.u.session.rec, rec, sizeof(node_rec_t)); return iscsid_request(fd, &req); }
mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req) { err = iscsid_connect(fd); .... ///用write與iscsid通訊?socket通訊 if ((err = write(*fd, req, sizeof(*req))) != sizeof(*req)) } static mgmt_ipc_err_e iscsid_connect(int *fd) { ... for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) { printf("\nanycom:util.c 146\n"); if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0) /* Connection established */ return MGMT_IPC_OK; sleep(); . ... } } 問題是在哪裡建了/dev/sdc? 在iscsid.c中int main(int argc, char *argv[])的內容: mgmt_ipc_listen(void) 480附近 開的socket。 開裝置號在 這個東西,還是相當難看懂的, 註冊了一個transport class,google上基本沒它的資料,不知道是怎麼用的。DECLARE_TRANSPORT_CLASS()了一下。 TRANSPORT_CLASS_REGISTER()了一下。 從哪裡來用它,目前還不清楚。
相關推薦
Open-iscs原始碼分析之---iscsiadm.c
login處理... main(int argc, char **argv) { ...... printf("anycom: iscsiadmin.c 2332"); rc = exec_node_op(op, do_login, do_logout,
redis原始碼分析之intset.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "intset.h" #include "zmalloc.h" #include "end
redis原始碼分析之zipmap.c
/** * 建立空zipmap * @return */ /* Create a new empty zipmap. */ unsigned char *zipmapNew(void) { unsigned char *zm = zmalloc(2
YOLO原始碼分析之data.c
darknet裡樣本的儲存是以如下形式進行排列的 flag | class_info | box_info flag為0或者1,表示有沒有物體 class_info表示類別資訊,其長度是num_class box_info表示標註資訊,其長度是5(x, y, w, h, o
Open vSwitch(OvS)原始碼分析之工作流程(flow流表查詢)
前面分析了Open vSwitch幾部分原始碼,對於Open vSwitch也有了個大概的理解,今天要分析的程式碼將是整個Open vSwitch的重中之重。整個Open vSwitch的核心程式碼在datapath檔案中;而datapath檔案中的核心程式碼又在ovs_dp_process_re
Android Wi-Fi原始碼分析之WifiService操作Wi-Fi(一):分析Wifi.c中的wifi_load_driver()函式
Wi-Fi原始碼分析之WifiService操作Wi-Fi(一) 分析Wifi.c中的wifi_load_driver()函式 int wifi_load_driver() { AL
ghostscript原始碼分析之 scan_token()函式 (詞法分析器iscan.c)
scan_token()函式很重要,ghostscript寫得比較瑣碎難懂,裡面有些有英文解釋。 我只對我關注的部分加了些中文註釋。當然不是所有的都理解了。但是功能還是清楚了的,像某些函式介面。 如果讓我寫的話,我一定比他寫得更清晰。哈哈,當然他的scan_token基本的框架 設計還是
STL原始碼分析之hash表(gnu-c++ 2.9)
1、基本概念 關於hash表的概念這裡就不再多說,hash表的變化一般都在雜湊函式和退避方法上。STL採用的是開鏈法,即每個hash桶裡面維持一個連結串列,hash函式計算出位置後,就將節點插入該位置的連結串列上,因此,底層實現為hash表的容器,迭代器的實現
HotSpot原始碼分析之C++物件的記憶體佈局
HotSpot採用了OOP-Klass模型來描述Java類和物件。OOP(Ordinary Object Pointer)指的是普通物件指標,而Klass用來描述物件的具體型別。為了更好理解這個模型,首先要介紹一下C++的記憶體物件模型和虛擬函式。 1、C++類物件的記憶體佈局 我們使用Visual Stud
Spark原始碼分析之Spark Shell(上)
https://www.cnblogs.com/xing901022/p/6412619.html 文中分析的spark版本為apache的spark-2.1.0-bin-hadoop2.7。 bin目錄結構: -rwxr-xr-x. 1 bigdata bigdata 1089 Dec
Netty 原始碼分析之拆包器的奧祕
為什麼要粘包拆包 為什麼要粘包 首先你得了解一下TCP/IP協議,在使用者資料量非常小的情況下,極端情況下,一個位元組,該TCP資料包的有效載荷非常低,傳遞100位元組的資料,需要100次TCP傳送,100次ACK,在應用及時性要求不高的情況下,將這100個有效資料拼接成一個數據包,那會縮短到一個TCP資
Android原始碼分析之為什麼在onCreate() 和 onResume() 獲取不到 View 的寬高
轉載自:https://www.jianshu.com/p/d7ab114ac1f7 先來看一段很熟悉的程式碼,可能在最開始接觸安卓的時候,大部分人都寫過的一段程式碼;即嘗試在 onCreate() 和 onResume() 方法中去獲取某個 View 的寬高資訊: 但是列印輸出後,我們會發
netty原始碼分析之服務端啟動
ServerBootstrap與Bootstrap分別是netty中服務端與客戶端的引導類,主要負責服務端與客戶端初始化、配置及啟動引導等工作,接下來我們就通過netty原始碼中的示例對ServerBootstrap與Bootstrap的原始碼進行一個簡單的分析。首先我們知道這兩個類都繼承自AbstractB
SNMP原始碼分析之(一)配置檔案部分
snmpd.conf想必不陌生。在程序啟動過程中會去讀取配置檔案中各個配置。其中幾個引數需要先知道是幹什麼的: token:配置檔案的每行的開頭,例如 group MyROGroup v1 readSec 這行token的引數是group。
【kubernetes/k8s原始碼分析】kubelet原始碼分析之cdvisor原始碼分析
資料流 UnsecuredDependencies -> run 1. cadvisor.New初始化 if kubeDeps.CAdvisorInterface == nil { imageFsInfoProvider := cadv
【kubernetes/k8s原始碼分析】kubelet原始碼分析之容器網路初始化原始碼分析
一. 網路基礎 1.1 網路名稱空間的操作 建立網路名稱空間: ip netns add 名稱空間內執行命令: ip netns exec 進入名稱空間: ip netns exec bash 1.2 bridge-nf-c
【kubernetes/k8s原始碼分析】kubelet原始碼分析之資源上報
0. 資料流 路徑: pkg/kubelet/kubelet.go Run函式() -> syncNodeStatus () -> registerWithAPIServer() ->
【kubernetes/k8s原始碼分析】kubelet原始碼分析之啟動容器
主要是呼叫runtime,這裡預設為docker 0. 資料流 NewMainKubelet(cmd/kubelet/app/server.go) -> NewKubeGenericRuntimeManager(pkg/kubelet/kuberuntime/kuberuntime
Android系統原始碼分析之-ContentProvider
距離上一次寫部落格已經半年多了,這半年發生了很多事情,也有了很多感觸,最主要是改變了忙碌了工作,更加重視身體的健康,為此也把工作地點從深圳這個一線城市換到了珠海,工作相對沒有那麼累,身體感覺也好了很多。所以在工作完成之餘,也有了更多的時間來自我學習和提高,後續會用更多時間來寫更多實用的東西,幫助我們理解
Vue 原始碼分析之proxy代理
Vue 原始碼分析之proxy代理 當我們在使用Vue進行資料設定時,通常初始化格式為: let data = { age: 12, name: 'yang' } // 例項化Vue物件 let vm = new Vue({ data })