From: Eric Biggers <ebiggers@kernel.org>
To: Daeho Jeong <daeho43@gmail.com>
Cc: Daeho Jeong <daehojeong@google.com>,
kernel-team@android.com, linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] f2fs: add F2FS_IOC_SEC_TRIM_FILE ioctl
Date: Tue, 9 Jun 2020 09:51:07 -0700 [thread overview]
Message-ID: <20200609165107.GA228564@gmail.com> (raw)
In-Reply-To: <20200609060137.143501-1-daeho43@gmail.com>
On Tue, Jun 09, 2020 at 03:01:37PM +0900, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
>
> Added a new ioctl to send discard commands or/and zero out
> to whole data area of a regular file for security reason.
With this ioctl available, what is the exact procedure to write and then later
securely erase a file on f2fs? In particular, how can the user prevent f2fs
from making multiple copies of file data blocks as part of garbage collection?
> +static int f2fs_secure_erase(struct block_device *bdev, block_t block,
> + block_t len, u32 flags)
> +{
> + struct request_queue *q = bdev_get_queue(bdev);
> + sector_t sector = SECTOR_FROM_BLOCK(block);
> + sector_t nr_sects = SECTOR_FROM_BLOCK(len);
> + int ret = 0;
> +
> + if (!q)
> + return -ENXIO;
Why can the request_queue be NULL here?
> +
> + if (flags & F2FS_TRIM_FILE_DISCARD)
> + ret = blkdev_issue_discard(bdev, sector, nr_sects, GFP_NOFS,
> + blk_queue_secure_erase(q) ?
> + BLKDEV_DISCARD_SECURE : 0);
> +
> + if (!ret && flags & F2FS_TRIM_FILE_ZEROOUT)
> + ret = blkdev_issue_zeroout(bdev, sector, nr_sects, GFP_NOFS, 0);
> +
> + return ret;
> +}
> +
> +static int f2fs_sec_trim_file(struct file *filp, unsigned long arg)
> +{
> + struct inode *inode = file_inode(filp);
> + struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
> + struct address_space *mapping = inode->i_mapping;
> + struct block_device *prev_bdev = NULL;
> + loff_t file_size;
> + pgoff_t index, pg_start = 0, pg_end;
> + block_t prev_block = 0, len = 0;
> + u32 flags;
> + int ret = 0;
> +
> + if (!S_ISREG(inode->i_mode) || f2fs_is_atomic_file(inode) ||
> + f2fs_compressed_file(inode))
> + return -EINVAL;
Is it valid to check f2fs_is_atomic_file() and f2fs_compressed_file() outside of
inode_lock()?
> +
> + if (f2fs_readonly(sbi->sb))
> + return -EROFS;
Isn't this redundant with mnt_want_write_file()?
Also, shouldn't write access to the file be required, i.e.
(filp->f_mode & FMODE_WRITE)? Then the f2fs_readonly() and
mnt_want_write_file() checks would be unnecessary.
> +
> + if (f2fs_lfs_mode(sbi))
> + return -EOPNOTSUPP;
Doesn't this check have to be serialized with remount?
> +
> + if (get_user(flags, (u32 __user *)arg))
> + return -EFAULT;
> + if (!(flags & F2FS_TRIM_FILE_MASK))
> + return -EINVAL;
Need to reject unknown flags:
if (flags & ~F2FS_TRIM_FILE_MASK)
return -EINVAL;
> +
> + if (flags & F2FS_TRIM_FILE_DISCARD && !f2fs_hw_support_discard(sbi))
> + return -EOPNOTSUPP;
> +
> + ret = mnt_want_write_file(filp);
> + if (ret)
> + return ret;
> +
> + inode_lock(inode);
> +
> + file_size = i_size_read(inode);
> + if (!file_size)
> + goto err;
->i_size is stable while holding inode_lock(). So just use ->i_size instead of
i_size_read().
> + pg_end = (pgoff_t)round_up(file_size, PAGE_SIZE) >> PAGE_SHIFT;
This can be simplified to:
pg_end = DIV_ROUND_UP(file_size, PAGE_SIZE);
- Eric
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
WARNING: multiple messages have this Message-ID (diff)
From: Eric Biggers <ebiggers@kernel.org>
To: Daeho Jeong <daeho43@gmail.com>
Cc: linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com,
Daeho Jeong <daehojeong@google.com>
Subject: Re: [f2fs-dev] [PATCH] f2fs: add F2FS_IOC_SEC_TRIM_FILE ioctl
Date: Tue, 9 Jun 2020 09:51:07 -0700 [thread overview]
Message-ID: <20200609165107.GA228564@gmail.com> (raw)
In-Reply-To: <20200609060137.143501-1-daeho43@gmail.com>
On Tue, Jun 09, 2020 at 03:01:37PM +0900, Daeho Jeong wrote:
> From: Daeho Jeong <daehojeong@google.com>
>
> Added a new ioctl to send discard commands or/and zero out
> to whole data area of a regular file for security reason.
With this ioctl available, what is the exact procedure to write and then later
securely erase a file on f2fs? In particular, how can the user prevent f2fs
from making multiple copies of file data blocks as part of garbage collection?
> +static int f2fs_secure_erase(struct block_device *bdev, block_t block,
> + block_t len, u32 flags)
> +{
> + struct request_queue *q = bdev_get_queue(bdev);
> + sector_t sector = SECTOR_FROM_BLOCK(block);
> + sector_t nr_sects = SECTOR_FROM_BLOCK(len);
> + int ret = 0;
> +
> + if (!q)
> + return -ENXIO;
Why can the request_queue be NULL here?
> +
> + if (flags & F2FS_TRIM_FILE_DISCARD)
> + ret = blkdev_issue_discard(bdev, sector, nr_sects, GFP_NOFS,
> + blk_queue_secure_erase(q) ?
> + BLKDEV_DISCARD_SECURE : 0);
> +
> + if (!ret && flags & F2FS_TRIM_FILE_ZEROOUT)
> + ret = blkdev_issue_zeroout(bdev, sector, nr_sects, GFP_NOFS, 0);
> +
> + return ret;
> +}
> +
> +static int f2fs_sec_trim_file(struct file *filp, unsigned long arg)
> +{
> + struct inode *inode = file_inode(filp);
> + struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
> + struct address_space *mapping = inode->i_mapping;
> + struct block_device *prev_bdev = NULL;
> + loff_t file_size;
> + pgoff_t index, pg_start = 0, pg_end;
> + block_t prev_block = 0, len = 0;
> + u32 flags;
> + int ret = 0;
> +
> + if (!S_ISREG(inode->i_mode) || f2fs_is_atomic_file(inode) ||
> + f2fs_compressed_file(inode))
> + return -EINVAL;
Is it valid to check f2fs_is_atomic_file() and f2fs_compressed_file() outside of
inode_lock()?
> +
> + if (f2fs_readonly(sbi->sb))
> + return -EROFS;
Isn't this redundant with mnt_want_write_file()?
Also, shouldn't write access to the file be required, i.e.
(filp->f_mode & FMODE_WRITE)? Then the f2fs_readonly() and
mnt_want_write_file() checks would be unnecessary.
> +
> + if (f2fs_lfs_mode(sbi))
> + return -EOPNOTSUPP;
Doesn't this check have to be serialized with remount?
> +
> + if (get_user(flags, (u32 __user *)arg))
> + return -EFAULT;
> + if (!(flags & F2FS_TRIM_FILE_MASK))
> + return -EINVAL;
Need to reject unknown flags:
if (flags & ~F2FS_TRIM_FILE_MASK)
return -EINVAL;
> +
> + if (flags & F2FS_TRIM_FILE_DISCARD && !f2fs_hw_support_discard(sbi))
> + return -EOPNOTSUPP;
> +
> + ret = mnt_want_write_file(filp);
> + if (ret)
> + return ret;
> +
> + inode_lock(inode);
> +
> + file_size = i_size_read(inode);
> + if (!file_size)
> + goto err;
->i_size is stable while holding inode_lock(). So just use ->i_size instead of
i_size_read().
> + pg_end = (pgoff_t)round_up(file_size, PAGE_SIZE) >> PAGE_SHIFT;
This can be simplified to:
pg_end = DIV_ROUND_UP(file_size, PAGE_SIZE);
- Eric
next prev parent reply other threads:[~2020-06-09 16:51 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-09 6:01 [f2fs-dev] [PATCH] f2fs: add F2FS_IOC_SEC_TRIM_FILE ioctl Daeho Jeong
2020-06-09 6:01 ` Daeho Jeong
2020-06-09 16:51 ` Eric Biggers [this message]
2020-06-09 16:51 ` [f2fs-dev] " Eric Biggers
2020-06-10 2:05 ` Daeho Jeong
2020-06-10 2:05 ` Daeho Jeong
2020-06-10 3:15 ` Eric Biggers
2020-06-10 3:15 ` Eric Biggers
2020-06-10 3:55 ` Daeho Jeong
2020-06-10 3:55 ` Daeho Jeong
2020-06-10 23:31 ` Daeho Jeong
2020-06-10 23:31 ` Daeho Jeong
2020-06-10 23:53 ` Daeho Jeong
2020-06-10 23:53 ` Daeho Jeong
2020-06-11 0:00 ` Eric Biggers
2020-06-11 0:00 ` Eric Biggers
2020-06-11 0:23 ` Daeho Jeong
2020-06-11 0:23 ` Daeho Jeong
2020-06-11 1:56 ` Eric Biggers
2020-06-11 1:56 ` Eric Biggers
2020-06-11 2:05 ` Daeho Jeong
2020-06-11 2:05 ` Daeho Jeong
-- strict thread matches above, loose matches on Subject: below --
2020-06-11 3:08 Daeho Jeong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200609165107.GA228564@gmail.com \
--to=ebiggers@kernel.org \
--cc=daeho43@gmail.com \
--cc=daehojeong@google.com \
--cc=kernel-team@android.com \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.