ceph: include 'follows' of pending snapflush in cap reconnect message
authorYan, Zheng <zyan@redhat.com>
Tue, 5 Jul 2016 01:32:31 +0000 (09:32 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 28 Jul 2016 01:00:41 +0000 (03:00 +0200)
This helps the recovering MDS to reconstruct the internal states that
tracking pending snapflush.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
fs/ceph/mds_client.c

index 131a61f..bcf2034 100644 (file)
@@ -2797,6 +2797,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
        char *path;
        int pathlen, err;
        u64 pathbase;
+       u64 snap_follows;
        struct dentry *dentry;
 
        ci = cap->ci;
@@ -2843,6 +2844,15 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
                rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
                rec.v1.pathbase = cpu_to_le64(pathbase);
        }
+
+       if (list_empty(&ci->i_cap_snaps)) {
+               snap_follows = 0;
+       } else {
+               struct ceph_cap_snap *capsnap =
+                       list_first_entry(&ci->i_cap_snaps,
+                                        struct ceph_cap_snap, ci_item);
+               snap_follows = capsnap->follows;
+       }
        spin_unlock(&ci->i_ceph_lock);
 
        if (recon_state->msg_version >= 2) {
@@ -2872,7 +2882,7 @@ encode_again:
                if (recon_state->msg_version >= 3) {
                        /* version, compat_version and struct_len */
                        total_len = 2 * sizeof(u8) + sizeof(u32);
-                       struct_v = 1;
+                       struct_v = 2;
                }
                /*
                 * number of encoded locks is stable, so copy to pagelist
@@ -2885,6 +2895,9 @@ encode_again:
                struct_len += sizeof(rec.v2);
                struct_len += sizeof(u32) + pathlen;
 
+               if (struct_v >= 2)
+                       struct_len += sizeof(u64); /* snap_follows */
+
                total_len += struct_len;
                err = ceph_pagelist_reserve(pagelist, total_len);
 
@@ -2899,6 +2912,8 @@ encode_again:
                        ceph_locks_to_pagelist(flocks, pagelist,
                                               num_fcntl_locks,
                                               num_flock_locks);
+                       if (struct_v >= 2)
+                               ceph_pagelist_encode_64(pagelist, snap_follows);
                }
                kfree(flocks);
        } else {