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