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