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