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 <asm/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\n",
  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        if (!new_valid_dev(sb->s_bdev->bd_dev))
 500                return -EOVERFLOW;
 501
 502        sbi = kzalloc(sizeof(struct jfs_sb_info), GFP_KERNEL);
 503        if (!sbi)
 504                return -ENOMEM;
 505
 506        sb->s_fs_info = sbi;
 507        sb->s_max_links = JFS_LINK_MAX;
 508        sbi->sb = sb;
 509        sbi->uid = INVALID_UID;
 510        sbi->gid = INVALID_GID;
 511        sbi->umask = -1;
 512
 513        /* initialize the mount flag and determine the default error handler */
 514        flag = JFS_ERR_REMOUNT_RO;
 515
 516        if (!parse_options((char *) data, sb, &newLVSize, &flag))
 517                goto out_kfree;
 518        sbi->flag = flag;
 519
 520#ifdef CONFIG_JFS_POSIX_ACL
 521        sb->s_flags |= MS_POSIXACL;
 522#endif
 523
 524        if (newLVSize) {
 525                pr_err("resize option for remount only\n");
 526                goto out_kfree;
 527        }
 528
 529        /*
 530         * Initialize blocksize to 4K.
 531         */
 532        sb_set_blocksize(sb, PSIZE);
 533
 534        /*
 535         * Set method vectors.
 536         */
 537        sb->s_op = &jfs_super_operations;
 538        sb->s_export_op = &jfs_export_operations;
 539        sb->s_xattr = jfs_xattr_handlers;
 540#ifdef CONFIG_QUOTA
 541        sb->dq_op = &dquot_operations;
 542        sb->s_qcop = &dquot_quotactl_ops;
 543        sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
 544#endif
 545
 546        /*
 547         * Initialize direct-mapping inode/address-space
 548         */
 549        inode = new_inode(sb);
 550        if (inode == NULL) {
 551                ret = -ENOMEM;
 552                goto out_unload;
 553        }
 554        inode->i_ino = 0;
 555        inode->i_size = sb->s_bdev->bd_inode->i_size;
 556        inode->i_mapping->a_ops = &jfs_metapage_aops;
 557        hlist_add_fake(&inode->i_hash);
 558        mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
 559
 560        sbi->direct_inode = inode;
 561
 562        rc = jfs_mount(sb);
 563        if (rc) {
 564                if (!silent)
 565                        jfs_err("jfs_mount failed w/return code = %d", rc);
 566                goto out_mount_failed;
 567        }
 568        if (sb->s_flags & MS_RDONLY)
 569                sbi->log = NULL;
 570        else {
 571                rc = jfs_mount_rw(sb, 0);
 572                if (rc) {
 573                        if (!silent) {
 574                                jfs_err("jfs_mount_rw failed, return code = %d",
 575                                        rc);
 576                        }
 577                        goto out_no_rw;
 578                }
 579        }
 580
 581        sb->s_magic = JFS_SUPER_MAGIC;
 582
 583        if (sbi->mntflag & JFS_OS2)
 584                sb->s_d_op = &jfs_ci_dentry_operations;
 585
 586        inode = jfs_iget(sb, ROOT_I);
 587        if (IS_ERR(inode)) {
 588                ret = PTR_ERR(inode);
 589                goto out_no_rw;
 590        }
 591        sb->s_root = d_make_root(inode);
 592        if (!sb->s_root)
 593                goto out_no_root;
 594
 595        /* logical blocks are represented by 40 bits in pxd_t, etc. */
 596        sb->s_maxbytes = ((u64) sb->s_blocksize) << 40;
 597#if BITS_PER_LONG == 32
 598        /*
 599         * Page cache is indexed by long.
 600         * I would use MAX_LFS_FILESIZE, but it's only half as big
 601         */
 602        sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1,
 603                             (u64)sb->s_maxbytes);
 604#endif
 605        sb->s_time_gran = 1;
 606        return 0;
 607
 608out_no_root:
 609        jfs_err("jfs_read_super: get root dentry failed");
 610
 611out_no_rw:
 612        rc = jfs_umount(sb);
 613        if (rc)
 614                jfs_err("jfs_umount failed with return code %d", rc);
 615out_mount_failed:
 616        filemap_write_and_wait(sbi->direct_inode->i_mapping);
 617        truncate_inode_pages(sbi->direct_inode->i_mapping, 0);
 618        make_bad_inode(sbi->direct_inode);
 619        iput(sbi->direct_inode);
 620        sbi->direct_inode = NULL;
 621out_unload:
 622        unload_nls(sbi->nls_tab);
 623out_kfree:
 624        kfree(sbi);
 625        return ret;
 626}
 627
 628static int jfs_freeze(struct super_block *sb)
 629{
 630        struct jfs_sb_info *sbi = JFS_SBI(sb);
 631        struct jfs_log *log = sbi->log;
 632        int rc = 0;
 633
 634        if (!(sb->s_flags & MS_RDONLY)) {
 635                txQuiesce(sb);
 636                rc = lmLogShutdown(log);
 637                if (rc) {
 638                        jfs_error(sb, "lmLogShutdown failed\n");
 639
 640                        /* let operations fail rather than hang */
 641                        txResume(sb);
 642
 643                        return rc;
 644                }
 645                rc = updateSuper(sb, FM_CLEAN);
 646                if (rc) {
 647                        jfs_err("jfs_freeze: updateSuper failed\n");
 648                        /*
 649                         * Don't fail here. Everything succeeded except
 650                         * marking the superblock clean, so there's really
 651                         * no harm in leaving it frozen for now.
 652                         */
 653                }
 654        }
 655        return 0;
 656}
 657
 658static int jfs_unfreeze(struct super_block *sb)
 659{
 660        struct jfs_sb_info *sbi = JFS_SBI(sb);
 661        struct jfs_log *log = sbi->log;
 662        int rc = 0;
 663
 664        if (!(sb->s_flags & MS_RDONLY)) {
 665                rc = updateSuper(sb, FM_MOUNT);
 666                if (rc) {
 667                        jfs_error(sb, "updateSuper failed\n");
 668                        goto out;
 669                }
 670                rc = lmLogInit(log);
 671                if (rc)
 672                        jfs_error(sb, "lmLogInit failed\n");
 673out:
 674                txResume(sb);
 675        }
 676        return rc;
 677}
 678
 679static struct dentry *jfs_do_mount(struct file_system_type *fs_type,
 680        int flags, const char *dev_name, void *data)
 681{
 682        return mount_bdev(fs_type, flags, dev_name, data, jfs_fill_super);
 683}
 684
 685static int jfs_sync_fs(struct super_block *sb, int wait)
 686{
 687        struct jfs_log *log = JFS_SBI(sb)->log;
 688
 689        /* log == NULL indicates read-only mount */
 690        if (log) {
 691                /*
 692                 * Write quota structures to quota file, sync_blockdev() will
 693                 * write them to disk later
 694                 */
 695                dquot_writeback_dquots(sb, -1);
 696                jfs_flush_journal(log, wait);
 697                jfs_syncpt(log, 0);
 698        }
 699
 700        return 0;
 701}
 702
 703static int jfs_show_options(struct seq_file *seq, struct dentry *root)
 704{
 705        struct jfs_sb_info *sbi = JFS_SBI(root->d_sb);
 706
 707        if (uid_valid(sbi->uid))
 708                seq_printf(seq, ",uid=%d", from_kuid(&init_user_ns, sbi->uid));
 709        if (gid_valid(sbi->gid))
 710                seq_printf(seq, ",gid=%d", from_kgid(&init_user_ns, sbi->gid));
 711        if (sbi->umask != -1)
 712                seq_printf(seq, ",umask=%03o", sbi->umask);
 713        if (sbi->flag & JFS_NOINTEGRITY)
 714                seq_puts(seq, ",nointegrity");
 715        if (sbi->flag & JFS_DISCARD)
 716                seq_printf(seq, ",discard=%u", sbi->minblks_trim);
 717        if (sbi->nls_tab)
 718                seq_printf(seq, ",iocharset=%s", sbi->nls_tab->charset);
 719        if (sbi->flag & JFS_ERR_CONTINUE)
 720                seq_printf(seq, ",errors=continue");
 721        if (sbi->flag & JFS_ERR_PANIC)
 722                seq_printf(seq, ",errors=panic");
 723
 724#ifdef CONFIG_QUOTA
 725        if (sbi->flag & JFS_USRQUOTA)
 726                seq_puts(seq, ",usrquota");
 727
 728        if (sbi->flag & JFS_GRPQUOTA)
 729                seq_puts(seq, ",grpquota");
 730#endif
 731
 732        return 0;
 733}
 734
 735#ifdef CONFIG_QUOTA
 736
 737/* Read data from quotafile - avoid pagecache and such because we cannot afford
 738 * acquiring the locks... As quota files are never truncated and quota code
 739 * itself serializes the operations (and no one else should touch the files)
 740 * we don't have to be afraid of races */
 741static ssize_t jfs_quota_read(struct super_block *sb, int type, char *data,
 742                              size_t len, loff_t off)
 743{
 744        struct inode *inode = sb_dqopt(sb)->files[type];
 745        sector_t blk = off >> sb->s_blocksize_bits;
 746        int err = 0;
 747        int offset = off & (sb->s_blocksize - 1);
 748        int tocopy;
 749        size_t toread;
 750        struct buffer_head tmp_bh;
 751        struct buffer_head *bh;
 752        loff_t i_size = i_size_read(inode);
 753
 754        if (off > i_size)
 755                return 0;
 756        if (off+len > i_size)
 757                len = i_size-off;
 758        toread = len;
 759        while (toread > 0) {
 760                tocopy = sb->s_blocksize - offset < toread ?
 761                                sb->s_blocksize - offset : toread;
 762
 763                tmp_bh.b_state = 0;
 764                tmp_bh.b_size = 1 << inode->i_blkbits;
 765                err = jfs_get_block(inode, blk, &tmp_bh, 0);
 766                if (err)
 767                        return err;
 768                if (!buffer_mapped(&tmp_bh))    /* A hole? */
 769                        memset(data, 0, tocopy);
 770                else {
 771                        bh = sb_bread(sb, tmp_bh.b_blocknr);
 772                        if (!bh)
 773                                return -EIO;
 774                        memcpy(data, bh->b_data+offset, tocopy);
 775                        brelse(bh);
 776                }
 777                offset = 0;
 778                toread -= tocopy;
 779                data += tocopy;
 780                blk++;
 781        }
 782        return len;
 783}
 784
 785/* Write to quotafile */
 786static ssize_t jfs_quota_write(struct super_block *sb, int type,
 787                               const char *data, size_t len, loff_t off)
 788{
 789        struct inode *inode = sb_dqopt(sb)->files[type];
 790        sector_t blk = off >> sb->s_blocksize_bits;
 791        int err = 0;
 792        int offset = off & (sb->s_blocksize - 1);
 793        int tocopy;
 794        size_t towrite = len;
 795        struct buffer_head tmp_bh;
 796        struct buffer_head *bh;
 797
 798        mutex_lock(&inode->i_mutex);
 799        while (towrite > 0) {
 800                tocopy = sb->s_blocksize - offset < towrite ?
 801                                sb->s_blocksize - offset : towrite;
 802
 803                tmp_bh.b_state = 0;
 804                tmp_bh.b_size = 1 << inode->i_blkbits;
 805                err = jfs_get_block(inode, blk, &tmp_bh, 1);
 806                if (err)
 807                        goto out;
 808                if (offset || tocopy != sb->s_blocksize)
 809                        bh = sb_bread(sb, tmp_bh.b_blocknr);
 810                else
 811                        bh = sb_getblk(sb, tmp_bh.b_blocknr);
 812                if (!bh) {
 813                        err = -EIO;
 814                        goto out;
 815                }
 816                lock_buffer(bh);
 817                memcpy(bh->b_data+offset, data, tocopy);
 818                flush_dcache_page(bh->b_page);
 819                set_buffer_uptodate(bh);
 820                mark_buffer_dirty(bh);
 821                unlock_buffer(bh);
 822                brelse(bh);
 823                offset = 0;
 824                towrite -= tocopy;
 825                data += tocopy;
 826                blk++;
 827        }
 828out:
 829        if (len == towrite) {
 830                mutex_unlock(&inode->i_mutex);
 831                return err;
 832        }
 833        if (inode->i_size < off+len-towrite)
 834                i_size_write(inode, off+len-towrite);
 835        inode->i_version++;
 836        inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 837        mark_inode_dirty(inode);
 838        mutex_unlock(&inode->i_mutex);
 839        return len - towrite;
 840}
 841
 842static struct dquot **jfs_get_dquots(struct inode *inode)
 843{
 844        return JFS_IP(inode)->i_dquot;
 845}
 846#endif
 847
 848static const struct super_operations jfs_super_operations = {
 849        .alloc_inode    = jfs_alloc_inode,
 850        .destroy_inode  = jfs_destroy_inode,
 851        .dirty_inode    = jfs_dirty_inode,
 852        .write_inode    = jfs_write_inode,
 853        .evict_inode    = jfs_evict_inode,
 854        .put_super      = jfs_put_super,
 855        .sync_fs        = jfs_sync_fs,
 856        .freeze_fs      = jfs_freeze,
 857        .unfreeze_fs    = jfs_unfreeze,
 858        .statfs         = jfs_statfs,
 859        .remount_fs     = jfs_remount,
 860        .show_options   = jfs_show_options,
 861#ifdef CONFIG_QUOTA
 862        .quota_read     = jfs_quota_read,
 863        .quota_write    = jfs_quota_write,
 864        .get_dquots     = jfs_get_dquots,
 865#endif
 866};
 867
 868static const struct export_operations jfs_export_operations = {
 869        .fh_to_dentry   = jfs_fh_to_dentry,
 870        .fh_to_parent   = jfs_fh_to_parent,
 871        .get_parent     = jfs_get_parent,
 872};
 873
 874static struct file_system_type jfs_fs_type = {
 875        .owner          = THIS_MODULE,
 876        .name           = "jfs",
 877        .mount          = jfs_do_mount,
 878        .kill_sb        = kill_block_super,
 879        .fs_flags       = FS_REQUIRES_DEV,
 880};
 881MODULE_ALIAS_FS("jfs");
 882
 883static void init_once(void *foo)
 884{
 885        struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;
 886
 887        memset(jfs_ip, 0, sizeof(struct jfs_inode_info));
 888        INIT_LIST_HEAD(&jfs_ip->anon_inode_list);
 889        init_rwsem(&jfs_ip->rdwrlock);
 890        mutex_init(&jfs_ip->commit_mutex);
 891        init_rwsem(&jfs_ip->xattr_sem);
 892        spin_lock_init(&jfs_ip->ag_lock);
 893        jfs_ip->active_ag = -1;
 894        inode_init_once(&jfs_ip->vfs_inode);
 895}
 896
 897static int __init init_jfs_fs(void)
 898{
 899        int i;
 900        int rc;
 901
 902        jfs_inode_cachep =
 903            kmem_cache_create("jfs_ip", sizeof(struct jfs_inode_info), 0,
 904                            SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
 905                            init_once);
 906        if (jfs_inode_cachep == NULL)
 907                return -ENOMEM;
 908
 909        /*
 910         * Metapage initialization
 911         */
 912        rc = metapage_init();
 913        if (rc) {
 914                jfs_err("metapage_init failed w/rc = %d", rc);
 915                goto free_slab;
 916        }
 917
 918        /*
 919         * Transaction Manager initialization
 920         */
 921        rc = txInit();
 922        if (rc) {
 923                jfs_err("txInit failed w/rc = %d", rc);
 924                goto free_metapage;
 925        }
 926
 927        /*
 928         * I/O completion thread (endio)
 929         */
 930        jfsIOthread = kthread_run(jfsIOWait, NULL, "jfsIO");
 931        if (IS_ERR(jfsIOthread)) {
 932                rc = PTR_ERR(jfsIOthread);
 933                jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
 934                goto end_txmngr;
 935        }
 936
 937        if (commit_threads < 1)
 938                commit_threads = num_online_cpus();
 939        if (commit_threads > MAX_COMMIT_THREADS)
 940                commit_threads = MAX_COMMIT_THREADS;
 941
 942        for (i = 0; i < commit_threads; i++) {
 943                jfsCommitThread[i] = kthread_run(jfs_lazycommit, NULL,
 944                                                 "jfsCommit");
 945                if (IS_ERR(jfsCommitThread[i])) {
 946                        rc = PTR_ERR(jfsCommitThread[i]);
 947                        jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
 948                        commit_threads = i;
 949                        goto kill_committask;
 950                }
 951        }
 952
 953        jfsSyncThread = kthread_run(jfs_sync, NULL, "jfsSync");
 954        if (IS_ERR(jfsSyncThread)) {
 955                rc = PTR_ERR(jfsSyncThread);
 956                jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
 957                goto kill_committask;
 958        }
 959
 960#ifdef PROC_FS_JFS
 961        jfs_proc_init();
 962#endif
 963
 964        rc = register_filesystem(&jfs_fs_type);
 965        if (!rc)
 966                return 0;
 967
 968#ifdef PROC_FS_JFS
 969        jfs_proc_clean();
 970#endif
 971        kthread_stop(jfsSyncThread);
 972kill_committask:
 973        for (i = 0; i < commit_threads; i++)
 974                kthread_stop(jfsCommitThread[i]);
 975        kthread_stop(jfsIOthread);
 976end_txmngr:
 977        txExit();
 978free_metapage:
 979        metapage_exit();
 980free_slab:
 981        kmem_cache_destroy(jfs_inode_cachep);
 982        return rc;
 983}
 984
 985static void __exit exit_jfs_fs(void)
 986{
 987        int i;
 988
 989        jfs_info("exit_jfs_fs called");
 990
 991        txExit();
 992        metapage_exit();
 993
 994        kthread_stop(jfsIOthread);
 995        for (i = 0; i < commit_threads; i++)
 996                kthread_stop(jfsCommitThread[i]);
 997        kthread_stop(jfsSyncThread);
 998#ifdef PROC_FS_JFS
 999        jfs_proc_clean();
1000#endif
1001        unregister_filesystem(&jfs_fs_type);
1002
1003        /*
1004         * Make sure all delayed rcu free inodes are flushed before we
1005         * destroy cache.
1006         */
1007        rcu_barrier();
1008        kmem_cache_destroy(jfs_inode_cachep);
1009}
1010
1011module_init(init_jfs_fs)
1012module_exit(exit_jfs_fs)
1013