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