f2fs: show precise # of blocks that user/root can use
Jaegeuk Kim
maintainerPATCH 1/2 f2fs: show precise # of blocks that user/root can use
Let's show precise # of blocks that user/root can use through bavail and bfree respectively.
--- fs/f2fs/super.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/f2fs/super.c +2 -2
@@ -1005,9 +1005,9 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_bsize = sbi->blocksize; buf->f_blocks = total_count - start_count; - buf->f_bfree = user_block_count -valid_user_blocks (sbi) + ovp_count; - buf->f_bavail = user_block_count -valid_user_blocks (sbi) - + buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; + buf->f_bavail = buf->f_bfree; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
Signature · 1 line
2.15.0.531.g2ccb3012c9-goog
Jaegeuk Kim
maintainerPATCH 2/2 f2fs: add reserved blocks for root user
This patch allows root to reserve some blocks via mount option.
"-o reserve_root=N" means N x 4KB-sized blocks for root only.
--- fs/f2fs/f2fs.h | 26 ++++++++++++++++++++++---- fs/f2fs/super.c | 29 ++++++++++++++++++++++++++--- fs/f2fs/sysfs.c | 3 ++- 3 files changed, 50 insertions(+), 8 deletions(-)
fs/f2fs/f2fs.h +22 -4
@@ -95,6 +95,7 @@ extern char *fault_name[FAULT_MAX];#define F2FS_MOUNT_PRJQUOTA 0x00200000#define F2FS_MOUNT_QUOTA 0x00400000#define F2FS_MOUNT_INLINE_XATTR_SIZE 0x00800000 +#define F2FS_MOUNT_RESERVE_ROOT 0x01000000#define clear_opt (sbi, option) ((sbi)->mount_opt.opt &= ~F2FS_MOUNT_##option)#define set_opt (sbi, option) ((sbi)->mount_opt.opt |= F2FS_MOUNT_##option)
@@ -1109,6 +1110,7 @@ struct f2fs_sb_info {block_t last_valid_block_count;/* for recovery */ block_t reserved_blocks;/* configurable reserved blocks */ block_t current_reserved_blocks;/* current reserved blocks */ +block_t root_reserved_blocks;/* root reserved blocks */ unsigned int nquota_files;/* # of quota sysfile */
@@ -1561,6 +1563,12 @@ static inline bool f2fs_has_xattr_block(unsigned int ofs)return ofs ==XATTR_NODE_OFFSET ; } +static inline block_t reserve_root_limit (struct f2fs_sb_info *sbi) +{ +/* limit is 0.2% */ +return (sbi->user_block_count <<1 ) /1000 ; +} +static inline void f2fs_i_blocks_write (struct inode *,block_t ,bool ,bool );static inline int inc_valid_block_count (struct f2fs_sb_info *sbi,struct inode *inode,blkcnt_t *count)
@@ -1590,11 +1598,17 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, sbi->total_valid_block_count += (block_t)(*count); avail_user_block_count = sbi->user_block_count - sbi->current_reserved_blocks; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + avail_user_block_count -= sbi->root_reserved_blocks; +if (unlikely (sbi->total_valid_block_count > avail_user_block_count)) { diff = sbi->total_valid_block_count - avail_user_block_count; +if (diff > *count) + diff = *count; *count -= diff; release = diff; - sbi->total_valid_block_count = avail_user_block_count; + sbi->total_valid_block_count -= diff;if (!*count) {spin_unlock (&sbi->stat_lock);percpu_counter_sub (&sbi->alloc_valid_block_count, diff);
@@ -1783,9 +1797,13 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi,spin_lock (&sbi->stat_lock); - valid_block_count = sbi->total_valid_block_count +1 ; -if (unlikely (valid_block_count + sbi->current_reserved_blocks > - sbi->user_block_count)) { + valid_block_count = sbi->total_valid_block_count + + sbi->current_reserved_blocks +1 ; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + valid_block_count += sbi->root_reserved_blocks; + +if (unlikely (valid_block_count > sbi->user_block_count)) {spin_unlock (&sbi->stat_lock); goto enospc; }
fs/f2fs/super.c +26 -3
@@ -107,6 +107,7 @@ enum { Opt_noextent_cache, Opt_noinline_data, Opt_data_flush, + Opt_reserve_root, Opt_mode, Opt_io_size_bits, Opt_fault_injection,
@@ -157,6 +158,7 @@ static match_table_t f2fs_tokens = { {Opt_noextent_cache, "noextent_cache"}, {Opt_noinline_data, "noinline_data"}, {Opt_data_flush, "data_flush"}, + {Opt_reserve_root, "reserve_root=%u"}, {Opt_mode, "mode=%s"}, {Opt_io_size_bits, "io_bits=%u"}, {Opt_fault_injection, "fault_injection=%u"},
@@ -488,6 +490,18 @@ static int parse_options(struct super_block *sb, char *options)case Opt_data_flush:set_opt (sbi,DATA_FLUSH );break ; +case Opt_reserve_root: +if (args->from &&match_int (args, &arg)) +return -EINVAL ; +if (test_opt (sbi,RESERVE_ROOT )) { +f2fs_msg (sb,KERN_INFO , +"Preserve previous reserve_root=%u" , + sbi->root_reserved_blocks); + }else { + sbi->root_reserved_blocks = arg; +set_opt (sbi,RESERVE_ROOT ); + } +break ;case Opt_mode: name =match_strdup (&args[0 ]);
@@ -994,20 +1008,19 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)struct super_block *sb = dentry->d_sb;struct f2fs_sb_info *sbi =F2FS_SB (sb);u64 id =huge_encode_dev (sb->s_bdev->bd_dev); -block_t total_count, user_block_count, start_count, ovp_count; +block_t total_count, user_block_count, start_count;u64 avail_node_count; total_count =le64_to_cpu (sbi->raw_super->block_count); user_block_count = sbi->user_block_count; start_count =le32_to_cpu (sbi->raw_super->segment0_blkaddr); - ovp_count =SM_I (sbi)->ovp_segments << sbi->log_blocks_per_seg; buf->f_type =F2FS_SUPER_MAGIC ; buf->f_bsize = sbi->blocksize; buf->f_blocks = total_count - start_count; buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; - buf->f_bavail = buf->f_bfree; + buf->f_bavail = buf->f_bfree - sbi->root_reserved_blocks; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
@@ -1136,6 +1149,9 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)else if (test_opt (sbi,LFS ))seq_puts (seq,"lfs" );seq_printf (seq,",active_logs=%u" , sbi->active_logs); +if (test_opt (sbi,RESERVE_ROOT )) +seq_printf (seq,",reserve_root=%u" , + sbi->root_reserved_blocks);if (F2FS_IO_SIZE_BITS (sbi))seq_printf (seq,",io_size=%uKB" ,F2FS_IO_SIZE_KB (sbi));#ifdef CONFIG_F2FS_FAULT_INJECTION
@@ -2571,6 +2587,13 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) sbi->reserved_blocks =0 ; sbi->current_reserved_blocks =0 ; +if (test_opt (sbi,RESERVE_ROOT ) && + sbi->root_reserved_blocks >reserve_root_limit (sbi)) { + sbi->root_reserved_blocks =reserve_root_limit (sbi); +f2fs_msg (sb,KERN_INFO , +"Reduce reserved blocks for root = %u" , + sbi->root_reserved_blocks); + }for (i =0 ; i <NR_INODE_TYPE ; i++) {INIT_LIST_HEAD (&sbi->inode_list[i]);spin_lock_init (&sbi->inode_lock[i]);
fs/f2fs/sysfs.c +2 -1
@@ -162,7 +162,8 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,#endif if (a->struct_type ==RESERVED_BLOCKS ) {spin_lock (&sbi->stat_lock); -if (t > (unsigned long )sbi->user_block_count) { +if (t > (unsigned long )(sbi->user_block_count - + sbi->root_reserved_blocks)) {spin_unlock (&sbi->stat_lock);return -EINVAL ; }
Signature · 6 lines
2.15.0.531.g2ccb3012c9-goog ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Jaegeuk Kim
maintainerRe: [PATCH 2/2 v2] f2fs: add reserved blocks for root user
This patch allows root to reserve some blocks via mount option.
"-o reserve_root=N" means N x 4KB-sized blocks for root only.
---
Change log from v1:
- handle remount case to limit reserve_root=%u
fs/f2fs/f2fs.h | 20 ++++++++++++++++---- fs/f2fs/super.c | 34 +++++++++++++++++++++++++++++++++- fs/f2fs/sysfs.c | 3 ++- 3 files changed, 51 insertions(+), 6 deletions(-)
fs/f2fs/f2fs.h +16 -4
@@ -95,6 +95,7 @@ extern char *fault_name[FAULT_MAX];#define F2FS_MOUNT_PRJQUOTA 0x00200000#define F2FS_MOUNT_QUOTA 0x00400000#define F2FS_MOUNT_INLINE_XATTR_SIZE 0x00800000 +#define F2FS_MOUNT_RESERVE_ROOT 0x01000000#define clear_opt (sbi, option) ((sbi)->mount_opt.opt &= ~F2FS_MOUNT_##option)#define set_opt (sbi, option) ((sbi)->mount_opt.opt |= F2FS_MOUNT_##option)
@@ -1109,6 +1110,7 @@ struct f2fs_sb_info {block_t last_valid_block_count;/* for recovery */ block_t reserved_blocks;/* configurable reserved blocks */ block_t current_reserved_blocks;/* current reserved blocks */ +block_t root_reserved_blocks;/* root reserved blocks */ unsigned int nquota_files;/* # of quota sysfile */
@@ -1590,11 +1592,17 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, sbi->total_valid_block_count += (block_t)(*count); avail_user_block_count = sbi->user_block_count - sbi->current_reserved_blocks; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + avail_user_block_count -= sbi->root_reserved_blocks; +if (unlikely (sbi->total_valid_block_count > avail_user_block_count)) { diff = sbi->total_valid_block_count - avail_user_block_count; +if (diff > *count) + diff = *count; *count -= diff; release = diff; - sbi->total_valid_block_count = avail_user_block_count; + sbi->total_valid_block_count -= diff;if (!*count) {spin_unlock (&sbi->stat_lock);percpu_counter_sub (&sbi->alloc_valid_block_count, diff);
@@ -1783,9 +1791,13 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi,spin_lock (&sbi->stat_lock); - valid_block_count = sbi->total_valid_block_count +1 ; -if (unlikely (valid_block_count + sbi->current_reserved_blocks > - sbi->user_block_count)) { + valid_block_count = sbi->total_valid_block_count + + sbi->current_reserved_blocks +1 ; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + valid_block_count += sbi->root_reserved_blocks; + +if (unlikely (valid_block_count > sbi->user_block_count)) {spin_unlock (&sbi->stat_lock); goto enospc; }
fs/f2fs/super.c +33 -1
@@ -107,6 +107,7 @@ enum { Opt_noextent_cache, Opt_noinline_data, Opt_data_flush, + Opt_reserve_root, Opt_mode, Opt_io_size_bits, Opt_fault_injection,
@@ -157,6 +158,7 @@ static match_table_t f2fs_tokens = { {Opt_noextent_cache, "noextent_cache"}, {Opt_noinline_data, "noinline_data"}, {Opt_data_flush, "data_flush"}, + {Opt_reserve_root, "reserve_root=%u"}, {Opt_mode, "mode=%s"}, {Opt_io_size_bits, "io_bits=%u"}, {Opt_fault_injection, "fault_injection=%u"},
@@ -191,6 +193,19 @@ void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...)va_end (args); } +static inline void limit_reserve_root (struct f2fs_sb_info *sbi) +{ +block_t limit = (sbi->user_block_count <<1 ) /1000 ; + +/* limit is 0.2% */ +if (test_opt (sbi,RESERVE_ROOT ) && sbi->root_reserved_blocks > limit) { + sbi->root_reserved_blocks = limit; +f2fs_msg (sbi->sb,KERN_INFO , +"Reduce reserved blocks for root = %u" , + sbi->root_reserved_blocks); + } +} +static void init_once (void *foo) {struct f2fs_inode_info *fi = (struct f2fs_inode_info *) foo;
@@ -488,6 +503,18 @@ static int parse_options(struct super_block *sb, char *options)case Opt_data_flush:set_opt (sbi,DATA_FLUSH );break ; +case Opt_reserve_root: +if (args->from &&match_int (args, &arg)) +return -EINVAL ; +if (test_opt (sbi,RESERVE_ROOT )) { +f2fs_msg (sb,KERN_INFO , +"Preserve previous reserve_root=%u" , + sbi->root_reserved_blocks); + }else { + sbi->root_reserved_blocks = arg; +set_opt (sbi,RESERVE_ROOT ); + } +break ;case Opt_mode: name =match_strdup (&args[0 ]);
@@ -1006,7 +1033,7 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = total_count - start_count; buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; - buf->f_bavail = buf->f_bfree; + buf->f_bavail = buf->f_bfree - sbi->root_reserved_blocks; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
@@ -1135,6 +1162,9 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)else if (test_opt (sbi,LFS ))seq_puts (seq,"lfs" );seq_printf (seq,",active_logs=%u" , sbi->active_logs); +if (test_opt (sbi,RESERVE_ROOT )) +seq_printf (seq,",reserve_root=%u" , + sbi->root_reserved_blocks);if (F2FS_IO_SIZE_BITS (sbi))seq_printf (seq,",io_size=%uKB" ,F2FS_IO_SIZE_KB (sbi));#ifdef CONFIG_F2FS_FAULT_INJECTION
@@ -1333,6 +1363,7 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data) sb->s_flags = (sb->s_flags & ~SB_POSIXACL ) | (test_opt (sbi,POSIX_ACL ) ?SB_POSIXACL :0 ); +limit_reserve_root (sbi);return 0 ; restore_gc:if (need_restart_gc) {
@@ -2569,6 +2600,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) sbi->last_valid_block_count = sbi->total_valid_block_count; sbi->reserved_blocks =0 ; sbi->current_reserved_blocks =0 ; +limit_reserve_root (sbi);for (i =0 ; i <NR_INODE_TYPE ; i++) {INIT_LIST_HEAD (&sbi->inode_list[i]);
fs/f2fs/sysfs.c +2 -1
@@ -162,7 +162,8 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,#endif if (a->struct_type ==RESERVED_BLOCKS ) {spin_lock (&sbi->stat_lock); -if (t > (unsigned long )sbi->user_block_count) { +if (t > (unsigned long )(sbi->user_block_count - + sbi->root_reserved_blocks)) {spin_unlock (&sbi->stat_lock);return -EINVAL ; }
Signature · 1 line
2.15.0.531.g2ccb3012c9-goog
Chao Yu
Reviewed-byRe: [f2fs-dev] [PATCH 2/2 v2] f2fs: add reserved blocks for root user
Quoted 5 lines · Jaegeuk Kim
This patch allows root to reserve some blocks via mount option.
"-o reserve_root=N" means N x 4KB-sized blocks for root only.
Signed-off-by Jaegeuk Kim <[email protected]>
Thanks,
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Re: [PATCH 2/2 v3] f2fs: add reserved blocks for root user
In reply to Jaegeuk KimThis patch allows root to reserve some blocks via mount option.
"-o reserve_root=N" means N x 4KB-sized blocks for root only.
---
Change log from v2:
- fix overflow in statfs
fs/f2fs/f2fs.h | 20 ++++++++++++++++---- fs/f2fs/super.c | 37 ++++++++++++++++++++++++++++++++++++- fs/f2fs/sysfs.c | 3 ++- 3 files changed, 54 insertions(+), 6 deletions(-)
fs/f2fs/f2fs.h +16 -4
@@ -95,6 +95,7 @@ extern char *fault_name[FAULT_MAX];#define F2FS_MOUNT_PRJQUOTA 0x00200000#define F2FS_MOUNT_QUOTA 0x00400000#define F2FS_MOUNT_INLINE_XATTR_SIZE 0x00800000 +#define F2FS_MOUNT_RESERVE_ROOT 0x01000000#define clear_opt (sbi, option) ((sbi)->mount_opt.opt &= ~F2FS_MOUNT_##option)#define set_opt (sbi, option) ((sbi)->mount_opt.opt |= F2FS_MOUNT_##option)
@@ -1109,6 +1110,7 @@ struct f2fs_sb_info {block_t last_valid_block_count;/* for recovery */ block_t reserved_blocks;/* configurable reserved blocks */ block_t current_reserved_blocks;/* current reserved blocks */ +block_t root_reserved_blocks;/* root reserved blocks */ unsigned int nquota_files;/* # of quota sysfile */
@@ -1590,11 +1592,17 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, sbi->total_valid_block_count += (block_t)(*count); avail_user_block_count = sbi->user_block_count - sbi->current_reserved_blocks; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + avail_user_block_count -= sbi->root_reserved_blocks; +if (unlikely (sbi->total_valid_block_count > avail_user_block_count)) { diff = sbi->total_valid_block_count - avail_user_block_count; +if (diff > *count) + diff = *count; *count -= diff; release = diff; - sbi->total_valid_block_count = avail_user_block_count; + sbi->total_valid_block_count -= diff;if (!*count) {spin_unlock (&sbi->stat_lock);percpu_counter_sub (&sbi->alloc_valid_block_count, diff);
@@ -1783,9 +1791,13 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi,spin_lock (&sbi->stat_lock); - valid_block_count = sbi->total_valid_block_count +1 ; -if (unlikely (valid_block_count + sbi->current_reserved_blocks > - sbi->user_block_count)) { + valid_block_count = sbi->total_valid_block_count + + sbi->current_reserved_blocks +1 ; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + valid_block_count += sbi->root_reserved_blocks; + +if (unlikely (valid_block_count > sbi->user_block_count)) {spin_unlock (&sbi->stat_lock); goto enospc; }
fs/f2fs/super.c +36 -1
@@ -107,6 +107,7 @@ enum { Opt_noextent_cache, Opt_noinline_data, Opt_data_flush, + Opt_reserve_root, Opt_mode, Opt_io_size_bits, Opt_fault_injection,
@@ -157,6 +158,7 @@ static match_table_t f2fs_tokens = { {Opt_noextent_cache, "noextent_cache"}, {Opt_noinline_data, "noinline_data"}, {Opt_data_flush, "data_flush"}, + {Opt_reserve_root, "reserve_root=%u"}, {Opt_mode, "mode=%s"}, {Opt_io_size_bits, "io_bits=%u"}, {Opt_fault_injection, "fault_injection=%u"},
@@ -191,6 +193,19 @@ void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...)va_end (args); } +static inline void limit_reserve_root (struct f2fs_sb_info *sbi) +{ +block_t limit = (sbi->user_block_count <<1 ) /1000 ; + +/* limit is 0.2% */ +if (test_opt (sbi,RESERVE_ROOT ) && sbi->root_reserved_blocks > limit) { + sbi->root_reserved_blocks = limit; +f2fs_msg (sbi->sb,KERN_INFO , +"Reduce reserved blocks for root = %u" , + sbi->root_reserved_blocks); + } +} +static void init_once (void *foo) {struct f2fs_inode_info *fi = (struct f2fs_inode_info *) foo;
@@ -488,6 +503,18 @@ static int parse_options(struct super_block *sb, char *options)case Opt_data_flush:set_opt (sbi,DATA_FLUSH );break ; +case Opt_reserve_root: +if (args->from &&match_int (args, &arg)) +return -EINVAL ; +if (test_opt (sbi,RESERVE_ROOT )) { +f2fs_msg (sb,KERN_INFO , +"Preserve previous reserve_root=%u" , + sbi->root_reserved_blocks); + }else { + sbi->root_reserved_blocks = arg; +set_opt (sbi,RESERVE_ROOT ); + } +break ;case Opt_mode: name =match_strdup (&args[0 ]);
@@ -1006,7 +1033,10 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = total_count - start_count; buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; - buf->f_bavail = buf->f_bfree; +if (buf->f_bfree > sbi->root_reserved_blocks) + buf->f_bavail = buf->f_bfree - sbi->root_reserved_blocks; +else + buf->f_bavail =0 ; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
@@ -1135,6 +1165,9 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)else if (test_opt (sbi,LFS ))seq_puts (seq,"lfs" );seq_printf (seq,",active_logs=%u" , sbi->active_logs); +if (test_opt (sbi,RESERVE_ROOT )) +seq_printf (seq,",reserve_root=%u" , + sbi->root_reserved_blocks);if (F2FS_IO_SIZE_BITS (sbi))seq_printf (seq,",io_size=%uKB" ,F2FS_IO_SIZE_KB (sbi));#ifdef CONFIG_F2FS_FAULT_INJECTION
@@ -1333,6 +1366,7 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data) sb->s_flags = (sb->s_flags & ~SB_POSIXACL ) | (test_opt (sbi,POSIX_ACL ) ?SB_POSIXACL :0 ); +limit_reserve_root (sbi);return 0 ; restore_gc:if (need_restart_gc) {
@@ -2569,6 +2603,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) sbi->last_valid_block_count = sbi->total_valid_block_count; sbi->reserved_blocks =0 ; sbi->current_reserved_blocks =0 ; +limit_reserve_root (sbi);for (i =0 ; i <NR_INODE_TYPE ; i++) {INIT_LIST_HEAD (&sbi->inode_list[i]);
fs/f2fs/sysfs.c +2 -1
@@ -162,7 +162,8 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,#endif if (a->struct_type ==RESERVED_BLOCKS ) {spin_lock (&sbi->stat_lock); -if (t > (unsigned long )sbi->user_block_count) { +if (t > (unsigned long )(sbi->user_block_count - + sbi->root_reserved_blocks)) {spin_unlock (&sbi->stat_lock);return -EINVAL ; }
Signature · 1 line
2.15.0.531.g2ccb3012c9-goog
Re: [f2fs-dev] [PATCH 2/2] f2fs: add reserved blocks for root user
In reply to Jaegeuk Kimfs/f2fs/f2fs.h static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, · line 1603
Quoted 7 lines · Jaegeuk Kim
fs/f2fs/f2fs.h +3
-0@@ -1590,11 +1598,17 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, sbi->total_valid_block_count += (block_t)(*count); avail_user_block_count = sbi->user_block_count - sbi->current_reserved_blocks; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + avail_user_block_count -= sbi->root_reserved_blocks;
Should better be:
+ if (test_opt(sbi, RESERVE_ROOT) && !capable(CAP_SYS_RESOURCE))
+ avail_user_block_count -= sbi->root_reserved_blocks;
Quoted 4 lines
fs/f2fs/f2fs.h +0
-0@@ -1783,9 +1797,13 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi,spin_lock (&sbi->stat_lock);
fs/f2fs/f2fs.h static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, · line 1806
Quoted 10 lines
fs/f2fs/f2fs.h +6
-3- valid_block_count = sbi->total_valid_block_count +1 ; -if (unlikely (valid_block_count + sbi->current_reserved_blocks > - sbi->user_block_count)) { + valid_block_count = sbi->total_valid_block_count + + sbi->current_reserved_blocks +1 ; + +if (!(test_opt (sbi,RESERVE_ROOT ) &&capable (CAP_SYS_RESOURCE ))) + valid_block_count += sbi->root_reserved_blocks; +
should better be:
+ if (test_opt(sbi, RESERVE_ROOT) && !capable(CAP_SYS_RESOURCE))
+ valid_block_count += sbi->root_reserved_blocks;
Quoted 5 lines
fs/f2fs/f2fs.h +1
-0+if (unlikely (valid_block_count > sbi->user_block_count)) {spin_unlock (&sbi->stat_lock); goto enospc;}
Signature · 2 lines
Thanks, Yunlong Song
Quoted 13 lines · Jaegeuk Kim
Let's show precise # of blocks that user/root can use through bavail and bfree respectively.
Signed-off-by Jaegeuk Kim <[email protected]>--- fs/f2fs/super.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)fs/f2fs/super.c +0
-0
fs/f2fs/super.c static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) · line 1008
Quoted 4 lines
fs/f2fs/super.c +0
-1@@ -1005,9 +1005,9 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_bsize = sbi->blocksize; buf->f_blocks = total_count - start_count; - buf->f_bfree = user_block_count -valid_user_blocks (sbi) + ovp_count;
Clean up unused ovp_count in this patch?
Thanks,
Quoted 8 lines
fs/f2fs/super.c +2
-1- buf->f_bavail = user_block_count -valid_user_blocks (sbi) - + buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; + buf->f_bavail = buf->f_bfree; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
Jaegeuk Kim
maintainerLet's show precise # of blocks that user/root can use through bavail and bfree respectively.
---
Change log from v1:
- clean up obsolete values
fs/f2fs/super.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
fs/f2fs/super.c +3 -4
@@ -994,20 +994,19 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)struct super_block *sb = dentry->d_sb;struct f2fs_sb_info *sbi =F2FS_SB (sb);u64 id =huge_encode_dev (sb->s_bdev->bd_dev); -block_t total_count, user_block_count, start_count, ovp_count; +block_t total_count, user_block_count, start_count;u64 avail_node_count; total_count =le64_to_cpu (sbi->raw_super->block_count); user_block_count = sbi->user_block_count; start_count =le32_to_cpu (sbi->raw_super->segment0_blkaddr); - ovp_count =SM_I (sbi)->ovp_segments << sbi->log_blocks_per_seg; buf->f_type =F2FS_SUPER_MAGIC ; buf->f_bsize = sbi->blocksize; buf->f_blocks = total_count - start_count; - buf->f_bfree = user_block_count -valid_user_blocks (sbi) + ovp_count; - buf->f_bavail = user_block_count -valid_user_blocks (sbi) - + buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; + buf->f_bavail = buf->f_bfree; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
Signature · 1 line
2.15.0.531.g2ccb3012c9-goog
Chao Yu
Reviewed-byQuoted 4 lines · Jaegeuk Kim
Let's show precise # of blocks that user/root can use through bavail and bfree respectively.
Signed-off-by Jaegeuk Kim <[email protected]>
Thanks,
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Yunlong Song
NAKNACK
man statfs shows:
struct statfs {
...
fsblkcnt_t f_bfree; /* free blocks in fs */
fsblkcnt_t f_bavail; /* free blocks available to
unprivileged user */
...
}
f_bfree is free blocks in fs, so buf->bfree should be
buf->f_bfree = user_block_count - valid_user_blocks(sbi) + ovp_count;
Quoted 24 lines · Jaegeuk Kim
Let's show precise # of blocks that user/root can use through bavail and bfree respectively.
Signed-off-by Jaegeuk Kim <[email protected]>--- fs/f2fs/super.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)fs/f2fs/super.c +2
-2@@ -1005,9 +1005,9 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_bsize = sbi->blocksize; buf->f_blocks = total_count - start_count; - buf->f_bfree = user_block_count -valid_user_blocks (sbi) + ovp_count; - buf->f_bavail = user_block_count -valid_user_blocks (sbi) - + buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; + buf->f_bavail = buf->f_bfree; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;
Signature · 2 lines
Thanks, Yunlong Song
Quoted 12 lines · Yunlong Song
NACK
man statfs shows:
struct statfs {
...
fsblkcnt_tf_bfree; /* free blocks in fs */
fsblkcnt_tf_bavail; /* free blocks available to
unprivileged user */
...
}
Quoted 3 lines
f_bfreeis free blocks in fs, sobuf->bfreeshould be
buf->f_bfree=user_block_count-valid_user_blocks(sbi)+ovp_count;
As I checked, some filesystems reserving over-privision space like btrfs/xfs/ubifs, they will not calculate those space into f_bfree, IMO, we should follow their behavior to keep compatibility for old applications.
Thanks,
Quoted 27 lines · Jaegeuk Kim
Quoted 24 lines
Let's show precise # of blocks that user/root can use through bavail and bfree respectively.
Signed-off-by Jaegeuk Kim <[email protected]>--- fs/f2fs/super.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)fs/f2fs/super.c +2
-2@@ -1005,9 +1005,9 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_bsize = sbi->blocksize; buf->f_blocks = total_count - start_count; - buf->f_bfree = user_block_count -valid_user_blocks (sbi) + ovp_count; - buf->f_bavail = user_block_count -valid_user_blocks (sbi) - + buf->f_bfree = user_block_count -valid_user_blocks (sbi) - sbi->current_reserved_blocks; + buf->f_bavail = buf->f_bfree; avail_node_count = sbi->total_node_count - sbi->nquota_files -F2FS_RESERVED_NODE_NUM ;