|
@@ -1407,6 +1407,11 @@ struct btrfs_fs_info {
|
|
|
*/
|
|
|
u64 last_trans_log_full_commit;
|
|
|
unsigned long mount_opt;
|
|
|
+ /*
|
|
|
+ * Track requests for actions that need to be done during transaction
|
|
|
+ * commit (like for some mount options).
|
|
|
+ */
|
|
|
+ unsigned long pending_changes;
|
|
|
unsigned long compress_type:4;
|
|
|
int commit_interval;
|
|
|
/*
|
|
@@ -2098,7 +2103,6 @@ struct btrfs_ioctl_defrag_range_args {
|
|
|
#define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 21)
|
|
|
#define BTRFS_MOUNT_PANIC_ON_FATAL_ERROR (1 << 22)
|
|
|
#define BTRFS_MOUNT_RESCAN_UUID_TREE (1 << 23)
|
|
|
-#define BTRFS_MOUNT_CHANGE_INODE_CACHE (1 << 24)
|
|
|
|
|
|
#define BTRFS_DEFAULT_COMMIT_INTERVAL (30)
|
|
|
#define BTRFS_DEFAULT_MAX_INLINE (8192)
|
|
@@ -2108,6 +2112,7 @@ struct btrfs_ioctl_defrag_range_args {
|
|
|
#define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt)
|
|
|
#define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \
|
|
|
BTRFS_MOUNT_##opt)
|
|
|
+
|
|
|
#define btrfs_set_and_info(root, opt, fmt, args...) \
|
|
|
{ \
|
|
|
if (!btrfs_test_opt(root, opt)) \
|
|
@@ -2122,6 +2127,49 @@ struct btrfs_ioctl_defrag_range_args {
|
|
|
btrfs_clear_opt(root->fs_info->mount_opt, opt); \
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Requests for changes that need to be done during transaction commit.
|
|
|
+ *
|
|
|
+ * Internal mount options that are used for special handling of the real
|
|
|
+ * mount options (eg. cannot be set during remount and have to be set during
|
|
|
+ * transaction commit)
|
|
|
+ */
|
|
|
+
|
|
|
+#define BTRFS_PENDING_SET_INODE_MAP_CACHE (0)
|
|
|
+#define BTRFS_PENDING_CLEAR_INODE_MAP_CACHE (1)
|
|
|
+#define BTRFS_PENDING_COMMIT (2)
|
|
|
+
|
|
|
+#define btrfs_test_pending(info, opt) \
|
|
|
+ test_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
|
|
|
+#define btrfs_set_pending(info, opt) \
|
|
|
+ set_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
|
|
|
+#define btrfs_clear_pending(info, opt) \
|
|
|
+ clear_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
|
|
|
+
|
|
|
+/*
|
|
|
+ * Helpers for setting pending mount option changes.
|
|
|
+ *
|
|
|
+ * Expects corresponding macros
|
|
|
+ * BTRFS_PENDING_SET_ and CLEAR_ + short mount option name
|
|
|
+ */
|
|
|
+#define btrfs_set_pending_and_info(info, opt, fmt, args...) \
|
|
|
+do { \
|
|
|
+ if (!btrfs_raw_test_opt((info)->mount_opt, opt)) { \
|
|
|
+ btrfs_info((info), fmt, ##args); \
|
|
|
+ btrfs_set_pending((info), SET_##opt); \
|
|
|
+ btrfs_clear_pending((info), CLEAR_##opt); \
|
|
|
+ } \
|
|
|
+} while(0)
|
|
|
+
|
|
|
+#define btrfs_clear_pending_and_info(info, opt, fmt, args...) \
|
|
|
+do { \
|
|
|
+ if (btrfs_raw_test_opt((info)->mount_opt, opt)) { \
|
|
|
+ btrfs_info((info), fmt, ##args); \
|
|
|
+ btrfs_set_pending((info), CLEAR_##opt); \
|
|
|
+ btrfs_clear_pending((info), SET_##opt); \
|
|
|
+ } \
|
|
|
+} while(0)
|
|
|
+
|
|
|
/*
|
|
|
* Inode flags
|
|
|
*/
|