From: Eric Biggers <ebiggers@kernel.org>
To: Daeho Jeong <daeho43@gmail.com>
Cc: kernel-team@android.com, Daeho Jeong <daehojeong@google.com>,
linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org
Subject: Re: [f2fs-dev] [PATCH v2] f2fs: add F2FS_IOC_SEC_TRIM_FILE ioctl
Date: Thu, 11 Jun 2020 09:19:13 -0700 [thread overview]
Message-ID: <20200611161913.GA1152@sol.localdomain> (raw)
In-Reply-To: <CACOAw_zyNFMYC3pTK3dT4yRgqp+-6yy3m2E64dkDkpNFKZicfQ@mail.gmail.com>
On Thu, Jun 11, 2020 at 08:04:06PM +0900, Daeho Jeong wrote:
> > > +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;
> > > + pgoff_t index, pg_start = 0, pg_end;
> > > + block_t prev_block = 0, len = 0;
> > > + u32 flags;
> > > + int ret = 0;
> > > +
> > > + if (!(filp->f_mode & FMODE_WRITE))
> > > + return -EBADF;
> > > +
> > > + if (get_user(flags, (u32 __user *)arg))
> > > + return -EFAULT;
> > > + if (flags == 0 || (flags & ~F2FS_TRIM_FILE_MASK))
> > > + return -EINVAL;
> > > +
> > > + if ((flags & F2FS_TRIM_FILE_DISCARD) && !f2fs_hw_support_discard(sbi))
> > > + return -EOPNOTSUPP;
> > > +
> > > + file_start_write(filp);
> >
> > Now, I'm a little confused about when we need to call __mnt_want_write_file(),
> > you know, vfs_write() still will call this function when updating time.
> > - __generic_file_write_iter
> > - file_update_time
> > - __mnt_want_write_file
> >
> > And previously, f2fs ioctl uses mnt_{want,drop}_write_file() whenever there is
> > any updates on fs/file, if Eric is correct, we need to clean up most of ioctl
> > interface as well.
>
> I also saw most filesytem codes use just mnt_{want,drop}_write_file()
> and actually it doesn't affect code working. It's a matter of doing a
> redundant job or not.
> AFAIUI, if the file is not open for writing (FMODE_WRITE), we have to
> call mnt_want_write_file() to increase mnt_writers.
> In this case, we already checked it has FMODE_WRITE flag.
If the fd isn't writable (or may not be writable), mnt_want_write_file() is
needed. That includes all ioctls that operate (or may operate) on directories,
since directories can't be opened for writing.
But when the fd is guaranteed to be writable, incrementing mnt_writers is
pointless. I'm trying to clean this up in the VFS:
https://lkml.kernel.org/r/20200611160534.55042-1-ebiggers@kernel.org.
mnt_want_write_file() still does the freeze protection, which file_start_write()
achieves more directly.
The only other thing that mnt_want_write_file() does is the check for emergency
remount r/o, which I doubt is very important. It's racy, so the filesystem
needs to detect it in other places too.
I'm not sure why file_update_time() uses __mnt_want_write_file(). Either it
assumes the fd might not be writable, or it just wants the check for emergency
remount r/o, or it's just a mistake. Note also that mtime isn't always updated,
so just because file_update_time() calls __mnt_want_write_file() doesn't mean
that write() always calls __mnt_want_write_file().
- 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: Chao Yu <yuchao0@huawei.com>, 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 v2] f2fs: add F2FS_IOC_SEC_TRIM_FILE ioctl
Date: Thu, 11 Jun 2020 09:19:13 -0700 [thread overview]
Message-ID: <20200611161913.GA1152@sol.localdomain> (raw)
In-Reply-To: <CACOAw_zyNFMYC3pTK3dT4yRgqp+-6yy3m2E64dkDkpNFKZicfQ@mail.gmail.com>
On Thu, Jun 11, 2020 at 08:04:06PM +0900, Daeho Jeong wrote:
> > > +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;
> > > + pgoff_t index, pg_start = 0, pg_end;
> > > + block_t prev_block = 0, len = 0;
> > > + u32 flags;
> > > + int ret = 0;
> > > +
> > > + if (!(filp->f_mode & FMODE_WRITE))
> > > + return -EBADF;
> > > +
> > > + if (get_user(flags, (u32 __user *)arg))
> > > + return -EFAULT;
> > > + if (flags == 0 || (flags & ~F2FS_TRIM_FILE_MASK))
> > > + return -EINVAL;
> > > +
> > > + if ((flags & F2FS_TRIM_FILE_DISCARD) && !f2fs_hw_support_discard(sbi))
> > > + return -EOPNOTSUPP;
> > > +
> > > + file_start_write(filp);
> >
> > Now, I'm a little confused about when we need to call __mnt_want_write_file(),
> > you know, vfs_write() still will call this function when updating time.
> > - __generic_file_write_iter
> > - file_update_time
> > - __mnt_want_write_file
> >
> > And previously, f2fs ioctl uses mnt_{want,drop}_write_file() whenever there is
> > any updates on fs/file, if Eric is correct, we need to clean up most of ioctl
> > interface as well.
>
> I also saw most filesytem codes use just mnt_{want,drop}_write_file()
> and actually it doesn't affect code working. It's a matter of doing a
> redundant job or not.
> AFAIUI, if the file is not open for writing (FMODE_WRITE), we have to
> call mnt_want_write_file() to increase mnt_writers.
> In this case, we already checked it has FMODE_WRITE flag.
If the fd isn't writable (or may not be writable), mnt_want_write_file() is
needed. That includes all ioctls that operate (or may operate) on directories,
since directories can't be opened for writing.
But when the fd is guaranteed to be writable, incrementing mnt_writers is
pointless. I'm trying to clean this up in the VFS:
https://lkml.kernel.org/r/20200611160534.55042-1-ebiggers@kernel.org.
mnt_want_write_file() still does the freeze protection, which file_start_write()
achieves more directly.
The only other thing that mnt_want_write_file() does is the check for emergency
remount r/o, which I doubt is very important. It's racy, so the filesystem
needs to detect it in other places too.
I'm not sure why file_update_time() uses __mnt_want_write_file(). Either it
assumes the fd might not be writable, or it just wants the check for emergency
remount r/o, or it's just a mistake. Note also that mtime isn't always updated,
so just because file_update_time() calls __mnt_want_write_file() doesn't mean
that write() always calls __mnt_want_write_file().
- Eric
next prev parent reply other threads:[~2020-06-11 16:19 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-11 3:16 [f2fs-dev] [PATCH v2] f2fs: add F2FS_IOC_SEC_TRIM_FILE ioctl Daeho Jeong
2020-06-11 3:16 ` Daeho Jeong
2020-06-11 8:54 ` [f2fs-dev] " Chao Yu
2020-06-11 8:54 ` Chao Yu
2020-06-11 11:04 ` Daeho Jeong
2020-06-11 11:04 ` Daeho Jeong
2020-06-11 16:19 ` Eric Biggers [this message]
2020-06-11 16:19 ` Eric Biggers
2020-06-11 16:27 ` Eric Biggers
2020-06-11 16:27 ` Eric Biggers
2020-06-11 22:49 ` Daeho Jeong
2020-06-11 22:49 ` Daeho Jeong
2020-06-11 23:00 ` Eric Biggers
2020-06-11 23:00 ` Eric Biggers
2020-06-12 0:00 ` Daeho Jeong
2020-06-12 0:00 ` Daeho Jeong
2020-06-12 0:13 ` Eric Biggers
2020-06-12 0:13 ` Eric Biggers
-- strict thread matches above, loose matches on Subject: below --
2020-07-18 6:15 Daeho Jeong
2020-07-20 1:02 ` Chao Yu
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=20200611161913.GA1152@sol.localdomain \
--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.