diff options
author | Vyacheslav Dubeyko <Vyacheslav.Dubeyko@hgst.com> | 2014-08-08 17:20:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-08 18:57:21 -0400 |
commit | 02a0ba1c60c2ad532322089a60256c8b0f46678c (patch) | |
tree | 78495c866045875516e569378f222b1451037913 /fs | |
parent | ef43d5cd84b7d2ea09846de34e14be7d74be3e6f (diff) |
nilfs2: add /sys/fs/nilfs2/<device>/checkpoints group
This patch adds creation of /sys/fs/nilfs2/<device>/checkpoints
group.
The checkpoints group contains attributes that describe
details about volume's checkpoints:
(1) checkpoints_number - show number of checkpoints on volume.
(2) snapshots_number - show number of snapshots on volume.
(3) last_seg_checkpoint - show checkpoint number of the latest segment.
(4) next_checkpoint - show next checkpoint number.
Signed-off-by: Vyacheslav Dubeyko <Vyacheslav.Dubeyko@hgst.com>
Cc: Vyacheslav Dubeyko <slava@dubeyko.com>
Cc: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Cc: Michael L. Semon <mlsemon35@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nilfs2/sysfs.c | 123 | ||||
-rw-r--r-- | fs/nilfs2/sysfs.h | 14 |
2 files changed, 136 insertions, 1 deletions
diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c index fe8e1411dc6a..5cc735fcc1d5 100644 --- a/fs/nilfs2/sysfs.c +++ b/fs/nilfs2/sysfs.c | |||
@@ -112,6 +112,119 @@ void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \ | |||
112 | } | 112 | } |
113 | 113 | ||
114 | /************************************************************************ | 114 | /************************************************************************ |
115 | * NILFS checkpoints attrs * | ||
116 | ************************************************************************/ | ||
117 | |||
118 | static ssize_t | ||
119 | nilfs_checkpoints_checkpoints_number_show(struct nilfs_checkpoints_attr *attr, | ||
120 | struct the_nilfs *nilfs, | ||
121 | char *buf) | ||
122 | { | ||
123 | __u64 ncheckpoints; | ||
124 | struct nilfs_cpstat cpstat; | ||
125 | int err; | ||
126 | |||
127 | down_read(&nilfs->ns_segctor_sem); | ||
128 | err = nilfs_cpfile_get_stat(nilfs->ns_cpfile, &cpstat); | ||
129 | up_read(&nilfs->ns_segctor_sem); | ||
130 | if (err < 0) { | ||
131 | printk(KERN_ERR "NILFS: unable to get checkpoint stat: err=%d\n", | ||
132 | err); | ||
133 | return err; | ||
134 | } | ||
135 | |||
136 | ncheckpoints = cpstat.cs_ncps; | ||
137 | |||
138 | return snprintf(buf, PAGE_SIZE, "%llu\n", ncheckpoints); | ||
139 | } | ||
140 | |||
141 | static ssize_t | ||
142 | nilfs_checkpoints_snapshots_number_show(struct nilfs_checkpoints_attr *attr, | ||
143 | struct the_nilfs *nilfs, | ||
144 | char *buf) | ||
145 | { | ||
146 | __u64 nsnapshots; | ||
147 | struct nilfs_cpstat cpstat; | ||
148 | int err; | ||
149 | |||
150 | down_read(&nilfs->ns_segctor_sem); | ||
151 | err = nilfs_cpfile_get_stat(nilfs->ns_cpfile, &cpstat); | ||
152 | up_read(&nilfs->ns_segctor_sem); | ||
153 | if (err < 0) { | ||
154 | printk(KERN_ERR "NILFS: unable to get checkpoint stat: err=%d\n", | ||
155 | err); | ||
156 | return err; | ||
157 | } | ||
158 | |||
159 | nsnapshots = cpstat.cs_nsss; | ||
160 | |||
161 | return snprintf(buf, PAGE_SIZE, "%llu\n", nsnapshots); | ||
162 | } | ||
163 | |||
164 | static ssize_t | ||
165 | nilfs_checkpoints_last_seg_checkpoint_show(struct nilfs_checkpoints_attr *attr, | ||
166 | struct the_nilfs *nilfs, | ||
167 | char *buf) | ||
168 | { | ||
169 | __u64 last_cno; | ||
170 | |||
171 | spin_lock(&nilfs->ns_last_segment_lock); | ||
172 | last_cno = nilfs->ns_last_cno; | ||
173 | spin_unlock(&nilfs->ns_last_segment_lock); | ||
174 | |||
175 | return snprintf(buf, PAGE_SIZE, "%llu\n", last_cno); | ||
176 | } | ||
177 | |||
178 | static ssize_t | ||
179 | nilfs_checkpoints_next_checkpoint_show(struct nilfs_checkpoints_attr *attr, | ||
180 | struct the_nilfs *nilfs, | ||
181 | char *buf) | ||
182 | { | ||
183 | __u64 cno; | ||
184 | |||
185 | down_read(&nilfs->ns_sem); | ||
186 | cno = nilfs->ns_cno; | ||
187 | up_read(&nilfs->ns_sem); | ||
188 | |||
189 | return snprintf(buf, PAGE_SIZE, "%llu\n", cno); | ||
190 | } | ||
191 | |||
192 | static const char checkpoints_readme_str[] = | ||
193 | "The checkpoints group contains attributes that describe\n" | ||
194 | "details about volume's checkpoints.\n\n" | ||
195 | "(1) checkpoints_number\n\tshow number of checkpoints on volume.\n\n" | ||
196 | "(2) snapshots_number\n\tshow number of snapshots on volume.\n\n" | ||
197 | "(3) last_seg_checkpoint\n" | ||
198 | "\tshow checkpoint number of the latest segment.\n\n" | ||
199 | "(4) next_checkpoint\n\tshow next checkpoint number.\n\n"; | ||
200 | |||
201 | static ssize_t | ||
202 | nilfs_checkpoints_README_show(struct nilfs_checkpoints_attr *attr, | ||
203 | struct the_nilfs *nilfs, char *buf) | ||
204 | { | ||
205 | return snprintf(buf, PAGE_SIZE, checkpoints_readme_str); | ||
206 | } | ||
207 | |||
208 | NILFS_CHECKPOINTS_RO_ATTR(checkpoints_number); | ||
209 | NILFS_CHECKPOINTS_RO_ATTR(snapshots_number); | ||
210 | NILFS_CHECKPOINTS_RO_ATTR(last_seg_checkpoint); | ||
211 | NILFS_CHECKPOINTS_RO_ATTR(next_checkpoint); | ||
212 | NILFS_CHECKPOINTS_RO_ATTR(README); | ||
213 | |||
214 | static struct attribute *nilfs_checkpoints_attrs[] = { | ||
215 | NILFS_CHECKPOINTS_ATTR_LIST(checkpoints_number), | ||
216 | NILFS_CHECKPOINTS_ATTR_LIST(snapshots_number), | ||
217 | NILFS_CHECKPOINTS_ATTR_LIST(last_seg_checkpoint), | ||
218 | NILFS_CHECKPOINTS_ATTR_LIST(next_checkpoint), | ||
219 | NILFS_CHECKPOINTS_ATTR_LIST(README), | ||
220 | NULL, | ||
221 | }; | ||
222 | |||
223 | NILFS_DEV_INT_GROUP_OPS(checkpoints, dev); | ||
224 | NILFS_DEV_INT_GROUP_TYPE(checkpoints, dev); | ||
225 | NILFS_DEV_INT_GROUP_FNS(checkpoints, dev); | ||
226 | |||
227 | /************************************************************************ | ||
115 | * NILFS segments attrs * | 228 | * NILFS segments attrs * |
116 | ************************************************************************/ | 229 | ************************************************************************/ |
117 | 230 | ||
@@ -753,10 +866,14 @@ int nilfs_sysfs_create_device_group(struct super_block *sb) | |||
753 | if (err) | 866 | if (err) |
754 | goto free_dev_subgroups; | 867 | goto free_dev_subgroups; |
755 | 868 | ||
756 | err = nilfs_sysfs_create_segments_group(nilfs); | 869 | err = nilfs_sysfs_create_checkpoints_group(nilfs); |
757 | if (err) | 870 | if (err) |
758 | goto cleanup_dev_kobject; | 871 | goto cleanup_dev_kobject; |
759 | 872 | ||
873 | err = nilfs_sysfs_create_segments_group(nilfs); | ||
874 | if (err) | ||
875 | goto delete_checkpoints_group; | ||
876 | |||
760 | err = nilfs_sysfs_create_superblock_group(nilfs); | 877 | err = nilfs_sysfs_create_superblock_group(nilfs); |
761 | if (err) | 878 | if (err) |
762 | goto delete_segments_group; | 879 | goto delete_segments_group; |
@@ -773,6 +890,9 @@ delete_superblock_group: | |||
773 | delete_segments_group: | 890 | delete_segments_group: |
774 | nilfs_sysfs_delete_segments_group(nilfs); | 891 | nilfs_sysfs_delete_segments_group(nilfs); |
775 | 892 | ||
893 | delete_checkpoints_group: | ||
894 | nilfs_sysfs_delete_checkpoints_group(nilfs); | ||
895 | |||
776 | cleanup_dev_kobject: | 896 | cleanup_dev_kobject: |
777 | kobject_del(&nilfs->ns_dev_kobj); | 897 | kobject_del(&nilfs->ns_dev_kobj); |
778 | 898 | ||
@@ -785,6 +905,7 @@ failed_create_device_group: | |||
785 | 905 | ||
786 | void nilfs_sysfs_delete_device_group(struct the_nilfs *nilfs) | 906 | void nilfs_sysfs_delete_device_group(struct the_nilfs *nilfs) |
787 | { | 907 | { |
908 | nilfs_sysfs_delete_checkpoints_group(nilfs); | ||
788 | nilfs_sysfs_delete_segments_group(nilfs); | 909 | nilfs_sysfs_delete_segments_group(nilfs); |
789 | nilfs_sysfs_delete_superblock_group(nilfs); | 910 | nilfs_sysfs_delete_superblock_group(nilfs); |
790 | nilfs_sysfs_delete_segctor_group(nilfs); | 911 | nilfs_sysfs_delete_segctor_group(nilfs); |
diff --git a/fs/nilfs2/sysfs.h b/fs/nilfs2/sysfs.h index 228bdd14f945..62f0a0dc78ca 100644 --- a/fs/nilfs2/sysfs.h +++ b/fs/nilfs2/sysfs.h | |||
@@ -30,6 +30,8 @@ | |||
30 | * @sg_superblock_kobj_unregister: completion state | 30 | * @sg_superblock_kobj_unregister: completion state |
31 | * @sg_segctor_kobj: /sys/fs/<nilfs>/<device>/segctor | 31 | * @sg_segctor_kobj: /sys/fs/<nilfs>/<device>/segctor |
32 | * @sg_segctor_kobj_unregister: completion state | 32 | * @sg_segctor_kobj_unregister: completion state |
33 | * @sg_checkpoints_kobj: /sys/fs/<nilfs>/<device>/checkpoints | ||
34 | * @sg_checkpoints_kobj_unregister: completion state | ||
33 | * @sg_segments_kobj: /sys/fs/<nilfs>/<device>/segments | 35 | * @sg_segments_kobj: /sys/fs/<nilfs>/<device>/segments |
34 | * @sg_segments_kobj_unregister: completion state | 36 | * @sg_segments_kobj_unregister: completion state |
35 | */ | 37 | */ |
@@ -42,6 +44,10 @@ struct nilfs_sysfs_dev_subgroups { | |||
42 | struct kobject sg_segctor_kobj; | 44 | struct kobject sg_segctor_kobj; |
43 | struct completion sg_segctor_kobj_unregister; | 45 | struct completion sg_segctor_kobj_unregister; |
44 | 46 | ||
47 | /* /sys/fs/<nilfs>/<device>/checkpoints */ | ||
48 | struct kobject sg_checkpoints_kobj; | ||
49 | struct completion sg_checkpoints_kobj_unregister; | ||
50 | |||
45 | /* /sys/fs/<nilfs>/<device>/segments */ | 51 | /* /sys/fs/<nilfs>/<device>/segments */ |
46 | struct kobject sg_segments_kobj; | 52 | struct kobject sg_segments_kobj; |
47 | struct completion sg_segments_kobj_unregister; | 53 | struct completion sg_segments_kobj_unregister; |
@@ -69,6 +75,7 @@ struct nilfs_##name##_attr { \ | |||
69 | 75 | ||
70 | NILFS_DEV_ATTR_STRUCT(dev); | 76 | NILFS_DEV_ATTR_STRUCT(dev); |
71 | NILFS_DEV_ATTR_STRUCT(segments); | 77 | NILFS_DEV_ATTR_STRUCT(segments); |
78 | NILFS_DEV_ATTR_STRUCT(checkpoints); | ||
72 | NILFS_DEV_ATTR_STRUCT(superblock); | 79 | NILFS_DEV_ATTR_STRUCT(superblock); |
73 | NILFS_DEV_ATTR_STRUCT(segctor); | 80 | NILFS_DEV_ATTR_STRUCT(segctor); |
74 | 81 | ||
@@ -104,6 +111,11 @@ NILFS_DEV_ATTR_STRUCT(segctor); | |||
104 | #define NILFS_SEGMENTS_RW_ATTR(name) \ | 111 | #define NILFS_SEGMENTS_RW_ATTR(name) \ |
105 | NILFS_RW_ATTR(segs_info, name) | 112 | NILFS_RW_ATTR(segs_info, name) |
106 | 113 | ||
114 | #define NILFS_CHECKPOINTS_RO_ATTR(name) \ | ||
115 | NILFS_RO_ATTR(checkpoints, name) | ||
116 | #define NILFS_CHECKPOINTS_RW_ATTR(name) \ | ||
117 | NILFS_RW_ATTR(checkpoints, name) | ||
118 | |||
107 | #define NILFS_SUPERBLOCK_RO_ATTR(name) \ | 119 | #define NILFS_SUPERBLOCK_RO_ATTR(name) \ |
108 | NILFS_RO_ATTR(superblock, name) | 120 | NILFS_RO_ATTR(superblock, name) |
109 | #define NILFS_SUPERBLOCK_RW_ATTR(name) \ | 121 | #define NILFS_SUPERBLOCK_RW_ATTR(name) \ |
@@ -122,6 +134,8 @@ NILFS_DEV_ATTR_STRUCT(segctor); | |||
122 | (&nilfs_dev_attr_##name.attr) | 134 | (&nilfs_dev_attr_##name.attr) |
123 | #define NILFS_SEGMENTS_ATTR_LIST(name) \ | 135 | #define NILFS_SEGMENTS_ATTR_LIST(name) \ |
124 | (&nilfs_segments_attr_##name.attr) | 136 | (&nilfs_segments_attr_##name.attr) |
137 | #define NILFS_CHECKPOINTS_ATTR_LIST(name) \ | ||
138 | (&nilfs_checkpoints_attr_##name.attr) | ||
125 | #define NILFS_SUPERBLOCK_ATTR_LIST(name) \ | 139 | #define NILFS_SUPERBLOCK_ATTR_LIST(name) \ |
126 | (&nilfs_superblock_attr_##name.attr) | 140 | (&nilfs_superblock_attr_##name.attr) |
127 | #define NILFS_SEGCTOR_ATTR_LIST(name) \ | 141 | #define NILFS_SEGCTOR_ATTR_LIST(name) \ |