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