linux/fs/reiserfs/super.c
<<
>>
Prefs
   1/*
   2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
   3 *
   4 * Trivial changes by Alan Cox to add the LFS fixes
   5 *
   6 * Trivial Changes:
   7 * Rights granted to Hans Reiser to redistribute under other terms providing
   8 * he accepts all liability including but not limited to patent, fitness
   9 * for purpose, and direct or indirect claims arising from failure to perform.
  10 *
  11 * NO WARRANTY
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/slab.h>
  16#include <linux/vmalloc.h>
  17#include <linux/time.h>
  18#include <asm/uaccess.h>
  19#include <linux/reiserfs_fs.h>
  20#include <linux/reiserfs_acl.h>
  21#include <linux/reiserfs_xattr.h>
  22#include <linux/init.h>
  23#include <linux/blkdev.h>
  24#include <linux/buffer_head.h>
  25#include <linux/exportfs.h>
  26#include <linux/quotaops.h>
  27#include <linux/vfs.h>
  28#include <linux/mount.h>
  29#include <linux/namei.h>
  30#include <linux/crc32.h>
  31#include <linux/seq_file.h>
  32
  33struct file_system_type reiserfs_fs_type;
  34
  35static const char reiserfs_3_5_magic_string[] = REISERFS_SUPER_MAGIC_STRING;
  36static const char reiserfs_3_6_magic_string[] = REISER2FS_SUPER_MAGIC_STRING;
  37static const char reiserfs_jr_magic_string[] = REISER2FS_JR_SUPER_MAGIC_STRING;
  38
  39int is_reiserfs_3_5(struct reiserfs_super_block *rs)
  40{
  41        return !strncmp(rs->s_v1.s_magic, reiserfs_3_5_magic_string,
  42                        strlen(reiserfs_3_5_magic_string));
  43}
  44
  45int is_reiserfs_3_6(struct reiserfs_super_block *rs)
  46{
  47        return !strncmp(rs->s_v1.s_magic, reiserfs_3_6_magic_string,
  48                        strlen(reiserfs_3_6_magic_string));
  49}
  50
  51int is_reiserfs_jr(struct reiserfs_super_block *rs)
  52{
  53        return !strncmp(rs->s_v1.s_magic, reiserfs_jr_magic_string,
  54                        strlen(reiserfs_jr_magic_string));
  55}
  56
  57static int is_any_reiserfs_magic_string(struct reiserfs_super_block *rs)
  58{
  59        return (is_reiserfs_3_5(rs) || is_reiserfs_3_6(rs) ||
  60                is_reiserfs_jr(rs));
  61}
  62
  63static int reiserfs_remount(struct super_block *s, int *flags, char *data);
  64static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf);
  65void show_alloc_options(struct seq_file *seq, struct super_block *s);
  66
  67static int reiserfs_sync_fs(struct super_block *s, int wait)
  68{
  69        struct reiserfs_transaction_handle th;
  70
  71        reiserfs_write_lock(s);
  72        if (!journal_begin(&th, s, 1))
  73                if (!journal_end_sync(&th, s, 1))
  74                        reiserfs_flush_old_commits(s);
  75        s->s_dirt = 0;  /* Even if it's not true.
  76                         * We'll loop forever in sync_supers otherwise */
  77        reiserfs_write_unlock(s);
  78        return 0;
  79}
  80
  81static void reiserfs_write_super(struct super_block *s)
  82{
  83        reiserfs_sync_fs(s, 1);
  84}
  85
  86static int reiserfs_freeze(struct super_block *s)
  87{
  88        struct reiserfs_transaction_handle th;
  89        reiserfs_write_lock(s);
  90        if (!(s->s_flags & MS_RDONLY)) {
  91                int err = journal_begin(&th, s, 1);
  92                if (err) {
  93                        reiserfs_block_writes(&th);
  94                } else {
  95                        reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s),
  96                                                     1);
  97                        journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB(s));
  98                        reiserfs_block_writes(&th);
  99                        journal_end_sync(&th, s, 1);
 100                }
 101        }
 102        s->s_dirt = 0;
 103        reiserfs_write_unlock(s);
 104        return 0;
 105}
 106
 107static int reiserfs_unfreeze(struct super_block *s)
 108{
 109        reiserfs_allow_writes(s);
 110        return 0;
 111}
 112
 113extern const struct in_core_key MAX_IN_CORE_KEY;
 114
 115/* this is used to delete "save link" when there are no items of a
 116   file it points to. It can either happen if unlink is completed but
 117   "save unlink" removal, or if file has both unlink and truncate
 118   pending and as unlink completes first (because key of "save link"
 119   protecting unlink is bigger that a key lf "save link" which
 120   protects truncate), so there left no items to make truncate
 121   completion on */
 122static int remove_save_link_only(struct super_block *s,
 123                                 struct reiserfs_key *key, int oid_free)
 124{
 125        struct reiserfs_transaction_handle th;
 126        int err;
 127
 128        /* we are going to do one balancing */
 129        err = journal_begin(&th, s, JOURNAL_PER_BALANCE_CNT);
 130        if (err)
 131                return err;
 132
 133        reiserfs_delete_solid_item(&th, NULL, key);
 134        if (oid_free)
 135                /* removals are protected by direct items */
 136                reiserfs_release_objectid(&th, le32_to_cpu(key->k_objectid));
 137
 138        return journal_end(&th, s, JOURNAL_PER_BALANCE_CNT);
 139}
 140
 141#ifdef CONFIG_QUOTA
 142static int reiserfs_quota_on_mount(struct super_block *, int);
 143#endif
 144
 145/* look for uncompleted unlinks and truncates and complete them */
 146static int finish_unfinished(struct super_block *s)
 147{
 148        INITIALIZE_PATH(path);
 149        struct cpu_key max_cpu_key, obj_key;
 150        struct reiserfs_key save_link_key, last_inode_key;
 151        int retval = 0;
 152        struct item_head *ih;
 153        struct buffer_head *bh;
 154        int item_pos;
 155        char *item;
 156        int done;
 157        struct inode *inode;
 158        int truncate;
 159#ifdef CONFIG_QUOTA
 160        int i;
 161        int ms_active_set;
 162        int quota_enabled[MAXQUOTAS];
 163#endif
 164
 165        /* compose key to look for "save" links */
 166        max_cpu_key.version = KEY_FORMAT_3_5;
 167        max_cpu_key.on_disk_key.k_dir_id = ~0U;
 168        max_cpu_key.on_disk_key.k_objectid = ~0U;
 169        set_cpu_key_k_offset(&max_cpu_key, ~0U);
 170        max_cpu_key.key_length = 3;
 171
 172        memset(&last_inode_key, 0, sizeof(last_inode_key));
 173
 174#ifdef CONFIG_QUOTA
 175        /* Needed for iput() to work correctly and not trash data */
 176        if (s->s_flags & MS_ACTIVE) {
 177                ms_active_set = 0;
 178        } else {
 179                ms_active_set = 1;
 180                s->s_flags |= MS_ACTIVE;
 181        }
 182        /* Turn on quotas so that they are updated correctly */
 183        for (i = 0; i < MAXQUOTAS; i++) {
 184                quota_enabled[i] = 1;
 185                if (REISERFS_SB(s)->s_qf_names[i]) {
 186                        int ret;
 187
 188                        if (sb_has_quota_active(s, i)) {
 189                                quota_enabled[i] = 0;
 190                                continue;
 191                        }
 192                        ret = reiserfs_quota_on_mount(s, i);
 193                        if (ret < 0)
 194                                reiserfs_warning(s, "reiserfs-2500",
 195                                                 "cannot turn on journaled "
 196                                                 "quota: error %d", ret);
 197                }
 198        }
 199#endif
 200
 201        done = 0;
 202        REISERFS_SB(s)->s_is_unlinked_ok = 1;
 203        while (!retval) {
 204                retval = search_item(s, &max_cpu_key, &path);
 205                if (retval != ITEM_NOT_FOUND) {
 206                        reiserfs_error(s, "vs-2140",
 207                                       "search_by_key returned %d", retval);
 208                        break;
 209                }
 210
 211                bh = get_last_bh(&path);
 212                item_pos = get_item_pos(&path);
 213                if (item_pos != B_NR_ITEMS(bh)) {
 214                        reiserfs_warning(s, "vs-2060",
 215                                         "wrong position found");
 216                        break;
 217                }
 218                item_pos--;
 219                ih = B_N_PITEM_HEAD(bh, item_pos);
 220
 221                if (le32_to_cpu(ih->ih_key.k_dir_id) != MAX_KEY_OBJECTID)
 222                        /* there are no "save" links anymore */
 223                        break;
 224
 225                save_link_key = ih->ih_key;
 226                if (is_indirect_le_ih(ih))
 227                        truncate = 1;
 228                else
 229                        truncate = 0;
 230
 231                /* reiserfs_iget needs k_dirid and k_objectid only */
 232                item = B_I_PITEM(bh, ih);
 233                obj_key.on_disk_key.k_dir_id = le32_to_cpu(*(__le32 *) item);
 234                obj_key.on_disk_key.k_objectid =
 235                    le32_to_cpu(ih->ih_key.k_objectid);
 236                obj_key.on_disk_key.k_offset = 0;
 237                obj_key.on_disk_key.k_type = 0;
 238
 239                pathrelse(&path);
 240
 241                inode = reiserfs_iget(s, &obj_key);
 242                if (!inode) {
 243                        /* the unlink almost completed, it just did not manage to remove
 244                           "save" link and release objectid */
 245                        reiserfs_warning(s, "vs-2180", "iget failed for %K",
 246                                         &obj_key);
 247                        retval = remove_save_link_only(s, &save_link_key, 1);
 248                        continue;
 249                }
 250
 251                if (!truncate && inode->i_nlink) {
 252                        /* file is not unlinked */
 253                        reiserfs_warning(s, "vs-2185",
 254                                         "file %K is not unlinked",
 255                                         &obj_key);
 256                        retval = remove_save_link_only(s, &save_link_key, 0);
 257                        continue;
 258                }
 259                dquot_initialize(inode);
 260
 261                if (truncate && S_ISDIR(inode->i_mode)) {
 262                        /* We got a truncate request for a dir which is impossible.
 263                           The only imaginable way is to execute unfinished truncate request
 264                           then boot into old kernel, remove the file and create dir with
 265                           the same key. */
 266                        reiserfs_warning(s, "green-2101",
 267                                         "impossible truncate on a "
 268                                         "directory %k. Please report",
 269                                         INODE_PKEY(inode));
 270                        retval = remove_save_link_only(s, &save_link_key, 0);
 271                        truncate = 0;
 272                        iput(inode);
 273                        continue;
 274                }
 275
 276                if (truncate) {
 277                        REISERFS_I(inode)->i_flags |=
 278                            i_link_saved_truncate_mask;
 279                        /* not completed truncate found. New size was committed together
 280                           with "save" link */
 281                        reiserfs_info(s, "Truncating %k to %Ld ..",
 282                                      INODE_PKEY(inode), inode->i_size);
 283                        reiserfs_truncate_file(inode,
 284                                               0
 285                                               /*don't update modification time */
 286                                               );
 287                        retval = remove_save_link(inode, truncate);
 288                } else {
 289                        REISERFS_I(inode)->i_flags |= i_link_saved_unlink_mask;
 290                        /* not completed unlink (rmdir) found */
 291                        reiserfs_info(s, "Removing %k..", INODE_PKEY(inode));
 292                        if (memcmp(&last_inode_key, INODE_PKEY(inode),
 293                                        sizeof(last_inode_key))){
 294                                last_inode_key = *INODE_PKEY(inode);
 295                                /* removal gets completed in iput */
 296                                retval = 0;
 297                        } else {
 298                                reiserfs_warning(s, "super-2189", "Dead loop "
 299                                                 "in finish_unfinished "
 300                                                 "detected, just remove "
 301                                                 "save link\n");
 302                                retval = remove_save_link_only(s,
 303                                                        &save_link_key, 0);
 304                        }
 305                }
 306
 307                iput(inode);
 308                printk("done\n");
 309                done++;
 310        }
 311        REISERFS_SB(s)->s_is_unlinked_ok = 0;
 312
 313#ifdef CONFIG_QUOTA
 314        /* Turn quotas off */
 315        for (i = 0; i < MAXQUOTAS; i++) {
 316                if (sb_dqopt(s)->files[i] && quota_enabled[i])
 317                        dquot_quota_off(s, i);
 318        }
 319        if (ms_active_set)
 320                /* Restore the flag back */
 321                s->s_flags &= ~MS_ACTIVE;
 322#endif
 323        pathrelse(&path);
 324        if (done)
 325                reiserfs_info(s, "There were %d uncompleted unlinks/truncates. "
 326                              "Completed\n", done);
 327        return retval;
 328}
 329
 330/* to protect file being unlinked from getting lost we "safe" link files
 331   being unlinked. This link will be deleted in the same transaction with last
 332   item of file. mounting the filesystem we scan all these links and remove
 333   files which almost got lost */
 334void add_save_link(struct reiserfs_transaction_handle *th,
 335                   struct inode *inode, int truncate)
 336{
 337        INITIALIZE_PATH(path);
 338        int retval;
 339        struct cpu_key key;
 340        struct item_head ih;
 341        __le32 link;
 342
 343        BUG_ON(!th->t_trans_id);
 344
 345        /* file can only get one "save link" of each kind */
 346        RFALSE(truncate &&
 347               (REISERFS_I(inode)->i_flags & i_link_saved_truncate_mask),
 348               "saved link already exists for truncated inode %lx",
 349               (long)inode->i_ino);
 350        RFALSE(!truncate &&
 351               (REISERFS_I(inode)->i_flags & i_link_saved_unlink_mask),
 352               "saved link already exists for unlinked inode %lx",
 353               (long)inode->i_ino);
 354
 355        /* setup key of "save" link */
 356        key.version = KEY_FORMAT_3_5;
 357        key.on_disk_key.k_dir_id = MAX_KEY_OBJECTID;
 358        key.on_disk_key.k_objectid = inode->i_ino;
 359        if (!truncate) {
 360                /* unlink, rmdir, rename */
 361                set_cpu_key_k_offset(&key, 1 + inode->i_sb->s_blocksize);
 362                set_cpu_key_k_type(&key, TYPE_DIRECT);
 363
 364                /* item head of "safe" link */
 365                make_le_item_head(&ih, &key, key.version,
 366                                  1 + inode->i_sb->s_blocksize, TYPE_DIRECT,
 367                                  4 /*length */ , 0xffff /*free space */ );
 368        } else {
 369                /* truncate */
 370                if (S_ISDIR(inode->i_mode))
 371                        reiserfs_warning(inode->i_sb, "green-2102",
 372                                         "Adding a truncate savelink for "
 373                                         "a directory %k! Please report",
 374                                         INODE_PKEY(inode));
 375                set_cpu_key_k_offset(&key, 1);
 376                set_cpu_key_k_type(&key, TYPE_INDIRECT);
 377
 378                /* item head of "safe" link */
 379                make_le_item_head(&ih, &key, key.version, 1, TYPE_INDIRECT,
 380                                  4 /*length */ , 0 /*free space */ );
 381        }
 382        key.key_length = 3;
 383
 384        /* look for its place in the tree */
 385        retval = search_item(inode->i_sb, &key, &path);
 386        if (retval != ITEM_NOT_FOUND) {
 387                if (retval != -ENOSPC)
 388                        reiserfs_error(inode->i_sb, "vs-2100",
 389                                       "search_by_key (%K) returned %d", &key,
 390                                       retval);
 391                pathrelse(&path);
 392                return;
 393        }
 394
 395        /* body of "save" link */
 396        link = INODE_PKEY(inode)->k_dir_id;
 397
 398        /* put "save" link into tree, don't charge quota to anyone */
 399        retval =
 400            reiserfs_insert_item(th, &path, &key, &ih, NULL, (char *)&link);
 401        if (retval) {
 402                if (retval != -ENOSPC)
 403                        reiserfs_error(inode->i_sb, "vs-2120",
 404                                       "insert_item returned %d", retval);
 405        } else {
 406                if (truncate)
 407                        REISERFS_I(inode)->i_flags |=
 408                            i_link_saved_truncate_mask;
 409                else
 410                        REISERFS_I(inode)->i_flags |= i_link_saved_unlink_mask;
 411        }
 412}
 413
 414/* this opens transaction unlike add_save_link */
 415int remove_save_link(struct inode *inode, int truncate)
 416{
 417        struct reiserfs_transaction_handle th;
 418        struct reiserfs_key key;
 419        int err;
 420
 421        /* we are going to do one balancing only */
 422        err = journal_begin(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT);
 423        if (err)
 424                return err;
 425
 426        /* setup key of "save" link */
 427        key.k_dir_id = cpu_to_le32(MAX_KEY_OBJECTID);
 428        key.k_objectid = INODE_PKEY(inode)->k_objectid;
 429        if (!truncate) {
 430                /* unlink, rmdir, rename */
 431                set_le_key_k_offset(KEY_FORMAT_3_5, &key,
 432                                    1 + inode->i_sb->s_blocksize);
 433                set_le_key_k_type(KEY_FORMAT_3_5, &key, TYPE_DIRECT);
 434        } else {
 435                /* truncate */
 436                set_le_key_k_offset(KEY_FORMAT_3_5, &key, 1);
 437                set_le_key_k_type(KEY_FORMAT_3_5, &key, TYPE_INDIRECT);
 438        }
 439
 440        if ((truncate &&
 441             (REISERFS_I(inode)->i_flags & i_link_saved_truncate_mask)) ||
 442            (!truncate &&
 443             (REISERFS_I(inode)->i_flags & i_link_saved_unlink_mask)))
 444                /* don't take quota bytes from anywhere */
 445                reiserfs_delete_solid_item(&th, NULL, &key);
 446        if (!truncate) {
 447                reiserfs_release_objectid(&th, inode->i_ino);
 448                REISERFS_I(inode)->i_flags &= ~i_link_saved_unlink_mask;
 449        } else
 450                REISERFS_I(inode)->i_flags &= ~i_link_saved_truncate_mask;
 451
 452        return journal_end(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT);
 453}
 454
 455static void reiserfs_kill_sb(struct super_block *s)
 456{
 457        if (REISERFS_SB(s)) {
 458                /*
 459                 * Force any pending inode evictions to occur now. Any
 460                 * inodes to be removed that have extended attributes
 461                 * associated with them need to clean them up before
 462                 * we can release the extended attribute root dentries.
 463                 * shrink_dcache_for_umount will BUG if we don't release
 464                 * those before it's called so ->put_super is too late.
 465                 */
 466                shrink_dcache_sb(s);
 467
 468                dput(REISERFS_SB(s)->xattr_root);
 469                REISERFS_SB(s)->xattr_root = NULL;
 470                dput(REISERFS_SB(s)->priv_root);
 471                REISERFS_SB(s)->priv_root = NULL;
 472        }
 473
 474        kill_block_super(s);
 475}
 476
 477static void reiserfs_put_super(struct super_block *s)
 478{
 479        struct reiserfs_transaction_handle th;
 480        th.t_trans_id = 0;
 481
 482        dquot_disable(s, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
 483
 484        reiserfs_write_lock(s);
 485
 486        if (s->s_dirt)
 487                reiserfs_write_super(s);
 488
 489        /* change file system state to current state if it was mounted with read-write permissions */
 490        if (!(s->s_flags & MS_RDONLY)) {
 491                if (!journal_begin(&th, s, 10)) {
 492                        reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s),
 493                                                     1);
 494                        set_sb_umount_state(SB_DISK_SUPER_BLOCK(s),
 495                                            REISERFS_SB(s)->s_mount_state);
 496                        journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB(s));
 497                }
 498        }
 499
 500        /* note, journal_release checks for readonly mount, and can decide not
 501         ** to do a journal_end
 502         */
 503        journal_release(&th, s);
 504
 505        reiserfs_free_bitmap_cache(s);
 506
 507        brelse(SB_BUFFER_WITH_SB(s));
 508
 509        print_statistics(s);
 510
 511        if (REISERFS_SB(s)->reserved_blocks != 0) {
 512                reiserfs_warning(s, "green-2005", "reserved blocks left %d",
 513                                 REISERFS_SB(s)->reserved_blocks);
 514        }
 515
 516        reiserfs_proc_info_done(s);
 517
 518        reiserfs_write_unlock(s);
 519        mutex_destroy(&REISERFS_SB(s)->lock);
 520        kfree(s->s_fs_info);
 521        s->s_fs_info = NULL;
 522}
 523
 524static struct kmem_cache *reiserfs_inode_cachep;
 525
 526static struct inode *reiserfs_alloc_inode(struct super_block *sb)
 527{
 528        struct reiserfs_inode_info *ei;
 529        ei = (struct reiserfs_inode_info *)
 530            kmem_cache_alloc(reiserfs_inode_cachep, GFP_KERNEL);
 531        if (!ei)
 532                return NULL;
 533        atomic_set(&ei->openers, 0);
 534        mutex_init(&ei->tailpack);
 535        return &ei->vfs_inode;
 536}
 537
 538static void reiserfs_i_callback(struct rcu_head *head)
 539{
 540        struct inode *inode = container_of(head, struct inode, i_rcu);
 541        kmem_cache_free(reiserfs_inode_cachep, REISERFS_I(inode));
 542}
 543
 544static void reiserfs_destroy_inode(struct inode *inode)
 545{
 546        call_rcu(&inode->i_rcu, reiserfs_i_callback);
 547}
 548
 549static void init_once(void *foo)
 550{
 551        struct reiserfs_inode_info *ei = (struct reiserfs_inode_info *)foo;
 552
 553        INIT_LIST_HEAD(&ei->i_prealloc_list);
 554        inode_init_once(&ei->vfs_inode);
 555}
 556
 557static int init_inodecache(void)
 558{
 559        reiserfs_inode_cachep = kmem_cache_create("reiser_inode_cache",
 560                                                  sizeof(struct
 561                                                         reiserfs_inode_info),
 562                                                  0, (SLAB_RECLAIM_ACCOUNT|
 563                                                        SLAB_MEM_SPREAD),
 564                                                  init_once);
 565        if (reiserfs_inode_cachep == NULL)
 566                return -ENOMEM;
 567        return 0;
 568}
 569
 570static void destroy_inodecache(void)
 571{
 572        kmem_cache_destroy(reiserfs_inode_cachep);
 573}
 574
 575/* we don't mark inodes dirty, we just log them */
 576static void reiserfs_dirty_inode(struct inode *inode, int flags)
 577{
 578        struct reiserfs_transaction_handle th;
 579
 580        int err = 0;
 581        int lock_depth;
 582
 583        if (inode->i_sb->s_flags & MS_RDONLY) {
 584                reiserfs_warning(inode->i_sb, "clm-6006",
 585                                 "writing inode %lu on readonly FS",
 586                                 inode->i_ino);
 587                return;
 588        }
 589        lock_depth = reiserfs_write_lock_once(inode->i_sb);
 590
 591        /* this is really only used for atime updates, so they don't have
 592         ** to be included in O_SYNC or fsync
 593         */
 594        err = journal_begin(&th, inode->i_sb, 1);
 595        if (err)
 596                goto out;
 597
 598        reiserfs_update_sd(&th, inode);
 599        journal_end(&th, inode->i_sb, 1);
 600
 601out:
 602        reiserfs_write_unlock_once(inode->i_sb, lock_depth);
 603}
 604
 605static int reiserfs_show_options(struct seq_file *seq, struct dentry *root)
 606{
 607        struct super_block *s = root->d_sb;
 608        struct reiserfs_journal *journal = SB_JOURNAL(s);
 609        long opts = REISERFS_SB(s)->s_mount_opt;
 610
 611        if (opts & (1 << REISERFS_LARGETAIL))
 612                seq_puts(seq, ",tails=on");
 613        else if (!(opts & (1 << REISERFS_SMALLTAIL)))
 614                seq_puts(seq, ",notail");
 615        /* tails=small is default so we don't show it */
 616
 617        if (!(opts & (1 << REISERFS_BARRIER_FLUSH)))
 618                seq_puts(seq, ",barrier=none");
 619        /* barrier=flush is default so we don't show it */
 620
 621        if (opts & (1 << REISERFS_ERROR_CONTINUE))
 622                seq_puts(seq, ",errors=continue");
 623        else if (opts & (1 << REISERFS_ERROR_PANIC))
 624                seq_puts(seq, ",errors=panic");
 625        /* errors=ro is default so we don't show it */
 626
 627        if (opts & (1 << REISERFS_DATA_LOG))
 628                seq_puts(seq, ",data=journal");
 629        else if (opts & (1 << REISERFS_DATA_WRITEBACK))
 630                seq_puts(seq, ",data=writeback");
 631        /* data=ordered is default so we don't show it */
 632
 633        if (opts & (1 << REISERFS_ATTRS))
 634                seq_puts(seq, ",attrs");
 635
 636        if (opts & (1 << REISERFS_XATTRS_USER))
 637                seq_puts(seq, ",user_xattr");
 638
 639        if (opts & (1 << REISERFS_EXPOSE_PRIVROOT))
 640                seq_puts(seq, ",expose_privroot");
 641
 642        if (opts & (1 << REISERFS_POSIXACL))
 643                seq_puts(seq, ",acl");
 644
 645        if (REISERFS_SB(s)->s_jdev)
 646                seq_printf(seq, ",jdev=%s", REISERFS_SB(s)->s_jdev);
 647
 648        if (journal->j_max_commit_age != journal->j_default_max_commit_age)
 649                seq_printf(seq, ",commit=%d", journal->j_max_commit_age);
 650
 651#ifdef CONFIG_QUOTA
 652        if (REISERFS_SB(s)->s_qf_names[USRQUOTA])
 653                seq_printf(seq, ",usrjquota=%s", REISERFS_SB(s)->s_qf_names[USRQUOTA]);
 654        else if (opts & (1 << REISERFS_USRQUOTA))
 655                seq_puts(seq, ",usrquota");
 656        if (REISERFS_SB(s)->s_qf_names[GRPQUOTA])
 657                seq_printf(seq, ",grpjquota=%s", REISERFS_SB(s)->s_qf_names[GRPQUOTA]);
 658        else if (opts & (1 << REISERFS_GRPQUOTA))
 659                seq_puts(seq, ",grpquota");
 660        if (REISERFS_SB(s)->s_jquota_fmt) {
 661                if (REISERFS_SB(s)->s_jquota_fmt == QFMT_VFS_OLD)
 662                        seq_puts(seq, ",jqfmt=vfsold");
 663                else if (REISERFS_SB(s)->s_jquota_fmt == QFMT_VFS_V0)
 664                        seq_puts(seq, ",jqfmt=vfsv0");
 665        }
 666#endif
 667
 668        /* Block allocator options */
 669        if (opts & (1 << REISERFS_NO_BORDER))
 670                seq_puts(seq, ",block-allocator=noborder");
 671        if (opts & (1 << REISERFS_NO_UNHASHED_RELOCATION))
 672                seq_puts(seq, ",block-allocator=no_unhashed_relocation");
 673        if (opts & (1 << REISERFS_HASHED_RELOCATION))
 674                seq_puts(seq, ",block-allocator=hashed_relocation");
 675        if (opts & (1 << REISERFS_TEST4))
 676                seq_puts(seq, ",block-allocator=test4");
 677        show_alloc_options(seq, s);
 678        return 0;
 679}
 680
 681#ifdef CONFIG_QUOTA
 682static ssize_t reiserfs_quota_write(struct super_block *, int, const char *,
 683                                    size_t, loff_t);
 684static ssize_t reiserfs_quota_read(struct super_block *, int, char *, size_t,
 685                                   loff_t);
 686#endif
 687
 688static const struct super_operations reiserfs_sops = {
 689        .alloc_inode = reiserfs_alloc_inode,
 690        .destroy_inode = reiserfs_destroy_inode,
 691        .write_inode = reiserfs_write_inode,
 692        .dirty_inode = reiserfs_dirty_inode,
 693        .evict_inode = reiserfs_evict_inode,
 694        .put_super = reiserfs_put_super,
 695        .write_super = reiserfs_write_super,
 696        .sync_fs = reiserfs_sync_fs,
 697        .freeze_fs = reiserfs_freeze,
 698        .unfreeze_fs = reiserfs_unfreeze,
 699        .statfs = reiserfs_statfs,
 700        .remount_fs = reiserfs_remount,
 701        .show_options = reiserfs_show_options,
 702#ifdef CONFIG_QUOTA
 703        .quota_read = reiserfs_quota_read,
 704        .quota_write = reiserfs_quota_write,
 705#endif
 706};
 707
 708#ifdef CONFIG_QUOTA
 709#define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group")
 710
 711static int reiserfs_write_dquot(struct dquot *);
 712static int reiserfs_acquire_dquot(struct dquot *);
 713static int reiserfs_release_dquot(struct dquot *);
 714static int reiserfs_mark_dquot_dirty(struct dquot *);
 715static int reiserfs_write_info(struct super_block *, int);
 716static int reiserfs_quota_on(struct super_block *, int, int, struct path *);
 717
 718static const struct dquot_operations reiserfs_quota_operations = {
 719        .write_dquot = reiserfs_write_dquot,
 720        .acquire_dquot = reiserfs_acquire_dquot,
 721        .release_dquot = reiserfs_release_dquot,
 722        .mark_dirty = reiserfs_mark_dquot_dirty,
 723        .write_info = reiserfs_write_info,
 724        .alloc_dquot    = dquot_alloc,
 725        .destroy_dquot  = dquot_destroy,
 726};
 727
 728static const struct quotactl_ops reiserfs_qctl_operations = {
 729        .quota_on = reiserfs_quota_on,
 730        .quota_off = dquot_quota_off,
 731        .quota_sync = dquot_quota_sync,
 732        .get_info = dquot_get_dqinfo,
 733        .set_info = dquot_set_dqinfo,
 734        .get_dqblk = dquot_get_dqblk,
 735        .set_dqblk = dquot_set_dqblk,
 736};
 737#endif
 738
 739static const struct export_operations reiserfs_export_ops = {
 740        .encode_fh = reiserfs_encode_fh,
 741        .fh_to_dentry = reiserfs_fh_to_dentry,
 742        .fh_to_parent = reiserfs_fh_to_parent,
 743        .get_parent = reiserfs_get_parent,
 744};
 745
 746/* this struct is used in reiserfs_getopt () for containing the value for those
 747   mount options that have values rather than being toggles. */
 748typedef struct {
 749        char *value;
 750        int setmask;            /* bitmask which is to set on mount_options bitmask when this
 751                                   value is found, 0 is no bits are to be changed. */
 752        int clrmask;            /* bitmask which is to clear on mount_options bitmask when  this
 753                                   value is found, 0 is no bits are to be changed. This is
 754                                   applied BEFORE setmask */
 755} arg_desc_t;
 756
 757/* Set this bit in arg_required to allow empty arguments */
 758#define REISERFS_OPT_ALLOWEMPTY 31
 759
 760/* this struct is used in reiserfs_getopt() for describing the set of reiserfs
 761   mount options */
 762typedef struct {
 763        char *option_name;
 764        int arg_required;       /* 0 if argument is not required, not 0 otherwise */
 765        const arg_desc_t *values;       /* list of values accepted by an option */
 766        int setmask;            /* bitmask which is to set on mount_options bitmask when this
 767                                   value is found, 0 is no bits are to be changed. */
 768        int clrmask;            /* bitmask which is to clear on mount_options bitmask when  this
 769                                   value is found, 0 is no bits are to be changed. This is
 770                                   applied BEFORE setmask */
 771} opt_desc_t;
 772
 773/* possible values for -o data= */
 774static const arg_desc_t logging_mode[] = {
 775        {"ordered", 1 << REISERFS_DATA_ORDERED,
 776         (1 << REISERFS_DATA_LOG | 1 << REISERFS_DATA_WRITEBACK)},
 777        {"journal", 1 << REISERFS_DATA_LOG,
 778         (1 << REISERFS_DATA_ORDERED | 1 << REISERFS_DATA_WRITEBACK)},
 779        {"writeback", 1 << REISERFS_DATA_WRITEBACK,
 780         (1 << REISERFS_DATA_ORDERED | 1 << REISERFS_DATA_LOG)},
 781        {.value = NULL}
 782};
 783
 784/* possible values for -o barrier= */
 785static const arg_desc_t barrier_mode[] = {
 786        {"none", 1 << REISERFS_BARRIER_NONE, 1 << REISERFS_BARRIER_FLUSH},
 787        {"flush", 1 << REISERFS_BARRIER_FLUSH, 1 << REISERFS_BARRIER_NONE},
 788        {.value = NULL}
 789};
 790
 791/* possible values for "-o block-allocator=" and bits which are to be set in
 792   s_mount_opt of reiserfs specific part of in-core super block */
 793static const arg_desc_t balloc[] = {
 794        {"noborder", 1 << REISERFS_NO_BORDER, 0},
 795        {"border", 0, 1 << REISERFS_NO_BORDER},
 796        {"no_unhashed_relocation", 1 << REISERFS_NO_UNHASHED_RELOCATION, 0},
 797        {"hashed_relocation", 1 << REISERFS_HASHED_RELOCATION, 0},
 798        {"test4", 1 << REISERFS_TEST4, 0},
 799        {"notest4", 0, 1 << REISERFS_TEST4},
 800        {NULL, 0, 0}
 801};
 802
 803static const arg_desc_t tails[] = {
 804        {"on", 1 << REISERFS_LARGETAIL, 1 << REISERFS_SMALLTAIL},
 805        {"off", 0, (1 << REISERFS_LARGETAIL) | (1 << REISERFS_SMALLTAIL)},
 806        {"small", 1 << REISERFS_SMALLTAIL, 1 << REISERFS_LARGETAIL},
 807        {NULL, 0, 0}
 808};
 809
 810static const arg_desc_t error_actions[] = {
 811        {"panic", 1 << REISERFS_ERROR_PANIC,
 812         (1 << REISERFS_ERROR_RO | 1 << REISERFS_ERROR_CONTINUE)},
 813        {"ro-remount", 1 << REISERFS_ERROR_RO,
 814         (1 << REISERFS_ERROR_PANIC | 1 << REISERFS_ERROR_CONTINUE)},
 815#ifdef REISERFS_JOURNAL_ERROR_ALLOWS_NO_LOG
 816        {"continue", 1 << REISERFS_ERROR_CONTINUE,
 817         (1 << REISERFS_ERROR_PANIC | 1 << REISERFS_ERROR_RO)},
 818#endif
 819        {NULL, 0, 0},
 820};
 821
 822/* proceed only one option from a list *cur - string containing of mount options
 823   opts - array of options which are accepted
 824   opt_arg - if option is found and requires an argument and if it is specifed
 825   in the input - pointer to the argument is stored here
 826   bit_flags - if option requires to set a certain bit - it is set here
 827   return -1 if unknown option is found, opt->arg_required otherwise */
 828static int reiserfs_getopt(struct super_block *s, char **cur, opt_desc_t * opts,
 829                           char **opt_arg, unsigned long *bit_flags)
 830{
 831        char *p;
 832        /* foo=bar,
 833           ^   ^  ^
 834           |   |  +-- option_end
 835           |   +-- arg_start
 836           +-- option_start
 837         */
 838        const opt_desc_t *opt;
 839        const arg_desc_t *arg;
 840
 841        p = *cur;
 842
 843        /* assume argument cannot contain commas */
 844        *cur = strchr(p, ',');
 845        if (*cur) {
 846                *(*cur) = '\0';
 847                (*cur)++;
 848        }
 849
 850        if (!strncmp(p, "alloc=", 6)) {
 851                /* Ugly special case, probably we should redo options parser so that
 852                   it can understand several arguments for some options, also so that
 853                   it can fill several bitfields with option values. */
 854                if (reiserfs_parse_alloc_options(s, p + 6)) {
 855                        return -1;
 856                } else {
 857                        return 0;
 858                }
 859        }
 860
 861        /* for every option in the list */
 862        for (opt = opts; opt->option_name; opt++) {
 863                if (!strncmp(p, opt->option_name, strlen(opt->option_name))) {
 864                        if (bit_flags) {
 865                                if (opt->clrmask ==
 866                                    (1 << REISERFS_UNSUPPORTED_OPT))
 867                                        reiserfs_warning(s, "super-6500",
 868                                                         "%s not supported.\n",
 869                                                         p);
 870                                else
 871                                        *bit_flags &= ~opt->clrmask;
 872                                if (opt->setmask ==
 873                                    (1 << REISERFS_UNSUPPORTED_OPT))
 874                                        reiserfs_warning(s, "super-6501",
 875                                                         "%s not supported.\n",
 876                                                         p);
 877                                else
 878                                        *bit_flags |= opt->setmask;
 879                        }
 880                        break;
 881                }
 882        }
 883        if (!opt->option_name) {
 884                reiserfs_warning(s, "super-6502",
 885                                 "unknown mount option \"%s\"", p);
 886                return -1;
 887        }
 888
 889        p += strlen(opt->option_name);
 890        switch (*p) {
 891        case '=':
 892                if (!opt->arg_required) {
 893                        reiserfs_warning(s, "super-6503",
 894                                         "the option \"%s\" does not "
 895                                         "require an argument\n",
 896                                         opt->option_name);
 897                        return -1;
 898                }
 899                break;
 900
 901        case 0:
 902                if (opt->arg_required) {
 903                        reiserfs_warning(s, "super-6504",
 904                                         "the option \"%s\" requires an "
 905                                         "argument\n", opt->option_name);
 906                        return -1;
 907                }
 908                break;
 909        default:
 910                reiserfs_warning(s, "super-6505",
 911                                 "head of option \"%s\" is only correct\n",
 912                                 opt->option_name);
 913                return -1;
 914        }
 915
 916        /* move to the argument, or to next option if argument is not required */
 917        p++;
 918
 919        if (opt->arg_required
 920            && !(opt->arg_required & (1 << REISERFS_OPT_ALLOWEMPTY))
 921            && !strlen(p)) {
 922                /* this catches "option=," if not allowed */
 923                reiserfs_warning(s, "super-6506",
 924                                 "empty argument for \"%s\"\n",
 925                                 opt->option_name);
 926                return -1;
 927        }
 928
 929        if (!opt->values) {
 930                /* *=NULLopt_arg contains pointer to argument */
 931                *opt_arg = p;
 932                return opt->arg_required & ~(1 << REISERFS_OPT_ALLOWEMPTY);
 933        }
 934
 935        /* values possible for this option are listed in opt->values */
 936        for (arg = opt->values; arg->value; arg++) {
 937                if (!strcmp(p, arg->value)) {
 938                        if (bit_flags) {
 939                                *bit_flags &= ~arg->clrmask;
 940                                *bit_flags |= arg->setmask;
 941                        }
 942                        return opt->arg_required;
 943                }
 944        }
 945
 946        reiserfs_warning(s, "super-6506",
 947                         "bad value \"%s\" for option \"%s\"\n", p,
 948                         opt->option_name);
 949        return -1;
 950}
 951
 952/* returns 0 if something is wrong in option string, 1 - otherwise */
 953static int reiserfs_parse_options(struct super_block *s, char *options, /* string given via mount's -o */
 954                                  unsigned long *mount_options,
 955                                  /* after the parsing phase, contains the
 956                                     collection of bitflags defining what
 957                                     mount options were selected. */
 958                                  unsigned long *blocks,        /* strtol-ed from NNN of resize=NNN */
 959                                  char **jdev_name,
 960                                  unsigned int *commit_max_age,
 961                                  char **qf_names,
 962                                  unsigned int *qfmt)
 963{
 964        int c;
 965        char *arg = NULL;
 966        char *pos;
 967        opt_desc_t opts[] = {
 968                /* Compatibility stuff, so that -o notail for old setups still work */
 969                {"tails",.arg_required = 't',.values = tails},
 970                {"notail",.clrmask =
 971                 (1 << REISERFS_LARGETAIL) | (1 << REISERFS_SMALLTAIL)},
 972                {"conv",.setmask = 1 << REISERFS_CONVERT},
 973                {"attrs",.setmask = 1 << REISERFS_ATTRS},
 974                {"noattrs",.clrmask = 1 << REISERFS_ATTRS},
 975                {"expose_privroot", .setmask = 1 << REISERFS_EXPOSE_PRIVROOT},
 976#ifdef CONFIG_REISERFS_FS_XATTR
 977                {"user_xattr",.setmask = 1 << REISERFS_XATTRS_USER},
 978                {"nouser_xattr",.clrmask = 1 << REISERFS_XATTRS_USER},
 979#else
 980                {"user_xattr",.setmask = 1 << REISERFS_UNSUPPORTED_OPT},
 981                {"nouser_xattr",.clrmask = 1 << REISERFS_UNSUPPORTED_OPT},
 982#endif
 983#ifdef CONFIG_REISERFS_FS_POSIX_ACL
 984                {"acl",.setmask = 1 << REISERFS_POSIXACL},
 985                {"noacl",.clrmask = 1 << REISERFS_POSIXACL},
 986#else
 987                {"acl",.setmask = 1 << REISERFS_UNSUPPORTED_OPT},
 988                {"noacl",.clrmask = 1 << REISERFS_UNSUPPORTED_OPT},
 989#endif
 990                {.option_name = "nolog"},
 991                {"replayonly",.setmask = 1 << REPLAYONLY},
 992                {"block-allocator",.arg_required = 'a',.values = balloc},
 993                {"data",.arg_required = 'd',.values = logging_mode},
 994                {"barrier",.arg_required = 'b',.values = barrier_mode},
 995                {"resize",.arg_required = 'r',.values = NULL},
 996                {"jdev",.arg_required = 'j',.values = NULL},
 997                {"nolargeio",.arg_required = 'w',.values = NULL},
 998                {"commit",.arg_required = 'c',.values = NULL},
 999                {"usrquota",.setmask = 1 << REISERFS_USRQUOTA},
1000                {"grpquota",.setmask = 1 << REISERFS_GRPQUOTA},
1001                {"noquota",.clrmask = 1 << REISERFS_USRQUOTA | 1 << REISERFS_GRPQUOTA},
1002                {"errors",.arg_required = 'e',.values = error_actions},
1003                {"usrjquota",.arg_required =
1004                 'u' | (1 << REISERFS_OPT_ALLOWEMPTY),.values = NULL},
1005                {"grpjquota",.arg_required =
1006                 'g' | (1 << REISERFS_OPT_ALLOWEMPTY),.values = NULL},
1007                {"jqfmt",.arg_required = 'f',.values = NULL},
1008                {.option_name = NULL}
1009        };
1010
1011        *blocks = 0;
1012        if (!options || !*options)
1013                /* use default configuration: create tails, journaling on, no
1014                   conversion to newest format */
1015                return 1;
1016
1017        for (pos = options; pos;) {
1018                c = reiserfs_getopt(s, &pos, opts, &arg, mount_options);
1019                if (c == -1)
1020                        /* wrong option is given */
1021                        return 0;
1022
1023                if (c == 'r') {
1024                        char *p;
1025
1026                        p = NULL;
1027                        /* "resize=NNN" or "resize=auto" */
1028
1029                        if (!strcmp(arg, "auto")) {
1030                                /* From JFS code, to auto-get the size. */
1031                                *blocks =
1032                                    s->s_bdev->bd_inode->i_size >> s->
1033                                    s_blocksize_bits;
1034                        } else {
1035                                *blocks = simple_strtoul(arg, &p, 0);
1036                                if (*p != '\0') {
1037                                        /* NNN does not look like a number */
1038                                        reiserfs_warning(s, "super-6507",
1039                                                         "bad value %s for "
1040                                                         "-oresize\n", arg);
1041                                        return 0;
1042                                }
1043                        }
1044                }
1045
1046                if (c == 'c') {
1047                        char *p = NULL;
1048                        unsigned long val = simple_strtoul(arg, &p, 0);
1049                        /* commit=NNN (time in seconds) */
1050                        if (*p != '\0' || val >= (unsigned int)-1) {
1051                                reiserfs_warning(s, "super-6508",
1052                                                 "bad value %s for -ocommit\n",
1053                                                 arg);
1054                                return 0;
1055                        }
1056                        *commit_max_age = (unsigned int)val;
1057                }
1058
1059                if (c == 'w') {
1060                        reiserfs_warning(s, "super-6509", "nolargeio option "
1061                                         "is no longer supported");
1062                        return 0;
1063                }
1064
1065                if (c == 'j') {
1066                        if (arg && *arg && jdev_name) {
1067                                if (*jdev_name) {       //Hm, already assigned?
1068                                        reiserfs_warning(s, "super-6510",
1069                                                         "journal device was "
1070                                                         "already specified to "
1071                                                         "be %s", *jdev_name);
1072                                        return 0;
1073                                }
1074                                *jdev_name = arg;
1075                        }
1076                }
1077#ifdef CONFIG_QUOTA
1078                if (c == 'u' || c == 'g') {
1079                        int qtype = c == 'u' ? USRQUOTA : GRPQUOTA;
1080
1081                        if (sb_any_quota_loaded(s) &&
1082                            (!*arg != !REISERFS_SB(s)->s_qf_names[qtype])) {
1083                                reiserfs_warning(s, "super-6511",
1084                                                 "cannot change journaled "
1085                                                 "quota options when quota "
1086                                                 "turned on.");
1087                                return 0;
1088                        }
1089                        if (*arg) {     /* Some filename specified? */
1090                                if (REISERFS_SB(s)->s_qf_names[qtype]
1091                                    && strcmp(REISERFS_SB(s)->s_qf_names[qtype],
1092                                              arg)) {
1093                                        reiserfs_warning(s, "super-6512",
1094                                                         "%s quota file "
1095                                                         "already specified.",
1096                                                         QTYPE2NAME(qtype));
1097                                        return 0;
1098                                }
1099                                if (strchr(arg, '/')) {
1100                                        reiserfs_warning(s, "super-6513",
1101                                                         "quotafile must be "
1102                                                         "on filesystem root.");
1103                                        return 0;
1104                                }
1105                                qf_names[qtype] =
1106                                    kmalloc(strlen(arg) + 1, GFP_KERNEL);
1107                                if (!qf_names[qtype]) {
1108                                        reiserfs_warning(s, "reiserfs-2502",
1109                                                         "not enough memory "
1110                                                         "for storing "
1111                                                         "quotafile name.");
1112                                        return 0;
1113                                }
1114                                strcpy(qf_names[qtype], arg);
1115                                if (qtype == USRQUOTA)
1116                                        *mount_options |= 1 << REISERFS_USRQUOTA;
1117                                else
1118                                        *mount_options |= 1 << REISERFS_GRPQUOTA;
1119                        } else {
1120                                if (qf_names[qtype] !=
1121                                    REISERFS_SB(s)->s_qf_names[qtype])
1122                                        kfree(qf_names[qtype]);
1123                                qf_names[qtype] = NULL;
1124                                if (qtype == USRQUOTA)
1125                                        *mount_options &= ~(1 << REISERFS_USRQUOTA);
1126                                else
1127                                        *mount_options &= ~(1 << REISERFS_GRPQUOTA);
1128                        }
1129                }
1130                if (c == 'f') {
1131                        if (!strcmp(arg, "vfsold"))
1132                                *qfmt = QFMT_VFS_OLD;
1133                        else if (!strcmp(arg, "vfsv0"))
1134                                *qfmt = QFMT_VFS_V0;
1135                        else {
1136                                reiserfs_warning(s, "super-6514",
1137                                                 "unknown quota format "
1138                                                 "specified.");
1139                                return 0;
1140                        }
1141                        if (sb_any_quota_loaded(s) &&
1142                            *qfmt != REISERFS_SB(s)->s_jquota_fmt) {
1143                                reiserfs_warning(s, "super-6515",
1144                                                 "cannot change journaled "
1145                                                 "quota options when quota "
1146                                                 "turned on.");
1147                                return 0;
1148                        }
1149                }
1150#else
1151                if (c == 'u' || c == 'g' || c == 'f') {
1152                        reiserfs_warning(s, "reiserfs-2503", "journaled "
1153                                         "quota options not supported.");
1154                        return 0;
1155                }
1156#endif
1157        }
1158
1159#ifdef CONFIG_QUOTA
1160        if (!REISERFS_SB(s)->s_jquota_fmt && !*qfmt
1161            && (qf_names[USRQUOTA] || qf_names[GRPQUOTA])) {
1162                reiserfs_warning(s, "super-6515",
1163                                 "journaled quota format not specified.");
1164                return 0;
1165        }
1166        if ((!(*mount_options & (1 << REISERFS_USRQUOTA)) &&
1167               sb_has_quota_loaded(s, USRQUOTA)) ||
1168            (!(*mount_options & (1 << REISERFS_GRPQUOTA)) &&
1169               sb_has_quota_loaded(s, GRPQUOTA))) {
1170                reiserfs_warning(s, "super-6516", "quota options must "
1171                                 "be present when quota is turned on.");
1172                return 0;
1173        }
1174#endif
1175
1176        return 1;
1177}
1178
1179static void switch_data_mode(struct super_block *s, unsigned long mode)
1180{
1181        REISERFS_SB(s)->s_mount_opt &= ~((1 << REISERFS_DATA_LOG) |
1182                                         (1 << REISERFS_DATA_ORDERED) |
1183                                         (1 << REISERFS_DATA_WRITEBACK));
1184        REISERFS_SB(s)->s_mount_opt |= (1 << mode);
1185}
1186
1187static void handle_data_mode(struct super_block *s, unsigned long mount_options)
1188{
1189        if (mount_options & (1 << REISERFS_DATA_LOG)) {
1190                if (!reiserfs_data_log(s)) {
1191                        switch_data_mode(s, REISERFS_DATA_LOG);
1192                        reiserfs_info(s, "switching to journaled data mode\n");
1193                }
1194        } else if (mount_options & (1 << REISERFS_DATA_ORDERED)) {
1195                if (!reiserfs_data_ordered(s)) {
1196                        switch_data_mode(s, REISERFS_DATA_ORDERED);
1197                        reiserfs_info(s, "switching to ordered data mode\n");
1198                }
1199        } else if (mount_options & (1 << REISERFS_DATA_WRITEBACK)) {
1200                if (!reiserfs_data_writeback(s)) {
1201                        switch_data_mode(s, REISERFS_DATA_WRITEBACK);
1202                        reiserfs_info(s, "switching to writeback data mode\n");
1203                }
1204        }
1205}
1206
1207static void handle_barrier_mode(struct super_block *s, unsigned long bits)
1208{
1209        int flush = (1 << REISERFS_BARRIER_FLUSH);
1210        int none = (1 << REISERFS_BARRIER_NONE);
1211        int all_barrier = flush | none;
1212
1213        if (bits & all_barrier) {
1214                REISERFS_SB(s)->s_mount_opt &= ~all_barrier;
1215                if (bits & flush) {
1216                        REISERFS_SB(s)->s_mount_opt |= flush;
1217                        printk("reiserfs: enabling write barrier flush mode\n");
1218                } else if (bits & none) {
1219                        REISERFS_SB(s)->s_mount_opt |= none;
1220                        printk("reiserfs: write barriers turned off\n");
1221                }
1222        }
1223}
1224
1225static void handle_attrs(struct super_block *s)
1226{
1227        struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(s);
1228
1229        if (reiserfs_attrs(s)) {
1230                if (old_format_only(s)) {
1231                        reiserfs_warning(s, "super-6517", "cannot support "
1232                                         "attributes on 3.5.x disk format");
1233                        REISERFS_SB(s)->s_mount_opt &= ~(1 << REISERFS_ATTRS);
1234                        return;
1235                }
1236                if (!(le32_to_cpu(rs->s_flags) & reiserfs_attrs_cleared)) {
1237                        reiserfs_warning(s, "super-6518", "cannot support "
1238                                         "attributes until flag is set in "
1239                                         "super-block");
1240                        REISERFS_SB(s)->s_mount_opt &= ~(1 << REISERFS_ATTRS);
1241                }
1242        }
1243}
1244
1245#ifdef CONFIG_QUOTA
1246static void handle_quota_files(struct super_block *s, char **qf_names,
1247                               unsigned int *qfmt)
1248{
1249        int i;
1250
1251        for (i = 0; i < MAXQUOTAS; i++) {
1252                if (qf_names[i] != REISERFS_SB(s)->s_qf_names[i])
1253                        kfree(REISERFS_SB(s)->s_qf_names[i]);
1254                REISERFS_SB(s)->s_qf_names[i] = qf_names[i];
1255        }
1256        if (*qfmt)
1257                REISERFS_SB(s)->s_jquota_fmt = *qfmt;
1258}
1259#endif
1260
1261static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg)
1262{
1263        struct reiserfs_super_block *rs;
1264        struct reiserfs_transaction_handle th;
1265        unsigned long blocks;
1266        unsigned long mount_options = REISERFS_SB(s)->s_mount_opt;
1267        unsigned long safe_mask = 0;
1268        unsigned int commit_max_age = (unsigned int)-1;
1269        struct reiserfs_journal *journal = SB_JOURNAL(s);
1270        char *new_opts = kstrdup(arg, GFP_KERNEL);
1271        int err;
1272        char *qf_names[MAXQUOTAS];
1273        unsigned int qfmt = 0;
1274#ifdef CONFIG_QUOTA
1275        int i;
1276#endif
1277
1278        reiserfs_write_lock(s);
1279
1280#ifdef CONFIG_QUOTA
1281        memcpy(qf_names, REISERFS_SB(s)->s_qf_names, sizeof(qf_names));
1282#endif
1283
1284        rs = SB_DISK_SUPER_BLOCK(s);
1285
1286        if (!reiserfs_parse_options
1287            (s, arg, &mount_options, &blocks, NULL, &commit_max_age,
1288            qf_names, &qfmt)) {
1289#ifdef CONFIG_QUOTA
1290                for (i = 0; i < MAXQUOTAS; i++)
1291                        if (qf_names[i] != REISERFS_SB(s)->s_qf_names[i])
1292                                kfree(qf_names[i]);
1293#endif
1294                err = -EINVAL;
1295                goto out_err;
1296        }
1297#ifdef CONFIG_QUOTA
1298        handle_quota_files(s, qf_names, &qfmt);
1299#endif
1300
1301        handle_attrs(s);
1302
1303        /* Add options that are safe here */
1304        safe_mask |= 1 << REISERFS_SMALLTAIL;
1305        safe_mask |= 1 << REISERFS_LARGETAIL;
1306        safe_mask |= 1 << REISERFS_NO_BORDER;
1307        safe_mask |= 1 << REISERFS_NO_UNHASHED_RELOCATION;
1308        safe_mask |= 1 << REISERFS_HASHED_RELOCATION;
1309        safe_mask |= 1 << REISERFS_TEST4;
1310        safe_mask |= 1 << REISERFS_ATTRS;
1311        safe_mask |= 1 << REISERFS_XATTRS_USER;
1312        safe_mask |= 1 << REISERFS_POSIXACL;
1313        safe_mask |= 1 << REISERFS_BARRIER_FLUSH;
1314        safe_mask |= 1 << REISERFS_BARRIER_NONE;
1315        safe_mask |= 1 << REISERFS_ERROR_RO;
1316        safe_mask |= 1 << REISERFS_ERROR_CONTINUE;
1317        safe_mask |= 1 << REISERFS_ERROR_PANIC;
1318        safe_mask |= 1 << REISERFS_USRQUOTA;
1319        safe_mask |= 1 << REISERFS_GRPQUOTA;
1320
1321        /* Update the bitmask, taking care to keep
1322         * the bits we're not allowed to change here */
1323        REISERFS_SB(s)->s_mount_opt =
1324            (REISERFS_SB(s)->
1325             s_mount_opt & ~safe_mask) | (mount_options & safe_mask);
1326
1327        if (commit_max_age != 0 && commit_max_age != (unsigned int)-1) {
1328                journal->j_max_commit_age = commit_max_age;
1329                journal->j_max_trans_age = commit_max_age;
1330        } else if (commit_max_age == 0) {
1331                /* 0 means restore defaults. */
1332                journal->j_max_commit_age = journal->j_default_max_commit_age;
1333                journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE;
1334        }
1335
1336        if (blocks) {
1337                err = reiserfs_resize(s, blocks);
1338                if (err != 0)
1339                        goto out_err;
1340        }
1341
1342        if (*mount_flags & MS_RDONLY) {
1343                reiserfs_xattr_init(s, *mount_flags);
1344                /* remount read-only */
1345                if (s->s_flags & MS_RDONLY)
1346                        /* it is read-only already */
1347                        goto out_ok;
1348
1349                err = dquot_suspend(s, -1);
1350                if (err < 0)
1351                        goto out_err;
1352
1353                /* try to remount file system with read-only permissions */
1354                if (sb_umount_state(rs) == REISERFS_VALID_FS
1355                    || REISERFS_SB(s)->s_mount_state != REISERFS_VALID_FS) {
1356                        goto out_ok;
1357                }
1358
1359                err = journal_begin(&th, s, 10);
1360                if (err)
1361                        goto out_err;
1362
1363                /* Mounting a rw partition read-only. */
1364                reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
1365                set_sb_umount_state(rs, REISERFS_SB(s)->s_mount_state);
1366                journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB(s));
1367        } else {
1368                /* remount read-write */
1369                if (!(s->s_flags & MS_RDONLY)) {
1370                        reiserfs_xattr_init(s, *mount_flags);
1371                        goto out_ok;    /* We are read-write already */
1372                }
1373
1374                if (reiserfs_is_journal_aborted(journal)) {
1375                        err = journal->j_errno;
1376                        goto out_err;
1377                }
1378
1379                handle_data_mode(s, mount_options);
1380                handle_barrier_mode(s, mount_options);
1381                REISERFS_SB(s)->s_mount_state = sb_umount_state(rs);
1382                s->s_flags &= ~MS_RDONLY;       /* now it is safe to call journal_begin */
1383                err = journal_begin(&th, s, 10);
1384                if (err)
1385                        goto out_err;
1386
1387                /* Mount a partition which is read-only, read-write */
1388                reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
1389                REISERFS_SB(s)->s_mount_state = sb_umount_state(rs);
1390                s->s_flags &= ~MS_RDONLY;
1391                set_sb_umount_state(rs, REISERFS_ERROR_FS);
1392                if (!old_format_only(s))
1393                        set_sb_mnt_count(rs, sb_mnt_count(rs) + 1);
1394                /* mark_buffer_dirty (SB_BUFFER_WITH_SB (s), 1); */
1395                journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB(s));
1396                REISERFS_SB(s)->s_mount_state = REISERFS_VALID_FS;
1397        }
1398        /* this will force a full flush of all journal lists */
1399        SB_JOURNAL(s)->j_must_wait = 1;
1400        err = journal_end(&th, s, 10);
1401        if (err)
1402                goto out_err;
1403        s->s_dirt = 0;
1404
1405        if (!(*mount_flags & MS_RDONLY)) {
1406                dquot_resume(s, -1);
1407                finish_unfinished(s);
1408                reiserfs_xattr_init(s, *mount_flags);
1409        }
1410
1411out_ok:
1412        replace_mount_options(s, new_opts);
1413        reiserfs_write_unlock(s);
1414        return 0;
1415
1416out_err:
1417        kfree(new_opts);
1418        reiserfs_write_unlock(s);
1419        return err;
1420}
1421
1422static int read_super_block(struct super_block *s, int offset)
1423{
1424        struct buffer_head *bh;
1425        struct reiserfs_super_block *rs;
1426        int fs_blocksize;
1427
1428        bh = sb_bread(s, offset / s->s_blocksize);
1429        if (!bh) {
1430                reiserfs_warning(s, "sh-2006",
1431                                 "bread failed (dev %s, block %lu, size %lu)",
1432                                 reiserfs_bdevname(s), offset / s->s_blocksize,
1433                                 s->s_blocksize);
1434                return 1;
1435        }
1436
1437        rs = (struct reiserfs_super_block *)bh->b_data;
1438        if (!is_any_reiserfs_magic_string(rs)) {
1439                brelse(bh);
1440                return 1;
1441        }
1442        //
1443        // ok, reiserfs signature (old or new) found in at the given offset
1444        //
1445        fs_blocksize = sb_blocksize(rs);
1446        brelse(bh);
1447        sb_set_blocksize(s, fs_blocksize);
1448
1449        bh = sb_bread(s, offset / s->s_blocksize);
1450        if (!bh) {
1451                reiserfs_warning(s, "sh-2007",
1452                                 "bread failed (dev %s, block %lu, size %lu)",
1453                                 reiserfs_bdevname(s), offset / s->s_blocksize,
1454                                 s->s_blocksize);
1455                return 1;
1456        }
1457
1458        rs = (struct reiserfs_super_block *)bh->b_data;
1459        if (sb_blocksize(rs) != s->s_blocksize) {
1460                reiserfs_warning(s, "sh-2011", "can't find a reiserfs "
1461                                 "filesystem on (dev %s, block %Lu, size %lu)",
1462                                 reiserfs_bdevname(s),
1463                                 (unsigned long long)bh->b_blocknr,
1464                                 s->s_blocksize);
1465                brelse(bh);
1466                return 1;
1467        }
1468
1469        if (rs->s_v1.s_root_block == cpu_to_le32(-1)) {
1470                brelse(bh);
1471                reiserfs_warning(s, "super-6519", "Unfinished reiserfsck "
1472                                 "--rebuild-tree run detected. Please run\n"
1473                                 "reiserfsck --rebuild-tree and wait for a "
1474                                 "completion. If that fails\n"
1475                                 "get newer reiserfsprogs package");
1476                return 1;
1477        }
1478
1479        SB_BUFFER_WITH_SB(s) = bh;
1480        SB_DISK_SUPER_BLOCK(s) = rs;
1481
1482        if (is_reiserfs_jr(rs)) {
1483                /* magic is of non-standard journal filesystem, look at s_version to
1484                   find which format is in use */
1485                if (sb_version(rs) == REISERFS_VERSION_2)
1486                        reiserfs_info(s, "found reiserfs format \"3.6\""
1487                                      " with non-standard journal\n");
1488                else if (sb_version(rs) == REISERFS_VERSION_1)
1489                        reiserfs_info(s, "found reiserfs format \"3.5\""
1490                                      " with non-standard journal\n");
1491                else {
1492                        reiserfs_warning(s, "sh-2012", "found unknown "
1493                                         "format \"%u\" of reiserfs with "
1494                                         "non-standard magic", sb_version(rs));
1495                        return 1;
1496                }
1497        } else
1498                /* s_version of standard format may contain incorrect information,
1499                   so we just look at the magic string */
1500                reiserfs_info(s,
1501                              "found reiserfs format \"%s\" with standard journal\n",
1502                              is_reiserfs_3_5(rs) ? "3.5" : "3.6");
1503
1504        s->s_op = &reiserfs_sops;
1505        s->s_export_op = &reiserfs_export_ops;
1506#ifdef CONFIG_QUOTA
1507        s->s_qcop = &reiserfs_qctl_operations;
1508        s->dq_op = &reiserfs_quota_operations;
1509#endif
1510
1511        /* new format is limited by the 32 bit wide i_blocks field, want to
1512         ** be one full block below that.
1513         */
1514        s->s_maxbytes = (512LL << 32) - s->s_blocksize;
1515        return 0;
1516}
1517
1518/* after journal replay, reread all bitmap and super blocks */
1519static int reread_meta_blocks(struct super_block *s)
1520{
1521        ll_rw_block(READ, 1, &(SB_BUFFER_WITH_SB(s)));
1522        wait_on_buffer(SB_BUFFER_WITH_SB(s));
1523        if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) {
1524                reiserfs_warning(s, "reiserfs-2504", "error reading the super");
1525                return 1;
1526        }
1527
1528        return 0;
1529}
1530
1531/////////////////////////////////////////////////////
1532// hash detection stuff
1533
1534// if root directory is empty - we set default - Yura's - hash and
1535// warn about it
1536// FIXME: we look for only one name in a directory. If tea and yura
1537// bith have the same value - we ask user to send report to the
1538// mailing list
1539static __u32 find_hash_out(struct super_block *s)
1540{
1541        int retval;
1542        struct inode *inode;
1543        struct cpu_key key;
1544        INITIALIZE_PATH(path);
1545        struct reiserfs_dir_entry de;
1546        __u32 hash = DEFAULT_HASH;
1547
1548        inode = s->s_root->d_inode;
1549
1550        do {                    // Some serious "goto"-hater was there ;)
1551                u32 teahash, r5hash, yurahash;
1552
1553                make_cpu_key(&key, inode, ~0, TYPE_DIRENTRY, 3);
1554                retval = search_by_entry_key(s, &key, &path, &de);
1555                if (retval == IO_ERROR) {
1556                        pathrelse(&path);
1557                        return UNSET_HASH;
1558                }
1559                if (retval == NAME_NOT_FOUND)
1560                        de.de_entry_num--;
1561                set_de_name_and_namelen(&de);
1562                if (deh_offset(&(de.de_deh[de.de_entry_num])) == DOT_DOT_OFFSET) {
1563                        /* allow override in this case */
1564                        if (reiserfs_rupasov_hash(s)) {
1565                                hash = YURA_HASH;
1566                        }
1567                        reiserfs_info(s, "FS seems to be empty, autodetect "
1568                                         "is using the default hash\n");
1569                        break;
1570                }
1571                r5hash = GET_HASH_VALUE(r5_hash(de.de_name, de.de_namelen));
1572                teahash = GET_HASH_VALUE(keyed_hash(de.de_name, de.de_namelen));
1573                yurahash = GET_HASH_VALUE(yura_hash(de.de_name, de.de_namelen));
1574                if (((teahash == r5hash)
1575                     &&
1576                     (GET_HASH_VALUE(deh_offset(&(de.de_deh[de.de_entry_num])))
1577                      == r5hash)) || ((teahash == yurahash)
1578                                      && (yurahash ==
1579                                          GET_HASH_VALUE(deh_offset
1580                                                         (&
1581                                                          (de.
1582                                                           de_deh[de.
1583                                                                  de_entry_num])))))
1584                    || ((r5hash == yurahash)
1585                        && (yurahash ==
1586                            GET_HASH_VALUE(deh_offset
1587                                           (&(de.de_deh[de.de_entry_num])))))) {
1588                        reiserfs_warning(s, "reiserfs-2506", "Unable to "
1589                                         "automatically detect hash function. "
1590                                         "Please mount with -o "
1591                                         "hash={tea,rupasov,r5}");
1592                        hash = UNSET_HASH;
1593                        break;
1594                }
1595                if (GET_HASH_VALUE(deh_offset(&(de.de_deh[de.de_entry_num]))) ==
1596                    yurahash)
1597                        hash = YURA_HASH;
1598                else if (GET_HASH_VALUE
1599                         (deh_offset(&(de.de_deh[de.de_entry_num]))) == teahash)
1600                        hash = TEA_HASH;
1601                else if (GET_HASH_VALUE
1602                         (deh_offset(&(de.de_deh[de.de_entry_num]))) == r5hash)
1603                        hash = R5_HASH;
1604                else {
1605                        reiserfs_warning(s, "reiserfs-2506",
1606                                         "Unrecognised hash function");
1607                        hash = UNSET_HASH;
1608                }
1609        } while (0);
1610
1611        pathrelse(&path);
1612        return hash;
1613}
1614
1615// finds out which hash names are sorted with
1616static int what_hash(struct super_block *s)
1617{
1618        __u32 code;
1619
1620        code = sb_hash_function_code(SB_DISK_SUPER_BLOCK(s));
1621
1622        /* reiserfs_hash_detect() == true if any of the hash mount options
1623         ** were used.  We must check them to make sure the user isn't
1624         ** using a bad hash value
1625         */
1626        if (code == UNSET_HASH || reiserfs_hash_detect(s))
1627                code = find_hash_out(s);
1628
1629        if (code != UNSET_HASH && reiserfs_hash_detect(s)) {
1630                /* detection has found the hash, and we must check against the
1631                 ** mount options
1632                 */
1633                if (reiserfs_rupasov_hash(s) && code != YURA_HASH) {
1634                        reiserfs_warning(s, "reiserfs-2507",
1635                                         "Error, %s hash detected, "
1636                                         "unable to force rupasov hash",
1637                                         reiserfs_hashname(code));
1638                        code = UNSET_HASH;
1639                } else if (reiserfs_tea_hash(s) && code != TEA_HASH) {
1640                        reiserfs_warning(s, "reiserfs-2508",
1641                                         "Error, %s hash detected, "
1642                                         "unable to force tea hash",
1643                                         reiserfs_hashname(code));
1644                        code = UNSET_HASH;
1645                } else if (reiserfs_r5_hash(s) && code != R5_HASH) {
1646                        reiserfs_warning(s, "reiserfs-2509",
1647                                         "Error, %s hash detected, "
1648                                         "unable to force r5 hash",
1649                                         reiserfs_hashname(code));
1650                        code = UNSET_HASH;
1651                }
1652        } else {
1653                /* find_hash_out was not called or could not determine the hash */
1654                if (reiserfs_rupasov_hash(s)) {
1655                        code = YURA_HASH;
1656                } else if (reiserfs_tea_hash(s)) {
1657                        code = TEA_HASH;
1658                } else if (reiserfs_r5_hash(s)) {
1659                        code = R5_HASH;
1660                }
1661        }
1662
1663        /* if we are mounted RW, and we have a new valid hash code, update
1664         ** the super
1665         */
1666        if (code != UNSET_HASH &&
1667            !(s->s_flags & MS_RDONLY) &&
1668            code != sb_hash_function_code(SB_DISK_SUPER_BLOCK(s))) {
1669                set_sb_hash_function_code(SB_DISK_SUPER_BLOCK(s), code);
1670        }
1671        return code;
1672}
1673
1674// return pointer to appropriate function
1675static hashf_t hash_function(struct super_block *s)
1676{
1677        switch (what_hash(s)) {
1678        case TEA_HASH:
1679                reiserfs_info(s, "Using tea hash to sort names\n");
1680                return keyed_hash;
1681        case YURA_HASH:
1682                reiserfs_info(s, "Using rupasov hash to sort names\n");
1683                return yura_hash;
1684        case R5_HASH:
1685                reiserfs_info(s, "Using r5 hash to sort names\n");
1686                return r5_hash;
1687        }
1688        return NULL;
1689}
1690
1691// this is used to set up correct value for old partitions
1692static int function2code(hashf_t func)
1693{
1694        if (func == keyed_hash)
1695                return TEA_HASH;
1696        if (func == yura_hash)
1697                return YURA_HASH;
1698        if (func == r5_hash)
1699                return R5_HASH;
1700
1701        BUG();                  // should never happen
1702
1703        return 0;
1704}
1705
1706#define SWARN(silent, s, id, ...)                       \
1707        if (!(silent))                          \
1708                reiserfs_warning(s, id, __VA_ARGS__)
1709
1710static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
1711{
1712        struct inode *root_inode;
1713        struct reiserfs_transaction_handle th;
1714        int old_format = 0;
1715        unsigned long blocks;
1716        unsigned int commit_max_age = 0;
1717        int jinit_done = 0;
1718        struct reiserfs_iget_args args;
1719        struct reiserfs_super_block *rs;
1720        char *jdev_name;
1721        struct reiserfs_sb_info *sbi;
1722        int errval = -EINVAL;
1723        char *qf_names[MAXQUOTAS] = {};
1724        unsigned int qfmt = 0;
1725
1726        save_mount_options(s, data);
1727
1728        sbi = kzalloc(sizeof(struct reiserfs_sb_info), GFP_KERNEL);
1729        if (!sbi)
1730                return -ENOMEM;
1731        s->s_fs_info = sbi;
1732        /* Set default values for options: non-aggressive tails, RO on errors */
1733        REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_SMALLTAIL);
1734        REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_ERROR_RO);
1735        REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_BARRIER_FLUSH);
1736        /* no preallocation minimum, be smart in
1737           reiserfs_file_write instead */
1738        REISERFS_SB(s)->s_alloc_options.preallocmin = 0;
1739        /* Preallocate by 16 blocks (17-1) at once */
1740        REISERFS_SB(s)->s_alloc_options.preallocsize = 17;
1741        /* setup default block allocator options */
1742        reiserfs_init_alloc_options(s);
1743
1744        mutex_init(&REISERFS_SB(s)->lock);
1745        REISERFS_SB(s)->lock_depth = -1;
1746
1747        jdev_name = NULL;
1748        if (reiserfs_parse_options
1749            (s, (char *)data, &(sbi->s_mount_opt), &blocks, &jdev_name,
1750             &commit_max_age, qf_names, &qfmt) == 0) {
1751                goto error_unlocked;
1752        }
1753        if (jdev_name && jdev_name[0]) {
1754                REISERFS_SB(s)->s_jdev = kstrdup(jdev_name, GFP_KERNEL);
1755                if (!REISERFS_SB(s)->s_jdev) {
1756                        SWARN(silent, s, "", "Cannot allocate memory for "
1757                                "journal device name");
1758                        goto error;
1759                }
1760        }
1761#ifdef CONFIG_QUOTA
1762        handle_quota_files(s, qf_names, &qfmt);
1763#endif
1764
1765        if (blocks) {
1766                SWARN(silent, s, "jmacd-7", "resize option for remount only");
1767                goto error_unlocked;
1768        }
1769
1770        /* try old format (undistributed bitmap, super block in 8-th 1k block of a device) */
1771        if (!read_super_block(s, REISERFS_OLD_DISK_OFFSET_IN_BYTES))
1772                old_format = 1;
1773        /* try new format (64-th 1k block), which can contain reiserfs super block */
1774        else if (read_super_block(s, REISERFS_DISK_OFFSET_IN_BYTES)) {
1775                SWARN(silent, s, "sh-2021", "can not find reiserfs on %s",
1776                      reiserfs_bdevname(s));
1777                goto error_unlocked;
1778        }
1779
1780        rs = SB_DISK_SUPER_BLOCK(s);
1781        /* Let's do basic sanity check to verify that underlying device is not
1782           smaller than the filesystem. If the check fails then abort and scream,
1783           because bad stuff will happen otherwise. */
1784        if (s->s_bdev && s->s_bdev->bd_inode
1785            && i_size_read(s->s_bdev->bd_inode) <
1786            sb_block_count(rs) * sb_blocksize(rs)) {
1787                SWARN(silent, s, "", "Filesystem cannot be "
1788                      "mounted because it is bigger than the device");
1789                SWARN(silent, s, "", "You may need to run fsck "
1790                      "or increase size of your LVM partition");
1791                SWARN(silent, s, "", "Or may be you forgot to "
1792                      "reboot after fdisk when it told you to");
1793                goto error_unlocked;
1794        }
1795
1796        sbi->s_mount_state = SB_REISERFS_STATE(s);
1797        sbi->s_mount_state = REISERFS_VALID_FS;
1798
1799        if ((errval = reiserfs_init_bitmap_cache(s))) {
1800                SWARN(silent, s, "jmacd-8", "unable to read bitmap");
1801                goto error_unlocked;
1802        }
1803
1804        errval = -EINVAL;
1805#ifdef CONFIG_REISERFS_CHECK
1806        SWARN(silent, s, "", "CONFIG_REISERFS_CHECK is set ON");
1807        SWARN(silent, s, "", "- it is slow mode for debugging.");
1808#endif
1809
1810        /* make data=ordered the default */
1811        if (!reiserfs_data_log(s) && !reiserfs_data_ordered(s) &&
1812            !reiserfs_data_writeback(s)) {
1813                REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_DATA_ORDERED);
1814        }
1815
1816        if (reiserfs_data_log(s)) {
1817                reiserfs_info(s, "using journaled data mode\n");
1818        } else if (reiserfs_data_ordered(s)) {
1819                reiserfs_info(s, "using ordered data mode\n");
1820        } else {
1821                reiserfs_info(s, "using writeback data mode\n");
1822        }
1823        if (reiserfs_barrier_flush(s)) {
1824                printk("reiserfs: using flush barriers\n");
1825        }
1826
1827        // set_device_ro(s->s_dev, 1) ;
1828        if (journal_init(s, jdev_name, old_format, commit_max_age)) {
1829                SWARN(silent, s, "sh-2022",
1830                      "unable to initialize journal space");
1831                goto error_unlocked;
1832        } else {
1833                jinit_done = 1; /* once this is set, journal_release must be called
1834                                 ** if we error out of the mount
1835                                 */
1836        }
1837
1838        if (reread_meta_blocks(s)) {
1839                SWARN(silent, s, "jmacd-9",
1840                      "unable to reread meta blocks after journal init");
1841                goto error_unlocked;
1842        }
1843
1844        if (replay_only(s))
1845                goto error_unlocked;
1846
1847        if (bdev_read_only(s->s_bdev) && !(s->s_flags & MS_RDONLY)) {
1848                SWARN(silent, s, "clm-7000",
1849                      "Detected readonly device, marking FS readonly");
1850                s->s_flags |= MS_RDONLY;
1851        }
1852        args.objectid = REISERFS_ROOT_OBJECTID;
1853        args.dirid = REISERFS_ROOT_PARENT_OBJECTID;
1854        root_inode =
1855            iget5_locked(s, REISERFS_ROOT_OBJECTID, reiserfs_find_actor,
1856                         reiserfs_init_locked_inode, (void *)(&args));
1857        if (!root_inode) {
1858                SWARN(silent, s, "jmacd-10", "get root inode failed");
1859                goto error_unlocked;
1860        }
1861
1862        /*
1863         * This path assumed to be called with the BKL in the old times.
1864         * Now we have inherited the big reiserfs lock from it and many
1865         * reiserfs helpers called in the mount path and elsewhere require
1866         * this lock to be held even if it's not always necessary. Let's be
1867         * conservative and hold it early. The window can be reduced after
1868         * careful review of the code.
1869         */
1870        reiserfs_write_lock(s);
1871
1872        if (root_inode->i_state & I_NEW) {
1873                reiserfs_read_locked_inode(root_inode, &args);
1874                unlock_new_inode(root_inode);
1875        }
1876
1877        s->s_root = d_alloc_root(root_inode);
1878        if (!s->s_root) {
1879                iput(root_inode);
1880                goto error;
1881        }
1882        // define and initialize hash function
1883        sbi->s_hash_function = hash_function(s);
1884        if (sbi->s_hash_function == NULL) {
1885                dput(s->s_root);
1886                s->s_root = NULL;
1887                goto error;
1888        }
1889
1890        if (is_reiserfs_3_5(rs)
1891            || (is_reiserfs_jr(rs) && SB_VERSION(s) == REISERFS_VERSION_1))
1892                set_bit(REISERFS_3_5, &(sbi->s_properties));
1893        else if (old_format)
1894                set_bit(REISERFS_OLD_FORMAT, &(sbi->s_properties));
1895        else
1896                set_bit(REISERFS_3_6, &(sbi->s_properties));
1897
1898        if (!(s->s_flags & MS_RDONLY)) {
1899
1900                errval = journal_begin(&th, s, 1);
1901                if (errval) {
1902                        dput(s->s_root);
1903                        s->s_root = NULL;
1904                        goto error;
1905                }
1906                reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
1907
1908                set_sb_umount_state(rs, REISERFS_ERROR_FS);
1909                set_sb_fs_state(rs, 0);
1910
1911                /* Clear out s_bmap_nr if it would wrap. We can handle this
1912                 * case, but older revisions can't. This will cause the
1913                 * file system to fail mount on those older implementations,
1914                 * avoiding corruption. -jeffm */
1915                if (bmap_would_wrap(reiserfs_bmap_count(s)) &&
1916                    sb_bmap_nr(rs) != 0) {
1917                        reiserfs_warning(s, "super-2030", "This file system "
1918                                        "claims to use %u bitmap blocks in "
1919                                        "its super block, but requires %u. "
1920                                        "Clearing to zero.", sb_bmap_nr(rs),
1921                                        reiserfs_bmap_count(s));
1922
1923                        set_sb_bmap_nr(rs, 0);
1924                }
1925
1926                if (old_format_only(s)) {
1927                        /* filesystem of format 3.5 either with standard or non-standard
1928                           journal */
1929                        if (convert_reiserfs(s)) {
1930                                /* and -o conv is given */
1931                                if (!silent)
1932                                        reiserfs_info(s,
1933                                                      "converting 3.5 filesystem to the 3.6 format");
1934
1935                                if (is_reiserfs_3_5(rs))
1936                                        /* put magic string of 3.6 format. 2.2 will not be able to
1937                                           mount this filesystem anymore */
1938                                        memcpy(rs->s_v1.s_magic,
1939                                               reiserfs_3_6_magic_string,
1940                                               sizeof
1941                                               (reiserfs_3_6_magic_string));
1942
1943                                set_sb_version(rs, REISERFS_VERSION_2);
1944                                reiserfs_convert_objectid_map_v1(s);
1945                                set_bit(REISERFS_3_6, &(sbi->s_properties));
1946                                clear_bit(REISERFS_3_5, &(sbi->s_properties));
1947                        } else if (!silent) {
1948                                reiserfs_info(s, "using 3.5.x disk format\n");
1949                        }
1950                } else
1951                        set_sb_mnt_count(rs, sb_mnt_count(rs) + 1);
1952
1953
1954                journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB(s));
1955                errval = journal_end(&th, s, 1);
1956                if (errval) {
1957                        dput(s->s_root);
1958                        s->s_root = NULL;
1959                        goto error;
1960                }
1961
1962                if ((errval = reiserfs_lookup_privroot(s)) ||
1963                    (errval = reiserfs_xattr_init(s, s->s_flags))) {
1964                        dput(s->s_root);
1965                        s->s_root = NULL;
1966                        goto error;
1967                }
1968
1969                /* look for files which were to be removed in previous session */
1970                finish_unfinished(s);
1971        } else {
1972                if (old_format_only(s) && !silent) {
1973                        reiserfs_info(s, "using 3.5.x disk format\n");
1974                }
1975
1976                if ((errval = reiserfs_lookup_privroot(s)) ||
1977                    (errval = reiserfs_xattr_init(s, s->s_flags))) {
1978                        dput(s->s_root);
1979                        s->s_root = NULL;
1980                        goto error;
1981                }
1982        }
1983        // mark hash in super block: it could be unset. overwrite should be ok
1984        set_sb_hash_function_code(rs, function2code(sbi->s_hash_function));
1985
1986        handle_attrs(s);
1987
1988        reiserfs_proc_info_init(s);
1989
1990        init_waitqueue_head(&(sbi->s_wait));
1991        spin_lock_init(&sbi->bitmap_lock);
1992
1993        reiserfs_write_unlock(s);
1994
1995        return (0);
1996
1997error:
1998        reiserfs_write_unlock(s);
1999
2000error_unlocked:
2001        /* kill the commit thread, free journal ram */
2002        if (jinit_done) {
2003                reiserfs_write_lock(s);
2004                journal_release_error(NULL, s);
2005                reiserfs_write_unlock(s);
2006        }
2007
2008        reiserfs_free_bitmap_cache(s);
2009        if (SB_BUFFER_WITH_SB(s))
2010                brelse(SB_BUFFER_WITH_SB(s));
2011#ifdef CONFIG_QUOTA
2012        {
2013                int j;
2014                for (j = 0; j < MAXQUOTAS; j++)
2015                        kfree(qf_names[j]);
2016        }
2017#endif
2018        kfree(sbi);
2019
2020        s->s_fs_info = NULL;
2021        return errval;
2022}
2023
2024static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf)
2025{
2026        struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(dentry->d_sb);
2027
2028        buf->f_namelen = (REISERFS_MAX_NAME(s->s_blocksize));
2029        buf->f_bfree = sb_free_blocks(rs);
2030        buf->f_bavail = buf->f_bfree;
2031        buf->f_blocks = sb_block_count(rs) - sb_bmap_nr(rs) - 1;
2032        buf->f_bsize = dentry->d_sb->s_blocksize;
2033        /* changed to accommodate gcc folks. */
2034        buf->f_type = REISERFS_SUPER_MAGIC;
2035        buf->f_fsid.val[0] = (u32)crc32_le(0, rs->s_uuid, sizeof(rs->s_uuid)/2);
2036        buf->f_fsid.val[1] = (u32)crc32_le(0, rs->s_uuid + sizeof(rs->s_uuid)/2,
2037                                sizeof(rs->s_uuid)/2);
2038
2039        return 0;
2040}
2041
2042#ifdef CONFIG_QUOTA
2043static int reiserfs_write_dquot(struct dquot *dquot)
2044{
2045        struct reiserfs_transaction_handle th;
2046        int ret, err;
2047
2048        reiserfs_write_lock(dquot->dq_sb);
2049        ret =
2050            journal_begin(&th, dquot->dq_sb,
2051                          REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb));
2052        if (ret)
2053                goto out;
2054        ret = dquot_commit(dquot);
2055        err =
2056            journal_end(&th, dquot->dq_sb,
2057                        REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb));
2058        if (!ret && err)
2059                ret = err;
2060      out:
2061        reiserfs_write_unlock(dquot->dq_sb);
2062        return ret;
2063}
2064
2065static int reiserfs_acquire_dquot(struct dquot *dquot)
2066{
2067        struct reiserfs_transaction_handle th;
2068        int ret, err;
2069
2070        reiserfs_write_lock(dquot->dq_sb);
2071        ret =
2072            journal_begin(&th, dquot->dq_sb,
2073                          REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb));
2074        if (ret)
2075                goto out;
2076        ret = dquot_acquire(dquot);
2077        err =
2078            journal_end(&th, dquot->dq_sb,
2079                        REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb));
2080        if (!ret && err)
2081                ret = err;
2082      out:
2083        reiserfs_write_unlock(dquot->dq_sb);
2084        return ret;
2085}
2086
2087static int reiserfs_release_dquot(struct dquot *dquot)
2088{
2089        struct reiserfs_transaction_handle th;
2090        int ret, err;
2091
2092        reiserfs_write_lock(dquot->dq_sb);
2093        ret =
2094            journal_begin(&th, dquot->dq_sb,
2095                          REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb));
2096        if (ret) {
2097                /* Release dquot anyway to avoid endless cycle in dqput() */
2098                dquot_release(dquot);
2099                goto out;
2100        }
2101        ret = dquot_release(dquot);
2102        err =
2103            journal_end(&th, dquot->dq_sb,
2104                        REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb));
2105        if (!ret && err)
2106                ret = err;
2107      out:
2108        reiserfs_write_unlock(dquot->dq_sb);
2109        return ret;
2110}
2111
2112static int reiserfs_mark_dquot_dirty(struct dquot *dquot)
2113{
2114        /* Are we journaling quotas? */
2115        if (REISERFS_SB(dquot->dq_sb)->s_qf_names[USRQUOTA] ||
2116            REISERFS_SB(dquot->dq_sb)->s_qf_names[GRPQUOTA]) {
2117                dquot_mark_dquot_dirty(dquot);
2118                return reiserfs_write_dquot(dquot);
2119        } else
2120                return dquot_mark_dquot_dirty(dquot);
2121}
2122
2123static int reiserfs_write_info(struct super_block *sb, int type)
2124{
2125        struct reiserfs_transaction_handle th;
2126        int ret, err;
2127
2128        /* Data block + inode block */
2129        reiserfs_write_lock(sb);
2130        ret = journal_begin(&th, sb, 2);
2131        if (ret)
2132                goto out;
2133        ret = dquot_commit_info(sb, type);
2134        err = journal_end(&th, sb, 2);
2135        if (!ret && err)
2136                ret = err;
2137      out:
2138        reiserfs_write_unlock(sb);
2139        return ret;
2140}
2141
2142/*
2143 * Turn on quotas during mount time - we need to find the quota file and such...
2144 */
2145static int reiserfs_quota_on_mount(struct super_block *sb, int type)
2146{
2147        return dquot_quota_on_mount(sb, REISERFS_SB(sb)->s_qf_names[type],
2148                                        REISERFS_SB(sb)->s_jquota_fmt, type);
2149}
2150
2151/*
2152 * Standard function to be called on quota_on
2153 */
2154static int reiserfs_quota_on(struct super_block *sb, int type, int format_id,
2155                             struct path *path)
2156{
2157        int err;
2158        struct inode *inode;
2159        struct reiserfs_transaction_handle th;
2160        int opt = type == USRQUOTA ? REISERFS_USRQUOTA : REISERFS_GRPQUOTA;
2161
2162        if (!(REISERFS_SB(sb)->s_mount_opt & (1 << opt)))
2163                return -EINVAL;
2164
2165        /* Quotafile not on the same filesystem? */
2166        if (path->dentry->d_sb != sb) {
2167                err = -EXDEV;
2168                goto out;
2169        }
2170        inode = path->dentry->d_inode;
2171        /* We must not pack tails for quota files on reiserfs for quota IO to work */
2172        if (!(REISERFS_I(inode)->i_flags & i_nopack_mask)) {
2173                err = reiserfs_unpack(inode, NULL);
2174                if (err) {
2175                        reiserfs_warning(sb, "super-6520",
2176                                "Unpacking tail of quota file failed"
2177                                " (%d). Cannot turn on quotas.", err);
2178                        err = -EINVAL;
2179                        goto out;
2180                }
2181                mark_inode_dirty(inode);
2182        }
2183        /* Journaling quota? */
2184        if (REISERFS_SB(sb)->s_qf_names[type]) {
2185                /* Quotafile not of fs root? */
2186                if (path->dentry->d_parent != sb->s_root)
2187                        reiserfs_warning(sb, "super-6521",
2188                                 "Quota file not on filesystem root. "
2189                                 "Journalled quota will not work.");
2190        }
2191
2192        /*
2193         * When we journal data on quota file, we have to flush journal to see
2194         * all updates to the file when we bypass pagecache...
2195         */
2196        if (reiserfs_file_data_log(inode)) {
2197                /* Just start temporary transaction and finish it */
2198                err = journal_begin(&th, sb, 1);
2199                if (err)
2200                        goto out;
2201                err = journal_end_sync(&th, sb, 1);
2202                if (err)
2203                        goto out;
2204        }
2205        err = dquot_quota_on(sb, type, format_id, path);
2206out:
2207        return err;
2208}
2209
2210/* Read data from quotafile - avoid pagecache and such because we cannot afford
2211 * acquiring the locks... As quota files are never truncated and quota code
2212 * itself serializes the operations (and no one else should touch the files)
2213 * we don't have to be afraid of races */
2214static ssize_t reiserfs_quota_read(struct super_block *sb, int type, char *data,
2215                                   size_t len, loff_t off)
2216{
2217        struct inode *inode = sb_dqopt(sb)->files[type];
2218        unsigned long blk = off >> sb->s_blocksize_bits;
2219        int err = 0, offset = off & (sb->s_blocksize - 1), tocopy;
2220        size_t toread;
2221        struct buffer_head tmp_bh, *bh;
2222        loff_t i_size = i_size_read(inode);
2223
2224        if (off > i_size)
2225                return 0;
2226        if (off + len > i_size)
2227                len = i_size - off;
2228        toread = len;
2229        while (toread > 0) {
2230                tocopy =
2231                    sb->s_blocksize - offset <
2232                    toread ? sb->s_blocksize - offset : toread;
2233                tmp_bh.b_state = 0;
2234                /* Quota files are without tails so we can safely use this function */
2235                reiserfs_write_lock(sb);
2236                err = reiserfs_get_block(inode, blk, &tmp_bh, 0);
2237                reiserfs_write_unlock(sb);
2238                if (err)
2239                        return err;
2240                if (!buffer_mapped(&tmp_bh))    /* A hole? */
2241                        memset(data, 0, tocopy);
2242                else {
2243                        bh = sb_bread(sb, tmp_bh.b_blocknr);
2244                        if (!bh)
2245                                return -EIO;
2246                        memcpy(data, bh->b_data + offset, tocopy);
2247                        brelse(bh);
2248                }
2249                offset = 0;
2250                toread -= tocopy;
2251                data += tocopy;
2252                blk++;
2253        }
2254        return len;
2255}
2256
2257/* Write to quotafile (we know the transaction is already started and has
2258 * enough credits) */
2259static ssize_t reiserfs_quota_write(struct super_block *sb, int type,
2260                                    const char *data, size_t len, loff_t off)
2261{
2262        struct inode *inode = sb_dqopt(sb)->files[type];
2263        unsigned long blk = off >> sb->s_blocksize_bits;
2264        int err = 0, offset = off & (sb->s_blocksize - 1), tocopy;
2265        int journal_quota = REISERFS_SB(sb)->s_qf_names[type] != NULL;
2266        size_t towrite = len;
2267        struct buffer_head tmp_bh, *bh;
2268
2269        if (!current->journal_info) {
2270                printk(KERN_WARNING "reiserfs: Quota write (off=%Lu, len=%Lu)"
2271                        " cancelled because transaction is not started.\n",
2272                        (unsigned long long)off, (unsigned long long)len);
2273                return -EIO;
2274        }
2275        mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA);
2276        while (towrite > 0) {
2277                tocopy = sb->s_blocksize - offset < towrite ?
2278                    sb->s_blocksize - offset : towrite;
2279                tmp_bh.b_state = 0;
2280                err = reiserfs_get_block(inode, blk, &tmp_bh, GET_BLOCK_CREATE);
2281                if (err)
2282                        goto out;
2283                if (offset || tocopy != sb->s_blocksize)
2284                        bh = sb_bread(sb, tmp_bh.b_blocknr);
2285                else
2286                        bh = sb_getblk(sb, tmp_bh.b_blocknr);
2287                if (!bh) {
2288                        err = -EIO;
2289                        goto out;
2290                }
2291                lock_buffer(bh);
2292                memcpy(bh->b_data + offset, data, tocopy);
2293                flush_dcache_page(bh->b_page);
2294                set_buffer_uptodate(bh);
2295                unlock_buffer(bh);
2296                reiserfs_prepare_for_journal(sb, bh, 1);
2297                journal_mark_dirty(current->journal_info, sb, bh);
2298                if (!journal_quota)
2299                        reiserfs_add_ordered_list(inode, bh);
2300                brelse(bh);
2301                offset = 0;
2302                towrite -= tocopy;
2303                data += tocopy;
2304                blk++;
2305        }
2306out:
2307        if (len == towrite) {
2308                mutex_unlock(&inode->i_mutex);
2309                return err;
2310        }
2311        if (inode->i_size < off + len - towrite)
2312                i_size_write(inode, off + len - towrite);
2313        inode->i_version++;
2314        inode->i_mtime = inode->i_ctime = CURRENT_TIME;
2315        mark_inode_dirty(inode);
2316        mutex_unlock(&inode->i_mutex);
2317        return len - towrite;
2318}
2319
2320#endif
2321
2322static struct dentry *get_super_block(struct file_system_type *fs_type,
2323                           int flags, const char *dev_name,
2324                           void *data)
2325{
2326        return mount_bdev(fs_type, flags, dev_name, data, reiserfs_fill_super);
2327}
2328
2329static int __init init_reiserfs_fs(void)
2330{
2331        int ret;
2332
2333        if ((ret = init_inodecache())) {
2334                return ret;
2335        }
2336
2337        reiserfs_proc_info_global_init();
2338
2339        ret = register_filesystem(&reiserfs_fs_type);
2340
2341        if (ret == 0) {
2342                return 0;
2343        }
2344
2345        reiserfs_proc_info_global_done();
2346        destroy_inodecache();
2347
2348        return ret;
2349}
2350
2351static void __exit exit_reiserfs_fs(void)
2352{
2353        reiserfs_proc_info_global_done();
2354        unregister_filesystem(&reiserfs_fs_type);
2355        destroy_inodecache();
2356}
2357
2358struct file_system_type reiserfs_fs_type = {
2359        .owner = THIS_MODULE,
2360        .name = "reiserfs",
2361        .mount = get_super_block,
2362        .kill_sb = reiserfs_kill_sb,
2363        .fs_flags = FS_REQUIRES_DEV,
2364};
2365
2366MODULE_DESCRIPTION("ReiserFS journaled filesystem");
2367MODULE_AUTHOR("Hans Reiser <reiser@namesys.com>");
2368MODULE_LICENSE("GPL");
2369
2370module_init(init_reiserfs_fs);
2371module_exit(exit_reiserfs_fs);
2372