]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
orangefs: adjust counting code to recover from 665575cf
authorMike Marshall <hubcap@omnibond.com>
Wed, 4 Jun 2025 15:23:02 +0000 (11:23 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Jun 2025 11:15:56 +0000 (07:15 -0400)
A late commit to 6.14-rc7 (665575cf) broke orangefs. This is a several line
adjustment to some counters needed to keep orangefs from deadlocking
when writing page cache data out to the filesystem.

Signed-off-by: Mike Marshall <hubcap@omnibond.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/orangefs/inode.c

index 63d7c1ca0dfd35c90bb5e7728bb55e4275677333..a244f397a68c65564300176681fef91fc91db5d8 100644 (file)
@@ -32,12 +32,13 @@ static int orangefs_writepage_locked(struct page *page,
        len = i_size_read(inode);
        if (PagePrivate(page)) {
                wr = (struct orangefs_write_range *)page_private(page);
-               WARN_ON(wr->pos >= len);
                off = wr->pos;
-               if (off + wr->len > len)
+               if ((off + wr->len > len) && (off <= len))
                        wlen = len - off;
                else
                        wlen = wr->len;
+               if (wlen == 0)
+                       wlen = wr->len;
        } else {
                WARN_ON(1);
                off = page_offset(page);
@@ -46,8 +47,6 @@ static int orangefs_writepage_locked(struct page *page,
                else
                        wlen = PAGE_SIZE;
        }
-       /* Should've been handled in orangefs_invalidate_folio. */
-       WARN_ON(off == len || off + wlen > len);
 
        WARN_ON(wlen == 0);
        bvec_set_page(&bv, page, wlen, off % PAGE_SIZE);
@@ -340,6 +339,8 @@ static int orangefs_write_begin(struct file *file,
                        wr->len += len;
                        goto okay;
                } else {
+                       wr->pos = pos;
+                       wr->len = len;
                        ret = orangefs_launder_folio(folio);
                        if (ret)
                                return ret;