OBD_SET_CTXT_MAGIC(newctxt);
newctxt->pwdmnt = dev->od_mnt;
newctxt->pwd = dev->od_mnt->mnt_root;
- newctxt->fs = get_ds();
+ newctxt->fs = KERNEL_DS;
newctxt->umask = current_umask();
newctxt->dt = NULL;
push_ctxt(save, newctxt);
}
+/**
+ * osd_lookup_one_len_unlocked
+ *
+ * @name: pathname component to lookup
+ * @base: base directory to lookup from
+ * @len: maximum length @len should be interpreted to
+ *
+ * This should be called without the parent
+ * i_mutex held, and will take the i_mutex itself.
+ */
+struct dentry *osd_lookup_one_len_unlocked(const char *name,
+ struct dentry *base, int len)
+{
+ struct dentry *dchild;
+
+ inode_lock(base->d_inode);
+ dchild = lookup_one_len(name, base, len);
+ inode_unlock(base->d_inode);
+
+ if (IS_ERR(dchild))
+ return dchild;
+
+ if (dchild->d_inode && unlikely(is_bad_inode(dchild->d_inode))) {
+ CERROR("bad inode returned %lu/%u\n",
+ dchild->d_inode->i_ino, dchild->d_inode->i_generation);
+ dput(dchild);
+ dchild = ERR_PTR(-ENOENT);
+ }
+
+ return dchild;
+}
+
+/**
+ * osd_ios_lookup_one_len - lookup single pathname component
+ *
+ * @name: pathname component to lookup
+ * @base: base directory to lookup from
+ * @len: maximum length @len should be interpreted to
+ */
+struct dentry *osd_ios_lookup_one_len(const char *name, struct dentry *base,
+ int len)
+{
+ return osd_lookup_one_len_unlocked(name, base, len);
+}
+
/* utility to make a directory */
static struct dentry *
simple_mkdir(const struct lu_env *env, struct osd_device *osd,
// ASSERT_KERNEL_CTXT("kernel doing mkdir outside kernel context\n");
CDEBUG(D_INODE, "creating directory %.*s\n", (int)strlen(name), name);
- dchild = ll_lookup_one_len(name, dir, strlen(name));
+ dchild = osd_lookup_one_len_unlocked(name, dir, strlen(name));
if (IS_ERR(dchild))
RETURN(dchild);
ENTRY;
- dlast = ll_lookup_one_len(LAST_RCVD, osd_sb(osd)->s_root,
- strlen(LAST_RCVD));
+ dlast = osd_lookup_one_len_unlocked(LAST_RCVD, osd_sb(osd)->s_root,
+ strlen(LAST_RCVD));
if (IS_ERR(dlast))
return PTR_ERR(dlast);
else if (dlast->d_inode == NULL)
child->d_name.name = name;
child->d_name.len = strlen(name);
- ll_vfs_dq_init(parent);
+ dquot_initialize(parent);
inode_lock(parent);
bh = osd_ldiskfs_find_entry(parent, &child->d_name, &de, NULL, NULL);
if (IS_ERR(bh))
child->d_parent = dird;
child->d_inode = NULL;
- ll_vfs_dq_init(dir);
+ dquot_initialize(dir);
inode_lock(dir);
bh = osd_ldiskfs_find_entry(dir, &child->d_name, &de, NULL, NULL);
if (IS_ERR(bh)) {
if (OBD_FAIL_CHECK(OBD_FAIL_OSD_COMPAT_INVALID_ENTRY))
inode->i_ino++;
- ll_vfs_dq_init(dir->d_inode);
+ dquot_initialize(dir->d_inode);
inode_lock(dir->d_inode);
rc = osd_ldiskfs_add_entry(info, osd, th, child, inode, NULL);
inode_unlock(dir->d_inode);
if (IS_ERR(jh))
RETURN(PTR_ERR(jh));
- ll_vfs_dq_init(src_parent);
- ll_vfs_dq_init(dir);
+ dquot_initialize(src_parent);
+ dquot_initialize(dir);
inode_lock(src_parent);
inode_lock(dir);
RETURN(-ENOENT);
}
- dentry = ll_lookup_one_len(name, root, strlen(name));
+ dentry = osd_lookup_one_len_unlocked(name, root, strlen(name));
if (!IS_ERR(dentry)) {
inode = dentry->d_inode;
if (inode) {