diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-04-06 22:01:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-07 11:31:18 -0400 |
commit | 1088dcf4c3a0a27fdad5214781d5084b11405238 (patch) | |
tree | 4d08f45ff4867d629e5ad4e94e0362e897ffa1e1 | |
parent | 76068c4ff1cc03d9d24d17fd9e6a1475bc2f6730 (diff) |
nilfs2: remove timedwait ioctl command
This removes NILFS_IOCTL_TIMEDWAIT command from ioctl interface along
with the related flags and wait queue.
The command is terrible because it just sleeps in the ioctl. I prefer
to avoid this by devising means of event polling in userland program.
By reconsidering the userland GC daemon, I found this is possible
without changing behaviour of the daemon and sacrificing efficiency.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | fs/nilfs2/ioctl.c | 95 | ||||
-rw-r--r-- | fs/nilfs2/segment.c | 5 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.c | 1 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.h | 6 | ||||
-rw-r--r-- | include/linux/nilfs2_fs.h | 22 |
5 files changed, 2 insertions, 127 deletions
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 9e4d9e64c8ff..85a291ccc1be 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -578,62 +578,9 @@ int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *nilfs, | |||
578 | static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, | 578 | static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, |
579 | unsigned int cmd, void __user *argp) | 579 | unsigned int cmd, void __user *argp) |
580 | { | 580 | { |
581 | int ret; | ||
582 | |||
583 | if (!capable(CAP_SYS_ADMIN)) | 581 | if (!capable(CAP_SYS_ADMIN)) |
584 | return -EPERM; | 582 | return -EPERM; |
585 | 583 | return nilfs_clean_segments(inode->i_sb, argp); | |
586 | ret = nilfs_clean_segments(inode->i_sb, argp); | ||
587 | clear_nilfs_cond_nongc_write(NILFS_SB(inode->i_sb)->s_nilfs); | ||
588 | return ret; | ||
589 | } | ||
590 | |||
591 | static int nilfs_ioctl_test_cond(struct the_nilfs *nilfs, int cond) | ||
592 | { | ||
593 | return (cond & NILFS_TIMEDWAIT_SEG_WRITE) && | ||
594 | nilfs_cond_nongc_write(nilfs); | ||
595 | } | ||
596 | |||
597 | static void nilfs_ioctl_clear_cond(struct the_nilfs *nilfs, int cond) | ||
598 | { | ||
599 | if (cond & NILFS_TIMEDWAIT_SEG_WRITE) | ||
600 | clear_nilfs_cond_nongc_write(nilfs); | ||
601 | } | ||
602 | |||
603 | static int nilfs_ioctl_timedwait(struct inode *inode, struct file *filp, | ||
604 | unsigned int cmd, void __user *argp) | ||
605 | { | ||
606 | struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | ||
607 | struct nilfs_wait_cond wc; | ||
608 | long ret; | ||
609 | |||
610 | if (!capable(CAP_SYS_ADMIN)) | ||
611 | return -EPERM; | ||
612 | if (copy_from_user(&wc, argp, sizeof(wc))) | ||
613 | return -EFAULT; | ||
614 | |||
615 | unlock_kernel(); | ||
616 | ret = wc.wc_flags ? | ||
617 | wait_event_interruptible_timeout( | ||
618 | nilfs->ns_cleanerd_wq, | ||
619 | nilfs_ioctl_test_cond(nilfs, wc.wc_cond), | ||
620 | timespec_to_jiffies(&wc.wc_timeout)) : | ||
621 | wait_event_interruptible( | ||
622 | nilfs->ns_cleanerd_wq, | ||
623 | nilfs_ioctl_test_cond(nilfs, wc.wc_cond)); | ||
624 | lock_kernel(); | ||
625 | nilfs_ioctl_clear_cond(nilfs, wc.wc_cond); | ||
626 | |||
627 | if (ret > 0) { | ||
628 | jiffies_to_timespec(ret, &wc.wc_timeout); | ||
629 | if (copy_to_user(argp, &wc, sizeof(wc))) | ||
630 | return -EFAULT; | ||
631 | return 0; | ||
632 | } | ||
633 | if (ret != 0) | ||
634 | return -EINTR; | ||
635 | |||
636 | return wc.wc_flags ? -ETIME : 0; | ||
637 | } | 584 | } |
638 | 585 | ||
639 | static int nilfs_ioctl_sync(struct inode *inode, struct file *filp, | 586 | static int nilfs_ioctl_sync(struct inode *inode, struct file *filp, |
@@ -679,8 +626,6 @@ int nilfs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
679 | return nilfs_ioctl_get_bdescs(inode, filp, cmd, argp); | 626 | return nilfs_ioctl_get_bdescs(inode, filp, cmd, argp); |
680 | case NILFS_IOCTL_CLEAN_SEGMENTS: | 627 | case NILFS_IOCTL_CLEAN_SEGMENTS: |
681 | return nilfs_ioctl_clean_segments(inode, filp, cmd, argp); | 628 | return nilfs_ioctl_clean_segments(inode, filp, cmd, argp); |
682 | case NILFS_IOCTL_TIMEDWAIT: | ||
683 | return nilfs_ioctl_timedwait(inode, filp, cmd, argp); | ||
684 | case NILFS_IOCTL_SYNC: | 629 | case NILFS_IOCTL_SYNC: |
685 | return nilfs_ioctl_sync(inode, filp, cmd, argp); | 630 | return nilfs_ioctl_sync(inode, filp, cmd, argp); |
686 | default: | 631 | default: |
@@ -871,41 +816,6 @@ nilfs_compat_ioctl_clean_segments(struct inode *inode, struct file *filp, | |||
871 | inode, filp, cmd, (unsigned long)uargv); | 816 | inode, filp, cmd, (unsigned long)uargv); |
872 | } | 817 | } |
873 | 818 | ||
874 | static int | ||
875 | nilfs_compat_ioctl_timedwait(struct inode *inode, struct file *filp, | ||
876 | unsigned int cmd, unsigned long arg) | ||
877 | { | ||
878 | struct nilfs_wait_cond __user *uwcond; | ||
879 | struct nilfs_wait_cond32 __user *uwcond32; | ||
880 | struct timespec ts; | ||
881 | int cond, flags, ret; | ||
882 | |||
883 | uwcond = compat_alloc_user_space(sizeof(struct nilfs_wait_cond)); | ||
884 | uwcond32 = compat_ptr(arg); | ||
885 | if (get_user(cond, &uwcond32->wc_cond) || | ||
886 | put_user(cond, &uwcond->wc_cond) || | ||
887 | get_user(flags, &uwcond32->wc_flags) || | ||
888 | put_user(flags, &uwcond->wc_flags) || | ||
889 | get_user(ts.tv_sec, &uwcond32->wc_timeout.tv_sec) || | ||
890 | get_user(ts.tv_nsec, &uwcond32->wc_timeout.tv_nsec) || | ||
891 | put_user(ts.tv_sec, &uwcond->wc_timeout.tv_sec) || | ||
892 | put_user(ts.tv_nsec, &uwcond->wc_timeout.tv_nsec)) | ||
893 | return -EFAULT; | ||
894 | |||
895 | ret = nilfs_compat_locked_ioctl(inode, filp, cmd, | ||
896 | (unsigned long)uwcond); | ||
897 | if (ret < 0) | ||
898 | return ret; | ||
899 | |||
900 | if (get_user(ts.tv_sec, &uwcond->wc_timeout.tv_sec) || | ||
901 | get_user(ts.tv_nsec, &uwcond->wc_timeout.tv_nsec) || | ||
902 | put_user(ts.tv_sec, &uwcond32->wc_timeout.tv_sec) || | ||
903 | put_user(ts.tv_nsec, &uwcond32->wc_timeout.tv_nsec)) | ||
904 | return -EFAULT; | ||
905 | |||
906 | return 0; | ||
907 | } | ||
908 | |||
909 | static int nilfs_compat_ioctl_sync(struct inode *inode, struct file *filp, | 819 | static int nilfs_compat_ioctl_sync(struct inode *inode, struct file *filp, |
910 | unsigned int cmd, unsigned long arg) | 820 | unsigned int cmd, unsigned long arg) |
911 | { | 821 | { |
@@ -943,9 +853,6 @@ long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
943 | case NILFS_IOCTL32_CLEAN_SEGMENTS: | 853 | case NILFS_IOCTL32_CLEAN_SEGMENTS: |
944 | return nilfs_compat_ioctl_clean_segments( | 854 | return nilfs_compat_ioctl_clean_segments( |
945 | inode, filp, NILFS_IOCTL_CLEAN_SEGMENTS, arg); | 855 | inode, filp, NILFS_IOCTL_CLEAN_SEGMENTS, arg); |
946 | case NILFS_IOCTL32_TIMEDWAIT: | ||
947 | return nilfs_compat_ioctl_timedwait( | ||
948 | inode, filp, NILFS_IOCTL_TIMEDWAIT, arg); | ||
949 | case NILFS_IOCTL_SYNC: | 856 | case NILFS_IOCTL_SYNC: |
950 | return nilfs_compat_ioctl_sync(inode, filp, cmd, arg); | 857 | return nilfs_compat_ioctl_sync(inode, filp, cmd, arg); |
951 | default: | 858 | default: |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 6d66c5cb7b51..5db12d774a03 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -2114,11 +2114,8 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) | |||
2114 | nilfs_drop_collected_inodes(&sci->sc_gc_inodes); | 2114 | nilfs_drop_collected_inodes(&sci->sc_gc_inodes); |
2115 | if (update_sr) | 2115 | if (update_sr) |
2116 | nilfs_commit_gcdat_inode(nilfs); | 2116 | nilfs_commit_gcdat_inode(nilfs); |
2117 | } else { | 2117 | } else |
2118 | nilfs->ns_nongc_ctime = sci->sc_seg_ctime; | 2118 | nilfs->ns_nongc_ctime = sci->sc_seg_ctime; |
2119 | set_nilfs_cond_nongc_write(nilfs); | ||
2120 | wake_up(&nilfs->ns_cleanerd_wq); | ||
2121 | } | ||
2122 | 2119 | ||
2123 | sci->sc_nblk_inc += sci->sc_nblk_this_inc; | 2120 | sci->sc_nblk_inc += sci->sc_nblk_this_inc; |
2124 | 2121 | ||
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index 852e0bf3a3c5..69b625586226 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
@@ -73,7 +73,6 @@ struct the_nilfs *alloc_nilfs(struct block_device *bdev) | |||
73 | nilfs->ns_gc_inodes_h = NULL; | 73 | nilfs->ns_gc_inodes_h = NULL; |
74 | INIT_LIST_HEAD(&nilfs->ns_used_segments); | 74 | INIT_LIST_HEAD(&nilfs->ns_used_segments); |
75 | init_rwsem(&nilfs->ns_segctor_sem); | 75 | init_rwsem(&nilfs->ns_segctor_sem); |
76 | init_waitqueue_head(&nilfs->ns_cleanerd_wq); | ||
77 | 76 | ||
78 | return nilfs; | 77 | return nilfs; |
79 | } | 78 | } |
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h index 9cd3c113f052..75da37306964 100644 --- a/fs/nilfs2/the_nilfs.h +++ b/fs/nilfs2/the_nilfs.h | |||
@@ -37,7 +37,6 @@ enum { | |||
37 | THE_NILFS_LOADED, /* Roll-back/roll-forward has done and | 37 | THE_NILFS_LOADED, /* Roll-back/roll-forward has done and |
38 | the latest checkpoint was loaded */ | 38 | the latest checkpoint was loaded */ |
39 | THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */ | 39 | THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */ |
40 | THE_NILFS_COND_NONGC_WRITE, /* Condition to wake up cleanerd */ | ||
41 | }; | 40 | }; |
42 | 41 | ||
43 | /** | 42 | /** |
@@ -74,7 +73,6 @@ enum { | |||
74 | * @ns_gc_dat: shadow inode of the DAT file inode for GC | 73 | * @ns_gc_dat: shadow inode of the DAT file inode for GC |
75 | * @ns_gc_inodes: dummy inodes to keep live blocks | 74 | * @ns_gc_inodes: dummy inodes to keep live blocks |
76 | * @ns_gc_inodes_h: hash list to keep dummy inode holding live blocks | 75 | * @ns_gc_inodes_h: hash list to keep dummy inode holding live blocks |
77 | * @ns_cleanerd_wq: wait queue for cleanerd | ||
78 | * @ns_blocksize_bits: bit length of block size | 76 | * @ns_blocksize_bits: bit length of block size |
79 | * @ns_nsegments: number of segments in filesystem | 77 | * @ns_nsegments: number of segments in filesystem |
80 | * @ns_blocks_per_segment: number of blocks per segment | 78 | * @ns_blocks_per_segment: number of blocks per segment |
@@ -151,9 +149,6 @@ struct the_nilfs { | |||
151 | struct list_head ns_gc_inodes; | 149 | struct list_head ns_gc_inodes; |
152 | struct hlist_head *ns_gc_inodes_h; | 150 | struct hlist_head *ns_gc_inodes_h; |
153 | 151 | ||
154 | /* cleanerd */ | ||
155 | wait_queue_head_t ns_cleanerd_wq; | ||
156 | |||
157 | /* Disk layout information (static) */ | 152 | /* Disk layout information (static) */ |
158 | unsigned int ns_blocksize_bits; | 153 | unsigned int ns_blocksize_bits; |
159 | unsigned long ns_nsegments; | 154 | unsigned long ns_nsegments; |
@@ -186,7 +181,6 @@ static inline int nilfs_##name(struct the_nilfs *nilfs) \ | |||
186 | THE_NILFS_FNS(INIT, init) | 181 | THE_NILFS_FNS(INIT, init) |
187 | THE_NILFS_FNS(LOADED, loaded) | 182 | THE_NILFS_FNS(LOADED, loaded) |
188 | THE_NILFS_FNS(DISCONTINUED, discontinued) | 183 | THE_NILFS_FNS(DISCONTINUED, discontinued) |
189 | THE_NILFS_FNS(COND_NONGC_WRITE, cond_nongc_write) | ||
190 | 184 | ||
191 | void nilfs_set_last_segment(struct the_nilfs *, sector_t, u64, __u64); | 185 | void nilfs_set_last_segment(struct the_nilfs *, sector_t, u64, __u64); |
192 | struct the_nilfs *alloc_nilfs(struct block_device *); | 186 | struct the_nilfs *alloc_nilfs(struct block_device *); |
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h index e38fad2f7c0b..b0a6b39eedbc 100644 --- a/include/linux/nilfs2_fs.h +++ b/include/linux/nilfs2_fs.h | |||
@@ -763,18 +763,6 @@ struct nilfs_bdesc { | |||
763 | __u32 bd_level; | 763 | __u32 bd_level; |
764 | }; | 764 | }; |
765 | 765 | ||
766 | #define NILFS_TIMEDWAIT_WRITE_LOCKED 0x1 | ||
767 | #define NILFS_TIMEDWAIT_SEG_WRITE 0x2 | ||
768 | |||
769 | /** | ||
770 | * struct nilfs_wait_cond - | ||
771 | */ | ||
772 | struct nilfs_wait_cond { | ||
773 | int wc_cond; | ||
774 | int wc_flags; | ||
775 | struct timespec wc_timeout; | ||
776 | }; | ||
777 | |||
778 | #define NILFS_IOCTL_IDENT 'n' | 766 | #define NILFS_IOCTL_IDENT 'n' |
779 | 767 | ||
780 | #define NILFS_IOCTL_CHANGE_CPMODE \ | 768 | #define NILFS_IOCTL_CHANGE_CPMODE \ |
@@ -795,8 +783,6 @@ struct nilfs_wait_cond { | |||
795 | _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv) | 783 | _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv) |
796 | #define NILFS_IOCTL_CLEAN_SEGMENTS \ | 784 | #define NILFS_IOCTL_CLEAN_SEGMENTS \ |
797 | _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5]) | 785 | _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5]) |
798 | #define NILFS_IOCTL_TIMEDWAIT \ | ||
799 | _IOWR(NILFS_IOCTL_IDENT, 0x89, struct nilfs_wait_cond) | ||
800 | #define NILFS_IOCTL_SYNC \ | 786 | #define NILFS_IOCTL_SYNC \ |
801 | _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64) | 787 | _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64) |
802 | #define NILFS_IOCTL_RESIZE \ | 788 | #define NILFS_IOCTL_RESIZE \ |
@@ -827,12 +813,6 @@ struct nilfs_sustat32 { | |||
827 | compat_time_t ss_nongc_ctime; | 813 | compat_time_t ss_nongc_ctime; |
828 | }; | 814 | }; |
829 | 815 | ||
830 | struct nilfs_wait_cond32 { | ||
831 | compat_int_t wc_cond; | ||
832 | compat_int_t wc_flags; | ||
833 | struct compat_timespec wc_timeout; | ||
834 | }; | ||
835 | |||
836 | #define NILFS_IOCTL32_CHANGE_CPMODE \ | 816 | #define NILFS_IOCTL32_CHANGE_CPMODE \ |
837 | _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode32) | 817 | _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode32) |
838 | #define NILFS_IOCTL32_GET_CPINFO \ | 818 | #define NILFS_IOCTL32_GET_CPINFO \ |
@@ -847,8 +827,6 @@ struct nilfs_wait_cond32 { | |||
847 | _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv32) | 827 | _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv32) |
848 | #define NILFS_IOCTL32_CLEAN_SEGMENTS \ | 828 | #define NILFS_IOCTL32_CLEAN_SEGMENTS \ |
849 | _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv32[5]) | 829 | _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv32[5]) |
850 | #define NILFS_IOCTL32_TIMEDWAIT \ | ||
851 | _IOWR(NILFS_IOCTL_IDENT, 0x89, struct nilfs_wait_cond32) | ||
852 | #endif /* CONFIG_COMPAT */ | 830 | #endif /* CONFIG_COMPAT */ |
853 | 831 | ||
854 | #endif /* _LINUX_NILFS_FS_H */ | 832 | #endif /* _LINUX_NILFS_FS_H */ |