diff options
Diffstat (limited to 'fs/ceph/mds_client.c')
| -rw-r--r-- | fs/ceph/mds_client.c | 7 | 
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index d0fae4ce9ba..79743d146be 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -578,6 +578,7 @@ static void __register_request(struct ceph_mds_client *mdsc,  	if (dir) {  		struct ceph_inode_info *ci = ceph_inode(dir); +		ihold(dir);  		spin_lock(&ci->i_unsafe_lock);  		req->r_unsafe_dir = dir;  		list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops); @@ -598,6 +599,9 @@ static void __unregister_request(struct ceph_mds_client *mdsc,  		spin_lock(&ci->i_unsafe_lock);  		list_del_init(&req->r_unsafe_dir_item);  		spin_unlock(&ci->i_unsafe_lock); + +		iput(req->r_unsafe_dir); +		req->r_unsafe_dir = NULL;  	}  	ceph_mdsc_put_request(req); @@ -2691,7 +2695,6 @@ static void handle_lease(struct ceph_mds_client *mdsc,  {  	struct super_block *sb = mdsc->fsc->sb;  	struct inode *inode; -	struct ceph_inode_info *ci;  	struct dentry *parent, *dentry;  	struct ceph_dentry_info *di;  	int mds = session->s_mds; @@ -2728,7 +2731,6 @@ static void handle_lease(struct ceph_mds_client *mdsc,  		dout("handle_lease no inode %llx\n", vino.ino);  		goto release;  	} -	ci = ceph_inode(inode);  	/* dentry */  	parent = d_find_alias(inode); @@ -3002,6 +3004,7 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)  	spin_lock_init(&mdsc->snap_flush_lock);  	mdsc->cap_flush_seq = 0;  	INIT_LIST_HEAD(&mdsc->cap_dirty); +	INIT_LIST_HEAD(&mdsc->cap_dirty_migrating);  	mdsc->num_cap_flushing = 0;  	spin_lock_init(&mdsc->cap_dirty_lock);  	init_waitqueue_head(&mdsc->cap_flushing_wq);  |