* to be writeable or written */
snapc = ceph_get_snap_context((void *)page->private);
unlock_page(page);
- ceph_queue_writeback(inode);
+ if (ceph_queue_writeback(inode))
+ igrab(inode);
wait_event_interruptible(ci->i_cap_wq,
context_is_writeable_or_written(inode, snapc));
ceph_put_snap_context(snapc);
* context.
*/
dout(10, "queueing %p for writeback\n", inode);
- ceph_queue_writeback(inode);
+ if (ceph_queue_writeback(inode))
+ igrab(inode);
}
if (invalidate_async) {
dout(10, "queueing %p for page invalidation\n", inode);
- ceph_queue_page_invalidation(inode);
+ if (ceph_queue_page_invalidation(inode))
+ igrab(inode);
}
if (wake)
wake_up(&ci->i_cap_wq);
ci->i_reported_size = size;
spin_unlock(&inode->i_lock);
- if (queue_trunc)
- queue_work(ceph_client(inode->i_sb)->trunc_wq,
- &ci->i_vmtruncate_work);
+ if (queue_trunc) {
+ if (queue_work(ceph_client(inode->i_sb)->trunc_wq,
+ &ci->i_vmtruncate_work))
+ igrab(inode);
+ }
}
/*
dout(10, "writeback %p\n", inode);
filemap_write_and_wait(&inode->i_data);
+ iput(inode);
}
/*
/* nevermind! */
ci->i_rdcache_revoking = 0;
spin_unlock(&inode->i_lock);
- return;
+ goto out;
}
orig_gen = ci->i_rdcache_gen;
spin_unlock(&inode->i_lock);
if (check)
ceph_check_caps(ci, 0);
+out:
+ iput(inode);
}
mutex_lock(&inode->i_mutex);
__ceph_do_pending_vmtruncate(inode);
mutex_unlock(&inode->i_mutex);
+ iput(inode);
}
/*
return (struct ceph_client *)sb->s_fs_info;
}
-static inline void ceph_queue_writeback(struct inode *inode)
+static inline int ceph_queue_writeback(struct inode *inode)
{
- queue_work(ceph_inode_to_client(inode)->wb_wq,
+ return queue_work(ceph_inode_to_client(inode)->wb_wq,
&ceph_inode(inode)->i_wb_work);
}
-static inline void ceph_queue_page_invalidation(struct inode *inode)
+static inline int ceph_queue_page_invalidation(struct inode *inode)
{
- queue_work(ceph_inode_to_client(inode)->pg_inv_wq,
+ return queue_work(ceph_inode_to_client(inode)->pg_inv_wq,
&ceph_inode(inode)->i_pg_inv_work);
}