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