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