Monthly Archives: March 2012

ext3/4的data journalling和direct I/O

ext3和ext4有3种日志模式,分别是journal, ordered(default), writeback,可以在mount的时候用 -o data=指定

journal: All data is committed into the journal prior to being written into the main filesystem.
ordered: All data is forced directly out to the main file system prior to its metadata being committed to the journal.
writeback: Data ordering is not preserved.

另外,如果想在没用 -o data=journal的情况下也做data journalling,还可以使用chattr(1)来更改某个文件的属性,比如

chattr +j testfile

用lsattr testfile就能看到属性已经更改,具体都有什么属性可以man chattr。

这几天遇到一个问题,就是当使用 -o data=journal或者给某个文件增加j属性之后,ext3上的文件就不能使用direct I/O了,具体点说就是open(2)的时候只要带O_DIRECT,open(2)就会返回EINVAL,而在ext4上则没问题。

经过搜索发现,ext3和ext4其实是都不支持在data jouralling情况下的direct I/O的。可以看open(2)的代码,在 __dentry_open()函数里有一段代码做了判断

fs/open.c
 706         /* NB: we're sure to have correct a_ops only after f_op->open */
 707         if (f->f_flags & O_DIRECT) {
 708                 if (!f->f_mapping->a_ops ||
 709                     ((!f->f_mapping->a_ops->direct_IO) &&
 710                     (!f->f_mapping->a_ops->get_xip_mem))) {
 711                         fput(f);
 712                         f = ERR_PTR(-EINVAL);
 713                 }
 714         }

如果有O_DIRECT标志,那么检查相应的a_ops(struct address_space_operations)中的direct_IO方法。ext3在data journalling模式下没有设置direct_IO这个方法,所以就返回了EINVAL。可以看ext3相应的代码(给每一种日志模式都设置了不同的aops)

fs/ext3/inode.c
2007 static const struct address_space_operations ext3_journalled_aops = {         
2008         .readpage               = ext3_readpage,                              
2009         .readpages              = ext3_readpages,                             
2010         .writepage              = ext3_journalled_writepage,                  
2011         .write_begin            = ext3_write_begin,                           
2012         .write_end              = ext3_journalled_write_end,                  
2013         .set_page_dirty         = ext3_journalled_set_page_dirty,             
2014         .bmap                   = ext3_bmap,                                  
2015         .invalidatepage         = ext3_invalidatepage,                        
2016         .releasepage            = ext3_releasepage,                           
2017         .is_partially_uptodate  = block_is_partially_uptodate,                
2018         .error_remove_page      = generic_error_remove_page,                  
2019 };

相应的,ext4的ext4_journalled_aops中设置了 .direct_IO = ext4_direct_IO,所以ext4看似可以用direct I/O。可是再看一下ext4_direct_IO()这个函数

fs/ext4/inode.c
2991         /*
2992          * If we are doing data journalling we don't support O_DIRECT
2993          */
2994         if (ext4_should_journal_data(inode))
2995                 return 0;

也就是如果判断是data journalling模式,ext4_direct_IO()直接返回0,表示写了0个字节。看 mm/filemap.c中的 __generic_file_aio_write()可以知道,->direct_IO返回0之后会用generic_file_buffered_write()写入剩余的字节(对dio来说也就是全部字节了)。所以ext4其实是fall back到了buffer I/O去了,实际上不是direct I/O,只不过没有显式的报错。

处在低谷的思考

(再次使用misc这个分类,记录一些“说了矫情,不说憋屈”的感受)

近来实实在在处于一个小低谷,好像已经很久没这么消沉过了。可能是上班以来过的日子都还不错吧。

现在压力大增。首先已经不是刚从学校里走出来的雏鸟了(虽然还处于菜鸟阶段),已经需要自己负责一摊子事情了,那么这摊子事情自己就要负起完全的责任,责任重了压力自然增加。其次最近事情比较多,6.3和7要兼顾,local fs和nfs要兼顾,事情多了压力也大了。下班回家后还有其他事情等着我做。

其实压力大还是次要的,最让我感到郁闷/挫败的是,明明付出了很多努力,却收不到预期的效果,没有进步。最近研究nfs就让我非常头疼,感觉自己懂的太少,这两天想看看ext4的代码,就更加深了对自己的这种感觉,一种深深的挫败感。昨天又有人(还好是公司里的,自己人)报过来一个regression bug,让BOSS很是紧张,虽然要测出每一个bug是不可能的,但这也不能作为为自己辩护的借口。总之是做的还不够好,又多了一件要做的事情。但我又是这么贱,越是困难的情况越想强迫自己把各种事情都做好(因为我知道冲过的每一个障碍都会有收获,虽然过程痛苦,但结果很美好),自己又给自己增加了不少压力。

一连串的“打击”让我有点“招架不住”,我也知道这其实不算什么大事,工作中会碰到的最平常的事情了,坚持一下,挺一挺就过去了。可是也不得不让我进行一些必要的反思。

为什么我会有这么强烈的挫败感,甚至自卑。今天偶尔翻到以前的一篇校内日志,是一个性格测试的结果,摘录一下

基本恐惧:无助,无能,无知
基本欲望:能干,知识丰富
对自己要求:当我成为某一方面的专家时,我就 okay 了。

现在看这个测试还是挺准确的,这确实就是我所追求的。自己的无知让我感到很恐惧。要想成为某方面专家,少不了学习,但现在要纠正的一点是,要有选择的学习。精力是有限的,面广了就不深入,尤其是我这种智商还不太高的人。那么要解决这种挫败感,唯一的方法就是继续学习了……还要坚持下来,要相信“没有预期的效果”是暂时的,自己基础不好只能一点一点补,用比别人更多的精力,谁让自己笨呢。

如何控制自己的情绪。情绪是不太容易控制的,不过既然知道目前的情绪会被工作影响,那么安排好自己的工作,更好的完成自己的工作,就必然会让情绪变好。当然,这需要付出不小的努力,过程也会比较痛苦。但这些痛苦也是必要的经历,把它作为一次锻炼的机会,处理好了就是进步。另外,尽量做到不急躁,事情一样一样的来,并适当排解不良情绪。说到排解情绪,上周末去同学家喝酒,借着醉意倒倒苦水,喝的很high;今天去打篮球,好好的出了一身汗,而且打的很过瘾,情绪低落的时候投篮手感异常的好,心情好了不少。

这种处在低谷的感觉,在大学的时候经常有,不过后来觉得正是那时候的一些思考让自己更了解自己了,给自己的定位也会更准确,所以我知道这种低谷不是坏事,如果生活一直非常顺利那才值得警惕。下面这句话我觉得说的很好“所有的问题都能从自身寻找到答案,在寻找的过程中你难免会倍感挫折,心中充满怨恨,但最终你会因为有了那些不愉快的过程而把一切看得更加透彻,找到自己存在的价值和寻求的真理”。这正是我现在所经历的一种写照,希望经历过后有所收获。

其实总结起来,解决方法很简单,在认清现实的基础上做合理安排,并苦干加实干,欧了。