Btrfs: enhance btrfs structures for device replace support
authorStefan Behrens <sbehrens@giantdisaster.de>
Mon, 5 Nov 2012 16:26:40 +0000 (17:26 +0100)
committerJosef Bacik <jbacik@fusionio.com>
Wed, 12 Dec 2012 22:15:37 +0000 (17:15 -0500)
Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/ctree.h
fs/btrfs/disk-io.c

index f8bb62c82b0c5e8a6c9037546eb90c0c3cffd8c2..0781fd4a5c1afee241852d07ef6e551520761900 100644 (file)
@@ -885,6 +885,42 @@ struct btrfs_dev_stats_item {
        __le64 values[BTRFS_DEV_STAT_VALUES_MAX];
 } __attribute__ ((__packed__));
 
+#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS    0
+#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID     1
+#define BTRFS_DEV_REPLACE_ITEM_STATE_NEVER_STARTED     0
+#define BTRFS_DEV_REPLACE_ITEM_STATE_STARTED           1
+#define BTRFS_DEV_REPLACE_ITEM_STATE_SUSPENDED         2
+#define BTRFS_DEV_REPLACE_ITEM_STATE_FINISHED          3
+#define BTRFS_DEV_REPLACE_ITEM_STATE_CANCELED          4
+
+struct btrfs_dev_replace {
+       u64 replace_state;      /* see #define above */
+       u64 time_started;       /* seconds since 1-Jan-1970 */
+       u64 time_stopped;       /* seconds since 1-Jan-1970 */
+       atomic64_t num_write_errors;
+       atomic64_t num_uncorrectable_read_errors;
+
+       u64 cursor_left;
+       u64 committed_cursor_left;
+       u64 cursor_left_last_write_of_item;
+       u64 cursor_right;
+
+       u64 cont_reading_from_srcdev_mode;      /* see #define above */
+
+       int is_valid;
+       int item_needs_writeback;
+       struct btrfs_device *srcdev;
+       struct btrfs_device *tgtdev;
+
+       pid_t lock_owner;
+       atomic_t nesting_level;
+       struct mutex lock_finishing_cancel_unmount;
+       struct mutex lock_management_lock;
+       struct mutex lock;
+
+       struct btrfs_scrub_progress scrub_progress;
+};
+
 /* different types of block groups (and chunks) */
 #define BTRFS_BLOCK_GROUP_DATA         (1ULL << 0)
 #define BTRFS_BLOCK_GROUP_SYSTEM       (1ULL << 1)
@@ -1471,6 +1507,9 @@ struct btrfs_fs_info {
        int backup_root_index;
 
        int num_tolerated_disk_barrier_failures;
+
+       /* device replace state */
+       struct btrfs_dev_replace dev_replace;
 };
 
 /*
index 42a8024e935f0f34680bbf02cb9489844e91c4f0..9d1b710608137ca95956460f949e2ead8f4871af 100644 (file)
@@ -2131,6 +2131,11 @@ int open_ctree(struct super_block *sb,
        init_rwsem(&fs_info->extent_commit_sem);
        init_rwsem(&fs_info->cleanup_work_sem);
        init_rwsem(&fs_info->subvol_sem);
+       fs_info->dev_replace.lock_owner = 0;
+       atomic_set(&fs_info->dev_replace.nesting_level, 0);
+       mutex_init(&fs_info->dev_replace.lock_finishing_cancel_unmount);
+       mutex_init(&fs_info->dev_replace.lock_management_lock);
+       mutex_init(&fs_info->dev_replace.lock);
 
        spin_lock_init(&fs_info->qgroup_lock);
        fs_info->qgroup_tree = RB_ROOT;