文档章节

ocfs2_inode_lock_full_nested()

认真即可
 认真即可
发布于 2015/11/26 16:03
字数 703
阅读 97
收藏 0

从ftrace来看,不出意外,最耗时间的果然是__ocfs2_cluster_lock()

 0)               |  ocfs2_inode_lock_full_nested() {
 0)   0.000 us    |    ocfs2_wait_for_recovery();
 0) ! 12026.56 us |    __ocfs2_cluster_lock();
 0)   0.000 us    |    ocfs2_wait_for_recovery();
 0)   0.000 us    |    ocfs2_inode_lock_update();
 0) ! 12026.56 us |  }
 0)   0.000 us    |  ocfs2_inode_unlock();

同样,简单过下这个函数:

2272 /*     
2273  * returns < 0 error if the callback will never be called, otherwise
2274  * the result of the lock will be communicated via the callback.
2275  */    
2276 int ocfs2_inode_lock_full_nested(struct inode *inode,
2277                                  struct buffer_head **ret_bh,
2278                                  int ex,
2279                                  int arg_flags,
2280                                  int subclass)
2281 {   
//arg_flags=0, subclass=IO_LS_NORMAL   
2282         int status, level, acquired;
2283         u32 dlm_flags;
2284         struct ocfs2_lock_res *lockres = NULL;
2285         struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2286         struct buffer_head *local_bh = NULL;
2287 
2288         BUG_ON(!inode);
2289 
//从这个log message来看,inode lock也是META lock,那么问题来了有相应的address_space lock吗?
//我推测应该没有,因为节点间共享的是inode,至于page cache节点间是独立的。
2290         mlog(0, "inode %llu, take %s META lock\n",
2291              (unsigned long long)OCFS2_I(inode)->ip_blkno,
2292              ex ? "EXMODE" : "PRMODE");
2293        
2294         status = 0;
2295         acquired = 0;
2296         /* We'll allow faking a readonly metadata lock for
2297          * rodevices. */
2298         if (ocfs2_is_hard_readonly(osb)) {
2299                 if (ex)
2300                         status = -EROFS;
2301                 goto bail;
2302         }
2303 
2304         if (ocfs2_mount_local(osb))
2305                 goto local;
2306       
//就是说从这儿到local,是cluster特有的处理! arg_flags传入时等于0,if必成立
2307         if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
2308                 ocfs2_wait_for_recovery(osb);
2309 
//->ip_inode_lockres应该就是META lock, ->ip_rw_lockres就是读写,即数据锁吧
2310         lockres = &OCFS2_I(inode)->ip_inode_lockres;
//level=EX
2311         level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
2312         dlm_flags = 0;
2313         if (arg_flags & OCFS2_META_LOCK_NOQUEUE)
2314                 dlm_flags |= DLM_LKF_NOQUEUE;
2315 
//dlm_flags=0, args_flags=0, 
2316         status = __ocfs2_cluster_lock(osb, lockres, level, dlm_flags,
2317                                       arg_flags, subclass, _RET_IP_);
2318         if (status < 0) {          
2319                 if (status != -EAGAIN && status != -EIOCBRETRY)
2320                         mlog_errno(status);
2321                 goto bail;
2322         }
2323        
2324         /* Notify the error cleanup path to drop the cluster lock. */
2325         acquired = 1;
2326 
2327         /* We wait twice because a node may have died while we were in
2328          * the lower dlm layers. The second time though, we've
2329          * committed to owning this lock so we don't allow signals to
2330          * abort the operation. */ 
2331         if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
2332                 ocfs2_wait_for_recovery(osb);
2333 
2334 local:                         
2335         /*
2336          * We only see this flag if we're being called from
2337          * ocfs2_read_locked_inode(). It means we're locking an inode
2338          * which hasn't been populated yet, so clear the refresh flag
2339          * and let the caller handle it.
2340          */                   
2341         if (inode->i_state & I_NEW) {
2342                 status = 0;  
//不能被ftrace?    
2343                 if (lockres)     
2344                         ocfs2_complete_lock_res_refresh(lockres, 0);
2345                 goto bail;
2346         }
2347 
2348         /* This is fun. The caller may want a bh back, or it may
2349          * not. ocfs2_inode_lock_update definitely wants one in, but
2350          * may or may not read one, depending on what's in the
2351          * LVB. The result of all of this is that we've *only* gone to
2352          * disk if we have to, so the complexity is worthwhile. */
//在inode被锁住的情况下, 先抛弃已缓存的inode元数据, 然后再调用ocfs2_refresh_inode_from_lvb更新inode一些关键字段;
//据说lvb是通过网络数据传输来更新的
2353         status = ocfs2_inode_lock_update(inode, &local_bh);
2354         if (status < 0) {
2355                 if (status != -ENOENT) 
2356                         mlog_errno(status);
2357                 goto bail;
2358         }               
2359                         
2360         if (ret_bh) {
2361                 status = ocfs2_assign_bh(inode, ret_bh, local_bh);
2362                 if (status < 0) {
2363                         mlog_errno(status);
2364                         goto bail;
2365                 }
2366         }
2367 
2368 bail:
2369         if (status < 0) {
2370                 if (ret_bh && (*ret_bh)) {
2371                         brelse(*ret_bh);
2372                         *ret_bh = NULL;
2373                 }
2374                 if (acquired)
2375                         ocfs2_inode_unlock(inode, ex);
2376         }
2377 
2378         if (local_bh)
2379                 brelse(local_bh);
2380 
2381         return status;
2382 }





