diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-30 15:29:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-30 15:33:01 -0400 |
commit | e1c502482853f84606928f5a2f2eb6da1993cda1 (patch) | |
tree | ca296007164906342a195bdf3a5305277e6af5da /fs/reiserfs/namei.c | |
parent | 019abbc87025a030fd25008612afd4eff8a375f7 (diff) | |
parent | ee93961be1faddf9e9a638bc519145c20f0cfeba (diff) |
Merge branch 'reiserfs-updates' from Jeff Mahoney
* reiserfs-updates: (35 commits)
reiserfs: rename [cn]_* variables
reiserfs: rename p_._ variables
reiserfs: rename p_s_tb to tb
reiserfs: rename p_s_inode to inode
reiserfs: rename p_s_bh to bh
reiserfs: rename p_s_sb to sb
reiserfs: strip trailing whitespace
reiserfs: cleanup path functions
reiserfs: factor out buffer_info initialization
reiserfs: add atomic addition of selinux attributes during inode creation
reiserfs: use generic readdir for operations across all xattrs
reiserfs: journaled xattrs
reiserfs: use generic xattr handlers
reiserfs: remove i_has_xattr_dir
reiserfs: make per-inode xattr locking more fine grained
reiserfs: eliminate per-super xattr lock
reiserfs: simplify xattr internal file lookups/opens
reiserfs: Clean up xattrs when REISERFS_FS_XATTR is unset
reiserfs: remove IS_PRIVATE helpers
reiserfs: remove link detection code
...
Fixed up conflicts manually due to:
- quota name cleanups vs variable naming changes:
fs/reiserfs/inode.c
fs/reiserfs/namei.c
fs/reiserfs/stree.c
fs/reiserfs/xattr.c
- exported include header cleanups
include/linux/reiserfs_fs.h
Diffstat (limited to 'fs/reiserfs/namei.c')
-rw-r--r-- | fs/reiserfs/namei.c | 180 |
1 files changed, 84 insertions, 96 deletions
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index 639d635d9d4b..efd4d720718e 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
@@ -106,7 +106,7 @@ key of the first directory entry in it. | |||
106 | This function first calls search_by_key, then, if item whose first | 106 | This function first calls search_by_key, then, if item whose first |
107 | entry matches is not found it looks for the entry inside directory | 107 | entry matches is not found it looks for the entry inside directory |
108 | item found by search_by_key. Fills the path to the entry, and to the | 108 | item found by search_by_key. Fills the path to the entry, and to the |
109 | entry position in the item | 109 | entry position in the item |
110 | 110 | ||
111 | */ | 111 | */ |
112 | 112 | ||
@@ -120,8 +120,8 @@ int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, | |||
120 | switch (retval) { | 120 | switch (retval) { |
121 | case ITEM_NOT_FOUND: | 121 | case ITEM_NOT_FOUND: |
122 | if (!PATH_LAST_POSITION(path)) { | 122 | if (!PATH_LAST_POSITION(path)) { |
123 | reiserfs_warning(sb, | 123 | reiserfs_error(sb, "vs-7000", "search_by_key " |
124 | "vs-7000: search_by_entry_key: search_by_key returned item position == 0"); | 124 | "returned item position == 0"); |
125 | pathrelse(path); | 125 | pathrelse(path); |
126 | return IO_ERROR; | 126 | return IO_ERROR; |
127 | } | 127 | } |
@@ -135,8 +135,7 @@ int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, | |||
135 | 135 | ||
136 | default: | 136 | default: |
137 | pathrelse(path); | 137 | pathrelse(path); |
138 | reiserfs_warning(sb, | 138 | reiserfs_error(sb, "vs-7002", "no path to here"); |
139 | "vs-7002: search_by_entry_key: no path to here"); | ||
140 | return IO_ERROR; | 139 | return IO_ERROR; |
141 | } | 140 | } |
142 | 141 | ||
@@ -146,10 +145,9 @@ int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, | |||
146 | if (!is_direntry_le_ih(de->de_ih) || | 145 | if (!is_direntry_le_ih(de->de_ih) || |
147 | COMP_SHORT_KEYS(&(de->de_ih->ih_key), key)) { | 146 | COMP_SHORT_KEYS(&(de->de_ih->ih_key), key)) { |
148 | print_block(de->de_bh, 0, -1, -1); | 147 | print_block(de->de_bh, 0, -1, -1); |
149 | reiserfs_panic(sb, | 148 | reiserfs_panic(sb, "vs-7005", "found item %h is not directory " |
150 | "vs-7005: search_by_entry_key: found item %h is not directory item or " | 149 | "item or does not belong to the same directory " |
151 | "does not belong to the same directory as key %K", | 150 | "as key %K", de->de_ih, key); |
152 | de->de_ih, key); | ||
153 | } | 151 | } |
154 | #endif /* CONFIG_REISERFS_CHECK */ | 152 | #endif /* CONFIG_REISERFS_CHECK */ |
155 | 153 | ||
@@ -300,8 +298,7 @@ static int reiserfs_find_entry(struct inode *dir, const char *name, int namelen, | |||
300 | search_by_entry_key(dir->i_sb, &key_to_search, | 298 | search_by_entry_key(dir->i_sb, &key_to_search, |
301 | path_to_entry, de); | 299 | path_to_entry, de); |
302 | if (retval == IO_ERROR) { | 300 | if (retval == IO_ERROR) { |
303 | reiserfs_warning(dir->i_sb, "zam-7001: io error in %s", | 301 | reiserfs_error(dir->i_sb, "zam-7001", "io error"); |
304 | __func__); | ||
305 | return IO_ERROR; | 302 | return IO_ERROR; |
306 | } | 303 | } |
307 | 304 | ||
@@ -361,9 +358,10 @@ static struct dentry *reiserfs_lookup(struct inode *dir, struct dentry *dentry, | |||
361 | return ERR_PTR(-EACCES); | 358 | return ERR_PTR(-EACCES); |
362 | } | 359 | } |
363 | 360 | ||
364 | /* Propogate the priv_object flag so we know we're in the priv tree */ | 361 | /* Propagate the private flag so we know we're |
365 | if (is_reiserfs_priv_object(dir)) | 362 | * in the priv tree */ |
366 | reiserfs_mark_inode_private(inode); | 363 | if (IS_PRIVATE(dir)) |
364 | inode->i_flags |= S_PRIVATE; | ||
367 | } | 365 | } |
368 | reiserfs_write_unlock(dir->i_sb); | 366 | reiserfs_write_unlock(dir->i_sb); |
369 | if (retval == IO_ERROR) { | 367 | if (retval == IO_ERROR) { |
@@ -373,7 +371,7 @@ static struct dentry *reiserfs_lookup(struct inode *dir, struct dentry *dentry, | |||
373 | return d_splice_alias(inode, dentry); | 371 | return d_splice_alias(inode, dentry); |
374 | } | 372 | } |
375 | 373 | ||
376 | /* | 374 | /* |
377 | ** looks up the dentry of the parent directory for child. | 375 | ** looks up the dentry of the parent directory for child. |
378 | ** taken from ext2_get_parent | 376 | ** taken from ext2_get_parent |
379 | */ | 377 | */ |
@@ -403,7 +401,7 @@ struct dentry *reiserfs_get_parent(struct dentry *child) | |||
403 | return d_obtain_alias(inode); | 401 | return d_obtain_alias(inode); |
404 | } | 402 | } |
405 | 403 | ||
406 | /* add entry to the directory (entry can be hidden). | 404 | /* add entry to the directory (entry can be hidden). |
407 | 405 | ||
408 | insert definition of when hidden directories are used here -Hans | 406 | insert definition of when hidden directories are used here -Hans |
409 | 407 | ||
@@ -484,10 +482,9 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th, | |||
484 | } | 482 | } |
485 | 483 | ||
486 | if (retval != NAME_FOUND) { | 484 | if (retval != NAME_FOUND) { |
487 | reiserfs_warning(dir->i_sb, | 485 | reiserfs_error(dir->i_sb, "zam-7002", |
488 | "zam-7002:%s: \"reiserfs_find_entry\" " | 486 | "reiserfs_find_entry() returned " |
489 | "has returned unexpected value (%d)", | 487 | "unexpected value (%d)", retval); |
490 | __func__, retval); | ||
491 | } | 488 | } |
492 | 489 | ||
493 | return -EEXIST; | 490 | return -EEXIST; |
@@ -498,8 +495,9 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th, | |||
498 | MAX_GENERATION_NUMBER + 1); | 495 | MAX_GENERATION_NUMBER + 1); |
499 | if (gen_number > MAX_GENERATION_NUMBER) { | 496 | if (gen_number > MAX_GENERATION_NUMBER) { |
500 | /* there is no free generation number */ | 497 | /* there is no free generation number */ |
501 | reiserfs_warning(dir->i_sb, | 498 | reiserfs_warning(dir->i_sb, "reiserfs-7010", |
502 | "reiserfs_add_entry: Congratulations! we have got hash function screwed up"); | 499 | "Congratulations! we have got hash function " |
500 | "screwed up"); | ||
503 | if (buffer != small_buf) | 501 | if (buffer != small_buf) |
504 | kfree(buffer); | 502 | kfree(buffer); |
505 | pathrelse(&path); | 503 | pathrelse(&path); |
@@ -515,10 +513,9 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th, | |||
515 | if (gen_number != 0) { /* we need to re-search for the insertion point */ | 513 | if (gen_number != 0) { /* we need to re-search for the insertion point */ |
516 | if (search_by_entry_key(dir->i_sb, &entry_key, &path, &de) != | 514 | if (search_by_entry_key(dir->i_sb, &entry_key, &path, &de) != |
517 | NAME_NOT_FOUND) { | 515 | NAME_NOT_FOUND) { |
518 | reiserfs_warning(dir->i_sb, | 516 | reiserfs_warning(dir->i_sb, "vs-7032", |
519 | "vs-7032: reiserfs_add_entry: " | 517 | "entry with this key (%K) already " |
520 | "entry with this key (%K) already exists", | 518 | "exists", &entry_key); |
521 | &entry_key); | ||
522 | 519 | ||
523 | if (buffer != small_buf) | 520 | if (buffer != small_buf) |
524 | kfree(buffer); | 521 | kfree(buffer); |
@@ -562,7 +559,7 @@ static int drop_new_inode(struct inode *inode) | |||
562 | return 0; | 559 | return 0; |
563 | } | 560 | } |
564 | 561 | ||
565 | /* utility function that does setup for reiserfs_new_inode. | 562 | /* utility function that does setup for reiserfs_new_inode. |
566 | ** vfs_dq_init needs lots of credits so it's better to have it | 563 | ** vfs_dq_init needs lots of credits so it's better to have it |
567 | ** outside of a transaction, so we had to pull some bits of | 564 | ** outside of a transaction, so we had to pull some bits of |
568 | ** reiserfs_new_inode out into this func. | 565 | ** reiserfs_new_inode out into this func. |
@@ -601,20 +598,22 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
601 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + | 598 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + |
602 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); | 599 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); |
603 | struct reiserfs_transaction_handle th; | 600 | struct reiserfs_transaction_handle th; |
604 | int locked; | 601 | struct reiserfs_security_handle security; |
605 | 602 | ||
606 | if (!(inode = new_inode(dir->i_sb))) { | 603 | if (!(inode = new_inode(dir->i_sb))) { |
607 | return -ENOMEM; | 604 | return -ENOMEM; |
608 | } | 605 | } |
609 | new_inode_init(inode, dir, mode); | 606 | new_inode_init(inode, dir, mode); |
610 | 607 | ||
611 | locked = reiserfs_cache_default_acl(dir); | 608 | jbegin_count += reiserfs_cache_default_acl(dir); |
612 | 609 | retval = reiserfs_security_init(dir, inode, &security); | |
610 | if (retval < 0) { | ||
611 | drop_new_inode(inode); | ||
612 | return retval; | ||
613 | } | ||
614 | jbegin_count += retval; | ||
613 | reiserfs_write_lock(dir->i_sb); | 615 | reiserfs_write_lock(dir->i_sb); |
614 | 616 | ||
615 | if (locked) | ||
616 | reiserfs_write_lock_xattrs(dir->i_sb); | ||
617 | |||
618 | retval = journal_begin(&th, dir->i_sb, jbegin_count); | 617 | retval = journal_begin(&th, dir->i_sb, jbegin_count); |
619 | if (retval) { | 618 | if (retval) { |
620 | drop_new_inode(inode); | 619 | drop_new_inode(inode); |
@@ -623,15 +622,10 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
623 | 622 | ||
624 | retval = | 623 | retval = |
625 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, | 624 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, |
626 | inode); | 625 | inode, &security); |
627 | if (retval) | 626 | if (retval) |
628 | goto out_failed; | 627 | goto out_failed; |
629 | 628 | ||
630 | if (locked) { | ||
631 | reiserfs_write_unlock_xattrs(dir->i_sb); | ||
632 | locked = 0; | ||
633 | } | ||
634 | |||
635 | inode->i_op = &reiserfs_file_inode_operations; | 629 | inode->i_op = &reiserfs_file_inode_operations; |
636 | inode->i_fop = &reiserfs_file_operations; | 630 | inode->i_fop = &reiserfs_file_operations; |
637 | inode->i_mapping->a_ops = &reiserfs_address_space_operations; | 631 | inode->i_mapping->a_ops = &reiserfs_address_space_operations; |
@@ -658,8 +652,6 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
658 | retval = journal_end(&th, dir->i_sb, jbegin_count); | 652 | retval = journal_end(&th, dir->i_sb, jbegin_count); |
659 | 653 | ||
660 | out_failed: | 654 | out_failed: |
661 | if (locked) | ||
662 | reiserfs_write_unlock_xattrs(dir->i_sb); | ||
663 | reiserfs_write_unlock(dir->i_sb); | 655 | reiserfs_write_unlock(dir->i_sb); |
664 | return retval; | 656 | return retval; |
665 | } | 657 | } |
@@ -670,12 +662,12 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
670 | int retval; | 662 | int retval; |
671 | struct inode *inode; | 663 | struct inode *inode; |
672 | struct reiserfs_transaction_handle th; | 664 | struct reiserfs_transaction_handle th; |
665 | struct reiserfs_security_handle security; | ||
673 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ | 666 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ |
674 | int jbegin_count = | 667 | int jbegin_count = |
675 | JOURNAL_PER_BALANCE_CNT * 3 + | 668 | JOURNAL_PER_BALANCE_CNT * 3 + |
676 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + | 669 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + |
677 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); | 670 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); |
678 | int locked; | ||
679 | 671 | ||
680 | if (!new_valid_dev(rdev)) | 672 | if (!new_valid_dev(rdev)) |
681 | return -EINVAL; | 673 | return -EINVAL; |
@@ -685,13 +677,15 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
685 | } | 677 | } |
686 | new_inode_init(inode, dir, mode); | 678 | new_inode_init(inode, dir, mode); |
687 | 679 | ||
688 | locked = reiserfs_cache_default_acl(dir); | 680 | jbegin_count += reiserfs_cache_default_acl(dir); |
689 | 681 | retval = reiserfs_security_init(dir, inode, &security); | |
682 | if (retval < 0) { | ||
683 | drop_new_inode(inode); | ||
684 | return retval; | ||
685 | } | ||
686 | jbegin_count += retval; | ||
690 | reiserfs_write_lock(dir->i_sb); | 687 | reiserfs_write_lock(dir->i_sb); |
691 | 688 | ||
692 | if (locked) | ||
693 | reiserfs_write_lock_xattrs(dir->i_sb); | ||
694 | |||
695 | retval = journal_begin(&th, dir->i_sb, jbegin_count); | 689 | retval = journal_begin(&th, dir->i_sb, jbegin_count); |
696 | if (retval) { | 690 | if (retval) { |
697 | drop_new_inode(inode); | 691 | drop_new_inode(inode); |
@@ -700,16 +694,11 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
700 | 694 | ||
701 | retval = | 695 | retval = |
702 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, | 696 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, |
703 | inode); | 697 | inode, &security); |
704 | if (retval) { | 698 | if (retval) { |
705 | goto out_failed; | 699 | goto out_failed; |
706 | } | 700 | } |
707 | 701 | ||
708 | if (locked) { | ||
709 | reiserfs_write_unlock_xattrs(dir->i_sb); | ||
710 | locked = 0; | ||
711 | } | ||
712 | |||
713 | inode->i_op = &reiserfs_special_inode_operations; | 702 | inode->i_op = &reiserfs_special_inode_operations; |
714 | init_special_inode(inode, inode->i_mode, rdev); | 703 | init_special_inode(inode, inode->i_mode, rdev); |
715 | 704 | ||
@@ -739,8 +728,6 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
739 | retval = journal_end(&th, dir->i_sb, jbegin_count); | 728 | retval = journal_end(&th, dir->i_sb, jbegin_count); |
740 | 729 | ||
741 | out_failed: | 730 | out_failed: |
742 | if (locked) | ||
743 | reiserfs_write_unlock_xattrs(dir->i_sb); | ||
744 | reiserfs_write_unlock(dir->i_sb); | 731 | reiserfs_write_unlock(dir->i_sb); |
745 | return retval; | 732 | return retval; |
746 | } | 733 | } |
@@ -750,12 +737,12 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
750 | int retval; | 737 | int retval; |
751 | struct inode *inode; | 738 | struct inode *inode; |
752 | struct reiserfs_transaction_handle th; | 739 | struct reiserfs_transaction_handle th; |
740 | struct reiserfs_security_handle security; | ||
753 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ | 741 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ |
754 | int jbegin_count = | 742 | int jbegin_count = |
755 | JOURNAL_PER_BALANCE_CNT * 3 + | 743 | JOURNAL_PER_BALANCE_CNT * 3 + |
756 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + | 744 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + |
757 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); | 745 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); |
758 | int locked; | ||
759 | 746 | ||
760 | #ifdef DISPLACE_NEW_PACKING_LOCALITIES | 747 | #ifdef DISPLACE_NEW_PACKING_LOCALITIES |
761 | /* set flag that new packing locality created and new blocks for the content * of that directory are not displaced yet */ | 748 | /* set flag that new packing locality created and new blocks for the content * of that directory are not displaced yet */ |
@@ -767,11 +754,14 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
767 | } | 754 | } |
768 | new_inode_init(inode, dir, mode); | 755 | new_inode_init(inode, dir, mode); |
769 | 756 | ||
770 | locked = reiserfs_cache_default_acl(dir); | 757 | jbegin_count += reiserfs_cache_default_acl(dir); |
771 | 758 | retval = reiserfs_security_init(dir, inode, &security); | |
759 | if (retval < 0) { | ||
760 | drop_new_inode(inode); | ||
761 | return retval; | ||
762 | } | ||
763 | jbegin_count += retval; | ||
772 | reiserfs_write_lock(dir->i_sb); | 764 | reiserfs_write_lock(dir->i_sb); |
773 | if (locked) | ||
774 | reiserfs_write_lock_xattrs(dir->i_sb); | ||
775 | 765 | ||
776 | retval = journal_begin(&th, dir->i_sb, jbegin_count); | 766 | retval = journal_begin(&th, dir->i_sb, jbegin_count); |
777 | if (retval) { | 767 | if (retval) { |
@@ -787,17 +777,12 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
787 | retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */ , | 777 | retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */ , |
788 | old_format_only(dir->i_sb) ? | 778 | old_format_only(dir->i_sb) ? |
789 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, | 779 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, |
790 | dentry, inode); | 780 | dentry, inode, &security); |
791 | if (retval) { | 781 | if (retval) { |
792 | dir->i_nlink--; | 782 | dir->i_nlink--; |
793 | goto out_failed; | 783 | goto out_failed; |
794 | } | 784 | } |
795 | 785 | ||
796 | if (locked) { | ||
797 | reiserfs_write_unlock_xattrs(dir->i_sb); | ||
798 | locked = 0; | ||
799 | } | ||
800 | |||
801 | reiserfs_update_inode_transaction(inode); | 786 | reiserfs_update_inode_transaction(inode); |
802 | reiserfs_update_inode_transaction(dir); | 787 | reiserfs_update_inode_transaction(dir); |
803 | 788 | ||
@@ -827,8 +812,6 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
827 | unlock_new_inode(inode); | 812 | unlock_new_inode(inode); |
828 | retval = journal_end(&th, dir->i_sb, jbegin_count); | 813 | retval = journal_end(&th, dir->i_sb, jbegin_count); |
829 | out_failed: | 814 | out_failed: |
830 | if (locked) | ||
831 | reiserfs_write_unlock_xattrs(dir->i_sb); | ||
832 | reiserfs_write_unlock(dir->i_sb); | 815 | reiserfs_write_unlock(dir->i_sb); |
833 | return retval; | 816 | return retval; |
834 | } | 817 | } |
@@ -837,7 +820,7 @@ static inline int reiserfs_empty_dir(struct inode *inode) | |||
837 | { | 820 | { |
838 | /* we can cheat because an old format dir cannot have | 821 | /* we can cheat because an old format dir cannot have |
839 | ** EMPTY_DIR_SIZE, and a new format dir cannot have | 822 | ** EMPTY_DIR_SIZE, and a new format dir cannot have |
840 | ** EMPTY_DIR_SIZE_V1. So, if the inode is either size, | 823 | ** EMPTY_DIR_SIZE_V1. So, if the inode is either size, |
841 | ** regardless of disk format version, the directory is empty. | 824 | ** regardless of disk format version, the directory is empty. |
842 | */ | 825 | */ |
843 | if (inode->i_size != EMPTY_DIR_SIZE && | 826 | if (inode->i_size != EMPTY_DIR_SIZE && |
@@ -903,8 +886,9 @@ static int reiserfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
903 | goto end_rmdir; | 886 | goto end_rmdir; |
904 | 887 | ||
905 | if (inode->i_nlink != 2 && inode->i_nlink != 1) | 888 | if (inode->i_nlink != 2 && inode->i_nlink != 1) |
906 | reiserfs_warning(inode->i_sb, "%s: empty directory has nlink " | 889 | reiserfs_error(inode->i_sb, "reiserfs-7040", |
907 | "!= 2 (%d)", __func__, inode->i_nlink); | 890 | "empty directory has nlink != 2 (%d)", |
891 | inode->i_nlink); | ||
908 | 892 | ||
909 | clear_nlink(inode); | 893 | clear_nlink(inode); |
910 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC; | 894 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC; |
@@ -980,10 +964,9 @@ static int reiserfs_unlink(struct inode *dir, struct dentry *dentry) | |||
980 | } | 964 | } |
981 | 965 | ||
982 | if (!inode->i_nlink) { | 966 | if (!inode->i_nlink) { |
983 | reiserfs_warning(inode->i_sb, "%s: deleting nonexistent file " | 967 | reiserfs_warning(inode->i_sb, "reiserfs-7042", |
984 | "(%s:%lu), %d", __func__, | 968 | "deleting nonexistent file (%lu), %d", |
985 | reiserfs_bdevname(inode->i_sb), inode->i_ino, | 969 | inode->i_ino, inode->i_nlink); |
986 | inode->i_nlink); | ||
987 | inode->i_nlink = 1; | 970 | inode->i_nlink = 1; |
988 | } | 971 | } |
989 | 972 | ||
@@ -1037,6 +1020,7 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1037 | char *name; | 1020 | char *name; |
1038 | int item_len; | 1021 | int item_len; |
1039 | struct reiserfs_transaction_handle th; | 1022 | struct reiserfs_transaction_handle th; |
1023 | struct reiserfs_security_handle security; | ||
1040 | int mode = S_IFLNK | S_IRWXUGO; | 1024 | int mode = S_IFLNK | S_IRWXUGO; |
1041 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ | 1025 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ |
1042 | int jbegin_count = | 1026 | int jbegin_count = |
@@ -1049,6 +1033,13 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1049 | } | 1033 | } |
1050 | new_inode_init(inode, parent_dir, mode); | 1034 | new_inode_init(inode, parent_dir, mode); |
1051 | 1035 | ||
1036 | retval = reiserfs_security_init(parent_dir, inode, &security); | ||
1037 | if (retval < 0) { | ||
1038 | drop_new_inode(inode); | ||
1039 | return retval; | ||
1040 | } | ||
1041 | jbegin_count += retval; | ||
1042 | |||
1052 | reiserfs_write_lock(parent_dir->i_sb); | 1043 | reiserfs_write_lock(parent_dir->i_sb); |
1053 | item_len = ROUND_UP(strlen(symname)); | 1044 | item_len = ROUND_UP(strlen(symname)); |
1054 | if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) { | 1045 | if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) { |
@@ -1066,8 +1057,6 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1066 | memcpy(name, symname, strlen(symname)); | 1057 | memcpy(name, symname, strlen(symname)); |
1067 | padd_item(name, item_len, strlen(symname)); | 1058 | padd_item(name, item_len, strlen(symname)); |
1068 | 1059 | ||
1069 | /* We would inherit the default ACL here, but symlinks don't get ACLs */ | ||
1070 | |||
1071 | retval = journal_begin(&th, parent_dir->i_sb, jbegin_count); | 1060 | retval = journal_begin(&th, parent_dir->i_sb, jbegin_count); |
1072 | if (retval) { | 1061 | if (retval) { |
1073 | drop_new_inode(inode); | 1062 | drop_new_inode(inode); |
@@ -1077,7 +1066,7 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1077 | 1066 | ||
1078 | retval = | 1067 | retval = |
1079 | reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname), | 1068 | reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname), |
1080 | dentry, inode); | 1069 | dentry, inode, &security); |
1081 | kfree(name); | 1070 | kfree(name); |
1082 | if (retval) { /* reiserfs_new_inode iputs for us */ | 1071 | if (retval) { /* reiserfs_new_inode iputs for us */ |
1083 | goto out_failed; | 1072 | goto out_failed; |
@@ -1173,7 +1162,7 @@ static int reiserfs_link(struct dentry *old_dentry, struct inode *dir, | |||
1173 | return retval; | 1162 | return retval; |
1174 | } | 1163 | } |
1175 | 1164 | ||
1176 | // de contains information pointing to an entry which | 1165 | /* de contains information pointing to an entry which */ |
1177 | static int de_still_valid(const char *name, int len, | 1166 | static int de_still_valid(const char *name, int len, |
1178 | struct reiserfs_dir_entry *de) | 1167 | struct reiserfs_dir_entry *de) |
1179 | { | 1168 | { |
@@ -1196,15 +1185,14 @@ static int entry_points_to_object(const char *name, int len, | |||
1196 | 1185 | ||
1197 | if (inode) { | 1186 | if (inode) { |
1198 | if (!de_visible(de->de_deh + de->de_entry_num)) | 1187 | if (!de_visible(de->de_deh + de->de_entry_num)) |
1199 | reiserfs_panic(NULL, | 1188 | reiserfs_panic(inode->i_sb, "vs-7042", |
1200 | "vs-7042: entry_points_to_object: entry must be visible"); | 1189 | "entry must be visible"); |
1201 | return (de->de_objectid == inode->i_ino) ? 1 : 0; | 1190 | return (de->de_objectid == inode->i_ino) ? 1 : 0; |
1202 | } | 1191 | } |
1203 | 1192 | ||
1204 | /* this must be added hidden entry */ | 1193 | /* this must be added hidden entry */ |
1205 | if (de_visible(de->de_deh + de->de_entry_num)) | 1194 | if (de_visible(de->de_deh + de->de_entry_num)) |
1206 | reiserfs_panic(NULL, | 1195 | reiserfs_panic(NULL, "vs-7043", "entry must be visible"); |
1207 | "vs-7043: entry_points_to_object: entry must be visible"); | ||
1208 | 1196 | ||
1209 | return 1; | 1197 | return 1; |
1210 | } | 1198 | } |
@@ -1218,10 +1206,10 @@ static void set_ino_in_dir_entry(struct reiserfs_dir_entry *de, | |||
1218 | de->de_deh[de->de_entry_num].deh_objectid = key->k_objectid; | 1206 | de->de_deh[de->de_entry_num].deh_objectid = key->k_objectid; |
1219 | } | 1207 | } |
1220 | 1208 | ||
1221 | /* | 1209 | /* |
1222 | * process, that is going to call fix_nodes/do_balance must hold only | 1210 | * process, that is going to call fix_nodes/do_balance must hold only |
1223 | * one path. If it holds 2 or more, it can get into endless waiting in | 1211 | * one path. If it holds 2 or more, it can get into endless waiting in |
1224 | * get_empty_nodes or its clones | 1212 | * get_empty_nodes or its clones |
1225 | */ | 1213 | */ |
1226 | static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 1214 | static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
1227 | struct inode *new_dir, struct dentry *new_dentry) | 1215 | struct inode *new_dir, struct dentry *new_dentry) |
@@ -1275,7 +1263,7 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1275 | 1263 | ||
1276 | old_inode_mode = old_inode->i_mode; | 1264 | old_inode_mode = old_inode->i_mode; |
1277 | if (S_ISDIR(old_inode_mode)) { | 1265 | if (S_ISDIR(old_inode_mode)) { |
1278 | // make sure, that directory being renamed has correct ".." | 1266 | // make sure, that directory being renamed has correct ".." |
1279 | // and that its new parent directory has not too many links | 1267 | // and that its new parent directory has not too many links |
1280 | // already | 1268 | // already |
1281 | 1269 | ||
@@ -1286,8 +1274,8 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1286 | } | 1274 | } |
1287 | } | 1275 | } |
1288 | 1276 | ||
1289 | /* directory is renamed, its parent directory will be changed, | 1277 | /* directory is renamed, its parent directory will be changed, |
1290 | ** so find ".." entry | 1278 | ** so find ".." entry |
1291 | */ | 1279 | */ |
1292 | dot_dot_de.de_gen_number_bit_string = NULL; | 1280 | dot_dot_de.de_gen_number_bit_string = NULL; |
1293 | retval = | 1281 | retval = |
@@ -1318,8 +1306,8 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1318 | new_dentry->d_name.len, old_inode, 0); | 1306 | new_dentry->d_name.len, old_inode, 0); |
1319 | if (retval == -EEXIST) { | 1307 | if (retval == -EEXIST) { |
1320 | if (!new_dentry_inode) { | 1308 | if (!new_dentry_inode) { |
1321 | reiserfs_panic(old_dir->i_sb, | 1309 | reiserfs_panic(old_dir->i_sb, "vs-7050", |
1322 | "vs-7050: new entry is found, new inode == 0\n"); | 1310 | "new entry is found, new inode == 0"); |
1323 | } | 1311 | } |
1324 | } else if (retval) { | 1312 | } else if (retval) { |
1325 | int err = journal_end(&th, old_dir->i_sb, jbegin_count); | 1313 | int err = journal_end(&th, old_dir->i_sb, jbegin_count); |
@@ -1397,9 +1385,9 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1397 | this stuff, yes? Then, having | 1385 | this stuff, yes? Then, having |
1398 | gathered everything into RAM we | 1386 | gathered everything into RAM we |
1399 | should lock the buffers, yes? -Hans */ | 1387 | should lock the buffers, yes? -Hans */ |
1400 | /* probably. our rename needs to hold more | 1388 | /* probably. our rename needs to hold more |
1401 | ** than one path at once. The seals would | 1389 | ** than one path at once. The seals would |
1402 | ** have to be written to deal with multi-path | 1390 | ** have to be written to deal with multi-path |
1403 | ** issues -chris | 1391 | ** issues -chris |
1404 | */ | 1392 | */ |
1405 | /* sanity checking before doing the rename - avoid races many | 1393 | /* sanity checking before doing the rename - avoid races many |
@@ -1477,7 +1465,7 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1477 | } | 1465 | } |
1478 | 1466 | ||
1479 | if (S_ISDIR(old_inode_mode)) { | 1467 | if (S_ISDIR(old_inode_mode)) { |
1480 | // adjust ".." of renamed directory | 1468 | /* adjust ".." of renamed directory */ |
1481 | set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir)); | 1469 | set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir)); |
1482 | journal_mark_dirty(&th, new_dir->i_sb, dot_dot_de.de_bh); | 1470 | journal_mark_dirty(&th, new_dir->i_sb, dot_dot_de.de_bh); |
1483 | 1471 | ||
@@ -1499,8 +1487,8 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1499 | if (reiserfs_cut_from_item | 1487 | if (reiserfs_cut_from_item |
1500 | (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL, | 1488 | (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL, |
1501 | 0) < 0) | 1489 | 0) < 0) |
1502 | reiserfs_warning(old_dir->i_sb, | 1490 | reiserfs_error(old_dir->i_sb, "vs-7060", |
1503 | "vs-7060: reiserfs_rename: couldn't not cut old name. Fsck later?"); | 1491 | "couldn't not cut old name. Fsck later?"); |
1504 | 1492 | ||
1505 | old_dir->i_size -= DEH_SIZE + old_de.de_entrylen; | 1493 | old_dir->i_size -= DEH_SIZE + old_de.de_entrylen; |
1506 | 1494 | ||