xref: /openbmc/linux/fs/ocfs2/ioctl.c (revision b34e08d5)
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 
417 		iput(inode_alloc);
418 		inode_alloc = NULL;
419 
420 		if (status < 0)
421 			goto bail;
422 	}
423 
424 	o2info_set_request_filled(&oifi->ifi_req);
425 
426 	if (o2info_to_user(*oifi, req))
427 		goto bail;
428 
429 	status = 0;
430 bail:
431 	if (status)
432 		o2info_set_request_error(&oifi->ifi_req, req);
433 
434 	kfree(oifi);
435 out_err:
436 	return status;
437 }
438 
439 static void o2ffg_update_histogram(struct ocfs2_info_free_chunk_list *hist,
440 				   unsigned int chunksize)
441 {
442 	int index;
443 
444 	index = __ilog2_u32(chunksize);
445 	if (index >= OCFS2_INFO_MAX_HIST)
446 		index = OCFS2_INFO_MAX_HIST - 1;
447 
448 	hist->fc_chunks[index]++;
449 	hist->fc_clusters[index] += chunksize;
450 }
451 
452 static void o2ffg_update_stats(struct ocfs2_info_freefrag_stats *stats,
453 			       unsigned int chunksize)
454 {
455 	if (chunksize > stats->ffs_max)
456 		stats->ffs_max = chunksize;
457 
458 	if (chunksize < stats->ffs_min)
459 		stats->ffs_min = chunksize;
460 
461 	stats->ffs_avg += chunksize;
462 	stats->ffs_free_chunks_real++;
463 }
464 
465 void ocfs2_info_update_ffg(struct ocfs2_info_freefrag *ffg,
466 			   unsigned int chunksize)
467 {
468 	o2ffg_update_histogram(&(ffg->iff_ffs.ffs_fc_hist), chunksize);
469 	o2ffg_update_stats(&(ffg->iff_ffs), chunksize);
470 }
471 
472 int ocfs2_info_freefrag_scan_chain(struct ocfs2_super *osb,
473 				   struct inode *gb_inode,
474 				   struct ocfs2_dinode *gb_dinode,
475 				   struct ocfs2_chain_rec *rec,
476 				   struct ocfs2_info_freefrag *ffg,
477 				   u32 chunks_in_group)
478 {
479 	int status = 0, used;
480 	u64 blkno;
481 
482 	struct buffer_head *bh = NULL;
483 	struct ocfs2_group_desc *bg = NULL;
484 
485 	unsigned int max_bits, num_clusters;
486 	unsigned int offset = 0, cluster, chunk;
487 	unsigned int chunk_free, last_chunksize = 0;
488 
489 	if (!le32_to_cpu(rec->c_free))
490 		goto bail;
491 
492 	do {
493 		if (!bg)
494 			blkno = le64_to_cpu(rec->c_blkno);
495 		else
496 			blkno = le64_to_cpu(bg->bg_next_group);
497 
498 		if (bh) {
499 			brelse(bh);
500 			bh = NULL;
501 		}
502 
503 		if (o2info_coherent(&ffg->iff_req))
504 			status = ocfs2_read_group_descriptor(gb_inode,
505 							     gb_dinode,
506 							     blkno, &bh);
507 		else
508 			status = ocfs2_read_blocks_sync(osb, blkno, 1, &bh);
509 
510 		if (status < 0) {
511 			mlog(ML_ERROR, "Can't read the group descriptor # "
512 			     "%llu from device.", (unsigned long long)blkno);
513 			status = -EIO;
514 			goto bail;
515 		}
516 
517 		bg = (struct ocfs2_group_desc *)bh->b_data;
518 
519 		if (!le16_to_cpu(bg->bg_free_bits_count))
520 			continue;
521 
522 		max_bits = le16_to_cpu(bg->bg_bits);
523 		offset = 0;
524 
525 		for (chunk = 0; chunk < chunks_in_group; chunk++) {
526 			/*
527 			 * last chunk may be not an entire one.
528 			 */
529 			if ((offset + ffg->iff_chunksize) > max_bits)
530 				num_clusters = max_bits - offset;
531 			else
532 				num_clusters = ffg->iff_chunksize;
533 
534 			chunk_free = 0;
535 			for (cluster = 0; cluster < num_clusters; cluster++) {
536 				used = ocfs2_test_bit(offset,
537 						(unsigned long *)bg->bg_bitmap);
538 				/*
539 				 * - chunk_free counts free clusters in #N chunk.
540 				 * - last_chunksize records the size(in) clusters
541 				 *   for the last real free chunk being counted.
542 				 */
543 				if (!used) {
544 					last_chunksize++;
545 					chunk_free++;
546 				}
547 
548 				if (used && last_chunksize) {
549 					ocfs2_info_update_ffg(ffg,
550 							      last_chunksize);
551 					last_chunksize = 0;
552 				}
553 
554 				offset++;
555 			}
556 
557 			if (chunk_free == ffg->iff_chunksize)
558 				ffg->iff_ffs.ffs_free_chunks++;
559 		}
560 
561 		/*
562 		 * need to update the info for last free chunk.
563 		 */
564 		if (last_chunksize)
565 			ocfs2_info_update_ffg(ffg, last_chunksize);
566 
567 	} while (le64_to_cpu(bg->bg_next_group));
568 
569 bail:
570 	brelse(bh);
571 
572 	return status;
573 }
574 
575 int ocfs2_info_freefrag_scan_bitmap(struct ocfs2_super *osb,
576 				    struct inode *gb_inode, u64 blkno,
577 				    struct ocfs2_info_freefrag *ffg)
578 {
579 	u32 chunks_in_group;
580 	int status = 0, unlock = 0, i;
581 
582 	struct buffer_head *bh = NULL;
583 	struct ocfs2_chain_list *cl = NULL;
584 	struct ocfs2_chain_rec *rec = NULL;
585 	struct ocfs2_dinode *gb_dinode = NULL;
586 
587 	if (gb_inode)
588 		mutex_lock(&gb_inode->i_mutex);
589 
590 	if (o2info_coherent(&ffg->iff_req)) {
591 		status = ocfs2_inode_lock(gb_inode, &bh, 0);
592 		if (status < 0) {
593 			mlog_errno(status);
594 			goto bail;
595 		}
596 		unlock = 1;
597 	} else {
598 		status = ocfs2_read_blocks_sync(osb, blkno, 1, &bh);
599 		if (status < 0) {
600 			mlog_errno(status);
601 			goto bail;
602 		}
603 	}
604 
605 	gb_dinode = (struct ocfs2_dinode *)bh->b_data;
606 	cl = &(gb_dinode->id2.i_chain);
607 
608 	/*
609 	 * Chunksize(in) clusters from userspace should be
610 	 * less than clusters in a group.
611 	 */
612 	if (ffg->iff_chunksize > le16_to_cpu(cl->cl_cpg)) {
613 		status = -EINVAL;
614 		goto bail;
615 	}
616 
617 	memset(&ffg->iff_ffs, 0, sizeof(struct ocfs2_info_freefrag_stats));
618 
619 	ffg->iff_ffs.ffs_min = ~0U;
620 	ffg->iff_ffs.ffs_clusters =
621 			le32_to_cpu(gb_dinode->id1.bitmap1.i_total);
622 	ffg->iff_ffs.ffs_free_clusters = ffg->iff_ffs.ffs_clusters -
623 			le32_to_cpu(gb_dinode->id1.bitmap1.i_used);
624 
625 	chunks_in_group = le16_to_cpu(cl->cl_cpg) / ffg->iff_chunksize + 1;
626 
627 	for (i = 0; i < le16_to_cpu(cl->cl_next_free_rec); i++) {
628 		rec = &(cl->cl_recs[i]);
629 		status = ocfs2_info_freefrag_scan_chain(osb, gb_inode,
630 							gb_dinode,
631 							rec, ffg,
632 							chunks_in_group);
633 		if (status)
634 			goto bail;
635 	}
636 
637 	if (ffg->iff_ffs.ffs_free_chunks_real)
638 		ffg->iff_ffs.ffs_avg = (ffg->iff_ffs.ffs_avg /
639 					ffg->iff_ffs.ffs_free_chunks_real);
640 bail:
641 	if (unlock)
642 		ocfs2_inode_unlock(gb_inode, 0);
643 
644 	if (gb_inode)
645 		mutex_unlock(&gb_inode->i_mutex);
646 
647 	if (gb_inode)
648 		iput(gb_inode);
649 
650 	brelse(bh);
651 
652 	return status;
653 }
654 
655 int ocfs2_info_handle_freefrag(struct inode *inode,
656 			       struct ocfs2_info_request __user *req)
657 {
658 	u64 blkno = -1;
659 	char namebuf[40];
660 	int status = -EFAULT, type = GLOBAL_BITMAP_SYSTEM_INODE;
661 
662 	struct ocfs2_info_freefrag *oiff;
663 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
664 	struct inode *gb_inode = NULL;
665 
666 	oiff = kzalloc(sizeof(struct ocfs2_info_freefrag), GFP_KERNEL);
667 	if (!oiff) {
668 		status = -ENOMEM;
669 		mlog_errno(status);
670 		goto out_err;
671 	}
672 
673 	if (o2info_from_user(*oiff, req))
674 		goto bail;
675 	/*
676 	 * chunksize from userspace should be power of 2.
677 	 */
678 	if ((oiff->iff_chunksize & (oiff->iff_chunksize - 1)) ||
679 	    (!oiff->iff_chunksize)) {
680 		status = -EINVAL;
681 		goto bail;
682 	}
683 
684 	if (o2info_coherent(&oiff->iff_req)) {
685 		gb_inode = ocfs2_get_system_file_inode(osb, type,
686 						       OCFS2_INVALID_SLOT);
687 		if (!gb_inode) {
688 			mlog(ML_ERROR, "unable to get global_bitmap inode\n");
689 			status = -EIO;
690 			goto bail;
691 		}
692 	} else {
693 		ocfs2_sprintf_system_inode_name(namebuf, sizeof(namebuf), type,
694 						OCFS2_INVALID_SLOT);
695 		status = ocfs2_lookup_ino_from_name(osb->sys_root_inode,
696 						    namebuf,
697 						    strlen(namebuf),
698 						    &blkno);
699 		if (status < 0) {
700 			status = -ENOENT;
701 			goto bail;
702 		}
703 	}
704 
705 	status = ocfs2_info_freefrag_scan_bitmap(osb, gb_inode, blkno, oiff);
706 	if (status < 0)
707 		goto bail;
708 
709 	o2info_set_request_filled(&oiff->iff_req);
710 
711 	if (o2info_to_user(*oiff, req)) {
712 		status = -EFAULT;
713 		goto bail;
714 	}
715 
716 	status = 0;
717 bail:
718 	if (status)
719 		o2info_set_request_error(&oiff->iff_req, req);
720 
721 	kfree(oiff);
722 out_err:
723 	return status;
724 }
725 
726 int ocfs2_info_handle_unknown(struct inode *inode,
727 			      struct ocfs2_info_request __user *req)
728 {
729 	int status = -EFAULT;
730 	struct ocfs2_info_request oir;
731 
732 	if (o2info_from_user(oir, req))
733 		goto bail;
734 
735 	o2info_clear_request_filled(&oir);
736 
737 	if (o2info_to_user(oir, req))
738 		goto bail;
739 
740 	status = 0;
741 bail:
742 	if (status)
743 		o2info_set_request_error(&oir, req);
744 
745 	return status;
746 }
747 
748 /*
749  * Validate and distinguish OCFS2_IOC_INFO requests.
750  *
751  * - validate the magic number.
752  * - distinguish different requests.
753  * - validate size of different requests.
754  */
755 int ocfs2_info_handle_request(struct inode *inode,
756 			      struct ocfs2_info_request __user *req)
757 {
758 	int status = -EFAULT;
759 	struct ocfs2_info_request oir;
760 
761 	if (o2info_from_user(oir, req))
762 		goto bail;
763 
764 	status = -EINVAL;
765 	if (oir.ir_magic != OCFS2_INFO_MAGIC)
766 		goto bail;
767 
768 	switch (oir.ir_code) {
769 	case OCFS2_INFO_BLOCKSIZE:
770 		if (oir.ir_size == sizeof(struct ocfs2_info_blocksize))
771 			status = ocfs2_info_handle_blocksize(inode, req);
772 		break;
773 	case OCFS2_INFO_CLUSTERSIZE:
774 		if (oir.ir_size == sizeof(struct ocfs2_info_clustersize))
775 			status = ocfs2_info_handle_clustersize(inode, req);
776 		break;
777 	case OCFS2_INFO_MAXSLOTS:
778 		if (oir.ir_size == sizeof(struct ocfs2_info_maxslots))
779 			status = ocfs2_info_handle_maxslots(inode, req);
780 		break;
781 	case OCFS2_INFO_LABEL:
782 		if (oir.ir_size == sizeof(struct ocfs2_info_label))
783 			status = ocfs2_info_handle_label(inode, req);
784 		break;
785 	case OCFS2_INFO_UUID:
786 		if (oir.ir_size == sizeof(struct ocfs2_info_uuid))
787 			status = ocfs2_info_handle_uuid(inode, req);
788 		break;
789 	case OCFS2_INFO_FS_FEATURES:
790 		if (oir.ir_size == sizeof(struct ocfs2_info_fs_features))
791 			status = ocfs2_info_handle_fs_features(inode, req);
792 		break;
793 	case OCFS2_INFO_JOURNAL_SIZE:
794 		if (oir.ir_size == sizeof(struct ocfs2_info_journal_size))
795 			status = ocfs2_info_handle_journal_size(inode, req);
796 		break;
797 	case OCFS2_INFO_FREEINODE:
798 		if (oir.ir_size == sizeof(struct ocfs2_info_freeinode))
799 			status = ocfs2_info_handle_freeinode(inode, req);
800 		break;
801 	case OCFS2_INFO_FREEFRAG:
802 		if (oir.ir_size == sizeof(struct ocfs2_info_freefrag))
803 			status = ocfs2_info_handle_freefrag(inode, req);
804 		break;
805 	default:
806 		status = ocfs2_info_handle_unknown(inode, req);
807 		break;
808 	}
809 
810 bail:
811 	return status;
812 }
813 
814 int ocfs2_get_request_ptr(struct ocfs2_info *info, int idx,
815 			  u64 *req_addr, int compat_flag)
816 {
817 	int status = -EFAULT;
818 	u64 __user *bp = NULL;
819 
820 	if (compat_flag) {
821 #ifdef CONFIG_COMPAT
822 		/*
823 		 * pointer bp stores the base address of a pointers array,
824 		 * which collects all addresses of separate request.
825 		 */
826 		bp = (u64 __user *)(unsigned long)compat_ptr(info->oi_requests);
827 #else
828 		BUG();
829 #endif
830 	} else
831 		bp = (u64 __user *)(unsigned long)(info->oi_requests);
832 
833 	if (o2info_from_user(*req_addr, bp + idx))
834 		goto bail;
835 
836 	status = 0;
837 bail:
838 	return status;
839 }
840 
841 /*
842  * OCFS2_IOC_INFO handles an array of requests passed from userspace.
843  *
844  * ocfs2_info_handle() recevies a large info aggregation, grab and
845  * validate the request count from header, then break it into small
846  * pieces, later specific handlers can handle them one by one.
847  *
848  * Idea here is to make each separate request small enough to ensure
849  * a better backward&forward compatibility, since a small piece of
850  * request will be less likely to be broken if disk layout get changed.
851  */
852 int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,
853 		      int compat_flag)
854 {
855 	int i, status = 0;
856 	u64 req_addr;
857 	struct ocfs2_info_request __user *reqp;
858 
859 	if ((info->oi_count > OCFS2_INFO_MAX_REQUEST) ||
860 	    (!info->oi_requests)) {
861 		status = -EINVAL;
862 		goto bail;
863 	}
864 
865 	for (i = 0; i < info->oi_count; i++) {
866 
867 		status = ocfs2_get_request_ptr(info, i, &req_addr, compat_flag);
868 		if (status)
869 			break;
870 
871 		reqp = (struct ocfs2_info_request __user *)(unsigned long)req_addr;
872 		if (!reqp) {
873 			status = -EINVAL;
874 			goto bail;
875 		}
876 
877 		status = ocfs2_info_handle_request(inode, reqp);
878 		if (status)
879 			break;
880 	}
881 
882 bail:
883 	return status;
884 }
885 
886 long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
887 {
888 	struct inode *inode = file_inode(filp);
889 	unsigned int flags;
890 	int new_clusters;
891 	int status;
892 	struct ocfs2_space_resv sr;
893 	struct ocfs2_new_group_input input;
894 	struct reflink_arguments args;
895 	const char __user *old_path;
896 	const char __user *new_path;
897 	bool preserve;
898 	struct ocfs2_info info;
899 	void __user *argp = (void __user *)arg;
900 
901 	switch (cmd) {
902 	case OCFS2_IOC_GETFLAGS:
903 		status = ocfs2_get_inode_attr(inode, &flags);
904 		if (status < 0)
905 			return status;
906 
907 		flags &= OCFS2_FL_VISIBLE;
908 		return put_user(flags, (int __user *) arg);
909 	case OCFS2_IOC_SETFLAGS:
910 		if (get_user(flags, (int __user *) arg))
911 			return -EFAULT;
912 
913 		status = mnt_want_write_file(filp);
914 		if (status)
915 			return status;
916 		status = ocfs2_set_inode_attr(inode, flags,
917 			OCFS2_FL_MODIFIABLE);
918 		mnt_drop_write_file(filp);
919 		return status;
920 	case OCFS2_IOC_RESVSP:
921 	case OCFS2_IOC_RESVSP64:
922 	case OCFS2_IOC_UNRESVSP:
923 	case OCFS2_IOC_UNRESVSP64:
924 		if (copy_from_user(&sr, (int __user *) arg, sizeof(sr)))
925 			return -EFAULT;
926 
927 		return ocfs2_change_file_space(filp, cmd, &sr);
928 	case OCFS2_IOC_GROUP_EXTEND:
929 		if (!capable(CAP_SYS_RESOURCE))
930 			return -EPERM;
931 
932 		if (get_user(new_clusters, (int __user *)arg))
933 			return -EFAULT;
934 
935 		status = mnt_want_write_file(filp);
936 		if (status)
937 			return status;
938 		status = ocfs2_group_extend(inode, new_clusters);
939 		mnt_drop_write_file(filp);
940 		return status;
941 	case OCFS2_IOC_GROUP_ADD:
942 	case OCFS2_IOC_GROUP_ADD64:
943 		if (!capable(CAP_SYS_RESOURCE))
944 			return -EPERM;
945 
946 		if (copy_from_user(&input, (int __user *) arg, sizeof(input)))
947 			return -EFAULT;
948 
949 		status = mnt_want_write_file(filp);
950 		if (status)
951 			return status;
952 		status = ocfs2_group_add(inode, &input);
953 		mnt_drop_write_file(filp);
954 		return status;
955 	case OCFS2_IOC_REFLINK:
956 		if (copy_from_user(&args, argp, sizeof(args)))
957 			return -EFAULT;
958 		old_path = (const char __user *)(unsigned long)args.old_path;
959 		new_path = (const char __user *)(unsigned long)args.new_path;
960 		preserve = (args.preserve != 0);
961 
962 		return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);
963 	case OCFS2_IOC_INFO:
964 		if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))
965 			return -EFAULT;
966 
967 		return ocfs2_info_handle(inode, &info, 0);
968 	case FITRIM:
969 	{
970 		struct super_block *sb = inode->i_sb;
971 		struct request_queue *q = bdev_get_queue(sb->s_bdev);
972 		struct fstrim_range range;
973 		int ret = 0;
974 
975 		if (!capable(CAP_SYS_ADMIN))
976 			return -EPERM;
977 
978 		if (!blk_queue_discard(q))
979 			return -EOPNOTSUPP;
980 
981 		if (copy_from_user(&range, argp, sizeof(range)))
982 			return -EFAULT;
983 
984 		range.minlen = max_t(u64, q->limits.discard_granularity,
985 				     range.minlen);
986 		ret = ocfs2_trim_fs(sb, &range);
987 		if (ret < 0)
988 			return ret;
989 
990 		if (copy_to_user(argp, &range, sizeof(range)))
991 			return -EFAULT;
992 
993 		return 0;
994 	}
995 	case OCFS2_IOC_MOVE_EXT:
996 		return ocfs2_ioctl_move_extents(filp, argp);
997 	default:
998 		return -ENOTTY;
999 	}
1000 }
1001 
1002 #ifdef CONFIG_COMPAT
1003 long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
1004 {
1005 	bool preserve;
1006 	struct reflink_arguments args;
1007 	struct inode *inode = file_inode(file);
1008 	struct ocfs2_info info;
1009 	void __user *argp = (void __user *)arg;
1010 
1011 	switch (cmd) {
1012 	case OCFS2_IOC32_GETFLAGS:
1013 		cmd = OCFS2_IOC_GETFLAGS;
1014 		break;
1015 	case OCFS2_IOC32_SETFLAGS:
1016 		cmd = OCFS2_IOC_SETFLAGS;
1017 		break;
1018 	case OCFS2_IOC_RESVSP:
1019 	case OCFS2_IOC_RESVSP64:
1020 	case OCFS2_IOC_UNRESVSP:
1021 	case OCFS2_IOC_UNRESVSP64:
1022 	case OCFS2_IOC_GROUP_EXTEND:
1023 	case OCFS2_IOC_GROUP_ADD:
1024 	case OCFS2_IOC_GROUP_ADD64:
1025 	case FITRIM:
1026 		break;
1027 	case OCFS2_IOC_REFLINK:
1028 		if (copy_from_user(&args, argp, sizeof(args)))
1029 			return -EFAULT;
1030 		preserve = (args.preserve != 0);
1031 
1032 		return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path),
1033 					   compat_ptr(args.new_path), preserve);
1034 	case OCFS2_IOC_INFO:
1035 		if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))
1036 			return -EFAULT;
1037 
1038 		return ocfs2_info_handle(inode, &info, 1);
1039 	case OCFS2_IOC_MOVE_EXT:
1040 		break;
1041 	default:
1042 		return -ENOIOCTLCMD;
1043 	}
1044 
1045 	return ocfs2_ioctl(file, cmd, arg);
1046 }
1047 #endif
1048