if (!cps->clp) /* Always set for v4.0. Set in cb_sequence for v4.1 */
                goto out;
 
-       res->bitmap[0] = res->bitmap[1] = 0;
+       memset(res->bitmap, 0, sizeof(res->bitmap));
        res->status = htonl(NFS4ERR_BADHANDLE);
 
        dprintk_rcu("NFS: GETATTR callback request from %s\n",
        res->change_attr = delegation->change_attr;
        if (nfs_have_writebacks(inode))
                res->change_attr++;
+       res->atime = inode_get_atime(inode);
        res->ctime = inode_get_ctime(inode);
        res->mtime = inode_get_mtime(inode);
-       res->bitmap[0] = (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE) &
-               args->bitmap[0];
-       res->bitmap[1] = (FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY) &
-               args->bitmap[1];
+       res->bitmap[0] = (FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE) &
+                        args->bitmap[0];
+       res->bitmap[1] = (FATTR4_WORD1_TIME_ACCESS |
+                         FATTR4_WORD1_TIME_METADATA |
+                         FATTR4_WORD1_TIME_MODIFY) & args->bitmap[1];
+       res->bitmap[2] = (FATTR4_WORD2_TIME_DELEG_ACCESS |
+                         FATTR4_WORD2_TIME_DELEG_MODIFY) & args->bitmap[2];
        res->status = 0;
 out_iput:
        rcu_read_unlock();
 
 #define CB_OP_GETATTR_BITMAP_MAXSZ     (4 * 4) // bitmap length, 3 bitmaps
 #define CB_OP_GETATTR_RES_MAXSZ                (CB_OP_HDR_RES_MAXSZ + \
                                         CB_OP_GETATTR_BITMAP_MAXSZ + \
-                                        /* change, size, ctime, mtime */\
-                                        (2 + 2 + 3 + 3) * 4)
+                                        /* change, size, atime, ctime,
+                                         * mtime, deleg_atime, deleg_mtime */\
+                                        (2 + 2 + 3 + 3 + 3 + 3 + 3) * 4)
 #define CB_OP_RECALL_RES_MAXSZ         (CB_OP_HDR_RES_MAXSZ)
 
 #if defined(CONFIG_NFS_V4_1)
        return 0;
 }
 
+static __be32 encode_attr_atime(struct xdr_stream *xdr, const uint32_t *bitmap, const struct timespec64 *time)
+{
+       if (!(bitmap[1] & FATTR4_WORD1_TIME_ACCESS))
+               return 0;
+       return encode_attr_time(xdr,time);
+}
+
 static __be32 encode_attr_ctime(struct xdr_stream *xdr, const uint32_t *bitmap, const struct timespec64 *time)
 {
        if (!(bitmap[1] & FATTR4_WORD1_TIME_METADATA))
        return encode_attr_time(xdr,time);
 }
 
+static __be32 encode_attr_delegatime(struct xdr_stream *xdr,
+                                    const uint32_t *bitmap,
+                                    const struct timespec64 *time)
+{
+       if (!(bitmap[2] & FATTR4_WORD2_TIME_DELEG_ACCESS))
+               return 0;
+       return encode_attr_time(xdr,time);
+}
+
+static __be32 encode_attr_delegmtime(struct xdr_stream *xdr,
+                                    const uint32_t *bitmap,
+                                    const struct timespec64 *time)
+{
+       if (!(bitmap[2] & FATTR4_WORD2_TIME_DELEG_MODIFY))
+               return 0;
+       return encode_attr_time(xdr,time);
+}
+
 static __be32 encode_compound_hdr_res(struct xdr_stream *xdr, struct cb_compound_hdr_res *hdr)
 {
        __be32 status;
        if (unlikely(status != 0))
                goto out;
        status = encode_attr_size(xdr, res->bitmap, res->size);
+       if (unlikely(status != 0))
+               goto out;
+       status = encode_attr_atime(xdr, res->bitmap, &res->atime);
        if (unlikely(status != 0))
                goto out;
        status = encode_attr_ctime(xdr, res->bitmap, &res->ctime);
        if (unlikely(status != 0))
                goto out;
        status = encode_attr_mtime(xdr, res->bitmap, &res->mtime);
+       if (unlikely(status != 0))
+               goto out;
+       status = encode_attr_delegatime(xdr, res->bitmap, &res->atime);
+       if (unlikely(status != 0))
+               goto out;
+       status = encode_attr_delegmtime(xdr, res->bitmap, &res->mtime);
        *savep = htonl((unsigned int)((char *)xdr->p - (char *)(savep+1)));
 out:
        return status;