diff options
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 68000a50ceb6..2967b7393415 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); |
