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