|
@@ -1402,6 +1402,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;
|
|
|
/*
|
|
@@ -2103,6 +2108,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)) \
|
|
@@ -2117,6 +2123,45 @@ 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_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
|
|
|
*/
|