- if (dentry->d_inode == NULL)
- GOTO(out_dentry, rc = -ENOENT);
+ inode = res->lr_lvb_inode;
+ /* filter_fid2dentry could fail, esp. in OBD_FAIL_OST_ENOENT test case */
+ if (unlikely(inode == NULL)) {
+ struct dentry *dentry;
+
+ unlock_res(res);
+
+ dentry = filter_fid2dentry(obd, NULL, res->lr_name.name[1],
+ res->lr_name.name[0]);
+ if (IS_ERR(dentry))
+ RETURN(PTR_ERR(dentry));
+
+ if (dentry->d_inode)
+ tmpinode = igrab(dentry->d_inode);
+ f_dput(dentry);
+ /* tmpinode could be NULL, but it does not matter if other
+ * have set res->lr_lvb_inode */
+ lock_res(res);
+ if (res->lr_lvb_inode == NULL) {
+ res->lr_lvb_inode = tmpinode;
+ tmpinode = NULL;
+ }
+ inode = res->lr_lvb_inode;
+ }
+
+ if (!inode || !inode->i_nlink)
+ GOTO(out, rc = -ENOENT);