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

Commit 70b666c3 authored by Sage Weil's avatar Sage Weil
Browse files

ceph: use ihold when we already have an inode ref



We should use ihold whenever we already have a stable inode ref, even
when we aren't holding i_lock.  This avoids adding new and unnecessary
locking dependencies.

Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent db354052
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -453,7 +453,7 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc)
	int err;
	int err;
	struct inode *inode = page->mapping->host;
	struct inode *inode = page->mapping->host;
	BUG_ON(!inode);
	BUG_ON(!inode);
	igrab(inode);
	ihold(inode);
	err = writepage_nounlock(page, wbc);
	err = writepage_nounlock(page, wbc);
	unlock_page(page);
	unlock_page(page);
	iput(inode);
	iput(inode);
+4 −6
Original line number Original line Diff line number Diff line
@@ -2940,14 +2940,12 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
	while (!list_empty(&mdsc->cap_dirty)) {
	while (!list_empty(&mdsc->cap_dirty)) {
		ci = list_first_entry(&mdsc->cap_dirty, struct ceph_inode_info,
		ci = list_first_entry(&mdsc->cap_dirty, struct ceph_inode_info,
				      i_dirty_item);
				      i_dirty_item);
		inode = igrab(&ci->vfs_inode);
		inode = &ci->vfs_inode;
		ihold(inode);
		dout("flush_dirty_caps %p\n", inode);
		dout("flush_dirty_caps %p\n", inode);
		spin_unlock(&mdsc->cap_dirty_lock);
		spin_unlock(&mdsc->cap_dirty_lock);
		if (inode) {
		ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_FLUSH, NULL);
			ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_FLUSH,
					NULL);
		iput(inode);
		iput(inode);
		}
		spin_lock(&mdsc->cap_dirty_lock);
		spin_lock(&mdsc->cap_dirty_lock);
	}
	}
	spin_unlock(&mdsc->cap_dirty_lock);
	spin_unlock(&mdsc->cap_dirty_lock);
+7 −4
Original line number Original line Diff line number Diff line
@@ -308,7 +308,8 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir)
		req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS);
		req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS);
		if (IS_ERR(req))
		if (IS_ERR(req))
			return PTR_ERR(req);
			return PTR_ERR(req);
		req->r_inode = igrab(inode);
		req->r_inode = inode;
		ihold(inode);
		req->r_dentry = dget(filp->f_dentry);
		req->r_dentry = dget(filp->f_dentry);
		/* hints to request -> mds selection code */
		/* hints to request -> mds selection code */
		req->r_direct_mode = USE_AUTH_MDS;
		req->r_direct_mode = USE_AUTH_MDS;
@@ -787,10 +788,12 @@ static int ceph_link(struct dentry *old_dentry, struct inode *dir,
	req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
	req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
	req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
	req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
	err = ceph_mdsc_do_request(mdsc, dir, req);
	err = ceph_mdsc_do_request(mdsc, dir, req);
	if (err)
	if (err) {
		d_drop(dentry);
		d_drop(dentry);
	else if (!req->r_reply_info.head->is_dentry)
	} else if (!req->r_reply_info.head->is_dentry) {
		d_instantiate(dentry, igrab(old_dentry->d_inode));
		ihold(old_dentry->d_inode);
		d_instantiate(dentry, old_dentry->d_inode);
	}
	ceph_mdsc_put_request(req);
	ceph_mdsc_put_request(req);
	return err;
	return err;
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -109,7 +109,7 @@ static struct dentry *__fh_to_dentry(struct super_block *sb,
		err = ceph_mdsc_do_request(mdsc, NULL, req);
		err = ceph_mdsc_do_request(mdsc, NULL, req);
		inode = req->r_target_inode;
		inode = req->r_target_inode;
		if (inode)
		if (inode)
			igrab(inode);
			ihold(inode);
		ceph_mdsc_put_request(req);
		ceph_mdsc_put_request(req);
		if (!inode)
		if (!inode)
			return ERR_PTR(-ESTALE);
			return ERR_PTR(-ESTALE);
@@ -167,7 +167,7 @@ static struct dentry *__cfh_to_dentry(struct super_block *sb,
		err = ceph_mdsc_do_request(mdsc, NULL, req);
		err = ceph_mdsc_do_request(mdsc, NULL, req);
		inode = req->r_target_inode;
		inode = req->r_target_inode;
		if (inode)
		if (inode)
			igrab(inode);
			ihold(inode);
		ceph_mdsc_put_request(req);
		ceph_mdsc_put_request(req);
		if (!inode)
		if (!inode)
			return ERR_PTR(err ? err : -ESTALE);
			return ERR_PTR(err ? err : -ESTALE);
+2 −1
Original line number Original line Diff line number Diff line
@@ -191,7 +191,8 @@ int ceph_open(struct inode *inode, struct file *file)
		err = PTR_ERR(req);
		err = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
	req->r_inode = igrab(inode);
	req->r_inode = inode;
	ihold(inode);
	req->r_num_caps = 1;
	req->r_num_caps = 1;
	err = ceph_mdsc_do_request(mdsc, parent_inode, req);
	err = ceph_mdsc_do_request(mdsc, parent_inode, req);
	if (!err)
	if (!err)
Loading