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