fuse呼叫流程有待整理

2021-06-08 13:27:00 字數 2291 閱讀 9410

fuse處理請求的整個流程如下圖所示,以unlink操作為例進行說明。其中「>」表示呼叫,」

fuse通過fuse_session_loop(或對應多執行緒的方法)來啟動fuse守護程式,守護程式不斷的從/dev/fuse上讀取請求,並處理。

**片段1

int fuse_session_loop(struct fuse_session *se)//

在fuse_main中會被呼叫,或其多執行緒版本

//fuse daemon, loops

while (!fuse_session_exited(se))

free(buf);

fuse_session_reset(se);

return res < 0 ? -1 : 0;

}//**片段2

int fuse_chan_recv(struct fuse_chan **chp, char *buf, size_t size)

#define min_bufsize 0x21000

struct fuse_chan *fuse_kern_chan_new(int fd);//

設定bufsize大小

size_t bufsize = getpagesize() + 0x1000;

bufsize = bufsize < min_bufsize ? min_bufsize : bufsize;

return fuse_chan_new(&op, fd, bufsize, null);

}**片段3

static int fuse_kern_chan_receive(struct fuse_chan **chp, char *buf,

size_t size)

以上的分析對應了fuse filesystem daemon做的第一部分工作。當使用者從控制台輸入"rm /mnt/fuse/file"時,通過vfs(sys_unlink),再到fuse(dir.c中實現的inode_operations,file.c中實現的file_operations中的方法都會最終呼叫request_send,後面會介紹),這個請求最終被發到了/dev/fuse中,該請求的到達會喚醒正在等待的fuse守護程式,fuse守護程式讀取該請求並進行處理,接下來介紹處理請求所作的工作。

**片段4

struct fuse_session *fuse_lowlevel_new_common(struct fuse_args *args,

const struct fuse_lowlevel_ops *op,

size_t op_size, void *userdata)

;…….

}**片段5              

static void fuse_ll_process(void *data, const char *buf, size_t len,

struct fuse_chan *ch)

req->f = f;

req->unique = in->unique;

……//

根據opcode呼叫fuse_ll_ops中相應的方法,fuse_ll_ops的介紹

fuse_ll_ops[in->opcode].func(req, in->nodeid, inarg);}}

以上**對應中流程中perform unlink的工作,實際上就是執行開發者實現的一組方法來完成相關的工作,接下來就是把執行完請求後需要的資料返回,最終是通過send_reply實現的.

**片段6

static int send_reply(fuse_req_t req, int error, const void *arg,

size_t argsize)

return send_reply_iov(req, error, iov, count); }

static int send_reply_iov(fuse_req_t req, int error, struct iovec *iov,

int count)

static int fuse_kern_chan_send(struct fuse_chan *ch, const struct iovec iov,

size_t count)

另外fuse接收到vfs的請求時,通過request_send將請求傳送到/fuse/dev,並呼叫request_wait_answer等待返回結果。

**片段7

void request_send(struct fuse_conn *fc, struct fuse_req *req)

spin_unlock(&fc->lock);

}  

雜記箱 有待整理

初始話之一 檢視通過org id進行資料遮蔽時,須在同乙個sql視窗進行賦值給client info responsibility id,作用 在資料庫的會話中設定全域性變數,和使用者概要資訊。引數獲得 引數一,使用者id select user id from fnd user where use...

測試流程整理

梳理整個測試流程,從管理的角度去分析每個環節的耗時 要做的事情,方便在專案初期做到整個測試流程的人力分配 時間分配,做到臨危不亂。1 用例數估算 前期的用例數估計準確與否,會影響到後面的測試設計環節 執行環節和版本結束的分析環節。2 版本bug估算 這個需要會影響到後面執行環節裡面的bug回歸消耗人...

springmvc呼叫流程

1 客戶端發出乙個http請求給web伺服器,web伺服器對http請求進行解析,如果匹配dispatcherservlet的請求對映路徑 在web.xml中指定 web容器將請求轉交給dispatcherservlet.5 handler對資料處理完成以後將返回乙個modelandview 物件給...