ceph: switch back to testing for NULL folio->private in ceph_dirty_folio
authorJeff Layton <jlayton@kernel.org>
Fri, 10 Jun 2022 15:40:13 +0000 (11:40 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 2 Aug 2022 22:54:12 +0000 (00:54 +0200)
Willy requested that we change this back to warning on folio->private
being non-NULl. He's trying to kill off the PG_private flag, and so we'd
like to catch where it's non-NULL.

Add a VM_WARN_ON_FOLIO (since it doesn't exist yet) and change over to
using that instead of VM_BUG_ON_FOLIO along with testing the ->private
pointer.

[ xiubli: define VM_WARN_ON_FOLIO macro in case DEBUG_VM is disabled
  reported by kernel test robot <lkp@intel.com> ]

Cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/addr.c
include/linux/mmdebug.h

index 01fe75b..31fc04e 100644 (file)
@@ -122,7 +122,7 @@ static bool ceph_dirty_folio(struct address_space *mapping, struct folio *folio)
         * Reference snap context in folio->private.  Also set
         * PagePrivate so that we get invalidate_folio callback.
         */
-       VM_BUG_ON_FOLIO(folio_test_private(folio), folio);
+       VM_WARN_ON_FOLIO(folio->private, folio);
        folio_attach_private(folio, snapc);
 
        return ceph_fscache_dirty_folio(mapping, folio);
index d7285f8..15ae78c 100644 (file)
@@ -54,6 +54,15 @@ void dump_mm(const struct mm_struct *mm);
        }                                                               \
        unlikely(__ret_warn_once);                                      \
 })
+#define VM_WARN_ON_FOLIO(cond, folio)          ({                      \
+       int __ret_warn = !!(cond);                                      \
+                                                                       \
+       if (unlikely(__ret_warn)) {                                     \
+               dump_page(&folio->page, "VM_WARN_ON_FOLIO(" __stringify(cond)")");\
+               WARN_ON(1);                                             \
+       }                                                               \
+       unlikely(__ret_warn);                                           \
+})
 #define VM_WARN_ON_ONCE_FOLIO(cond, folio)     ({                      \
        static bool __section(".data.once") __warned;                   \
        int __ret_warn_once = !!(cond);                                 \
@@ -79,6 +88,7 @@ void dump_mm(const struct mm_struct *mm);
 #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN_ON_ONCE_PAGE(cond, page)  BUILD_BUG_ON_INVALID(cond)
+#define VM_WARN_ON_FOLIO(cond, folio)  BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN_ON_ONCE_FOLIO(cond, folio)  BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond)