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