linux/fs/affs/super.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/affs/inode.c
   3 *
   4 *  (c) 1996  Hans-Joachim Widmaier - Rewritten
   5 *
   6 *  (C) 1993  Ray Burr - Modified for Amiga FFS filesystem.
   7 *
   8 *  (C) 1992  Eric Youngdale Modified for ISO 9660 filesystem.
   9 *
  10 *  (C) 1991  Linus Torvalds - minix filesystem
  11 */
  12
  13#include <linux/module.h>
  14#include <linux/init.h>
  15#include <linux/statfs.h>
  16#include <linux/parser.h>
  17#include <linux/magic.h>
  18#include <linux/sched.h>
  19#include <linux/cred.h>
  20#include <linux/slab.h>
  21#include <linux/writeback.h>
  22#include <linux/blkdev.h>
  23#include "affs.h"
  24
  25static int affs_statfs(struct dentry *dentry, struct kstatfs *buf);
  26static int affs_remount (struct super_block *sb, int *flags, char *data);
  27
  28static void
  29affs_commit_super(struct super_block *sb, int wait)
  30{
  31        struct affs_sb_info *sbi = AFFS_SB(sb);
  32        struct buffer_head *bh = sbi->s_root_bh;
  33        struct affs_root_tail *tail = AFFS_ROOT_TAIL(sb, bh);
  34
  35        lock_buffer(bh);
  36        affs_secs_to_datestamp(ktime_get_real_seconds(), &tail->disk_change);
  37        affs_fix_checksum(sb, bh);
  38        unlock_buffer(bh);
  39
  40        mark_buffer_dirty(bh);
  41        if (wait)
  42                sync_dirty_buffer(bh);
  43}
  44
  45static void
  46affs_put_super(struct super_block *sb)
  47{
  48        struct affs_sb_info *sbi = AFFS_SB(sb);
  49        pr_debug("%s()\n", __func__);
  50
  51        cancel_delayed_work_sync(&sbi->sb_work);
  52}
  53
  54static int
  55affs_sync_fs(struct super_block *sb, int wait)
  56{
  57        affs_commit_super(sb, wait);
  58        return 0;
  59}
  60
  61static void flush_superblock(struct work_struct *work)
  62{
  63        struct affs_sb_info *sbi;
  64        struct super_block *sb;
  65
  66        sbi = container_of(work, struct affs_sb_info, sb_work.work);
  67        sb = sbi->sb;
  68
  69        spin_lock(&sbi->work_lock);
  70        sbi->work_queued = 0;
  71        spin_unlock(&sbi->work_lock);
  72
  73        affs_commit_super(sb, 1);
  74}
  75
  76void affs_mark_sb_dirty(struct super_block *sb)
  77{
  78        struct affs_sb_info *sbi = AFFS_SB(sb);
  79        unsigned long delay;
  80
  81        if (sb->s_flags & MS_RDONLY)
  82               return;
  83
  84        spin_lock(&sbi->work_lock);
  85        if (!sbi->work_queued) {
  86               delay = msecs_to_jiffies(dirty_writeback_interval * 10);
  87               queue_delayed_work(system_long_wq, &sbi->sb_work, delay);
  88               sbi->work_queued = 1;
  89        }
  90        spin_unlock(&sbi->work_lock);
  91}
  92
  93static struct kmem_cache * affs_inode_cachep;
  94
  95static struct inode *affs_alloc_inode(struct super_block *sb)
  96{
  97        struct affs_inode_info *i;
  98
  99        i = kmem_cache_alloc(affs_inode_cachep, GFP_KERNEL);
 100        if (!i)
 101                return NULL;
 102
 103        i->vfs_inode.i_version = 1;
 104        i->i_lc = NULL;
 105        i->i_ext_bh = NULL;
 106        i->i_pa_cnt = 0;
 107
 108        return &i->vfs_inode;
 109}
 110
 111static void affs_i_callback(struct rcu_head *head)
 112{
 113        struct inode *inode = container_of(head, struct inode, i_rcu);
 114        kmem_cache_free(affs_inode_cachep, AFFS_I(inode));
 115}
 116
 117static void affs_destroy_inode(struct inode *inode)
 118{
 119        call_rcu(&inode->i_rcu, affs_i_callback);
 120}
 121
 122static void init_once(void *foo)
 123{
 124        struct affs_inode_info *ei = (struct affs_inode_info *) foo;
 125
 126        sema_init(&ei->i_link_lock, 1);
 127        sema_init(&ei->i_ext_lock, 1);
 128        inode_init_once(&ei->vfs_inode);
 129}
 130
 131static int __init init_inodecache(void)
 132{
 133        affs_inode_cachep = kmem_cache_create("affs_inode_cache",
 134                                             sizeof(struct affs_inode_info),
 135                                             0, (SLAB_RECLAIM_ACCOUNT|
 136                                                SLAB_MEM_SPREAD|SLAB_ACCOUNT),
 137                                             init_once);
 138        if (affs_inode_cachep == NULL)
 139                return -ENOMEM;
 140        return 0;
 141}
 142
 143static void destroy_inodecache(void)
 144{
 145        /*
 146         * Make sure all delayed rcu free inodes are flushed before we
 147         * destroy cache.
 148         */
 149        rcu_barrier();
 150        kmem_cache_destroy(affs_inode_cachep);
 151}
 152
 153static const struct super_operations affs_sops = {
 154        .alloc_inode    = affs_alloc_inode,
 155        .destroy_inode  = affs_destroy_inode,
 156        .write_inode    = affs_write_inode,
 157        .evict_inode    = affs_evict_inode,
 158        .put_super      = affs_put_super,
 159        .sync_fs        = affs_sync_fs,
 160        .statfs         = affs_statfs,
 161        .remount_fs     = affs_remount,
 162        .show_options   = generic_show_options,
 163};
 164
 165enum {
 166        Opt_bs, Opt_mode, Opt_mufs, Opt_notruncate, Opt_prefix, Opt_protect,
 167        Opt_reserved, Opt_root, Opt_setgid, Opt_setuid,
 168        Opt_verbose, Opt_volume, Opt_ignore, Opt_err,
 169};
 170
 171static const match_table_t tokens = {
 172        {Opt_bs, "bs=%u"},
 173        {Opt_mode, "mode=%o"},
 174        {Opt_mufs, "mufs"},
 175        {Opt_notruncate, "nofilenametruncate"},
 176        {Opt_prefix, "prefix=%s"},
 177        {Opt_protect, "protect"},
 178        {Opt_reserved, "reserved=%u"},
 179        {Opt_root, "root=%u"},
 180        {Opt_setgid, "setgid=%u"},
 181        {Opt_setuid, "setuid=%u"},
 182        {Opt_verbose, "verbose"},
 183        {Opt_volume, "volume=%s"},
 184        {Opt_ignore, "grpquota"},
 185        {Opt_ignore, "noquota"},
 186        {Opt_ignore, "quota"},
 187        {Opt_ignore, "usrquota"},
 188        {Opt_err, NULL},
 189};
 190
 191static int
 192parse_options(char *options, kuid_t *uid, kgid_t *gid, int *mode, int *reserved, s32 *root,
 193                int *blocksize, char **prefix, char *volume, unsigned long *mount_opts)
 194{
 195        char *p;
 196        substring_t args[MAX_OPT_ARGS];
 197
 198        /* Fill in defaults */
 199
 200        *uid        = current_uid();
 201        *gid        = current_gid();
 202        *reserved   = 2;
 203        *root       = -1;
 204        *blocksize  = -1;
 205        volume[0]   = ':';
 206        volume[1]   = 0;
 207        *mount_opts = 0;
 208        if (!options)
 209                return 1;
 210
 211        while ((p = strsep(&options, ",")) != NULL) {
 212                int token, n, option;
 213                if (!*p)
 214                        continue;
 215
 216                token = match_token(p, tokens, args);
 217                switch (token) {
 218                case Opt_bs:
 219                        if (match_int(&args[0], &n))
 220                                return 0;
 221                        if (n != 512 && n != 1024 && n != 2048
 222                            && n != 4096) {
 223                                pr_warn("Invalid blocksize (512, 1024, 2048, 4096 allowed)\n");
 224                                return 0;
 225                        }
 226                        *blocksize = n;
 227                        break;
 228                case Opt_mode:
 229                        if (match_octal(&args[0], &option))
 230                                return 0;
 231                        *mode = option & 0777;
 232                        affs_set_opt(*mount_opts, SF_SETMODE);
 233                        break;
 234                case Opt_mufs:
 235                        affs_set_opt(*mount_opts, SF_MUFS);
 236                        break;
 237                case Opt_notruncate:
 238                        affs_set_opt(*mount_opts, SF_NO_TRUNCATE);
 239                        break;
 240                case Opt_prefix:
 241                        *prefix = match_strdup(&args[0]);
 242                        if (!*prefix)
 243                                return 0;
 244                        affs_set_opt(*mount_opts, SF_PREFIX);
 245                        break;
 246                case Opt_protect:
 247                        affs_set_opt(*mount_opts, SF_IMMUTABLE);
 248                        break;
 249                case Opt_reserved:
 250                        if (match_int(&args[0], reserved))
 251                                return 0;
 252                        break;
 253                case Opt_root:
 254                        if (match_int(&args[0], root))
 255                                return 0;
 256                        break;
 257                case Opt_setgid:
 258                        if (match_int(&args[0], &option))
 259                                return 0;
 260                        *gid = make_kgid(current_user_ns(), option);
 261                        if (!gid_valid(*gid))
 262                                return 0;
 263                        affs_set_opt(*mount_opts, SF_SETGID);
 264                        break;
 265                case Opt_setuid:
 266                        if (match_int(&args[0], &option))
 267                                return 0;
 268                        *uid = make_kuid(current_user_ns(), option);
 269                        if (!uid_valid(*uid))
 270                                return 0;
 271                        affs_set_opt(*mount_opts, SF_SETUID);
 272                        break;
 273                case Opt_verbose:
 274                        affs_set_opt(*mount_opts, SF_VERBOSE);
 275                        break;
 276                case Opt_volume: {
 277                        char *vol = match_strdup(&args[0]);
 278                        if (!vol)
 279                                return 0;
 280                        strlcpy(volume, vol, 32);
 281                        kfree(vol);
 282                        break;
 283                }
 284                case Opt_ignore:
 285                        /* Silently ignore the quota options */
 286                        break;
 287                default:
 288                        pr_warn("Unrecognized mount option \"%s\" or missing value\n",
 289                                p);
 290                        return 0;
 291                }
 292        }
 293        return 1;
 294}
 295
 296/* This function definitely needs to be split up. Some fine day I'll
 297 * hopefully have the guts to do so. Until then: sorry for the mess.
 298 */
 299
 300static int affs_fill_super(struct super_block *sb, void *data, int silent)
 301{
 302        struct affs_sb_info     *sbi;
 303        struct buffer_head      *root_bh = NULL;
 304        struct buffer_head      *boot_bh;
 305        struct inode            *root_inode = NULL;
 306        s32                      root_block;
 307        int                      size, blocksize;
 308        u32                      chksum;
 309        int                      num_bm;
 310        int                      i, j;
 311        kuid_t                   uid;
 312        kgid_t                   gid;
 313        int                      reserved;
 314        unsigned long            mount_flags;
 315        int                      tmp_flags;     /* fix remount prototype... */
 316        u8                       sig[4];
 317        int                      ret;
 318
 319        save_mount_options(sb, data);
 320
 321        pr_debug("read_super(%s)\n", data ? (const char *)data : "no options");
 322
 323        sb->s_magic             = AFFS_SUPER_MAGIC;
 324        sb->s_op                = &affs_sops;
 325        sb->s_flags |= MS_NODIRATIME;
 326
 327        sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL);
 328        if (!sbi)
 329                return -ENOMEM;
 330
 331        sb->s_fs_info = sbi;
 332        sbi->sb = sb;
 333        mutex_init(&sbi->s_bmlock);
 334        spin_lock_init(&sbi->symlink_lock);
 335        spin_lock_init(&sbi->work_lock);
 336        INIT_DELAYED_WORK(&sbi->sb_work, flush_superblock);
 337
 338        if (!parse_options(data,&uid,&gid,&i,&reserved,&root_block,
 339                                &blocksize,&sbi->s_prefix,
 340                                sbi->s_volume, &mount_flags)) {
 341                pr_err("Error parsing options\n");
 342                return -EINVAL;
 343        }
 344        /* N.B. after this point s_prefix must be released */
 345
 346        sbi->s_flags   = mount_flags;
 347        sbi->s_mode    = i;
 348        sbi->s_uid     = uid;
 349        sbi->s_gid     = gid;
 350        sbi->s_reserved= reserved;
 351
 352        /* Get the size of the device in 512-byte blocks.
 353         * If we later see that the partition uses bigger
 354         * blocks, we will have to change it.
 355         */
 356
 357        size = i_size_read(sb->s_bdev->bd_inode) >> 9;
 358        pr_debug("initial blocksize=%d, #blocks=%d\n", 512, size);
 359
 360        affs_set_blocksize(sb, PAGE_SIZE);
 361        /* Try to find root block. Its location depends on the block size. */
 362
 363        i = bdev_logical_block_size(sb->s_bdev);
 364        j = PAGE_SIZE;
 365        if (blocksize > 0) {
 366                i = j = blocksize;
 367                size = size / (blocksize / 512);
 368        }
 369
 370        for (blocksize = i; blocksize <= j; blocksize <<= 1, size >>= 1) {
 371                sbi->s_root_block = root_block;
 372                if (root_block < 0)
 373                        sbi->s_root_block = (reserved + size - 1) / 2;
 374                pr_debug("setting blocksize to %d\n", blocksize);
 375                affs_set_blocksize(sb, blocksize);
 376                sbi->s_partition_size = size;
 377
 378                /* The root block location that was calculated above is not
 379                 * correct if the partition size is an odd number of 512-
 380                 * byte blocks, which will be rounded down to a number of
 381                 * 1024-byte blocks, and if there were an even number of
 382                 * reserved blocks. Ideally, all partition checkers should
 383                 * report the real number of blocks of the real blocksize,
 384                 * but since this just cannot be done, we have to try to
 385                 * find the root block anyways. In the above case, it is one
 386                 * block behind the calculated one. So we check this one, too.
 387                 */
 388                for (num_bm = 0; num_bm < 2; num_bm++) {
 389                        pr_debug("Dev %s, trying root=%u, bs=%d, "
 390                                "size=%d, reserved=%d\n",
 391                                sb->s_id,
 392                                sbi->s_root_block + num_bm,
 393                                blocksize, size, reserved);
 394                        root_bh = affs_bread(sb, sbi->s_root_block + num_bm);
 395                        if (!root_bh)
 396                                continue;
 397                        if (!affs_checksum_block(sb, root_bh) &&
 398                            be32_to_cpu(AFFS_ROOT_HEAD(root_bh)->ptype) == T_SHORT &&
 399                            be32_to_cpu(AFFS_ROOT_TAIL(sb, root_bh)->stype) == ST_ROOT) {
 400                                sbi->s_hashsize    = blocksize / 4 - 56;
 401                                sbi->s_root_block += num_bm;
 402                                goto got_root;
 403                        }
 404                        affs_brelse(root_bh);
 405                        root_bh = NULL;
 406                }
 407        }
 408        if (!silent)
 409                pr_err("No valid root block on device %s\n", sb->s_id);
 410        return -EINVAL;
 411
 412        /* N.B. after this point bh must be released */
 413got_root:
 414        /* Keep super block in cache */
 415        sbi->s_root_bh = root_bh;
 416        root_block = sbi->s_root_block;
 417
 418        /* Find out which kind of FS we have */
 419        boot_bh = sb_bread(sb, 0);
 420        if (!boot_bh) {
 421                pr_err("Cannot read boot block\n");
 422                return -EINVAL;
 423        }
 424        memcpy(sig, boot_bh->b_data, 4);
 425        brelse(boot_bh);
 426        chksum = be32_to_cpu(*(__be32 *)sig);
 427
 428        /* Dircache filesystems are compatible with non-dircache ones
 429         * when reading. As long as they aren't supported, writing is
 430         * not recommended.
 431         */
 432        if ((chksum == FS_DCFFS || chksum == MUFS_DCFFS || chksum == FS_DCOFS
 433             || chksum == MUFS_DCOFS) && !(sb->s_flags & MS_RDONLY)) {
 434                pr_notice("Dircache FS - mounting %s read only\n", sb->s_id);
 435                sb->s_flags |= MS_RDONLY;
 436        }
 437        switch (chksum) {
 438        case MUFS_FS:
 439        case MUFS_INTLFFS:
 440        case MUFS_DCFFS:
 441                affs_set_opt(sbi->s_flags, SF_MUFS);
 442                /* fall thru */
 443        case FS_INTLFFS:
 444        case FS_DCFFS:
 445                affs_set_opt(sbi->s_flags, SF_INTL);
 446                break;
 447        case MUFS_FFS:
 448                affs_set_opt(sbi->s_flags, SF_MUFS);
 449                break;
 450        case FS_FFS:
 451                break;
 452        case MUFS_OFS:
 453                affs_set_opt(sbi->s_flags, SF_MUFS);
 454                /* fall thru */
 455        case FS_OFS:
 456                affs_set_opt(sbi->s_flags, SF_OFS);
 457                sb->s_flags |= MS_NOEXEC;
 458                break;
 459        case MUFS_DCOFS:
 460        case MUFS_INTLOFS:
 461                affs_set_opt(sbi->s_flags, SF_MUFS);
 462        case FS_DCOFS:
 463        case FS_INTLOFS:
 464                affs_set_opt(sbi->s_flags, SF_INTL);
 465                affs_set_opt(sbi->s_flags, SF_OFS);
 466                sb->s_flags |= MS_NOEXEC;
 467                break;
 468        default:
 469                pr_err("Unknown filesystem on device %s: %08X\n",
 470                       sb->s_id, chksum);
 471                return -EINVAL;
 472        }
 473
 474        if (affs_test_opt(mount_flags, SF_VERBOSE)) {
 475                u8 len = AFFS_ROOT_TAIL(sb, root_bh)->disk_name[0];
 476                pr_notice("Mounting volume \"%.*s\": Type=%.3s\\%c, Blocksize=%d\n",
 477                        len > 31 ? 31 : len,
 478                        AFFS_ROOT_TAIL(sb, root_bh)->disk_name + 1,
 479                        sig, sig[3] + '0', blocksize);
 480        }
 481
 482        sb->s_flags |= MS_NODEV | MS_NOSUID;
 483
 484        sbi->s_data_blksize = sb->s_blocksize;
 485        if (affs_test_opt(sbi->s_flags, SF_OFS))
 486                sbi->s_data_blksize -= 24;
 487
 488        tmp_flags = sb->s_flags;
 489        ret = affs_init_bitmap(sb, &tmp_flags);
 490        if (ret)
 491                return ret;
 492        sb->s_flags = tmp_flags;
 493
 494        /* set up enough so that it can read an inode */
 495
 496        root_inode = affs_iget(sb, root_block);
 497        if (IS_ERR(root_inode))
 498                return PTR_ERR(root_inode);
 499
 500        if (affs_test_opt(AFFS_SB(sb)->s_flags, SF_INTL))
 501                sb->s_d_op = &affs_intl_dentry_operations;
 502        else
 503                sb->s_d_op = &affs_dentry_operations;
 504
 505        sb->s_root = d_make_root(root_inode);
 506        if (!sb->s_root) {
 507                pr_err("AFFS: Get root inode failed\n");
 508                return -ENOMEM;
 509        }
 510
 511        sb->s_export_op = &affs_export_ops;
 512        pr_debug("s_flags=%lX\n", sb->s_flags);
 513        return 0;
 514}
 515
 516static int
 517affs_remount(struct super_block *sb, int *flags, char *data)
 518{
 519        struct affs_sb_info     *sbi = AFFS_SB(sb);
 520        int                      blocksize;
 521        kuid_t                   uid;
 522        kgid_t                   gid;
 523        int                      mode;
 524        int                      reserved;
 525        int                      root_block;
 526        unsigned long            mount_flags;
 527        int                      res = 0;
 528        char                    *new_opts;
 529        char                     volume[32];
 530        char                    *prefix = NULL;
 531
 532        new_opts = kstrdup(data, GFP_KERNEL);
 533        if (data && !new_opts)
 534                return -ENOMEM;
 535
 536        pr_debug("%s(flags=0x%x,opts=\"%s\")\n", __func__, *flags, data);
 537
 538        sync_filesystem(sb);
 539        *flags |= MS_NODIRATIME;
 540
 541        memcpy(volume, sbi->s_volume, 32);
 542        if (!parse_options(data, &uid, &gid, &mode, &reserved, &root_block,
 543                           &blocksize, &prefix, volume,
 544                           &mount_flags)) {
 545                kfree(prefix);
 546                kfree(new_opts);
 547                return -EINVAL;
 548        }
 549
 550        flush_delayed_work(&sbi->sb_work);
 551        if (new_opts)
 552                replace_mount_options(sb, new_opts);
 553
 554        sbi->s_flags = mount_flags;
 555        sbi->s_mode  = mode;
 556        sbi->s_uid   = uid;
 557        sbi->s_gid   = gid;
 558        /* protect against readers */
 559        spin_lock(&sbi->symlink_lock);
 560        if (prefix) {
 561                kfree(sbi->s_prefix);
 562                sbi->s_prefix = prefix;
 563        }
 564        memcpy(sbi->s_volume, volume, 32);
 565        spin_unlock(&sbi->symlink_lock);
 566
 567        if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
 568                return 0;
 569
 570        if (*flags & MS_RDONLY)
 571                affs_free_bitmap(sb);
 572        else
 573                res = affs_init_bitmap(sb, flags);
 574
 575        return res;
 576}
 577
 578static int
 579affs_statfs(struct dentry *dentry, struct kstatfs *buf)
 580{
 581        struct super_block *sb = dentry->d_sb;
 582        int              free;
 583        u64              id = huge_encode_dev(sb->s_bdev->bd_dev);
 584
 585        pr_debug("%s() partsize=%d, reserved=%d\n",
 586                 __func__, AFFS_SB(sb)->s_partition_size,
 587                 AFFS_SB(sb)->s_reserved);
 588
 589        free          = affs_count_free_blocks(sb);
 590        buf->f_type    = AFFS_SUPER_MAGIC;
 591        buf->f_bsize   = sb->s_blocksize;
 592        buf->f_blocks  = AFFS_SB(sb)->s_partition_size - AFFS_SB(sb)->s_reserved;
 593        buf->f_bfree   = free;
 594        buf->f_bavail  = free;
 595        buf->f_fsid.val[0] = (u32)id;
 596        buf->f_fsid.val[1] = (u32)(id >> 32);
 597        buf->f_namelen = AFFSNAMEMAX;
 598        return 0;
 599}
 600
 601static struct dentry *affs_mount(struct file_system_type *fs_type,
 602        int flags, const char *dev_name, void *data)
 603{
 604        return mount_bdev(fs_type, flags, dev_name, data, affs_fill_super);
 605}
 606
 607static void affs_kill_sb(struct super_block *sb)
 608{
 609        struct affs_sb_info *sbi = AFFS_SB(sb);
 610        kill_block_super(sb);
 611        if (sbi) {
 612                affs_free_bitmap(sb);
 613                affs_brelse(sbi->s_root_bh);
 614                kfree(sbi->s_prefix);
 615                mutex_destroy(&sbi->s_bmlock);
 616                kfree(sbi);
 617        }
 618}
 619
 620static struct file_system_type affs_fs_type = {
 621        .owner          = THIS_MODULE,
 622        .name           = "affs",
 623        .mount          = affs_mount,
 624        .kill_sb        = affs_kill_sb,
 625        .fs_flags       = FS_REQUIRES_DEV,
 626};
 627MODULE_ALIAS_FS("affs");
 628
 629static int __init init_affs_fs(void)
 630{
 631        int err = init_inodecache();
 632        if (err)
 633                goto out1;
 634        err = register_filesystem(&affs_fs_type);
 635        if (err)
 636                goto out;
 637        return 0;
 638out:
 639        destroy_inodecache();
 640out1:
 641        return err;
 642}
 643
 644static void __exit exit_affs_fs(void)
 645{
 646        unregister_filesystem(&affs_fs_type);
 647        destroy_inodecache();
 648}
 649
 650MODULE_DESCRIPTION("Amiga filesystem support for Linux");
 651MODULE_LICENSE("GPL");
 652
 653module_init(init_affs_fs)
 654module_exit(exit_affs_fs)
 655