Hi, folks:
if (inode->i_op && inode->i_op->setattr)
{
error = inode->i_op->setattr(dentry, attr); //regular file
}
Else
{ //device file for yaffs
error = inode_change_ok(inode, attr);
if (!error) {
if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid))
error = vfs_dq_transfer(inode, attr) ?
-EDQUOT : 0;
if (!error)
error = inode_setattr(inode, attr);
}
}
when do chown&chmod on device file,the field inode->i_op not assigned , so I assign the value in yaffs_fs.c
static const struct inode_operations yaffs_special_inode_operations = {
.setattr = yaffs_setattr,
};
static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj)
{
................................................
switch (obj->yst_mode & S_IFMT) {
default: /* fifo, device or socket */
inode->i_op = &yaffs_special_inode_operations;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
init_special_inode(inode, obj->yst_mode,
old_decode_dev(obj->yst_rdev));
#else
init_special_inode(inode, obj->yst_mode,
(dev_t) (obj->yst_rdev));
#endif
break;
case S_IFREG: /* file */
inode->i_op = &yaffs_file_inode_operations;
inode->i_fop = &yaffs_file_operations;
inode->i_mapping->a_ops =
&yaffs_file_address_operations;
break;
case S_IFDIR: /* directory */
inode->i_op = &yaffs_dir_inode_operations;
inode->i_fop = &yaffs_dir_operations;
break;
case S_IFLNK: /* symlink */
inode->i_op = &yaffs_symlink_inode_operations;
break;
}
...................................................
}