ksmbd: set v2 lease version on lease upgrade
[platform/kernel/linux-starfive.git] / fs / super.c
index 1db67a6..2d762ce 100644 (file)
@@ -1209,7 +1209,9 @@ static void do_thaw_all_callback(struct super_block *sb)
        bool born = super_lock_excl(sb);
 
        if (born && sb->s_root) {
-               emergency_thaw_bdev(sb);
+               if (IS_ENABLED(CONFIG_BLOCK))
+                       while (sb->s_bdev && !thaw_bdev(sb->s_bdev))
+                               pr_warn("Emergency Thaw on %pg\n", sb->s_bdev);
                thaw_super_locked(sb, FREEZE_HOLDER_USERSPACE);
        } else {
                super_unlock_excl(sb);
@@ -1371,6 +1373,50 @@ int get_tree_keyed(struct fs_context *fc,
 }
 EXPORT_SYMBOL(get_tree_keyed);
 
+static int set_bdev_super(struct super_block *s, void *data)
+{
+       s->s_dev = *(dev_t *)data;
+       return 0;
+}
+
+static int super_s_dev_set(struct super_block *s, struct fs_context *fc)
+{
+       return set_bdev_super(s, fc->sget_key);
+}
+
+static int super_s_dev_test(struct super_block *s, struct fs_context *fc)
+{
+       return !(s->s_iflags & SB_I_RETIRED) &&
+               s->s_dev == *(dev_t *)fc->sget_key;
+}
+
+/**
+ * sget_dev - Find or create a superblock by device number
+ * @fc: Filesystem context.
+ * @dev: device number
+ *
+ * Find or create a superblock using the provided device number that
+ * will be stored in fc->sget_key.
+ *
+ * If an extant superblock is matched, then that will be returned with
+ * an elevated reference count that the caller must transfer or discard.
+ *
+ * If no match is made, a new superblock will be allocated and basic
+ * initialisation will be performed (s_type, s_fs_info, s_id, s_dev will
+ * be set). The superblock will be published and it will be returned in
+ * a partially constructed state with SB_BORN and SB_ACTIVE as yet
+ * unset.
+ *
+ * Return: an existing or newly created superblock on success, an error
+ *         pointer on failure.
+ */
+struct super_block *sget_dev(struct fs_context *fc, dev_t dev)
+{
+       fc->sget_key = &dev;
+       return sget_fc(fc, super_s_dev_test, super_s_dev_set);
+}
+EXPORT_SYMBOL(sget_dev);
+
 #ifdef CONFIG_BLOCK
 /*
  * Lock a super block that the callers holds a reference to.
@@ -1429,23 +1475,6 @@ const struct blk_holder_ops fs_holder_ops = {
 };
 EXPORT_SYMBOL_GPL(fs_holder_ops);
 
-static int set_bdev_super(struct super_block *s, void *data)
-{
-       s->s_dev = *(dev_t *)data;
-       return 0;
-}
-
-static int set_bdev_super_fc(struct super_block *s, struct fs_context *fc)
-{
-       return set_bdev_super(s, fc->sget_key);
-}
-
-static int test_bdev_super_fc(struct super_block *s, struct fs_context *fc)
-{
-       return !(s->s_iflags & SB_I_RETIRED) &&
-               s->s_dev == *(dev_t *)fc->sget_key;
-}
-
 int setup_bdev_super(struct super_block *sb, int sb_flags,
                struct fs_context *fc)
 {
@@ -1523,8 +1552,7 @@ int get_tree_bdev(struct fs_context *fc,
        }
 
        fc->sb_flags |= SB_NOSEC;
-       fc->sget_key = &dev;
-       s = sget_fc(fc, test_bdev_super_fc, set_bdev_super_fc);
+       s = sget_dev(fc, dev);
        if (IS_ERR(s))
                return PTR_ERR(s);