On Thu, Apr 15, 2010 at 8:32 AM, Abhijit Pawar <abhijitcpa...@gmail.com>wrote:
> Hi List, > I am trying to learn the filesystem development and doing some study. > I have been working on a sample filesystem module and built a normal > super_operations struct. It was working on older kernel of 2.6 series till > 2.6.25 and above. I realized that there were changes made in this structure > and following fields were removed. > 1. read_inode > 2. put_inode > > I read on google but there wasnt anything specific mentioned what we need > to use instead. They also removed iget and suggested to use iget_lock. > > Can anyone please let me know what I need to do in order to compile module? > > Here is my current structure and errors. > > Structure: > > static const struct super_operations myfs_sops = { > .alloc_inode = myfs_alloc_inode, > .destroy_inode = myfs_destroy_inode, > .read_inode = myfs_read_inode, > .put_inode = myfs_put_inode, > .write_inode = myfs_write_inode, > .delete_inode = myfs_delete_inode, > .put_super = myfs_put_super, > .write_super = myfs_write_super, > .statfs = myfs_statfs, > .clear_inode = myfs_clear_inode, > }; > > > errors: > error: unknown field ‘read_inode’ specified in initializer > error: unknown field ‘put_inode’ specified in initializer > error: implicit declaration of function ‘iget’ > > > Your help would be highly appreciated. Also can you please let me know how > should I approach the filesystem development. I am currently reading Steve > D. Pate's filesystem book, but I am not very sure if it fits for current > kernel. However the book is clearing lots of concept. > Please let me know how to develop a sample filesystem. > iget and read_inode calls are deprecated now. The idea of was to merge iget() code into read_inode() to avoid duplication in filesystem code, among other benefits. You have to change myfs_read_inode decleration & definition to: Decleration : struct inode *myfs_iget(struct super_block *, unsigned long ); Definition : struct inode *myfs_iget(struct super_block *sb, unsigned long ino) { struct inode *inode; inode = iget_locked(sb, ino); if(!inode) return ERR_PTR(-ENOMEM); if(!(inode->i_state & I_NEW)) return inode; // Your implementation specific code like initializeing atime, ctime, mtime, address_space mapping etc. ( depends on what you wanna do with a new inode ) unlock_new_inode(inode); return inode; } Then, Change ".read_inode = myfs_read_inode" into ".read_inode = myfs_iget" Then, Wherever you call iget in your kernel module, replace that with myfs_iget. And make sure that you check for error values after calling myfs_iget because myfs_iget can "potentially" fail. Regards, Venkatram Tummala