struct ll_inode_info *lli = ll_i2info(dir);
struct ll_statahead_info *sai = NULL;
struct ll_statahead_context *ctx = NULL;
- struct dentry *parent = dentry->d_parent;
+ struct dentry *parent;
struct task_struct *task;
- struct ll_sb_info *sbi = ll_i2sbi(parent->d_inode);
+ struct ll_sb_info *sbi;
int first = LS_FIRST_DE;
int rc = 0;
if (sa_pattern_detect(dir, dentry, &first) == false)
RETURN(0);
+ parent = dget_parent(dentry);
+ sbi = ll_i2sbi(d_inode(parent));
if (unlikely(atomic_inc_return(&sbi->ll_sa_running) >
sbi->ll_sa_running_max)) {
CDEBUG(D_READA,
"Too many concurrent statahead instances, avoid new statahead instance temporarily.\n");
+ dput(parent);
GOTO(out, rc = -EMFILE);
}
+ /* on success ll_sai_alloc holds a ref on parent */
sai = ll_sai_alloc(parent);
+ dput(parent);
if (!sai)
GOTO(out, rc = -ENOMEM);