]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ceph: fix incorrect revoked caps assert in ceph_fill_file_size()
authorXiubo Li <xiubli@redhat.com>
Wed, 6 Sep 2023 06:22:07 +0000 (14:22 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Oct 2023 21:05:36 +0000 (23:05 +0200)
commit 15c0a870dc44ed14e01efbdd319d232234ee639f upstream.

When truncating the inode the MDS will acquire the xlock for the
ifile Locker, which will revoke the 'Frwsxl' caps from the clients.
But when the client just releases and flushes the 'Fw' caps to MDS,
for exmaple, and once the MDS receives the caps flushing msg it
just thought the revocation has finished. Then the MDS will continue
truncating the inode and then issued the truncate notification to
all the clients. While just before the clients receives the cap
flushing ack they receive the truncation notification, the clients
will detecte that the 'issued | dirty' is still holding the 'Fw'
caps.

Cc: stable@vger.kernel.org
Link: https://tracker.ceph.com/issues/56693
Fixes: b0d7c2231015 ("ceph: introduce i_truncate_mutex")
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Milind Changire <mchangir@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ceph/inode.c

index 42e449d3f18b807636eb64cd5f25672553e8d2c9..28281c83cf5f6824d95b9046e89896ed7d3cd9e1 100644 (file)
@@ -647,9 +647,7 @@ int ceph_fill_file_size(struct inode *inode, int issued,
                        ci->i_truncate_seq = truncate_seq;
 
                        /* the MDS should have revoked these caps */
-                       WARN_ON_ONCE(issued & (CEPH_CAP_FILE_EXCL |
-                                              CEPH_CAP_FILE_RD |
-                                              CEPH_CAP_FILE_WR |
+                       WARN_ON_ONCE(issued & (CEPH_CAP_FILE_RD |
                                               CEPH_CAP_FILE_LAZYIO));
                        /*
                         * If we hold relevant caps, or in the case where we're