|
@@ -30,6 +30,7 @@ enum {
|
|
|
FAULT_INFO_RATE, /* struct f2fs_fault_info */
|
|
|
FAULT_INFO_TYPE, /* struct f2fs_fault_info */
|
|
|
#endif
|
|
|
+ RESERVED_BLOCKS,
|
|
|
};
|
|
|
|
|
|
struct f2fs_attr {
|
|
@@ -51,7 +52,7 @@ static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type)
|
|
|
return (unsigned char *)SM_I(sbi)->dcc_info;
|
|
|
else if (struct_type == NM_INFO)
|
|
|
return (unsigned char *)NM_I(sbi);
|
|
|
- else if (struct_type == F2FS_SBI)
|
|
|
+ else if (struct_type == F2FS_SBI || struct_type == RESERVED_BLOCKS)
|
|
|
return (unsigned char *)sbi;
|
|
|
#ifdef CONFIG_F2FS_FAULT_INJECTION
|
|
|
else if (struct_type == FAULT_INFO_RATE ||
|
|
@@ -111,6 +112,17 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
|
|
|
if (a->struct_type == FAULT_INFO_TYPE && t >= (1 << FAULT_MAX))
|
|
|
return -EINVAL;
|
|
|
#endif
|
|
|
+ if (a->struct_type == RESERVED_BLOCKS) {
|
|
|
+ spin_lock(&sbi->stat_lock);
|
|
|
+ if ((unsigned long)sbi->total_valid_block_count + t >
|
|
|
+ (unsigned long)sbi->user_block_count) {
|
|
|
+ spin_unlock(&sbi->stat_lock);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ *ui = t;
|
|
|
+ spin_unlock(&sbi->stat_lock);
|
|
|
+ return count;
|
|
|
+ }
|
|
|
*ui = t;
|
|
|
return count;
|
|
|
}
|
|
@@ -165,6 +177,7 @@ F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_no_gc_sleep_time, no_gc_sleep_time);
|
|
|
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle);
|
|
|
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments);
|
|
|
F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, max_small_discards, max_discards);
|
|
|
+F2FS_RW_ATTR(RESERVED_BLOCKS, f2fs_sb_info, reserved_blocks, reserved_blocks);
|
|
|
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, batched_trim_sections, trim_sections);
|
|
|
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy);
|
|
|
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_ipu_util, min_ipu_util);
|
|
@@ -208,6 +221,7 @@ static struct attribute *f2fs_attrs[] = {
|
|
|
ATTR_LIST(inject_type),
|
|
|
#endif
|
|
|
ATTR_LIST(lifetime_write_kbytes),
|
|
|
+ ATTR_LIST(reserved_blocks),
|
|
|
NULL,
|
|
|
};
|
|
|
|