linux ls命令 cpu高,ls命令是怎样实现的,getdents64,linux-2.6.27.5

structinode*ext2_iget (structsuper_block*sb, unsignedlongino)

{structext2_inode_info*ei;structbuffer_head*bh;structext2_inode*raw_inode;structinode*inode;longret=-EIO;intn;

inode=iget_locked(sb, ino);if(!inode)returnERR_PTR(-ENOMEM);if(!(inode->i_state&I_NEW))returninode;

ei=EXT2_I(inode);

#ifdef CONFIG_EXT2_FS_POSIX_ACL

ei->i_acl=EXT2_ACL_NOT_CACHED;

ei->i_default_acl=EXT2_ACL_NOT_CACHED;#endifei->i_block_alloc_info=NULL;

raw_inode=ext2_get_inode(inode->i_sb, ino,&bh);if(IS_ERR(raw_inode)) {

ret=PTR_ERR(raw_inode);gotobad_inode;

}

inode->i_mode=le16_to_cpu(raw_inode->i_mode);

inode->i_uid=(uid_t)le16_to_cpu(raw_inode->i_uid_low);

inode->i_gid=(gid_t)le16_to_cpu(raw_inode->i_gid_low);if(!(test_opt (inode->i_sb, NO_UID32))) {

inode->i_uid|=le16_to_cpu(raw_inode->i_uid_high)<<16;

inode->i_gid|=le16_to_cpu(raw_inode->i_gid_high)<<16;

}

inode->i_nlink=le16_to_cpu(raw_inode->i_links_count);

inode->i_size=le32_to_cpu(raw_inode->i_size);

inode->i_atime.tv_sec=(signed)le32_to_cpu(raw_inode->i_atime);

inode->i_ctime.tv_sec=(signed)le32_to_cpu(raw_inode->i_ctime);

inode->i_mtime.tv_sec=(signed)le32_to_cpu(raw_inode->i_mtime);

inode->i_atime.tv_nsec=inode->i_mtime.tv_nsec=inode->i_ctime.tv_nsec=0;

ei->i_dtime=le32_to_cpu(raw_inode->i_dtime);/*We now have enough fields to check if the inode was active or not.

* This is needed because nfsd might try to access dead inodes

* the test is that same one that e2fsck uses

* NeilBrown 1999oct15*/if(inode->i_nlink==0&&(inode->i_mode==0||ei->i_dtime)) {/*this inode is deleted*/brelse (bh);

ret=-ESTALE;gotobad_inode;

}

inode->i_blocks=le32_to_cpu(raw_inode->i_blocks);

ei->i_flags=le32_to_cpu(raw_inode->i_flags);

ei->i_faddr=le32_to_cpu(raw_inode->i_faddr);

ei->i_frag_no=raw_inode->i_frag;

ei->i_frag_size=raw_inode->i_fsize;

ei->i_file_acl=le32_to_cpu(raw_inode->i_file_acl);

ei->i_dir_acl=0;if(S_ISREG(inode->i_mode))

inode->i_size|=((__u64)le32_to_cpu(raw_inode->i_size_high))<<32;elseei->i_dir_acl=le32_to_cpu(raw_inode->i_dir_acl);

ei->i_dtime=0;

inode->i_generation=le32_to_cpu(raw_inode->i_generation);

ei->i_state=0;

ei->i_block_group=(ino-1)/EXT2_INODES_PER_GROUP(inode->i_sb);

ei->i_dir_start_lookup=0;/** NOTE! The in-memory inode i_data array is in little-endian order

* even on big-endian machines: we do NOT byteswap the block numbers!*/for(n=0; n

ei->i_data[n]=raw_inode->i_block[n];///下面是我们关心的。。。。。。。。。。。。。。。。。。。。。。。。///这里对inode->fop赋值,就是inode中的file_operations结构。if(S_ISREG(inode->i_mode)) {///普通文件(S_ISREG),inode->i_fop为ext2_file_operations函数集inode->i_op=&ext2_file_inode_operations;if(ext2_use_xip(inode->i_sb)) {///???现在不关心inode->i_mapping->a_ops=&ext2_aops_xip;

inode->i_fop=&ext2_xip_file_operations;

}elseif(test_opt(inode->i_sb, NOBH)) {

inode->i_mapping->a_ops=&ext2_nobh_aops;

inode->i_fop=&ext2_file_operations;

}else{

inode->i_mapping->a_ops=&ext2_aops;

inode->i_fop=&ext2_file_operations;

}

}elseif(S_ISDIR(inode->i_mode)) {///目录文件(S_ISDIR),inode->i_fop为ext2_dir_operations函数集inode->i_op=&ext2_dir_inode_operations;

inode->i_fop=&ext2_dir_operations;if(test_opt(inode->i_sb, NOBH))

inode->i_mapping->a_ops=&ext2_nobh_aops;elseinode->i_mapping->a_ops=&ext2_aops;

}elseif(S_ISLNK(inode->i_mode)) {///链接文件(S_ISLNK),不需要inode->i_fop函数集if(ext2_inode_is_fast_symlink(inode))

inode->i_op=&ext2_fast_symlink_inode_operations;else{

inode->i_op=&ext2_symlink_inode_operations;if(test_opt(inode->i_sb, NOBH))

inode->i_mapping->a_ops=&ext2_nobh_aops;elseinode->i_mapping->a_ops=&ext2_aops;

}

}else{

inode->i_op=&ext2_special_inode_operations;if(raw_inode->i_block[0])

init_special_inode(inode, inode->i_mode,

old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));elseinit_special_inode(inode, inode->i_mode,

new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));

}///以上。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。brelse (bh);

ext2_set_inode_flags(inode);

unlock_new_inode(inode);returninode;

bad_inode:

iget_failed(inode);returnERR_PTR(ret);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值