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