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 物件給...