super.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:41k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 2000-2002 by Hans Reiser, licensing governed by reiserfs/README
  3.  */
  4. #include <linux/config.h>
  5. #include <linux/module.h>
  6. #include <linux/sched.h>
  7. #include <linux/vmalloc.h>
  8. #include <asm/uaccess.h>
  9. #include <linux/reiserfs_fs.h>
  10. #include <linux/smp_lock.h>
  11. #include <linux/locks.h>
  12. #include <linux/init.h>
  13. #define REISERFS_OLD_BLOCKSIZE 4096
  14. #define REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ 20
  15. char reiserfs_super_magic_string[] = REISERFS_SUPER_MAGIC_STRING;
  16. char reiser2fs_super_magic_string[] = REISER2FS_SUPER_MAGIC_STRING;
  17. static int reiserfs_remount (struct super_block * s, int * flags, char * data);
  18. static int reiserfs_statfs (struct super_block * s, struct statfs * buf);
  19. static void reiserfs_write_super (struct super_block * s)
  20. {
  21.   int dirty = 0 ;
  22.   lock_kernel() ;
  23.   if (!(s->s_flags & MS_RDONLY)) {
  24.     dirty = flush_old_commits(s, 1) ;
  25.   }
  26.   s->s_dirt = dirty;
  27.   unlock_kernel() ;
  28. }
  29. static void reiserfs_write_super_lockfs (struct super_block * s)
  30. {
  31.   int dirty = 0 ;
  32.   struct reiserfs_transaction_handle th ;
  33.   lock_kernel() ;
  34.   if (!(s->s_flags & MS_RDONLY)) {
  35.     journal_begin(&th, s, 1) ;
  36.     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
  37.     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
  38.     reiserfs_block_writes(&th) ;
  39.     journal_end(&th, s, 1) ;
  40.   }
  41.   s->s_dirt = dirty;
  42.   unlock_kernel() ;
  43. }
  44. void reiserfs_unlockfs(struct super_block *s) {
  45.   reiserfs_allow_writes(s) ;
  46. }
  47. extern const struct key  MAX_KEY;
  48. /* this is used to delete "save link" when there are no items of a
  49.    file it points to. It can either happen if unlink is completed but
  50.    "save unlink" removal, or if file has both unlink and truncate
  51.    pending and as unlink completes first (because key of "save link"
  52.    protecting unlink is bigger that a key lf "save link" which
  53.    protects truncate), so there left no items to make truncate
  54.    completion on */
  55. static void remove_save_link_only (struct super_block * s, struct key * key, int oid_free)
  56. {
  57.     struct reiserfs_transaction_handle th;
  58.      /* we are going to do one balancing */
  59.      journal_begin (&th, s, JOURNAL_PER_BALANCE_CNT);
  60.  
  61.      reiserfs_delete_solid_item (&th, key);
  62.      if (oid_free)
  63.         /* removals are protected by direct items */
  64.         reiserfs_release_objectid (&th, le32_to_cpu (key->k_objectid));
  65.      journal_end (&th, s, JOURNAL_PER_BALANCE_CNT);
  66. }
  67.  
  68.  
  69. /* look for uncompleted unlinks and truncates and complete them */
  70. static void finish_unfinished (struct super_block * s)
  71. {
  72.     INITIALIZE_PATH (path);
  73.     struct cpu_key max_cpu_key, obj_key;
  74.     struct key save_link_key;
  75.     int retval;
  76.     struct item_head * ih;
  77.     struct buffer_head * bh;
  78.     int item_pos;
  79.     char * item;
  80.     int done;
  81.     struct inode * inode;
  82.     int truncate;
  83.  
  84.  
  85.     /* compose key to look for "save" links */
  86.     max_cpu_key.version = KEY_FORMAT_3_5;
  87.     max_cpu_key.on_disk_key = MAX_KEY;
  88.     max_cpu_key.key_length = 3;
  89.  
  90.     done = 0;
  91.     s -> u.reiserfs_sb.s_is_unlinked_ok = 1;
  92.     while (1) {
  93.         retval = search_item (s, &max_cpu_key, &path);
  94.         if (retval != ITEM_NOT_FOUND) {
  95.             reiserfs_warning ("vs-2140: finish_unfinished: search_by_key returned %dn",
  96.                               retval);
  97.             break;
  98.         }
  99.         
  100.         bh = get_last_bh (&path);
  101.         item_pos = get_item_pos (&path);
  102.         if (item_pos != B_NR_ITEMS (bh)) {
  103.             reiserfs_warning ("vs-2060: finish_unfinished: wrong position foundn");
  104.             break;
  105.         }
  106.         item_pos --;
  107.         ih = B_N_PITEM_HEAD (bh, item_pos);
  108.  
  109.         if (le32_to_cpu (ih->ih_key.k_dir_id) != MAX_KEY_OBJECTID)
  110.             /* there are no "save" links anymore */
  111.             break;
  112.  
  113.         save_link_key = ih->ih_key;
  114.         if (is_indirect_le_ih (ih))
  115.             truncate = 1;
  116.         else
  117.             truncate = 0;
  118.  
  119.         /* reiserfs_iget needs k_dirid and k_objectid only */
  120.         item = B_I_PITEM (bh, ih);
  121.         obj_key.on_disk_key.k_dir_id = le32_to_cpu (*(__u32 *)item);
  122.         obj_key.on_disk_key.k_objectid = le32_to_cpu (ih->ih_key.k_objectid);
  123. obj_key.on_disk_key.u.k_offset_v1.k_offset = 0;
  124. obj_key.on_disk_key.u.k_offset_v1.k_uniqueness = 0;
  125.         pathrelse (&path);
  126.  
  127.         inode = reiserfs_iget (s, &obj_key);
  128.         if (!inode) {
  129.             /* the unlink almost completed, it just did not manage to remove
  130.        "save" link and release objectid */
  131.             reiserfs_warning ("vs-2180: finish_unfinished: iget failed for %Kn",
  132.                               &obj_key);
  133.             remove_save_link_only (s, &save_link_key, 1);
  134.             continue;
  135.         }
  136. if (!truncate && inode->i_nlink) {
  137.     /* file is not unlinked */
  138.             reiserfs_warning ("vs-2185: finish_unfinished: file %K is not unlinkedn",
  139.                               &obj_key);
  140.             remove_save_link_only (s, &save_link_key, 0);
  141.             continue;
  142. }
  143. if (truncate && S_ISDIR (inode->i_mode) ) {
  144.     /* We got a truncate request for a dir which is impossible.
  145.        The only imaginable way is to execute unfinished truncate request
  146.        then boot into old kernel, remove the file and create dir with
  147.        the same key. */
  148.     reiserfs_warning("green-2101: impossible truncate on a directory %k. Please reportn", INODE_PKEY (inode));
  149.     remove_save_link_only (s, &save_link_key, 0);
  150.     truncate = 0;
  151.     iput (inode); 
  152.     continue;
  153. }
  154.  
  155.         if (truncate) {
  156.             inode -> u.reiserfs_i.i_flags |= i_link_saved_truncate_mask;
  157.             /* not completed truncate found. New size was committed together
  158.        with "save" link */
  159.             reiserfs_warning ("Truncating %k to %Ld ..",
  160.                               INODE_PKEY (inode), inode->i_size);
  161.             reiserfs_truncate_file (inode, 0/*don't update modification time*/);
  162.             remove_save_link (inode, truncate);
  163.         } else {
  164.             inode -> u.reiserfs_i.i_flags |= i_link_saved_unlink_mask;
  165.             /* not completed unlink (rmdir) found */
  166.             reiserfs_warning ("Removing %k..", INODE_PKEY (inode));
  167.             /* removal gets completed in iput */
  168.         }
  169.  
  170.         iput (inode);
  171.         printk ("donen");
  172.         done ++;
  173.     }
  174.     s -> u.reiserfs_sb.s_is_unlinked_ok = 0;
  175.      
  176.     pathrelse (&path);
  177.     if (done)
  178.         reiserfs_warning ("There were %d uncompleted unlinks/truncates. "
  179.                           "Completedn", done);
  180. }
  181.  
  182. /* to protect file being unlinked from getting lost we "safe" link files
  183.    being unlinked. This link will be deleted in the same transaction with last
  184.    item of file. mounting the filesytem we scan all these links and remove
  185.    files which almost got lost */
  186. void add_save_link (struct reiserfs_transaction_handle * th,
  187.     struct inode * inode, int truncate)
  188. {
  189.     INITIALIZE_PATH (path);
  190.     int retval;
  191.     struct cpu_key key;
  192.     struct item_head ih;
  193.     __u32 link;
  194.     /* file can only get one "save link" of each kind */
  195.     RFALSE( truncate && 
  196.     ( inode -> u.reiserfs_i.i_flags & i_link_saved_truncate_mask ),
  197.     "saved link already exists for truncated inode %lx",
  198.     ( long ) inode -> i_ino );
  199.     RFALSE( !truncate && 
  200.     ( inode -> u.reiserfs_i.i_flags & i_link_saved_unlink_mask ),
  201.     "saved link already exists for unlinked inode %lx",
  202.     ( long ) inode -> i_ino );
  203.     /* setup key of "save" link */
  204.     key.version = KEY_FORMAT_3_5;
  205.     key.on_disk_key.k_dir_id = MAX_KEY_OBJECTID;
  206.     key.on_disk_key.k_objectid = inode->i_ino;
  207.     if (!truncate) {
  208. /* unlink, rmdir, rename */
  209. set_cpu_key_k_offset (&key, 1 + inode->i_sb->s_blocksize);
  210. set_cpu_key_k_type (&key, TYPE_DIRECT);
  211. /* item head of "safe" link */
  212. make_le_item_head (&ih, &key, key.version, 1 + inode->i_sb->s_blocksize, TYPE_DIRECT,
  213.    4/*length*/, 0xffff/*free space*/);
  214.     } else {
  215. /* truncate */
  216. if (S_ISDIR (inode->i_mode))
  217.     reiserfs_warning("green-2102: Adding a truncate savelink for a directory %k! Please reportn", INODE_PKEY(inode));
  218. set_cpu_key_k_offset (&key, 1);
  219. set_cpu_key_k_type (&key, TYPE_INDIRECT);
  220. /* item head of "safe" link */
  221. make_le_item_head (&ih, &key, key.version, 1, TYPE_INDIRECT,
  222.    4/*length*/, 0/*free space*/);
  223.     }
  224.     key.key_length = 3;
  225.     /* look for its place in the tree */
  226.     retval = search_item (inode->i_sb, &key, &path);
  227.     if (retval != ITEM_NOT_FOUND) {
  228. if ( retval != -ENOSPC )
  229.     reiserfs_warning ("vs-2100: add_save_link:"
  230.   "search_by_key (%K) returned %dn", &key, retval);
  231. pathrelse (&path);
  232. return;
  233.     }
  234.     /* body of "save" link */
  235.     link = cpu_to_le32 (INODE_PKEY (inode)->k_dir_id);
  236.     /* put "save" link inot tree */
  237.     retval = reiserfs_insert_item (th, &path, &key, &ih, (char *)&link);
  238.     if (retval) {
  239. if (retval != -ENOSPC)
  240.     reiserfs_warning ("vs-2120: add_save_link: insert_item returned %dn",
  241.   retval);
  242.     } else {
  243. if( truncate )
  244.     inode -> u.reiserfs_i.i_flags |= i_link_saved_truncate_mask;
  245. else
  246.     inode -> u.reiserfs_i.i_flags |= i_link_saved_unlink_mask;
  247.     }
  248. }
  249. /* this opens transaction unlike add_save_link */
  250. void remove_save_link (struct inode * inode, int truncate)
  251. {
  252.     struct reiserfs_transaction_handle th;
  253.     struct key key;
  254.  
  255.  
  256.     /* we are going to do one balancing only */
  257.     journal_begin (&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT);
  258.  
  259.     /* setup key of "save" link */
  260.     key.k_dir_id = cpu_to_le32 (MAX_KEY_OBJECTID);
  261.     key.k_objectid = INODE_PKEY (inode)->k_objectid;
  262.     if (!truncate) {
  263.         /* unlink, rmdir, rename */
  264.         set_le_key_k_offset (KEY_FORMAT_3_5, &key,
  265.      1 + inode->i_sb->s_blocksize);
  266.         set_le_key_k_type (KEY_FORMAT_3_5, &key, TYPE_DIRECT);
  267.     } else {
  268.         /* truncate */
  269.         set_le_key_k_offset (KEY_FORMAT_3_5, &key, 1);
  270.         set_le_key_k_type (KEY_FORMAT_3_5, &key, TYPE_INDIRECT);
  271.     }
  272.  
  273.     if( ( truncate && 
  274.           ( inode -> u.reiserfs_i.i_flags & i_link_saved_truncate_mask ) ) ||
  275.         ( !truncate && 
  276.           ( inode -> u.reiserfs_i.i_flags & i_link_saved_unlink_mask ) ) )
  277. reiserfs_delete_solid_item (&th, &key);
  278.     if (!truncate) {
  279. reiserfs_release_objectid (&th, inode->i_ino);
  280. inode -> u.reiserfs_i.i_flags &= ~i_link_saved_unlink_mask;
  281.     } else
  282. inode -> u.reiserfs_i.i_flags &= ~i_link_saved_truncate_mask;
  283.  
  284.     journal_end (&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT);
  285. }
  286. static void reiserfs_put_super (struct super_block * s)
  287. {
  288.   int i;
  289.   struct reiserfs_transaction_handle th ;
  290.   
  291.   /* change file system state to current state if it was mounted with read-write permissions */
  292.   if (!(s->s_flags & MS_RDONLY)) {
  293.     journal_begin(&th, s, 10) ;
  294.     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
  295.     set_sb_state( SB_DISK_SUPER_BLOCK(s), s->u.reiserfs_sb.s_mount_state );
  296.     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
  297.   }
  298.   /* note, journal_release checks for readonly mount, and can decide not
  299.   ** to do a journal_end
  300.   */
  301.   journal_release(&th, s) ;
  302.   for (i = 0; i < SB_BMAP_NR (s); i ++)
  303.     brelse (SB_AP_BITMAP (s)[i].bh);
  304.   vfree (SB_AP_BITMAP (s));
  305.   brelse (SB_BUFFER_WITH_SB (s));
  306.   print_statistics (s);
  307.   if (s->u.reiserfs_sb.s_kmallocs != 0) {
  308.     reiserfs_warning ("vs-2004: reiserfs_put_super: allocated memory left %dn",
  309.       s->u.reiserfs_sb.s_kmallocs);
  310.   }
  311.   if (s->u.reiserfs_sb.reserved_blocks != 0) {
  312.     reiserfs_warning ("green-2005: reiserfs_put_super: reserved blocks left %dn",
  313.       s->u.reiserfs_sb.reserved_blocks);
  314.   }
  315.   reiserfs_proc_unregister( s, "journal" );
  316.   reiserfs_proc_unregister( s, "oidmap" );
  317.   reiserfs_proc_unregister( s, "on-disk-super" );
  318.   reiserfs_proc_unregister( s, "bitmap" );
  319.   reiserfs_proc_unregister( s, "per-level" );
  320.   reiserfs_proc_unregister( s, "super" );
  321.   reiserfs_proc_unregister( s, "version" );
  322.   reiserfs_proc_info_done( s );
  323.   return;
  324. }
  325. /* we don't mark inodes dirty, we just log them */
  326. static void reiserfs_dirty_inode (struct inode * inode) {
  327.     struct reiserfs_transaction_handle th ;
  328.     if (inode->i_sb->s_flags & MS_RDONLY) {
  329.         reiserfs_warning("clm-6006: writing inode %lu on readonly FSn", 
  330.                   inode->i_ino) ;
  331.         return ;
  332.     }
  333.     lock_kernel() ;
  334.     /* this is really only used for atime updates, so they don't have
  335.     ** to be included in O_SYNC or fsync
  336.     */
  337.     journal_begin(&th, inode->i_sb, 1) ;
  338.     reiserfs_update_sd (&th, inode);
  339.     journal_end(&th, inode->i_sb, 1) ;
  340.     unlock_kernel() ;
  341. }
  342. struct super_operations reiserfs_sops = 
  343. {
  344.   read_inode: reiserfs_read_inode,
  345.   read_inode2: reiserfs_read_inode2,
  346.   write_inode: reiserfs_write_inode,
  347.   dirty_inode: reiserfs_dirty_inode,
  348.   delete_inode: reiserfs_delete_inode,
  349.   put_super: reiserfs_put_super,
  350.   write_super: reiserfs_write_super,
  351.   write_super_lockfs: reiserfs_write_super_lockfs,
  352.   unlockfs: reiserfs_unlockfs,
  353.   statfs: reiserfs_statfs,
  354.   remount_fs: reiserfs_remount,
  355.   fh_to_dentry: reiserfs_fh_to_dentry,
  356.   dentry_to_fh: reiserfs_dentry_to_fh,
  357. };
  358. /* this struct is used in reiserfs_getopt () for containing the value for those
  359.    mount options that have values rather than being toggles. */
  360. typedef struct {
  361.     char * value;
  362.     int bitmask; /* bit which is to be set in mount_options bitmask when this
  363.                     value is found, 0 is no bits are to be set */
  364. } arg_desc_t;
  365. /* this struct is used in reiserfs_getopt() for describing the set of reiserfs
  366.    mount options */
  367. typedef struct {
  368.     char * option_name;
  369.     int arg_required; /* 0 is argument is not required, not 0 otherwise */
  370.     const arg_desc_t * values; /* list of values accepted by an option */
  371.     int bitmask;  /* bit which is to be set in mount_options bitmask when this
  372.      option is selected, 0 is not bits are to be set */
  373. } opt_desc_t;
  374. /* possible values for "-o hash=" and bits which are to be set in s_mount_opt
  375.    of reiserfs specific part of in-core super block */
  376. const arg_desc_t hash[] = {
  377.     {"rupasov", FORCE_RUPASOV_HASH},
  378.     {"tea", FORCE_TEA_HASH},
  379.     {"r5", FORCE_R5_HASH},
  380.     {"detect", FORCE_HASH_DETECT},
  381.     {NULL, 0}
  382. };
  383. /* possible values for "-o block-allocator=" and bits which are to be set in
  384.    s_mount_opt of reiserfs specific part of in-core super block */
  385. const arg_desc_t balloc[] = {
  386.     {"noborder", REISERFS_NO_BORDER},
  387.     {"no_unhashed_relocation", REISERFS_NO_UNHASHED_RELOCATION},
  388.     {"hashed_relocation", REISERFS_HASHED_RELOCATION},
  389.     {"test4", REISERFS_TEST4},
  390.     {NULL, 0}
  391. };
  392. const arg_desc_t tails[] = {
  393.     {"on", REISERFS_LARGETAIL},
  394.     {"off", -1},
  395.     {"small", REISERFS_SMALLTAIL},
  396.     {NULL, 0}
  397. };
  398. /* proceed only one option from a list *cur - string containing of mount options
  399.    opts - array of options which are accepted
  400.    opt_arg - if option is found and requires an argument and if it is specifed
  401.    in the input - pointer to the argument is stored here
  402.    bit_flags - if option requires to set a certain bit - it is set here
  403.    return -1 if unknown option is found, opt->arg_required otherwise */
  404. static int reiserfs_getopt ( struct super_block * s, char ** cur, opt_desc_t * opts, char ** opt_arg,
  405.     unsigned long * bit_flags)
  406. {
  407.     char * p;
  408.     /* foo=bar, 
  409.        ^   ^  ^
  410.        |   |  +-- option_end
  411.        |   +-- arg_start
  412.        +-- option_start
  413.     */
  414.     const opt_desc_t * opt;
  415.     const arg_desc_t * arg;
  416.     
  417.     
  418.     p = *cur;
  419.     
  420.     /* assume argument cannot contain commas */
  421.     *cur = strchr (p, ',');
  422.     if (*cur) {
  423. *(*cur) = '';
  424. (*cur) ++;
  425.     }
  426.     if ( !strncmp (p, "alloc=", 6) ) {
  427. /* Ugly special case, probably we should redo options parser so that
  428.    it can understand several arguments for some options, also so that
  429.    it can fill several bitfields with option values. */
  430. reiserfs_parse_alloc_options( s, p + 6);
  431. return 0;
  432.     }
  433.     /* for every option in the list */
  434.     for (opt = opts; opt->option_name; opt ++) {
  435. if (!strncmp (p, opt->option_name, strlen (opt->option_name))) {
  436.     if (bit_flags && opt->bitmask != -1 )
  437. set_bit (opt->bitmask, bit_flags);
  438.     break;
  439. }
  440.     }
  441.     if (!opt->option_name) {
  442. printk ("reiserfs_getopt: unknown option "%s"n", p);
  443. return -1;
  444.     }
  445.     
  446.     p += strlen (opt->option_name);
  447.     switch (*p) {
  448.     case '=':
  449. if (!opt->arg_required) {
  450.     printk ("reiserfs_getopt: the option "%s" does not require an argumentn",
  451.     opt->option_name);
  452.     return -1;
  453. }
  454. break;
  455.     case 0:
  456. if (opt->arg_required) {
  457.     printk ("reiserfs_getopt: the option "%s" requires an argumentn", opt->option_name);
  458.     return -1;
  459. }
  460. break;
  461.     default:
  462. printk ("reiserfs_getopt: head of option "%s" is only correctn", opt->option_name);
  463. return -1;
  464.     }
  465.     /* move to the argument, or to next option if argument is not required */
  466.     p ++;
  467.     
  468.     if ( opt->arg_required && !strlen (p) ) {
  469. /* this catches "option=," */
  470. printk ("reiserfs_getopt: empty argument for "%s"n", opt->option_name);
  471. return -1;
  472.     }
  473.     
  474.     if (!opt->values) {
  475. /* *opt_arg contains pointer to argument */
  476. *opt_arg = p;
  477. return opt->arg_required;
  478.     }
  479.     
  480.     /* values possible for this option are listed in opt->values */
  481.     for (arg = opt->values; arg->value; arg ++) {
  482. if (!strcmp (p, arg->value)) {
  483.     if (bit_flags && arg->bitmask != -1 )
  484. set_bit (arg->bitmask, bit_flags);
  485.     return opt->arg_required;
  486. }
  487.     }
  488.     
  489.     printk ("reiserfs_getopt: bad value "%s" for option "%s"n", p, opt->option_name);
  490.     return -1;
  491. }
  492. /* returns 0 if something is wrong in option string, 1 - otherwise */
  493. static int reiserfs_parse_options (struct super_block * s, char * options, /* string given via mount's -o */
  494.    unsigned long * mount_options,
  495.    /* after the parsing phase, contains the
  496.       collection of bitflags defining what
  497.       mount options were selected. */
  498.    unsigned long * blocks) /* strtol-ed from NNN of resize=NNN */
  499. {
  500.     int c;
  501.     char * arg = NULL;
  502.     char * pos;
  503.     opt_desc_t opts[] = {
  504. {"tails", 't', tails, -1},
  505. {"notail", 0, 0, -1}, /* Compatibility stuff, so that -o notail for old setups still work */
  506. {"conv", 0, 0, REISERFS_CONVERT}, 
  507. {"nolog", 0, 0, -1},
  508. {"replayonly", 0, 0, REPLAYONLY},
  509. {"block-allocator", 'a', balloc, -1}, 
  510. {"hash", 'h', hash, FORCE_HASH_DETECT},
  511. {"resize", 'r', 0, -1},
  512. {"attrs", 0, 0, REISERFS_ATTRS},
  513. {NULL, 0, 0, 0}
  514.     };
  515.     *blocks = 0;
  516.     if (!options || !*options)
  517. /* use default configuration: create tails, journaling on, no
  518.    conversion to newest format */
  519. return 1;
  520.     else
  521. /* Drop defaults to zeroes */
  522. *mount_options = 0;
  523.     
  524.     for (pos = options; pos; ) {
  525. c = reiserfs_getopt (s, &pos, opts, &arg, mount_options);
  526. if (c == -1)
  527.     /* wrong option is given */
  528.     return 0;
  529. if (c == 'r') {
  530.     char * p;
  531.     
  532.     p = 0;
  533.     /* "resize=NNN" */
  534.     *blocks = simple_strtoul (arg, &p, 0);
  535.     if (*p != '') {
  536. /* NNN does not look like a number */
  537. printk ("reiserfs_parse_options: bad value %sn", arg);
  538. return 0;
  539.     }
  540. }
  541.     }
  542.     
  543.     return 1;
  544. }
  545. int reiserfs_is_super(struct super_block *s) {
  546.    return (s->s_dev != 0 && s->s_op == &reiserfs_sops) ;
  547. }
  548. static void handle_attrs( struct super_block *s )
  549. {
  550. struct reiserfs_super_block * rs;
  551. if( reiserfs_attrs( s ) ) {
  552. rs = SB_DISK_SUPER_BLOCK (s);
  553. if( old_format_only(s) ) {
  554. reiserfs_warning( "reiserfs: cannot support attributes on 3.5.x disk formatn" );
  555. s -> u.reiserfs_sb.s_mount_opt &= ~ ( 1 << REISERFS_ATTRS );
  556. return;
  557. }
  558. if( !( le32_to_cpu( rs -> s_flags ) & reiserfs_attrs_cleared ) ) {
  559. reiserfs_warning( "reiserfs: cannot support attributes until flag is set in super-blockn" );
  560. s -> u.reiserfs_sb.s_mount_opt &= ~ ( 1 << REISERFS_ATTRS );
  561. }
  562. }
  563. }
  564. static int reiserfs_remount (struct super_block * s, int * mount_flags, char * data)
  565. {
  566.   struct reiserfs_super_block * rs;
  567.   struct reiserfs_transaction_handle th ;
  568.   unsigned long blocks;
  569.   unsigned long mount_options = 0;
  570.   rs = SB_DISK_SUPER_BLOCK (s);
  571.   if (!reiserfs_parse_options(s, data, &mount_options, &blocks))
  572.    return 0;
  573. #define SET_OPT( opt, bits, super )
  574.     if( ( bits ) & ( 1 << ( opt ) ) )
  575.     ( super ) -> u.reiserfs_sb.s_mount_opt |= ( 1 << ( opt ) )
  576.   /* set options in the super-block bitmask */
  577.   SET_OPT( REISERFS_SMALLTAIL, mount_options, s );
  578.   SET_OPT( REISERFS_LARGETAIL, mount_options, s );
  579.   SET_OPT( REISERFS_NO_BORDER, mount_options, s );
  580.   SET_OPT( REISERFS_NO_UNHASHED_RELOCATION, mount_options, s );
  581.   SET_OPT( REISERFS_HASHED_RELOCATION, mount_options, s );
  582.   SET_OPT( REISERFS_TEST4, mount_options, s );
  583.   SET_OPT( REISERFS_ATTRS, mount_options, s );
  584. #undef SET_OPT
  585.   handle_attrs( s );
  586.   if(blocks) {
  587.       int rc = reiserfs_resize(s, blocks);
  588.       if (rc != 0)
  589.   return rc;
  590.   }
  591.   if (*mount_flags & MS_RDONLY) {
  592.     /* remount read-only */
  593.     if (s->s_flags & MS_RDONLY)
  594.       /* it is read-only already */
  595.       return 0;
  596.     /* try to remount file system with read-only permissions */
  597.     if (sb_state(rs) == REISERFS_VALID_FS || s->u.reiserfs_sb.s_mount_state != REISERFS_VALID_FS) {
  598.       return 0;
  599.     }
  600.     journal_begin(&th, s, 10) ;
  601.     /* Mounting a rw partition read-only. */
  602.     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
  603.     set_sb_state( rs, s->u.reiserfs_sb.s_mount_state );
  604.     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
  605.     s->s_dirt = 0;
  606.   } else {
  607.     /* remount read-write */
  608.     if (!(s->s_flags & MS_RDONLY))
  609. return 0; /* We are read-write already */
  610.     s->u.reiserfs_sb.s_mount_state = sb_state(rs) ;
  611.     s->s_flags &= ~MS_RDONLY ; /* now it is safe to call journal_begin */
  612.     journal_begin(&th, s, 10) ;
  613.     
  614.     /* Mount a partition which is read-only, read-write */
  615.     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
  616.     s->u.reiserfs_sb.s_mount_state = sb_state(rs);
  617.     s->s_flags &= ~MS_RDONLY;
  618.     set_sb_state( rs, REISERFS_ERROR_FS );
  619.     /* mark_buffer_dirty (SB_BUFFER_WITH_SB (s), 1); */
  620.     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
  621.     s->s_dirt = 0;
  622.     s->u.reiserfs_sb.s_mount_state = REISERFS_VALID_FS ;
  623.   }
  624.   /* this will force a full flush of all journal lists */
  625.   SB_JOURNAL(s)->j_must_wait = 1 ;
  626.   journal_end(&th, s, 10) ;
  627.   if (!( *mount_flags & MS_RDONLY ) )
  628.     finish_unfinished( s );
  629.   return 0;
  630. }
  631. /* load_bitmap_info_data - Sets up the reiserfs_bitmap_info structure from disk.
  632.  * @sb - superblock for this filesystem
  633.  * @bi - the bitmap info to be loaded. Requires that bi->bh is valid.
  634.  *
  635.  * This routine counts how many free bits there are, finding the first zero
  636.  * as a side effect. Could also be implemented as a loop of test_bit() calls, or
  637.  * a loop of find_first_zero_bit() calls. This implementation is similar to
  638.  * find_first_zero_bit(), but doesn't return after it finds the first bit.
  639.  * Should only be called on fs mount, but should be fairly efficient anyways.
  640.  *
  641.  * bi->first_zero_hint is considered unset if it == 0, since the bitmap itself
  642.  * will * invariably occupt block 0 represented in the bitmap. The only
  643.  * exception to this is when free_count also == 0, since there will be no
  644.  * free blocks at all.
  645.  */
  646. static void load_bitmap_info_data (struct super_block *sb,
  647.                                    struct reiserfs_bitmap_info *bi)
  648. {
  649.     unsigned long *cur = (unsigned long *)bi->bh->b_data;
  650.     while ((char *)cur < (bi->bh->b_data + sb->s_blocksize)) {
  651. /* No need to scan if all 0's or all 1's.
  652.  * Since we're only counting 0's, we can simply ignore all 1's */
  653. if (*cur == 0) {
  654.     if (bi->first_zero_hint == 0) {
  655. bi->first_zero_hint = ((char *)cur - bi->bh->b_data) << 3;
  656.     }
  657.     bi->free_count += sizeof ( unsigned long ) * 8;
  658. } else if (*cur != ~0L) {
  659.     int b;
  660.     for (b = 0; b < sizeof ( unsigned long ) * 8; b++) {
  661. if (!reiserfs_test_le_bit (b, cur)) {
  662.     bi->free_count ++;
  663.     if (bi->first_zero_hint == 0)
  664. bi->first_zero_hint =
  665. (((char *)cur - bi->bh->b_data) << 3) + b;
  666.     }
  667. }
  668.     }
  669. cur ++;
  670.     }
  671. #ifdef CONFIG_REISERFS_CHECK
  672. // This outputs a lot of unneded info on big FSes
  673. //    reiserfs_warning ("bitmap loaded from block %d: %d free blocksn",
  674. //       bi->bh->b_blocknr, bi->free_count);
  675. #endif
  676. }
  677. static int read_bitmaps (struct super_block * s)
  678. {
  679.     int i, bmp;
  680.     SB_AP_BITMAP (s) = vmalloc (sizeof (struct reiserfs_bitmap_info) * SB_BMAP_NR(s));
  681.     if (SB_AP_BITMAP (s) == 0)
  682.       return 1;
  683.     memset (SB_AP_BITMAP (s), 0, sizeof (struct reiserfs_bitmap_info) * SB_BMAP_NR(s));
  684.     for (i = 0, bmp = REISERFS_DISK_OFFSET_IN_BYTES / s->s_blocksize + 1;
  685.    i < SB_BMAP_NR(s); i++, bmp = s->s_blocksize * 8 * i) {
  686.       SB_AP_BITMAP (s)[i].bh = sb_getblk (s, bmp);
  687.       if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh))
  688. ll_rw_block(READ, 1, &SB_AP_BITMAP(s)[i].bh); 
  689.     }
  690.     for (i = 0; i < SB_BMAP_NR(s); i++) {
  691.       wait_on_buffer(SB_AP_BITMAP (s)[i].bh);
  692.       if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) {
  693. reiserfs_warning("sh-2029: reiserfs read_bitmaps: "
  694.  "bitmap block (#%lu) reading failedn",
  695.  SB_AP_BITMAP(s)[i].bh->b_blocknr);
  696. for (i = 0; i < SB_BMAP_NR(s); i++)
  697.   brelse(SB_AP_BITMAP(s)[i].bh);
  698. vfree(SB_AP_BITMAP(s));
  699. SB_AP_BITMAP(s) = NULL;
  700. return 1;
  701.       }
  702.       load_bitmap_info_data (s, SB_AP_BITMAP (s) + i);
  703.     }   
  704.     return 0;
  705. }
  706. static int read_old_bitmaps (struct super_block * s)
  707. {
  708.   int i ;
  709.   struct reiserfs_super_block * rs = SB_DISK_SUPER_BLOCK(s);
  710.   int bmp1 = (REISERFS_OLD_DISK_OFFSET_IN_BYTES / s->s_blocksize) + 1;  /* first of bitmap blocks */
  711.   /* read true bitmap */
  712.   SB_AP_BITMAP (s) = vmalloc (sizeof (struct reiserfs_buffer_info *) * sb_bmap_nr(rs));
  713.   if (SB_AP_BITMAP (s) == 0)
  714.     return 1;
  715.   memset (SB_AP_BITMAP (s), 0, sizeof (struct reiserfs_buffer_info *) * sb_bmap_nr(rs));
  716.   for (i = 0; i < sb_bmap_nr(rs); i ++) {
  717.     SB_AP_BITMAP (s)[i].bh = reiserfs_bread (s, bmp1 + i, s->s_blocksize);
  718.     if (!SB_AP_BITMAP (s)[i].bh)
  719.       return 1;
  720.     load_bitmap_info_data (s, SB_AP_BITMAP (s) + i);
  721.   }
  722.   return 0;
  723. }
  724. void check_bitmap (struct super_block * s)
  725. {
  726.   int i = 0;
  727.   int free = 0;
  728.   char * buf;
  729.   while (i < SB_BLOCK_COUNT (s)) {
  730.     buf = SB_AP_BITMAP (s)[i / (s->s_blocksize * 8)].bh->b_data;
  731.     if (!reiserfs_test_le_bit (i % (s->s_blocksize * 8), buf))
  732.       free ++;
  733.     i ++;
  734.   }
  735.   if (free != SB_FREE_BLOCKS (s))
  736.     reiserfs_warning ("vs-4000: check_bitmap: %d free blocks, must be %dn",
  737.       free, SB_FREE_BLOCKS (s));
  738. }
  739. static int read_super_block (struct super_block * s, int size, int offset)
  740. {
  741.     struct buffer_head * bh;
  742.     struct reiserfs_super_block * rs;
  743.  
  744.     bh = bread (s->s_dev, offset / size, size);
  745.     if (!bh) {
  746.       printk ("read_super_block: "
  747.               "bread failed (dev %s, block %d, size %d)n",
  748.               kdevname (s->s_dev), offset / size, size);
  749.       return 1;
  750.     }
  751.  
  752.     rs = (struct reiserfs_super_block *)bh->b_data;
  753.     if (!is_reiserfs_magic_string (rs)) {
  754.       printk ("read_super_block: "
  755.               "can't find a reiserfs filesystem on (dev %s, block %lu, size %d)n",
  756.               kdevname(s->s_dev), bh->b_blocknr, size);
  757.       brelse (bh);
  758.       return 1;
  759.     }
  760.  
  761.     //
  762.     // ok, reiserfs signature (old or new) found in at the given offset
  763.     //    
  764.     s->s_blocksize = sb_blocksize(rs);
  765.     s->s_blocksize_bits = 0;
  766.     while ((1 << s->s_blocksize_bits) != s->s_blocksize)
  767. s->s_blocksize_bits ++;
  768.     brelse (bh);
  769.     if (s->s_blocksize != 4096) {
  770. printk("Unsupported reiserfs blocksize: %d on %s, only 4096 bytes "
  771.        "blocksize is supported.n", s->s_blocksize, kdevname (s->s_dev));
  772. return 1;
  773.     }
  774.     
  775.     if (s->s_blocksize != size)
  776. set_blocksize (s->s_dev, s->s_blocksize);
  777.     bh = reiserfs_bread (s, offset / s->s_blocksize, s->s_blocksize);
  778.     if (!bh) {
  779. printk("read_super_block: "
  780.                 "bread failed (dev %s, block %d, size %d)n",
  781.                 kdevname (s->s_dev), offset / size, size);
  782. return 1;
  783.     }
  784.     
  785.     rs = (struct reiserfs_super_block *)bh->b_data;
  786.     if (!is_reiserfs_magic_string (rs) ||
  787. sb_blocksize(rs) != s->s_blocksize) {
  788. printk ("read_super_block: "
  789. "can't find a reiserfs filesystem on (dev %s, block %lu, size %d)n",
  790. kdevname(s->s_dev), bh->b_blocknr, size);
  791. brelse (bh);
  792. printk ("read_super_block: can't find a reiserfs filesystem on dev %s.n", kdevname(s->s_dev));
  793. return 1;
  794.     }
  795.     /* must check to be sure we haven't pulled an old format super out
  796.     ** of the old format's log.  This is a kludge of a check, but it
  797.     ** will work.  If block we've just read in is inside the
  798.     ** journal for that super, it can't be valid.  
  799.     */
  800.     if (bh->b_blocknr >= sb_journal_block(rs) && 
  801. bh->b_blocknr < (sb_journal_block(rs) + JOURNAL_BLOCK_COUNT)) {
  802. brelse(bh) ;
  803. printk("super-459: read_super_block: "
  804.        "super found at block %lu is within its own log. "
  805.        "It must not be of this format type.n", bh->b_blocknr) ;
  806. return 1 ;
  807.     }
  808.     if ( rs->s_root_block == -1 ) {
  809. brelse(bh) ;
  810. printk("dev %s: Unfinished reiserfsck --rebuild-tree run detected. Please runn"
  811.        "reiserfsck --rebuild-tree and wait for a completion. If that failsn"
  812.        "get newer reiserfsprogs packagen", kdevname (s->s_dev));
  813. return 1;
  814.     }
  815.     SB_BUFFER_WITH_SB (s) = bh;
  816.     SB_DISK_SUPER_BLOCK (s) = rs;
  817.     s->s_op = &reiserfs_sops;
  818.     /* new format is limited by the 32 bit wide i_blocks field, want to
  819.     ** be one full block below that.
  820.     */
  821.     s->s_maxbytes = (512LL << 32) - s->s_blocksize ;
  822.     return 0;
  823. }
  824. /* after journal replay, reread all bitmap and super blocks */
  825. static int reread_meta_blocks(struct super_block *s) {
  826.   int i ;
  827.   ll_rw_block(READ, 1, &(SB_BUFFER_WITH_SB(s))) ;
  828.   wait_on_buffer(SB_BUFFER_WITH_SB(s)) ;
  829.   if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) {
  830.     printk("reread_meta_blocks, error reading the supern") ;
  831.     return 1 ;
  832.   }
  833.   for (i = 0; i < SB_BMAP_NR(s) ; i++) {
  834.     ll_rw_block(READ, 1, &(SB_AP_BITMAP(s)[i].bh)) ;
  835.     wait_on_buffer(SB_AP_BITMAP(s)[i].bh) ;
  836.     if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) {
  837.       printk("reread_meta_blocks, error reading bitmap block number %d at
  838.       %ldn", i, SB_AP_BITMAP(s)[i].bh->b_blocknr) ;
  839.       return 1 ;
  840.     }
  841.   }
  842.   return 0 ;
  843. }
  844. /////////////////////////////////////////////////////
  845. // hash detection stuff
  846. // if root directory is empty - we set default - Yura's - hash and
  847. // warn about it
  848. // FIXME: we look for only one name in a directory. If tea and yura
  849. // bith have the same value - we ask user to send report to the
  850. // mailing list
  851. __u32 find_hash_out (struct super_block * s)
  852. {
  853.     int retval;
  854.     struct inode * inode;
  855.     struct cpu_key key;
  856.     INITIALIZE_PATH (path);
  857.     struct reiserfs_dir_entry de;
  858.     __u32 hash = DEFAULT_HASH;
  859.     inode = s->s_root->d_inode;
  860.     do { // Some serious "goto"-hater was there ;)
  861. u32 teahash, r5hash, yurahash;
  862. make_cpu_key (&key, inode, ~0, TYPE_DIRENTRY, 3);
  863. retval = search_by_entry_key (s, &key, &path, &de);
  864. if (retval == IO_ERROR) {
  865.     pathrelse (&path);
  866.     return UNSET_HASH ;
  867. }
  868. if (retval == NAME_NOT_FOUND)
  869.     de.de_entry_num --;
  870. set_de_name_and_namelen (&de);
  871. if (deh_offset( &(de.de_deh[de.de_entry_num]) ) == DOT_DOT_OFFSET) {
  872.     /* allow override in this case */
  873.     if (reiserfs_rupasov_hash(s)) {
  874. hash = YURA_HASH ;
  875.     }
  876.     reiserfs_warning("reiserfs: FS seems to be empty, autodetect "
  877.                      "is using the default hashn");
  878.     break;
  879. }
  880. r5hash=GET_HASH_VALUE (r5_hash (de.de_name, de.de_namelen));
  881. teahash=GET_HASH_VALUE (keyed_hash (de.de_name, de.de_namelen));
  882. yurahash=GET_HASH_VALUE (yura_hash (de.de_name, de.de_namelen));
  883. if ( ( (teahash == r5hash) && (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num]))) == r5hash) ) ||
  884.      ( (teahash == yurahash) && (yurahash == GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])))) ) ||
  885.      ( (r5hash == yurahash) && (yurahash == GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])))) ) ) {
  886.     reiserfs_warning("reiserfs: Unable to automatically detect hash"
  887. "function for device %sn"
  888. "please mount with -o hash={tea,rupasov,r5}n", kdevname (s->s_dev));
  889.     hash = UNSET_HASH;
  890.     break;
  891. }
  892. if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) == yurahash)
  893.     hash = YURA_HASH;
  894. else if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) == teahash)
  895.     hash = TEA_HASH;
  896. else if (GET_HASH_VALUE( deh_offset(&(de.de_deh[de.de_entry_num])) ) == r5hash)
  897.     hash = R5_HASH;
  898. else {
  899.     reiserfs_warning("reiserfs: Unrecognised hash function for "
  900.      "device %sn", kdevname (s->s_dev));
  901.     hash = UNSET_HASH;
  902. }
  903.     } while (0);
  904.     pathrelse (&path);
  905.     return hash;
  906. }
  907. // finds out which hash names are sorted with
  908. static int what_hash (struct super_block * s)
  909. {
  910.     __u32 code;
  911.     code = sb_hash_function_code(SB_DISK_SUPER_BLOCK(s));
  912.     /* reiserfs_hash_detect() == true if any of the hash mount options
  913.     ** were used.  We must check them to make sure the user isn't
  914.     ** using a bad hash value
  915.     */
  916.     if (code == UNSET_HASH || reiserfs_hash_detect(s))
  917. code = find_hash_out (s);
  918.     if (code != UNSET_HASH && reiserfs_hash_detect(s)) {
  919. /* detection has found the hash, and we must check against the 
  920. ** mount options 
  921. */
  922. if (reiserfs_rupasov_hash(s) && code != YURA_HASH) {
  923.     printk("REISERFS: Error, %s hash detected, "
  924.    "unable to force rupasov hashn", reiserfs_hashname(code)) ;
  925.     code = UNSET_HASH ;
  926. } else if (reiserfs_tea_hash(s) && code != TEA_HASH) {
  927.     printk("REISERFS: Error, %s hash detected, "
  928.    "unable to force tea hashn", reiserfs_hashname(code)) ;
  929.     code = UNSET_HASH ;
  930. } else if (reiserfs_r5_hash(s) && code != R5_HASH) {
  931.     printk("REISERFS: Error, %s hash detected, "
  932.    "unable to force r5 hashn", reiserfs_hashname(code)) ;
  933.     code = UNSET_HASH ;
  934.     } else { 
  935.         /* find_hash_out was not called or could not determine the hash */
  936. if (reiserfs_rupasov_hash(s)) {
  937.     code = YURA_HASH ;
  938. } else if (reiserfs_tea_hash(s)) {
  939.     code = TEA_HASH ;
  940. } else if (reiserfs_r5_hash(s)) {
  941.     code = R5_HASH ;
  942.     }
  943.     /* if we are mounted RW, and we have a new valid hash code, update 
  944.     ** the super
  945.     */
  946.     if (code != UNSET_HASH && 
  947. !(s->s_flags & MS_RDONLY) && 
  948.         code != sb_hash_function_code(SB_DISK_SUPER_BLOCK(s))) {
  949.         set_sb_hash_function_code(SB_DISK_SUPER_BLOCK(s), code);
  950.     }
  951.     return code;
  952. }
  953. // return pointer to appropriate function
  954. static hashf_t hash_function (struct super_block * s)
  955. {
  956.     switch (what_hash (s)) {
  957.     case TEA_HASH:
  958. reiserfs_warning ("Using tea hash to sort namesn");
  959. return keyed_hash;
  960.     case YURA_HASH:
  961. reiserfs_warning ("Using rupasov hash to sort namesn");
  962. return yura_hash;
  963.     case R5_HASH:
  964. reiserfs_warning ("Using r5 hash to sort namesn");
  965. return r5_hash;
  966.     }
  967.     return NULL;
  968. }
  969. // this is used to set up correct value for old partitions
  970. int function2code (hashf_t func)
  971. {
  972.     if (func == keyed_hash)
  973. return TEA_HASH;
  974.     if (func == yura_hash)
  975. return YURA_HASH;
  976.     if (func == r5_hash)
  977. return R5_HASH;
  978.     BUG() ; // should never happen 
  979.     return 0;
  980. }
  981. static struct super_block * reiserfs_read_super (struct super_block * s, void * data, int silent)
  982. {
  983.     int size;
  984.     struct inode *root_inode;
  985.     kdev_t dev = s->s_dev;
  986.     int j;
  987.     extern int *blksize_size[];
  988.     struct reiserfs_transaction_handle th ;
  989.     int old_format = 0;
  990.     unsigned long blocks;
  991.     int jinit_done = 0 ;
  992.     struct reiserfs_iget4_args args ;
  993.     int old_magic;
  994.     struct reiserfs_super_block * rs;
  995.     memset (&s->u.reiserfs_sb, 0, sizeof (struct reiserfs_sb_info));
  996.     /* Set default values for options: non-aggressive tails */
  997.     s->u.reiserfs_sb.s_mount_opt = ( 1 << REISERFS_SMALLTAIL );
  998.     /* default block allocator option: skip_busy */
  999.     s->u.reiserfs_sb.s_alloc_options.bits = ( 1 << 5);
  1000.     /* If file grew past 4 blocks, start preallocation blocks for it. */
  1001.     s->u.reiserfs_sb.s_alloc_options.preallocmin = 4;
  1002.     /* Preallocate by 8 blocks (9-1) at once */
  1003.     s->u.reiserfs_sb.s_alloc_options.preallocsize = 9;
  1004.     if (reiserfs_parse_options (s, (char *) data, &(s->u.reiserfs_sb.s_mount_opt), &blocks) == 0) {
  1005. return NULL;
  1006.     }
  1007.     if (blocks) {
  1008.    printk("reserfs: resize option for remount onlyn");
  1009. return NULL;
  1010.     }
  1011.     if (blksize_size[MAJOR(dev)] && blksize_size[MAJOR(dev)][MINOR(dev)] != 0) {
  1012. /* as blocksize is set for partition we use it */
  1013. size = blksize_size[MAJOR(dev)][MINOR(dev)];
  1014.     } else {
  1015. size = BLOCK_SIZE;
  1016. set_blocksize (s->s_dev, BLOCK_SIZE);
  1017.     }
  1018.     /* read block (64-th 1k block), which can contain reiserfs super block */
  1019.     if (read_super_block (s, size, REISERFS_DISK_OFFSET_IN_BYTES)) {
  1020. // try old format (undistributed bitmap, super block in 8-th 1k block of a device)
  1021. if (read_super_block (s, size, REISERFS_OLD_DISK_OFFSET_IN_BYTES)) 
  1022.     goto error;
  1023. else
  1024.     old_format = 1;
  1025.     }
  1026.     rs = SB_DISK_SUPER_BLOCK (s);
  1027.     s->u.reiserfs_sb.s_mount_state = SB_REISERFS_STATE(s);
  1028.     s->u.reiserfs_sb.s_mount_state = REISERFS_VALID_FS ;
  1029.     if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) { 
  1030. printk ("reiserfs_read_super: unable to read bitmapn");
  1031. goto error;
  1032.     }
  1033. #ifdef CONFIG_REISERFS_CHECK
  1034.     printk("reiserfs:warning: CONFIG_REISERFS_CHECK is set ONn");
  1035.     printk("reiserfs:warning: - it is slow mode for debugging.n");
  1036. #endif
  1037.     // set_device_ro(s->s_dev, 1) ;
  1038.     if (journal_init(s)) {
  1039. printk("reiserfs_read_super: unable to initialize journal spacen") ;
  1040. goto error ;
  1041.     } else {
  1042. jinit_done = 1 ; /* once this is set, journal_release must be called
  1043.  ** if we error out of the mount 
  1044.  */
  1045.     }
  1046.     if (reread_meta_blocks(s)) {
  1047. printk("reiserfs_read_super: unable to reread meta blocks after journal initn") ;
  1048. goto error ;
  1049.     }
  1050.     if (replay_only (s))
  1051. goto error;
  1052.     if (is_read_only(s->s_dev) && !(s->s_flags & MS_RDONLY)) {
  1053.         printk("clm-7000: Detected readonly device, marking FS readonlyn") ;
  1054. s->s_flags |= MS_RDONLY ;
  1055.     }
  1056.     args.objectid = REISERFS_ROOT_PARENT_OBJECTID ;
  1057.     root_inode = iget4 (s, REISERFS_ROOT_OBJECTID, 0, (void *)(&args));
  1058.     if (!root_inode) {
  1059. printk ("reiserfs_read_super: get root inode failedn");
  1060. goto error;
  1061.     }
  1062.     s->s_root = d_alloc_root(root_inode);  
  1063.     if (!s->s_root) {
  1064. iput(root_inode);
  1065. goto error;
  1066.     }
  1067.     // define and initialize hash function
  1068.     s->u.reiserfs_sb.s_hash_function = hash_function (s);
  1069.     if (s->u.reiserfs_sb.s_hash_function == NULL) {
  1070.       dput(s->s_root) ;
  1071.       s->s_root = NULL ;
  1072.       goto error ;
  1073.     }
  1074.     rs = SB_DISK_SUPER_BLOCK (s);
  1075.     old_magic = strncmp (rs->s_magic,  REISER2FS_SUPER_MAGIC_STRING,
  1076.                            strlen ( REISER2FS_SUPER_MAGIC_STRING));
  1077.     if (!old_magic)
  1078. set_bit(REISERFS_3_6, &(s->u.reiserfs_sb.s_properties));
  1079.     else
  1080. set_bit(REISERFS_3_5, &(s->u.reiserfs_sb.s_properties));
  1081.     if (!(s->s_flags & MS_RDONLY)) {
  1082. journal_begin(&th, s, 1) ;
  1083. reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
  1084.         set_sb_state( rs, REISERFS_ERROR_FS );
  1085.         if ( old_magic ) {
  1086.     // filesystem created under 3.5.x found
  1087.     if (convert_reiserfs (s)) {
  1088. reiserfs_warning("reiserfs: converting 3.5.x filesystem to the new formatn") ;
  1089. // after this 3.5.x will not be able to mount this partition
  1090. memcpy (rs->s_magic, REISER2FS_SUPER_MAGIC_STRING, 
  1091. sizeof (REISER2FS_SUPER_MAGIC_STRING));
  1092. reiserfs_convert_objectid_map_v1(s) ;
  1093. set_bit(REISERFS_3_6, &(s->u.reiserfs_sb.s_properties));
  1094. clear_bit(REISERFS_3_5, &(s->u.reiserfs_sb.s_properties));
  1095.     } else {
  1096. reiserfs_warning("reiserfs: using 3.5.x disk formatn") ;
  1097.     }
  1098. }
  1099. journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
  1100. journal_end(&th, s, 1) ;
  1101. /* look for files which were to be removed in previous session */
  1102. finish_unfinished (s);
  1103. s->s_dirt = 0;
  1104.     } else {
  1105. if ( old_magic ) {
  1106.     reiserfs_warning("reiserfs: using 3.5.x disk formatn") ;
  1107. }
  1108.     }
  1109.     // mark hash in super block: it could be unset. overwrite should be ok
  1110.     set_sb_hash_function_code( rs, function2code(s->u.reiserfs_sb.s_hash_function ) );
  1111.     handle_attrs( s );
  1112.     reiserfs_proc_info_init( s );
  1113.     reiserfs_proc_register( s, "version", reiserfs_version_in_proc );
  1114.     reiserfs_proc_register( s, "super", reiserfs_super_in_proc );
  1115.     reiserfs_proc_register( s, "per-level", reiserfs_per_level_in_proc );
  1116.     reiserfs_proc_register( s, "bitmap", reiserfs_bitmap_in_proc );
  1117.     reiserfs_proc_register( s, "on-disk-super", reiserfs_on_disk_super_in_proc );
  1118.     reiserfs_proc_register( s, "oidmap", reiserfs_oidmap_in_proc );
  1119.     reiserfs_proc_register( s, "journal", reiserfs_journal_in_proc );
  1120.     init_waitqueue_head (&(s->u.reiserfs_sb.s_wait));
  1121.     printk("%sn", reiserfs_get_version_string()) ;
  1122.     return s;
  1123.  error:
  1124.     if (jinit_done) { /* kill the commit thread, free journal ram */
  1125. journal_release_error(NULL, s) ;
  1126.     }
  1127.     if (SB_DISK_SUPER_BLOCK (s)) {
  1128. for (j = 0; j < SB_BMAP_NR (s); j ++) {
  1129.     if (SB_AP_BITMAP (s))
  1130. brelse (SB_AP_BITMAP (s)[j].bh);
  1131. }
  1132. if (SB_AP_BITMAP (s))
  1133.     vfree (SB_AP_BITMAP (s));
  1134.     }
  1135.     if (SB_BUFFER_WITH_SB (s))
  1136. brelse(SB_BUFFER_WITH_SB (s));
  1137.     return NULL;
  1138. }
  1139. static int reiserfs_statfs (struct super_block * s, struct statfs * buf)
  1140. {
  1141.   struct reiserfs_super_block * rs = SB_DISK_SUPER_BLOCK (s);
  1142.   
  1143.   buf->f_namelen = (REISERFS_MAX_NAME (s->s_blocksize));
  1144.   buf->f_ffree   = -1;
  1145.   buf->f_files   = -1;
  1146.   buf->f_bfree   = sb_free_blocks(rs);
  1147.   buf->f_bavail  = buf->f_bfree;
  1148.   buf->f_blocks  = sb_block_count(rs) - sb_bmap_nr(rs) - 1;
  1149.   buf->f_bsize   = s->s_blocksize;
  1150.   /* changed to accomodate gcc folks.*/
  1151.   buf->f_type    =  REISERFS_SUPER_MAGIC;
  1152.   return 0;
  1153. }
  1154. static DECLARE_FSTYPE_DEV(reiserfs_fs_type,"reiserfs",reiserfs_read_super);
  1155. static int __init init_reiserfs_fs (void)
  1156. {
  1157. reiserfs_proc_info_global_init();
  1158. reiserfs_proc_register_global( "version", 
  1159.        reiserfs_global_version_in_proc );
  1160.         return register_filesystem(&reiserfs_fs_type);
  1161. }
  1162. MODULE_DESCRIPTION("ReiserFS journaled filesystem");
  1163. MODULE_AUTHOR("Hans Reiser <reiser@namesys.com>");
  1164. MODULE_LICENSE("GPL");
  1165. EXPORT_NO_SYMBOLS;
  1166. static void __exit exit_reiserfs_fs(void)
  1167. {
  1168. reiserfs_proc_unregister_global( "version" );
  1169. reiserfs_proc_info_global_done();
  1170.         unregister_filesystem(&reiserfs_fs_type);
  1171. }
  1172. module_init(init_reiserfs_fs) ;
  1173. module_exit(exit_reiserfs_fs) ;