mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-25 21:45:32 +07:00
staging: lustre: llite: clear dir stripe md in ll_iget
If ll_iget fails during inode initialization, especially during striped directory lookup after creation failed, then it should clear stripe MD before make_bad_inode(), because make_bad_inode() will reset the i_mode, which can cause ll_clear_inode() skip freeing those stripe MD. Signed-off-by: wang di <di.wang@intel.com> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7230 Reviewed-on: http://review.whamcloud.com/16677 Reviewed-by: James Simmons <uja.ornl@yahoo.com> Reviewed-by: Andreas Dilger <andreas.dilger@intel.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
54576e132e
commit
a80ba5fe75
@ -787,6 +787,7 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt);
|
||||
void ll_put_super(struct super_block *sb);
|
||||
void ll_kill_super(struct super_block *sb);
|
||||
struct inode *ll_inode_from_resource_lock(struct ldlm_lock *lock);
|
||||
void ll_dir_clear_lsm_md(struct inode *inode);
|
||||
void ll_clear_inode(struct inode *inode);
|
||||
int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import);
|
||||
int ll_setattr(struct dentry *de, struct iattr *attr);
|
||||
|
@ -1055,7 +1055,7 @@ struct inode *ll_inode_from_resource_lock(struct ldlm_lock *lock)
|
||||
return inode;
|
||||
}
|
||||
|
||||
static void ll_dir_clear_lsm_md(struct inode *inode)
|
||||
void ll_dir_clear_lsm_md(struct inode *inode)
|
||||
{
|
||||
struct ll_inode_info *lli = ll_i2info(inode);
|
||||
|
||||
|
@ -117,6 +117,14 @@ struct inode *ll_iget(struct super_block *sb, ino_t hash,
|
||||
rc = cl_file_inode_init(inode, md);
|
||||
|
||||
if (rc) {
|
||||
/*
|
||||
* Let's clear directory lsm here, otherwise
|
||||
* make_bad_inode() will reset the inode mode
|
||||
* to regular, then ll_clear_inode will not
|
||||
* be able to clear lsm_md
|
||||
*/
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
ll_dir_clear_lsm_md(inode);
|
||||
make_bad_inode(inode);
|
||||
unlock_new_inode(inode);
|
||||
iput(inode);
|
||||
@ -129,6 +137,8 @@ struct inode *ll_iget(struct super_block *sb, ino_t hash,
|
||||
CDEBUG(D_VFSTRACE, "got inode: "DFID"(%p): rc = %d\n",
|
||||
PFID(&md->body->mbo_fid1), inode, rc);
|
||||
if (rc) {
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
ll_dir_clear_lsm_md(inode);
|
||||
iput(inode);
|
||||
inode = ERR_PTR(rc);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user