]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/ceph/caps.c
Merge tag 'for-v4.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux...
[karo-tx-linux.git] / fs / ceph / caps.c
index 68c78be19d5b78ad181d15b6caf5cc075b6f9f99..a3ebb632294e7b90a315508c9b75671d2ce8ff6a 100644 (file)
@@ -1015,6 +1015,7 @@ static int send_cap_msg(struct cap_msg_args *arg)
        void *p;
        size_t extra_len;
        struct timespec zerotime = {0};
+       struct ceph_osd_client *osdc = &arg->session->s_mdsc->fsc->client->osdc;
 
        dout("send_cap_msg %s %llx %llx caps %s wanted %s dirty %s"
             " seq %u/%u tid %llu/%llu mseq %u follows %lld size %llu/%llu"
@@ -1076,8 +1077,12 @@ static int send_cap_msg(struct cap_msg_args *arg)
        ceph_encode_64(&p, arg->inline_data ? 0 : CEPH_INLINE_NONE);
        /* inline data size */
        ceph_encode_32(&p, 0);
-       /* osd_epoch_barrier (version 5) */
-       ceph_encode_32(&p, 0);
+       /*
+        * osd_epoch_barrier (version 5)
+        * The epoch_barrier is protected osdc->lock, so READ_ONCE here in
+        * case it was recently changed
+        */
+       ceph_encode_32(&p, READ_ONCE(osdc->epoch_barrier));
        /* oldest_flush_tid (version 6) */
        ceph_encode_64(&p, arg->oldest_flush_tid);
 
@@ -1389,7 +1394,7 @@ static void __ceph_flush_snaps(struct ceph_inode_info *ci,
                first_tid = cf->tid + 1;
 
                capsnap = container_of(cf, struct ceph_cap_snap, cap_flush);
-               atomic_inc(&capsnap->nref);
+               refcount_inc(&capsnap->nref);
                spin_unlock(&ci->i_ceph_lock);
 
                dout("__flush_snaps %p capsnap %p tid %llu %s\n",
@@ -2202,7 +2207,7 @@ static void __kick_flushing_caps(struct ceph_mds_client *mdsc,
                             inode, capsnap, cf->tid,
                             ceph_cap_string(capsnap->dirty));
 
-                       atomic_inc(&capsnap->nref);
+                       refcount_inc(&capsnap->nref);
                        spin_unlock(&ci->i_ceph_lock);
 
                        ret = __send_flush_snap(inode, session, capsnap, cap->mseq,
@@ -3633,13 +3638,19 @@ void ceph_handle_caps(struct ceph_mds_session *session,
                p += inline_len;
        }
 
+       if (le16_to_cpu(msg->hdr.version) >= 5) {
+               struct ceph_osd_client  *osdc = &mdsc->fsc->client->osdc;
+               u32                     epoch_barrier;
+
+               ceph_decode_32_safe(&p, end, epoch_barrier, bad);
+               ceph_osdc_update_epoch_barrier(osdc, epoch_barrier);
+       }
+
        if (le16_to_cpu(msg->hdr.version) >= 8) {
                u64 flush_tid;
                u32 caller_uid, caller_gid;
-               u32 osd_epoch_barrier;
                u32 pool_ns_len;
-               /* version >= 5 */
-               ceph_decode_32_safe(&p, end, osd_epoch_barrier, bad);
+
                /* version >= 6 */
                ceph_decode_64_safe(&p, end, flush_tid, bad);
                /* version >= 7 */