<div dir="ltr">Hi,<br><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 13, 2014 at 12:14 PM, Abhijit Chandrakant Pawar <span dir="ltr">&lt;<a href="mailto:abhi.c.pawar@gmail.com" target="_blank">abhi.c.pawar@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<div class=""><br>
On Thursday 13 February 2014 07:40 AM, freeman wrote:<br>
&gt; Hi list,<br>
&gt;<br>
&gt; I am a newbie in linux kernel programming. Recently I got stuck in a<br>
&gt; problem when doing<br>
&gt; practice in file system programming. I hope this list is the right place<br>
&gt; I can turn to.<br>
&gt;<br>
&gt; I want to replace some file operations of files in a certain<br>
&gt; directory,so that data can be<br>
&gt; decrypted/encrypted through read/write system call. So I:<br>
&gt;<br>
&gt; #1: Find the directory inode, save its original inode operation<br>
&gt; table,then replace<br>
&gt; the table:<br>
&gt;<br>
&gt; kern_path(pathname, LOOKUP_FOLLOW, &amp;target_dir_path);<br>
&gt; lower_iops = target_dir_path.dentry-&gt;d_inode-&gt;i_op;<br>
&gt; target_dir_path.dentry-&gt;d_inode-&gt;i_op = &amp;my_iops;<br>
&gt;<br>
</div>I assume that you are writing your own stackable filesystem.<br>
Take a look at WRAPFS[1] and ecryptfs[2]. As a matter of fact, ecryptfs<br>
does what you are expecting.<br>
<br>
To do this, you need to set your superblock operations for the lower<br>
directory inode so the VFS use your filesystem instead of the original<br>
filesystem.<br>
Important steps to look are:<br>
1. get lower superblock from the lower directory inode<br>
2. assign this superblock as an overlay for your own superblock.<br>
3. Set your own superblock operations for the new superblock<br>
4. get a root inode for your superblock using the lower directory inode<br>
5. While you are getting the inode, you can set the file operations on<br>
this inode which will help you achieve your case.<br>
<br>
The point to note that you need to interpose the inodes with VFS so that<br>
everything would be routed to your filesystem.<br>
<br>
--<br>
Abhijit.<br>
[1]<a href="http://wrapfs.filesystems.org/" target="_blank">http://wrapfs.filesystems.org/</a><br>
[2]<a href="http://ecryptfs.org/" target="_blank">http://ecryptfs.org/</a><br>
<div class="HOEnZb"><div class="h5"><br>
<br>
&gt; #2: In my_iops, I mainly changed &quot;.lookup&quot; function like this to achive<br>
&gt; my goal --<br>
&gt; replace the file operation table of all files in the directory.<br>
&gt;<br>
&gt; static struct dentry *my_inode_lookup(struct inode *dir, struct dentry<br>
&gt; *dentry,<br>
&gt; struct nameidata *nd)<br>
&gt; {<br>
&gt; struct dentry *ret_dentry;<br>
&gt;<br>
&gt; ret_dentry = lower_iops-&gt;lookup(dir,dentry,nd);<br>
&gt; if (!ret_dentry)<br>
&gt; goto out;<br>
&gt; ret_dentry-&gt;d_inode-&gt;i_fop = &amp;my_fops;<br>
&gt; out:<br>
&gt; return ret_dentry;<br>
&gt; }<br>
&gt;<br>
&gt; Things turns out that replacement of inode operation table of directory<br>
&gt; is successful<br>
&gt; but the changes in file operations are not functional: system works as<br>
&gt; it used to,<br>
&gt; totally ignore my_fops!<br>
&gt;<br>
&gt; I have no idea how to fix it. Can anybody help?<br>
&gt; Thanks for your attention!<br>
&gt; Regards<br>
&gt;<br>
&gt; Freeman Zhang<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Kernelnewbies mailing list<br>
&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt;<br>
<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</div></div></blockquote></div><br><br></div><div class="gmail_extra">Freeman - What you are doing seems to be correct - you may have missed some pointer some where.<br><br></div><div class="gmail_extra">Which file system are you using, are you writing a layer on an existing file system or changing the code of a file system<br>

</div><div class="gmail_extra"><br></div><div class="gmail_extra">Try adding some debug messages whenever you change the operations which prints the dentry-&gt;name of the file, you will get an idea that the correct file&#39;s operations are getting modified.<br>

</div><div class="gmail_extra"><br clear="all"><br>-- <br>Regards,<br>Rishi Agrawal<br>
</div></div></div>