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