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