]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gfs2: Fix "Introduce flag for glock holder auto-demotion"
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 8 Nov 2021 15:08:07 +0000 (16:08 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 8 Nov 2021 15:29:28 +0000 (16:29 +0100)
Function demote_incompat_holders iterates over the list of glock holders
with list_for_each_entry, and it then sometimes removes the current
holder from the list.  This will get the loop stuck; we must use
list_for_each_entry_safe instead.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/glock.c

index 258d8aae7c5355004f987a72b70456c908e3f6c9..8dbd6fe664204b8a7bee7b8908fdbe6c3aa312b2 100644 (file)
@@ -411,14 +411,14 @@ static void do_error(struct gfs2_glock *gl, const int ret)
 static void demote_incompat_holders(struct gfs2_glock *gl,
                                    struct gfs2_holder *new_gh)
 {
-       struct gfs2_holder *gh;
+       struct gfs2_holder *gh, *tmp;
 
        /*
         * Demote incompatible holders before we make ourselves eligible.
         * (This holder may or may not allow auto-demoting, but we don't want
         * to demote the new holder before it's even granted.)
         */
-       list_for_each_entry(gh, &gl->gl_holders, gh_list) {
+       list_for_each_entry_safe(gh, tmp, &gl->gl_holders, gh_list) {
                /*
                 * Since holders are at the front of the list, we stop when we
                 * find the first non-holder.