Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c5184ef authored by Al Viro's avatar Al Viro
Browse files

ceph: d_alloc_root() may fail



... and ceph_init_dentry(NULL) will oops

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 94bf608a
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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;
}