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

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs fixes from Al Viro:
"Followups to the parallel lookup work:

- update docs

- restore killability of the places that used to take ->i_mutex
killably now that we have down_write_killable() merged

- Additionally, it turns out that I missed a prerequisite for
security_d_instantiate() stuff - ->getxattr() wasn't the only thing
that could be called before dentry is attached to inode; with smack
we needed the same treatment applied to ->setxattr() as well"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
switch ->setxattr() to passing dentry and inode separately
switch xattr_handler->set() to passing dentry and inode separately
restore killability of old mutex_lock_killable(&inode->i_mutex) users
add down_write_killable_nested()
update D/f/directory-locking

+265 -209
+20 -12
Documentation/filesystems/directory-locking
··· 1 1 Locking scheme used for directory operations is based on two 2 - kinds of locks - per-inode (->i_mutex) and per-filesystem 2 + kinds of locks - per-inode (->i_rwsem) and per-filesystem 3 3 (->s_vfs_rename_mutex). 4 4 5 - When taking the i_mutex on multiple non-directory objects, we 5 + When taking the i_rwsem on multiple non-directory objects, we 6 6 always acquire the locks in order by increasing address. We'll call 7 7 that "inode pointer" order in the following. 8 8 9 9 For our purposes all operations fall in 5 classes: 10 10 11 11 1) read access. Locking rules: caller locks directory we are accessing. 12 + The lock is taken shared. 12 13 13 - 2) object creation. Locking rules: same as above. 14 + 2) object creation. Locking rules: same as above, but the lock is taken 15 + exclusive. 14 16 15 17 3) object removal. Locking rules: caller locks parent, finds victim, 16 - locks victim and calls the method. 18 + locks victim and calls the method. Locks are exclusive. 17 19 18 20 4) rename() that is _not_ cross-directory. Locking rules: caller locks 19 - the parent and finds source and target. If target already exists, lock 20 - it. If source is a non-directory, lock it. If that means we need to 21 - lock both, lock them in inode pointer order. 21 + the parent and finds source and target. In case of exchange (with 22 + RENAME_EXCHANGE in rename2() flags argument) lock both. In any case, 23 + if the target already exists, lock it. If the source is a non-directory, 24 + lock it. If we need to lock both, lock them in inode pointer order. 25 + Then call the method. All locks are exclusive. 26 + NB: we might get away with locking the the source (and target in exchange 27 + case) shared. 22 28 23 29 5) link creation. Locking rules: 24 30 * lock parent 25 31 * check that source is not a directory 26 32 * lock source 27 33 * call the method. 34 + All locks are exclusive. 28 35 29 36 6) cross-directory rename. The trickiest in the whole bunch. Locking 30 37 rules: ··· 42 35 fail with -ENOTEMPTY 43 36 * if new parent is equal to or is a descendent of source 44 37 fail with -ELOOP 45 - * If target exists, lock it. If source is a non-directory, lock 46 - it. In case that means we need to lock both source and target, 47 - do so in inode pointer order. 38 + * If it's an exchange, lock both the source and the target. 39 + * If the target exists, lock it. If the source is a non-directory, 40 + lock it. If we need to lock both, do so in inode pointer order. 48 41 * call the method. 49 - 42 + All ->i_rwsem are taken exclusive. Again, we might get away with locking 43 + the the source (and target in exchange case) shared. 50 44 51 45 The rules above obviously guarantee that all directories that are going to be 52 46 read, modified or removed by method will be locked by caller. ··· 81 73 attempt to acquire some lock and already holds at least one lock. Let's 82 74 consider the set of contended locks. First of all, filesystem lock is 83 75 not contended, since any process blocked on it is not holding any locks. 84 - Thus all processes are blocked on ->i_mutex. 76 + Thus all processes are blocked on ->i_rwsem. 85 77 86 78 By (3), any process holding a non-directory lock can only be 87 79 waiting on another non-directory lock with a larger address. Therefore
+7
Documentation/filesystems/porting
··· 578 578 -- 579 579 [mandatory] 580 580 ->atomic_open() calls without O_CREAT may happen in parallel. 581 + -- 582 + [mandatory] 583 + ->setxattr() and xattr_handler.set() get dentry and inode passed separately. 584 + dentry might be yet to be attached to inode, so do _not_ use its ->d_inode 585 + in the instances. Rationale: !@#!@# security_d_instantiate() needs to be 586 + called before we attach dentry to inode and !@#!@##!@$!$#!@#$!@$!@$ smack 587 + ->d_instantiate() uses not just ->getxattr() but ->setxattr() as well.
+2 -2
drivers/staging/lustre/lustre/llite/llite_internal.h
··· 976 976 } 977 977 978 978 /* llite/xattr.c */ 979 - int ll_setxattr(struct dentry *dentry, const char *name, 980 - const void *value, size_t size, int flags); 979 + int ll_setxattr(struct dentry *dentry, struct inode *inode, 980 + const char *name, const void *value, size_t size, int flags); 981 981 ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode, 982 982 const char *name, void *buffer, size_t size); 983 983 ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size);
+2 -4
drivers/staging/lustre/lustre/llite/xattr.c
··· 211 211 return 0; 212 212 } 213 213 214 - int ll_setxattr(struct dentry *dentry, const char *name, 215 - const void *value, size_t size, int flags) 214 + int ll_setxattr(struct dentry *dentry, struct inode *inode, 215 + const char *name, const void *value, size_t size, int flags) 216 216 { 217 - struct inode *inode = d_inode(dentry); 218 - 219 217 LASSERT(inode); 220 218 LASSERT(name); 221 219
+3 -3
fs/9p/acl.c
··· 239 239 } 240 240 241 241 static int v9fs_xattr_set_acl(const struct xattr_handler *handler, 242 - struct dentry *dentry, const char *name, 243 - const void *value, size_t size, int flags) 242 + struct dentry *dentry, struct inode *inode, 243 + const char *name, const void *value, 244 + size_t size, int flags) 244 245 { 245 246 int retval; 246 247 struct posix_acl *acl; 247 248 struct v9fs_session_info *v9ses; 248 - struct inode *inode = d_inode(dentry); 249 249 250 250 v9ses = v9fs_dentry2v9ses(dentry); 251 251 /*
+3 -2
fs/9p/xattr.c
··· 147 147 } 148 148 149 149 static int v9fs_xattr_handler_set(const struct xattr_handler *handler, 150 - struct dentry *dentry, const char *name, 151 - const void *value, size_t size, int flags) 150 + struct dentry *dentry, struct inode *inode, 151 + const char *name, const void *value, 152 + size_t size, int flags) 152 153 { 153 154 const char *full_name = xattr_full_name(handler, name); 154 155
+2 -2
fs/bad_inode.c
··· 100 100 return -EIO; 101 101 } 102 102 103 - static int bad_inode_setxattr(struct dentry *dentry, const char *name, 104 - const void *value, size_t size, int flags) 103 + static int bad_inode_setxattr(struct dentry *dentry, struct inode *inode, 104 + const char *name, const void *value, size_t size, int flags) 105 105 { 106 106 return -EIO; 107 107 }
+7 -11
fs/btrfs/ioctl.c
··· 846 846 struct dentry *dentry; 847 847 int error; 848 848 849 - inode_lock_nested(dir, I_MUTEX_PARENT); 850 - // XXX: should've been 851 - // mutex_lock_killable_nested(&dir->i_mutex, I_MUTEX_PARENT); 852 - // if (error == -EINTR) 853 - // return error; 849 + error = down_write_killable_nested(&dir->i_rwsem, I_MUTEX_PARENT); 850 + if (error == -EINTR) 851 + return error; 854 852 855 853 dentry = lookup_one_len(name, parent->dentry, namelen); 856 854 error = PTR_ERR(dentry); ··· 2375 2377 goto out; 2376 2378 2377 2379 2378 - inode_lock_nested(dir, I_MUTEX_PARENT); 2379 - // XXX: should've been 2380 - // err = mutex_lock_killable_nested(&dir->i_mutex, I_MUTEX_PARENT); 2381 - // if (err == -EINTR) 2382 - // goto out_drop_write; 2380 + err = down_write_killable_nested(&dir->i_rwsem, I_MUTEX_PARENT); 2381 + if (err == -EINTR) 2382 + goto out_drop_write; 2383 2383 dentry = lookup_one_len(vol_args->name, parent, namelen); 2384 2384 if (IS_ERR(dentry)) { 2385 2385 err = PTR_ERR(dentry); ··· 2567 2571 dput(dentry); 2568 2572 out_unlock_dir: 2569 2573 inode_unlock(dir); 2570 - //out_drop_write: 2574 + out_drop_write: 2571 2575 mnt_drop_write_file(file); 2572 2576 out: 2573 2577 kfree(vol_args);
+5 -7
fs/btrfs/xattr.c
··· 380 380 } 381 381 382 382 static int btrfs_xattr_handler_set(const struct xattr_handler *handler, 383 - struct dentry *dentry, const char *name, 384 - const void *buffer, size_t size, 385 - int flags) 383 + struct dentry *unused, struct inode *inode, 384 + const char *name, const void *buffer, 385 + size_t size, int flags) 386 386 { 387 - struct inode *inode = d_inode(dentry); 388 - 389 387 name = xattr_full_name(handler, name); 390 388 return __btrfs_setxattr(NULL, inode, name, buffer, size, flags); 391 389 } 392 390 393 391 static int btrfs_xattr_handler_set_prop(const struct xattr_handler *handler, 394 - struct dentry *dentry, 392 + struct dentry *unused, struct inode *inode, 395 393 const char *name, const void *value, 396 394 size_t size, int flags) 397 395 { 398 396 name = xattr_full_name(handler, name); 399 - return btrfs_set_prop(d_inode(dentry), name, value, size, flags); 397 + return btrfs_set_prop(inode, name, value, size, flags); 400 398 } 401 399 402 400 static const struct xattr_handler btrfs_security_xattr_handler = {
+4 -3
fs/ceph/xattr.c
··· 1056 1056 } 1057 1057 1058 1058 static int ceph_set_xattr_handler(const struct xattr_handler *handler, 1059 - struct dentry *dentry, const char *name, 1060 - const void *value, size_t size, int flags) 1059 + struct dentry *unused, struct inode *inode, 1060 + const char *name, const void *value, 1061 + size_t size, int flags) 1061 1062 { 1062 1063 if (!ceph_is_valid_xattr(name)) 1063 1064 return -EOPNOTSUPP; 1064 - return __ceph_setxattr(d_inode(dentry), name, value, size, flags); 1065 + return __ceph_setxattr(inode, name, value, size, flags); 1065 1066 } 1066 1067 1067 1068 const struct xattr_handler ceph_other_xattr_handler = {
+5 -4
fs/cifs/xattr.c
··· 39 39 enum { XATTR_USER, XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT }; 40 40 41 41 static int cifs_xattr_set(const struct xattr_handler *handler, 42 - struct dentry *dentry, const char *name, 43 - const void *value, size_t size, int flags) 42 + struct dentry *dentry, struct inode *inode, 43 + const char *name, const void *value, 44 + size_t size, int flags) 44 45 { 45 46 int rc = -EOPNOTSUPP; 46 47 unsigned int xid; ··· 100 99 if (value && 101 100 pTcon->ses->server->ops->set_acl) 102 101 rc = pTcon->ses->server->ops->set_acl(pacl, 103 - size, d_inode(dentry), 102 + size, inode, 104 103 full_path, CIFS_ACL_DACL); 105 104 else 106 105 rc = -EOPNOTSUPP; 107 106 if (rc == 0) /* force revalidate of the inode */ 108 - CIFS_I(d_inode(dentry))->time = 0; 107 + CIFS_I(inode)->time = 0; 109 108 kfree(pacl); 110 109 } 111 110 #endif /* CONFIG_CIFS_ACL */
+5 -4
fs/ecryptfs/crypto.c
··· 1141 1141 1142 1142 static int 1143 1143 ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry, 1144 + struct inode *ecryptfs_inode, 1144 1145 char *page_virt, size_t size) 1145 1146 { 1146 1147 int rc; 1147 1148 1148 - rc = ecryptfs_setxattr(ecryptfs_dentry, ECRYPTFS_XATTR_NAME, page_virt, 1149 - size, 0); 1149 + rc = ecryptfs_setxattr(ecryptfs_dentry, ecryptfs_inode, 1150 + ECRYPTFS_XATTR_NAME, page_virt, size, 0); 1150 1151 return rc; 1151 1152 } 1152 1153 ··· 1216 1215 goto out_free; 1217 1216 } 1218 1217 if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) 1219 - rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry, virt, 1220 - size); 1218 + rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry, ecryptfs_inode, 1219 + virt, size); 1221 1220 else 1222 1221 rc = ecryptfs_write_metadata_to_contents(ecryptfs_inode, virt, 1223 1222 virt_len);
+2 -2
fs/ecryptfs/ecryptfs_kernel.h
··· 609 609 ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode, 610 610 const char *name, void *value, size_t size); 611 611 int 612 - ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, 613 - size_t size, int flags); 612 + ecryptfs_setxattr(struct dentry *dentry, struct inode *inode, const char *name, 613 + const void *value, size_t size, int flags); 614 614 int ecryptfs_read_xattr_region(char *page_virt, struct inode *ecryptfs_inode); 615 615 #ifdef CONFIG_ECRYPT_FS_MESSAGING 616 616 int ecryptfs_process_response(struct ecryptfs_daemon *daemon,
+4 -3
fs/ecryptfs/inode.c
··· 1001 1001 } 1002 1002 1003 1003 int 1004 - ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, 1004 + ecryptfs_setxattr(struct dentry *dentry, struct inode *inode, 1005 + const char *name, const void *value, 1005 1006 size_t size, int flags) 1006 1007 { 1007 1008 int rc = 0; ··· 1015 1014 } 1016 1015 1017 1016 rc = vfs_setxattr(lower_dentry, name, value, size, flags); 1018 - if (!rc && d_really_is_positive(dentry)) 1019 - fsstack_copy_attr_all(d_inode(dentry), d_inode(lower_dentry)); 1017 + if (!rc && inode) 1018 + fsstack_copy_attr_all(inode, d_inode(lower_dentry)); 1020 1019 out: 1021 1020 return rc; 1022 1021 }
+2 -1
fs/ecryptfs/mmap.c
··· 442 442 if (size < 0) 443 443 size = 8; 444 444 put_unaligned_be64(i_size_read(ecryptfs_inode), xattr_virt); 445 - rc = lower_inode->i_op->setxattr(lower_dentry, ECRYPTFS_XATTR_NAME, 445 + rc = lower_inode->i_op->setxattr(lower_dentry, lower_inode, 446 + ECRYPTFS_XATTR_NAME, 446 447 xattr_virt, size, 0); 447 448 inode_unlock(lower_inode); 448 449 if (rc)
+4 -3
fs/ext2/xattr_security.c
··· 18 18 19 19 static int 20 20 ext2_xattr_security_set(const struct xattr_handler *handler, 21 - struct dentry *dentry, const char *name, 22 - const void *value, size_t size, int flags) 21 + struct dentry *unused, struct inode *inode, 22 + const char *name, const void *value, 23 + size_t size, int flags) 23 24 { 24 - return ext2_xattr_set(d_inode(dentry), EXT2_XATTR_INDEX_SECURITY, name, 25 + return ext2_xattr_set(inode, EXT2_XATTR_INDEX_SECURITY, name, 25 26 value, size, flags); 26 27 } 27 28
+4 -3
fs/ext2/xattr_trusted.c
··· 25 25 26 26 static int 27 27 ext2_xattr_trusted_set(const struct xattr_handler *handler, 28 - struct dentry *dentry, const char *name, 29 - const void *value, size_t size, int flags) 28 + struct dentry *unused, struct inode *inode, 29 + const char *name, const void *value, 30 + size_t size, int flags) 30 31 { 31 - return ext2_xattr_set(d_inode(dentry), EXT2_XATTR_INDEX_TRUSTED, name, 32 + return ext2_xattr_set(inode, EXT2_XATTR_INDEX_TRUSTED, name, 32 33 value, size, flags); 33 34 } 34 35
+5 -4
fs/ext2/xattr_user.c
··· 29 29 30 30 static int 31 31 ext2_xattr_user_set(const struct xattr_handler *handler, 32 - struct dentry *dentry, const char *name, 33 - const void *value, size_t size, int flags) 32 + struct dentry *unused, struct inode *inode, 33 + const char *name, const void *value, 34 + size_t size, int flags) 34 35 { 35 - if (!test_opt(dentry->d_sb, XATTR_USER)) 36 + if (!test_opt(inode->i_sb, XATTR_USER)) 36 37 return -EOPNOTSUPP; 37 38 38 - return ext2_xattr_set(d_inode(dentry), EXT2_XATTR_INDEX_USER, 39 + return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, 39 40 name, value, size, flags); 40 41 } 41 42
+4 -3
fs/ext4/xattr_security.c
··· 22 22 23 23 static int 24 24 ext4_xattr_security_set(const struct xattr_handler *handler, 25 - struct dentry *dentry, const char *name, 26 - const void *value, size_t size, int flags) 25 + struct dentry *unused, struct inode *inode, 26 + const char *name, const void *value, 27 + size_t size, int flags) 27 28 { 28 - return ext4_xattr_set(d_inode(dentry), EXT4_XATTR_INDEX_SECURITY, 29 + return ext4_xattr_set(inode, EXT4_XATTR_INDEX_SECURITY, 29 30 name, value, size, flags); 30 31 } 31 32
+4 -3
fs/ext4/xattr_trusted.c
··· 29 29 30 30 static int 31 31 ext4_xattr_trusted_set(const struct xattr_handler *handler, 32 - struct dentry *dentry, const char *name, 33 - const void *value, size_t size, int flags) 32 + struct dentry *unused, struct inode *inode, 33 + const char *name, const void *value, 34 + size_t size, int flags) 34 35 { 35 - return ext4_xattr_set(d_inode(dentry), EXT4_XATTR_INDEX_TRUSTED, 36 + return ext4_xattr_set(inode, EXT4_XATTR_INDEX_TRUSTED, 36 37 name, value, size, flags); 37 38 } 38 39
+5 -4
fs/ext4/xattr_user.c
··· 30 30 31 31 static int 32 32 ext4_xattr_user_set(const struct xattr_handler *handler, 33 - struct dentry *dentry, const char *name, 34 - const void *value, size_t size, int flags) 33 + struct dentry *unused, struct inode *inode, 34 + const char *name, const void *value, 35 + size_t size, int flags) 35 36 { 36 - if (!test_opt(dentry->d_sb, XATTR_USER)) 37 + if (!test_opt(inode->i_sb, XATTR_USER)) 37 38 return -EOPNOTSUPP; 38 - return ext4_xattr_set(d_inode(dentry), EXT4_XATTR_INDEX_USER, 39 + return ext4_xattr_set(inode, EXT4_XATTR_INDEX_USER, 39 40 name, value, size, flags); 40 41 } 41 42
+6 -6
fs/f2fs/xattr.c
··· 50 50 } 51 51 52 52 static int f2fs_xattr_generic_set(const struct xattr_handler *handler, 53 - struct dentry *dentry, const char *name, const void *value, 53 + struct dentry *unused, struct inode *inode, 54 + const char *name, const void *value, 54 55 size_t size, int flags) 55 56 { 56 - struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); 57 + struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); 57 58 58 59 switch (handler->flags) { 59 60 case F2FS_XATTR_INDEX_USER: ··· 70 69 default: 71 70 return -EINVAL; 72 71 } 73 - return f2fs_setxattr(d_inode(dentry), handler->flags, name, 72 + return f2fs_setxattr(inode, handler->flags, name, 74 73 value, size, NULL, flags); 75 74 } 76 75 ··· 96 95 } 97 96 98 97 static int f2fs_xattr_advise_set(const struct xattr_handler *handler, 99 - struct dentry *dentry, const char *name, const void *value, 98 + struct dentry *unused, struct inode *inode, 99 + const char *name, const void *value, 100 100 size_t size, int flags) 101 101 { 102 - struct inode *inode = d_inode(dentry); 103 - 104 102 if (!inode_owner_or_capable(inode)) 105 103 return -EPERM; 106 104 if (value == NULL)
+3 -3
fs/fuse/dir.c
··· 1719 1719 return fuse_update_attributes(inode, stat, NULL, NULL); 1720 1720 } 1721 1721 1722 - static int fuse_setxattr(struct dentry *entry, const char *name, 1723 - const void *value, size_t size, int flags) 1722 + static int fuse_setxattr(struct dentry *unused, struct inode *inode, 1723 + const char *name, const void *value, 1724 + size_t size, int flags) 1724 1725 { 1725 - struct inode *inode = d_inode(entry); 1726 1726 struct fuse_conn *fc = get_fuse_conn(inode); 1727 1727 FUSE_ARGS(args); 1728 1728 struct fuse_setxattr_in inarg;
+3 -3
fs/gfs2/xattr.c
··· 1251 1251 } 1252 1252 1253 1253 static int gfs2_xattr_set(const struct xattr_handler *handler, 1254 - struct dentry *dentry, const char *name, 1255 - const void *value, size_t size, int flags) 1254 + struct dentry *unused, struct inode *inode, 1255 + const char *name, const void *value, 1256 + size_t size, int flags) 1256 1257 { 1257 - struct inode *inode = d_inode(dentry); 1258 1258 struct gfs2_inode *ip = GFS2_I(inode); 1259 1259 struct gfs2_holder gh; 1260 1260 int ret;
+3 -3
fs/hfs/attr.c
··· 13 13 #include "hfs_fs.h" 14 14 #include "btree.h" 15 15 16 - int hfs_setxattr(struct dentry *dentry, const char *name, 17 - const void *value, size_t size, int flags) 16 + int hfs_setxattr(struct dentry *unused, struct inode *inode, 17 + const char *name, const void *value, 18 + size_t size, int flags) 18 19 { 19 - struct inode *inode = d_inode(dentry); 20 20 struct hfs_find_data fd; 21 21 hfs_cat_rec rec; 22 22 struct hfs_cat_file *file;
+1 -1
fs/hfs/hfs_fs.h
··· 212 212 extern void hfs_delete_inode(struct inode *); 213 213 214 214 /* attr.c */ 215 - extern int hfs_setxattr(struct dentry *dentry, const char *name, 215 + extern int hfs_setxattr(struct dentry *dentry, struct inode *inode, const char *name, 216 216 const void *value, size_t size, int flags); 217 217 extern ssize_t hfs_getxattr(struct dentry *dentry, struct inode *inode, 218 218 const char *name, void *value, size_t size);
+6 -6
fs/hfsplus/xattr.c
··· 424 424 return len; 425 425 } 426 426 427 - int hfsplus_setxattr(struct dentry *dentry, const char *name, 427 + int hfsplus_setxattr(struct inode *inode, const char *name, 428 428 const void *value, size_t size, int flags, 429 429 const char *prefix, size_t prefixlen) 430 430 { ··· 437 437 return -ENOMEM; 438 438 strcpy(xattr_name, prefix); 439 439 strcpy(xattr_name + prefixlen, name); 440 - res = __hfsplus_setxattr(d_inode(dentry), xattr_name, value, size, 441 - flags); 440 + res = __hfsplus_setxattr(inode, xattr_name, value, size, flags); 442 441 kfree(xattr_name); 443 442 return res; 444 443 } ··· 863 864 } 864 865 865 866 static int hfsplus_osx_setxattr(const struct xattr_handler *handler, 866 - struct dentry *dentry, const char *name, 867 - const void *buffer, size_t size, int flags) 867 + struct dentry *unused, struct inode *inode, 868 + const char *name, const void *buffer, 869 + size_t size, int flags) 868 870 { 869 871 /* 870 872 * Don't allow setting properly prefixed attributes ··· 880 880 * creates), so we pass the name through unmodified (after 881 881 * ensuring it doesn't conflict with another namespace). 882 882 */ 883 - return __hfsplus_setxattr(d_inode(dentry), name, buffer, size, flags); 883 + return __hfsplus_setxattr(inode, name, buffer, size, flags); 884 884 } 885 885 886 886 const struct xattr_handler hfsplus_xattr_osx_handler = {
+1 -1
fs/hfsplus/xattr.h
··· 21 21 int __hfsplus_setxattr(struct inode *inode, const char *name, 22 22 const void *value, size_t size, int flags); 23 23 24 - int hfsplus_setxattr(struct dentry *dentry, const char *name, 24 + int hfsplus_setxattr(struct inode *inode, const char *name, 25 25 const void *value, size_t size, int flags, 26 26 const char *prefix, size_t prefixlen); 27 27
+4 -3
fs/hfsplus/xattr_security.c
··· 23 23 } 24 24 25 25 static int hfsplus_security_setxattr(const struct xattr_handler *handler, 26 - struct dentry *dentry, const char *name, 27 - const void *buffer, size_t size, int flags) 26 + struct dentry *unused, struct inode *inode, 27 + const char *name, const void *buffer, 28 + size_t size, int flags) 28 29 { 29 - return hfsplus_setxattr(dentry, name, buffer, size, flags, 30 + return hfsplus_setxattr(inode, name, buffer, size, flags, 30 31 XATTR_SECURITY_PREFIX, 31 32 XATTR_SECURITY_PREFIX_LEN); 32 33 }
+4 -3
fs/hfsplus/xattr_trusted.c
··· 21 21 } 22 22 23 23 static int hfsplus_trusted_setxattr(const struct xattr_handler *handler, 24 - struct dentry *dentry, const char *name, 25 - const void *buffer, size_t size, int flags) 24 + struct dentry *unused, struct inode *inode, 25 + const char *name, const void *buffer, 26 + size_t size, int flags) 26 27 { 27 - return hfsplus_setxattr(dentry, name, buffer, size, flags, 28 + return hfsplus_setxattr(inode, name, buffer, size, flags, 28 29 XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN); 29 30 } 30 31
+4 -3
fs/hfsplus/xattr_user.c
··· 21 21 } 22 22 23 23 static int hfsplus_user_setxattr(const struct xattr_handler *handler, 24 - struct dentry *dentry, const char *name, 25 - const void *buffer, size_t size, int flags) 24 + struct dentry *unused, struct inode *inode, 25 + const char *name, const void *buffer, 26 + size_t size, int flags) 26 27 { 27 - return hfsplus_setxattr(dentry, name, buffer, size, flags, 28 + return hfsplus_setxattr(inode, name, buffer, size, flags, 28 29 XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); 29 30 } 30 31
+4 -3
fs/jffs2/security.c
··· 57 57 } 58 58 59 59 static int jffs2_security_setxattr(const struct xattr_handler *handler, 60 - struct dentry *dentry, const char *name, 61 - const void *buffer, size_t size, int flags) 60 + struct dentry *unused, struct inode *inode, 61 + const char *name, const void *buffer, 62 + size_t size, int flags) 62 63 { 63 - return do_jffs2_setxattr(d_inode(dentry), JFFS2_XPREFIX_SECURITY, 64 + return do_jffs2_setxattr(inode, JFFS2_XPREFIX_SECURITY, 64 65 name, buffer, size, flags); 65 66 } 66 67
+4 -3
fs/jffs2/xattr_trusted.c
··· 25 25 } 26 26 27 27 static int jffs2_trusted_setxattr(const struct xattr_handler *handler, 28 - struct dentry *dentry, const char *name, 29 - const void *buffer, size_t size, int flags) 28 + struct dentry *unused, struct inode *inode, 29 + const char *name, const void *buffer, 30 + size_t size, int flags) 30 31 { 31 - return do_jffs2_setxattr(d_inode(dentry), JFFS2_XPREFIX_TRUSTED, 32 + return do_jffs2_setxattr(inode, JFFS2_XPREFIX_TRUSTED, 32 33 name, buffer, size, flags); 33 34 } 34 35
+4 -3
fs/jffs2/xattr_user.c
··· 25 25 } 26 26 27 27 static int jffs2_user_setxattr(const struct xattr_handler *handler, 28 - struct dentry *dentry, const char *name, 29 - const void *buffer, size_t size, int flags) 28 + struct dentry *unused, struct inode *inode, 29 + const char *name, const void *buffer, 30 + size_t size, int flags) 30 31 { 31 - return do_jffs2_setxattr(d_inode(dentry), JFFS2_XPREFIX_USER, 32 + return do_jffs2_setxattr(inode, JFFS2_XPREFIX_USER, 32 33 name, buffer, size, flags); 33 34 } 34 35
+6 -8
fs/jfs/xattr.c
··· 943 943 } 944 944 945 945 static int jfs_xattr_set(const struct xattr_handler *handler, 946 - struct dentry *dentry, const char *name, 947 - const void *value, size_t size, int flags) 946 + struct dentry *unused, struct inode *inode, 947 + const char *name, const void *value, 948 + size_t size, int flags) 948 949 { 949 - struct inode *inode = d_inode(dentry); 950 - 951 950 name = xattr_full_name(handler, name); 952 951 return __jfs_xattr_set(inode, name, value, size, flags); 953 952 } ··· 961 962 } 962 963 963 964 static int jfs_xattr_set_os2(const struct xattr_handler *handler, 964 - struct dentry *dentry, const char *name, 965 - const void *value, size_t size, int flags) 965 + struct dentry *unused, struct inode *inode, 966 + const char *name, const void *value, 967 + size_t size, int flags) 966 968 { 967 - struct inode *inode = d_inode(dentry); 968 - 969 969 if (is_known_namespace(name)) 970 970 return -EOPNOTSUPP; 971 971 return __jfs_xattr_set(inode, name, value, size, flags);
+6 -5
fs/kernfs/inode.c
··· 160 160 return 0; 161 161 } 162 162 163 - int kernfs_iop_setxattr(struct dentry *dentry, const char *name, 164 - const void *value, size_t size, int flags) 163 + int kernfs_iop_setxattr(struct dentry *unused, struct inode *inode, 164 + const char *name, const void *value, 165 + size_t size, int flags) 165 166 { 166 - struct kernfs_node *kn = dentry->d_fsdata; 167 + struct kernfs_node *kn = inode->i_private; 167 168 struct kernfs_iattrs *attrs; 168 169 void *secdata; 169 170 int error; ··· 176 175 177 176 if (!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN)) { 178 177 const char *suffix = name + XATTR_SECURITY_PREFIX_LEN; 179 - error = security_inode_setsecurity(d_inode(dentry), suffix, 178 + error = security_inode_setsecurity(inode, suffix, 180 179 value, size, flags); 181 180 if (error) 182 181 return error; 183 - error = security_inode_getsecctx(d_inode(dentry), 182 + error = security_inode_getsecctx(inode, 184 183 &secdata, &secdata_len); 185 184 if (error) 186 185 return error;
+2 -1
fs/kernfs/kernfs-internal.h
··· 81 81 int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr); 82 82 int kernfs_iop_getattr(struct vfsmount *mnt, struct dentry *dentry, 83 83 struct kstat *stat); 84 - int kernfs_iop_setxattr(struct dentry *dentry, const char *name, const void *value, 84 + int kernfs_iop_setxattr(struct dentry *dentry, struct inode *inode, 85 + const char *name, const void *value, 85 86 size_t size, int flags); 86 87 int kernfs_iop_removexattr(struct dentry *dentry, const char *name); 87 88 ssize_t kernfs_iop_getxattr(struct dentry *dentry, struct inode *inode,
+3 -2
fs/libfs.c
··· 1118 1118 return -EPERM; 1119 1119 } 1120 1120 1121 - static int empty_dir_setxattr(struct dentry *dentry, const char *name, 1122 - const void *value, size_t size, int flags) 1121 + static int empty_dir_setxattr(struct dentry *dentry, struct inode *inode, 1122 + const char *name, const void *value, 1123 + size_t size, int flags) 1123 1124 { 1124 1125 return -EOPNOTSUPP; 1125 1126 }
+9 -10
fs/nfs/nfs4proc.c
··· 5015 5015 } 5016 5016 5017 5017 static int 5018 - nfs4_set_security_label(struct dentry *dentry, const void *buf, size_t buflen) 5018 + nfs4_set_security_label(struct inode *inode, const void *buf, size_t buflen) 5019 5019 { 5020 5020 struct nfs4_label ilabel, *olabel = NULL; 5021 5021 struct nfs_fattr fattr; 5022 5022 struct rpc_cred *cred; 5023 - struct inode *inode = d_inode(dentry); 5024 5023 int status; 5025 5024 5026 5025 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) ··· 6280 6281 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl" 6281 6282 6282 6283 static int nfs4_xattr_set_nfs4_acl(const struct xattr_handler *handler, 6283 - struct dentry *dentry, const char *key, 6284 - const void *buf, size_t buflen, 6285 - int flags) 6284 + struct dentry *unused, struct inode *inode, 6285 + const char *key, const void *buf, 6286 + size_t buflen, int flags) 6286 6287 { 6287 - return nfs4_proc_set_acl(d_inode(dentry), buf, buflen); 6288 + return nfs4_proc_set_acl(inode, buf, buflen); 6288 6289 } 6289 6290 6290 6291 static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler, ··· 6302 6303 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 6303 6304 6304 6305 static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler, 6305 - struct dentry *dentry, const char *key, 6306 - const void *buf, size_t buflen, 6307 - int flags) 6306 + struct dentry *unused, struct inode *inode, 6307 + const char *key, const void *buf, 6308 + size_t buflen, int flags) 6308 6309 { 6309 6310 if (security_ismaclabel(key)) 6310 - return nfs4_set_security_label(dentry, buf, buflen); 6311 + return nfs4_set_security_label(inode, buf, buflen); 6311 6312 6312 6313 return -EOPNOTSUPP; 6313 6314 }
+13 -10
fs/ocfs2/xattr.c
··· 7254 7254 } 7255 7255 7256 7256 static int ocfs2_xattr_security_set(const struct xattr_handler *handler, 7257 - struct dentry *dentry, const char *name, 7258 - const void *value, size_t size, int flags) 7257 + struct dentry *unused, struct inode *inode, 7258 + const char *name, const void *value, 7259 + size_t size, int flags) 7259 7260 { 7260 - return ocfs2_xattr_set(d_inode(dentry), OCFS2_XATTR_INDEX_SECURITY, 7261 + return ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_SECURITY, 7261 7262 name, value, size, flags); 7262 7263 } 7263 7264 ··· 7326 7325 } 7327 7326 7328 7327 static int ocfs2_xattr_trusted_set(const struct xattr_handler *handler, 7329 - struct dentry *dentry, const char *name, 7330 - const void *value, size_t size, int flags) 7328 + struct dentry *unused, struct inode *inode, 7329 + const char *name, const void *value, 7330 + size_t size, int flags) 7331 7331 { 7332 - return ocfs2_xattr_set(d_inode(dentry), OCFS2_XATTR_INDEX_TRUSTED, 7332 + return ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_TRUSTED, 7333 7333 name, value, size, flags); 7334 7334 } 7335 7335 ··· 7356 7354 } 7357 7355 7358 7356 static int ocfs2_xattr_user_set(const struct xattr_handler *handler, 7359 - struct dentry *dentry, const char *name, 7360 - const void *value, size_t size, int flags) 7357 + struct dentry *unused, struct inode *inode, 7358 + const char *name, const void *value, 7359 + size_t size, int flags) 7361 7360 { 7362 - struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); 7361 + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); 7363 7362 7364 7363 if (osb->s_mount_opt & OCFS2_MOUNT_NOUSERXATTR) 7365 7364 return -EOPNOTSUPP; 7366 7365 7367 - return ocfs2_xattr_set(d_inode(dentry), OCFS2_XATTR_INDEX_USER, 7366 + return ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_USER, 7368 7367 name, value, size, flags); 7369 7368 } 7370 7369
+6 -4
fs/orangefs/xattr.c
··· 448 448 } 449 449 450 450 static int orangefs_xattr_set_default(const struct xattr_handler *handler, 451 - struct dentry *dentry, 451 + struct dentry *unused, 452 + struct inode *inode, 452 453 const char *name, 453 454 const void *buffer, 454 455 size_t size, 455 456 int flags) 456 457 { 457 - return orangefs_inode_setxattr(dentry->d_inode, 458 + return orangefs_inode_setxattr(inode, 458 459 ORANGEFS_XATTR_NAME_DEFAULT_PREFIX, 459 460 name, 460 461 buffer, ··· 479 478 } 480 479 481 480 static int orangefs_xattr_set_trusted(const struct xattr_handler *handler, 482 - struct dentry *dentry, 481 + struct dentry *unused, 482 + struct inode *inode, 483 483 const char *name, 484 484 const void *buffer, 485 485 size_t size, 486 486 int flags) 487 487 { 488 - return orangefs_inode_setxattr(dentry->d_inode, 488 + return orangefs_inode_setxattr(inode, 489 489 ORANGEFS_XATTR_NAME_TRUSTED_PREFIX, 490 490 name, 491 491 buffer,
+3 -2
fs/overlayfs/inode.c
··· 210 210 return strncmp(name, OVL_XATTR_PRE_NAME, OVL_XATTR_PRE_LEN) == 0; 211 211 } 212 212 213 - int ovl_setxattr(struct dentry *dentry, const char *name, 214 - const void *value, size_t size, int flags) 213 + int ovl_setxattr(struct dentry *dentry, struct inode *inode, 214 + const char *name, const void *value, 215 + size_t size, int flags) 215 216 { 216 217 int err; 217 218 struct dentry *upperdentry;
+3 -2
fs/overlayfs/overlayfs.h
··· 172 172 /* inode.c */ 173 173 int ovl_setattr(struct dentry *dentry, struct iattr *attr); 174 174 int ovl_permission(struct inode *inode, int mask); 175 - int ovl_setxattr(struct dentry *dentry, const char *name, 176 - const void *value, size_t size, int flags); 175 + int ovl_setxattr(struct dentry *dentry, struct inode *inode, 176 + const char *name, const void *value, 177 + size_t size, int flags); 177 178 ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, 178 179 const char *name, void *value, size_t size); 179 180 ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
+1 -3
fs/overlayfs/readdir.c
··· 210 210 211 211 old_cred = ovl_override_creds(rdd->dentry->d_sb); 212 212 213 - inode_lock(dir->d_inode); 214 - err = 0; 215 - // XXX: err = mutex_lock_killable(&dir->d_inode->i_mutex); 213 + err = down_write_killable(&dir->d_inode->i_rwsem); 216 214 if (!err) { 217 215 while (rdd->first_maybe_whiteout) { 218 216 p = rdd->first_maybe_whiteout;
+3 -3
fs/posix_acl.c
··· 822 822 823 823 static int 824 824 posix_acl_xattr_set(const struct xattr_handler *handler, 825 - struct dentry *dentry, const char *name, 826 - const void *value, size_t size, int flags) 825 + struct dentry *unused, struct inode *inode, 826 + const char *name, const void *value, 827 + size_t size, int flags) 827 828 { 828 - struct inode *inode = d_backing_inode(dentry); 829 829 struct posix_acl *acl = NULL; 830 830 int ret; 831 831
+6 -6
fs/readdir.c
··· 35 35 if (res) 36 36 goto out; 37 37 38 - if (shared) 38 + if (shared) { 39 39 inode_lock_shared(inode); 40 - else 41 - inode_lock(inode); 42 - // res = mutex_lock_killable(&inode->i_mutex); 43 - // if (res) 44 - // goto out; 40 + } else { 41 + res = down_write_killable(&inode->i_rwsem); 42 + if (res) 43 + goto out; 44 + } 45 45 46 46 res = -ENOENT; 47 47 if (!IS_DEADDIR(inode)) {
+5 -4
fs/reiserfs/xattr_security.c
··· 20 20 } 21 21 22 22 static int 23 - security_set(const struct xattr_handler *handler, struct dentry *dentry, 24 - const char *name, const void *buffer, size_t size, int flags) 23 + security_set(const struct xattr_handler *handler, struct dentry *unused, 24 + struct inode *inode, const char *name, const void *buffer, 25 + size_t size, int flags) 25 26 { 26 - if (IS_PRIVATE(d_inode(dentry))) 27 + if (IS_PRIVATE(inode)) 27 28 return -EPERM; 28 29 29 - return reiserfs_xattr_set(d_inode(dentry), 30 + return reiserfs_xattr_set(inode, 30 31 xattr_full_name(handler, name), 31 32 buffer, size, flags); 32 33 }
+5 -4
fs/reiserfs/xattr_trusted.c
··· 19 19 } 20 20 21 21 static int 22 - trusted_set(const struct xattr_handler *handler, struct dentry *dentry, 23 - const char *name, const void *buffer, size_t size, int flags) 22 + trusted_set(const struct xattr_handler *handler, struct dentry *unused, 23 + struct inode *inode, const char *name, const void *buffer, 24 + size_t size, int flags) 24 25 { 25 - if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(d_inode(dentry))) 26 + if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode)) 26 27 return -EPERM; 27 28 28 - return reiserfs_xattr_set(d_inode(dentry), 29 + return reiserfs_xattr_set(inode, 29 30 xattr_full_name(handler, name), 30 31 buffer, size, flags); 31 32 }
+5 -4
fs/reiserfs/xattr_user.c
··· 17 17 } 18 18 19 19 static int 20 - user_set(const struct xattr_handler *handler, struct dentry *dentry, 21 - const char *name, const void *buffer, size_t size, int flags) 20 + user_set(const struct xattr_handler *handler, struct dentry *unused, 21 + struct inode *inode, const char *name, const void *buffer, 22 + size_t size, int flags) 22 23 { 23 - if (!reiserfs_xattrs_user(dentry->d_sb)) 24 + if (!reiserfs_xattrs_user(inode->i_sb)) 24 25 return -EOPNOTSUPP; 25 - return reiserfs_xattr_set(d_inode(dentry), 26 + return reiserfs_xattr_set(inode, 26 27 xattr_full_name(handler, name), 27 28 buffer, size, flags); 28 29 }
+3 -4
fs/ubifs/xattr.c
··· 579 579 } 580 580 581 581 static int ubifs_xattr_set(const struct xattr_handler *handler, 582 - struct dentry *dentry, const char *name, 583 - const void *value, size_t size, int flags) 582 + struct dentry *dentry, struct inode *inode, 583 + const char *name, const void *value, 584 + size_t size, int flags) 584 585 { 585 - struct inode *inode = d_inode(dentry); 586 - 587 586 dbg_gen("xattr '%s', host ino %lu ('%pd'), size %zd", 588 587 name, inode->i_ino, dentry, size); 589 588
+6 -4
fs/xattr.c
··· 100 100 if (issec) 101 101 inode->i_flags &= ~S_NOSEC; 102 102 if (inode->i_op->setxattr) { 103 - error = inode->i_op->setxattr(dentry, name, value, size, flags); 103 + error = inode->i_op->setxattr(dentry, inode, name, value, size, flags); 104 104 if (!error) { 105 105 fsnotify_xattr(dentry); 106 106 security_inode_post_setxattr(dentry, name, value, ··· 745 745 * Find the handler for the prefix and dispatch its set() operation. 746 746 */ 747 747 int 748 - generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags) 748 + generic_setxattr(struct dentry *dentry, struct inode *inode, const char *name, 749 + const void *value, size_t size, int flags) 749 750 { 750 751 const struct xattr_handler *handler; 751 752 ··· 755 754 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 756 755 if (IS_ERR(handler)) 757 756 return PTR_ERR(handler); 758 - return handler->set(handler, dentry, name, value, size, flags); 757 + return handler->set(handler, dentry, inode, name, value, size, flags); 759 758 } 760 759 761 760 /* ··· 770 769 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 771 770 if (IS_ERR(handler)) 772 771 return PTR_ERR(handler); 773 - return handler->set(handler, dentry, name, NULL, 0, XATTR_REPLACE); 772 + return handler->set(handler, dentry, d_inode(dentry), name, NULL, 773 + 0, XATTR_REPLACE); 774 774 } 775 775 776 776 EXPORT_SYMBOL(generic_getxattr);
+5 -4
fs/xfs/xfs_xattr.c
··· 74 74 } 75 75 76 76 static int 77 - xfs_xattr_set(const struct xattr_handler *handler, struct dentry *dentry, 78 - const char *name, const void *value, size_t size, int flags) 77 + xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, 78 + struct inode *inode, const char *name, const void *value, 79 + size_t size, int flags) 79 80 { 80 81 int xflags = handler->flags; 81 - struct xfs_inode *ip = XFS_I(d_inode(dentry)); 82 + struct xfs_inode *ip = XFS_I(inode); 82 83 int error; 83 84 84 85 /* Convert Linux syscall to XFS internal ATTR flags */ ··· 93 92 error = xfs_attr_set(ip, (unsigned char *)name, 94 93 (void *)value, size, xflags); 95 94 if (!error) 96 - xfs_forget_acl(d_inode(dentry), name, xflags); 95 + xfs_forget_acl(inode, name, xflags); 97 96 98 97 return error; 99 98 }
+2 -1
include/linux/fs.h
··· 1729 1729 struct inode *, struct dentry *, unsigned int); 1730 1730 int (*setattr) (struct dentry *, struct iattr *); 1731 1731 int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); 1732 - int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); 1732 + int (*setxattr) (struct dentry *, struct inode *, 1733 + const char *, const void *, size_t, int); 1733 1734 ssize_t (*getxattr) (struct dentry *, struct inode *, 1734 1735 const char *, void *, size_t); 1735 1736 ssize_t (*listxattr) (struct dentry *, char *, size_t);
+2
include/linux/rwsem.h
··· 156 156 */ 157 157 extern void down_read_nested(struct rw_semaphore *sem, int subclass); 158 158 extern void down_write_nested(struct rw_semaphore *sem, int subclass); 159 + extern int down_write_killable_nested(struct rw_semaphore *sem, int subclass); 159 160 extern void _down_write_nest_lock(struct rw_semaphore *sem, struct lockdep_map *nest_lock); 160 161 161 162 # define down_write_nest_lock(sem, nest_lock) \ ··· 177 176 # define down_read_nested(sem, subclass) down_read(sem) 178 177 # define down_write_nest_lock(sem, nest_lock) down_write(sem) 179 178 # define down_write_nested(sem, subclass) down_write(sem) 179 + # define down_write_killable_nested(sem, subclass) down_write_killable(sem) 180 180 # define down_read_non_owner(sem) down_read(sem) 181 181 # define up_read_non_owner(sem) up_read(sem) 182 182 #endif
+4 -3
include/linux/xattr.h
··· 33 33 struct inode *inode, const char *name, void *buffer, 34 34 size_t size); 35 35 int (*set)(const struct xattr_handler *, struct dentry *dentry, 36 - const char *name, const void *buffer, size_t size, 37 - int flags); 36 + struct inode *inode, const char *name, const void *buffer, 37 + size_t size, int flags); 38 38 }; 39 39 40 40 const char *xattr_full_name(const struct xattr_handler *, const char *); ··· 54 54 55 55 ssize_t generic_getxattr(struct dentry *dentry, struct inode *inode, const char *name, void *buffer, size_t size); 56 56 ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); 57 - int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); 57 + int generic_setxattr(struct dentry *dentry, struct inode *inode, 58 + const char *name, const void *value, size_t size, int flags); 58 59 int generic_removexattr(struct dentry *dentry, const char *name); 59 60 ssize_t vfs_getxattr_alloc(struct dentry *dentry, const char *name, 60 61 char **xattr_value, size_t size, gfp_t flags);
+16
kernel/locking/rwsem.c
··· 173 173 174 174 EXPORT_SYMBOL(down_write_nested); 175 175 176 + int __sched down_write_killable_nested(struct rw_semaphore *sem, int subclass) 177 + { 178 + might_sleep(); 179 + rwsem_acquire(&sem->dep_map, subclass, 0, _RET_IP_); 180 + 181 + if (LOCK_CONTENDED_RETURN(sem, __down_write_trylock, __down_write_killable)) { 182 + rwsem_release(&sem->dep_map, 1, _RET_IP_); 183 + return -EINTR; 184 + } 185 + 186 + rwsem_set_owner(sem); 187 + return 0; 188 + } 189 + 190 + EXPORT_SYMBOL(down_write_killable_nested); 191 + 176 192 void up_read_non_owner(struct rw_semaphore *sem) 177 193 { 178 194 __up_read(sem);
+4 -3
mm/shmem.c
··· 2645 2645 } 2646 2646 2647 2647 static int shmem_xattr_handler_set(const struct xattr_handler *handler, 2648 - struct dentry *dentry, const char *name, 2649 - const void *value, size_t size, int flags) 2648 + struct dentry *unused, struct inode *inode, 2649 + const char *name, const void *value, 2650 + size_t size, int flags) 2650 2651 { 2651 - struct shmem_inode_info *info = SHMEM_I(d_inode(dentry)); 2652 + struct shmem_inode_info *info = SHMEM_I(inode); 2652 2653 2653 2654 name = xattr_full_name(handler, name); 2654 2655 return simple_xattr_set(&info->xattrs, name, value, size, flags);
+1 -1
security/smack/smack_lsm.c
··· 3514 3514 */ 3515 3515 if (isp->smk_flags & SMK_INODE_CHANGED) { 3516 3516 isp->smk_flags &= ~SMK_INODE_CHANGED; 3517 - rc = inode->i_op->setxattr(dp, 3517 + rc = inode->i_op->setxattr(dp, inode, 3518 3518 XATTR_NAME_SMACKTRANSMUTE, 3519 3519 TRANS_TRUE, TRANS_TRUE_SIZE, 3520 3520 0);