Hi friends, I am trying to learn filesystems and writing a small module. Till now I am able to do simple mount,cd commands. However in order to support creating new files, I have implemented the below function. However I am stuck at few points. It would be of great help if someone can clarify. 1) When is d_instantiate needed. Is it required always ?? . As far as i understand it attaches the inode to the dentry object and may not be needed always. 2) Once I have got the new inode * by a call to new_inode, how do I fill my file system specific data.. ie... i_private member is initialised as NULL. Should I allocate memory for my inode and set i_private to it ??........ int nngfs_create(struct inode *dir, struct dentry *dentry, int mode,struct nameidata *nd){ int inum=0,ret=0; struct buffer_head *bh; struct inode *newnip; struct nngfs_inode *nino; struct super_block *sb = dir->i_sb; struct nngfs_info *nsb = (struct nngfs_info *)(sb->s_fs_info); struct nngfs_superblock *n_sb = nsb->ngfs_sb; //See if the entry already exists in the dir ret = nngfs_find_entry(dir,dentry->d_name.name); if(ret!=-1){ return ERR_PTR(-EEXIST); } //See the bitmap and get the inode number inum = Get_free_inode_number(n_sb); if(inum == -1){ printk(KERN_INFO "NGFS (%s) :Got free inode number = %d\n",__FUNCTION__,inum); return ERR_PTR(-ENOSPC); } //Allocate the new inode newnip = new_inode(sb); if(!newnip){ printk(KERN_INFO "NGFS (%s) :Could not allocate free inode\n",__FUNCTION__); return ERR_PTR(-ENOSPC); } newnip->i_ino = inum; //Add the name information to dir entry if(nngfs_dir_add(dir,inum,dentry->d_name.name)){ printk(KERN_INFO "NGFS (%s) :Could not allocate free inode\n",__FUNCTION__); return ERR_PTR(-EMFILE); } bh = (struct buffer_head *)(nsb->sbh); n_sb->inode_bitmap=setbit(n_sb->inode_bitmap,inum); newnip->i_ino = inum; dir->i_nlink++; newnip->i_mode = NNGFS_FILE; newnip->i_atime = newnip->i_mtime = newnip->i_ctime = CURRENT_TIME; newnip->i_uid = dir->i_uid; newnip->i_gid = dir->i_gid; /* Stuck below this point. Not sure what to do */ d_instantiate(dir,newnip); nino = (struct nngfs_inode *)newnip->i_private; #ifdef DEBUG printk(KERN_CRIT "NGFS (%s)(%d) : Going to reference .... [%p] ",__FUNCTION__,__LINE__,nino); #endif nino->filetype = NNGFS_FILE; #ifdef DEBUG printk(KERN_CRIT "NGFS (%s)(%d) : Seems referencing is ok .... ",__FUNCTION__,__LINE__); #endif nino->atime = nino->mtime = nino->ctime = CURRENT_TIME; nino->uid = dir->i_uid; nino->gid = dir->i_gid; sb->s_dirt=1; mark_buffer_dirty(bh); //Write the new bitmap to disk mark_inode_dirty(newnip); mark_inode_dirty(dir); return 0; } Note that i am writing this only for learning, so not much concerned about other details like atomicity and race conditions etc. at this point. Also I am not using any caches for my inode allocation. Appreciate any help/suggestions. -- Thanks & Regards, ******************************************** Manish Katiyar ( http://mkatiyar.googlepages.com ) 3rd Floor, Fair Winds Block EGL Software Park Off Intermediate Ring Road Bangalore 560071, India *********************************************** -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