Re: Question about destroy_inode

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

 



Hi,

Finally I could figure out the problem. write_inode was not getting
called because I had a call to inode_inc_link_count() in my create
function. Once I remove it the function gets called and the changes
done are also reflected on the disk.

But the question is why is this call affecting the behaviour. All I
can see in this function is that it is incrementing the link count of
the vfs inode and marking it as dirty and so I see no reason to change
the behaviour.

Gurus any help/pointers appreciated. Thanks in advance

On Jan 26, 2008 12:47 AM, Manish Katiyar <mkatiyar@xxxxxxxxx> wrote:
> Hi,
>
> I am writing a small filesystem module in which currently I am trying
> to implement "touch". I am able to allocate a new inode and fill the
> proper information and mark the inode as dirty so that it can be
> written back to disk. However before write_inode is called,
> destroy_inode is getting called for the same inode number and hence it
> is not getting reflected on disk. The stack trace looks like below. I
> am not able to understand from where sys_close is getting called or
> what might be causing this function to get called.
>
> (gdb) bt
> #0  destroy_inode (inode=0x273d3c00) at fs/inode.c:172
> #1  0x080b6551 in generic_forget_inode (inode=0x273d3c00) at fs/inode.c:1080
> #2  0x080b6575 in generic_drop_inode (inode=0x9006ab8) at fs/inode.c:1093
> #3  0x080b65fd in iput (inode=0x273d3c00) at fs/inode.c:1116
> #4  0x080b3cc5 in dentry_iput (dentry=0x26281c70) at fs/dcache.c:116
> #5  0x080b3cfd in d_kill (dentry=0x26281c70) at fs/dcache.c:139
> #6  0x080b3de9 in dput (dentry=0x26281c70) at fs/dcache.c:221
> #7  0x080a6a29 in __fput (file=0x83625a0) at fs/file_table.c:181
> #8  0x080a6918 in fput (file=0x273d3d14) at fs/file_table.c:144
> #9  0x080a556a in filp_close (filp=0x83625a0, id=0x82a17d8) at fs/open.c:1106
> #10 0x080a55d6 in sys_close (fd=0) at fs/open.c:1135
> #11 0x0805939a in handle_syscall (r=0x82508f4) at
> arch/um/kernel/skas/syscall.c:38
> #12 0x0806584a in handle_trap (pid=15670, regs=0x82508f4,
> local_using_sysemu=2) at arch/um/os-Linux/skas/process.c:173
> #13 0x08065c41 in userspace (regs=0x82508f4) at
> arch/um/os-Linux/skas/process.c:330
> #14 0x08059145 in fork_handler () at arch/um/kernel/skas/process.c:96
> #15 0x1f38a045 in ?? ()
>
> Below is my create function. I am using all this in UML environment.
>
> #define NNGFS_I(ptr) container_of(ptr,struct nngfs_inode_info,vino)
>
> 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){
>          return ERR_PTR(-ENOSPC);
>        }
>
>        //Allocate the new inode
>        newnip = new_inode(sb);
>        if(!newnip){
>           return ERR_PTR(-ENOSPC);
>        }
>
>        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_atime = newnip->i_mtime = newnip->i_ctime = CURRENT_TIME_SEC;
>        newnip->i_uid = dir->i_uid;
>        newnip->i_gid = dir->i_gid;
>
>       if(S_ISDIR(mode)){
>        newnip->i_mode =  NNGFS_DIR;
>        newnip->i_op = &nngfs_dir_inode_operations;
>        newnip->i_fop = &nngfs_dir_operations;
>      }
>      else{
>        newnip->i_mode =  NNGFS_FILE;
>        newnip->i_op = &nngfs_file_inode_operations;
>        newnip->i_fop = &nngfs_file_operations;
>      }
>
>
>      nino = NNGFS_I(newnip);
>
>        nino->filetype = newnip->i_mode ;
>        nino->atime = nino->mtime = nino->ctime = CURRENT_TIME_SEC;
>        nino->uid = dir->i_uid;
>        nino->gid = dir->i_gid;
>        nino->size = 0;
>        nino->blockno = nino->inode+1;
>        nino->magic = 0xdeadbeef;
>        nino->inode = inum;
>
>        sb->s_dirt=1;
>        inode_inc_link_count(newnip);
>
>       // insert_inode_hash(newnip);
>        d_instantiate(dentry,newnip);
>        mark_buffer_dirty(bh); //Write the new bitmap to disk
>        mark_inode_dirty(newnip);
>
>        //Add the name information to dir entry
>        if(nngfs_dir_add(dir,inum,dentry->d_name.name)){
>         return ERR_PTR(-EMFILE);
>        }
>
>        mark_inode_dirty(dir);
>        return 0;
> }
>
>
> Thanks for 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
> ***********************************************
>



-- 
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