diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_iops.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 53 |
1 files changed, 13 insertions, 40 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 6075382336d7..58973bb46038 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | #include "xfs.h" | 18 | #include "xfs.h" |
| 19 | #include "xfs_fs.h" | 19 | #include "xfs_fs.h" |
| 20 | #include "xfs_acl.h" | ||
| 20 | #include "xfs_bit.h" | 21 | #include "xfs_bit.h" |
| 21 | #include "xfs_log.h" | 22 | #include "xfs_log.h" |
| 22 | #include "xfs_inum.h" | 23 | #include "xfs_inum.h" |
| @@ -51,6 +52,7 @@ | |||
| 51 | #include <linux/capability.h> | 52 | #include <linux/capability.h> |
| 52 | #include <linux/xattr.h> | 53 | #include <linux/xattr.h> |
| 53 | #include <linux/namei.h> | 54 | #include <linux/namei.h> |
| 55 | #include <linux/posix_acl.h> | ||
| 54 | #include <linux/security.h> | 56 | #include <linux/security.h> |
| 55 | #include <linux/falloc.h> | 57 | #include <linux/falloc.h> |
| 56 | #include <linux/fiemap.h> | 58 | #include <linux/fiemap.h> |
| @@ -202,9 +204,8 @@ xfs_vn_mknod( | |||
| 202 | { | 204 | { |
| 203 | struct inode *inode; | 205 | struct inode *inode; |
| 204 | struct xfs_inode *ip = NULL; | 206 | struct xfs_inode *ip = NULL; |
| 205 | xfs_acl_t *default_acl = NULL; | 207 | struct posix_acl *default_acl = NULL; |
| 206 | struct xfs_name name; | 208 | struct xfs_name name; |
| 207 | int (*test_default_acl)(struct inode *) = _ACL_DEFAULT_EXISTS; | ||
| 208 | int error; | 209 | int error; |
| 209 | 210 | ||
| 210 | /* | 211 | /* |
| @@ -219,18 +220,14 @@ xfs_vn_mknod( | |||
| 219 | rdev = 0; | 220 | rdev = 0; |
| 220 | } | 221 | } |
| 221 | 222 | ||
| 222 | if (test_default_acl && test_default_acl(dir)) { | 223 | if (IS_POSIXACL(dir)) { |
| 223 | if (!_ACL_ALLOC(default_acl)) { | 224 | default_acl = xfs_get_acl(dir, ACL_TYPE_DEFAULT); |
| 224 | return -ENOMEM; | 225 | if (IS_ERR(default_acl)) |
| 225 | } | 226 | return -PTR_ERR(default_acl); |
| 226 | if (!_ACL_GET_DEFAULT(dir, default_acl)) { | ||
| 227 | _ACL_FREE(default_acl); | ||
| 228 | default_acl = NULL; | ||
| 229 | } | ||
| 230 | } | ||
| 231 | 227 | ||
| 232 | if (IS_POSIXACL(dir) && !default_acl) | 228 | if (!default_acl) |
| 233 | mode &= ~current_umask(); | 229 | mode &= ~current_umask(); |
| 230 | } | ||
| 234 | 231 | ||
| 235 | xfs_dentry_to_name(&name, dentry); | 232 | xfs_dentry_to_name(&name, dentry); |
| 236 | error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL); | 233 | error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL); |
| @@ -244,10 +241,10 @@ xfs_vn_mknod( | |||
| 244 | goto out_cleanup_inode; | 241 | goto out_cleanup_inode; |
| 245 | 242 | ||
| 246 | if (default_acl) { | 243 | if (default_acl) { |
| 247 | error = _ACL_INHERIT(inode, mode, default_acl); | 244 | error = -xfs_inherit_acl(inode, default_acl); |
| 248 | if (unlikely(error)) | 245 | if (unlikely(error)) |
| 249 | goto out_cleanup_inode; | 246 | goto out_cleanup_inode; |
| 250 | _ACL_FREE(default_acl); | 247 | posix_acl_release(default_acl); |
| 251 | } | 248 | } |
| 252 | 249 | ||
| 253 | 250 | ||
| @@ -257,8 +254,7 @@ xfs_vn_mknod( | |||
| 257 | out_cleanup_inode: | 254 | out_cleanup_inode: |
| 258 | xfs_cleanup_inode(dir, inode, dentry); | 255 | xfs_cleanup_inode(dir, inode, dentry); |
| 259 | out_free_acl: | 256 | out_free_acl: |
| 260 | if (default_acl) | 257 | posix_acl_release(default_acl); |
| 261 | _ACL_FREE(default_acl); | ||
| 262 | return -error; | 258 | return -error; |
| 263 | } | 259 | } |
| 264 | 260 | ||
| @@ -488,26 +484,6 @@ xfs_vn_put_link( | |||
| 488 | kfree(s); | 484 | kfree(s); |
| 489 | } | 485 | } |
| 490 | 486 | ||
| 491 | #ifdef CONFIG_XFS_POSIX_ACL | ||
| 492 | STATIC int | ||
| 493 | xfs_check_acl( | ||
| 494 | struct inode *inode, | ||
| 495 | int mask) | ||
| 496 | { | ||
| 497 | struct xfs_inode *ip = XFS_I(inode); | ||
| 498 | int error; | ||
| 499 | |||
| 500 | xfs_itrace_entry(ip); | ||
| 501 | |||
| 502 | if (XFS_IFORK_Q(ip)) { | ||
| 503 | error = xfs_acl_iaccess(ip, mask, NULL); | ||
| 504 | if (error != -1) | ||
| 505 | return -error; | ||
| 506 | } | ||
| 507 | |||
| 508 | return -EAGAIN; | ||
| 509 | } | ||
| 510 | |||
| 511 | STATIC int | 487 | STATIC int |
| 512 | xfs_vn_permission( | 488 | xfs_vn_permission( |
| 513 | struct inode *inode, | 489 | struct inode *inode, |
| @@ -515,9 +491,6 @@ xfs_vn_permission( | |||
| 515 | { | 491 | { |
| 516 | return generic_permission(inode, mask, xfs_check_acl); | 492 | return generic_permission(inode, mask, xfs_check_acl); |
| 517 | } | 493 | } |
| 518 | #else | ||
| 519 | #define xfs_vn_permission NULL | ||
| 520 | #endif | ||
| 521 | 494 | ||
| 522 | STATIC int | 495 | STATIC int |
| 523 | xfs_vn_getattr( | 496 | xfs_vn_getattr( |
