* [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
@ 2020-12-03 6:56 ` Daeho Jeong
0 siblings, 0 replies; 11+ messages in thread
From: Daeho Jeong @ 2020-12-03 6:56 UTC (permalink / raw)
To: linux-kernel, linux-f2fs-devel, kernel-team; +Cc: Daeho Jeong
From: Daeho Jeong <daehojeong@google.com>
Added two ioctl to decompress/compress explicitly the compression
enabled file in "compress_mode=user" mount option.
Using these two ioctls, the users can make a control of compression
and decompression of their files.
Signed-off-by: Daeho Jeong <daehojeong@google.com>
---
v3: changed error condition and use get_dirty_pages for flush routine
v2: reformed codes based on comments and put gradual flush routine
---
fs/f2fs/file.c | 185 ++++++++++++++++++++++++++++++++++++++
include/uapi/linux/f2fs.h | 2 +
2 files changed, 187 insertions(+)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index be8db06aca27..3678e25ed17a 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -4026,6 +4026,185 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg)
return ret;
}
+static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
+{
+ DEFINE_READAHEAD(ractl, NULL, inode->i_mapping, page_idx);
+ struct address_space *mapping = inode->i_mapping;
+ struct page *page;
+ pgoff_t redirty_idx = page_idx;
+ int i, page_len = 0, ret = 0;
+
+ page_cache_ra_unbounded(&ractl, len, 0);
+
+ for (i = 0; i < len; i++, page_idx++) {
+ page = read_cache_page(mapping, page_idx, NULL, NULL);
+ if (IS_ERR(page)) {
+ ret = PTR_ERR(page);
+ break;
+ }
+ page_len++;
+ }
+
+ for (i = 0; i < page_len; i++, redirty_idx++) {
+ page = find_lock_page(mapping, redirty_idx);
+ if (!page)
+ ret = -ENOENT;
+ set_page_dirty(page);
+ f2fs_put_page(page, 1);
+ f2fs_put_page(page, 0);
+ }
+
+ return ret;
+}
+
+static int f2fs_ioc_decompress_file(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+ struct f2fs_inode_info *fi = F2FS_I(inode);
+ pgoff_t page_idx = 0, last_idx;
+ unsigned int blk_per_seg = sbi->blocks_per_seg;
+ int cluster_size = F2FS_I(inode)->i_cluster_size;
+ int count, ret;
+
+ if (!f2fs_sb_has_compression(sbi) ||
+ F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
+ return -EOPNOTSUPP;
+
+ if (!(filp->f_mode & FMODE_WRITE))
+ return -EBADF;
+
+ if (!f2fs_compressed_file(inode))
+ return -EINVAL;
+
+ f2fs_balance_fs(F2FS_I_SB(inode), true);
+
+ file_start_write(filp);
+ inode_lock(inode);
+
+ if (!f2fs_is_compress_backend_ready(inode)) {
+ ret = -EOPNOTSUPP;
+ goto out;
+ }
+
+ if (f2fs_is_mmap_file(inode)) {
+ ret = -EBUSY;
+ goto out;
+ }
+
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
+ if (ret)
+ goto out;
+
+ if (!atomic_read(&fi->i_compr_blocks))
+ goto out;
+
+ last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
+
+ count = last_idx - page_idx;
+ while (count) {
+ int len = min(cluster_size, count);
+
+ ret = redirty_blocks(inode, page_idx, len);
+ if (ret < 0)
+ break;
+
+ if (get_dirty_pages(inode) >= blk_per_seg)
+ filemap_fdatawrite(inode->i_mapping);
+
+ count -= len;
+ page_idx += len;
+ }
+
+ if (!ret)
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0,
+ LLONG_MAX);
+
+ if (ret)
+ f2fs_warn(sbi, "%s: The file might be partially decompressed "
+ "(errno=%d). Please delete the file.\n",
+ __func__, ret);
+out:
+ inode_unlock(inode);
+ file_end_write(filp);
+
+ return ret;
+}
+
+static int f2fs_ioc_compress_file(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+ pgoff_t page_idx = 0, last_idx;
+ unsigned int blk_per_seg = sbi->blocks_per_seg;
+ int cluster_size = F2FS_I(inode)->i_cluster_size;
+ int count, ret;
+
+ if (!f2fs_sb_has_compression(sbi) ||
+ F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
+ return -EOPNOTSUPP;
+
+ if (!(filp->f_mode & FMODE_WRITE))
+ return -EBADF;
+
+ if (!f2fs_compressed_file(inode))
+ return -EINVAL;
+
+ f2fs_balance_fs(F2FS_I_SB(inode), true);
+
+ file_start_write(filp);
+ inode_lock(inode);
+
+ if (!f2fs_is_compress_backend_ready(inode)) {
+ ret = -EOPNOTSUPP;
+ goto out;
+ }
+
+ if (f2fs_is_mmap_file(inode)) {
+ ret = -EBUSY;
+ goto out;
+ }
+
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
+ if (ret)
+ goto out;
+
+ set_inode_flag(inode, FI_ENABLE_COMPRESS);
+
+ last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
+
+ count = last_idx - page_idx;
+ while (count) {
+ int len = min(cluster_size, count);
+
+ ret = redirty_blocks(inode, page_idx, len);
+ if (ret < 0)
+ break;
+
+ if (get_dirty_pages(inode) >= blk_per_seg)
+ filemap_fdatawrite(inode->i_mapping);
+
+ count -= len;
+ page_idx += len;
+ }
+
+ if (!ret)
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0,
+ LLONG_MAX);
+
+ clear_inode_flag(inode, FI_ENABLE_COMPRESS);
+
+ if (ret)
+ f2fs_warn(sbi, "%s: The file might be partially compressed "
+ "(errno=%d). Please delete the file.\n",
+ __func__, ret);
+out:
+ inode_unlock(inode);
+ file_end_write(filp);
+
+ return ret;
+}
+
static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
@@ -4113,6 +4292,10 @@ static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
return f2fs_ioc_get_compress_option(filp, arg);
case F2FS_IOC_SET_COMPRESS_OPTION:
return f2fs_ioc_set_compress_option(filp, arg);
+ case F2FS_IOC_DECOMPRESS_FILE:
+ return f2fs_ioc_decompress_file(filp, arg);
+ case F2FS_IOC_COMPRESS_FILE:
+ return f2fs_ioc_compress_file(filp, arg);
default:
return -ENOTTY;
}
@@ -4352,6 +4535,8 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case F2FS_IOC_SEC_TRIM_FILE:
case F2FS_IOC_GET_COMPRESS_OPTION:
case F2FS_IOC_SET_COMPRESS_OPTION:
+ case F2FS_IOC_DECOMPRESS_FILE:
+ case F2FS_IOC_COMPRESS_FILE:
break;
default:
return -ENOIOCTLCMD;
diff --git a/include/uapi/linux/f2fs.h b/include/uapi/linux/f2fs.h
index f00199a2e38b..352a822d4370 100644
--- a/include/uapi/linux/f2fs.h
+++ b/include/uapi/linux/f2fs.h
@@ -40,6 +40,8 @@
struct f2fs_comp_option)
#define F2FS_IOC_SET_COMPRESS_OPTION _IOW(F2FS_IOCTL_MAGIC, 22, \
struct f2fs_comp_option)
+#define F2FS_IOC_DECOMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 23)
+#define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24)
/*
* should be same as XFS_IOC_GOINGDOWN.
--
2.29.2.576.ga3fc446d84-goog
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
@ 2020-12-03 6:56 ` Daeho Jeong
0 siblings, 0 replies; 11+ messages in thread
From: Daeho Jeong @ 2020-12-03 6:56 UTC (permalink / raw)
To: linux-kernel, linux-f2fs-devel, kernel-team; +Cc: Daeho Jeong
From: Daeho Jeong <daehojeong@google.com>
Added two ioctl to decompress/compress explicitly the compression
enabled file in "compress_mode=user" mount option.
Using these two ioctls, the users can make a control of compression
and decompression of their files.
Signed-off-by: Daeho Jeong <daehojeong@google.com>
---
v3: changed error condition and use get_dirty_pages for flush routine
v2: reformed codes based on comments and put gradual flush routine
---
fs/f2fs/file.c | 185 ++++++++++++++++++++++++++++++++++++++
include/uapi/linux/f2fs.h | 2 +
2 files changed, 187 insertions(+)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index be8db06aca27..3678e25ed17a 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -4026,6 +4026,185 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg)
return ret;
}
+static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
+{
+ DEFINE_READAHEAD(ractl, NULL, inode->i_mapping, page_idx);
+ struct address_space *mapping = inode->i_mapping;
+ struct page *page;
+ pgoff_t redirty_idx = page_idx;
+ int i, page_len = 0, ret = 0;
+
+ page_cache_ra_unbounded(&ractl, len, 0);
+
+ for (i = 0; i < len; i++, page_idx++) {
+ page = read_cache_page(mapping, page_idx, NULL, NULL);
+ if (IS_ERR(page)) {
+ ret = PTR_ERR(page);
+ break;
+ }
+ page_len++;
+ }
+
+ for (i = 0; i < page_len; i++, redirty_idx++) {
+ page = find_lock_page(mapping, redirty_idx);
+ if (!page)
+ ret = -ENOENT;
+ set_page_dirty(page);
+ f2fs_put_page(page, 1);
+ f2fs_put_page(page, 0);
+ }
+
+ return ret;
+}
+
+static int f2fs_ioc_decompress_file(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+ struct f2fs_inode_info *fi = F2FS_I(inode);
+ pgoff_t page_idx = 0, last_idx;
+ unsigned int blk_per_seg = sbi->blocks_per_seg;
+ int cluster_size = F2FS_I(inode)->i_cluster_size;
+ int count, ret;
+
+ if (!f2fs_sb_has_compression(sbi) ||
+ F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
+ return -EOPNOTSUPP;
+
+ if (!(filp->f_mode & FMODE_WRITE))
+ return -EBADF;
+
+ if (!f2fs_compressed_file(inode))
+ return -EINVAL;
+
+ f2fs_balance_fs(F2FS_I_SB(inode), true);
+
+ file_start_write(filp);
+ inode_lock(inode);
+
+ if (!f2fs_is_compress_backend_ready(inode)) {
+ ret = -EOPNOTSUPP;
+ goto out;
+ }
+
+ if (f2fs_is_mmap_file(inode)) {
+ ret = -EBUSY;
+ goto out;
+ }
+
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
+ if (ret)
+ goto out;
+
+ if (!atomic_read(&fi->i_compr_blocks))
+ goto out;
+
+ last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
+
+ count = last_idx - page_idx;
+ while (count) {
+ int len = min(cluster_size, count);
+
+ ret = redirty_blocks(inode, page_idx, len);
+ if (ret < 0)
+ break;
+
+ if (get_dirty_pages(inode) >= blk_per_seg)
+ filemap_fdatawrite(inode->i_mapping);
+
+ count -= len;
+ page_idx += len;
+ }
+
+ if (!ret)
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0,
+ LLONG_MAX);
+
+ if (ret)
+ f2fs_warn(sbi, "%s: The file might be partially decompressed "
+ "(errno=%d). Please delete the file.\n",
+ __func__, ret);
+out:
+ inode_unlock(inode);
+ file_end_write(filp);
+
+ return ret;
+}
+
+static int f2fs_ioc_compress_file(struct file *filp, unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+ pgoff_t page_idx = 0, last_idx;
+ unsigned int blk_per_seg = sbi->blocks_per_seg;
+ int cluster_size = F2FS_I(inode)->i_cluster_size;
+ int count, ret;
+
+ if (!f2fs_sb_has_compression(sbi) ||
+ F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
+ return -EOPNOTSUPP;
+
+ if (!(filp->f_mode & FMODE_WRITE))
+ return -EBADF;
+
+ if (!f2fs_compressed_file(inode))
+ return -EINVAL;
+
+ f2fs_balance_fs(F2FS_I_SB(inode), true);
+
+ file_start_write(filp);
+ inode_lock(inode);
+
+ if (!f2fs_is_compress_backend_ready(inode)) {
+ ret = -EOPNOTSUPP;
+ goto out;
+ }
+
+ if (f2fs_is_mmap_file(inode)) {
+ ret = -EBUSY;
+ goto out;
+ }
+
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
+ if (ret)
+ goto out;
+
+ set_inode_flag(inode, FI_ENABLE_COMPRESS);
+
+ last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
+
+ count = last_idx - page_idx;
+ while (count) {
+ int len = min(cluster_size, count);
+
+ ret = redirty_blocks(inode, page_idx, len);
+ if (ret < 0)
+ break;
+
+ if (get_dirty_pages(inode) >= blk_per_seg)
+ filemap_fdatawrite(inode->i_mapping);
+
+ count -= len;
+ page_idx += len;
+ }
+
+ if (!ret)
+ ret = filemap_write_and_wait_range(inode->i_mapping, 0,
+ LLONG_MAX);
+
+ clear_inode_flag(inode, FI_ENABLE_COMPRESS);
+
+ if (ret)
+ f2fs_warn(sbi, "%s: The file might be partially compressed "
+ "(errno=%d). Please delete the file.\n",
+ __func__, ret);
+out:
+ inode_unlock(inode);
+ file_end_write(filp);
+
+ return ret;
+}
+
static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
@@ -4113,6 +4292,10 @@ static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
return f2fs_ioc_get_compress_option(filp, arg);
case F2FS_IOC_SET_COMPRESS_OPTION:
return f2fs_ioc_set_compress_option(filp, arg);
+ case F2FS_IOC_DECOMPRESS_FILE:
+ return f2fs_ioc_decompress_file(filp, arg);
+ case F2FS_IOC_COMPRESS_FILE:
+ return f2fs_ioc_compress_file(filp, arg);
default:
return -ENOTTY;
}
@@ -4352,6 +4535,8 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case F2FS_IOC_SEC_TRIM_FILE:
case F2FS_IOC_GET_COMPRESS_OPTION:
case F2FS_IOC_SET_COMPRESS_OPTION:
+ case F2FS_IOC_DECOMPRESS_FILE:
+ case F2FS_IOC_COMPRESS_FILE:
break;
default:
return -ENOIOCTLCMD;
diff --git a/include/uapi/linux/f2fs.h b/include/uapi/linux/f2fs.h
index f00199a2e38b..352a822d4370 100644
--- a/include/uapi/linux/f2fs.h
+++ b/include/uapi/linux/f2fs.h
@@ -40,6 +40,8 @@
struct f2fs_comp_option)
#define F2FS_IOC_SET_COMPRESS_OPTION _IOW(F2FS_IOCTL_MAGIC, 22, \
struct f2fs_comp_option)
+#define F2FS_IOC_DECOMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 23)
+#define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24)
/*
* should be same as XFS_IOC_GOINGDOWN.
--
2.29.2.576.ga3fc446d84-goog
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
2020-12-03 6:56 ` [f2fs-dev] " Daeho Jeong
@ 2020-12-03 7:07 ` Chao Yu
-1 siblings, 0 replies; 11+ messages in thread
From: Chao Yu @ 2020-12-03 7:07 UTC (permalink / raw)
To: Daeho Jeong, linux-kernel, linux-f2fs-devel, kernel-team; +Cc: Daeho Jeong
On 2020/12/3 14:56, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
>
> Added two ioctl to decompress/compress explicitly the compression
> enabled file in "compress_mode=user" mount option.
>
> Using these two ioctls, the users can make a control of compression
> and decompression of their files.
>
> Signed-off-by: Daeho Jeong <daehojeong@google.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Thanks,
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
@ 2020-12-03 7:07 ` Chao Yu
0 siblings, 0 replies; 11+ messages in thread
From: Chao Yu @ 2020-12-03 7:07 UTC (permalink / raw)
To: Daeho Jeong, linux-kernel, linux-f2fs-devel, kernel-team; +Cc: Daeho Jeong
On 2020/12/3 14:56, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
>
> Added two ioctl to decompress/compress explicitly the compression
> enabled file in "compress_mode=user" mount option.
>
> Using these two ioctls, the users can make a control of compression
> and decompression of their files.
>
> Signed-off-by: Daeho Jeong <daehojeong@google.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Thanks,
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
2020-12-03 6:56 ` [f2fs-dev] " Daeho Jeong
(?)
(?)
@ 2020-12-03 9:51 ` kernel test robot
-1 siblings, 0 replies; 11+ messages in thread
From: kernel test robot @ 2020-12-03 9:51 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 12624 bytes --]
Hi Daeho,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on next-20201201]
[cannot apply to f2fs/dev-test linux/master linus/master v5.10-rc6 v5.10-rc5 v5.10-rc4 v5.10-rc6]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Daeho-Jeong/f2fs-add-F2FS_IOC_DECOMPRESS_FILE-and-F2FS_IOC_COMPRESS_FILE/20201203-150246
base: 0eedceafd3a63fd082743c914853ef4b9247dbe6
config: arm64-randconfig-r034-20201203 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 32c501dd88b62787d3a5ffda7aabcf4650dbe3cd)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/0day-ci/linux/commit/c7c9bfc69997b71d1291e32cacf78248e16938a3
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Daeho-Jeong/f2fs-add-F2FS_IOC_DECOMPRESS_FILE-and-F2FS_IOC_COMPRESS_FILE/20201203-150246
git checkout c7c9bfc69997b71d1291e32cacf78248e16938a3
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> fs/f2fs/file.c:4071:21: error: no member named 'compress_mode' in 'struct f2fs_mount_info'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
>> fs/f2fs/file.c:4071:38: error: use of undeclared identifier 'COMPR_MODE_USER'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
^
>> fs/f2fs/file.c:4071:21: error: no member named 'compress_mode' in 'struct f2fs_mount_info'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:61: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
>> fs/f2fs/file.c:4071:38: error: use of undeclared identifier 'COMPR_MODE_USER'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
^
>> fs/f2fs/file.c:4071:21: error: no member named 'compress_mode' in 'struct f2fs_mount_info'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
~~~~~~~~~~~~~~~~~^~~~~
include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
(cond) ? \
^~~~
>> fs/f2fs/file.c:4071:38: error: use of undeclared identifier 'COMPR_MODE_USER'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
^
fs/f2fs/file.c:4144:21: error: no member named 'compress_mode' in 'struct f2fs_mount_info'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
fs/f2fs/file.c:4144:38: error: use of undeclared identifier 'COMPR_MODE_USER'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
^
fs/f2fs/file.c:4144:21: error: no member named 'compress_mode' in 'struct f2fs_mount_info'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:61: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
fs/f2fs/file.c:4144:38: error: use of undeclared identifier 'COMPR_MODE_USER'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
^
fs/f2fs/file.c:4144:21: error: no member named 'compress_mode' in 'struct f2fs_mount_info'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
~~~~~~~~~~~~~~~~~^~~~~
include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
(cond) ? \
^~~~
fs/f2fs/file.c:4144:38: error: use of undeclared identifier 'COMPR_MODE_USER'
F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
^
>> fs/f2fs/file.c:4172:24: error: use of undeclared identifier 'FI_ENABLE_COMPRESS'
set_inode_flag(inode, FI_ENABLE_COMPRESS);
^
fs/f2fs/file.c:4195:26: error: use of undeclared identifier 'FI_ENABLE_COMPRESS'
clear_inode_flag(inode, FI_ENABLE_COMPRESS);
^
14 errors generated.
vim +4071 fs/f2fs/file.c
4059
4060 static int f2fs_ioc_decompress_file(struct file *filp, unsigned long arg)
4061 {
4062 struct inode *inode = file_inode(filp);
4063 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
4064 struct f2fs_inode_info *fi = F2FS_I(inode);
4065 pgoff_t page_idx = 0, last_idx;
4066 unsigned int blk_per_seg = sbi->blocks_per_seg;
4067 int cluster_size = F2FS_I(inode)->i_cluster_size;
4068 int count, ret;
4069
4070 if (!f2fs_sb_has_compression(sbi) ||
> 4071 F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
4072 return -EOPNOTSUPP;
4073
4074 if (!(filp->f_mode & FMODE_WRITE))
4075 return -EBADF;
4076
4077 if (!f2fs_compressed_file(inode))
4078 return -EINVAL;
4079
4080 f2fs_balance_fs(F2FS_I_SB(inode), true);
4081
4082 file_start_write(filp);
4083 inode_lock(inode);
4084
4085 if (!f2fs_is_compress_backend_ready(inode)) {
4086 ret = -EOPNOTSUPP;
4087 goto out;
4088 }
4089
4090 if (f2fs_is_mmap_file(inode)) {
4091 ret = -EBUSY;
4092 goto out;
4093 }
4094
4095 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
4096 if (ret)
4097 goto out;
4098
4099 if (!atomic_read(&fi->i_compr_blocks))
4100 goto out;
4101
4102 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
4103
4104 count = last_idx - page_idx;
4105 while (count) {
4106 int len = min(cluster_size, count);
4107
4108 ret = redirty_blocks(inode, page_idx, len);
4109 if (ret < 0)
4110 break;
4111
4112 if (get_dirty_pages(inode) >= blk_per_seg)
4113 filemap_fdatawrite(inode->i_mapping);
4114
4115 count -= len;
4116 page_idx += len;
4117 }
4118
4119 if (!ret)
4120 ret = filemap_write_and_wait_range(inode->i_mapping, 0,
4121 LLONG_MAX);
4122
4123 if (ret)
4124 f2fs_warn(sbi, "%s: The file might be partially decompressed "
4125 "(errno=%d). Please delete the file.\n",
4126 __func__, ret);
4127 out:
4128 inode_unlock(inode);
4129 file_end_write(filp);
4130
4131 return ret;
4132 }
4133
4134 static int f2fs_ioc_compress_file(struct file *filp, unsigned long arg)
4135 {
4136 struct inode *inode = file_inode(filp);
4137 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
4138 pgoff_t page_idx = 0, last_idx;
4139 unsigned int blk_per_seg = sbi->blocks_per_seg;
4140 int cluster_size = F2FS_I(inode)->i_cluster_size;
4141 int count, ret;
4142
4143 if (!f2fs_sb_has_compression(sbi) ||
4144 F2FS_OPTION(sbi).compress_mode != COMPR_MODE_USER)
4145 return -EOPNOTSUPP;
4146
4147 if (!(filp->f_mode & FMODE_WRITE))
4148 return -EBADF;
4149
4150 if (!f2fs_compressed_file(inode))
4151 return -EINVAL;
4152
4153 f2fs_balance_fs(F2FS_I_SB(inode), true);
4154
4155 file_start_write(filp);
4156 inode_lock(inode);
4157
4158 if (!f2fs_is_compress_backend_ready(inode)) {
4159 ret = -EOPNOTSUPP;
4160 goto out;
4161 }
4162
4163 if (f2fs_is_mmap_file(inode)) {
4164 ret = -EBUSY;
4165 goto out;
4166 }
4167
4168 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
4169 if (ret)
4170 goto out;
4171
> 4172 set_inode_flag(inode, FI_ENABLE_COMPRESS);
4173
4174 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
4175
4176 count = last_idx - page_idx;
4177 while (count) {
4178 int len = min(cluster_size, count);
4179
4180 ret = redirty_blocks(inode, page_idx, len);
4181 if (ret < 0)
4182 break;
4183
4184 if (get_dirty_pages(inode) >= blk_per_seg)
4185 filemap_fdatawrite(inode->i_mapping);
4186
4187 count -= len;
4188 page_idx += len;
4189 }
4190
4191 if (!ret)
4192 ret = filemap_write_and_wait_range(inode->i_mapping, 0,
4193 LLONG_MAX);
4194
4195 clear_inode_flag(inode, FI_ENABLE_COMPRESS);
4196
4197 if (ret)
4198 f2fs_warn(sbi, "%s: The file might be partially compressed "
4199 "(errno=%d). Please delete the file.\n",
4200 __func__, ret);
4201 out:
4202 inode_unlock(inode);
4203 file_end_write(filp);
4204
4205 return ret;
4206 }
4207
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37267 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
2020-12-03 6:56 ` [f2fs-dev] " Daeho Jeong
@ 2020-12-08 3:49 ` Eric Biggers
-1 siblings, 0 replies; 11+ messages in thread
From: Eric Biggers @ 2020-12-08 3:49 UTC (permalink / raw)
To: Daeho Jeong; +Cc: linux-kernel, linux-f2fs-devel, kernel-team, Daeho Jeong
On Thu, Dec 03, 2020 at 03:56:15PM +0900, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
>
> Added two ioctl to decompress/compress explicitly the compression
> enabled file in "compress_mode=user" mount option.
>
> Using these two ioctls, the users can make a control of compression
> and decompression of their files.
>
> Signed-off-by: Daeho Jeong <daehojeong@google.com>
> ---
I still don't understand the purpose of these new ioctls. What's wrong with
just FS_IOC_SETFLAGS(FS_COMPRESS_FL) to compress a file, or FS_IOC_SETFLAGS(0)
to decompress a file? That appears to already be supported...
- Eric
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
@ 2020-12-08 3:49 ` Eric Biggers
0 siblings, 0 replies; 11+ messages in thread
From: Eric Biggers @ 2020-12-08 3:49 UTC (permalink / raw)
To: Daeho Jeong; +Cc: Daeho Jeong, kernel-team, linux-kernel, linux-f2fs-devel
On Thu, Dec 03, 2020 at 03:56:15PM +0900, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
>
> Added two ioctl to decompress/compress explicitly the compression
> enabled file in "compress_mode=user" mount option.
>
> Using these two ioctls, the users can make a control of compression
> and decompression of their files.
>
> Signed-off-by: Daeho Jeong <daehojeong@google.com>
> ---
I still don't understand the purpose of these new ioctls. What's wrong with
just FS_IOC_SETFLAGS(FS_COMPRESS_FL) to compress a file, or FS_IOC_SETFLAGS(0)
to decompress a file? That appears to already be supported...
- Eric
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
2020-12-03 6:56 ` [f2fs-dev] " Daeho Jeong
@ 2020-12-09 6:45 ` Chao Yu
-1 siblings, 0 replies; 11+ messages in thread
From: Chao Yu @ 2020-12-09 6:45 UTC (permalink / raw)
To: Daeho Jeong, linux-kernel, linux-f2fs-devel, kernel-team; +Cc: Daeho Jeong
On 2020/12/3 14:56, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
> + f2fs_balance_fs(F2FS_I_SB(inode), true);
Trivial cleanup:
f2fs_balance_fs(sbi, true);
> + f2fs_balance_fs(F2FS_I_SB(inode), true);
Ditto,
Jaegeuk could fix this directly?
Thanks,
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
@ 2020-12-09 6:45 ` Chao Yu
0 siblings, 0 replies; 11+ messages in thread
From: Chao Yu @ 2020-12-09 6:45 UTC (permalink / raw)
To: Daeho Jeong, linux-kernel, linux-f2fs-devel, kernel-team; +Cc: Daeho Jeong
On 2020/12/3 14:56, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
> + f2fs_balance_fs(F2FS_I_SB(inode), true);
Trivial cleanup:
f2fs_balance_fs(sbi, true);
> + f2fs_balance_fs(F2FS_I_SB(inode), true);
Ditto,
Jaegeuk could fix this directly?
Thanks,
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
2020-12-09 6:45 ` Chao Yu
@ 2020-12-09 8:25 ` Jaegeuk Kim
-1 siblings, 0 replies; 11+ messages in thread
From: Jaegeuk Kim @ 2020-12-09 8:25 UTC (permalink / raw)
To: Chao Yu
Cc: Daeho Jeong, linux-kernel, linux-f2fs-devel, kernel-team, Daeho Jeong
On 12/09, Chao Yu wrote:
> On 2020/12/3 14:56, Daeho Jeong wrote:
> > From: Daeho Jeong <daehojeong@google.com>
> > + f2fs_balance_fs(F2FS_I_SB(inode), true);
>
> Trivial cleanup:
>
> f2fs_balance_fs(sbi, true);
>
> > + f2fs_balance_fs(F2FS_I_SB(inode), true);
>
> Ditto,
>
> Jaegeuk could fix this directly?
Let's fix this later, since I'd like to freeze -next branch as much as possible.
>
> Thanks,
>
>
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE
@ 2020-12-09 8:25 ` Jaegeuk Kim
0 siblings, 0 replies; 11+ messages in thread
From: Jaegeuk Kim @ 2020-12-09 8:25 UTC (permalink / raw)
To: Chao Yu; +Cc: Daeho Jeong, kernel-team, linux-kernel, linux-f2fs-devel
On 12/09, Chao Yu wrote:
> On 2020/12/3 14:56, Daeho Jeong wrote:
> > From: Daeho Jeong <daehojeong@google.com>
> > + f2fs_balance_fs(F2FS_I_SB(inode), true);
>
> Trivial cleanup:
>
> f2fs_balance_fs(sbi, true);
>
> > + f2fs_balance_fs(F2FS_I_SB(inode), true);
>
> Ditto,
>
> Jaegeuk could fix this directly?
Let's fix this later, since I'd like to freeze -next branch as much as possible.
>
> Thanks,
>
>
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2020-12-09 8:26 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-03 6:56 [PATCH v3] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE Daeho Jeong
2020-12-03 6:56 ` [f2fs-dev] " Daeho Jeong
2020-12-03 7:07 ` Chao Yu
2020-12-03 7:07 ` Chao Yu
2020-12-03 9:51 ` kernel test robot
2020-12-08 3:49 ` [f2fs-dev] " Eric Biggers
2020-12-08 3:49 ` Eric Biggers
2020-12-09 6:45 ` Chao Yu
2020-12-09 6:45 ` Chao Yu
2020-12-09 8:25 ` Jaegeuk Kim
2020-12-09 8:25 ` Jaegeuk Kim
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.