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