* [PATCH v3 0/2] nilfs2: add support for FITRIM ioctl
@ 2014-02-21 14:56 Andreas Rohner
[not found] ` <cover.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
0 siblings, 1 reply; 5+ messages in thread
From: Andreas Rohner @ 2014-02-21 14:56 UTC (permalink / raw)
To: linux-nilfs-u79uwXL29TY76Z2rM5mHXA; +Cc: Andreas Rohner
Hi,
This patch adds support for the FITRIM ioctl, which allows user space
tools like fstrim to issue TRIM/DISCARD requests to the underlying
device. It takes a fstrim_range structure as a parameter and for every
clean segment in the specified range the function blkdev_issue_discard
is called. The range is truncated to file system block boundaries.
I tested it with a 32 bit and 64 bit kernel. On the 32 bit system
CONFIG_LBDAF was disabled so that sector_t was 32 bit.
Best regards,
Andreas Rohner
---
v2->v3 (based on review by Ryusuke Konishi)
* Fix integer overflow
* Round range to block boundary instead of sector boundary
* Move range check to nilfs_sufile_trim_fs()
v1->v2 (based on review by Ryusuke Konishi)
* Remove upper limit of minlen
* Add check for minlen
* Round range to sector boundary instead of segment boundary
* Fix minor bug
* Use kmap_atomic instead of kmap
* Move input checks to ioctl.c
* Use nilfs_sufile_segment_usages_in_block()
--
Andreas Rohner (2):
nilfs2: add nilfs_sufile_trim_fs to trim clean segs
nilfs2: add FITRIM ioctl support for nilfs2
fs/nilfs2/ioctl.c | 46 +++++++++++++++++
fs/nilfs2/sufile.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++
fs/nilfs2/sufile.h | 1 +
3 files changed, 194 insertions(+)
--
1.9.0
--
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
^ permalink raw reply [flat|nested] 5+ messages in thread[parent not found: <cover.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>]
* [PATCH v3 1/2] nilfs2: add nilfs_sufile_trim_fs to trim clean segs [not found] ` <cover.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> @ 2014-02-21 14:56 ` Andreas Rohner [not found] ` <149e07e7a88e8dace12335b18e553d533c0f3443.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> 2014-02-21 14:56 ` [PATCH v3 2/2] nilfs2: add FITRIM ioctl support for nilfs2 Andreas Rohner 1 sibling, 1 reply; 5+ messages in thread From: Andreas Rohner @ 2014-02-21 14:56 UTC (permalink / raw) To: linux-nilfs-u79uwXL29TY76Z2rM5mHXA; +Cc: Andreas Rohner This patch adds the nilfs_sufile_trim_fs function, which takes a fstrim_range structure and calls blkdev_issue_discard for every clean segment in the specified range. The range is truncated to file system block boundaries. Signed-off-by: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> --- fs/nilfs2/sufile.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/nilfs2/sufile.h | 1 + 2 files changed, 148 insertions(+) diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index 3127e9f..6c3b350 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c @@ -870,6 +870,153 @@ ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum, void *buf, } /** + * nilfs_sufile_trim_fs() - trim ioctl handle function + * @sufile: inode of segment usage file + * @range: fstrim_range structure + * + * start: First Byte to trim + * len: number of Bytes to trim from start + * minlen: minimum extent length in Bytes + * + * Decription: nilfs_sufile_trim_fs goes through all segments containing bytes + * from start to start+len. start is rounded up to the next block boundary + * and start+len is rounded down. For each clean segment blkdev_issue_discard + * function is invoked. + * + * Return Value: On success, 0 is returned or negative error code, otherwise. + */ +int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) +{ + struct the_nilfs *nilfs = sufile->i_sb->s_fs_info; + struct buffer_head *su_bh; + struct nilfs_segment_usage *su; + void *kaddr; + size_t n, i, susz = NILFS_MDT(sufile)->mi_entry_size; + sector_t seg_start, seg_end, start_block, end_block; + sector_t start = 0, nblocks = 0; + u64 segnum, segnum_end, minlen, len, max_blocks, ndiscarded = 0; + int ret = 0; + unsigned int sects_per_block; + + sects_per_block = (1 << nilfs->ns_blocksize_bits) / + bdev_logical_block_size(nilfs->ns_bdev); + len = range->len >> nilfs->ns_blocksize_bits; + minlen = range->minlen >> nilfs->ns_blocksize_bits; + max_blocks = ((u64)nilfs->ns_nsegments * nilfs->ns_blocks_per_segment); + + if (!len || range->start >= max_blocks << nilfs->ns_blocksize_bits) + return -EINVAL; + + start_block = (range->start + nilfs->ns_blocksize - 1) >> + nilfs->ns_blocksize_bits; + + if (max_blocks - start_block < len) + end_block = max_blocks - 1; + else + end_block = start_block + len - 1; + + segnum = nilfs_get_segnum_of_block(nilfs, start_block); + segnum_end = nilfs_get_segnum_of_block(nilfs, end_block); + + down_read(&NILFS_MDT(sufile)->mi_sem); + + while (segnum <= segnum_end) { + n = nilfs_sufile_segment_usages_in_block(sufile, segnum, + segnum_end); + + ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, + &su_bh); + if (ret < 0) { + if (ret != -ENOENT) + goto out_sem; + /* hole */ + segnum += n; + continue; + } + + kaddr = kmap_atomic(su_bh->b_page); + su = nilfs_sufile_block_get_segment_usage(sufile, segnum, + su_bh, kaddr); + for (i = 0; i < n; ++i, ++segnum, su = (void *)su + susz) { + if (!nilfs_segment_usage_clean(su)) + continue; + + nilfs_get_segment_range(nilfs, segnum, &seg_start, + &seg_end); + + if (!nblocks) { + /* start new extent */ + start = seg_start; + nblocks = seg_end - seg_start + 1; + continue; + } + + if (start + nblocks == seg_start) { + /* add to previous extent */ + nblocks += seg_end - seg_start + 1; + continue; + } + + /* discard previous extent */ + if (start < start_block) { + nblocks -= start_block - start; + start = start_block; + } + + if (nblocks >= minlen) { + kunmap_atomic(kaddr); + + ret = blkdev_issue_discard(nilfs->ns_bdev, + start * sects_per_block, + nblocks * sects_per_block, + GFP_NOFS, 0); + if (ret < 0) { + put_bh(su_bh); + goto out_sem; + } + + ndiscarded += nblocks; + kaddr = kmap_atomic(su_bh->b_page); + su = nilfs_sufile_block_get_segment_usage( + sufile, segnum, su_bh, kaddr); + } + + /* start new extent */ + start = seg_start; + nblocks = seg_end - seg_start + 1; + } + kunmap_atomic(kaddr); + put_bh(su_bh); + } + + + if (nblocks) { + /* discard last extent */ + if (start < start_block) { + nblocks -= start_block - start; + start = start_block; + } + if (start + nblocks > end_block + 1) + nblocks = end_block - start + 1; + + if (nblocks >= minlen) { + ret = blkdev_issue_discard(nilfs->ns_bdev, + start * sects_per_block, + nblocks * sects_per_block, + GFP_NOFS, 0); + if (!ret) + ndiscarded += nblocks; + } + } + +out_sem: + up_read(&NILFS_MDT(sufile)->mi_sem); + + range->len = ndiscarded << nilfs->ns_blocksize_bits; + return ret; +} + +/** * nilfs_sufile_read - read or get sufile inode * @sb: super block instance * @susize: size of a segment usage entry diff --git a/fs/nilfs2/sufile.h b/fs/nilfs2/sufile.h index e84bc5b..2434abd 100644 --- a/fs/nilfs2/sufile.h +++ b/fs/nilfs2/sufile.h @@ -65,6 +65,7 @@ void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *, int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs); int nilfs_sufile_read(struct super_block *sb, size_t susize, struct nilfs_inode *raw_inode, struct inode **inodep); +int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range); /** * nilfs_sufile_scrap - make a segment garbage -- 1.9.0 -- 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 ^ permalink raw reply related [flat|nested] 5+ messages in thread
[parent not found: <149e07e7a88e8dace12335b18e553d533c0f3443.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>]
* Re: [PATCH v3 1/2] nilfs2: add nilfs_sufile_trim_fs to trim clean segs [not found] ` <149e07e7a88e8dace12335b18e553d533c0f3443.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> @ 2014-02-23 8:15 ` Ryusuke Konishi 0 siblings, 0 replies; 5+ messages in thread From: Ryusuke Konishi @ 2014-02-23 8:15 UTC (permalink / raw) To: Andreas Rohner; +Cc: linux-nilfs-u79uwXL29TY76Z2rM5mHXA On Fri, 21 Feb 2014 15:56:50 +0100, Andreas Rohner wrote: > This patch adds the nilfs_sufile_trim_fs function, which takes a > fstrim_range structure and calls blkdev_issue_discard for every > clean segment in the specified range. The range is truncated to > file system block boundaries. > > Signed-off-by: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> > --- > fs/nilfs2/sufile.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > fs/nilfs2/sufile.h | 1 + > 2 files changed, 148 insertions(+) > > diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c > index 3127e9f..6c3b350 100644 > --- a/fs/nilfs2/sufile.c > +++ b/fs/nilfs2/sufile.c > @@ -870,6 +870,153 @@ ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum, void *buf, > } > > /** > + * nilfs_sufile_trim_fs() - trim ioctl handle function > + * @sufile: inode of segment usage file > + * @range: fstrim_range structure > + * > + * start: First Byte to trim > + * len: number of Bytes to trim from start > + * minlen: minimum extent length in Bytes > + * > + * Decription: nilfs_sufile_trim_fs goes through all segments containing bytes > + * from start to start+len. start is rounded up to the next block boundary > + * and start+len is rounded down. For each clean segment blkdev_issue_discard > + * function is invoked. > + * > + * Return Value: On success, 0 is returned or negative error code, otherwise. > + */ > +int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) > +{ > + struct the_nilfs *nilfs = sufile->i_sb->s_fs_info; > + struct buffer_head *su_bh; > + struct nilfs_segment_usage *su; > + void *kaddr; > + size_t n, i, susz = NILFS_MDT(sufile)->mi_entry_size; > + sector_t seg_start, seg_end, start_block, end_block; > + sector_t start = 0, nblocks = 0; > + u64 segnum, segnum_end, minlen, len, max_blocks, ndiscarded = 0; > + int ret = 0; > + unsigned int sects_per_block; > + > + sects_per_block = (1 << nilfs->ns_blocksize_bits) / > + bdev_logical_block_size(nilfs->ns_bdev); > + len = range->len >> nilfs->ns_blocksize_bits; > + minlen = range->minlen >> nilfs->ns_blocksize_bits; > + max_blocks = ((u64)nilfs->ns_nsegments * nilfs->ns_blocks_per_segment); > + > + if (!len || range->start >= max_blocks << nilfs->ns_blocksize_bits) > + return -EINVAL; > + > + start_block = (range->start + nilfs->ns_blocksize - 1) >> > + nilfs->ns_blocksize_bits; > + > + if (max_blocks - start_block < len) > + end_block = max_blocks - 1; > + else > + end_block = start_block + len - 1; This patch looks good to me. When you resubmit this series, please add a comment to clarify why we do not simplify this as follows: end_block = min_t(sector_t, max_blocks, start_block + len) - 1; For example, /* * range->len can be very large (actually, it is set to * ULLONG_MAX by default) - truncate upper end of the range * carefully so as not to overflow. */ if (max_blocks - start_block < len) end_block = max_blocks - 1; else end_block = start_block + len - 1; Regards, Ryusuke Konishi > + > + segnum = nilfs_get_segnum_of_block(nilfs, start_block); > + segnum_end = nilfs_get_segnum_of_block(nilfs, end_block); > + > + down_read(&NILFS_MDT(sufile)->mi_sem); > + > + while (segnum <= segnum_end) { > + n = nilfs_sufile_segment_usages_in_block(sufile, segnum, > + segnum_end); > + > + ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, > + &su_bh); > + if (ret < 0) { > + if (ret != -ENOENT) > + goto out_sem; > + /* hole */ > + segnum += n; > + continue; > + } > + > + kaddr = kmap_atomic(su_bh->b_page); > + su = nilfs_sufile_block_get_segment_usage(sufile, segnum, > + su_bh, kaddr); > + for (i = 0; i < n; ++i, ++segnum, su = (void *)su + susz) { > + if (!nilfs_segment_usage_clean(su)) > + continue; > + > + nilfs_get_segment_range(nilfs, segnum, &seg_start, > + &seg_end); > + > + if (!nblocks) { > + /* start new extent */ > + start = seg_start; > + nblocks = seg_end - seg_start + 1; > + continue; > + } > + > + if (start + nblocks == seg_start) { > + /* add to previous extent */ > + nblocks += seg_end - seg_start + 1; > + continue; > + } > + > + /* discard previous extent */ > + if (start < start_block) { > + nblocks -= start_block - start; > + start = start_block; > + } > + > + if (nblocks >= minlen) { > + kunmap_atomic(kaddr); > + > + ret = blkdev_issue_discard(nilfs->ns_bdev, > + start * sects_per_block, > + nblocks * sects_per_block, > + GFP_NOFS, 0); > + if (ret < 0) { > + put_bh(su_bh); > + goto out_sem; > + } > + > + ndiscarded += nblocks; > + kaddr = kmap_atomic(su_bh->b_page); > + su = nilfs_sufile_block_get_segment_usage( > + sufile, segnum, su_bh, kaddr); > + } > + > + /* start new extent */ > + start = seg_start; > + nblocks = seg_end - seg_start + 1; > + } > + kunmap_atomic(kaddr); > + put_bh(su_bh); > + } > + > + > + if (nblocks) { > + /* discard last extent */ > + if (start < start_block) { > + nblocks -= start_block - start; > + start = start_block; > + } > + if (start + nblocks > end_block + 1) > + nblocks = end_block - start + 1; > + > + if (nblocks >= minlen) { > + ret = blkdev_issue_discard(nilfs->ns_bdev, > + start * sects_per_block, > + nblocks * sects_per_block, > + GFP_NOFS, 0); > + if (!ret) > + ndiscarded += nblocks; > + } > + } > + > +out_sem: > + up_read(&NILFS_MDT(sufile)->mi_sem); > + > + range->len = ndiscarded << nilfs->ns_blocksize_bits; > + return ret; > +} > + > +/** > * nilfs_sufile_read - read or get sufile inode > * @sb: super block instance > * @susize: size of a segment usage entry > diff --git a/fs/nilfs2/sufile.h b/fs/nilfs2/sufile.h > index e84bc5b..2434abd 100644 > --- a/fs/nilfs2/sufile.h > +++ b/fs/nilfs2/sufile.h > @@ -65,6 +65,7 @@ void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *, > int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs); > int nilfs_sufile_read(struct super_block *sb, size_t susize, > struct nilfs_inode *raw_inode, struct inode **inodep); > +int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range); > > /** > * nilfs_sufile_scrap - make a segment garbage > -- > 1.9.0 > > -- > 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 -- 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 2/2] nilfs2: add FITRIM ioctl support for nilfs2 [not found] ` <cover.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> 2014-02-21 14:56 ` [PATCH v3 1/2] nilfs2: add nilfs_sufile_trim_fs to trim clean segs Andreas Rohner @ 2014-02-21 14:56 ` Andreas Rohner [not found] ` <076207b0166aca9209a24c16c2a2f67329b69132.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> 1 sibling, 1 reply; 5+ messages in thread From: Andreas Rohner @ 2014-02-21 14:56 UTC (permalink / raw) To: linux-nilfs-u79uwXL29TY76Z2rM5mHXA; +Cc: Andreas Rohner This patch adds support for the FITRIM ioctl, which enables user space tools to issue TRIM/DISCARD requests to the underlying device. Every clean segment within the specified range will be discarded. Signed-off-by: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> --- fs/nilfs2/ioctl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 2b34021..8051cb3 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c @@ -1072,6 +1072,49 @@ out: } /** + * nilfs_ioctl_trim_fs() - trim ioctl handle function + * @inode: inode object + * @argp: pointer on argument from userspace + * + * Decription: nilfs_ioctl_trim_fs is the FITRIM ioctl handle function. It + * checks the arguments from userspace and calls nilfs_sufile_trim_fs, which + * performs the actual trim operation. + * + * Return Value: On success, 0 is returned or negative error code, otherwise. + */ +static int nilfs_ioctl_trim_fs(struct inode *inode, void __user *argp) +{ + struct the_nilfs *nilfs = inode->i_sb->s_fs_info; + struct request_queue *q = bdev_get_queue(nilfs->ns_bdev); + struct fstrim_range range; + int ret; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (!blk_queue_discard(q)) + return -EOPNOTSUPP; + + if (copy_from_user(&range, argp, sizeof(range))) + return -EFAULT; + + range.minlen = max_t(unsigned int, (unsigned int)range.minlen, + q->limits.discard_granularity); + + down_read(&nilfs->ns_segctor_sem); + ret = nilfs_sufile_trim_fs(nilfs->ns_sufile, &range); + up_read(&nilfs->ns_segctor_sem); + + if (ret < 0) + return ret; + + if (copy_to_user(argp, &range, sizeof(range))) + return -EFAULT; + + return 0; +} + +/** * nilfs_ioctl_set_alloc_range - limit range of segments to be allocated * @inode: inode object * @argp: pointer on argument from userspace @@ -1205,6 +1248,8 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) return nilfs_ioctl_resize(inode, filp, argp); case NILFS_IOCTL_SET_ALLOC_RANGE: return nilfs_ioctl_set_alloc_range(inode, argp); + case FITRIM: + return nilfs_ioctl_trim_fs(inode, argp); default: return -ENOTTY; } @@ -1235,6 +1280,7 @@ long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case NILFS_IOCTL_SYNC: case NILFS_IOCTL_RESIZE: case NILFS_IOCTL_SET_ALLOC_RANGE: + case FITRIM: break; default: return -ENOIOCTLCMD; -- 1.9.0 -- 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 ^ permalink raw reply related [flat|nested] 5+ messages in thread
[parent not found: <076207b0166aca9209a24c16c2a2f67329b69132.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>]
* Re: [PATCH v3 2/2] nilfs2: add FITRIM ioctl support for nilfs2 [not found] ` <076207b0166aca9209a24c16c2a2f67329b69132.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> @ 2014-02-23 7:13 ` Ryusuke Konishi 0 siblings, 0 replies; 5+ messages in thread From: Ryusuke Konishi @ 2014-02-23 7:13 UTC (permalink / raw) To: Andreas Rohner; +Cc: linux-nilfs-u79uwXL29TY76Z2rM5mHXA Hi Andreas, On Fri, 21 Feb 2014 15:56:51 +0100, Andreas Rohner wrote: > This patch adds support for the FITRIM ioctl, which enables user space > tools to issue TRIM/DISCARD requests to the underlying device. Every > clean segment within the specified range will be discarded. > > Signed-off-by: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org> > --- > fs/nilfs2/ioctl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c > index 2b34021..8051cb3 100644 > --- a/fs/nilfs2/ioctl.c > +++ b/fs/nilfs2/ioctl.c > @@ -1072,6 +1072,49 @@ out: > } > > /** > + * nilfs_ioctl_trim_fs() - trim ioctl handle function > + * @inode: inode object > + * @argp: pointer on argument from userspace > + * > + * Decription: nilfs_ioctl_trim_fs is the FITRIM ioctl handle function. It > + * checks the arguments from userspace and calls nilfs_sufile_trim_fs, which > + * performs the actual trim operation. > + * > + * Return Value: On success, 0 is returned or negative error code, otherwise. > + */ > +static int nilfs_ioctl_trim_fs(struct inode *inode, void __user *argp) > +{ > + struct the_nilfs *nilfs = inode->i_sb->s_fs_info; > + struct request_queue *q = bdev_get_queue(nilfs->ns_bdev); > + struct fstrim_range range; > + int ret; > + > + if (!capable(CAP_SYS_ADMIN)) > + return -EPERM; > + > + if (!blk_queue_discard(q)) > + return -EOPNOTSUPP; > + > + if (copy_from_user(&range, argp, sizeof(range))) > + return -EFAULT; > + > + range.minlen = max_t(unsigned int, (unsigned int)range.minlen, > + q->limits.discard_granularity); I just noticed that this can overflow since range.minlen has __u64 type. Should it be as follows ? range.minlen = max_t(u64, range.minlen, q->limits.discard_granularity); Regards, Ryusuke Konishi > + > + down_read(&nilfs->ns_segctor_sem); > + ret = nilfs_sufile_trim_fs(nilfs->ns_sufile, &range); > + up_read(&nilfs->ns_segctor_sem); > + > + if (ret < 0) > + return ret; > + > + if (copy_to_user(argp, &range, sizeof(range))) > + return -EFAULT; > + > + return 0; > +} > + > +/** > * nilfs_ioctl_set_alloc_range - limit range of segments to be allocated > * @inode: inode object > * @argp: pointer on argument from userspace > @@ -1205,6 +1248,8 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) > return nilfs_ioctl_resize(inode, filp, argp); > case NILFS_IOCTL_SET_ALLOC_RANGE: > return nilfs_ioctl_set_alloc_range(inode, argp); > + case FITRIM: > + return nilfs_ioctl_trim_fs(inode, argp); > default: > return -ENOTTY; > } > @@ -1235,6 +1280,7 @@ long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) > case NILFS_IOCTL_SYNC: > case NILFS_IOCTL_RESIZE: > case NILFS_IOCTL_SET_ALLOC_RANGE: > + case FITRIM: > break; > default: > return -ENOIOCTLCMD; > -- > 1.9.0 > > -- > 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 -- 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-02-23 8:15 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-21 14:56 [PATCH v3 0/2] nilfs2: add support for FITRIM ioctl Andreas Rohner
[not found] ` <cover.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-02-21 14:56 ` [PATCH v3 1/2] nilfs2: add nilfs_sufile_trim_fs to trim clean segs Andreas Rohner
[not found] ` <149e07e7a88e8dace12335b18e553d533c0f3443.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-02-23 8:15 ` Ryusuke Konishi
2014-02-21 14:56 ` [PATCH v3 2/2] nilfs2: add FITRIM ioctl support for nilfs2 Andreas Rohner
[not found] ` <076207b0166aca9209a24c16c2a2f67329b69132.1392994051.git.andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2014-02-23 7:13 ` Ryusuke Konishi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox