session = 0;
}
if (!session) {
- dout(10, "inverting session/ino locks on %p\n",
- session);
spin_unlock(&inode->i_lock);
mutex_lock(&mdsc->mutex);
session = __ceph_get_mds_session(mdsc, mds);
mutex_unlock(&mdsc->mutex);
if (session) {
+ dout(10, "inverting session/ino locks on %p\n",
+ session);
mutex_lock(&session->s_mutex);
spin_lock(&inode->i_lock);
}
issued = capsnap->issued;
spin_unlock(&inode->i_lock);
- dout(10, "flush_snaps cap_snap %p follows %lld size %llu\n",
- capsnap, follows, size);
+ dout(10, "flush_snaps %p cap_snap %p follows %lld size %llu\n",
+ inode, capsnap, follows, size);
send_cap(mdsc, ceph_vino(inode).ino,
CEPH_CAP_OP_FLUSHSNAP, issued, 0, 0, mseq,
inode, endoff, ci->i_max_size);
goto sorry;
}
- if (!list_empty(&ci->i_cap_snaps) &&
- list_entry(ci->i_cap_snaps.next, struct ceph_cap_snap,
- ci_item)->writing) {
+ if (__ceph_have_pending_cap_snap(ci)) {
dout(20, "get_cap_refs %p cap_snap_pending\n", inode);
goto sorry;
}
spin_lock(&inode->i_lock);
used = __ceph_caps_used(ci);
- if (!list_empty(&ci->i_cap_snaps) &&
- list_entry(ci->i_cap_snaps.next, struct ceph_cap_snap,
- ci_item)->writing) {
+ if (__ceph_have_pending_cap_snap(ci)) {
dout(10, "queue_cap_snap %p snapc %p seq %llu used %d"
" already pending\n", inode, snapc, snapc->seq, used);
kfree(capsnap);
capsnap->issued = __ceph_caps_issued(ci, 0);
capsnap->dirty = ci->i_wrbuffer_ref_head;
ci->i_wrbuffer_ref_head = 0;
- list_add(&capsnap->ci_item, &ci->i_cap_snaps);
+ list_add_tail(&capsnap->ci_item, &ci->i_cap_snaps);
if (used & CEPH_CAP_WR) {
dout(10, "queue_cap_snap %p cap_snap %p snapc %p"
struct ceph_cap_snap *capsnap,
int used);
+inline static bool __ceph_have_pending_cap_snap(struct ceph_inode_info *ci)
+{
+ return !list_empty(&ci->i_cap_snaps) &&
+ list_entry(ci->i_cap_snaps.prev, struct ceph_cap_snap,
+ ci_item)->writing;
+}
+
+
/*
* calculate the number of pages a given length and offset map onto,