© 著作权归作者所有

上一篇: __ocfs2_cluster_lock()
下一篇: ocfs2_write_begin()
认真即可
粉丝 6
博文 103
码字总数 47780
作品 0
朝阳
程序员
私信 提问
ocfs2_write_begin()

从ftrace看到,时间基本消耗在ocfs2inodelockfullnested()函数中。 3) | ocfs2writebegin() { 3) ! 11815.92 us | ocfs2inodelockfullnested(); 1) 0.101 us | down_write(); 1) 0.125 us | ......

认真即可
2015/11/26
46
0
A look inside gfs2

Intro GFS2 and OCFS2 are 2 cluster filesystems in linux kernel. We also support GFS2, though most of our customers use OCFS2 as we recommend. Last hackweek, from a user perspect......

认真即可
2016/06/28
31
0
ocfs2: 创建一个新文件

vfs层 open(O_CREATE) sys_open()系统服务例程是这样的: dosysopen getname(filename) getunusedfd_flags(flags) dofilpopen set_nameidata path_openat getemptyfilp path_init while(lin......

认真即可
2016/06/26
57
0
Use crash to show the code line of a backtrace entry like "ocfs2_truncate_file+0x127/0x6c0"

Problem I am debugging a hung issue of ocfs2 (a cluster filesystem in linux kernel). This hung is caused by a ocfs2 testcase named "mmap_truncate". Naturally, I show the status ......

认真即可
2016/09/01
20
0
DLM - stackglue 层

主要数据结 ocfs2stackplugin 每个stack plugin,即o2cb或pacemaker,必须实例化一个该结构体。 2. ocfs2stackoperations 和ocfs2stackplugin一样,stack plugin必须实例化一个栈操作集。该结...

认真即可
2015/11/02
31
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员大数据教程分享Scala系列之模式匹配和样例类

好程序员大数据教程分享Scala系列之模式匹配和样例类 1.样例类 在Scala中样例类是一中特殊的类,样例类是不可变的, 可以通过值进行比较,可用于模式匹配。 定义一个样例类: 构造器中每一个...

好程序员官网
28分钟前
4
0
让nginx上的静态网页在访问的时候没有html后缀

需求背景: 公司产品小姐姐觉得这个访问带html后缀不专业,要求访问不带html后缀 nginx 配置 #原配置 location / { index index.html index.htm index.php; try_files $...

Linux_Anna
29分钟前
4
0
beetl的内置函数

函数调用Beetl内置函数请参考附录,以下列出了常用的函数date 返回一个java.util.Date类型的变量,如 date() 返回一个当前时间(对应java的java.util.Date); ${date( "2011-1-1" , "yy...

gantaos
30分钟前
4
0
spring cloud 2.x版本 Gateway自定义过滤器教程

前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 [toc] 本文基于前两篇文章eureka-server、eureka-client、eureka-ribbon、eureka-feign和spring-gataway的实现。 参考......

毛毛向前冲V5
33分钟前
4
0
VPGAME 的 Kubernetes 迁移实践

作者 | 伍冲斌 VPGAME 运维开发工程师 导读:VPGAME 是集赛事运营、媒体资讯、大数据分析、玩家社群、游戏周边等为一体的综合电竞服务平台。总部位于中国杭州,在上海和美国西雅图分别设立了...

阿里巴巴云原生
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部