diff --git a/Makefile b/Makefile index 3874a2c0..c4a8f938 100644 --- a/Makefile +++ b/Makefile @@ -234,7 +234,7 @@ convert_objects = convert/main.o convert/common.o convert/source-fs.o \ mkfs/common.o mkfs_objects = mkfs/main.o mkfs/common.o mkfs/rootdir.o image_objects = image/main.o image/sanitize.o -tune_objects = tune/main.o +tune_objects = tune/main.o tune/seeding.o all_objects = $(objects) $(cmds_objects) $(libbtrfs_objects) $(convert_objects) \ $(mkfs_objects) $(image_objects) $(tune_objects) $(libbtrfsutil_objects) diff --git a/tune/main.c b/tune/main.c index afa4cc97..dc0f67d1 100644 --- a/tune/main.c +++ b/tune/main.c @@ -41,51 +41,12 @@ #include "common/string-utils.h" #include "common/help.h" #include "common/box.h" +#include "tune/tune.h" #include "ioctl.h" static char *device; static int force = 0; -static int update_seeding_flag(struct btrfs_root *root, int set_flag) -{ - struct btrfs_trans_handle *trans; - struct btrfs_super_block *disk_super; - u64 super_flags; - int ret; - - disk_super = root->fs_info->super_copy; - super_flags = btrfs_super_flags(disk_super); - if (set_flag) { - if (super_flags & BTRFS_SUPER_FLAG_SEEDING) { - if (force) - return 0; - else - warning("seeding flag is already set on %s", - device); - return 1; - } - if (btrfs_super_log_root(disk_super)) { - error("filesystem with dirty log detected, not setting seed flag"); - return 1; - } - super_flags |= BTRFS_SUPER_FLAG_SEEDING; - } else { - if (!(super_flags & BTRFS_SUPER_FLAG_SEEDING)) { - warning("seeding flag is not set on %s", device); - return 1; - } - super_flags &= ~BTRFS_SUPER_FLAG_SEEDING; - warning("seeding flag cleared on %s", device); - } - - trans = btrfs_start_transaction(root, 1); - BUG_ON(IS_ERR(trans)); - btrfs_set_super_flags(disk_super, super_flags); - ret = btrfs_commit_transaction(trans, root); - - return ret; -} - /* * Return 0 for no unfinished fsid change. * Return >0 for unfinished fsid change, and restore unfinished fsid/ @@ -1111,7 +1072,7 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[]) } } - ret = update_seeding_flag(root, seeding_value); + ret = update_seeding_flag(root, device, seeding_value, force); if (!ret) success++; total++; diff --git a/tune/seeding.c b/tune/seeding.c new file mode 100644 index 00000000..80b075e5 --- /dev/null +++ b/tune/seeding.c @@ -0,0 +1,61 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +#include "kerncompat.h" +#include "kernel-shared/ctree.h" +#include "kernel-shared/transaction.h" +#include "common/messages.h" + +int update_seeding_flag(struct btrfs_root *root, const char *device, int set_flag, int force) +{ + struct btrfs_trans_handle *trans; + struct btrfs_super_block *disk_super; + u64 super_flags; + int ret; + + disk_super = root->fs_info->super_copy; + super_flags = btrfs_super_flags(disk_super); + if (set_flag) { + if (super_flags & BTRFS_SUPER_FLAG_SEEDING) { + if (force) + return 0; + else + warning("seeding flag is already set on %s", + device); + return 1; + } + if (btrfs_super_log_root(disk_super)) { + error("filesystem with dirty log detected, not setting seed flag"); + return 1; + } + super_flags |= BTRFS_SUPER_FLAG_SEEDING; + } else { + if (!(super_flags & BTRFS_SUPER_FLAG_SEEDING)) { + warning("seeding flag is not set on %s", device); + return 1; + } + super_flags &= ~BTRFS_SUPER_FLAG_SEEDING; + warning("seeding flag cleared on %s", device); + } + + trans = btrfs_start_transaction(root, 1); + BUG_ON(IS_ERR(trans)); + btrfs_set_super_flags(disk_super, super_flags); + ret = btrfs_commit_transaction(trans, root); + + return ret; +} + diff --git a/tune/tune.h b/tune/tune.h new file mode 100644 index 00000000..7cc8b7f1 --- /dev/null +++ b/tune/tune.h @@ -0,0 +1,24 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +#ifndef __BTRFS_TUNE_H__ +#define __BTRFS_TUNE_H__ + +struct btrfs_root; + +int update_seeding_flag(struct btrfs_root *root, const char *device, int set_flag, int force); + +#endif