On 2017/10/31 11:40, Jaegeuk Kim wrote: > This patch adds quota_ino feature infra to be used for quota files. > > Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> Reviewed-by: Chao Yu <yuchao0@xxxxxxxxxx> > --- > fs/f2fs/f2fs.h | 6 ++++++ > fs/f2fs/sysfs.c | 7 +++++++ > include/linux/f2fs_fs.h | 6 +++++- > 3 files changed, 18 insertions(+), 1 deletion(-) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index 4a75f07f1dc8..9a1c7ffa6845 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -122,6 +122,7 @@ struct f2fs_mount_info { > #define F2FS_FEATURE_PRJQUOTA 0x0010 > #define F2FS_FEATURE_INODE_CHKSUM 0x0020 > #define F2FS_FEATURE_FLEXIBLE_INLINE_XATTR 0x0040 > +#define F2FS_FEATURE_QUOTA_INO 0x0080 > > #define F2FS_HAS_FEATURE(sb, mask) \ > ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0) > @@ -3070,6 +3071,11 @@ static inline int f2fs_sb_has_flexible_inline_xattr(struct super_block *sb) > return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_FLEXIBLE_INLINE_XATTR); > } > > +static inline int f2fs_sb_has_quota_ino(struct super_block *sb) > +{ > + return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_QUOTA_INO); > +} > + > #ifdef CONFIG_BLK_DEV_ZONED > static inline int get_blkz_type(struct f2fs_sb_info *sbi, > struct block_device *bdev, block_t blkaddr) > diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c > index f0fdc89ce82f..9835348b6e5d 100644 > --- a/fs/f2fs/sysfs.c > +++ b/fs/f2fs/sysfs.c > @@ -110,6 +110,9 @@ static ssize_t features_show(struct f2fs_attr *a, > if (f2fs_sb_has_flexible_inline_xattr(sb)) > len += snprintf(buf + len, PAGE_SIZE - len, "%s%s", > len ? ", " : "", "flexible_inline_xattr"); > + if (f2fs_sb_has_quota_ino(sb)) > + len += snprintf(buf + len, PAGE_SIZE - len, "%s%s", > + len ? ", " : "", "quota_ino"); > len += snprintf(buf + len, PAGE_SIZE - len, "\n"); > return len; > } > @@ -227,6 +230,7 @@ enum feat_id { > FEAT_PROJECT_QUOTA, > FEAT_INODE_CHECKSUM, > FEAT_FLEXIBLE_INLINE_XATTR, > + FEAT_QUOTA_INO, > }; > > static ssize_t f2fs_feature_show(struct f2fs_attr *a, > @@ -240,6 +244,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, > case FEAT_PROJECT_QUOTA: > case FEAT_INODE_CHECKSUM: > case FEAT_FLEXIBLE_INLINE_XATTR: > + case FEAT_QUOTA_INO: > return snprintf(buf, PAGE_SIZE, "supported\n"); > } > return 0; > @@ -314,6 +319,7 @@ F2FS_FEATURE_RO_ATTR(extra_attr, FEAT_EXTRA_ATTR); > F2FS_FEATURE_RO_ATTR(project_quota, FEAT_PROJECT_QUOTA); > F2FS_FEATURE_RO_ATTR(inode_checksum, FEAT_INODE_CHECKSUM); > F2FS_FEATURE_RO_ATTR(flexible_inline_xattr, FEAT_FLEXIBLE_INLINE_XATTR); > +F2FS_FEATURE_RO_ATTR(quota_ino, FEAT_QUOTA_INO); > > #define ATTR_LIST(name) (&f2fs_attr_##name.attr) > static struct attribute *f2fs_attrs[] = { > @@ -364,6 +370,7 @@ static struct attribute *f2fs_feat_attrs[] = { > ATTR_LIST(project_quota), > ATTR_LIST(inode_checksum), > ATTR_LIST(flexible_inline_xattr), > + ATTR_LIST(quota_ino), > NULL, > }; > > diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h > index 50a8ee501bf1..ce34007972c3 100644 > --- a/include/linux/f2fs_fs.h > +++ b/include/linux/f2fs_fs.h > @@ -36,6 +36,9 @@ > #define F2FS_NODE_INO(sbi) ((sbi)->node_ino_num) > #define F2FS_META_INO(sbi) ((sbi)->meta_ino_num) > > +#define F2FS_QUOTA_INO 3 > +#define F2FS_MAX_QUOTAS 3 > + > #define F2FS_IO_SIZE(sbi) (1 << (sbi)->write_io_size_bits) /* Blocks */ > #define F2FS_IO_SIZE_KB(sbi) (1 << ((sbi)->write_io_size_bits + 2)) /* KB */ > #define F2FS_IO_SIZE_BYTES(sbi) (1 << ((sbi)->write_io_size_bits + 12)) /* B */ > @@ -108,7 +111,8 @@ struct f2fs_super_block { > __u8 encryption_level; /* versioning level for encryption */ > __u8 encrypt_pw_salt[16]; /* Salt used for string2key algorithm */ > struct f2fs_device devs[MAX_DEVICES]; /* device list */ > - __u8 reserved[327]; /* valid reserved region */ > + __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */ > + __u8 reserved[315]; /* valid reserved region */ > } __packed; > > /* >