ceph: d_alloc_root() may fail
... and ceph_init_dentry(NULL) will oops Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
94bf608a18
commit
3c5184ef12
1 changed files with 11 additions and 4 deletions
|
@ -636,19 +636,26 @@ static struct dentry *open_root_dentry(struct ceph_fs_client *fsc,
|
|||
req->r_num_caps = 2;
|
||||
err = ceph_mdsc_do_request(mdsc, NULL, req);
|
||||
if (err == 0) {
|
||||
struct inode *inode = req->r_target_inode;
|
||||
req->r_target_inode = NULL;
|
||||
dout("open_root_inode success\n");
|
||||
if (ceph_ino(req->r_target_inode) == CEPH_INO_ROOT &&
|
||||
if (ceph_ino(inode) == CEPH_INO_ROOT &&
|
||||
fsc->sb->s_root == NULL) {
|
||||
root = d_alloc_root(req->r_target_inode);
|
||||
root = d_alloc_root(inode);
|
||||
if (!root) {
|
||||
iput(inode);
|
||||
root = ERR_PTR(-ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
ceph_init_dentry(root);
|
||||
} else {
|
||||
root = d_obtain_alias(req->r_target_inode);
|
||||
root = d_obtain_alias(inode);
|
||||
}
|
||||
req->r_target_inode = NULL;
|
||||
dout("open_root_inode success, root dentry is %p\n", root);
|
||||
} else {
|
||||
root = ERR_PTR(err);
|
||||
}
|
||||
out:
|
||||
ceph_mdsc_put_request(req);
|
||||
return root;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue