修改Linux写文件部分时的一些困惑
我想实现一个加密文件系统,需求如下:内存和缓冲区里面全部是明文,磁盘上的数据全部是密文。现在读文件部分问题已经解决了,在写文件部分遇到了一些麻烦。
对读文件的修改如下:在block_read_full_page函数中,设置缓冲区头部的b_end_io函数时,根据缓冲区头部的设备号判断是不是指定的设备,如果是,则换成指定的b_end_io函数。在这个函数里解密数据。
写文件比读文件要复杂的多。写之前会在缓冲区中查找是否被缓存,如果没有还要先读到缓冲区。而且写的过程不是立即写入,还要交给驱动,让驱动慢慢写入。我现在有两条路:
1,缓冲区在进程写完后有bdflush线程刷如设备,bdflush线程调用了write_locked_buffers函数,这个函数会设置缓冲区头部的b_end_io字段,在这里判断是不是指定的设备,如果是,则把这个换成自定义的b_end_io函数,这个函数里解密数据。可以把数据先加密,在IO完成后会自动调用b_end_io解密,以保证磁盘里面是密文。
2.新建一个缓冲区头部,并申请一块内存。新申请的缓冲区头部指向申请的内存,申请的内存里面存的是加密后的数据。将新缓冲区头部指向的数据写入设备,而老的则释放。
但上面两种方法都有缺陷,方法一在于需要多次加解密操作,太费时。方法二在于如果进程在数据还未写设备时又修改了,会不会造成不一致。而且上面两种方法还有个共同缺陷,就是不仅bdflush会将数据刷到设备,kupdate等其他内核线程也会完成同样的功能。
我想问一下达人,我究竟该怎么改。