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:
Al Viro 2012-01-09 16:34:32 -05:00
parent 94bf608a18
commit 3c5184ef12

View file

@ -636,19 +636,26 @@ static struct dentry *open_root_dentry(struct ceph_fs_client *fsc,
req->r_num_caps = 2; req->r_num_caps = 2;
err = ceph_mdsc_do_request(mdsc, NULL, req); err = ceph_mdsc_do_request(mdsc, NULL, req);
if (err == 0) { if (err == 0) {
struct inode *inode = req->r_target_inode;
req->r_target_inode = NULL;
dout("open_root_inode success\n"); 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) { 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); ceph_init_dentry(root);
} else { } 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); dout("open_root_inode success, root dentry is %p\n", root);
} else { } else {
root = ERR_PTR(err); root = ERR_PTR(err);
} }
out:
ceph_mdsc_put_request(req); ceph_mdsc_put_request(req);
return root; return root;
} }