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