Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 55 additions & 9 deletions fs/hmfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
* in its parent indirect node to be NULL_ADDR
*/
/*
* 缩短dn指向的direct node中的数据
* 截断dn指向的direct node中的数据
* 检查dn->node_block中的每个地址指向的块是否为最新版本,若不是则删除无效块
* 再将删除后的有效块数量更新到inode和超级块中,并将inode标记为脏
*/
Expand All @@ -856,7 +856,11 @@ void truncate_data_blocks(struct dnode_of_data *dn)
mark_inode_dirty(dn->inode);
}
}

/*
* 将文件某个偏移量from所对应块在from之后的内容清零(只清除该块内容)
* @inode对应文件
* @from对应在文件中的偏移量
*/
static void truncate_partial_data_page(struct inode *inode, block_t from)
{
unsigned offset = from & (HMFS_PAGE_SIZE - 1);
Expand All @@ -867,7 +871,11 @@ static void truncate_partial_data_page(struct inode *inode, block_t from)
HMFS_PAGE_SIZE, true);
return;
}

/*
* 清除普通文件某个偏移量之后的全部内容
* @inode对应文件
* @from对应偏移量
*/
static int __truncate_blocks(struct inode *inode, block_t from)
{
struct dnode_of_data dn;
Expand Down Expand Up @@ -897,12 +905,22 @@ static int __truncate_blocks(struct inode *inode, block_t from)
}

free_next:
/*
* 先调用truncate_inode_blocks删除偏移量之后的所有块内容
* 再调用truncate_partial_data_page删除偏移量所在的块在其之后的内容
*/
err = truncate_inode_blocks(inode, free_from);
truncate_partial_data_page(inode, from);

return err;
}

/*
* 清除文件某个偏移量之后的全部内容
* @inode对应文件
* @from对应偏移量
* 若为内嵌型文件直接在本函数处理
* 否则调用__truncate_blocks处理普通文件
*/
static int truncate_blocks(struct inode *inode, block_t from)
{
struct hmfs_inode *inode_block;
Expand All @@ -919,7 +937,10 @@ static int truncate_blocks(struct inode *inode, block_t from)

return __truncate_blocks(inode, from);
}

/*
* 清除@inode对应文件在i_size之后的内容
* 再修改i_mtime及i_ctime并将inode标记为脏
*/
void hmfs_truncate(struct inode *inode)
{
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
Expand Down Expand Up @@ -1325,7 +1346,12 @@ static long hmfs_fallocate(struct file *file, int mode, loff_t offset,

#define HMFS_REG_FLMASK (~(FS_DIRSYNC_FL | FS_TOPDIR_FL))
#define HMFS_OTHER_FLMASK (FS_NODUMP_FL | FS_NOATIME_FL)

/*
* 对于@flags进行掩码处理
* @mode对应目录文件时直接返回falgs
* @mode对应普通文件时返回flags & HMFS_REG_FLMASK
* 其他情况时返回flags & HMFS_OTHER_FLMASK
*/
static inline __u32 hmfs_mask_flags(umode_t mode, __u32 flags)
{
if (S_ISDIR(mode))
Expand All @@ -1335,7 +1361,15 @@ static inline __u32 hmfs_mask_flags(umode_t mode, __u32 flags)
else
return flags & HMFS_OTHER_FLMASK;
}

/*
* 向设备发送或接收控制信息
* @filp指向设备文件标识符
* @arg指向用户空间目标地址
* @cmd为HMFS_IOC_GETFLAGS时,将i_flags中用户可见位发送到用户空间目标地址
* @cmd为HMFS_IOC_SETFLAGS时,将用户空间目标地址的值复制到flags中
* @cmd为HMFS_IOC_GETVERSION时,将i_generation发送到用户空间目标地址
* 若不符合以上任何一种情况则返回-ENOTTY
*/
long hmfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
struct inode *inode = file_inode(filp);
Expand Down Expand Up @@ -1394,6 +1428,13 @@ long hmfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
}

#ifdef CONFIG_COMPAT
/*
* hmfs_ioctl函数的兼容性包装函数
* 向设备发送或接收控制信息
* @filp指向设备文件标识符
* @arg指向用户空间目标地址
* 调整@cmd的值再调用hmfs_ioctl发送或接收控制信息
*/
long hmfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
Expand Down Expand Up @@ -1441,7 +1482,10 @@ const struct inode_operations hmfs_file_inode_operations = {
.removexattr = generic_removexattr,
#endif
};

/*
* 创建slab高速缓存,使mmap_block_slab指向缓存
* 成功返回0,失败返回-ENOMEM
*/
int create_mmap_struct_cache(void)
{
mmap_block_slab = hmfs_kmem_cache_create("hmfs_mmap_block",
Expand All @@ -1450,7 +1494,9 @@ int create_mmap_struct_cache(void)
return -ENOMEM;
return 0;
}

/*
* 销毁mmap_block_slab指向的slab高速缓存
*/
void destroy_mmap_struct_cache(void)
{
kmem_cache_destroy(mmap_block_slab);
Expand Down
11 changes: 10 additions & 1 deletion fs/hmfs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,10 @@ int hmfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
}

#ifdef CONFIG_HMFS_ACL
/*
* 更新@inode属性
* @attr指向存储要更新的属性的结构体
*/
static void __setattr_copy(struct inode *inode, const struct iattr *attr)
{
unsigned int ia_valid = attr->ia_valid;
Expand Down Expand Up @@ -398,7 +402,12 @@ static void __setattr_copy(struct inode *inode, const struct iattr *attr)
#else
#define __setattr_copy setattr_copy
#endif

/*
* 更新文件inode属性的包装函数
* 先判断inode权限决定是否可更新相应属性,再调用__setattr_copy更新属性
* @dentry指向对应文件inode
* @attr指向存储要更新的属性的结构体
*/
int hmfs_setattr(struct dentry *dentry, struct iattr *attr)
{
struct inode *inode = dentry->d_inode;
Expand Down