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