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