summaryrefslogtreecommitdiff
path: root/fs/ceph/caps.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r--fs/ceph/caps.c70
1 files changed, 37 insertions, 33 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 40b8d3471244..7d166182e98d 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1270,6 +1270,41 @@ static void ceph_flush_snaps(struct ceph_inode_info *ci)
}
/*
+ * Mark caps dirty. If inode is newly dirty, add to the global dirty
+ * list.
+ */
+void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
+{
+ struct ceph_mds_client *mdsc = &ceph_client(ci->vfs_inode.i_sb)->mdsc;
+ struct inode *inode = &ci->vfs_inode;
+ int was = ci->i_dirty_caps;
+ int dirty = 0;
+
+ dout("__mark_dirty_caps %p %s dirty %s -> %s\n", &ci->vfs_inode,
+ ceph_cap_string(mask), ceph_cap_string(was),
+ ceph_cap_string(was | mask));
+ ci->i_dirty_caps |= mask;
+ if (was == 0) {
+ dout(" inode %p now dirty\n", &ci->vfs_inode);
+ BUG_ON(!list_empty(&ci->i_dirty_item));
+ spin_lock(&mdsc->cap_dirty_lock);
+ list_add(&ci->i_dirty_item, &mdsc->cap_dirty);
+ spin_unlock(&mdsc->cap_dirty_lock);
+ if (ci->i_flushing_caps == 0) {
+ igrab(inode);
+ dirty |= I_DIRTY_SYNC;
+ }
+ }
+ BUG_ON(list_empty(&ci->i_dirty_item));
+ if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) &&
+ (mask & CEPH_CAP_FILE_BUFFER))
+ dirty |= I_DIRTY_DATASYNC;
+ if (dirty)
+ __mark_inode_dirty(inode, dirty);
+ __cap_delay_requeue(mdsc, ci);
+}
+
+/*
* Add dirty inode to the flushing list. Assigned a seq number so we
* can wait for caps to flush without starving.
*
@@ -1558,39 +1593,6 @@ ack:
}
/*
- * Mark caps dirty. If inode is newly dirty, add to the global dirty
- * list.
- */
-void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
-{
- struct ceph_mds_client *mdsc = &ceph_client(ci->vfs_inode.i_sb)->mdsc;
- struct inode *inode = &ci->vfs_inode;
- int was_dirty = ci->i_dirty_caps;
- int dirty = 0;
-
- dout("__mark_dirty_caps %p %s dirty %s -> %s\n", &ci->vfs_inode,
- ceph_cap_string(mask), ceph_cap_string(ci->i_dirty_caps),
- ceph_cap_string(ci->i_dirty_caps | mask));
- ci->i_dirty_caps |= mask;
- if (!was_dirty) {
- dout(" inode %p now dirty\n", &ci->vfs_inode);
- spin_lock(&mdsc->cap_dirty_lock);
- list_add(&ci->i_dirty_item, &mdsc->cap_dirty);
- spin_unlock(&mdsc->cap_dirty_lock);
- if (ci->i_flushing_caps == 0) {
- igrab(inode);
- dirty |= I_DIRTY_SYNC;
- }
- }
- if (((was_dirty | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) &&
- (mask & CEPH_CAP_FILE_BUFFER))
- dirty |= I_DIRTY_DATASYNC;
- if (dirty)
- __mark_inode_dirty(inode, dirty);
- __cap_delay_requeue(mdsc, ci);
-}
-
-/*
* Try to flush dirty caps back to the auth mds.
*/
static int try_flush_caps(struct inode *inode, struct ceph_mds_session *session,
@@ -2370,6 +2372,8 @@ static void handle_cap_flush_ack(struct inode *inode,
dout(" inode %p now clean\n", inode);
BUG_ON(!list_empty(&ci->i_dirty_item));
drop = 1;
+ } else {
+ BUG_ON(list_empty(&ci->i_dirty_item));
}
}
spin_unlock(&mdsc->cap_dirty_lock);