All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
To: Ryusuke Konishi
	<konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
Cc: linux-nilfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v2 3/3] nilfs2: implementation of NILFS_IOCTL_SET_SUINFO ioctl
Date: Fri, 24 Jan 2014 14:44:38 +0100	[thread overview]
Message-ID: <52E26E46.3030702@gmx.net> (raw)
In-Reply-To: <20140124.222016.110509397.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>

On 2014-01-24 14:20, Ryusuke Konishi wrote:
> On Tue, 21 Jan 2014 15:00:30 +0100, Andreas Rohner wrote:
>> With this ioctl the segment usage information in the SUFILE can be
>> updated from userspace.
>>
>> This is useful, because it allows the userspace GC to modify and update
>> segment usage entries for specific segments, which enables it to avoid
>> unnecessary write operations.
>>
>> If a segment needs to be cleaned, but there is no or very little free
>> space to be gained, the cleaning operation basically degrades to
>> needless expensive copying of data. In the end the only thing that
>> changes is the location of the data and a timestamp in the segment usage
>> info. With this ioctl the GC can skip the copying and update the segment
>> usage entries directly instead.
>>
>> Signed-off-by: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
>> ---
>>  fs/nilfs2/ioctl.c         | 50 +++++++++++++++++++++++++++++++++++++++++++++++
>>  include/linux/nilfs2_fs.h |  2 ++
>>  2 files changed, 52 insertions(+)
>>
>> diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c
>> index b44bdb2..c6a3faf 100644
>> --- a/fs/nilfs2/ioctl.c
>> +++ b/fs/nilfs2/ioctl.c
>> @@ -273,6 +273,13 @@ nilfs_ioctl_do_get_suinfo(struct the_nilfs *nilfs, __u64 *posp, int flags,
>>  	return ret;
>>  }
>>  
>> +static ssize_t
>> +nilfs_ioctl_do_set_suinfo(struct the_nilfs *nilfs, __u64 *posp, int flags,
>> +			  void *buf, size_t size, size_t nmembs)
>> +{
>> +	return nilfs_sufile_set_suinfo(nilfs->ns_sufile, buf, size, nmembs);
>> +}
>> +
>>  static int nilfs_ioctl_get_sustat(struct inode *inode, struct file *filp,
>>  				  unsigned int cmd, void __user *argp)
>>  {
>> @@ -767,6 +774,44 @@ out:
>>  	return ret;
>>  }
>>  
>> +static int nilfs_ioctl_set_info(struct inode *inode, struct file *filp,
>> +				unsigned int cmd, void __user *argp,
>> +				size_t membsz,
>> +				ssize_t (*dofunc)(struct the_nilfs *,
>> +						  __u64 *, int,
>> +						  void *, size_t, size_t))
>> +{
>> +	struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
>> +	struct nilfs_transaction_info ti;
>> +	struct nilfs_argv argv;
>> +	int ret;
>> +
>> +	if (!capable(CAP_SYS_ADMIN))
>> +		return -EPERM;
>> +
>> +	ret = mnt_want_write_file(filp);
>> +	if (ret)
>> +		return ret;
>> +
>> +	ret = -EFAULT;
>> +	if (copy_from_user(&argv, argp, sizeof(argv)))
>> +		goto out;
>> +
>> +	if (argv.v_size < membsz)
>> +		return -EINVAL;
>> +
>> +	nilfs_transaction_begin(inode->i_sb, &ti, 0);
>> +	ret = nilfs_ioctl_wrap_copy(nilfs, &argv, _IOC_DIR(cmd), dofunc);
> 
> Hmm, we have a problem here.
> 
> nilfs_ioctl_wrap_copy() cannot be used between
> nilfs_transcation_begin() and nilfs_transaction_end() since
> nilfs_ioctl_wrap_copy() calls copy_from_user() and/or copy_to_user().
> Unfortunately there is a lock order restriction for these functions.
> 
> Let's use vmalloc() like nilfs_ioctl_clean_segments().  The following
> is a sample code for this:
> 
> 	size_t len;
> 	void __user *base;
> 	void *kbuf;
> 	int ret;
> 
> 	...
> 	ret = -EINVAL;
> 	if (argv.v_size < sizeof(struct nilfs_suinfo_update))
> 		goto out;
> 
> 	< range check of argv.v_nmembs >
> 
> 	len = argv.v_size * argv.v_nmembs;
> 	base = (void __user *)(unsigned long)argv.v_base;
> 	kbuf = vmalloc(len);
> 	if (!kbuf) {
> 		ret = -ENOMEM;
> 		goto out;
> 	}
> 
> 	if (copy_from_user(kbuf, base, len)) {
> 		ret = -EFAULT;
> 		goto out_free;
> 	}
> 
> 	nilfs_transaction_begin(inode->i_sb, &ti, 0);
> 	ret = < call nilfs_sufile_set_suinfo > ;
> 	if (unlikely(ret < 0))
> 		nilfs_transcation_abort(inode->i_sb);
> 	else
> 		nilfs_transcation_commit(inode->i_sb);
> 
> out_free:
> 	vfree(kbuf);
> out:
> 	mnt_drop_write_file(filp);
> 	...
> 

Then we don't need the ugly nilfs_suinfo_update structure. I can just
send an array of struct nilfs_argv[2]. First element has the segment
numbers and second element has the nilfs_suinfo structures and flags are
in v_flags. Would that be acceptable?

br,
Andreas Rohner
--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2014-01-24 13:44 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-21 13:59 [PATCH v2 0/5] nilfs-utils: skip inefficient gc operations Andreas Rohner
     [not found] ` <cover.1390310509.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-21 13:59   ` [PATCH v2 1/5] nilfs-utils: cldconfig add an option to set minimal free blocks Andreas Rohner
     [not found]     ` <22b5b3ac403052d3044dc8c1bebe323191376c03.1390310509.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-21 14:10       ` dexen deVries
2014-01-21 14:38         ` Andreas Rohner
2014-01-21 14:53       ` Andreas Rohner
2014-01-23 17:49       ` Vyacheslav Dubeyko
     [not found]         ` <B1FCAEBD-EB58-4A06-BD6B-7D4FB533D9F1-yeENwD64cLxBDgjK7y7TUQ@public.gmane.org>
2014-01-23 18:31           ` Andreas Rohner
2014-01-21 13:59   ` [PATCH v2 2/5] nilfs-utils: cleanerd: add custom error value to enable fast retry Andreas Rohner
     [not found]     ` <e9d3dd17318a994fe7e2c100368212e0b4029e13.1390310509.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-23 17:49       ` Vyacheslav Dubeyko
     [not found]         ` <FE7FB751-68F4-48C3-A97A-782F4F6E69FE-yeENwD64cLxBDgjK7y7TUQ@public.gmane.org>
2014-01-23 19:08           ` Andreas Rohner
2014-01-21 13:59   ` [PATCH v2 3/5] nilfs-utils: refactoring of nilfs_reclaim_segment to add minblocks param Andreas Rohner
     [not found]     ` <36ef66ee15b3de8ca00815a6baa7bf6b62ca57d4.1390310509.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24 18:04       ` Ryusuke Konishi
2014-01-21 13:59   ` [PATCH v2 4/5] nilfs-utils: add support for NILFS_IOCTL_SET_SUINFO ioctl Andreas Rohner
     [not found]     ` <72f8c37258d08ba9793b0c1bb0374dd8efcd4756.1390310509.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-23 17:49       ` Vyacheslav Dubeyko
     [not found]         ` <62FA32DB-83AC-4570-BD73-618C169390FE-yeENwD64cLxBDgjK7y7TUQ@public.gmane.org>
2014-01-23 19:17           ` Andreas Rohner
     [not found]             ` <52E16AE4.4000303-hi6Y0CQ0nG0@public.gmane.org>
2014-01-25 16:16               ` Vyacheslav Dubeyko
2014-01-24 18:26       ` Ryusuke Konishi
     [not found]         ` <20140125.032633.184837411.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2014-01-24 20:00           ` Andreas Rohner
     [not found]             ` <52E2C643.3070704-hi6Y0CQ0nG0@public.gmane.org>
2014-01-25 18:52               ` Ryusuke Konishi
2014-01-26 10:00               ` Ryusuke Konishi
     [not found]                 ` <20140126.190004.443429632.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2014-01-26 11:24                   ` Andreas Rohner
2014-01-21 13:59   ` [PATCH v2 5/5] nilfs-utils: man: add description of min_free_blocks_threshold Andreas Rohner
2014-01-21 14:00   ` [PATCH v2 1/3] nilfs2: add new nilfs_suinfo_update struct Andreas Rohner
     [not found]     ` <cec6a449ddf5ae9da2928cdddfb96ebcb2789eee.1390312777.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-21 14:00       ` [PATCH v2 2/3] nilfs2: add nilfs_sufile_set_suinfo to update segment usage info Andreas Rohner
     [not found]         ` <2fd48b2d524a59a02bdad13c0c194de3e5b55cc7.1390312777.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24 11:56           ` Ryusuke Konishi
     [not found]             ` <20140124.205623.400541300.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2014-01-24 12:34               ` Andreas Rohner
     [not found]                 ` <52E25DDC.2060502-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24 16:34                   ` Ryusuke Konishi
2014-01-21 14:00       ` [PATCH v2 3/3] nilfs2: implementation of NILFS_IOCTL_SET_SUINFO ioctl Andreas Rohner
     [not found]         ` <6fb5a6d45afca9ae2599c471c0e42805ed1b6c55.1390312777.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24 13:20           ` Ryusuke Konishi
     [not found]             ` <20140124.222016.110509397.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2014-01-24 13:44               ` Andreas Rohner [this message]
     [not found]                 ` <52E26E46.3030702-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24 15:23                   ` Ryusuke Konishi
2014-01-24  4:56       ` [PATCH v2 1/3] nilfs2: add new nilfs_suinfo_update struct Ryusuke Konishi
     [not found]         ` <20140124.135635.27780504.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2014-01-24 12:11           ` Andreas Rohner
     [not found]             ` <52E25883.3010307-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24 12:37               ` Ryusuke Konishi
2014-01-22 23:46   ` [PATCH v2 0/5] nilfs-utils: skip inefficient gc operations Michael L. Semon
     [not found]     ` <52E05863.90604-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-23 10:25       ` Andreas Rohner
     [not found]         ` <52E0EE08.3040703-hi6Y0CQ0nG0@public.gmane.org>
2014-01-23 20:57           ` Michael L. Semon
2014-01-23 17:48   ` Vyacheslav Dubeyko
     [not found]     ` <85EBEC6B-CA69-472A-8DDD-8E056F809EC4-yeENwD64cLxBDgjK7y7TUQ@public.gmane.org>
2014-01-23 18:12       ` Andreas Rohner
     [not found]         ` <52E15B9E.6040307-hi6Y0CQ0nG0@public.gmane.org>
2014-01-24  8:02           ` Vyacheslav Dubeyko
     [not found]             ` <FC7F25C5-1E72-4DF5-B860-FBCE36E91EAB-yeENwD64cLxBDgjK7y7TUQ@public.gmane.org>
2014-01-24 14:18               ` Andreas Rohner
     [not found]                 ` <52E27651.6070207-hi6Y0CQ0nG0@public.gmane.org>
2014-01-25 16:33                   ` Vyacheslav Dubeyko
     [not found]                     ` <82ACC3FC-BE83-483F-99D8-D13F4D02C58F-yeENwD64cLxBDgjK7y7TUQ@public.gmane.org>
2014-01-26  6:57                       ` Ryusuke Konishi
     [not found]                         ` <20140126.155740.56352351.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2014-01-26 10:36                           ` Andreas Rohner

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=52E26E46.3030702@gmx.net \
    --to=andreas.rohner-hi6y0cq0ng0@public.gmane.org \
    --cc=konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org \
    --cc=linux-nilfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.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.