Merge tag 'for-linus-5.10-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 18 Oct 2020 16:56:50 +0000 (09:56 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 18 Oct 2020 16:56:50 +0000 (09:56 -0700)
Pull more ubi and ubifs updates from Richard Weinberger:
 "UBI:
   - Correctly use kthread_should_stop in ubi worker

  UBIFS:
   - Fixes for memory leaks while iterating directory entries
   - Fix for a user triggerable error message
   - Fix for a space accounting bug in authenticated mode"

* tag 'for-linus-5.10-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs:
  ubifs: journal: Make sure to not dirty twice for auth nodes
  ubifs: setflags: Don't show error message when vfs_ioc_setflags_prepare() fails
  ubifs: ubifs_jnl_change_xattr: Remove assertion 'nlink > 0' for host inode
  ubi: check kthread_should_stop() after the setting of task state
  ubifs: dent: Fix some potential memory leaks while iterating entries
  ubifs: xattr: Fix some potential memory leaks while iterating entries

drivers/mtd/ubi/wl.c
fs/ubifs/debug.c
fs/ubifs/ioctl.c
fs/ubifs/journal.c
fs/ubifs/orphan.c
fs/ubifs/tnc.c
fs/ubifs/xattr.c

index 42cac57..7847de7 100644 (file)
@@ -1639,6 +1639,19 @@ int ubi_thread(void *u)
                    !ubi->thread_enabled || ubi_dbg_is_bgt_disabled(ubi)) {
                        set_current_state(TASK_INTERRUPTIBLE);
                        spin_unlock(&ubi->wl_lock);
+
+                       /*
+                        * Check kthread_should_stop() after we set the task
+                        * state to guarantee that we either see the stop bit
+                        * and exit or the task state is reset to runnable such
+                        * that it's not scheduled out indefinitely and detects
+                        * the stop bit at kthread_should_stop().
+                        */
+                       if (kthread_should_stop()) {
+                               set_current_state(TASK_RUNNING);
+                               break;
+                       }
+
                        schedule();
                        continue;
                }
index 31288d8..ebff43f 100644 (file)
@@ -1123,6 +1123,7 @@ int dbg_check_dir(struct ubifs_info *c, const struct inode *dir)
                        err = PTR_ERR(dent);
                        if (err == -ENOENT)
                                break;
+                       kfree(pdent);
                        return err;
                }
 
index 3df9be2..4363d85 100644 (file)
@@ -134,7 +134,6 @@ static int setflags(struct inode *inode, int flags)
        return err;
 
 out_unlock:
-       ubifs_err(c, "can't modify inode %lu attributes", inode->i_ino);
        mutex_unlock(&ui->ui_mutex);
        ubifs_release_budget(c, &req);
        return err;
index 4a5b06f..091c2ad 100644 (file)
@@ -894,6 +894,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
                                if (err == -ENOENT)
                                        break;
 
+                               kfree(pxent);
                                goto out_release;
                        }
 
@@ -906,6 +907,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
                                ubifs_err(c, "dead directory entry '%s', error %d",
                                          xent->name, err);
                                ubifs_ro_mode(c, err);
+                               kfree(pxent);
                                kfree(xent);
                                goto out_release;
                        }
@@ -936,8 +938,6 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
                                          inode->i_ino);
        release_head(c, BASEHD);
 
-       ubifs_add_auth_dirt(c, lnum);
-
        if (last_reference) {
                err = ubifs_tnc_remove_ino(c, inode->i_ino);
                if (err)
@@ -947,6 +947,8 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
        } else {
                union ubifs_key key;
 
+               ubifs_add_auth_dirt(c, lnum);
+
                ino_key_init(c, &key, inode->i_ino);
                err = ubifs_tnc_add(c, &key, lnum, offs, ilen, hash);
        }
@@ -1798,7 +1800,6 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
        u8 hash[UBIFS_HASH_ARR_SZ];
 
        dbg_jnl("ino %lu, ino %lu", host->i_ino, inode->i_ino);
-       ubifs_assert(c, host->i_nlink > 0);
        ubifs_assert(c, inode->i_nlink > 0);
        ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex));
 
index 2c29408..0fb6195 100644 (file)
@@ -173,6 +173,7 @@ int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)
                        err = PTR_ERR(xent);
                        if (err == -ENOENT)
                                break;
+                       kfree(pxent);
                        return err;
                }
 
@@ -182,6 +183,7 @@ int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)
 
                xattr_orphan = orphan_add(c, xattr_inum, orphan);
                if (IS_ERR(xattr_orphan)) {
+                       kfree(pxent);
                        kfree(xent);
                        return PTR_ERR(xattr_orphan);
                }
index de21625..894f1ab 100644 (file)
@@ -2884,6 +2884,7 @@ int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
                        err = PTR_ERR(xent);
                        if (err == -ENOENT)
                                break;
+                       kfree(pxent);
                        return err;
                }
 
@@ -2897,6 +2898,7 @@ int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
                fname_len(&nm) = le16_to_cpu(xent->nlen);
                err = ubifs_tnc_remove_nm(c, &key1, &nm);
                if (err) {
+                       kfree(pxent);
                        kfree(xent);
                        return err;
                }
@@ -2905,6 +2907,7 @@ int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
                highest_ino_key(c, &key2, xattr_inum);
                err = ubifs_tnc_remove_range(c, &key1, &key2);
                if (err) {
+                       kfree(pxent);
                        kfree(xent);
                        return err;
                }
index 9aefbb6..a0b9b34 100644 (file)
@@ -522,6 +522,7 @@ int ubifs_purge_xattrs(struct inode *host)
                                  xent->name, err);
                        ubifs_ro_mode(c, err);
                        kfree(pxent);
+                       kfree(xent);
                        return err;
                }
 
@@ -531,6 +532,7 @@ int ubifs_purge_xattrs(struct inode *host)
                err = remove_xattr(c, host, xino, &nm);
                if (err) {
                        kfree(pxent);
+                       kfree(xent);
                        iput(xino);
                        ubifs_err(c, "cannot remove xattr, error %d", err);
                        return err;