xref: /openbmc/linux/fs/ocfs2/ioctl.c (revision 8e9356c6)
1 /*
2  * linux/fs/ocfs2/ioctl.c
3  *
4  * Copyright (C) 2006 Herbert Poetzl
5  * adapted from Remy Card's ext2/ioctl.c
6  */
7 
8 #include <linux/fs.h>
9 #include <linux/mount.h>
10 #include <linux/blkdev.h>
11 #include <linux/compat.h>
12 
13 #include <cluster/masklog.h>
14 
15 #include "ocfs2.h"
16 #include "alloc.h"
17 #include "dlmglue.h"
18 #include "file.h"
19 #include "inode.h"
20 #include "journal.h"
21 
22 #include "ocfs2_fs.h"
23 #include "ioctl.h"
24 #include "resize.h"
25 #include "refcounttree.h"
26 #include "sysfile.h"
27 #include "dir.h"
28 #include "buffer_head_io.h"
29 #include "suballoc.h"
30 #include "move_extents.h"
31 
32 #define o2info_from_user(a, b)	\
33 		copy_from_user(&(a), (b), sizeof(a))
34 #define o2info_to_user(a, b)	\
35 		copy_to_user((typeof(a) __user *)b, &(a), sizeof(a))
36 
37 /*
38  * This call is void because we are already reporting an error that may
39  * be -EFAULT.  The error will be returned from the ioctl(2) call.  It's
40  * just a best-effort to tell userspace that this request caused the error.
41  */
42 static inline void o2info_set_request_error(struct ocfs2_info_request *kreq,
43 					struct ocfs2_info_request __user *req)
44 {
45 	kreq->ir_flags |= OCFS2_INFO_FL_ERROR;
46 	(void)put_user(kreq->ir_flags, (__u32 __user *)&(req->ir_flags));
47 }
48 
49 static inline void o2info_set_request_filled(struct ocfs2_info_request *req)
50 {
51 	req->ir_flags |= OCFS2_INFO_FL_FILLED;
52 }
53 
54 static inline void o2info_clear_request_filled(struct ocfs2_info_request *req)
55 {
56 	req->ir_flags &= ~OCFS2_INFO_FL_FILLED;
57 }
58 
59 static inline int o2info_coherent(struct ocfs2_info_request *req)
60 {
61 	return (!(req->ir_flags & OCFS2_INFO_FL_NON_COHERENT));
62 }
63 
64 static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
65 {
66 	int status;
67 
68 	status = ocfs2_inode_lock(inode, NULL, 0);
69 	if (status < 0) {
70 		mlog_errno(status);
71 		return status;
72 	}
73 	ocfs2_get_inode_flags(OCFS2_I(inode));
74 	*flags = OCFS2_I(inode)->ip_attr;
75 	ocfs2_inode_unlock(inode, 0);
76 
77 	return status;
78 }
79 
80 static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
81 				unsigned mask)
82 {
83 	struct ocfs2_inode_info *ocfs2_inode = OCFS2_I(inode);
84 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
85 	handle_t *handle = NULL;
86 	struct buffer_head *bh = NULL;
87 	unsigned oldflags;
88 	int status;
89 
90 	mutex_lock(&inode->i_mutex);
91 
92 	status = ocfs2_inode_lock(inode, &bh, 1);
93 	if (status < 0) {
94 		mlog_errno(status);
95 		goto bail;
96 	}
97 
98 	status = -EACCES;
99 	if (!inode_owner_or_capable(inode))
100 		goto bail_unlock;
101 
102 	if (!S_ISDIR(inode->i_mode))
103 		flags &= ~OCFS2_DIRSYNC_FL;
104 
105 	oldflags = ocfs2_inode->ip_attr;
106 	flags = flags & mask;
107 	flags |= oldflags & ~mask;
108 
109 	/*
110 	 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
111 	 * the relevant capability.
112 	 */
113 	status = -EPERM;
114 	if ((oldflags & OCFS2_IMMUTABLE_FL) || ((flags ^ oldflags) &
115 		(OCFS2_APPEND_FL | OCFS2_IMMUTABLE_FL))) {
116 		if (!capable(CAP_LINUX_IMMUTABLE))
117 			goto bail_unlock;
118 	}
119 
120 	handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
121 	if (IS_ERR(handle)) {
122 		status = PTR_ERR(handle);
123 		mlog_errno(status);
124 		goto bail_unlock;
125 	}
126 
127 	ocfs2_inode->ip_attr = flags;
128 	ocfs2_set_inode_flags(inode);
129 
130 	status = ocfs2_mark_inode_dirty(handle, inode, bh);
131 	if (status < 0)
132 		mlog_errno(status);
133 
134 	ocfs2_commit_trans(osb, handle);
135 
136 bail_unlock:
137 	ocfs2_inode_unlock(inode, 1);
138 bail:
139 	mutex_unlock(&inode->i_mutex);
140 
141 	brelse(bh);
142 
143 	return status;
144 }
145 
146 int ocfs2_info_handle_blocksize(struct inode *inode,
147 				struct ocfs2_info_request __user *req)
148 {
149 	int status = -EFAULT;
150 	struct ocfs2_info_blocksize oib;
151 
152 	if (o2info_from_user(oib, req))
153 		goto bail;
154 
155 	oib.ib_blocksize = inode->i_sb->s_blocksize;
156 
157 	o2info_set_request_filled(&oib.ib_req);
158 
159 	if (o2info_to_user(oib, req))
160 		goto bail;
161 
162 	status = 0;
163 bail:
164 	if (status)
165 		o2info_set_request_error(&oib.ib_req, req);
166 
167 	return status;
168 }
169 
170 int ocfs2_info_handle_clustersize(struct inode *inode,
171 				  struct ocfs2_info_request __user *req)
172 {
173 	int status = -EFAULT;
174 	struct ocfs2_info_clustersize oic;
175 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
176 
177 	if (o2info_from_user(oic, req))
178 		goto bail;
179 
180 	oic.ic_clustersize = osb->s_clustersize;
181 
182 	o2info_set_request_filled(&oic.ic_req);
183 
184 	if (o2info_to_user(oic, req))
185 		goto bail;
186 
187 	status = 0;
188 bail:
189 	if (status)
190 		o2info_set_request_error(&oic.ic_req, req);
191 
192 	return status;
193 }
194 
195 int ocfs2_info_handle_maxslots(struct inode *inode,
196 			       struct ocfs2_info_request __user *req)
197 {
198 	int status = -EFAULT;
199 	struct ocfs2_info_maxslots oim;
200 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
201 
202 	if (o2info_from_user(oim, req))
203 		goto bail;
204 
205 	oim.im_max_slots = osb->max_slots;
206 
207 	o2info_set_request_filled(&oim.im_req);
208 
209 	if (o2info_to_user(oim, req))
210 		goto bail;
211 
212 	status = 0;
213 bail:
214 	if (status)
215 		o2info_set_request_error(&oim.im_req, req);
216 
217 	return status;
218 }
219 
220 int ocfs2_info_handle_label(struct inode *inode,
221 			    struct ocfs2_info_request __user *req)
222 {
223 	int status = -EFAULT;
224 	struct ocfs2_info_label oil;
225 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
226 
227 	if (o2info_from_user(oil, req))
228 		goto bail;
229 
230 	memcpy(oil.il_label, osb->vol_label, OCFS2_MAX_VOL_LABEL_LEN);
231 
232 	o2info_set_request_filled(&oil.il_req);
233 
234 	if (o2info_to_user(oil, req))
235 		goto bail;
236 
237 	status = 0;
238 bail:
239 	if (status)
240 		o2info_set_request_error(&oil.il_req, req);
241 
242 	return status;
243 }
244 
245 int ocfs2_info_handle_uuid(struct inode *inode,
246 			   struct ocfs2_info_request __user *req)
247 {
248 	int status = -EFAULT;
249 	struct ocfs2_info_uuid oiu;
250 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
251 
252 	if (o2info_from_user(oiu, req))
253 		goto bail;
254 
255 	memcpy(oiu.iu_uuid_str, osb->uuid_str, OCFS2_TEXT_UUID_LEN + 1);
256 
257 	o2info_set_request_filled(&oiu.iu_req);
258 
259 	if (o2info_to_user(oiu, req))
260 		goto bail;
261 
262 	status = 0;
263 bail:
264 	if (status)
265 		o2info_set_request_error(&oiu.iu_req, req);
266 
267 	return status;
268 }
269 
270 int ocfs2_info_handle_fs_features(struct inode *inode,
271 				  struct ocfs2_info_request __user *req)
272 {
273 	int status = -EFAULT;
274 	struct ocfs2_info_fs_features oif;
275 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
276 
277 	if (o2info_from_user(oif, req))
278 		goto bail;
279 
280 	oif.if_compat_features = osb->s_feature_compat;
281 	oif.if_incompat_features = osb->s_feature_incompat;
282 	oif.if_ro_compat_features = osb->s_feature_ro_compat;
283 
284 	o2info_set_request_filled(&oif.if_req);
285 
286 	if (o2info_to_user(oif, req))
287 		goto bail;
288 
289 	status = 0;
290 bail:
291 	if (status)
292 		o2info_set_request_error(&oif.if_req, req);
293 
294 	return status;
295 }
296 
297 int ocfs2_info_handle_journal_size(struct inode *inode,
298 				   struct ocfs2_info_request __user *req)
299 {
300 	int status = -EFAULT;
301 	struct ocfs2_info_journal_size oij;
302 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
303 
304 	if (o2info_from_user(oij, req))
305 		goto bail;
306 
307 	oij.ij_journal_size = i_size_read(osb->journal->j_inode);
308 
309 	o2info_set_request_filled(&oij.ij_req);
310 
311 	if (o2info_to_user(oij, req))
312 		goto bail;
313 
314 	status = 0;
315 bail:
316 	if (status)
317 		o2info_set_request_error(&oij.ij_req, req);
318 
319 	return status;
320 }
321 
322 int ocfs2_info_scan_inode_alloc(struct ocfs2_super *osb,
323 				struct inode *inode_alloc, u64 blkno,
324 				struct ocfs2_info_freeinode *fi, u32 slot)
325 {
326 	int status = 0, unlock = 0;
327 
328 	struct buffer_head *bh = NULL;
329 	struct ocfs2_dinode *dinode_alloc = NULL;
330 
331 	if (inode_alloc)
332 		mutex_lock(&inode_alloc->i_mutex);
333 
334 	if (o2info_coherent(&fi->ifi_req)) {
335 		status = ocfs2_inode_lock(inode_alloc, &bh, 0);
336 		if (status < 0) {
337 			mlog_errno(status);
338 			goto bail;
339 		}
340 		unlock = 1;
341 	} else {
342 		status = ocfs2_read_blocks_sync(osb, blkno, 1, &bh);
343 		if (status < 0) {
344 			mlog_errno(status);
345 			goto bail;
346 		}
347 	}
348 
349 	dinode_alloc = (struct ocfs2_dinode *)bh->b_data;
350 
351 	fi->ifi_stat[slot].lfi_total =
352 		le32_to_cpu(dinode_alloc->id1.bitmap1.i_total);
353 	fi->ifi_stat[slot].lfi_free =
354 		le32_to_cpu(dinode_alloc->id1.bitmap1.i_total) -
355 		le32_to_cpu(dinode_alloc->id1.bitmap1.i_used);
356 
357 bail:
358 	if (unlock)
359 		ocfs2_inode_unlock(inode_alloc, 0);
360 
361 	if (inode_alloc)
362 		mutex_unlock(&inode_alloc->i_mutex);
363 
364 	brelse(bh);
365 
366 	return status;
367 }
368 
369 int ocfs2_info_handle_freeinode(struct inode *inode,
370 				struct ocfs2_info_request __user *req)
371 {
372 	u32 i;
373 	u64 blkno = -1;
374 	char namebuf[40];
375 	int status = -EFAULT, type = INODE_ALLOC_SYSTEM_INODE;
376 	struct ocfs2_info_freeinode *oifi = NULL;
377 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
378 	struct inode *inode_alloc = NULL;
379 
380 	oifi = kzalloc(sizeof(struct ocfs2_info_freeinode), GFP_KERNEL);
381 	if (!oifi) {
382 		status = -ENOMEM;
383 		mlog_errno(status);
384 		goto out_err;
385 	}
386 
387 	if (o2info_from_user(*oifi, req))
388 		goto bail;
389 
390 	oifi->ifi_slotnum = osb->max_slots;
391 
392 	for (i = 0; i < oifi->ifi_slotnum; i++) {
393 		if (o2info_coherent(&oifi->ifi_req)) {
394 			inode_alloc = ocfs2_get_system_file_inode(osb, type, i);
395 			if (!inode_alloc) {
396 				mlog(ML_ERROR, "unable to get alloc inode in "
397 				    "slot %u\n", i);
398 				status = -EIO;
399 				goto bail;
400 			}
401 		} else {
402 			ocfs2_sprintf_system_inode_name(namebuf,
403 							sizeof(namebuf),
404 							type, i);
405 			status = ocfs2_lookup_ino_from_name(osb->sys_root_inode,
406 							    namebuf,
407 							    strlen(namebuf),
408 							    &blkno);
409 			if (status < 0) {
410 				status = -ENOENT;
411 				goto bail;
412 			}
413 		}
414 
415 		status = ocfs2_info_scan_inode_alloc(osb, inode_alloc, blkno, oifi, i);
416 		if (status < 0)
417 			goto bail;
418 
419 		iput(inode_alloc);
420 		inode_alloc = NULL;
421 	}
422 
423 	o2info_set_request_filled(&oifi->ifi_req);
424 
425 	if (o2info_to_user(*oifi, req))
426 		goto bail;
427 
428 	status = 0;
429 bail:
430 	if (status)
431 		o2info_set_request_error(&oifi->ifi_req, req);
432 
433 	kfree(oifi);
434 out_err:
435 	return status;
436 }
437 
438 static void o2ffg_update_histogram(struct ocfs2_info_free_chunk_list *hist,
439 				   unsigned int chunksize)
440 {
441 	int index;
442 
443 	index = __ilog2_u32(chunksize);
444 	if (index >= OCFS2_INFO_MAX_HIST)
445 		index = OCFS2_INFO_MAX_HIST - 1;
446 
447 	hist->fc_chunks[index]++;
448 	hist->fc_clusters[index] += chunksize;
449 }
450 
451 static void o2ffg_update_stats(struct ocfs2_info_freefrag_stats *stats,
452 			       unsigned int chunksize)
453 {
454 	if (chunksize > stats->ffs_max)
455 		stats->ffs_max = chunksize;
456 
457 	if (chunksize < stats->ffs_min)
458 		stats->ffs_min = chunksize;
459 
460 	stats->ffs_avg += chunksize;
461 	stats->ffs_free_chunks_real++;
462 }
463 
464 void ocfs2_info_update_ffg(struct ocfs2_info_freefrag *ffg,
465 			   unsigned int chunksize)
466 {
467 	o2ffg_update_histogram(&(ffg->iff_ffs.ffs_fc_hist), chunksize);
468 	o2ffg_update_stats(&(ffg->iff_ffs), chunksize);
469 }
470 
471 int ocfs2_info_freefrag_scan_chain(struct ocfs2_super *osb,
472 				   struct inode *gb_inode,
473 				   struct ocfs2_dinode *gb_dinode,
474 				   struct ocfs2_chain_rec *rec,
475 				   struct ocfs2_info_freefrag *ffg,
476 				   u32 chunks_in_group)
477 {
478 	int status = 0, used;
479 	u64 blkno;
480 
481 	struct buffer_head *bh = NULL;
482 	struct ocfs2_group_desc *bg = NULL;
483 
484 	unsigned int max_bits, num_clusters;
485 	unsigned int offset = 0, cluster, chunk;
486 	unsigned int chunk_free, last_chunksize = 0;
487 
488 	if (!le32_to_cpu(rec->c_free))
489 		goto bail;
490 
491 	do {
492 		if (!bg)
493 			blkno = le64_to_cpu(rec->c_blkno);
494 		else
495 			blkno = le64_to_cpu(bg->bg_next_group);
496 
497 		if (bh) {
498 			brelse(bh);
499 			bh = NULL;
500 		}
501 
502 		if (o2info_coherent(&ffg->iff_req))
503 			status = ocfs2_read_group_descriptor(gb_inode,
504 							     gb_dinode,
505 							     blkno, &bh);
506 		else
507 			status = ocfs2_read_blocks_sync(osb, blkno, 1, &bh);
508 
509 		if (status < 0) {
510 			mlog(ML_ERROR, "Can't read the group descriptor # "
511 			     "%llu from device.", (unsigned long long)blkno);
512 			status = -EIO;
513 			goto bail;
514 		}
515 
516 		bg = (struct ocfs2_group_desc *)bh->b_data;
517 
518 		if (!le16_to_cpu(bg->bg_free_bits_count))
519 			continue;
520 
521 		max_bits = le16_to_cpu(bg->bg_bits);
522 		offset = 0;
523 
524 		for (chunk = 0; chunk < chunks_in_group; chunk++) {
525 			/*
526 			 * last chunk may be not an entire one.
527 			 */
528 			if ((offset + ffg->iff_chunksize) > max_bits)
529 				num_clusters = max_bits - offset;
530 			else
531 				num_clusters = ffg->iff_chunksize;
532 
533 			chunk_free = 0;
534 			for (cluster = 0; cluster < num_clusters; cluster++) {
535 				used = ocfs2_test_bit(offset,
536 						(unsigned long *)bg->bg_bitmap);
537 				/*
538 				 * - chunk_free counts free clusters in #N chunk.
539 				 * - last_chunksize records the size(in) clusters
540 				 *   for the last real free chunk being counted.
541 				 */
542 				if (!used) {
543 					last_chunksize++;
544 					chunk_free++;
545 				}
546 
547 				if (used && last_chunksize) {
548 					ocfs2_info_update_ffg(ffg,
549 							      last_chunksize);
550 					last_chunksize = 0;
551 				}
552 
553 				offset++;
554 			}
555 
556 			if (chunk_free == ffg->iff_chunksize)
557 				ffg->iff_ffs.ffs_free_chunks++;
558 		}
559 
560 		/*
561 		 * need to update the info for last free chunk.
562 		 */
563 		if (last_chunksize)
564 			ocfs2_info_update_ffg(ffg, last_chunksize);
565 
566 	} while (le64_to_cpu(bg->bg_next_group));
567 
568 bail:
569 	brelse(bh);
570 
571 	return status;
572 }
573 
574 int ocfs2_info_freefrag_scan_bitmap(struct ocfs2_super *osb,
575 				    struct inode *gb_inode, u64 blkno,
576 				    struct ocfs2_info_freefrag *ffg)
577 {
578 	u32 chunks_in_group;
579 	int status = 0, unlock = 0, i;
580 
581 	struct buffer_head *bh = NULL;
582 	struct ocfs2_chain_list *cl = NULL;
583 	struct ocfs2_chain_rec *rec = NULL;
584 	struct ocfs2_dinode *gb_dinode = NULL;
585 
586 	if (gb_inode)
587 		mutex_lock(&gb_inode->i_mutex);
588 
589 	if (o2info_coherent(&ffg->iff_req)) {
590 		status = ocfs2_inode_lock(gb_inode, &bh, 0);
591 		if (status < 0) {
592 			mlog_errno(status);
593 			goto bail;
594 		}
595 		unlock = 1;
596 	} else {
597 		status = ocfs2_read_blocks_sync(osb, blkno, 1, &bh);
598 		if (status < 0) {
599 			mlog_errno(status);
600 			goto bail;
601 		}
602 	}
603 
604 	gb_dinode = (struct ocfs2_dinode *)bh->b_data;
605 	cl = &(gb_dinode->id2.i_chain);
606 
607 	/*
608 	 * Chunksize(in) clusters from userspace should be
609 	 * less than clusters in a group.
610 	 */
611 	if (ffg->iff_chunksize > le16_to_cpu(cl->cl_cpg)) {
612 		status = -EINVAL;
613 		goto bail;
614 	}
615 
616 	memset(&ffg->iff_ffs, 0, sizeof(struct ocfs2_info_freefrag_stats));
617 
618 	ffg->iff_ffs.ffs_min = ~0U;
619 	ffg->iff_ffs.ffs_clusters =
620 			le32_to_cpu(gb_dinode->id1.bitmap1.i_total);
621 	ffg->iff_ffs.ffs_free_clusters = ffg->iff_ffs.ffs_clusters -
622 			le32_to_cpu(gb_dinode->id1.bitmap1.i_used);
623 
624 	chunks_in_group = le16_to_cpu(cl->cl_cpg) / ffg->iff_chunksize + 1;
625 
626 	for (i = 0; i < le16_to_cpu(cl->cl_next_free_rec); i++) {
627 		rec = &(cl->cl_recs[i]);
628 		status = ocfs2_info_freefrag_scan_chain(osb, gb_inode,
629 							gb_dinode,
630 							rec, ffg,
631 							chunks_in_group);
632 		if (status)
633 			goto bail;
634 	}
635 
636 	if (ffg->iff_ffs.ffs_free_chunks_real)
637 		ffg->iff_ffs.ffs_avg = (ffg->iff_ffs.ffs_avg /
638 					ffg->iff_ffs.ffs_free_chunks_real);
639 bail:
640 	if (unlock)
641 		ocfs2_inode_unlock(gb_inode, 0);
642 
643 	if (gb_inode)
644 		mutex_unlock(&gb_inode->i_mutex);
645 
646 	if (gb_inode)
647 		iput(gb_inode);
648 
649 	brelse(bh);
650 
651 	return status;
652 }
653 
654 int ocfs2_info_handle_freefrag(struct inode *inode,
655 			       struct ocfs2_info_request __user *req)
656 {
657 	u64 blkno = -1;
658 	char namebuf[40];
659 	int status = -EFAULT, type = GLOBAL_BITMAP_SYSTEM_INODE;
660 
661 	struct ocfs2_info_freefrag *oiff;
662 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
663 	struct inode *gb_inode = NULL;
664 
665 	oiff = kzalloc(sizeof(struct ocfs2_info_freefrag), GFP_KERNEL);
666 	if (!oiff) {
667 		status = -ENOMEM;
668 		mlog_errno(status);
669 		goto out_err;
670 	}
671 
672 	if (o2info_from_user(*oiff, req))
673 		goto bail;
674 	/*
675 	 * chunksize from userspace should be power of 2.
676 	 */
677 	if ((oiff->iff_chunksize & (oiff->iff_chunksize - 1)) ||
678 	    (!oiff->iff_chunksize)) {
679 		status = -EINVAL;
680 		goto bail;
681 	}
682 
683 	if (o2info_coherent(&oiff->iff_req)) {
684 		gb_inode = ocfs2_get_system_file_inode(osb, type,
685 						       OCFS2_INVALID_SLOT);
686 		if (!gb_inode) {
687 			mlog(ML_ERROR, "unable to get global_bitmap inode\n");
688 			status = -EIO;
689 			goto bail;
690 		}
691 	} else {
692 		ocfs2_sprintf_system_inode_name(namebuf, sizeof(namebuf), type,
693 						OCFS2_INVALID_SLOT);
694 		status = ocfs2_lookup_ino_from_name(osb->sys_root_inode,
695 						    namebuf,
696 						    strlen(namebuf),
697 						    &blkno);
698 		if (status < 0) {
699 			status = -ENOENT;
700 			goto bail;
701 		}
702 	}
703 
704 	status = ocfs2_info_freefrag_scan_bitmap(osb, gb_inode, blkno, oiff);
705 	if (status < 0)
706 		goto bail;
707 
708 	o2info_set_request_filled(&oiff->iff_req);
709 
710 	if (o2info_to_user(*oiff, req)) {
711 		status = -EFAULT;
712 		goto bail;
713 	}
714 
715 	status = 0;
716 bail:
717 	if (status)
718 		o2info_set_request_error(&oiff->iff_req, req);
719 
720 	kfree(oiff);
721 out_err:
722 	return status;
723 }
724 
725 int ocfs2_info_handle_unknown(struct inode *inode,
726 			      struct ocfs2_info_request __user *req)
727 {
728 	int status = -EFAULT;
729 	struct ocfs2_info_request oir;
730 
731 	if (o2info_from_user(oir, req))
732 		goto bail;
733 
734 	o2info_clear_request_filled(&oir);
735 
736 	if (o2info_to_user(oir, req))
737 		goto bail;
738 
739 	status = 0;
740 bail:
741 	if (status)
742 		o2info_set_request_error(&oir, req);
743 
744 	return status;
745 }
746 
747 /*
748  * Validate and distinguish OCFS2_IOC_INFO requests.
749  *
750  * - validate the magic number.
751  * - distinguish different requests.
752  * - validate size of different requests.
753  */
754 int ocfs2_info_handle_request(struct inode *inode,
755 			      struct ocfs2_info_request __user *req)
756 {
757 	int status = -EFAULT;
758 	struct ocfs2_info_request oir;
759 
760 	if (o2info_from_user(oir, req))
761 		goto bail;
762 
763 	status = -EINVAL;
764 	if (oir.ir_magic != OCFS2_INFO_MAGIC)
765 		goto bail;
766 
767 	switch (oir.ir_code) {
768 	case OCFS2_INFO_BLOCKSIZE:
769 		if (oir.ir_size == sizeof(struct ocfs2_info_blocksize))
770 			status = ocfs2_info_handle_blocksize(inode, req);
771 		break;
772 	case OCFS2_INFO_CLUSTERSIZE:
773 		if (oir.ir_size == sizeof(struct ocfs2_info_clustersize))
774 			status = ocfs2_info_handle_clustersize(inode, req);
775 		break;
776 	case OCFS2_INFO_MAXSLOTS:
777 		if (oir.ir_size == sizeof(struct ocfs2_info_maxslots))
778 			status = ocfs2_info_handle_maxslots(inode, req);
779 		break;
780 	case OCFS2_INFO_LABEL:
781 		if (oir.ir_size == sizeof(struct ocfs2_info_label))
782 			status = ocfs2_info_handle_label(inode, req);
783 		break;
784 	case OCFS2_INFO_UUID:
785 		if (oir.ir_size == sizeof(struct ocfs2_info_uuid))
786 			status = ocfs2_info_handle_uuid(inode, req);
787 		break;
788 	case OCFS2_INFO_FS_FEATURES:
789 		if (oir.ir_size == sizeof(struct ocfs2_info_fs_features))
790 			status = ocfs2_info_handle_fs_features(inode, req);
791 		break;
792 	case OCFS2_INFO_JOURNAL_SIZE:
793 		if (oir.ir_size == sizeof(struct ocfs2_info_journal_size))
794 			status = ocfs2_info_handle_journal_size(inode, req);
795 		break;
796 	case OCFS2_INFO_FREEINODE:
797 		if (oir.ir_size == sizeof(struct ocfs2_info_freeinode))
798 			status = ocfs2_info_handle_freeinode(inode, req);
799 		break;
800 	case OCFS2_INFO_FREEFRAG:
801 		if (oir.ir_size == sizeof(struct ocfs2_info_freefrag))
802 			status = ocfs2_info_handle_freefrag(inode, req);
803 		break;
804 	default:
805 		status = ocfs2_info_handle_unknown(inode, req);
806 		break;
807 	}
808 
809 bail:
810 	return status;
811 }
812 
813 int ocfs2_get_request_ptr(struct ocfs2_info *info, int idx,
814 			  u64 *req_addr, int compat_flag)
815 {
816 	int status = -EFAULT;
817 	u64 __user *bp = NULL;
818 
819 	if (compat_flag) {
820 #ifdef CONFIG_COMPAT
821 		/*
822 		 * pointer bp stores the base address of a pointers array,
823 		 * which collects all addresses of separate request.
824 		 */
825 		bp = (u64 __user *)(unsigned long)compat_ptr(info->oi_requests);
826 #else
827 		BUG();
828 #endif
829 	} else
830 		bp = (u64 __user *)(unsigned long)(info->oi_requests);
831 
832 	if (o2info_from_user(*req_addr, bp + idx))
833 		goto bail;
834 
835 	status = 0;
836 bail:
837 	return status;
838 }
839 
840 /*
841  * OCFS2_IOC_INFO handles an array of requests passed from userspace.
842  *
843  * ocfs2_info_handle() recevies a large info aggregation, grab and
844  * validate the request count from header, then break it into small
845  * pieces, later specific handlers can handle them one by one.
846  *
847  * Idea here is to make each separate request small enough to ensure
848  * a better backward&forward compatibility, since a small piece of
849  * request will be less likely to be broken if disk layout get changed.
850  */
851 int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,
852 		      int compat_flag)
853 {
854 	int i, status = 0;
855 	u64 req_addr;
856 	struct ocfs2_info_request __user *reqp;
857 
858 	if ((info->oi_count > OCFS2_INFO_MAX_REQUEST) ||
859 	    (!info->oi_requests)) {
860 		status = -EINVAL;
861 		goto bail;
862 	}
863 
864 	for (i = 0; i < info->oi_count; i++) {
865 
866 		status = ocfs2_get_request_ptr(info, i, &req_addr, compat_flag);
867 		if (status)
868 			break;
869 
870 		reqp = (struct ocfs2_info_request __user *)(unsigned long)req_addr;
871 		if (!reqp) {
872 			status = -EINVAL;
873 			goto bail;
874 		}
875 
876 		status = ocfs2_info_handle_request(inode, reqp);
877 		if (status)
878 			break;
879 	}
880 
881 bail:
882 	return status;
883 }
884 
885 long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
886 {
887 	struct inode *inode = file_inode(filp);
888 	unsigned int flags;
889 	int new_clusters;
890 	int status;
891 	struct ocfs2_space_resv sr;
892 	struct ocfs2_new_group_input input;
893 	struct reflink_arguments args;
894 	const char __user *old_path;
895 	const char __user *new_path;
896 	bool preserve;
897 	struct ocfs2_info info;
898 	void __user *argp = (void __user *)arg;
899 
900 	switch (cmd) {
901 	case OCFS2_IOC_GETFLAGS:
902 		status = ocfs2_get_inode_attr(inode, &flags);
903 		if (status < 0)
904 			return status;
905 
906 		flags &= OCFS2_FL_VISIBLE;
907 		return put_user(flags, (int __user *) arg);
908 	case OCFS2_IOC_SETFLAGS:
909 		if (get_user(flags, (int __user *) arg))
910 			return -EFAULT;
911 
912 		status = mnt_want_write_file(filp);
913 		if (status)
914 			return status;
915 		status = ocfs2_set_inode_attr(inode, flags,
916 			OCFS2_FL_MODIFIABLE);
917 		mnt_drop_write_file(filp);
918 		return status;
919 	case OCFS2_IOC_RESVSP:
920 	case OCFS2_IOC_RESVSP64:
921 	case OCFS2_IOC_UNRESVSP:
922 	case OCFS2_IOC_UNRESVSP64:
923 		if (copy_from_user(&sr, (int __user *) arg, sizeof(sr)))
924 			return -EFAULT;
925 
926 		return ocfs2_change_file_space(filp, cmd, &sr);
927 	case OCFS2_IOC_GROUP_EXTEND:
928 		if (!capable(CAP_SYS_RESOURCE))
929 			return -EPERM;
930 
931 		if (get_user(new_clusters, (int __user *)arg))
932 			return -EFAULT;
933 
934 		status = mnt_want_write_file(filp);
935 		if (status)
936 			return status;
937 		status = ocfs2_group_extend(inode, new_clusters);
938 		mnt_drop_write_file(filp);
939 		return status;
940 	case OCFS2_IOC_GROUP_ADD:
941 	case OCFS2_IOC_GROUP_ADD64:
942 		if (!capable(CAP_SYS_RESOURCE))
943 			return -EPERM;
944 
945 		if (copy_from_user(&input, (int __user *) arg, sizeof(input)))
946 			return -EFAULT;
947 
948 		status = mnt_want_write_file(filp);
949 		if (status)
950 			return status;
951 		status = ocfs2_group_add(inode, &input);
952 		mnt_drop_write_file(filp);
953 		return status;
954 	case OCFS2_IOC_REFLINK:
955 		if (copy_from_user(&args, argp, sizeof(args)))
956 			return -EFAULT;
957 		old_path = (const char __user *)(unsigned long)args.old_path;
958 		new_path = (const char __user *)(unsigned long)args.new_path;
959 		preserve = (args.preserve != 0);
960 
961 		return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);
962 	case OCFS2_IOC_INFO:
963 		if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))
964 			return -EFAULT;
965 
966 		return ocfs2_info_handle(inode, &info, 0);
967 	case FITRIM:
968 	{
969 		struct super_block *sb = inode->i_sb;
970 		struct request_queue *q = bdev_get_queue(sb->s_bdev);
971 		struct fstrim_range range;
972 		int ret = 0;
973 
974 		if (!capable(CAP_SYS_ADMIN))
975 			return -EPERM;
976 
977 		if (!blk_queue_discard(q))
978 			return -EOPNOTSUPP;
979 
980 		if (copy_from_user(&range, argp, sizeof(range)))
981 			return -EFAULT;
982 
983 		range.minlen = max_t(u64, q->limits.discard_granularity,
984 				     range.minlen);
985 		ret = ocfs2_trim_fs(sb, &range);
986 		if (ret < 0)
987 			return ret;
988 
989 		if (copy_to_user(argp, &range, sizeof(range)))
990 			return -EFAULT;
991 
992 		return 0;
993 	}
994 	case OCFS2_IOC_MOVE_EXT:
995 		return ocfs2_ioctl_move_extents(filp, argp);
996 	default:
997 		return -ENOTTY;
998 	}
999 }
1000 
1001 #ifdef CONFIG_COMPAT
1002 long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
1003 {
1004 	bool preserve;
1005 	struct reflink_arguments args;
1006 	struct inode *inode = file_inode(file);
1007 	struct ocfs2_info info;
1008 	void __user *argp = (void __user *)arg;
1009 
1010 	switch (cmd) {
1011 	case OCFS2_IOC32_GETFLAGS:
1012 		cmd = OCFS2_IOC_GETFLAGS;
1013 		break;
1014 	case OCFS2_IOC32_SETFLAGS:
1015 		cmd = OCFS2_IOC_SETFLAGS;
1016 		break;
1017 	case OCFS2_IOC_RESVSP:
1018 	case OCFS2_IOC_RESVSP64:
1019 	case OCFS2_IOC_UNRESVSP:
1020 	case OCFS2_IOC_UNRESVSP64:
1021 	case OCFS2_IOC_GROUP_EXTEND:
1022 	case OCFS2_IOC_GROUP_ADD:
1023 	case OCFS2_IOC_GROUP_ADD64:
1024 	case FITRIM:
1025 		break;
1026 	case OCFS2_IOC_REFLINK:
1027 		if (copy_from_user(&args, argp, sizeof(args)))
1028 			return -EFAULT;
1029 		preserve = (args.preserve != 0);
1030 
1031 		return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path),
1032 					   compat_ptr(args.new_path), preserve);
1033 	case OCFS2_IOC_INFO:
1034 		if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))
1035 			return -EFAULT;
1036 
1037 		return ocfs2_info_handle(inode, &info, 1);
1038 	case OCFS2_IOC_MOVE_EXT:
1039 		break;
1040 	default:
1041 		return -ENOIOCTLCMD;
1042 	}
1043 
1044 	return ocfs2_ioctl(file, cmd, arg);
1045 }
1046 #endif
1047