ceph: new cap message flags indicate if there is pending capsnap
authorYan, Zheng <zyan@redhat.com>
Mon, 24 Jul 2017 09:59:39 +0000 (17:59 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 6 Sep 2017 17:56:44 +0000 (19:56 +0200)
These flags tell mds if there is pending capsnap explicitly.
Without this explicit notification, mds can only conclude if
client has pending capsnap. The method mds use is inefficient
and error-prone.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c
include/linux/ceph/ceph_fs.h

index 7007ae2a5ad2ec4e506ca8216c2fd5253ee35bca..b675c004f6a7045b637b2cd6434056a63a3634a7 100644 (file)
@@ -1248,7 +1248,10 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
        arg.mode = inode->i_mode;
 
        arg.inline_data = ci->i_inline_version != CEPH_INLINE_NONE;
-       arg.flags = 0;
+       if (list_empty(&ci->i_cap_snaps))
+               arg.flags = CEPH_CLIENT_CAPS_NO_CAPSNAP;
+       else
+               arg.flags = CEPH_CLIENT_CAPS_PENDING_CAPSNAP;
        if (sync)
                arg.flags |= CEPH_CLIENT_CAPS_SYNC;
 
index edf5b04b918a2bb3b6cad3f438733e06b9d3d35e..d1642a4b4c5ed4fe9661d28b25f99f14dbd858af 100644 (file)
@@ -669,7 +669,9 @@ enum {
 extern const char *ceph_cap_op_name(int op);
 
 /* flags field in client cap messages (version >= 10) */
-#define CEPH_CLIENT_CAPS_SYNC  (0x1)
+#define CEPH_CLIENT_CAPS_SYNC                  (1<<0)
+#define CEPH_CLIENT_CAPS_NO_CAPSNAP            (1<<1)
+#define CEPH_CLIENT_CAPS_PENDING_CAPSNAP       (1<<2);
 
 /*
  * caps message, used for capability callbacks, acks, requests, etc.