]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ceph: handle change_attr in cap messages
authorJeff Layton <jlayton@kernel.org>
Thu, 6 Jun 2019 12:06:40 +0000 (08:06 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 8 Jul 2019 12:01:43 +0000 (14:01 +0200)
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c
fs/ceph/snap.c
fs/ceph/super.h

index 623b82684e9076dc8a7a9c2e4bbe15c0914d7c43..2e22efd79b0ced0666875de586eee47f32b6331e 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
 #include <linux/writeback.h>
+#include <linux/iversion.h>
 
 #include "super.h"
 #include "mds_client.h"
@@ -1138,6 +1139,7 @@ struct cap_msg_args {
        u64                     ino, cid, follows;
        u64                     flush_tid, oldest_flush_tid, size, max_size;
        u64                     xattr_version;
+       u64                     change_attr;
        struct ceph_buffer      *xattr_buf;
        struct timespec64       atime, mtime, ctime, btime;
        int                     op, caps, wanted, dirty;
@@ -1244,15 +1246,10 @@ static int send_cap_msg(struct cap_msg_args *arg)
        /* pool namespace (version 8) (mds always ignores this) */
        ceph_encode_32(&p, 0);
 
-       /*
-        * btime and change_attr (version 9)
-        *
-        * We just zero these out for now, as the MDS ignores them unless
-        * the requisite feature flags are set (which we don't do yet).
-        */
+       /* btime and change_attr (version 9) */
        ceph_encode_timespec64(p, &arg->btime);
        p += sizeof(struct ceph_timespec);
-       ceph_encode_64(&p, 0);
+       ceph_encode_64(&p, arg->change_attr);
 
        /* Advisory flags (version 10) */
        ceph_encode_32(&p, arg->flags);
@@ -1379,6 +1376,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
        arg.atime = inode->i_atime;
        arg.ctime = inode->i_ctime;
        arg.btime = ci->i_btime;
+       arg.change_attr = inode_peek_iversion_raw(inode);
 
        arg.op = op;
        arg.caps = cap->implemented;
@@ -1439,6 +1437,7 @@ static inline int __send_flush_snap(struct inode *inode,
        arg.mtime = capsnap->mtime;
        arg.ctime = capsnap->ctime;
        arg.btime = capsnap->btime;
+       arg.change_attr = capsnap->change_attr;
 
        arg.op = CEPH_CAP_OP_FLUSHSNAP;
        arg.caps = capsnap->issued;
@@ -3043,6 +3042,7 @@ struct cap_extra_info {
        bool dirstat_valid;
        u64 nfiles;
        u64 nsubdirs;
+       u64 change_attr;
        /* currently issued */
        int issued;
        struct timespec64 btime;
@@ -3127,6 +3127,8 @@ static void handle_cap_grant(struct inode *inode,
 
        __check_cap_issue(ci, cap, newcaps);
 
+       inode_set_max_iversion_raw(inode, extra_info->change_attr);
+
        if ((newcaps & CEPH_CAP_AUTH_SHARED) &&
            (extra_info->issued & CEPH_CAP_AUTH_EXCL) == 0) {
                inode->i_mode = le32_to_cpu(grant->mode);
@@ -3856,14 +3858,13 @@ void ceph_handle_caps(struct ceph_mds_session *session,
 
        if (msg_version >= 9) {
                struct ceph_timespec *btime;
-               u64 change_attr;
 
                if (p + sizeof(*btime) > end)
                        goto bad;
                btime = p;
                ceph_decode_timespec64(&extra_info.btime, btime);
                p += sizeof(*btime);
-               ceph_decode_64_safe(&p, end, change_attr, bad);
+               ceph_decode_64_safe(&p, end, extra_info.change_attr, bad);
        }
 
        if (msg_version >= 11) {
index 854308e13f1294325dc94f736e927f6757512927..4c6494eb02b535df4c8f0f46d88ea1a8696304a5 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <linux/sort.h>
 #include <linux/slab.h>
+#include <linux/iversion.h>
 #include "super.h"
 #include "mds_client.h"
 #include <linux/ceph/decode.h>
@@ -607,6 +608,7 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
        capsnap->atime = inode->i_atime;
        capsnap->ctime = inode->i_ctime;
        capsnap->btime = ci->i_btime;
+       capsnap->change_attr = inode_peek_iversion_raw(inode);
        capsnap->time_warp_seq = ci->i_time_warp_seq;
        capsnap->truncate_size = ci->i_truncate_size;
        capsnap->truncate_seq = ci->i_truncate_seq;
index 2e20fc780f53ce7b339f5d5dcb38949eecbc6128..a592d4a8266cd02ae513e0f9e6a507b0bf6d8332 100644 (file)
@@ -197,6 +197,7 @@ struct ceph_cap_snap {
        u64 xattr_version;
 
        u64 size;
+       u64 change_attr;
        struct timespec64 mtime, atime, ctime, btime;
        u64 time_warp_seq;
        u64 truncate_size;