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