linux/fs/jfs/super.c
<<
>>
Prefs
   1/*
   2 *   Copyright (C) International Business Machines Corp., 2000-2004
   3 *   Portions Copyright (C) Christoph Hellwig, 2001-2002
   4 *
   5 *   This program is free software;  you can redistribute it and/or modify
   6 *   it under the terms of the GNU General Public License as published by
   7 *   the Free Software Foundation; either version 2 of the License, or
   8 *   (at your option) any later version.
   9 *
  10 *   This program is distributed in the hope that it will be useful,
  11 *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
  12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  13 *   the GNU General Public License for more details.
  14 *
  15 *   You should have received a copy of the GNU General Public License
  16 *   along with this program;  if not, write to the Free Software
  17 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18 */
  19
  20#include <linux/fs.h>
  21#include <linux/module.h>
  22#include <linux/parser.h>
  23#include <linux/completion.h>
  24#include <linux/vfs.h>
  25#include <linux/quotaops.h>
  26#include <linux/mount.h>
  27#include <linux/moduleparam.h>
  28#include <linux/kthread.h>
  29#include <linux/posix_acl.h>
  30#include <linux/buffer_head.h>
  31#include <linux/exportfs.h>
  32#include <linux/crc32.h>
  33#include <linux/slab.h>
  34#include <linux/uaccess.h>
  35#include <linux/seq_file.h>
  36#include <linux/blkdev.h>
  37
  38#include "jfs_incore.h"
  39#include "jfs_filsys.h"
  40#include "jfs_inode.h"
  41#include "jfs_metapage.h"
  42#include "jfs_superblock.h"
  43#include "jfs_dmap.h"
  44#include "jfs_imap.h"
  45#include "jfs_acl.h"
  46#include "jfs_debug.h"
  47#include "jfs_xattr.h"
  48
  49MODULE_DESCRIPTION("The Journaled Filesystem (JFS)");
  50MODULE_AUTHOR("Steve Best/Dave Kleikamp/Barry Arndt, IBM");
  51MODULE_LICENSE("GPL");
  52
  53static struct kmem_cache *jfs_inode_cachep;
  54
  55static const struct super_operations jfs_super_operations;
  56static const struct export_operations jfs_export_operations;
  57static struct file_system_type jfs_fs_type;
  58
  59#define MAX_COMMIT_THREADS 64
  60static int commit_threads;
  61module_param(commit_threads, int, 0);
  62MODULE_PARM_DESC(commit_threads, "Number of commit threads");
  63
  64static struct task_struct *jfsCommitThread[MAX_COMMIT_THREADS];
  65struct task_struct *jfsIOthread;
  66struct task_struct *jfsSyncThread;
  67
  68#ifdef CONFIG_JFS_DEBUG
  69int jfsloglevel = JFS_LOGLEVEL_WARN;
  70module_param(jfsloglevel, int, 0644);
  71MODULE_PARM_DESC(jfsloglevel, "Specify JFS loglevel (0, 1 or 2)");
  72#endif
  73
  74static void jfs_handle_error(struct super_block *sb)
  75{
  76        struct jfs_sb_info *sbi = JFS_SBI(sb);
  77
  78        if (sb->s_flags & MS_RDONLY)
  79                return;
  80
  81        updateSuper(sb, FM_DIRTY);
  82
  83        if (sbi->flag & JFS_ERR_PANIC)
  84                panic("JFS (device %s): panic forced after error\n",
  85                        sb->s_id);
  86        else if (sbi->flag & JFS_ERR_REMOUNT_RO) {
  87                jfs_err("ERROR: (device %s): remounting filesystem as read-only",
  88                        sb->s_id);
  89                sb->s_flags |= MS_RDONLY;
  90        }
  91
  92        /* nothing is done for continue beyond marking the superblock dirty */
  93}
  94
  95void jfs_error(struct super_block *sb, const char *fmt, ...)
  96{
  97        struct va_format vaf;
  98        va_list args;
  99
 100        va_start(args, fmt);
 101
 102        vaf.fmt = fmt;
 103        vaf.va = &args;
 104
 105        pr_err("ERROR: (device %s): %ps: %pV\n",
 106               sb->s_id, __builtin_return_address(0), &vaf);
 107
 108        va_end(args);
 109
 110        jfs_handle_error(sb);
 111}
 112
 113static struct inode *jfs_alloc_inode(struct super_block *sb)
 114{
 115        struct jfs_inode_info *jfs_inode;
 116
 117        jfs_inode = kmem_cache_alloc(jfs_inode_cachep, GFP_NOFS);
 118        if (!jfs_inode)
 119                return NULL;
 120#ifdef CONFIG_QUOTA
 121        memset(&jfs_inode->i_dquot, 0, sizeof(jfs_inode->i_dquot));
 122#endif
 123        return &jfs_inode->vfs_inode;
 124}
 125
 126static void jfs_i_callback(struct rcu_head *head)
 127{
 128        struct inode *inode = container_of(head, struct inode, i_rcu);
 129        struct jfs_inode_info *ji = JFS_IP(inode);
 130        kmem_cache_free(jfs_inode_cachep, ji);
 131}
 132
 133static void jfs_destroy_inode(struct inode *inode)
 134{
 135        struct jfs_inode_info *ji = JFS_IP(inode);
 136
 137        BUG_ON(!list_empty(&ji->anon_inode_list));
 138
 139        spin_lock_irq(&ji->ag_lock);
 140        if (ji->active_ag != -1) {
 141                struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
 142                atomic_dec(&bmap->db_active[ji->active_ag]);
 143                ji->active_ag = -1;
 144        }
 145        spin_unlock_irq(&ji->ag_lock);
 146        call_rcu(&inode->i_rcu, jfs_i_callback);
 147}
 148
 149static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf)
 150{
 151        struct jfs_sb_info *sbi = JFS_SBI(dentry->d_sb);
 152        s64 maxinodes;
 153        struct inomap *imap = JFS_IP(sbi->ipimap)->i_imap;
 154
 155        jfs_info("In jfs_statfs");
 156        buf->f_type = JFS_SUPER_MAGIC;
 157        buf->f_bsize = sbi->bsize;
 158        buf->f_blocks = sbi->bmap->db_mapsize;
 159        buf->f_bfree = sbi->bmap->db_nfree;
 160        buf->f_bavail = sbi->bmap->db_nfree;
 161        /*
 162         * If we really return the number of allocated & free inodes, some
 163         * applications will fail because they won't see enough free inodes.
 164         * We'll try to calculate some guess as to how many inodes we can
 165         * really allocate
 166         *
 167         * buf->f_files = atomic_read(&imap->im_numinos);
 168         * buf->f_ffree = atomic_read(&imap->im_numfree);
 169         */
 170        maxinodes = min((s64) atomic_read(&imap->im_numinos) +
 171                        ((sbi->bmap->db_nfree >> imap->im_l2nbperiext)
 172                         << L2INOSPEREXT), (s64) 0xffffffffLL);
 173        buf->f_files = maxinodes;
 174        buf->f_ffree = maxinodes - (atomic_read(&imap->im_numinos) -
 175                                    atomic_read(&imap->im_numfree));
 176        buf->f_fsid.val[0] = (u32)crc32_le(0, sbi->uuid, sizeof(sbi->uuid)/2);
 177        buf->f_fsid.val[1] = (u32)crc32_le(0, sbi->uuid + sizeof(sbi->uuid)/2,
 178                                        sizeof(sbi->uuid)/2);
 179
 180        buf->f_namelen = JFS_NAME_MAX;
 181        return 0;
 182}
 183
 184static void jfs_put_super(struct super_block *sb)
 185{
 186        struct jfs_sb_info *sbi = JFS_SBI(sb);
 187        int rc;
 188
 189        jfs_info("In jfs_put_super");
 190
 191        dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
 192
 193        rc = jfs_umount(sb);
 194        if (rc)
 195                jfs_err("jfs_umount failed with return code %d", rc);
 196
 197        unload_nls(sbi->nls_tab);
 198
 199        truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
 200        iput(sbi->direct_inode);
 201
 202        kfree(sbi);
 203}
 204
 205enum {
 206        Opt_integrity, Opt_nointegrity, Opt_iocharset, Opt_resize,
 207        Opt_resize_nosize, Opt_errors, Opt_ignore, Opt_err, Opt_quota,
 208        Opt_usrquota, Opt_grpquota, Opt_uid, Opt_gid, Opt_umask,
 209        Opt_discard, Opt_nodiscard, Opt_discard_minblk
 210};
 211
 212static const match_table_t tokens = {
 213        {Opt_integrity, "integrity"},
 214        {Opt_nointegrity, "nointegrity"},
 215        {Opt_iocharset, "iocharset=%s"},
 216        {Opt_resize, "resize=%u"},
 217        {Opt_resize_nosize, "resize"},
 218        {Opt_errors, "errors=%s"},
 219        {Opt_ignore, "noquota"},
 220        {Opt_ignore, "quota"},
 221        {Opt_usrquota, "usrquota"},
 222        {Opt_grpquota, "grpquota"},
 223        {Opt_uid, "uid=%u"},
 224        {Opt_gid, "gid=%u"},
 225        {Opt_umask, "umask=%u"},
 226        {Opt_discard, "discard"},
 227        {Opt_nodiscard, "nodiscard"},
 228        {Opt_discard_minblk, "discard=%u"},
 229        {Opt_err, NULL}
 230};
 231
 232static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
 233                         int *flag)
 234{
 235        void *nls_map = (void *)-1;     /* -1: no change;  NULL: none */
 236        char *p;
 237        struct jfs_sb_info *sbi = JFS_SBI(sb);
 238
 239        *newLVSize = 0;
 240
 241        if (!options)
 242                return 1;
 243
 244        while ((p = strsep(&options, ",")) != NULL) {
 245                substring_t args[MAX_OPT_ARGS];
 246                int token;
 247                if (!*p)
 248                        continue;
 249
 250                token = match_token(p, tokens, args);
 251                switch (token) {
 252                case Opt_integrity:
 253                        *flag &= ~JFS_NOINTEGRITY;
 254                        break;
 255                case Opt_nointegrity:
 256                        *flag |= JFS_NOINTEGRITY;
 257                        break;
 258                case Opt_ignore:
 259                        /* Silently ignore the quota options */
 260                        /* Don't do anything ;-) */
 261                        break;
 262                case Opt_iocharset:
 263                        if (nls_map && nls_map != (void *) -1)
 264                                unload_nls(nls_map);
 265                        if (!strcmp(args[0].from, "none"))
 266                                nls_map = NULL;
 267                        else {
 268                                nls_map = load_nls(args[0].from);
 269                                if (!nls_map) {
 270                                        pr_err("JFS: charset not found\n");
 271                                        goto cleanup;
 272                                }
 273                        }
 274                        break;
 275                case Opt_resize:
 276                {
 277                        char *resize = args[0].from;
 278                        int rc = kstrtoll(resize, 0, newLVSize);
 279
 280                        if (rc)
 281                                goto cleanup;
 282                        break;
 283                }
 284                case Opt_resize_nosize:
 285                {
 286                        *newLVSize = sb->s_bdev->bd_inode->i_size >>
 287                                sb->s_blocksize_bits;
 288                        if (*newLVSize == 0)
 289                                pr_err("JFS: Cannot determine volume size\n");
 290                        break;
 291                }
 292                case Opt_errors:
 293                {
 294                        char *errors = args[0].from;
 295                        if (!errors || !*errors)
 296                                goto cleanup;
 297                        if (!strcmp(errors, "continue")) {
 298                                *flag &= ~JFS_ERR_REMOUNT_RO;
 299                                *flag &= ~JFS_ERR_PANIC;
 300                                *flag |= JFS_ERR_CONTINUE;
 301                        } else if (!strcmp(errors, "remount-ro")) {
 302                                *flag &= ~JFS_ERR_CONTINUE;
 303                                *flag &= ~JFS_ERR_PANIC;
 304                                *flag |= JFS_ERR_REMOUNT_RO;
 305                        } else if (!strcmp(errors, "panic")) {
 306                                *flag &= ~JFS_ERR_CONTINUE;
 307                                *flag &= ~JFS_ERR_REMOUNT_RO;
 308                                *flag |= JFS_ERR_PANIC;
 309                        } else {
 310                                pr_err("JFS: %s is an invalid error handler\n",
 311                                       errors);
 312                                goto cleanup;
 313                        }
 314                        break;
 315                }
 316
 317#ifdef CONFIG_QUOTA
 318                case Opt_quota:
 319                case Opt_usrquota:
 320                        *flag |= JFS_USRQUOTA;
 321                        break;
 322                case Opt_grpquota:
 323                        *flag |= JFS_GRPQUOTA;
 324                        break;
 325#else
 326                case Opt_usrquota:
 327                case Opt_grpquota:
 328                case Opt_quota:
 329                        pr_err("JFS: quota operations not supported\n");
 330                        break;
 331#endif
 332                case Opt_uid:
 333                {
 334                        char *uid = args[0].from;
 335                        uid_t val;
 336                        int rc = kstrtouint(uid, 0, &val);
 337
 338                        if (rc)
 339                                goto cleanup;
 340                        sbi->uid = make_kuid(current_user_ns(), val);
 341                        if (!uid_valid(sbi->uid))
 342                                goto cleanup;
 343                        break;
 344                }
 345
 346                case Opt_gid:
 347                {
 348                        char *gid = args[0].from;
 349                        gid_t val;
 350                        int rc = kstrtouint(gid, 0, &val);
 351
 352                        if (rc)
 353                                goto cleanup;
 354                        sbi->gid = make_kgid(current_user_ns(), val);
 355                        if (!gid_valid(sbi->gid))
 356                                goto cleanup;
 357                        break;
 358                }
 359
 360                case Opt_umask:
 361                {
 362                        char *umask = args[0].from;
 363                        int rc = kstrtouint(umask, 8, &sbi->umask);
 364
 365                        if (rc)
 366                                goto cleanup;
 367                        if (sbi->umask & ~0777) {
 368                                pr_err("JFS: Invalid value of umask\n");
 369                                goto cleanup;
 370                        }
 371                        break;
 372                }
 373
 374                case Opt_discard:
 375                {
 376                        struct request_queue *q = bdev_get_queue(sb->s_bdev);
 377                        /* if set to 1, even copying files will cause
 378                         * trimming :O
 379                         * -> user has more control over the online trimming
 380                         */
 381                        sbi->minblks_trim = 64;
 382                        if (blk_queue_discard(q))
 383                                *flag |= JFS_DISCARD;
 384                        else
 385                                pr_err("JFS: discard option not supported on device\n");
 386                        break;
 387                }
 388
 389                case Opt_nodiscard:
 390                        *flag &= ~JFS_DISCARD;
 391                        break;
 392
 393                case Opt_discard_minblk:
 394                {
 395                        struct request_queue *q = bdev_get_queue(sb->s_bdev);
 396                        char *minblks_trim = args[0].from;
 397                        int rc;
 398                        if (blk_queue_discard(q)) {
 399                                *flag |= JFS_DISCARD;
 400                                rc = kstrtouint(minblks_trim, 0,
 401                                                &sbi->minblks_trim);
 402                                if (rc)
 403                                        goto cleanup;
 404                        } else
 405                                pr_err("JFS: discard option not supported on device\n");
 406                        break;
 407                }
 408
 409                default:
 410                        printk("jfs: Unrecognized mount option \"%s\" or missing value\n",
 411                               p);
 412                        goto cleanup;
 413                }
 414        }
 415
 416        if (nls_map != (void *) -1) {
 417                /* Discard old (if remount) */
 418                unload_nls(sbi->nls_tab);
 419                sbi->nls_tab = nls_map;
 420        }
 421        return 1;
 422
 423cleanup:
 424        if (nls_map && nls_map != (void *) -1)
 425                unload_nls(nls_map);
 426        return 0;
 427}
 428
 429static int jfs_remount(struct super_block *sb, int *flags, char *data)
 430{
 431        s64 newLVSize = 0;
 432        int rc = 0;
 433        int flag = JFS_SBI(sb)->flag;
 434        int ret;
 435
 436        sync_filesystem(sb);
 437        if (!parse_options(data, sb, &newLVSize, &flag))
 438                return -EINVAL;
 439
 440        if (newLVSize) {
 441                if (sb->s_flags & MS_RDONLY) {
 442                        pr_err("JFS: resize requires volume to be mounted read-write\n");
 443                        return -EROFS;
 444                }
 445                rc = jfs_extendfs(sb, newLVSize, 0);
 446                if (rc)
 447                        return rc;
 448        }
 449
 450        if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
 451                /*
 452                 * Invalidate any previously read metadata.  fsck may have
 453                 * changed the on-disk data since we mounted r/o
 454                 */
 455                truncate_inode_pages(JFS_SBI(sb)->direct_inode->i_mapping, 0);
 456
 457                JFS_SBI(sb)->flag = flag;
 458                ret = jfs_mount_rw(sb, 1);
 459
 460                /* mark the fs r/w for quota activity */
 461                sb->s_flags &= ~MS_RDONLY;
 462
 463                dquot_resume(sb, -1);
 464                return ret;
 465        }
 466        if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
 467                rc = dquot_suspend(sb, -1);
 468                if (rc < 0)
 469                        return rc;
 470                rc = jfs_umount_rw(sb);
 471                JFS_SBI(sb)->flag = flag;
 472                return rc;
 473        }
 474        if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY))
 475                if (!(sb->s_flags & MS_RDONLY)) {
 476                        rc = jfs_umount_rw(sb);
 477                        if (rc)
 478                                return rc;
 479
 480                        JFS_SBI(sb)->flag = flag;
 481                        ret = jfs_mount_rw(sb, 1);
 482                        return ret;
 483                }
 484        JFS_SBI(sb)->flag = flag;
 485
 486        return 0;
 487}
 488
 489static int jfs_fill_super(struct super_block *sb, void *data, int silent)
 490{
 491        struct jfs_sb_info *sbi;
 492        struct inode *inode;
 493        int rc;
 494        s64 newLVSize = 0;
 495        int flag, ret = -EINVAL;
 496
 497        jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags);
 498
 499        sbi = kzalloc(sizeof(struct jfs_sb_info), GFP_KERNEL);
 500        if (!sbi)
 501                return -ENOMEM;
 502
 503        sb->s_fs_info = sbi;
 504        sb->s_max_links = JFS_LINK_MAX;
 505        sbi->sb = sb;
 506        sbi->uid = INVALID_UID;
 507        sbi->gid = INVALID_GID;
 508        sbi->umask = -1;
 509
 510        /* initialize the mount flag and determine the default error handler */
 511        flag = JFS_ERR_REMOUNT_RO;
 512
 513        if (!parse_options((char *) data, sb, &newLVSize, &flag))
 514                goto out_kfree;
 515        sbi->flag = flag;
 516
 517#ifdef CONFIG_JFS_POSIX_ACL
 518        sb->s_flags |= MS_POSIXACL;
 519#endif
 520
 521        if (newLVSize) {
 522                pr_err("resize option for remount only\n");
 523                goto out_kfree;
 524        }
 525
 526        /*
 527         * Initialize blocksize to 4K.
 528         */
 529        sb_set_blocksize(sb, PSIZE);
 530
 531        /*
 532         * Set method vectors.
 533         */
 534        sb->s_op = &jfs_super_operations;
 535        sb->s_export_op = &jfs_export_operations;
 536        sb->s_xattr = jfs_xattr_handlers;
 537#ifdef CONFIG_QUOTA
 538        sb->dq_op = &dquot_operations;
 539        sb->s_qcop = &dquot_quotactl_ops;
 540        sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
 541#endif
 542
 543        /*
 544         * Initialize direct-mapping inode/address-space
 545         */
 546        inode = new_inode(sb);
 547        if (inode == NULL) {
 548                ret = -ENOMEM;
 549                goto out_unload;
 550        }
 551        inode->i_ino = 0;
 552        inode->i_size = sb->s_bdev->bd_inode->i_size;
 553        inode->i_mapping->a_ops = &jfs_metapage_aops;
 554        hlist_add_fake(&inode->i_hash);
 555        mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
 556
 557        sbi->direct_inode = inode;
 558
 559        rc = jfs_mount(sb);
 560        if (rc) {
 561                if (!silent)
 562                        jfs_err("jfs_mount failed w/return code = %d", rc);
 563                goto out_mount_failed;
 564        }
 565        if (sb->s_flags & MS_RDONLY)
 566                sbi->log = NULL;
 567        else {
 568                rc = jfs_mount_rw(sb, 0);
 569                if (rc) {
 570                        if (!silent) {
 571                                jfs_err("jfs_mount_rw failed, return code = %d",
 572                                        rc);
 573                        }
 574                        goto out_no_rw;
 575                }
 576        }
 577
 578        sb->s_magic = JFS_SUPER_MAGIC;
 579
 580        if (sbi->mntflag & JFS_OS2)
 581                sb->s_d_op = &jfs_ci_dentry_operations;
 582
 583        inode = jfs_iget(sb, ROOT_I);
 584        if (IS_ERR(inode)) {
 585                ret = PTR_ERR(inode);
 586                goto out_no_rw;
 587        }
 588        sb->s_root = d_make_root(inode);
 589        if (!sb->s_root)
 590                goto out_no_root;
 591
 592        /* logical blocks are represented by 40 bits in pxd_t, etc. */
 593        sb->s_maxbytes = ((u64) sb->s_blocksize) << 40;
 594#if BITS_PER_LONG == 32
 595        /*
 596         * Page cache is indexed by long.
 597         * I would use MAX_LFS_FILESIZE, but it's only half as big
 598         */
 599        sb->s_maxbytes = min(((u64) PAGE_SIZE << 32) - 1,
 600                             (u64)sb->s_maxbytes);
 601#endif
 602        sb->s_time_gran = 1;
 603        return 0;
 604
 605out_no_root:
 606        jfs_err("jfs_read_super: get root dentry failed");
 607
 608out_no_rw:
 609        rc = jfs_umount(sb);
 610        if (rc)
 611                jfs_err("jfs_umount failed with return code %d", rc);
 612out_mount_failed:
 613        filemap_write_and_wait(sbi->direct_inode->i_mapping);
 614        truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
 615        make_bad_inode(sbi->direct_inode);
 616        iput(sbi->direct_inode);
 617        sbi->direct_inode = NULL;
 618out_unload:
 619        unload_nls(sbi->nls_tab);
 620out_kfree:
 621        kfree(sbi);
 622        return ret;
 623}
 624
 625static int jfs_freeze(struct super_block *sb)
 626{
 627        struct jfs_sb_info *sbi = JFS_SBI(sb);
 628        struct jfs_log *log = sbi->log;
 629        int rc = 0;
 630
 631        if (!(sb->s_flags & MS_RDONLY)) {
 632                txQuiesce(sb);
 633                rc = lmLogShutdown(log);
 634                if (rc) {
 635                        jfs_error(sb, "lmLogShutdown failed\n");
 636
 637                        /* let operations fail rather than hang */
 638                        txResume(sb);
 639
 640                        return rc;
 641                }
 642                rc = updateSuper(sb, FM_CLEAN);
 643                if (rc) {
 644                        jfs_err("jfs_freeze: updateSuper failed");
 645                        /*
 646                         * Don't fail here. Everything succeeded except
 647                         * marking the superblock clean, so there's really
 648                         * no harm in leaving it frozen for now.
 649                         */
 650                }
 651        }
 652        return 0;
 653}
 654
 655static int jfs_unfreeze(struct super_block *sb)
 656{
 657        struct jfs_sb_info *sbi = JFS_SBI(sb);
 658        struct jfs_log *log = sbi->log;
 659        int rc = 0;
 660
 661        if (!(sb->s_flags & MS_RDONLY)) {
 662                rc = updateSuper(sb, FM_MOUNT);
 663                if (rc) {
 664                        jfs_error(sb, "updateSuper failed\n");
 665                        goto out;
 666                }
 667                rc = lmLogInit(log);
 668                if (rc)
 669                        jfs_error(sb, "lmLogInit failed\n");
 670out:
 671                txResume(sb);
 672        }
 673        return rc;
 674}
 675
 676static struct dentry *jfs_do_mount(struct file_system_type *fs_type,
 677        int flags, const char *dev_name, void *data)
 678{
 679        return mount_bdev(fs_type, flags, dev_name, data, jfs_fill_super);
 680}
 681
 682static int jfs_sync_fs(struct super_block *sb, int wait)
 683{
 684        struct jfs_log *log = JFS_SBI(sb)->log;
 685
 686        /* log == NULL indicates read-only mount */
 687        if (log) {
 688                /*
 689                 * Write quota structures to quota file, sync_blockdev() will
 690                 * write them to disk later
 691                 */
 692                dquot_writeback_dquots(sb, -1);
 693                jfs_flush_journal(log, wait);
 694                jfs_syncpt(log, 0);
 695        }
 696
 697        return 0;
 698}
 699
 700static int jfs_show_options(struct seq_file *seq, struct dentry *root)
 701{
 702        struct jfs_sb_info *sbi = JFS_SBI(root->d_sb);
 703
 704        if (uid_valid(sbi->uid))
 705                seq_printf(seq, ",uid=%d", from_kuid(&init_user_ns, sbi->uid));
 706        if (gid_valid(sbi->gid))
 707                seq_printf(seq, ",gid=%d", from_kgid(&init_user_ns, sbi->gid));
 708        if (sbi->umask != -1)
 709                seq_printf(seq, ",umask=%03o", sbi->umask);
 710        if (sbi->flag & JFS_NOINTEGRITY)
 711                seq_puts(seq, ",nointegrity");
 712        if (sbi->flag & JFS_DISCARD)
 713                seq_printf(seq, ",discard=%u", sbi->minblks_trim);
 714        if (sbi->nls_tab)
 715                seq_printf(seq, ",iocharset=%s", sbi->nls_tab->charset);
 716        if (sbi->flag & JFS_ERR_CONTINUE)
 717                seq_printf(seq, ",errors=continue");
 718        if (sbi->flag & JFS_ERR_PANIC)
 719                seq_printf(seq, ",errors=panic");
 720
 721#ifdef CONFIG_QUOTA
 722        if (sbi->flag & JFS_USRQUOTA)
 723                seq_puts(seq, ",usrquota");
 724
 725        if (sbi->flag & JFS_GRPQUOTA)
 726                seq_puts(seq, ",grpquota");
 727#endif
 728
 729        return 0;
 730}
 731
 732#ifdef CONFIG_QUOTA
 733
 734/* Read data from quotafile - avoid pagecache and such because we cannot afford
 735 * acquiring the locks... As quota files are never truncated and quota code
 736 * itself serializes the operations (and no one else should touch the files)
 737 * we don't have to be afraid of races */
 738static ssize_t jfs_quota_read(struct super_block *sb, int type, char *data,
 739                              size_t len, loff_t off)
 740{
 741        struct inode *inode = sb_dqopt(sb)->files[type];
 742        sector_t blk = off >> sb->s_blocksize_bits;
 743        int err = 0;
 744        int offset = off & (sb->s_blocksize - 1);
 745        int tocopy;
 746        size_t toread;
 747        struct buffer_head tmp_bh;
 748        struct buffer_head *bh;
 749        loff_t i_size = i_size_read(inode);
 750
 751        if (off > i_size)
 752                return 0;
 753        if (off+len > i_size)
 754                len = i_size-off;
 755        toread = len;
 756        while (toread > 0) {
 757                tocopy = sb->s_blocksize - offset < toread ?
 758                                sb->s_blocksize - offset : toread;
 759
 760                tmp_bh.b_state = 0;
 761                tmp_bh.b_size = i_blocksize(inode);
 762                err = jfs_get_block(inode, blk, &tmp_bh, 0);
 763                if (err)
 764                        return err;
 765                if (!buffer_mapped(&tmp_bh))    /* A hole? */
 766                        memset(data, 0, tocopy);
 767                else {
 768                        bh = sb_bread(sb, tmp_bh.b_blocknr);
 769                        if (!bh)
 770                                return -EIO;
 771                        memcpy(data, bh->b_data+offset, tocopy);
 772                        brelse(bh);
 773                }
 774                offset = 0;
 775                toread -= tocopy;
 776                data += tocopy;
 777                blk++;
 778        }
 779        return len;
 780}
 781
 782/* Write to quotafile */
 783static ssize_t jfs_quota_write(struct super_block *sb, int type,
 784                               const char *data, size_t len, loff_t off)
 785{
 786        struct inode *inode = sb_dqopt(sb)->files[type];
 787        sector_t blk = off >> sb->s_blocksize_bits;
 788        int err = 0;
 789        int offset = off & (sb->s_blocksize - 1);
 790        int tocopy;
 791        size_t towrite = len;
 792        struct buffer_head tmp_bh;
 793        struct buffer_head *bh;
 794
 795        inode_lock(inode);
 796        while (towrite > 0) {
 797                tocopy = sb->s_blocksize - offset < towrite ?
 798                                sb->s_blocksize - offset : towrite;
 799
 800                tmp_bh.b_state = 0;
 801                tmp_bh.b_size = i_blocksize(inode);
 802                err = jfs_get_block(inode, blk, &tmp_bh, 1);
 803                if (err)
 804                        goto out;
 805                if (offset || tocopy != sb->s_blocksize)
 806                        bh = sb_bread(sb, tmp_bh.b_blocknr);
 807                else
 808                        bh = sb_getblk(sb, tmp_bh.b_blocknr);
 809                if (!bh) {
 810                        err = -EIO;
 811                        goto out;
 812                }
 813                lock_buffer(bh);
 814                memcpy(bh->b_data+offset, data, tocopy);
 815                flush_dcache_page(bh->b_page);
 816                set_buffer_uptodate(bh);
 817                mark_buffer_dirty(bh);
 818                unlock_buffer(bh);
 819                brelse(bh);
 820                offset = 0;
 821                towrite -= tocopy;
 822                data += tocopy;
 823                blk++;
 824        }
 825out:
 826        if (len == towrite) {
 827                inode_unlock(inode);
 828                return err;
 829        }
 830        if (inode->i_size < off+len-towrite)
 831                i_size_write(inode, off+len-towrite);
 832        inode->i_version++;
 833        inode->i_mtime = inode->i_ctime = current_time(inode);
 834        mark_inode_dirty(inode);
 835        inode_unlock(inode);
 836        return len - towrite;
 837}
 838
 839static struct dquot **jfs_get_dquots(struct inode *inode)
 840{
 841        return JFS_IP(inode)->i_dquot;
 842}
 843#endif
 844
 845static const struct super_operations jfs_super_operations = {
 846        .alloc_inode    = jfs_alloc_inode,
 847        .destroy_inode  = jfs_destroy_inode,
 848        .dirty_inode    = jfs_dirty_inode,
 849        .write_inode    = jfs_write_inode,
 850        .evict_inode    = jfs_evict_inode,
 851        .put_super      = jfs_put_super,
 852        .sync_fs        = jfs_sync_fs,
 853        .freeze_fs      = jfs_freeze,
 854        .unfreeze_fs    = jfs_unfreeze,
 855        .statfs         = jfs_statfs,
 856        .remount_fs     = jfs_remount,
 857        .show_options   = jfs_show_options,
 858#ifdef CONFIG_QUOTA
 859        .quota_read     = jfs_quota_read,
 860        .quota_write    = jfs_quota_write,
 861        .get_dquots     = jfs_get_dquots,
 862#endif
 863};
 864
 865static const struct export_operations jfs_export_operations = {
 866        .fh_to_dentry   = jfs_fh_to_dentry,
 867        .fh_to_parent   = jfs_fh_to_parent,
 868        .get_parent     = jfs_get_parent,
 869};
 870
 871static struct file_system_type jfs_fs_type = {
 872        .owner          = THIS_MODULE,
 873        .name           = "jfs",
 874        .mount          = jfs_do_mount,
 875        .kill_sb        = kill_block_super,
 876        .fs_flags       = FS_REQUIRES_DEV,
 877};
 878MODULE_ALIAS_FS("jfs");
 879
 880static void init_once(void *foo)
 881{
 882        struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;
 883
 884        memset(jfs_ip, 0, sizeof(struct jfs_inode_info));
 885        INIT_LIST_HEAD(&jfs_ip->anon_inode_list);
 886        init_rwsem(&jfs_ip->rdwrlock);
 887        mutex_init(&jfs_ip->commit_mutex);
 888        init_rwsem(&jfs_ip->xattr_sem);
 889        spin_lock_init(&jfs_ip->ag_lock);
 890        jfs_ip->active_ag = -1;
 891        inode_init_once(&jfs_ip->vfs_inode);
 892}
 893
 894static int __init init_jfs_fs(void)
 895{
 896        int i;
 897        int rc;
 898
 899        jfs_inode_cachep =
 900            kmem_cache_create("jfs_ip", sizeof(struct jfs_inode_info), 0,
 901                            SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_ACCOUNT,
 902                            init_once);
 903        if (jfs_inode_cachep == NULL)
 904                return -ENOMEM;
 905
 906        /*
 907         * Metapage initialization
 908         */
 909        rc = metapage_init();
 910        if (rc) {
 911                jfs_err("metapage_init failed w/rc = %d", rc);
 912                goto free_slab;
 913        }
 914
 915        /*
 916         * Transaction Manager initialization
 917         */
 918        rc = txInit();
 919        if (rc) {
 920                jfs_err("txInit failed w/rc = %d", rc);
 921                goto free_metapage;
 922        }
 923
 924        /*
 925         * I/O completion thread (endio)
 926         */
 927        jfsIOthread = kthread_run(jfsIOWait, NULL, "jfsIO");
 928        if (IS_ERR(jfsIOthread)) {
 929                rc = PTR_ERR(jfsIOthread);
 930                jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
 931                goto end_txmngr;
 932        }
 933
 934        if (commit_threads < 1)
 935                commit_threads = num_online_cpus();
 936        if (commit_threads > MAX_COMMIT_THREADS)
 937                commit_threads = MAX_COMMIT_THREADS;
 938
 939        for (i = 0; i < commit_threads; i++) {
 940                jfsCommitThread[i] = kthread_run(jfs_lazycommit, NULL,
 941                                                 "jfsCommit");
 942                if (IS_ERR(jfsCommitThread[i])) {
 943                        rc = PTR_ERR(jfsCommitThread[i]);
 944                        jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
 945                        commit_threads = i;
 946                        goto kill_committask;
 947                }
 948        }
 949
 950        jfsSyncThread = kthread_run(jfs_sync, NULL, "jfsSync");
 951        if (IS_ERR(jfsSyncThread)) {
 952                rc = PTR_ERR(jfsSyncThread);
 953                jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
 954                goto kill_committask;
 955        }
 956
 957#ifdef PROC_FS_JFS
 958        jfs_proc_init();
 959#endif
 960
 961        rc = register_filesystem(&jfs_fs_type);
 962        if (!rc)
 963                return 0;
 964
 965#ifdef PROC_FS_JFS
 966        jfs_proc_clean();
 967#endif
 968        kthread_stop(jfsSyncThread);
 969kill_committask:
 970        for (i = 0; i < commit_threads; i++)
 971                kthread_stop(jfsCommitThread[i]);
 972        kthread_stop(jfsIOthread);
 973end_txmngr:
 974        txExit();
 975free_metapage:
 976        metapage_exit();
 977free_slab:
 978        kmem_cache_destroy(jfs_inode_cachep);
 979        return rc;
 980}
 981
 982static void __exit exit_jfs_fs(void)
 983{
 984        int i;
 985
 986        jfs_info("exit_jfs_fs called");
 987
 988        txExit();
 989        metapage_exit();
 990
 991        kthread_stop(jfsIOthread);
 992        for (i = 0; i < commit_threads; i++)
 993                kthread_stop(jfsCommitThread[i]);
 994        kthread_stop(jfsSyncThread);
 995#ifdef PROC_FS_JFS
 996        jfs_proc_clean();
 997#endif
 998        unregister_filesystem(&jfs_fs_type);
 999
1000        /*
1001         * Make sure all delayed rcu free inodes are flushed before we
1002         * destroy cache.
1003         */
1004        rcu_barrier();
1005        kmem_cache_destroy(jfs_inode_cachep);
1006}
1007
1008module_init(init_jfs_fs)
1009module_exit(exit_jfs_fs)
1010