question about create function of inode_operations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux