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