Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge getxattr prototype change into work.lookups

The rest of work.xattr stuff isn't needed for this branch

Al Viro 84695ffe bf162006

+415 -459
+6
Documentation/filesystems/porting
··· 525 525 set_delayed_call() where it used to set *cookie. 526 526 ->put_link() is gone - just give the destructor to set_delayed_call() 527 527 in ->get_link(). 528 + -- 529 + [mandatory] 530 + ->getxattr() and xattr_handler.get() get dentry and inode passed separately. 531 + dentry might be yet to be attached to inode, so do _not_ use its ->d_inode 532 + in the instances. Rationale: !@#!@# security_d_instantiate() needs to be 533 + called before we attach dentry to inode.
+2 -2
drivers/staging/lustre/lustre/llite/llite_internal.h
··· 1042 1042 /* llite/xattr.c */ 1043 1043 int ll_setxattr(struct dentry *dentry, const char *name, 1044 1044 const void *value, size_t size, int flags); 1045 - ssize_t ll_getxattr(struct dentry *dentry, const char *name, 1046 - void *buffer, size_t size); 1045 + ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode, 1046 + const char *name, void *buffer, size_t size); 1047 1047 ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size); 1048 1048 int ll_removexattr(struct dentry *dentry, const char *name); 1049 1049
+2 -4
drivers/staging/lustre/lustre/llite/xattr.c
··· 451 451 return rc; 452 452 } 453 453 454 - ssize_t ll_getxattr(struct dentry *dentry, const char *name, 455 - void *buffer, size_t size) 454 + ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode, 455 + const char *name, void *buffer, size_t size) 456 456 { 457 - struct inode *inode = d_inode(dentry); 458 - 459 457 LASSERT(inode); 460 458 LASSERT(name); 461 459
+4 -4
fs/9p/acl.c
··· 93 93 * instantiating the inode (v9fs_inode_from_fid) 94 94 */ 95 95 acl = get_cached_acl(inode, type); 96 - BUG_ON(acl == ACL_NOT_CACHED); 96 + BUG_ON(is_uncached_acl(acl)); 97 97 return acl; 98 98 } 99 99 ··· 213 213 } 214 214 215 215 static int v9fs_xattr_get_acl(const struct xattr_handler *handler, 216 - struct dentry *dentry, const char *name, 217 - void *buffer, size_t size) 216 + struct dentry *dentry, struct inode *inode, 217 + const char *name, void *buffer, size_t size) 218 218 { 219 219 struct v9fs_session_info *v9ses; 220 220 struct posix_acl *acl; ··· 227 227 if ((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT) 228 228 return v9fs_xattr_get(dentry, handler->name, buffer, size); 229 229 230 - acl = v9fs_get_cached_acl(d_inode(dentry), handler->flags); 230 + acl = v9fs_get_cached_acl(inode, handler->flags); 231 231 if (IS_ERR(acl)) 232 232 return PTR_ERR(acl); 233 233 if (acl == NULL)
+1 -1
fs/9p/vfs_inode.c
··· 1071 1071 if (IS_ERR(st)) 1072 1072 return PTR_ERR(st); 1073 1073 1074 - v9fs_stat2inode(st, d_inode(dentry), d_inode(dentry)->i_sb); 1074 + v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb); 1075 1075 generic_fillattr(d_inode(dentry), stat); 1076 1076 1077 1077 p9stat_free(st);
+2 -2
fs/9p/xattr.c
··· 138 138 } 139 139 140 140 static int v9fs_xattr_handler_get(const struct xattr_handler *handler, 141 - struct dentry *dentry, const char *name, 142 - void *buffer, size_t size) 141 + struct dentry *dentry, struct inode *inode, 142 + const char *name, void *buffer, size_t size) 143 143 { 144 144 const char *full_name = xattr_full_name(handler, name); 145 145
+2 -2
fs/bad_inode.c
··· 106 106 return -EIO; 107 107 } 108 108 109 - static ssize_t bad_inode_getxattr(struct dentry *dentry, const char *name, 110 - void *buffer, size_t size) 109 + static ssize_t bad_inode_getxattr(struct dentry *dentry, struct inode *inode, 110 + const char *name, void *buffer, size_t size) 111 111 { 112 112 return -EIO; 113 113 }
-3
fs/btrfs/acl.c
··· 63 63 } 64 64 kfree(value); 65 65 66 - if (!IS_ERR(acl)) 67 - set_cached_acl(inode, type, acl); 68 - 69 66 return acl; 70 67 } 71 68
+3 -3
fs/btrfs/tree-log.c
··· 4988 4988 goto out; 4989 4989 4990 4990 if (!S_ISDIR(inode->i_mode)) { 4991 - if (!parent || d_really_is_negative(parent) || sb != d_inode(parent)->i_sb) 4991 + if (!parent || d_really_is_negative(parent) || sb != parent->d_sb) 4992 4992 goto out; 4993 4993 inode = d_inode(parent); 4994 4994 } ··· 5009 5009 break; 5010 5010 } 5011 5011 5012 - if (!parent || d_really_is_negative(parent) || sb != d_inode(parent)->i_sb) 5012 + if (!parent || d_really_is_negative(parent) || sb != parent->d_sb) 5013 5013 break; 5014 5014 5015 5015 if (IS_ROOT(parent)) ··· 5422 5422 } 5423 5423 5424 5424 while (1) { 5425 - if (!parent || d_really_is_negative(parent) || sb != d_inode(parent)->i_sb) 5425 + if (!parent || d_really_is_negative(parent) || sb != parent->d_sb) 5426 5426 break; 5427 5427 5428 5428 inode = d_inode(parent);
+2 -4
fs/btrfs/xattr.c
··· 369 369 } 370 370 371 371 static int btrfs_xattr_handler_get(const struct xattr_handler *handler, 372 - struct dentry *dentry, const char *name, 373 - void *buffer, size_t size) 372 + struct dentry *unused, struct inode *inode, 373 + const char *name, void *buffer, size_t size) 374 374 { 375 - struct inode *inode = d_inode(dentry); 376 - 377 375 name = xattr_full_name(handler, name); 378 376 return __btrfs_getxattr(inode, name, buffer, size); 379 377 }
+2
fs/ceph/acl.c
··· 37 37 spin_lock(&ci->i_ceph_lock); 38 38 if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0)) 39 39 set_cached_acl(inode, type, acl); 40 + else 41 + forget_cached_acl(inode, type); 40 42 spin_unlock(&ci->i_ceph_lock); 41 43 } 42 44
+1 -1
fs/ceph/super.h
··· 795 795 int __ceph_setxattr(struct dentry *, const char *, const void *, size_t, int); 796 796 ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); 797 797 int __ceph_removexattr(struct dentry *, const char *); 798 - extern ssize_t ceph_getxattr(struct dentry *, const char *, void *, size_t); 798 + extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); 799 799 extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); 800 800 extern int ceph_removexattr(struct dentry *, const char *); 801 801 extern void __ceph_build_xattrs_blob(struct ceph_inode_info *ci);
+4 -4
fs/ceph/xattr.c
··· 804 804 return err; 805 805 } 806 806 807 - ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, 808 - size_t size) 807 + ssize_t ceph_getxattr(struct dentry *dentry, struct inode *inode, 808 + const char *name, void *value, size_t size) 809 809 { 810 810 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) 811 - return generic_getxattr(dentry, name, value, size); 811 + return generic_getxattr(dentry, inode, name, value, size); 812 812 813 - return __ceph_getxattr(d_inode(dentry), name, value, size); 813 + return __ceph_getxattr(inode, name, value, size); 814 814 } 815 815 816 816 ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size)
+1 -1
fs/cifs/cifs_dfs_ref.c
··· 302 302 if (full_path == NULL) 303 303 goto cdda_exit; 304 304 305 - cifs_sb = CIFS_SB(d_inode(mntpt)->i_sb); 305 + cifs_sb = CIFS_SB(mntpt->d_sb); 306 306 tlink = cifs_sb_tlink(cifs_sb); 307 307 if (IS_ERR(tlink)) { 308 308 mnt = ERR_CAST(tlink);
+1 -1
fs/cifs/cifsfs.h
··· 123 123 extern int cifs_removexattr(struct dentry *, const char *); 124 124 extern int cifs_setxattr(struct dentry *, const char *, const void *, 125 125 size_t, int); 126 - extern ssize_t cifs_getxattr(struct dentry *, const char *, void *, size_t); 126 + extern ssize_t cifs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); 127 127 extern ssize_t cifs_listxattr(struct dentry *, char *, size_t); 128 128 extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); 129 129 #ifdef CONFIG_CIFS_NFSD_EXPORT
+1 -2
fs/cifs/inode.c
··· 2418 2418 int 2419 2419 cifs_setattr(struct dentry *direntry, struct iattr *attrs) 2420 2420 { 2421 - struct inode *inode = d_inode(direntry); 2422 - struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 2421 + struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb); 2423 2422 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb); 2424 2423 2425 2424 if (pTcon->unix_ext)
+1 -1
fs/cifs/readdir.c
··· 78 78 { 79 79 struct dentry *dentry, *alias; 80 80 struct inode *inode; 81 - struct super_block *sb = d_inode(parent)->i_sb; 81 + struct super_block *sb = parent->d_sb; 82 82 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 83 83 84 84 cifs_dbg(FYI, "%s: for %s\n", __func__, name->name);
+9 -47
fs/cifs/xattr.c
··· 42 42 int rc = -EOPNOTSUPP; 43 43 #ifdef CONFIG_CIFS_XATTR 44 44 unsigned int xid; 45 - struct cifs_sb_info *cifs_sb; 45 + struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb); 46 46 struct tcon_link *tlink; 47 47 struct cifs_tcon *pTcon; 48 - struct super_block *sb; 49 48 char *full_path = NULL; 50 49 51 - if (direntry == NULL) 52 - return -EIO; 53 - if (d_really_is_negative(direntry)) 54 - return -EIO; 55 - sb = d_inode(direntry)->i_sb; 56 - if (sb == NULL) 57 - return -EIO; 58 - 59 - cifs_sb = CIFS_SB(sb); 60 50 tlink = cifs_sb_tlink(cifs_sb); 61 51 if (IS_ERR(tlink)) 62 52 return PTR_ERR(tlink); ··· 93 103 int rc = -EOPNOTSUPP; 94 104 #ifdef CONFIG_CIFS_XATTR 95 105 unsigned int xid; 96 - struct cifs_sb_info *cifs_sb; 106 + struct super_block *sb = direntry->d_sb; 107 + struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 97 108 struct tcon_link *tlink; 98 109 struct cifs_tcon *pTcon; 99 - struct super_block *sb; 100 110 char *full_path; 101 111 102 - if (direntry == NULL) 103 - return -EIO; 104 - if (d_really_is_negative(direntry)) 105 - return -EIO; 106 - sb = d_inode(direntry)->i_sb; 107 - if (sb == NULL) 108 - return -EIO; 109 - 110 - cifs_sb = CIFS_SB(sb); 111 112 tlink = cifs_sb_tlink(cifs_sb); 112 113 if (IS_ERR(tlink)) 113 114 return PTR_ERR(tlink); ··· 213 232 return rc; 214 233 } 215 234 216 - ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, 217 - void *ea_value, size_t buf_size) 235 + ssize_t cifs_getxattr(struct dentry *direntry, struct inode *inode, 236 + const char *ea_name, void *ea_value, size_t buf_size) 218 237 { 219 238 ssize_t rc = -EOPNOTSUPP; 220 239 #ifdef CONFIG_CIFS_XATTR 221 240 unsigned int xid; 222 - struct cifs_sb_info *cifs_sb; 241 + struct super_block *sb = direntry->d_sb; 242 + struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 223 243 struct tcon_link *tlink; 224 244 struct cifs_tcon *pTcon; 225 - struct super_block *sb; 226 245 char *full_path; 227 246 228 - if (direntry == NULL) 229 - return -EIO; 230 - if (d_really_is_negative(direntry)) 231 - return -EIO; 232 - sb = d_inode(direntry)->i_sb; 233 - if (sb == NULL) 234 - return -EIO; 235 - 236 - cifs_sb = CIFS_SB(sb); 237 247 tlink = cifs_sb_tlink(cifs_sb); 238 248 if (IS_ERR(tlink)) 239 249 return PTR_ERR(tlink); ··· 296 324 goto get_ea_exit; /* rc already EOPNOTSUPP */ 297 325 298 326 pacl = pTcon->ses->server->ops->get_acl(cifs_sb, 299 - d_inode(direntry), full_path, &acllen); 327 + inode, full_path, &acllen); 300 328 if (IS_ERR(pacl)) { 301 329 rc = PTR_ERR(pacl); 302 330 cifs_dbg(VFS, "%s: error %zd getting sec desc\n", ··· 346 374 ssize_t rc = -EOPNOTSUPP; 347 375 #ifdef CONFIG_CIFS_XATTR 348 376 unsigned int xid; 349 - struct cifs_sb_info *cifs_sb; 377 + struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb); 350 378 struct tcon_link *tlink; 351 379 struct cifs_tcon *pTcon; 352 - struct super_block *sb; 353 380 char *full_path; 354 381 355 - if (direntry == NULL) 356 - return -EIO; 357 - if (d_really_is_negative(direntry)) 358 - return -EIO; 359 - sb = d_inode(direntry)->i_sb; 360 - if (sb == NULL) 361 - return -EIO; 362 - 363 - cifs_sb = CIFS_SB(sb); 364 382 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) 365 383 return -EOPNOTSUPP; 366 384
+4 -1
fs/ecryptfs/crypto.c
··· 1369 1369 ssize_t size; 1370 1370 int rc = 0; 1371 1371 1372 - size = ecryptfs_getxattr_lower(lower_dentry, ECRYPTFS_XATTR_NAME, 1372 + size = ecryptfs_getxattr_lower(lower_dentry, 1373 + ecryptfs_inode_to_lower(ecryptfs_inode), 1374 + ECRYPTFS_XATTR_NAME, 1373 1375 page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE); 1374 1376 if (size < 0) { 1375 1377 if (unlikely(ecryptfs_verbosity > 0)) ··· 1393 1391 int rc; 1394 1392 1395 1393 rc = ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), 1394 + ecryptfs_inode_to_lower(inode), 1396 1395 ECRYPTFS_XATTR_NAME, file_size, 1397 1396 ECRYPTFS_SIZE_AND_MARKER_BYTES); 1398 1397 if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES)
+2 -2
fs/ecryptfs/ecryptfs_kernel.h
··· 607 607 unsigned char *src, struct dentry *ecryptfs_dentry); 608 608 int ecryptfs_truncate(struct dentry *dentry, loff_t new_length); 609 609 ssize_t 610 - ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, 611 - void *value, size_t size); 610 + ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode, 611 + const char *name, void *value, size_t size); 612 612 int 613 613 ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, 614 614 size_t size, int flags);
+12 -11
fs/ecryptfs/inode.c
··· 1033 1033 } 1034 1034 1035 1035 ssize_t 1036 - ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, 1037 - void *value, size_t size) 1036 + ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode, 1037 + const char *name, void *value, size_t size) 1038 1038 { 1039 1039 int rc = 0; 1040 1040 1041 - if (!d_inode(lower_dentry)->i_op->getxattr) { 1041 + if (!lower_inode->i_op->getxattr) { 1042 1042 rc = -EOPNOTSUPP; 1043 1043 goto out; 1044 1044 } 1045 - inode_lock(d_inode(lower_dentry)); 1046 - rc = d_inode(lower_dentry)->i_op->getxattr(lower_dentry, name, value, 1047 - size); 1048 - inode_unlock(d_inode(lower_dentry)); 1045 + inode_lock(lower_inode); 1046 + rc = lower_inode->i_op->getxattr(lower_dentry, lower_inode, 1047 + name, value, size); 1048 + inode_unlock(lower_inode); 1049 1049 out: 1050 1050 return rc; 1051 1051 } 1052 1052 1053 1053 static ssize_t 1054 - ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value, 1055 - size_t size) 1054 + ecryptfs_getxattr(struct dentry *dentry, struct inode *inode, 1055 + const char *name, void *value, size_t size) 1056 1056 { 1057 - return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), name, 1058 - value, size); 1057 + return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), 1058 + ecryptfs_inode_to_lower(inode), 1059 + name, value, size); 1059 1060 } 1060 1061 1061 1062 static ssize_t
+2 -1
fs/ecryptfs/mmap.c
··· 436 436 goto out; 437 437 } 438 438 inode_lock(lower_inode); 439 - size = lower_inode->i_op->getxattr(lower_dentry, ECRYPTFS_XATTR_NAME, 439 + size = lower_inode->i_op->getxattr(lower_dentry, lower_inode, 440 + ECRYPTFS_XATTR_NAME, 440 441 xattr_virt, PAGE_SIZE); 441 442 if (size < 0) 442 443 size = 8;
+1 -1
fs/efs/namei.c
··· 113 113 114 114 ino = efs_find_entry(d_inode(child), "..", 2); 115 115 if (ino) 116 - parent = d_obtain_alias(efs_iget(d_inode(child)->i_sb, ino)); 116 + parent = d_obtain_alias(efs_iget(child->d_sb, ino)); 117 117 118 118 return parent; 119 119 }
+1 -1
fs/exofs/super.c
··· 958 958 if (!ino) 959 959 return ERR_PTR(-ESTALE); 960 960 961 - return d_obtain_alias(exofs_iget(d_inode(child)->i_sb, ino)); 961 + return d_obtain_alias(exofs_iget(child->d_sb, ino)); 962 962 } 963 963 964 964 static struct inode *exofs_nfs_get_inode(struct super_block *sb,
-3
fs/ext2/acl.c
··· 172 172 acl = ERR_PTR(retval); 173 173 kfree(value); 174 174 175 - if (!IS_ERR(acl)) 176 - set_cached_acl(inode, type, acl); 177 - 178 175 return acl; 179 176 } 180 177
+1 -1
fs/ext2/namei.c
··· 82 82 unsigned long ino = ext2_inode_by_name(d_inode(child), &dotdot); 83 83 if (!ino) 84 84 return ERR_PTR(-ENOENT); 85 - return d_obtain_alias(ext2_iget(d_inode(child)->i_sb, ino)); 85 + return d_obtain_alias(ext2_iget(child->d_sb, ino)); 86 86 } 87 87 88 88 /*
+3 -3
fs/ext2/xattr_security.c
··· 9 9 10 10 static int 11 11 ext2_xattr_security_get(const struct xattr_handler *handler, 12 - struct dentry *dentry, const char *name, 13 - void *buffer, size_t size) 12 + struct dentry *unused, struct inode *inode, 13 + const char *name, void *buffer, size_t size) 14 14 { 15 - return ext2_xattr_get(d_inode(dentry), EXT2_XATTR_INDEX_SECURITY, name, 15 + return ext2_xattr_get(inode, EXT2_XATTR_INDEX_SECURITY, name, 16 16 buffer, size); 17 17 } 18 18
+3 -3
fs/ext2/xattr_trusted.c
··· 16 16 17 17 static int 18 18 ext2_xattr_trusted_get(const struct xattr_handler *handler, 19 - struct dentry *dentry, const char *name, 20 - void *buffer, size_t size) 19 + struct dentry *unused, struct inode *inode, 20 + const char *name, void *buffer, size_t size) 21 21 { 22 - return ext2_xattr_get(d_inode(dentry), EXT2_XATTR_INDEX_TRUSTED, name, 22 + return ext2_xattr_get(inode, EXT2_XATTR_INDEX_TRUSTED, name, 23 23 buffer, size); 24 24 } 25 25
+4 -4
fs/ext2/xattr_user.c
··· 18 18 19 19 static int 20 20 ext2_xattr_user_get(const struct xattr_handler *handler, 21 - struct dentry *dentry, const char *name, 22 - void *buffer, size_t size) 21 + struct dentry *unused, struct inode *inode, 22 + const char *name, void *buffer, size_t size) 23 23 { 24 - if (!test_opt(dentry->d_sb, XATTR_USER)) 24 + if (!test_opt(inode->i_sb, XATTR_USER)) 25 25 return -EOPNOTSUPP; 26 - return ext2_xattr_get(d_inode(dentry), EXT2_XATTR_INDEX_USER, 26 + return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, 27 27 name, buffer, size); 28 28 } 29 29
-3
fs/ext4/acl.c
··· 172 172 acl = ERR_PTR(retval); 173 173 kfree(value); 174 174 175 - if (!IS_ERR(acl)) 176 - set_cached_acl(inode, type, acl); 177 - 178 175 return acl; 179 176 } 180 177
+2 -2
fs/ext4/namei.c
··· 1638 1638 ino = le32_to_cpu(de->inode); 1639 1639 brelse(bh); 1640 1640 1641 - if (!ext4_valid_inum(d_inode(child)->i_sb, ino)) { 1641 + if (!ext4_valid_inum(child->d_sb, ino)) { 1642 1642 EXT4_ERROR_INODE(d_inode(child), 1643 1643 "bad parent inode number: %u", ino); 1644 1644 return ERR_PTR(-EFSCORRUPTED); 1645 1645 } 1646 1646 1647 - return d_obtain_alias(ext4_iget_normal(d_inode(child)->i_sb, ino)); 1647 + return d_obtain_alias(ext4_iget_normal(child->d_sb, ino)); 1648 1648 } 1649 1649 1650 1650 /*
+3 -3
fs/ext4/xattr_security.c
··· 13 13 14 14 static int 15 15 ext4_xattr_security_get(const struct xattr_handler *handler, 16 - struct dentry *dentry, const char *name, 17 - void *buffer, size_t size) 16 + struct dentry *unused, struct inode *inode, 17 + const char *name, void *buffer, size_t size) 18 18 { 19 - return ext4_xattr_get(d_inode(dentry), EXT4_XATTR_INDEX_SECURITY, 19 + return ext4_xattr_get(inode, EXT4_XATTR_INDEX_SECURITY, 20 20 name, buffer, size); 21 21 } 22 22
+3 -3
fs/ext4/xattr_trusted.c
··· 20 20 21 21 static int 22 22 ext4_xattr_trusted_get(const struct xattr_handler *handler, 23 - struct dentry *dentry, const char *name, void *buffer, 24 - size_t size) 23 + struct dentry *unused, struct inode *inode, 24 + const char *name, void *buffer, size_t size) 25 25 { 26 - return ext4_xattr_get(d_inode(dentry), EXT4_XATTR_INDEX_TRUSTED, 26 + return ext4_xattr_get(inode, EXT4_XATTR_INDEX_TRUSTED, 27 27 name, buffer, size); 28 28 } 29 29
+4 -4
fs/ext4/xattr_user.c
··· 19 19 20 20 static int 21 21 ext4_xattr_user_get(const struct xattr_handler *handler, 22 - struct dentry *dentry, const char *name, 23 - void *buffer, size_t size) 22 + struct dentry *unused, struct inode *inode, 23 + const char *name, void *buffer, size_t size) 24 24 { 25 - if (!test_opt(dentry->d_sb, XATTR_USER)) 25 + if (!test_opt(inode->i_sb, XATTR_USER)) 26 26 return -EOPNOTSUPP; 27 - return ext4_xattr_get(d_inode(dentry), EXT4_XATTR_INDEX_USER, 27 + return ext4_xattr_get(inode, EXT4_XATTR_INDEX_USER, 28 28 name, buffer, size); 29 29 } 30 30
-3
fs/f2fs/acl.c
··· 190 190 acl = ERR_PTR(retval); 191 191 kfree(value); 192 192 193 - if (!IS_ERR(acl)) 194 - set_cached_acl(inode, type, acl); 195 - 196 193 return acl; 197 194 } 198 195
+1 -1
fs/f2fs/namei.c
··· 202 202 unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot); 203 203 if (!ino) 204 204 return ERR_PTR(-ENOENT); 205 - return d_obtain_alias(f2fs_iget(d_inode(child)->i_sb, ino)); 205 + return d_obtain_alias(f2fs_iget(child->d_sb, ino)); 206 206 } 207 207 208 208 static int __recover_dot_dentries(struct inode *dir, nid_t pino)
+6 -8
fs/f2fs/xattr.c
··· 26 26 #include "xattr.h" 27 27 28 28 static int f2fs_xattr_generic_get(const struct xattr_handler *handler, 29 - struct dentry *dentry, const char *name, void *buffer, 30 - size_t size) 29 + struct dentry *unused, struct inode *inode, 30 + const char *name, void *buffer, size_t size) 31 31 { 32 - struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); 32 + struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); 33 33 34 34 switch (handler->flags) { 35 35 case F2FS_XATTR_INDEX_USER: ··· 45 45 default: 46 46 return -EINVAL; 47 47 } 48 - return f2fs_getxattr(d_inode(dentry), handler->flags, name, 48 + return f2fs_getxattr(inode, handler->flags, name, 49 49 buffer, size, NULL); 50 50 } 51 51 ··· 86 86 } 87 87 88 88 static int f2fs_xattr_advise_get(const struct xattr_handler *handler, 89 - struct dentry *dentry, const char *name, void *buffer, 90 - size_t size) 89 + struct dentry *unused, struct inode *inode, 90 + const char *name, void *buffer, size_t size) 91 91 { 92 - struct inode *inode = d_inode(dentry); 93 - 94 92 if (buffer) 95 93 *((char *)buffer) = F2FS_I(inode)->i_advise; 96 94 return sizeof(char);
+2 -3
fs/fuse/dir.c
··· 1759 1759 return err; 1760 1760 } 1761 1761 1762 - static ssize_t fuse_getxattr(struct dentry *entry, const char *name, 1763 - void *value, size_t size) 1762 + static ssize_t fuse_getxattr(struct dentry *entry, struct inode *inode, 1763 + const char *name, void *value, size_t size) 1764 1764 { 1765 - struct inode *inode = d_inode(entry); 1766 1765 struct fuse_conn *fc = get_fuse_conn(inode); 1767 1766 FUSE_ARGS(args); 1768 1767 struct fuse_getxattr_in inarg;
+4 -5
fs/gfs2/inode.c
··· 1968 1968 return ret; 1969 1969 } 1970 1970 1971 - static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name, 1972 - void *data, size_t size) 1971 + static ssize_t gfs2_getxattr(struct dentry *dentry, struct inode *inode, 1972 + const char *name, void *data, size_t size) 1973 1973 { 1974 - struct inode *inode = d_inode(dentry); 1975 1974 struct gfs2_inode *ip = GFS2_I(inode); 1976 1975 struct gfs2_holder gh; 1977 1976 int ret; 1978 1977 1979 1978 /* For selinux during lookup */ 1980 1979 if (gfs2_glock_is_locked_by_me(ip->i_gl)) 1981 - return generic_getxattr(dentry, name, data, size); 1980 + return generic_getxattr(dentry, inode, name, data, size); 1982 1981 1983 1982 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); 1984 1983 ret = gfs2_glock_nq(&gh); 1985 1984 if (ret == 0) { 1986 - ret = generic_getxattr(dentry, name, data, size); 1985 + ret = generic_getxattr(dentry, inode, name, data, size); 1987 1986 gfs2_glock_dq(&gh); 1988 1987 } 1989 1988 gfs2_holder_uninit(&gh);
+1 -1
fs/gfs2/ops_fstype.c
··· 1360 1360 return ERR_PTR(error); 1361 1361 } 1362 1362 s = sget(&gfs2_fs_type, test_gfs2_super, set_meta_super, flags, 1363 - d_inode(path.dentry)->i_sb->s_bdev); 1363 + path.dentry->d_sb->s_bdev); 1364 1364 path_put(&path); 1365 1365 if (IS_ERR(s)) { 1366 1366 pr_warn("gfs2 mount does not exist\n");
+1 -1
fs/gfs2/super.c
··· 1176 1176 1177 1177 static int gfs2_statfs(struct dentry *dentry, struct kstatfs *buf) 1178 1178 { 1179 - struct super_block *sb = d_inode(dentry)->i_sb; 1179 + struct super_block *sb = dentry->d_sb; 1180 1180 struct gfs2_sbd *sdp = sb->s_fs_info; 1181 1181 struct gfs2_statfs_change_host sc; 1182 1182 int error;
+3 -3
fs/gfs2/xattr.c
··· 584 584 * Returns: actual size of data on success, -errno on error 585 585 */ 586 586 static int gfs2_xattr_get(const struct xattr_handler *handler, 587 - struct dentry *dentry, const char *name, 588 - void *buffer, size_t size) 587 + struct dentry *unused, struct inode *inode, 588 + const char *name, void *buffer, size_t size) 589 589 { 590 - struct gfs2_inode *ip = GFS2_I(d_inode(dentry)); 590 + struct gfs2_inode *ip = GFS2_I(inode); 591 591 struct gfs2_ea_location el; 592 592 int type = handler->flags; 593 593 int error;
+2 -3
fs/hfs/attr.c
··· 56 56 return res; 57 57 } 58 58 59 - ssize_t hfs_getxattr(struct dentry *dentry, const char *name, 60 - void *value, size_t size) 59 + ssize_t hfs_getxattr(struct dentry *unused, struct inode *inode, 60 + const char *name, void *value, size_t size) 61 61 { 62 - struct inode *inode = d_inode(dentry); 63 62 struct hfs_find_data fd; 64 63 hfs_cat_rec rec; 65 64 struct hfs_cat_file *file;
+2 -2
fs/hfs/hfs_fs.h
··· 213 213 /* attr.c */ 214 214 extern int hfs_setxattr(struct dentry *dentry, const char *name, 215 215 const void *value, size_t size, int flags); 216 - extern ssize_t hfs_getxattr(struct dentry *dentry, const char *name, 217 - void *value, size_t size); 216 + extern ssize_t hfs_getxattr(struct dentry *dentry, struct inode *inode, 217 + const char *name, void *value, size_t size); 218 218 extern ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size); 219 219 220 220 /* mdb.c */
-3
fs/hfsplus/posix_acl.c
··· 48 48 49 49 hfsplus_destroy_attr_entry((hfsplus_attr_entry *)value); 50 50 51 - if (!IS_ERR(acl)) 52 - set_cached_acl(inode, type, acl); 53 - 54 51 return acl; 55 52 } 56 53
+5 -5
fs/hfsplus/xattr.c
··· 579 579 return res; 580 580 } 581 581 582 - ssize_t hfsplus_getxattr(struct dentry *dentry, const char *name, 582 + ssize_t hfsplus_getxattr(struct inode *inode, const char *name, 583 583 void *value, size_t size, 584 584 const char *prefix, size_t prefixlen) 585 585 { ··· 594 594 strcpy(xattr_name, prefix); 595 595 strcpy(xattr_name + prefixlen, name); 596 596 597 - res = __hfsplus_getxattr(d_inode(dentry), xattr_name, value, size); 597 + res = __hfsplus_getxattr(inode, xattr_name, value, size); 598 598 kfree(xattr_name); 599 599 return res; 600 600 ··· 844 844 } 845 845 846 846 static int hfsplus_osx_getxattr(const struct xattr_handler *handler, 847 - struct dentry *dentry, const char *name, 848 - void *buffer, size_t size) 847 + struct dentry *unused, struct inode *inode, 848 + const char *name, void *buffer, size_t size) 849 849 { 850 850 /* 851 851 * Don't allow retrieving properly prefixed attributes ··· 860 860 * creates), so we pass the name through unmodified (after 861 861 * ensuring it doesn't conflict with another namespace). 862 862 */ 863 - return __hfsplus_getxattr(d_inode(dentry), name, buffer, size); 863 + return __hfsplus_getxattr(inode, name, buffer, size); 864 864 } 865 865 866 866 static int hfsplus_osx_setxattr(const struct xattr_handler *handler,
+1 -1
fs/hfsplus/xattr.h
··· 28 28 ssize_t __hfsplus_getxattr(struct inode *inode, const char *name, 29 29 void *value, size_t size); 30 30 31 - ssize_t hfsplus_getxattr(struct dentry *dentry, const char *name, 31 + ssize_t hfsplus_getxattr(struct inode *inode, const char *name, 32 32 void *value, size_t size, 33 33 const char *prefix, size_t prefixlen); 34 34
+3 -3
fs/hfsplus/xattr_security.c
··· 14 14 #include "acl.h" 15 15 16 16 static int hfsplus_security_getxattr(const struct xattr_handler *handler, 17 - struct dentry *dentry, const char *name, 18 - void *buffer, size_t size) 17 + struct dentry *unused, struct inode *inode, 18 + const char *name, void *buffer, size_t size) 19 19 { 20 - return hfsplus_getxattr(dentry, name, buffer, size, 20 + return hfsplus_getxattr(inode, name, buffer, size, 21 21 XATTR_SECURITY_PREFIX, 22 22 XATTR_SECURITY_PREFIX_LEN); 23 23 }
+3 -3
fs/hfsplus/xattr_trusted.c
··· 12 12 #include "xattr.h" 13 13 14 14 static int hfsplus_trusted_getxattr(const struct xattr_handler *handler, 15 - struct dentry *dentry, const char *name, 16 - void *buffer, size_t size) 15 + struct dentry *unused, struct inode *inode, 16 + const char *name, void *buffer, size_t size) 17 17 { 18 - return hfsplus_getxattr(dentry, name, buffer, size, 18 + return hfsplus_getxattr(inode, name, buffer, size, 19 19 XATTR_TRUSTED_PREFIX, 20 20 XATTR_TRUSTED_PREFIX_LEN); 21 21 }
+3 -3
fs/hfsplus/xattr_user.c
··· 12 12 #include "xattr.h" 13 13 14 14 static int hfsplus_user_getxattr(const struct xattr_handler *handler, 15 - struct dentry *dentry, const char *name, 16 - void *buffer, size_t size) 15 + struct dentry *unused, struct inode *inode, 16 + const char *name, void *buffer, size_t size) 17 17 { 18 18 19 - return hfsplus_getxattr(dentry, name, buffer, size, 19 + return hfsplus_getxattr(inode, name, buffer, size, 20 20 XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); 21 21 } 22 22
+2 -2
fs/inode.c
··· 238 238 } 239 239 240 240 #ifdef CONFIG_FS_POSIX_ACL 241 - if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED) 241 + if (inode->i_acl && !is_uncached_acl(inode->i_acl)) 242 242 posix_acl_release(inode->i_acl); 243 - if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) 243 + if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl)) 244 244 posix_acl_release(inode->i_default_acl); 245 245 #endif 246 246 this_cpu_dec(nr_inodes);
-2
fs/jffs2/acl.c
··· 203 203 acl = ERR_PTR(rc); 204 204 } 205 205 kfree(value); 206 - if (!IS_ERR(acl)) 207 - set_cached_acl(inode, type, acl); 208 206 return acl; 209 207 } 210 208
+1 -1
fs/jffs2/dir.c
··· 241 241 242 242 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry) 243 243 { 244 - struct jffs2_sb_info *c = JFFS2_SB_INFO(d_inode(old_dentry)->i_sb); 244 + struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_sb); 245 245 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry)); 246 246 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i); 247 247 int ret;
+3 -3
fs/jffs2/security.c
··· 49 49 50 50 /* ---- XATTR Handler for "security.*" ----------------- */ 51 51 static int jffs2_security_getxattr(const struct xattr_handler *handler, 52 - struct dentry *dentry, const char *name, 53 - void *buffer, size_t size) 52 + struct dentry *unused, struct inode *inode, 53 + const char *name, void *buffer, size_t size) 54 54 { 55 - return do_jffs2_getxattr(d_inode(dentry), JFFS2_XPREFIX_SECURITY, 55 + return do_jffs2_getxattr(inode, JFFS2_XPREFIX_SECURITY, 56 56 name, buffer, size); 57 57 } 58 58
+1 -1
fs/jffs2/super.c
··· 147 147 JFFS2_DEBUG("Parent of directory ino #%u is #%u\n", 148 148 f->inocache->ino, pino); 149 149 150 - return d_obtain_alias(jffs2_iget(d_inode(child)->i_sb, pino)); 150 + return d_obtain_alias(jffs2_iget(child->d_sb, pino)); 151 151 } 152 152 153 153 static const struct export_operations jffs2_export_ops = {
+3 -3
fs/jffs2/xattr_trusted.c
··· 17 17 #include "nodelist.h" 18 18 19 19 static int jffs2_trusted_getxattr(const struct xattr_handler *handler, 20 - struct dentry *dentry, const char *name, 21 - void *buffer, size_t size) 20 + struct dentry *unused, struct inode *inode, 21 + const char *name, void *buffer, size_t size) 22 22 { 23 - return do_jffs2_getxattr(d_inode(dentry), JFFS2_XPREFIX_TRUSTED, 23 + return do_jffs2_getxattr(inode, JFFS2_XPREFIX_TRUSTED, 24 24 name, buffer, size); 25 25 } 26 26
+3 -3
fs/jffs2/xattr_user.c
··· 17 17 #include "nodelist.h" 18 18 19 19 static int jffs2_user_getxattr(const struct xattr_handler *handler, 20 - struct dentry *dentry, const char *name, 21 - void *buffer, size_t size) 20 + struct dentry *unused, struct inode *inode, 21 + const char *name, void *buffer, size_t size) 22 22 { 23 - return do_jffs2_getxattr(d_inode(dentry), JFFS2_XPREFIX_USER, 23 + return do_jffs2_getxattr(inode, JFFS2_XPREFIX_USER, 24 24 name, buffer, size); 25 25 } 26 26
-6
fs/jfs/acl.c
··· 34 34 int size; 35 35 char *value = NULL; 36 36 37 - acl = get_cached_acl(inode, type); 38 - if (acl != ACL_NOT_CACHED) 39 - return acl; 40 - 41 37 switch(type) { 42 38 case ACL_TYPE_ACCESS: 43 39 ea_name = XATTR_NAME_POSIX_ACL_ACCESS; ··· 63 67 acl = posix_acl_from_xattr(&init_user_ns, value, size); 64 68 } 65 69 kfree(value); 66 - if (!IS_ERR(acl)) 67 - set_cached_acl(inode, type, acl); 68 70 return acl; 69 71 } 70 72
+1 -1
fs/jfs/jfs_xattr.h
··· 57 57 extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, 58 58 int); 59 59 extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); 60 - extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); 60 + extern ssize_t jfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); 61 61 extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); 62 62 extern int jfs_removexattr(struct dentry *, const char *); 63 63
+1 -1
fs/jfs/namei.c
··· 1524 1524 parent_ino = 1525 1525 le32_to_cpu(JFS_IP(d_inode(dentry))->i_dtroot.header.idotdot); 1526 1526 1527 - return d_obtain_alias(jfs_iget(d_inode(dentry)->i_sb, parent_ino)); 1527 + return d_obtain_alias(jfs_iget(dentry->d_sb, parent_ino)); 1528 1528 } 1529 1529 1530 1530 const struct inode_operations jfs_dir_inode_operations = {
+4 -4
fs/jfs/xattr.c
··· 933 933 return size; 934 934 } 935 935 936 - ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data, 937 - size_t buf_size) 936 + ssize_t jfs_getxattr(struct dentry *dentry, struct inode *inode, 937 + const char *name, void *data, size_t buf_size) 938 938 { 939 939 int err; 940 940 ··· 944 944 * for it via sb->s_xattr. 945 945 */ 946 946 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) 947 - return generic_getxattr(dentry, name, data, buf_size); 947 + return generic_getxattr(dentry, inode, name, data, buf_size); 948 948 949 949 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { 950 950 /* ··· 959 959 return -EOPNOTSUPP; 960 960 } 961 961 962 - err = __jfs_getxattr(d_inode(dentry), name, data, buf_size); 962 + err = __jfs_getxattr(inode, name, data, buf_size); 963 963 964 964 return err; 965 965 }
+3 -3
fs/kernfs/inode.c
··· 208 208 return simple_xattr_set(&attrs->xattrs, name, NULL, 0, XATTR_REPLACE); 209 209 } 210 210 211 - ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, 212 - size_t size) 211 + ssize_t kernfs_iop_getxattr(struct dentry *unused, struct inode *inode, 212 + const char *name, void *buf, size_t size) 213 213 { 214 - struct kernfs_node *kn = dentry->d_fsdata; 214 + struct kernfs_node *kn = inode->i_private; 215 215 struct kernfs_iattrs *attrs; 216 216 217 217 attrs = kernfs_iattrs(kn);
+2 -2
fs/kernfs/kernfs-internal.h
··· 84 84 int kernfs_iop_setxattr(struct dentry *dentry, const char *name, const void *value, 85 85 size_t size, int flags); 86 86 int kernfs_iop_removexattr(struct dentry *dentry, const char *name); 87 - ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, 88 - size_t size); 87 + ssize_t kernfs_iop_getxattr(struct dentry *dentry, struct inode *inode, 88 + const char *name, void *buf, size_t size); 89 89 ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size); 90 90 91 91 /*
+2 -2
fs/libfs.c
··· 1127 1127 return -EOPNOTSUPP; 1128 1128 } 1129 1129 1130 - static ssize_t empty_dir_getxattr(struct dentry *dentry, const char *name, 1131 - void *value, size_t size) 1130 + static ssize_t empty_dir_getxattr(struct dentry *dentry, struct inode *inode, 1131 + const char *name, void *value, size_t size) 1132 1132 { 1133 1133 return -EOPNOTSUPP; 1134 1134 }
+3 -3
fs/namei.c
··· 265 265 if (!acl) 266 266 return -EAGAIN; 267 267 /* no ->get_acl() calls in RCU mode... */ 268 - if (acl == ACL_NOT_CACHED) 268 + if (is_uncached_acl(acl)) 269 269 return -ECHILD; 270 270 return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); 271 271 } ··· 2655 2655 return NULL; 2656 2656 } 2657 2657 2658 - mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex); 2658 + mutex_lock(&p1->d_sb->s_vfs_rename_mutex); 2659 2659 2660 2660 p = d_ancestor(p2, p1); 2661 2661 if (p) { ··· 2682 2682 inode_unlock(p1->d_inode); 2683 2683 if (p1 != p2) { 2684 2684 inode_unlock(p2->d_inode); 2685 - mutex_unlock(&p1->d_inode->i_sb->s_vfs_rename_mutex); 2685 + mutex_unlock(&p1->d_sb->s_vfs_rename_mutex); 2686 2686 } 2687 2687 } 2688 2688 EXPORT_SYMBOL(unlock_rename);
+1 -1
fs/nfs/direct.c
··· 396 396 static void nfs_direct_readpage_release(struct nfs_page *req) 397 397 { 398 398 dprintk("NFS: direct read done (%s/%llu %d@%lld)\n", 399 - d_inode(req->wb_context->dentry)->i_sb->s_id, 399 + req->wb_context->dentry->d_sb->s_id, 400 400 (unsigned long long)NFS_FILEID(d_inode(req->wb_context->dentry)), 401 401 req->wb_bytes, 402 402 (long long)req_offset(req));
+41 -2
fs/nfs/nfs3acl.c
··· 11 11 12 12 #define NFSDBG_FACILITY NFSDBG_PROC 13 13 14 + /* 15 + * nfs3_prepare_get_acl, nfs3_complete_get_acl, nfs3_abort_get_acl: Helpers for 16 + * caching get_acl results in a race-free way. See fs/posix_acl.c:get_acl() 17 + * for explanations. 18 + */ 19 + static void nfs3_prepare_get_acl(struct posix_acl **p) 20 + { 21 + struct posix_acl *sentinel = uncached_acl_sentinel(current); 22 + 23 + if (cmpxchg(p, ACL_NOT_CACHED, sentinel) != ACL_NOT_CACHED) { 24 + /* Not the first reader or sentinel already in place. */ 25 + } 26 + } 27 + 28 + static void nfs3_complete_get_acl(struct posix_acl **p, struct posix_acl *acl) 29 + { 30 + struct posix_acl *sentinel = uncached_acl_sentinel(current); 31 + 32 + /* Only cache the ACL if our sentinel is still in place. */ 33 + posix_acl_dup(acl); 34 + if (cmpxchg(p, sentinel, acl) != sentinel) 35 + posix_acl_release(acl); 36 + } 37 + 38 + static void nfs3_abort_get_acl(struct posix_acl **p) 39 + { 40 + struct posix_acl *sentinel = uncached_acl_sentinel(current); 41 + 42 + /* Remove our sentinel upon failure. */ 43 + cmpxchg(p, sentinel, ACL_NOT_CACHED); 44 + } 45 + 14 46 struct posix_acl *nfs3_get_acl(struct inode *inode, int type) 15 47 { 16 48 struct nfs_server *server = NFS_SERVER(inode); ··· 87 55 if (res.fattr == NULL) 88 56 return ERR_PTR(-ENOMEM); 89 57 58 + if (args.mask & NFS_ACL) 59 + nfs3_prepare_get_acl(&inode->i_acl); 60 + if (args.mask & NFS_DFACL) 61 + nfs3_prepare_get_acl(&inode->i_default_acl); 62 + 90 63 status = rpc_call_sync(server->client_acl, &msg, 0); 91 64 dprintk("NFS reply getacl: %d\n", status); 92 65 ··· 126 89 } 127 90 128 91 if (res.mask & NFS_ACL) 129 - set_cached_acl(inode, ACL_TYPE_ACCESS, res.acl_access); 92 + nfs3_complete_get_acl(&inode->i_acl, res.acl_access); 130 93 else 131 94 forget_cached_acl(inode, ACL_TYPE_ACCESS); 132 95 133 96 if (res.mask & NFS_DFACL) 134 - set_cached_acl(inode, ACL_TYPE_DEFAULT, res.acl_default); 97 + nfs3_complete_get_acl(&inode->i_default_acl, res.acl_default); 135 98 else 136 99 forget_cached_acl(inode, ACL_TYPE_DEFAULT); 137 100 ··· 145 108 } 146 109 147 110 getout: 111 + nfs3_abort_get_acl(&inode->i_acl); 112 + nfs3_abort_get_acl(&inode->i_default_acl); 148 113 posix_acl_release(res.acl_access); 149 114 posix_acl_release(res.acl_default); 150 115 nfs_free_fattr(res.fattr);
+6 -6
fs/nfs/nfs4proc.c
··· 6263 6263 } 6264 6264 6265 6265 static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler, 6266 - struct dentry *dentry, const char *key, 6267 - void *buf, size_t buflen) 6266 + struct dentry *unused, struct inode *inode, 6267 + const char *key, void *buf, size_t buflen) 6268 6268 { 6269 - return nfs4_proc_get_acl(d_inode(dentry), buf, buflen); 6269 + return nfs4_proc_get_acl(inode, buf, buflen); 6270 6270 } 6271 6271 6272 6272 static bool nfs4_xattr_list_nfs4_acl(struct dentry *dentry) ··· 6288 6288 } 6289 6289 6290 6290 static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler, 6291 - struct dentry *dentry, const char *key, 6292 - void *buf, size_t buflen) 6291 + struct dentry *unused, struct inode *inode, 6292 + const char *key, void *buf, size_t buflen) 6293 6293 { 6294 6294 if (security_ismaclabel(key)) 6295 - return nfs4_get_security_label(d_inode(dentry), buf, buflen); 6295 + return nfs4_get_security_label(inode, buf, buflen); 6296 6296 return -EOPNOTSUPP; 6297 6297 } 6298 6298
+2 -2
fs/nfsd/nfs3proc.c
··· 552 552 * different read/write sizes for file systems known to have 553 553 * problems with large blocks */ 554 554 if (nfserr == 0) { 555 - struct super_block *sb = d_inode(argp->fh.fh_dentry)->i_sb; 555 + struct super_block *sb = argp->fh.fh_dentry->d_sb; 556 556 557 557 /* Note that we don't care for remote fs's here */ 558 558 if (sb->s_magic == MSDOS_SUPER_MAGIC) { ··· 588 588 nfserr = fh_verify(rqstp, &argp->fh, 0, NFSD_MAY_NOP); 589 589 590 590 if (nfserr == 0) { 591 - struct super_block *sb = d_inode(argp->fh.fh_dentry)->i_sb; 591 + struct super_block *sb = argp->fh.fh_dentry->d_sb; 592 592 593 593 /* Note that we don't care for remote fs's here */ 594 594 switch (sb->s_magic) {
+1 -1
fs/nfsd/nfs3xdr.c
··· 146 146 default: 147 147 case FSIDSOURCE_DEV: 148 148 p = xdr_encode_hyper(p, (u64)huge_encode_dev 149 - (d_inode(fhp->fh_dentry)->i_sb->s_dev)); 149 + (fhp->fh_dentry->d_sb->s_dev)); 150 150 break; 151 151 case FSIDSOURCE_FSID: 152 152 p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
+1 -1
fs/nfsd/nfsfh.c
··· 426 426 427 427 static struct super_block *exp_sb(struct svc_export *exp) 428 428 { 429 - return d_inode(exp->ex_path.dentry)->i_sb; 429 + return exp->ex_path.dentry->d_sb; 430 430 } 431 431 432 432 static bool fsid_type_ok_for_exp(u8 fsid_type, struct svc_export *exp)
+1 -1
fs/nilfs2/namei.c
··· 457 457 458 458 root = NILFS_I(d_inode(child))->i_root; 459 459 460 - inode = nilfs_iget(d_inode(child)->i_sb, root, ino); 460 + inode = nilfs_iget(child->d_sb, root, ino); 461 461 if (IS_ERR(inode)) 462 462 return ERR_CAST(inode); 463 463
+3
fs/ocfs2/dlmglue.c
··· 54 54 #include "uptodate.h" 55 55 #include "quota.h" 56 56 #include "refcounttree.h" 57 + #include "acl.h" 57 58 58 59 #include "buffer_head_io.h" 59 60 ··· 3623 3622 * them around in that case. */ 3624 3623 filemap_fdatawait(mapping); 3625 3624 } 3625 + 3626 + forget_all_cached_acls(inode); 3626 3627 3627 3628 out: 3628 3629 return UNBLOCK_CONTINUE;
+1 -1
fs/ocfs2/file.c
··· 1290 1290 struct kstat *stat) 1291 1291 { 1292 1292 struct inode *inode = d_inode(dentry); 1293 - struct super_block *sb = d_inode(dentry)->i_sb; 1293 + struct super_block *sb = dentry->d_sb; 1294 1294 struct ocfs2_super *osb = sb->s_fs_info; 1295 1295 int err; 1296 1296
+10 -10
fs/ocfs2/xattr.c
··· 7250 7250 * 'security' attributes support 7251 7251 */ 7252 7252 static int ocfs2_xattr_security_get(const struct xattr_handler *handler, 7253 - struct dentry *dentry, const char *name, 7254 - void *buffer, size_t size) 7253 + struct dentry *unused, struct inode *inode, 7254 + const char *name, void *buffer, size_t size) 7255 7255 { 7256 - return ocfs2_xattr_get(d_inode(dentry), OCFS2_XATTR_INDEX_SECURITY, 7256 + return ocfs2_xattr_get(inode, OCFS2_XATTR_INDEX_SECURITY, 7257 7257 name, buffer, size); 7258 7258 } 7259 7259 ··· 7321 7321 * 'trusted' attributes support 7322 7322 */ 7323 7323 static int ocfs2_xattr_trusted_get(const struct xattr_handler *handler, 7324 - struct dentry *dentry, const char *name, 7325 - void *buffer, size_t size) 7324 + struct dentry *unused, struct inode *inode, 7325 + const char *name, void *buffer, size_t size) 7326 7326 { 7327 - return ocfs2_xattr_get(d_inode(dentry), OCFS2_XATTR_INDEX_TRUSTED, 7327 + return ocfs2_xattr_get(inode, OCFS2_XATTR_INDEX_TRUSTED, 7328 7328 name, buffer, size); 7329 7329 } 7330 7330 ··· 7346 7346 * 'user' attributes support 7347 7347 */ 7348 7348 static int ocfs2_xattr_user_get(const struct xattr_handler *handler, 7349 - struct dentry *dentry, const char *name, 7350 - void *buffer, size_t size) 7349 + struct dentry *unusde, struct inode *inode, 7350 + const char *name, void *buffer, size_t size) 7351 7351 { 7352 - struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); 7352 + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); 7353 7353 7354 7354 if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR) 7355 7355 return -EOPNOTSUPP; 7356 - return ocfs2_xattr_get(d_inode(dentry), OCFS2_XATTR_INDEX_USER, name, 7356 + return ocfs2_xattr_get(inode, OCFS2_XATTR_INDEX_USER, name, 7357 7357 buffer, size); 7358 7358 } 7359 7359
+6 -4
fs/orangefs/xattr.c
··· 463 463 } 464 464 465 465 static int orangefs_xattr_get_default(const struct xattr_handler *handler, 466 - struct dentry *dentry, 466 + struct dentry *unused, 467 + struct inode *inode, 467 468 const char *name, 468 469 void *buffer, 469 470 size_t size) 470 471 { 471 - return orangefs_inode_getxattr(dentry->d_inode, 472 + return orangefs_inode_getxattr(inode, 472 473 ORANGEFS_XATTR_NAME_DEFAULT_PREFIX, 473 474 name, 474 475 buffer, ··· 493 492 } 494 493 495 494 static int orangefs_xattr_get_trusted(const struct xattr_handler *handler, 496 - struct dentry *dentry, 495 + struct dentry *unused, 496 + struct inode *inode, 497 497 const char *name, 498 498 void *buffer, 499 499 size_t size) 500 500 { 501 - return orangefs_inode_getxattr(dentry->d_inode, 501 + return orangefs_inode_getxattr(inode, 502 502 ORANGEFS_XATTR_NAME_TRUSTED_PREFIX, 503 503 name, 504 504 buffer,
+2 -2
fs/overlayfs/inode.c
··· 246 246 return false; 247 247 } 248 248 249 - ssize_t ovl_getxattr(struct dentry *dentry, const char *name, 250 - void *value, size_t size) 249 + ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, 250 + const char *name, void *value, size_t size) 251 251 { 252 252 struct path realpath; 253 253 enum ovl_path_type type = ovl_path_real(dentry, &realpath);
+2 -2
fs/overlayfs/overlayfs.h
··· 173 173 int ovl_permission(struct inode *inode, int mask); 174 174 int ovl_setxattr(struct dentry *dentry, const char *name, 175 175 const void *value, size_t size, int flags); 176 - ssize_t ovl_getxattr(struct dentry *dentry, const char *name, 177 - void *value, size_t size); 176 + ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, 177 + const char *name, void *value, size_t size); 178 178 ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); 179 179 int ovl_removexattr(struct dentry *dentry, const char *name); 180 180 struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags);
+1 -1
fs/overlayfs/super.c
··· 274 274 if (!S_ISDIR(inode->i_mode) || !inode->i_op->getxattr) 275 275 return false; 276 276 277 - res = inode->i_op->getxattr(dentry, OVL_XATTR_OPAQUE, &val, 1); 277 + res = inode->i_op->getxattr(dentry, inode, OVL_XATTR_OPAQUE, &val, 1); 278 278 if (res == 1 && val == 'y') 279 279 return true; 280 280
+76 -42
fs/posix_acl.c
··· 21 21 #include <linux/export.h> 22 22 #include <linux/user_namespace.h> 23 23 24 - struct posix_acl **acl_by_type(struct inode *inode, int type) 24 + static struct posix_acl **acl_by_type(struct inode *inode, int type) 25 25 { 26 26 switch (type) { 27 27 case ACL_TYPE_ACCESS: ··· 32 32 BUG(); 33 33 } 34 34 } 35 - EXPORT_SYMBOL(acl_by_type); 36 35 37 36 struct posix_acl *get_cached_acl(struct inode *inode, int type) 38 37 { 39 38 struct posix_acl **p = acl_by_type(inode, type); 40 - struct posix_acl *acl = ACCESS_ONCE(*p); 41 - if (acl) { 42 - spin_lock(&inode->i_lock); 43 - acl = *p; 44 - if (acl != ACL_NOT_CACHED) 45 - acl = posix_acl_dup(acl); 46 - spin_unlock(&inode->i_lock); 39 + struct posix_acl *acl; 40 + 41 + for (;;) { 42 + rcu_read_lock(); 43 + acl = rcu_dereference(*p); 44 + if (!acl || is_uncached_acl(acl) || 45 + atomic_inc_not_zero(&acl->a_refcount)) 46 + break; 47 + rcu_read_unlock(); 48 + cpu_relax(); 47 49 } 50 + rcu_read_unlock(); 48 51 return acl; 49 52 } 50 53 EXPORT_SYMBOL(get_cached_acl); ··· 62 59 { 63 60 struct posix_acl **p = acl_by_type(inode, type); 64 61 struct posix_acl *old; 65 - spin_lock(&inode->i_lock); 66 - old = *p; 67 - rcu_assign_pointer(*p, posix_acl_dup(acl)); 68 - spin_unlock(&inode->i_lock); 69 - if (old != ACL_NOT_CACHED) 62 + 63 + old = xchg(p, posix_acl_dup(acl)); 64 + if (!is_uncached_acl(old)) 70 65 posix_acl_release(old); 71 66 } 72 67 EXPORT_SYMBOL(set_cached_acl); 73 68 69 + static void __forget_cached_acl(struct posix_acl **p) 70 + { 71 + struct posix_acl *old; 72 + 73 + old = xchg(p, ACL_NOT_CACHED); 74 + if (!is_uncached_acl(old)) 75 + posix_acl_release(old); 76 + } 77 + 74 78 void forget_cached_acl(struct inode *inode, int type) 75 79 { 76 - struct posix_acl **p = acl_by_type(inode, type); 77 - struct posix_acl *old; 78 - spin_lock(&inode->i_lock); 79 - old = *p; 80 - *p = ACL_NOT_CACHED; 81 - spin_unlock(&inode->i_lock); 82 - if (old != ACL_NOT_CACHED) 83 - posix_acl_release(old); 80 + __forget_cached_acl(acl_by_type(inode, type)); 84 81 } 85 82 EXPORT_SYMBOL(forget_cached_acl); 86 83 87 84 void forget_all_cached_acls(struct inode *inode) 88 85 { 89 - struct posix_acl *old_access, *old_default; 90 - spin_lock(&inode->i_lock); 91 - old_access = inode->i_acl; 92 - old_default = inode->i_default_acl; 93 - inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; 94 - spin_unlock(&inode->i_lock); 95 - if (old_access != ACL_NOT_CACHED) 96 - posix_acl_release(old_access); 97 - if (old_default != ACL_NOT_CACHED) 98 - posix_acl_release(old_default); 86 + __forget_cached_acl(&inode->i_acl); 87 + __forget_cached_acl(&inode->i_default_acl); 99 88 } 100 89 EXPORT_SYMBOL(forget_all_cached_acls); 101 90 102 91 struct posix_acl *get_acl(struct inode *inode, int type) 103 92 { 93 + void *sentinel; 94 + struct posix_acl **p; 104 95 struct posix_acl *acl; 105 96 97 + /* 98 + * The sentinel is used to detect when another operation like 99 + * set_cached_acl() or forget_cached_acl() races with get_acl(). 100 + * It is guaranteed that is_uncached_acl(sentinel) is true. 101 + */ 102 + 106 103 acl = get_cached_acl(inode, type); 107 - if (acl != ACL_NOT_CACHED) 104 + if (!is_uncached_acl(acl)) 108 105 return acl; 109 106 110 107 if (!IS_POSIXACL(inode)) 111 108 return NULL; 112 109 110 + sentinel = uncached_acl_sentinel(current); 111 + p = acl_by_type(inode, type); 112 + 113 113 /* 114 - * A filesystem can force a ACL callback by just never filling the 115 - * ACL cache. But normally you'd fill the cache either at inode 116 - * instantiation time, or on the first ->get_acl call. 114 + * If the ACL isn't being read yet, set our sentinel. Otherwise, the 115 + * current value of the ACL will not be ACL_NOT_CACHED and so our own 116 + * sentinel will not be set; another task will update the cache. We 117 + * could wait for that other task to complete its job, but it's easier 118 + * to just call ->get_acl to fetch the ACL ourself. (This is going to 119 + * be an unlikely race.) 120 + */ 121 + if (cmpxchg(p, ACL_NOT_CACHED, sentinel) != ACL_NOT_CACHED) 122 + /* fall through */ ; 123 + 124 + /* 125 + * Normally, the ACL returned by ->get_acl will be cached. 126 + * A filesystem can prevent that by calling 127 + * forget_cached_acl(inode, type) in ->get_acl. 117 128 * 118 129 * If the filesystem doesn't have a get_acl() function at all, we'll 119 130 * just create the negative cache entry. ··· 136 119 set_cached_acl(inode, type, NULL); 137 120 return NULL; 138 121 } 139 - return inode->i_op->get_acl(inode, type); 122 + acl = inode->i_op->get_acl(inode, type); 123 + 124 + if (IS_ERR(acl)) { 125 + /* 126 + * Remove our sentinel so that we don't block future attempts 127 + * to cache the ACL. 128 + */ 129 + cmpxchg(p, sentinel, ACL_NOT_CACHED); 130 + return acl; 131 + } 132 + 133 + /* 134 + * Cache the result, but only if our sentinel is still in place. 135 + */ 136 + posix_acl_dup(acl); 137 + if (unlikely(cmpxchg(p, sentinel, acl) != sentinel)) 138 + posix_acl_release(acl); 139 + return acl; 140 140 } 141 141 EXPORT_SYMBOL(get_acl); 142 142 ··· 797 763 798 764 static int 799 765 posix_acl_xattr_get(const struct xattr_handler *handler, 800 - struct dentry *dentry, const char *name, 801 - void *value, size_t size) 766 + struct dentry *unused, struct inode *inode, 767 + const char *name, void *value, size_t size) 802 768 { 803 769 struct posix_acl *acl; 804 770 int error; 805 771 806 - if (!IS_POSIXACL(d_backing_inode(dentry))) 772 + if (!IS_POSIXACL(inode)) 807 773 return -EOPNOTSUPP; 808 - if (d_is_symlink(dentry)) 774 + if (S_ISLNK(inode->i_mode)) 809 775 return -EOPNOTSUPP; 810 776 811 - acl = get_acl(d_backing_inode(dentry), handler->flags); 777 + acl = get_acl(inode, handler->flags); 812 778 if (IS_ERR(acl)) 813 779 return PTR_ERR(acl); 814 780 if (acl == NULL)
+3 -3
fs/reiserfs/file.c
··· 260 260 261 261 const struct inode_operations reiserfs_file_inode_operations = { 262 262 .setattr = reiserfs_setattr, 263 - .setxattr = reiserfs_setxattr, 264 - .getxattr = reiserfs_getxattr, 263 + .setxattr = generic_setxattr, 264 + .getxattr = generic_getxattr, 265 265 .listxattr = reiserfs_listxattr, 266 - .removexattr = reiserfs_removexattr, 266 + .removexattr = generic_removexattr, 267 267 .permission = reiserfs_permission, 268 268 .get_acl = reiserfs_get_acl, 269 269 .set_acl = reiserfs_set_acl,
+9 -9
fs/reiserfs/namei.c
··· 1650 1650 .mknod = reiserfs_mknod, 1651 1651 .rename = reiserfs_rename, 1652 1652 .setattr = reiserfs_setattr, 1653 - .setxattr = reiserfs_setxattr, 1654 - .getxattr = reiserfs_getxattr, 1653 + .setxattr = generic_setxattr, 1654 + .getxattr = generic_getxattr, 1655 1655 .listxattr = reiserfs_listxattr, 1656 - .removexattr = reiserfs_removexattr, 1656 + .removexattr = generic_removexattr, 1657 1657 .permission = reiserfs_permission, 1658 1658 .get_acl = reiserfs_get_acl, 1659 1659 .set_acl = reiserfs_set_acl, ··· 1667 1667 .readlink = generic_readlink, 1668 1668 .get_link = page_get_link, 1669 1669 .setattr = reiserfs_setattr, 1670 - .setxattr = reiserfs_setxattr, 1671 - .getxattr = reiserfs_getxattr, 1670 + .setxattr = generic_setxattr, 1671 + .getxattr = generic_getxattr, 1672 1672 .listxattr = reiserfs_listxattr, 1673 - .removexattr = reiserfs_removexattr, 1673 + .removexattr = generic_removexattr, 1674 1674 .permission = reiserfs_permission, 1675 1675 }; 1676 1676 ··· 1679 1679 */ 1680 1680 const struct inode_operations reiserfs_special_inode_operations = { 1681 1681 .setattr = reiserfs_setattr, 1682 - .setxattr = reiserfs_setxattr, 1683 - .getxattr = reiserfs_getxattr, 1682 + .setxattr = generic_setxattr, 1683 + .getxattr = generic_getxattr, 1684 1684 .listxattr = reiserfs_listxattr, 1685 - .removexattr = reiserfs_removexattr, 1685 + .removexattr = generic_removexattr, 1686 1686 .permission = reiserfs_permission, 1687 1687 .get_acl = reiserfs_get_acl, 1688 1688 .set_acl = reiserfs_set_acl,
-54
fs/reiserfs/xattr.c
··· 764 764 return xah; 765 765 } 766 766 767 - 768 - /* 769 - * Inode operation getxattr() 770 - */ 771 - ssize_t 772 - reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer, 773 - size_t size) 774 - { 775 - const struct xattr_handler *handler; 776 - 777 - handler = find_xattr_handler_prefix(dentry->d_sb->s_xattr, name); 778 - 779 - if (!handler || get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) 780 - return -EOPNOTSUPP; 781 - 782 - return handler->get(handler, dentry, name, buffer, size); 783 - } 784 - 785 - /* 786 - * Inode operation setxattr() 787 - * 788 - * d_inode(dentry)->i_mutex down 789 - */ 790 - int 791 - reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value, 792 - size_t size, int flags) 793 - { 794 - const struct xattr_handler *handler; 795 - 796 - handler = find_xattr_handler_prefix(dentry->d_sb->s_xattr, name); 797 - 798 - if (!handler || get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) 799 - return -EOPNOTSUPP; 800 - 801 - return handler->set(handler, dentry, name, value, size, flags); 802 - } 803 - 804 - /* 805 - * Inode operation removexattr() 806 - * 807 - * d_inode(dentry)->i_mutex down 808 - */ 809 - int reiserfs_removexattr(struct dentry *dentry, const char *name) 810 - { 811 - const struct xattr_handler *handler; 812 - 813 - handler = find_xattr_handler_prefix(dentry->d_sb->s_xattr, name); 814 - 815 - if (!handler || get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) 816 - return -EOPNOTSUPP; 817 - 818 - return handler->set(handler, dentry, name, NULL, 0, XATTR_REPLACE); 819 - } 820 - 821 767 struct listxattr_buf { 822 768 struct dir_context ctx; 823 769 size_t size;
+1 -8
fs/reiserfs/xattr.h
··· 2 2 #include <linux/init.h> 3 3 #include <linux/list.h> 4 4 #include <linux/rwsem.h> 5 + #include <linux/xattr.h> 5 6 6 7 struct inode; 7 8 struct dentry; ··· 19 18 20 19 #ifdef CONFIG_REISERFS_FS_XATTR 21 20 #define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir) 22 - ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name, 23 - void *buffer, size_t size); 24 - int reiserfs_setxattr(struct dentry *dentry, const char *name, 25 - const void *value, size_t size, int flags); 26 21 ssize_t reiserfs_listxattr(struct dentry *dentry, char *buffer, size_t size); 27 - int reiserfs_removexattr(struct dentry *dentry, const char *name); 28 22 29 23 int reiserfs_xattr_get(struct inode *, const char *, void *, size_t); 30 24 int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int); ··· 88 92 89 93 #else 90 94 91 - #define reiserfs_getxattr NULL 92 - #define reiserfs_setxattr NULL 93 95 #define reiserfs_listxattr NULL 94 - #define reiserfs_removexattr NULL 95 96 96 97 static inline void reiserfs_init_xattr_rwsem(struct inode *inode) 97 98 {
+2 -6
fs/reiserfs/xattr_acl.c
··· 197 197 198 198 size = reiserfs_xattr_get(inode, name, NULL, 0); 199 199 if (size < 0) { 200 - if (size == -ENODATA || size == -ENOSYS) { 201 - set_cached_acl(inode, type, NULL); 200 + if (size == -ENODATA || size == -ENOSYS) 202 201 return NULL; 203 - } 204 202 return ERR_PTR(size); 205 203 } 206 204 ··· 218 220 } else { 219 221 acl = reiserfs_posix_acl_from_disk(value, retval); 220 222 } 221 - if (!IS_ERR(acl)) 222 - set_cached_acl(inode, type, acl); 223 223 224 224 kfree(value); 225 225 return acl; ··· 366 370 if (IS_PRIVATE(inode)) 367 371 return 0; 368 372 369 - acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT); 373 + acl = get_acl(inode, ACL_TYPE_DEFAULT); 370 374 371 375 if (acl && !IS_ERR(acl)) { 372 376 int size = reiserfs_acl_size(acl->a_count);
+8 -11
fs/reiserfs/xattr_security.c
··· 9 9 #include <linux/uaccess.h> 10 10 11 11 static int 12 - security_get(const struct xattr_handler *handler, struct dentry *dentry, 13 - const char *name, void *buffer, size_t size) 12 + security_get(const struct xattr_handler *handler, struct dentry *unused, 13 + struct inode *inode, const char *name, void *buffer, size_t size) 14 14 { 15 - if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 16 - return -EINVAL; 17 - 18 - if (IS_PRIVATE(d_inode(dentry))) 15 + if (IS_PRIVATE(inode)) 19 16 return -EPERM; 20 17 21 - return reiserfs_xattr_get(d_inode(dentry), name, buffer, size); 18 + return reiserfs_xattr_get(inode, xattr_full_name(handler, name), 19 + buffer, size); 22 20 } 23 21 24 22 static int 25 23 security_set(const struct xattr_handler *handler, struct dentry *dentry, 26 24 const char *name, const void *buffer, size_t size, int flags) 27 25 { 28 - if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 29 - return -EINVAL; 30 - 31 26 if (IS_PRIVATE(d_inode(dentry))) 32 27 return -EPERM; 33 28 34 - return reiserfs_xattr_set(d_inode(dentry), name, buffer, size, flags); 29 + return reiserfs_xattr_set(d_inode(dentry), 30 + xattr_full_name(handler, name), 31 + buffer, size, flags); 35 32 } 36 33 37 34 static bool security_list(struct dentry *dentry)
+8 -11
fs/reiserfs/xattr_trusted.c
··· 8 8 #include <linux/uaccess.h> 9 9 10 10 static int 11 - trusted_get(const struct xattr_handler *handler, struct dentry *dentry, 12 - const char *name, void *buffer, size_t size) 11 + trusted_get(const struct xattr_handler *handler, struct dentry *unused, 12 + struct inode *inode, const char *name, void *buffer, size_t size) 13 13 { 14 - if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) 15 - return -EINVAL; 16 - 17 - if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(d_inode(dentry))) 14 + if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode)) 18 15 return -EPERM; 19 16 20 - return reiserfs_xattr_get(d_inode(dentry), name, buffer, size); 17 + return reiserfs_xattr_get(inode, xattr_full_name(handler, name), 18 + buffer, size); 21 19 } 22 20 23 21 static int 24 22 trusted_set(const struct xattr_handler *handler, struct dentry *dentry, 25 23 const char *name, const void *buffer, size_t size, int flags) 26 24 { 27 - if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) 28 - return -EINVAL; 29 - 30 25 if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(d_inode(dentry))) 31 26 return -EPERM; 32 27 33 - return reiserfs_xattr_set(d_inode(dentry), name, buffer, size, flags); 28 + return reiserfs_xattr_set(d_inode(dentry), 29 + xattr_full_name(handler, name), 30 + buffer, size, flags); 34 31 } 35 32 36 33 static bool trusted_list(struct dentry *dentry)
+8 -11
fs/reiserfs/xattr_user.c
··· 7 7 #include <linux/uaccess.h> 8 8 9 9 static int 10 - user_get(const struct xattr_handler *handler, struct dentry *dentry, 11 - const char *name, void *buffer, size_t size) 10 + user_get(const struct xattr_handler *handler, struct dentry *unused, 11 + struct inode *inode, const char *name, void *buffer, size_t size) 12 12 { 13 - 14 - if (strlen(name) < sizeof(XATTR_USER_PREFIX)) 15 - return -EINVAL; 16 - if (!reiserfs_xattrs_user(dentry->d_sb)) 13 + if (!reiserfs_xattrs_user(inode->i_sb)) 17 14 return -EOPNOTSUPP; 18 - return reiserfs_xattr_get(d_inode(dentry), name, buffer, size); 15 + return reiserfs_xattr_get(inode, xattr_full_name(handler, name), 16 + buffer, size); 19 17 } 20 18 21 19 static int 22 20 user_set(const struct xattr_handler *handler, struct dentry *dentry, 23 21 const char *name, const void *buffer, size_t size, int flags) 24 22 { 25 - if (strlen(name) < sizeof(XATTR_USER_PREFIX)) 26 - return -EINVAL; 27 - 28 23 if (!reiserfs_xattrs_user(dentry->d_sb)) 29 24 return -EOPNOTSUPP; 30 - return reiserfs_xattr_set(d_inode(dentry), name, buffer, size, flags); 25 + return reiserfs_xattr_set(d_inode(dentry), 26 + xattr_full_name(handler, name), 27 + buffer, size, flags); 31 28 } 32 29 33 30 static bool user_list(struct dentry *dentry)
+4 -2
fs/squashfs/xattr.c
··· 214 214 215 215 216 216 static int squashfs_xattr_handler_get(const struct xattr_handler *handler, 217 - struct dentry *d, const char *name, 217 + struct dentry *unused, 218 + struct inode *inode, 219 + const char *name, 218 220 void *buffer, size_t size) 219 221 { 220 - return squashfs_xattr_get(d_inode(d), handler->flags, name, 222 + return squashfs_xattr_get(inode, handler->flags, name, 221 223 buffer, size); 222 224 } 223 225
+2 -2
fs/ubifs/ubifs.h
··· 1734 1734 /* xattr.c */ 1735 1735 int ubifs_setxattr(struct dentry *dentry, const char *name, 1736 1736 const void *value, size_t size, int flags); 1737 - ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, 1738 - size_t size); 1737 + ssize_t ubifs_getxattr(struct dentry *dentry, struct inode *host, 1738 + const char *name, void *buf, size_t size); 1739 1739 ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size); 1740 1740 int ubifs_removexattr(struct dentry *dentry, const char *name); 1741 1741 int ubifs_init_security(struct inode *dentry, struct inode *inode,
+3 -3
fs/ubifs/xattr.c
··· 372 372 return setxattr(d_inode(dentry), name, value, size, flags); 373 373 } 374 374 375 - ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, 376 - size_t size) 375 + ssize_t ubifs_getxattr(struct dentry *dentry, struct inode *host, 376 + const char *name, void *buf, size_t size) 377 377 { 378 - struct inode *inode, *host = d_inode(dentry); 378 + struct inode *inode; 379 379 struct ubifs_info *c = host->i_sb->s_fs_info; 380 380 struct qstr nm = QSTR_INIT(name, strlen(name)); 381 381 struct ubifs_inode *ui;
+1 -1
fs/udf/namei.c
··· 1250 1250 brelse(fibh.sbh); 1251 1251 1252 1252 tloc = lelb_to_cpu(cfi.icb.extLocation); 1253 - inode = udf_iget(d_inode(child)->i_sb, &tloc); 1253 + inode = udf_iget(child->d_sb, &tloc); 1254 1254 if (IS_ERR(inode)) 1255 1255 return ERR_CAST(inode); 1256 1256
+1 -1
fs/ufs/super.c
··· 132 132 ino = ufs_inode_by_name(d_inode(child), &dot_dot); 133 133 if (!ino) 134 134 return ERR_PTR(-ENOENT); 135 - return d_obtain_alias(ufs_iget(d_inode(child)->i_sb, ino)); 135 + return d_obtain_alias(ufs_iget(child->d_sb, ino)); 136 136 } 137 137 138 138 static const struct export_operations ufs_export_ops = {
+7 -5
fs/xattr.c
··· 192 192 if (!inode->i_op->getxattr) 193 193 return -EOPNOTSUPP; 194 194 195 - error = inode->i_op->getxattr(dentry, name, NULL, 0); 195 + error = inode->i_op->getxattr(dentry, inode, name, NULL, 0); 196 196 if (error < 0) 197 197 return error; 198 198 ··· 203 203 memset(value, 0, error + 1); 204 204 } 205 205 206 - error = inode->i_op->getxattr(dentry, name, value, error); 206 + error = inode->i_op->getxattr(dentry, inode, name, value, error); 207 207 *xattr_value = value; 208 208 return error; 209 209 } ··· 236 236 } 237 237 nolsm: 238 238 if (inode->i_op->getxattr) 239 - error = inode->i_op->getxattr(dentry, name, value, size); 239 + error = inode->i_op->getxattr(dentry, inode, name, value, size); 240 240 else 241 241 error = -EOPNOTSUPP; 242 242 ··· 691 691 * Find the handler for the prefix and dispatch its get() operation. 692 692 */ 693 693 ssize_t 694 - generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size) 694 + generic_getxattr(struct dentry *dentry, struct inode *inode, 695 + const char *name, void *buffer, size_t size) 695 696 { 696 697 const struct xattr_handler *handler; 697 698 698 699 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 699 700 if (IS_ERR(handler)) 700 701 return PTR_ERR(handler); 701 - return handler->get(handler, dentry, name, buffer, size); 702 + return handler->get(handler, dentry, inode, 703 + name, buffer, size); 702 704 } 703 705 704 706 /*
+6 -14
fs/xfs/xfs_acl.c
··· 158 158 if (error) { 159 159 /* 160 160 * If the attribute doesn't exist make sure we have a negative 161 - * cache entry, for any other error assume it is transient and 162 - * leave the cache entry as ACL_NOT_CACHED. 161 + * cache entry, for any other error assume it is transient. 163 162 */ 164 - if (error == -ENOATTR) 165 - goto out_update_cache; 166 - acl = ERR_PTR(error); 167 - goto out; 163 + if (error != -ENOATTR) 164 + acl = ERR_PTR(error); 165 + } else { 166 + acl = xfs_acl_from_disk(xfs_acl, len, 167 + XFS_ACL_MAX_ENTRIES(ip->i_mount)); 168 168 } 169 - 170 - acl = xfs_acl_from_disk(xfs_acl, len, XFS_ACL_MAX_ENTRIES(ip->i_mount)); 171 - if (IS_ERR(acl)) 172 - goto out; 173 - 174 - out_update_cache: 175 - set_cached_acl(inode, type, acl); 176 - out: 177 169 kmem_free(xfs_acl); 178 170 return acl; 179 171 }
+3 -3
fs/xfs/xfs_xattr.c
··· 32 32 33 33 34 34 static int 35 - xfs_xattr_get(const struct xattr_handler *handler, struct dentry *dentry, 36 - const char *name, void *value, size_t size) 35 + xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused, 36 + struct inode *inode, const char *name, void *value, size_t size) 37 37 { 38 38 int xflags = handler->flags; 39 - struct xfs_inode *ip = XFS_I(d_inode(dentry)); 39 + struct xfs_inode *ip = XFS_I(inode); 40 40 int error, asize = size; 41 41 42 42 /* Convert Linux syscall to XFS internal ATTR flags */
+14 -1
include/linux/fs.h
··· 577 577 struct posix_acl; 578 578 #define ACL_NOT_CACHED ((void *)(-1)) 579 579 580 + static inline struct posix_acl * 581 + uncached_acl_sentinel(struct task_struct *task) 582 + { 583 + return (void *)task + 1; 584 + } 585 + 586 + static inline bool 587 + is_uncached_acl(struct posix_acl *acl) 588 + { 589 + return (long)acl & 1; 590 + } 591 + 580 592 #define IOP_FASTPERM 0x0001 581 593 #define IOP_LOOKUP 0x0002 582 594 #define IOP_NOFOLLOW 0x0004 ··· 1712 1700 int (*setattr) (struct dentry *, struct iattr *); 1713 1701 int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); 1714 1702 int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); 1715 - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); 1703 + ssize_t (*getxattr) (struct dentry *, struct inode *, 1704 + const char *, void *, size_t); 1716 1705 ssize_t (*listxattr) (struct dentry *, char *, size_t); 1717 1706 int (*removexattr) (struct dentry *, const char *); 1718 1707 int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
-1
include/linux/posix_acl.h
··· 99 99 extern int simple_set_acl(struct inode *, struct posix_acl *, int); 100 100 extern int simple_acl_create(struct inode *, struct inode *); 101 101 102 - struct posix_acl **acl_by_type(struct inode *inode, int type); 103 102 struct posix_acl *get_cached_acl(struct inode *inode, int type); 104 103 struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type); 105 104 void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl);
+3 -2
include/linux/xattr.h
··· 30 30 int flags; /* fs private flags */ 31 31 bool (*list)(struct dentry *dentry); 32 32 int (*get)(const struct xattr_handler *, struct dentry *dentry, 33 - const char *name, void *buffer, size_t size); 33 + struct inode *inode, const char *name, void *buffer, 34 + size_t size); 34 35 int (*set)(const struct xattr_handler *, struct dentry *dentry, 35 36 const char *name, const void *buffer, size_t size, 36 37 int flags); ··· 52 51 int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); 53 52 int vfs_removexattr(struct dentry *, const char *); 54 53 55 - ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size); 54 + ssize_t generic_getxattr(struct dentry *dentry, struct inode *inode, const char *name, void *buffer, size_t size); 56 55 ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); 57 56 int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); 58 57 int generic_removexattr(struct dentry *dentry, const char *name);
+3 -3
include/trace/events/ext4.h
··· 872 872 TP_fast_assign( 873 873 struct dentry *dentry = file->f_path.dentry; 874 874 875 - __entry->dev = d_inode(dentry)->i_sb->s_dev; 875 + __entry->dev = dentry->d_sb->s_dev; 876 876 __entry->ino = d_inode(dentry)->i_ino; 877 877 __entry->datasync = datasync; 878 878 __entry->parent = d_inode(dentry->d_parent)->i_ino; ··· 1451 1451 ), 1452 1452 1453 1453 TP_fast_assign( 1454 - __entry->dev = d_inode(dentry)->i_sb->s_dev; 1454 + __entry->dev = dentry->d_sb->s_dev; 1455 1455 __entry->ino = d_inode(dentry)->i_ino; 1456 1456 __entry->parent = parent->i_ino; 1457 1457 __entry->size = d_inode(dentry)->i_size; ··· 1475 1475 ), 1476 1476 1477 1477 TP_fast_assign( 1478 - __entry->dev = d_inode(dentry)->i_sb->s_dev; 1478 + __entry->dev = dentry->d_sb->s_dev; 1479 1479 __entry->ino = d_inode(dentry)->i_ino; 1480 1480 __entry->ret = ret; 1481 1481 ),
+1 -1
kernel/audit_watch.c
··· 367 367 inode_unlock(d_backing_inode(parent->dentry)); 368 368 if (d_is_positive(d)) { 369 369 /* update watch filter fields */ 370 - watch->dev = d_backing_inode(d)->i_sb->s_dev; 370 + watch->dev = d->d_sb->s_dev; 371 371 watch->ino = d_backing_inode(d)->i_ino; 372 372 } 373 373 dput(d);
+3 -3
mm/shmem.c
··· 2646 2646 } 2647 2647 2648 2648 static int shmem_xattr_handler_get(const struct xattr_handler *handler, 2649 - struct dentry *dentry, const char *name, 2650 - void *buffer, size_t size) 2649 + struct dentry *unused, struct inode *inode, 2650 + const char *name, void *buffer, size_t size) 2651 2651 { 2652 - struct shmem_inode_info *info = SHMEM_I(d_inode(dentry)); 2652 + struct shmem_inode_info *info = SHMEM_I(inode); 2653 2653 2654 2654 name = xattr_full_name(handler, name); 2655 2655 return simple_xattr_get(&info->xattrs, name, buffer, size);
+1 -1
net/socket.c
··· 466 466 #define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname" 467 467 #define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX) 468 468 #define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1) 469 - static ssize_t sockfs_getxattr(struct dentry *dentry, 469 + static ssize_t sockfs_getxattr(struct dentry *dentry, struct inode *inode, 470 470 const char *name, void *value, size_t size) 471 471 { 472 472 const char *proto_name;
+3 -3
security/commoncap.c
··· 313 313 if (!inode->i_op->getxattr) 314 314 return 0; 315 315 316 - error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0); 316 + error = inode->i_op->getxattr(dentry, inode, XATTR_NAME_CAPS, NULL, 0); 317 317 if (error <= 0) 318 318 return 0; 319 319 return 1; ··· 397 397 if (!inode || !inode->i_op->getxattr) 398 398 return -ENODATA; 399 399 400 - size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps, 401 - XATTR_CAPS_SZ); 400 + size = inode->i_op->getxattr((struct dentry *)dentry, inode, 401 + XATTR_NAME_CAPS, &caps, XATTR_CAPS_SZ); 402 402 if (size == -ENODATA || size == -EOPNOTSUPP) 403 403 /* no data, that's ok */ 404 404 return -ENODATA;
+3 -3
security/integrity/evm/evm_main.c
··· 82 82 return -EOPNOTSUPP; 83 83 84 84 for (xattr = evm_config_xattrnames; *xattr != NULL; xattr++) { 85 - error = inode->i_op->getxattr(dentry, *xattr, NULL, 0); 85 + error = inode->i_op->getxattr(dentry, inode, *xattr, NULL, 0); 86 86 if (error < 0) { 87 87 if (error == -ENODATA) 88 88 continue; ··· 299 299 return 0; 300 300 301 301 /* exception for pseudo filesystems */ 302 - if (dentry->d_inode->i_sb->s_magic == TMPFS_MAGIC 303 - || dentry->d_inode->i_sb->s_magic == SYSFS_MAGIC) 302 + if (dentry->d_sb->s_magic == TMPFS_MAGIC 303 + || dentry->d_sb->s_magic == SYSFS_MAGIC) 304 304 return 0; 305 305 306 306 integrity_audit_msg(AUDIT_INTEGRITY_METADATA,
+6 -5
security/selinux/hooks.c
··· 506 506 rc = -EOPNOTSUPP; 507 507 goto out; 508 508 } 509 - rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0); 509 + rc = root_inode->i_op->getxattr(root, root_inode, 510 + XATTR_NAME_SELINUX, NULL, 0); 510 511 if (rc < 0 && rc != -ENODATA) { 511 512 if (rc == -EOPNOTSUPP) 512 513 printk(KERN_WARNING "SELinux: (dev %s, type " ··· 1317 1316 u32 *sid) 1318 1317 { 1319 1318 int rc; 1320 - struct super_block *sb = dentry->d_inode->i_sb; 1319 + struct super_block *sb = dentry->d_sb; 1321 1320 char *buffer, *path; 1322 1321 1323 1322 buffer = (char *)__get_free_page(GFP_KERNEL); ··· 1413 1412 goto out_unlock; 1414 1413 } 1415 1414 context[len] = '\0'; 1416 - rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, 1415 + rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX, 1417 1416 context, len); 1418 1417 if (rc == -ERANGE) { 1419 1418 kfree(context); 1420 1419 1421 1420 /* Need a larger buffer. Query for the right size. */ 1422 - rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, 1421 + rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX, 1423 1422 NULL, 0); 1424 1423 if (rc < 0) { 1425 1424 dput(dentry); ··· 1433 1432 goto out_unlock; 1434 1433 } 1435 1434 context[len] = '\0'; 1436 - rc = inode->i_op->getxattr(dentry, 1435 + rc = inode->i_op->getxattr(dentry, inode, 1437 1436 XATTR_NAME_SELINUX, 1438 1437 context, len); 1439 1438 }
+3 -3
security/smack/smack_lsm.c
··· 272 272 if (buffer == NULL) 273 273 return ERR_PTR(-ENOMEM); 274 274 275 - rc = ip->i_op->getxattr(dp, name, buffer, SMK_LONGLABEL); 275 + rc = ip->i_op->getxattr(dp, ip, name, buffer, SMK_LONGLABEL); 276 276 if (rc < 0) 277 277 skp = ERR_PTR(rc); 278 278 else if (rc == 0) ··· 1444 1444 * XATTR_NAME_SMACKIPOUT 1445 1445 */ 1446 1446 if (strcmp(name, XATTR_NAME_SMACK) == 0) { 1447 - struct super_block *sbp = d_backing_inode(dentry)->i_sb; 1447 + struct super_block *sbp = dentry->d_sb; 1448 1448 struct superblock_smack *sbsp = sbp->s_security; 1449 1449 1450 1450 isp->smk_inode = sbsp->smk_default; ··· 3519 3519 TRANS_TRUE, TRANS_TRUE_SIZE, 3520 3520 0); 3521 3521 } else { 3522 - rc = inode->i_op->getxattr(dp, 3522 + rc = inode->i_op->getxattr(dp, inode, 3523 3523 XATTR_NAME_SMACKTRANSMUTE, trattr, 3524 3524 TRANS_TRUE_SIZE); 3525 3525 if (rc >= 0 && strncmp(trattr, TRANS_TRUE,