diff options
author | Dave Kleikamp <shaggy@austin.ibm.com> | 2006-01-24 15:34:47 -0500 |
---|---|---|
committer | Dave Kleikamp <shaggy@austin.ibm.com> | 2006-01-24 15:34:47 -0500 |
commit | 0a0fc0ddbe732779366ab6b1b879f62195e65967 (patch) | |
tree | 7b42490a676cf39ae0691b6859ecf7fd410f229b /fs/jfs | |
parent | 4d5dbd0945d9e0833dd7964a3d6ee33157f7cc7a (diff) | |
parent | 3ee68c4af3fd7228c1be63254b9f884614f9ebb2 (diff) |
Merge with /home/shaggy/git/linus-clean/
Diffstat (limited to 'fs/jfs')
-rw-r--r-- | fs/jfs/jfs_dmap.c | 3 | ||||
-rw-r--r-- | fs/jfs/jfs_imap.c | 6 | ||||
-rw-r--r-- | fs/jfs/jfs_incore.h | 4 | ||||
-rw-r--r-- | fs/jfs/jfs_txnmgr.c | 6 | ||||
-rw-r--r-- | fs/jfs/jfs_umount.c | 6 | ||||
-rw-r--r-- | fs/jfs/resize.c | 3 | ||||
-rw-r--r-- | fs/jfs/super.c | 3 | ||||
-rw-r--r-- | fs/jfs/xattr.c | 67 |
8 files changed, 21 insertions, 77 deletions
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index adb9f05093b2..038d8b76d113 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c | |||
@@ -302,8 +302,7 @@ int dbSync(struct inode *ipbmap) | |||
302 | /* | 302 | /* |
303 | * write out dirty pages of bmap | 303 | * write out dirty pages of bmap |
304 | */ | 304 | */ |
305 | filemap_fdatawrite(ipbmap->i_mapping); | 305 | filemap_write_and_wait(ipbmap->i_mapping); |
306 | filemap_fdatawait(ipbmap->i_mapping); | ||
307 | 306 | ||
308 | diWriteSpecial(ipbmap, 0); | 307 | diWriteSpecial(ipbmap, 0); |
309 | 308 | ||
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 28201b194f53..31b4aa13dd4b 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
@@ -265,8 +265,7 @@ int diSync(struct inode *ipimap) | |||
265 | /* | 265 | /* |
266 | * write out dirty pages of imap | 266 | * write out dirty pages of imap |
267 | */ | 267 | */ |
268 | filemap_fdatawrite(ipimap->i_mapping); | 268 | filemap_write_and_wait(ipimap->i_mapping); |
269 | filemap_fdatawait(ipimap->i_mapping); | ||
270 | 269 | ||
271 | diWriteSpecial(ipimap, 0); | 270 | diWriteSpecial(ipimap, 0); |
272 | 271 | ||
@@ -565,8 +564,7 @@ void diFreeSpecial(struct inode *ip) | |||
565 | jfs_err("diFreeSpecial called with NULL ip!"); | 564 | jfs_err("diFreeSpecial called with NULL ip!"); |
566 | return; | 565 | return; |
567 | } | 566 | } |
568 | filemap_fdatawrite(ip->i_mapping); | 567 | filemap_write_and_wait(ip->i_mapping); |
569 | filemap_fdatawait(ip->i_mapping); | ||
570 | truncate_inode_pages(ip->i_mapping, 0); | 568 | truncate_inode_pages(ip->i_mapping, 0); |
571 | iput(ip); | 569 | iput(ip); |
572 | } | 570 | } |
diff --git a/fs/jfs/jfs_incore.h b/fs/jfs/jfs_incore.h index c0fd7b3eadc6..dc21a5bd54d4 100644 --- a/fs/jfs/jfs_incore.h +++ b/fs/jfs/jfs_incore.h | |||
@@ -58,7 +58,7 @@ struct jfs_inode_info { | |||
58 | /* | 58 | /* |
59 | * rdwrlock serializes xtree between reads & writes and synchronizes | 59 | * rdwrlock serializes xtree between reads & writes and synchronizes |
60 | * changes to special inodes. It's use would be redundant on | 60 | * changes to special inodes. It's use would be redundant on |
61 | * directories since the i_sem taken in the VFS is sufficient. | 61 | * directories since the i_mutex taken in the VFS is sufficient. |
62 | */ | 62 | */ |
63 | struct rw_semaphore rdwrlock; | 63 | struct rw_semaphore rdwrlock; |
64 | /* | 64 | /* |
@@ -68,7 +68,7 @@ struct jfs_inode_info { | |||
68 | * inode is blocked in txBegin or TxBeginAnon | 68 | * inode is blocked in txBegin or TxBeginAnon |
69 | */ | 69 | */ |
70 | struct semaphore commit_sem; | 70 | struct semaphore commit_sem; |
71 | /* xattr_sem allows us to access the xattrs without taking i_sem */ | 71 | /* xattr_sem allows us to access the xattrs without taking i_mutex */ |
72 | struct rw_semaphore xattr_sem; | 72 | struct rw_semaphore xattr_sem; |
73 | lid_t xtlid; /* lid of xtree lock on directory */ | 73 | lid_t xtlid; /* lid of xtree lock on directory */ |
74 | #ifdef CONFIG_JFS_POSIX_ACL | 74 | #ifdef CONFIG_JFS_POSIX_ACL |
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index b660c93c92de..2ddb6b892bcf 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
@@ -1231,10 +1231,8 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
1231 | * when we don't need to worry about it at all. | 1231 | * when we don't need to worry about it at all. |
1232 | * | 1232 | * |
1233 | * if ((!S_ISDIR(ip->i_mode)) | 1233 | * if ((!S_ISDIR(ip->i_mode)) |
1234 | * && (tblk->flag & COMMIT_DELETE) == 0) { | 1234 | * && (tblk->flag & COMMIT_DELETE) == 0) |
1235 | * filemap_fdatawrite(ip->i_mapping); | 1235 | * filemap_write_and_wait(ip->i_mapping); |
1236 | * filemap_fdatawait(ip->i_mapping); | ||
1237 | * } | ||
1238 | */ | 1236 | */ |
1239 | 1237 | ||
1240 | /* | 1238 | /* |
diff --git a/fs/jfs/jfs_umount.c b/fs/jfs/jfs_umount.c index 5cf91785b541..21eaf7ac0fcb 100644 --- a/fs/jfs/jfs_umount.c +++ b/fs/jfs/jfs_umount.c | |||
@@ -108,8 +108,7 @@ int jfs_umount(struct super_block *sb) | |||
108 | * Make sure all metadata makes it to disk before we mark | 108 | * Make sure all metadata makes it to disk before we mark |
109 | * the superblock as clean | 109 | * the superblock as clean |
110 | */ | 110 | */ |
111 | filemap_fdatawrite(sbi->direct_inode->i_mapping); | 111 | filemap_write_and_wait(sbi->direct_inode->i_mapping); |
112 | filemap_fdatawait(sbi->direct_inode->i_mapping); | ||
113 | 112 | ||
114 | /* | 113 | /* |
115 | * ensure all file system file pages are propagated to their | 114 | * ensure all file system file pages are propagated to their |
@@ -161,8 +160,7 @@ int jfs_umount_rw(struct super_block *sb) | |||
161 | * mark the superblock clean before everything is flushed to | 160 | * mark the superblock clean before everything is flushed to |
162 | * disk. | 161 | * disk. |
163 | */ | 162 | */ |
164 | filemap_fdatawrite(sbi->direct_inode->i_mapping); | 163 | filemap_write_and_wait(sbi->direct_inode->i_mapping); |
165 | filemap_fdatawait(sbi->direct_inode->i_mapping); | ||
166 | 164 | ||
167 | updateSuper(sb, FM_CLEAN); | 165 | updateSuper(sb, FM_CLEAN); |
168 | 166 | ||
diff --git a/fs/jfs/resize.c b/fs/jfs/resize.c index c6dc254d3253..45180361871c 100644 --- a/fs/jfs/resize.c +++ b/fs/jfs/resize.c | |||
@@ -376,8 +376,7 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) | |||
376 | * by txCommit(); | 376 | * by txCommit(); |
377 | */ | 377 | */ |
378 | filemap_fdatawait(ipbmap->i_mapping); | 378 | filemap_fdatawait(ipbmap->i_mapping); |
379 | filemap_fdatawrite(ipbmap->i_mapping); | 379 | filemap_write_and_wait(ipbmap->i_mapping); |
380 | filemap_fdatawait(ipbmap->i_mapping); | ||
381 | diWriteSpecial(ipbmap, 0); | 380 | diWriteSpecial(ipbmap, 0); |
382 | 381 | ||
383 | newPage = nPages; /* first new page number */ | 382 | newPage = nPages; /* first new page number */ |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 4226af3ea91b..8d31f1336431 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -502,8 +502,7 @@ out_no_rw: | |||
502 | jfs_err("jfs_umount failed with return code %d", rc); | 502 | jfs_err("jfs_umount failed with return code %d", rc); |
503 | } | 503 | } |
504 | out_mount_failed: | 504 | out_mount_failed: |
505 | filemap_fdatawrite(sbi->direct_inode->i_mapping); | 505 | filemap_write_and_wait(sbi->direct_inode->i_mapping); |
506 | filemap_fdatawait(sbi->direct_inode->i_mapping); | ||
507 | truncate_inode_pages(sbi->direct_inode->i_mapping, 0); | 506 | truncate_inode_pages(sbi->direct_inode->i_mapping, 0); |
508 | make_bad_inode(sbi->direct_inode); | 507 | make_bad_inode(sbi->direct_inode); |
509 | iput(sbi->direct_inode); | 508 | iput(sbi->direct_inode); |
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index 23aa5066b5a4..f23048f9471f 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c | |||
@@ -17,6 +17,7 @@ | |||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/capability.h> | ||
20 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
21 | #include <linux/xattr.h> | 22 | #include <linux/xattr.h> |
22 | #include <linux/posix_acl_xattr.h> | 23 | #include <linux/posix_acl_xattr.h> |
@@ -83,21 +84,6 @@ struct ea_buffer { | |||
83 | #define EA_NEW 0x0004 | 84 | #define EA_NEW 0x0004 |
84 | #define EA_MALLOC 0x0008 | 85 | #define EA_MALLOC 0x0008 |
85 | 86 | ||
86 | /* Namespaces */ | ||
87 | #define XATTR_SYSTEM_PREFIX "system." | ||
88 | #define XATTR_SYSTEM_PREFIX_LEN (sizeof (XATTR_SYSTEM_PREFIX) - 1) | ||
89 | |||
90 | #define XATTR_USER_PREFIX "user." | ||
91 | #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) | ||
92 | |||
93 | #define XATTR_OS2_PREFIX "os2." | ||
94 | #define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1) | ||
95 | |||
96 | /* XATTR_SECURITY_PREFIX is defined in include/linux/xattr.h */ | ||
97 | #define XATTR_SECURITY_PREFIX_LEN (sizeof (XATTR_SECURITY_PREFIX) - 1) | ||
98 | |||
99 | #define XATTR_TRUSTED_PREFIX "trusted." | ||
100 | #define XATTR_TRUSTED_PREFIX_LEN (sizeof (XATTR_TRUSTED_PREFIX) - 1) | ||
101 | 87 | ||
102 | /* | 88 | /* |
103 | * These three routines are used to recognize on-disk extended attributes | 89 | * These three routines are used to recognize on-disk extended attributes |
@@ -773,36 +759,23 @@ static int can_set_system_xattr(struct inode *inode, const char *name, | |||
773 | static int can_set_xattr(struct inode *inode, const char *name, | 759 | static int can_set_xattr(struct inode *inode, const char *name, |
774 | const void *value, size_t value_len) | 760 | const void *value, size_t value_len) |
775 | { | 761 | { |
776 | if (IS_RDONLY(inode)) | 762 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) |
777 | return -EROFS; | ||
778 | |||
779 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) | ||
780 | return -EPERM; | ||
781 | |||
782 | if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0) | ||
783 | /* | ||
784 | * "system.*" | ||
785 | */ | ||
786 | return can_set_system_xattr(inode, name, value, value_len); | 763 | return can_set_system_xattr(inode, name, value, value_len); |
787 | 764 | ||
788 | if(strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0) | 765 | /* |
789 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); | 766 | * Don't allow setting an attribute in an unknown namespace. |
790 | 767 | */ | |
791 | #ifdef CONFIG_JFS_SECURITY | 768 | if (strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) && |
792 | if (strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) | 769 | strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) && |
793 | == 0) | 770 | strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) && |
794 | return 0; /* Leave it to the security module */ | 771 | strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN)) |
795 | #endif | ||
796 | |||
797 | if((strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) != 0) && | ||
798 | (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) != 0)) | ||
799 | return -EOPNOTSUPP; | 772 | return -EOPNOTSUPP; |
800 | 773 | ||
801 | if (!S_ISREG(inode->i_mode) && | 774 | if (!S_ISREG(inode->i_mode) && |
802 | (!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX)) | 775 | (!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX)) |
803 | return -EPERM; | 776 | return -EPERM; |
804 | 777 | ||
805 | return permission(inode, MAY_WRITE, NULL); | 778 | return 0; |
806 | } | 779 | } |
807 | 780 | ||
808 | int __jfs_setxattr(tid_t tid, struct inode *inode, const char *name, | 781 | int __jfs_setxattr(tid_t tid, struct inode *inode, const char *name, |
@@ -972,22 +945,6 @@ int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, | |||
972 | return rc; | 945 | return rc; |
973 | } | 946 | } |
974 | 947 | ||
975 | static int can_get_xattr(struct inode *inode, const char *name) | ||
976 | { | ||
977 | #ifdef CONFIG_JFS_SECURITY | ||
978 | if(strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) == 0) | ||
979 | return 0; | ||
980 | #endif | ||
981 | |||
982 | if(strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0) | ||
983 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); | ||
984 | |||
985 | if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0) | ||
986 | return 0; | ||
987 | |||
988 | return permission(inode, MAY_READ, NULL); | ||
989 | } | ||
990 | |||
991 | ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, | 948 | ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, |
992 | size_t buf_size) | 949 | size_t buf_size) |
993 | { | 950 | { |
@@ -998,12 +955,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, | |||
998 | ssize_t size; | 955 | ssize_t size; |
999 | int namelen = strlen(name); | 956 | int namelen = strlen(name); |
1000 | char *os2name = NULL; | 957 | char *os2name = NULL; |
1001 | int rc; | ||
1002 | char *value; | 958 | char *value; |
1003 | 959 | ||
1004 | if ((rc = can_get_xattr(inode, name))) | ||
1005 | return rc; | ||
1006 | |||
1007 | if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { | 960 | if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { |
1008 | os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1, | 961 | os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1, |
1009 | GFP_KERNEL); | 962 | GFP_KERNEL); |