]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: fix pending cap_snap checks, queuing
authorSage Weil <sage@newdream.net>
Wed, 1 Oct 2008 17:50:51 +0000 (10:50 -0700)
committerSage Weil <sage@newdream.net>
Wed, 1 Oct 2008 17:50:51 +0000 (10:50 -0700)
Add new cap_snaps to the _tail_ of the list.

Also, use a helper to check for pending (write in progress) check, and be
sure to check the list tail in that case.

src/kernel/caps.c
src/kernel/snap.c
src/kernel/super.h

index c96482062ff2ed11629374fbb9066e6b73c57a9d..c33e94cec73dcafe34b6814c8b7a62a2af3d0f36 100644 (file)
@@ -349,13 +349,13 @@ retry:
                        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);
                        }
@@ -371,8 +371,8 @@ retry:
                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,
@@ -556,9 +556,7 @@ int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want, int *got,
                             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;
                }
index 4b28b957404b3d0921e94b8d11c0da55b60424d0..801463b3231fc7ca799f5b63d2a2b1630c3c5285 100644 (file)
@@ -226,9 +226,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci,
 
        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);
@@ -239,7 +237,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci,
                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"
index 2a653dc3b2cac2602c6f7fc183e2263dc9d17154..9babb026e9ce8826f64eca59b9ef43905208380b 100644 (file)
@@ -530,6 +530,14 @@ extern void __ceph_finish_cap_snap(struct ceph_inode_info *ci,
                                   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,