OSDN Git Service

Merge remote-tracking branch 'spi/for-5.8' into spi-next
[tomoyo/tomoyo-test1.git] / fs / btrfs / super.c
index 67c6385..7932d8d 100644 (file)
@@ -244,7 +244,7 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
 
-       trans->aborted = errno;
+       WRITE_ONCE(trans->aborted, errno);
        /* Nothing used. The other threads that have joined this
         * transaction may be able to continue. */
        if (!trans->dirty && list_empty(&trans->new_bgs)) {
@@ -873,7 +873,7 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
                        break;
 #endif
                case Opt_err:
-                       btrfs_info(info, "unrecognized mount option '%s'", p);
+                       btrfs_err(info, "unrecognized mount option '%s'", p);
                        ret = -EINVAL;
                        goto out;
                default:
@@ -1024,11 +1024,11 @@ out:
        return error;
 }
 
-static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
-                                          u64 subvol_objectid)
+char *btrfs_get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
+                                         u64 subvol_objectid)
 {
        struct btrfs_root *root = fs_info->tree_root;
-       struct btrfs_root *fs_root;
+       struct btrfs_root *fs_root = NULL;
        struct btrfs_root_ref *root_ref;
        struct btrfs_inode_ref *inode_ref;
        struct btrfs_key key;
@@ -1096,9 +1096,10 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
                key.objectid = subvol_objectid;
                key.type = BTRFS_ROOT_ITEM_KEY;
                key.offset = (u64)-1;
-               fs_root = btrfs_read_fs_root_no_name(fs_info, &key);
+               fs_root = btrfs_get_fs_root(fs_info, &key, true);
                if (IS_ERR(fs_root)) {
                        ret = PTR_ERR(fs_root);
+                       fs_root = NULL;
                        goto err;
                }
 
@@ -1143,6 +1144,8 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
                        ptr[0] = '/';
                        btrfs_release_path(path);
                }
+               btrfs_put_root(fs_root);
+               fs_root = NULL;
        }
 
        btrfs_free_path(path);
@@ -1155,6 +1158,7 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
        return name;
 
 err:
+       btrfs_put_root(fs_root);
        btrfs_free_path(path);
        kfree(name);
        return ERR_PTR(ret);
@@ -1438,8 +1442,8 @@ static struct dentry *mount_subvol(const char *subvol_name, u64 subvol_objectid,
                                goto out;
                        }
                }
-               subvol_name = get_subvol_name_from_objectid(btrfs_sb(mnt->mnt_sb),
-                                                           subvol_objectid);
+               subvol_name = btrfs_get_subvol_name_from_objectid(
+                                       btrfs_sb(mnt->mnt_sb), subvol_objectid);
                if (IS_ERR(subvol_name)) {
                        root = ERR_CAST(subvol_name);
                        subvol_name = NULL;
@@ -1518,14 +1522,17 @@ static struct dentry *btrfs_mount_root(struct file_system_type *fs_type,
        /*
         * Setup a dummy root and fs_info for test/set super.  This is because
         * we don't actually fill this stuff out until open_ctree, but we need
-        * it for searching for existing supers, so this lets us do that and
-        * then open_ctree will properly initialize everything later.
+        * then open_ctree will properly initialize the file system specific
+        * settings later.  btrfs_init_fs_info initializes the static elements
+        * of the fs_info (locks and such) to make cleanup easier if we find a
+        * superblock with our given fs_devices later on at sget() time.
         */
        fs_info = kvzalloc(sizeof(struct btrfs_fs_info), GFP_KERNEL);
        if (!fs_info) {
                error = -ENOMEM;
                goto error_sec_opts;
        }
+       btrfs_init_fs_info(fs_info);
 
        fs_info->super_copy = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_KERNEL);
        fs_info->super_for_commit = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_KERNEL);
@@ -1571,7 +1578,7 @@ static struct dentry *btrfs_mount_root(struct file_system_type *fs_type,
 
        if (s->s_root) {
                btrfs_close_devices(fs_devices);
-               free_fs_info(fs_info);
+               btrfs_free_fs_info(fs_info);
                if ((flags ^ s->s_flags) & SB_RDONLY)
                        error = -EBUSY;
        } else {
@@ -1594,7 +1601,7 @@ static struct dentry *btrfs_mount_root(struct file_system_type *fs_type,
 error_close_devices:
        btrfs_close_devices(fs_devices);
 error_fs_info:
-       free_fs_info(fs_info);
+       btrfs_free_fs_info(fs_info);
 error_sec_opts:
        security_free_mnt_opts(&new_sec_opts);
        return ERR_PTR(error);
@@ -2170,7 +2177,7 @@ static void btrfs_kill_super(struct super_block *sb)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(sb);
        kill_anon_super(sb);
-       free_fs_info(fs_info);
+       btrfs_free_fs_info(fs_info);
 }
 
 static struct file_system_type btrfs_fs_type = {
@@ -2203,7 +2210,7 @@ static int btrfs_control_open(struct inode *inode, struct file *file)
 }
 
 /*
- * used by btrfsctl to scan devices when no FS is mounted
+ * Used by /dev/btrfs-control for devices ioctls.
  */
 static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
                                unsigned long arg)