Merge branch 'for-linus' from kernel.org:/.../shaggy/jfs-2.6 manually

Clash due to new delete_inode behavior (the filesystem now needs to do
the truncate_inode_pages() call itself).

Signed-off-by: Linus Torvalds <torvalds@osdl.org>

+193 -62
+17 -7
fs/jfs/acl.c
··· 23 #include <linux/quotaops.h> 24 #include <linux/posix_acl_xattr.h> 25 #include "jfs_incore.h" 26 #include "jfs_xattr.h" 27 #include "jfs_acl.h" 28 ··· 76 return acl; 77 } 78 79 - static int jfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) 80 { 81 char *ea_name; 82 struct jfs_inode_info *ji = JFS_IP(inode); ··· 112 if (rc < 0) 113 goto out; 114 } 115 - rc = __jfs_setxattr(inode, ea_name, value, size, 0); 116 out: 117 kfree(value); 118 ··· 145 return generic_permission(inode, mask, jfs_check_acl); 146 } 147 148 - int jfs_init_acl(struct inode *inode, struct inode *dir) 149 { 150 struct posix_acl *acl = NULL; 151 struct posix_acl *clone; ··· 161 162 if (acl) { 163 if (S_ISDIR(inode->i_mode)) { 164 - rc = jfs_set_acl(inode, ACL_TYPE_DEFAULT, acl); 165 if (rc) 166 goto cleanup; 167 } ··· 175 if (rc >= 0) { 176 inode->i_mode = mode; 177 if (rc > 0) 178 - rc = jfs_set_acl(inode, ACL_TYPE_ACCESS, clone); 179 } 180 posix_acl_release(clone); 181 cleanup: ··· 205 return -ENOMEM; 206 207 rc = posix_acl_chmod_masq(clone, inode->i_mode); 208 - if (!rc) 209 - rc = jfs_set_acl(inode, ACL_TYPE_ACCESS, clone); 210 211 posix_acl_release(clone); 212 return rc;
··· 23 #include <linux/quotaops.h> 24 #include <linux/posix_acl_xattr.h> 25 #include "jfs_incore.h" 26 + #include "jfs_txnmgr.h" 27 #include "jfs_xattr.h" 28 #include "jfs_acl.h" 29 ··· 75 return acl; 76 } 77 78 + static int jfs_set_acl(tid_t tid, struct inode *inode, int type, 79 + struct posix_acl *acl) 80 { 81 char *ea_name; 82 struct jfs_inode_info *ji = JFS_IP(inode); ··· 110 if (rc < 0) 111 goto out; 112 } 113 + rc = __jfs_setxattr(tid, inode, ea_name, value, size, 0); 114 out: 115 kfree(value); 116 ··· 143 return generic_permission(inode, mask, jfs_check_acl); 144 } 145 146 + int jfs_init_acl(tid_t tid, struct inode *inode, struct inode *dir) 147 { 148 struct posix_acl *acl = NULL; 149 struct posix_acl *clone; ··· 159 160 if (acl) { 161 if (S_ISDIR(inode->i_mode)) { 162 + rc = jfs_set_acl(tid, inode, ACL_TYPE_DEFAULT, acl); 163 if (rc) 164 goto cleanup; 165 } ··· 173 if (rc >= 0) { 174 inode->i_mode = mode; 175 if (rc > 0) 176 + rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, 177 + clone); 178 } 179 posix_acl_release(clone); 180 cleanup: ··· 202 return -ENOMEM; 203 204 rc = posix_acl_chmod_masq(clone, inode->i_mode); 205 + if (!rc) { 206 + tid_t tid = txBegin(inode->i_sb, 0); 207 + down(&JFS_IP(inode)->commit_sem); 208 + rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, clone); 209 + if (!rc) 210 + rc = txCommit(tid, 1, &inode, 0); 211 + txEnd(tid); 212 + up(&JFS_IP(inode)->commit_sem); 213 + } 214 215 posix_acl_release(clone); 216 return rc;
+13 -13
fs/jfs/inode.c
··· 128 { 129 jfs_info("In jfs_delete_inode, inode = 0x%p", inode); 130 131 - if (is_bad_inode(inode) || 132 - (JFS_IP(inode)->fileset != cpu_to_le32(FILESYSTEM_I))) 133 - return; 134 135 - truncate_inode_pages(&inode->i_data, 0); 136 137 - if (test_cflag(COMMIT_Freewmap, inode)) 138 - jfs_free_zero_link(inode); 139 140 - diFree(inode); 141 142 - /* 143 - * Free the inode from the quota allocation. 144 - */ 145 - DQUOT_INIT(inode); 146 - DQUOT_FREE_INODE(inode); 147 - DQUOT_DROP(inode); 148 149 clear_inode(inode); 150 }
··· 128 { 129 jfs_info("In jfs_delete_inode, inode = 0x%p", inode); 130 131 + if (!is_bad_inode(inode) && 132 + (JFS_IP(inode)->fileset == cpu_to_le32(FILESYSTEM_I))) { 133 134 + truncate_inode_pages(&inode->i_data, 0); 135 136 + if (test_cflag(COMMIT_Freewmap, inode)) 137 + jfs_free_zero_link(inode); 138 139 + diFree(inode); 140 141 + /* 142 + * Free the inode from the quota allocation. 143 + */ 144 + DQUOT_INIT(inode); 145 + DQUOT_FREE_INODE(inode); 146 + DQUOT_DROP(inode); 147 + } 148 149 clear_inode(inode); 150 }
+10 -2
fs/jfs/jfs_acl.h
··· 21 #ifdef CONFIG_JFS_POSIX_ACL 22 23 int jfs_permission(struct inode *, int, struct nameidata *); 24 - int jfs_init_acl(struct inode *, struct inode *); 25 int jfs_setattr(struct dentry *, struct iattr *); 26 27 - #endif /* CONFIG_JFS_POSIX_ACL */ 28 #endif /* _H_JFS_ACL */
··· 21 #ifdef CONFIG_JFS_POSIX_ACL 22 23 int jfs_permission(struct inode *, int, struct nameidata *); 24 + int jfs_init_acl(tid_t, struct inode *, struct inode *); 25 int jfs_setattr(struct dentry *, struct iattr *); 26 27 + #else 28 + 29 + static inline int jfs_init_acl(tid_t tid, struct inode *inode, 30 + struct inode *dir) 31 + { 32 + return 0; 33 + } 34 + 35 + #endif 36 #endif /* _H_JFS_ACL */
+12 -2
fs/jfs/jfs_xattr.h
··· 52 #define END_EALIST(ealist) \ 53 ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) 54 55 - extern int __jfs_setxattr(struct inode *, const char *, const void *, size_t, 56 - int); 57 extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, 58 int); 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); 61 extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); 62 extern int jfs_removexattr(struct dentry *, const char *); 63 64 #endif /* H_JFS_XATTR */
··· 52 #define END_EALIST(ealist) \ 53 ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) 54 55 + extern int __jfs_setxattr(tid_t, struct inode *, const char *, const void *, 56 + size_t, int); 57 extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, 58 int); 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); 61 extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); 62 extern int jfs_removexattr(struct dentry *, const char *); 63 + 64 + #ifdef CONFIG_JFS_SECURITY 65 + extern int jfs_init_security(tid_t, struct inode *, struct inode *); 66 + #else 67 + static inline int jfs_init_security(tid_t tid, struct inode *inode, 68 + struct inode *dir) 69 + { 70 + return 0; 71 + } 72 + #endif 73 74 #endif /* H_JFS_XATTR */
+64 -21
fs/jfs/namei.c
··· 39 static s64 commitZeroLink(tid_t, struct inode *); 40 41 /* 42 * NAME: jfs_create(dip, dentry, mode) 43 * 44 * FUNCTION: create a regular file in the parent directory <dip> ··· 107 down(&JFS_IP(dip)->commit_sem); 108 down(&JFS_IP(ip)->commit_sem); 109 110 if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) { 111 jfs_err("jfs_create: dtSearch returned %d", rc); 112 goto out3; 113 } 114 ··· 168 up(&JFS_IP(dip)->commit_sem); 169 up(&JFS_IP(ip)->commit_sem); 170 if (rc) { 171 ip->i_nlink = 0; 172 iput(ip); 173 } else ··· 176 177 out2: 178 free_UCSname(&dname); 179 - 180 - #ifdef CONFIG_JFS_POSIX_ACL 181 - if (rc == 0) 182 - jfs_init_acl(ip, dip); 183 - #endif 184 185 out1: 186 ··· 241 down(&JFS_IP(dip)->commit_sem); 242 down(&JFS_IP(ip)->commit_sem); 243 244 if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) { 245 jfs_err("jfs_mkdir: dtSearch returned %d", rc); 246 goto out3; 247 } 248 ··· 303 up(&JFS_IP(dip)->commit_sem); 304 up(&JFS_IP(ip)->commit_sem); 305 if (rc) { 306 ip->i_nlink = 0; 307 iput(ip); 308 } else ··· 312 out2: 313 free_UCSname(&dname); 314 315 - #ifdef CONFIG_JFS_POSIX_ACL 316 - if (rc == 0) 317 - jfs_init_acl(ip, dip); 318 - #endif 319 320 out1: 321 ··· 918 down(&JFS_IP(dip)->commit_sem); 919 down(&JFS_IP(ip)->commit_sem); 920 921 tblk = tid_to_tblock(tid); 922 tblk->xflag |= COMMIT_CREATE; 923 tblk->ino = ip->i_ino; ··· 1037 up(&JFS_IP(dip)->commit_sem); 1038 up(&JFS_IP(ip)->commit_sem); 1039 if (rc) { 1040 ip->i_nlink = 0; 1041 iput(ip); 1042 } else ··· 1045 1046 out2: 1047 free_UCSname(&dname); 1048 - 1049 - #ifdef CONFIG_JFS_POSIX_ACL 1050 - if (rc == 0) 1051 - jfs_init_acl(ip, dip); 1052 - #endif 1053 1054 out1: 1055 jfs_info("jfs_symlink: rc:%d", rc); ··· 1361 down(&JFS_IP(dir)->commit_sem); 1362 down(&JFS_IP(ip)->commit_sem); 1363 1364 - if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE))) 1365 goto out3; 1366 1367 tblk = tid_to_tblock(tid); 1368 tblk->xflag |= COMMIT_CREATE; ··· 1382 tblk->u.ixpxd = JFS_IP(ip)->ixpxd; 1383 1384 ino = ip->i_ino; 1385 - if ((rc = dtInsert(tid, dir, &dname, &ino, &btstack))) 1386 goto out3; 1387 1388 ip->i_op = &jfs_file_inode_operations; 1389 jfs_ip->dev = new_encode_dev(rdev); ··· 1407 up(&JFS_IP(ip)->commit_sem); 1408 up(&JFS_IP(dir)->commit_sem); 1409 if (rc) { 1410 ip->i_nlink = 0; 1411 iput(ip); 1412 } else ··· 1415 1416 out1: 1417 free_UCSname(&dname); 1418 - 1419 - #ifdef CONFIG_JFS_POSIX_ACL 1420 - if (rc == 0) 1421 - jfs_init_acl(ip, dir); 1422 - #endif 1423 1424 out: 1425 jfs_info("jfs_mknod: returning %d", rc);
··· 39 static s64 commitZeroLink(tid_t, struct inode *); 40 41 /* 42 + * NAME: free_ea_wmap(inode) 43 + * 44 + * FUNCTION: free uncommitted extended attributes from working map 45 + * 46 + */ 47 + static inline void free_ea_wmap(struct inode *inode) 48 + { 49 + dxd_t *ea = &JFS_IP(inode)->ea; 50 + 51 + if (ea->flag & DXD_EXTENT) { 52 + /* free EA pages from cache */ 53 + invalidate_dxd_metapages(inode, *ea); 54 + dbFree(inode, addressDXD(ea), lengthDXD(ea)); 55 + } 56 + ea->flag = 0; 57 + } 58 + 59 + /* 60 * NAME: jfs_create(dip, dentry, mode) 61 * 62 * FUNCTION: create a regular file in the parent directory <dip> ··· 89 down(&JFS_IP(dip)->commit_sem); 90 down(&JFS_IP(ip)->commit_sem); 91 92 + rc = jfs_init_acl(tid, ip, dip); 93 + if (rc) 94 + goto out3; 95 + 96 + rc = jfs_init_security(tid, ip, dip); 97 + if (rc) { 98 + txAbort(tid, 0); 99 + goto out3; 100 + } 101 + 102 if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) { 103 jfs_err("jfs_create: dtSearch returned %d", rc); 104 + txAbort(tid, 0); 105 goto out3; 106 } 107 ··· 139 up(&JFS_IP(dip)->commit_sem); 140 up(&JFS_IP(ip)->commit_sem); 141 if (rc) { 142 + free_ea_wmap(ip); 143 ip->i_nlink = 0; 144 iput(ip); 145 } else ··· 146 147 out2: 148 free_UCSname(&dname); 149 150 out1: 151 ··· 216 down(&JFS_IP(dip)->commit_sem); 217 down(&JFS_IP(ip)->commit_sem); 218 219 + rc = jfs_init_acl(tid, ip, dip); 220 + if (rc) 221 + goto out3; 222 + 223 + rc = jfs_init_security(tid, ip, dip); 224 + if (rc) { 225 + txAbort(tid, 0); 226 + goto out3; 227 + } 228 + 229 if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) { 230 jfs_err("jfs_mkdir: dtSearch returned %d", rc); 231 + txAbort(tid, 0); 232 goto out3; 233 } 234 ··· 267 up(&JFS_IP(dip)->commit_sem); 268 up(&JFS_IP(ip)->commit_sem); 269 if (rc) { 270 + free_ea_wmap(ip); 271 ip->i_nlink = 0; 272 iput(ip); 273 } else ··· 275 out2: 276 free_UCSname(&dname); 277 278 279 out1: 280 ··· 885 down(&JFS_IP(dip)->commit_sem); 886 down(&JFS_IP(ip)->commit_sem); 887 888 + rc = jfs_init_security(tid, ip, dip); 889 + if (rc) 890 + goto out3; 891 + 892 tblk = tid_to_tblock(tid); 893 tblk->xflag |= COMMIT_CREATE; 894 tblk->ino = ip->i_ino; ··· 1000 up(&JFS_IP(dip)->commit_sem); 1001 up(&JFS_IP(ip)->commit_sem); 1002 if (rc) { 1003 + free_ea_wmap(ip); 1004 ip->i_nlink = 0; 1005 iput(ip); 1006 } else ··· 1007 1008 out2: 1009 free_UCSname(&dname); 1010 1011 out1: 1012 jfs_info("jfs_symlink: rc:%d", rc); ··· 1328 down(&JFS_IP(dir)->commit_sem); 1329 down(&JFS_IP(ip)->commit_sem); 1330 1331 + rc = jfs_init_acl(tid, ip, dir); 1332 + if (rc) 1333 goto out3; 1334 + 1335 + rc = jfs_init_security(tid, ip, dir); 1336 + if (rc) { 1337 + txAbort(tid, 0); 1338 + goto out3; 1339 + } 1340 + 1341 + if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE))) { 1342 + txAbort(tid, 0); 1343 + goto out3; 1344 + } 1345 1346 tblk = tid_to_tblock(tid); 1347 tblk->xflag |= COMMIT_CREATE; ··· 1337 tblk->u.ixpxd = JFS_IP(ip)->ixpxd; 1338 1339 ino = ip->i_ino; 1340 + if ((rc = dtInsert(tid, dir, &dname, &ino, &btstack))) { 1341 + txAbort(tid, 0); 1342 goto out3; 1343 + } 1344 1345 ip->i_op = &jfs_file_inode_operations; 1346 jfs_ip->dev = new_encode_dev(rdev); ··· 1360 up(&JFS_IP(ip)->commit_sem); 1361 up(&JFS_IP(dir)->commit_sem); 1362 if (rc) { 1363 + free_ea_wmap(ip); 1364 ip->i_nlink = 0; 1365 iput(ip); 1366 } else ··· 1367 1368 out1: 1369 free_UCSname(&dname); 1370 1371 out: 1372 jfs_info("jfs_mknod: returning %d", rc);
+77 -17
fs/jfs/xattr.c
··· 21 #include <linux/xattr.h> 22 #include <linux/posix_acl_xattr.h> 23 #include <linux/quotaops.h> 24 #include "jfs_incore.h" 25 #include "jfs_superblock.h" 26 #include "jfs_dmap.h" ··· 634 } 635 } 636 637 - static int ea_put(struct inode *inode, struct ea_buffer *ea_buf, int new_size) 638 { 639 struct jfs_inode_info *ji = JFS_IP(inode); 640 unsigned long old_blocks, new_blocks; 641 int rc = 0; 642 - tid_t tid; 643 644 if (new_size == 0) { 645 ea_release(inode, ea_buf); ··· 664 } 665 if (rc) 666 return rc; 667 - 668 - tid = txBegin(inode->i_sb, 0); 669 - down(&ji->commit_sem); 670 671 old_blocks = new_blocks = 0; 672 ··· 693 DQUOT_FREE_BLOCK(inode, old_blocks); 694 695 inode->i_ctime = CURRENT_TIME; 696 - rc = txCommit(tid, 1, &inode, 0); 697 - txEnd(tid); 698 - up(&ji->commit_sem); 699 700 - return rc; 701 } 702 703 /* ··· 805 return permission(inode, MAY_WRITE, NULL); 806 } 807 808 - int __jfs_setxattr(struct inode *inode, const char *name, const void *value, 809 - size_t value_len, int flags) 810 { 811 struct jfs_ea_list *ealist; 812 struct jfs_ea *ea, *old_ea = NULL, *next_ea = NULL; ··· 819 int found = 0; 820 int rc; 821 int length; 822 - 823 - if ((rc = can_set_xattr(inode, name, value, value_len))) 824 - return rc; 825 826 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { 827 os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1, ··· 931 932 ealist->size = cpu_to_le32(new_size); 933 934 - rc = ea_put(inode, &ea_buf, new_size); 935 936 goto out; 937 release: ··· 947 int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, 948 size_t value_len, int flags) 949 { 950 if (value == NULL) { /* empty EA, do not remove */ 951 value = ""; 952 value_len = 0; 953 } 954 955 - return __jfs_setxattr(dentry->d_inode, name, value, value_len, flags); 956 } 957 958 static int can_get_xattr(struct inode *inode, const char *name) ··· 1131 1132 int jfs_removexattr(struct dentry *dentry, const char *name) 1133 { 1134 - return __jfs_setxattr(dentry->d_inode, name, NULL, 0, XATTR_REPLACE); 1135 }
··· 21 #include <linux/xattr.h> 22 #include <linux/posix_acl_xattr.h> 23 #include <linux/quotaops.h> 24 + #include <linux/security.h> 25 #include "jfs_incore.h" 26 #include "jfs_superblock.h" 27 #include "jfs_dmap.h" ··· 633 } 634 } 635 636 + static int ea_put(tid_t tid, struct inode *inode, struct ea_buffer *ea_buf, 637 + int new_size) 638 { 639 struct jfs_inode_info *ji = JFS_IP(inode); 640 unsigned long old_blocks, new_blocks; 641 int rc = 0; 642 643 if (new_size == 0) { 644 ea_release(inode, ea_buf); ··· 663 } 664 if (rc) 665 return rc; 666 667 old_blocks = new_blocks = 0; 668 ··· 695 DQUOT_FREE_BLOCK(inode, old_blocks); 696 697 inode->i_ctime = CURRENT_TIME; 698 699 + return 0; 700 } 701 702 /* ··· 810 return permission(inode, MAY_WRITE, NULL); 811 } 812 813 + int __jfs_setxattr(tid_t tid, struct inode *inode, const char *name, 814 + const void *value, size_t value_len, int flags) 815 { 816 struct jfs_ea_list *ealist; 817 struct jfs_ea *ea, *old_ea = NULL, *next_ea = NULL; ··· 824 int found = 0; 825 int rc; 826 int length; 827 828 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { 829 os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1, ··· 939 940 ealist->size = cpu_to_le32(new_size); 941 942 + rc = ea_put(tid, inode, &ea_buf, new_size); 943 944 goto out; 945 release: ··· 955 int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, 956 size_t value_len, int flags) 957 { 958 + struct inode *inode = dentry->d_inode; 959 + struct jfs_inode_info *ji = JFS_IP(inode); 960 + int rc; 961 + tid_t tid; 962 + 963 + if ((rc = can_set_xattr(inode, name, value, value_len))) 964 + return rc; 965 + 966 if (value == NULL) { /* empty EA, do not remove */ 967 value = ""; 968 value_len = 0; 969 } 970 971 + tid = txBegin(inode->i_sb, 0); 972 + down(&ji->commit_sem); 973 + rc = __jfs_setxattr(tid, dentry->d_inode, name, value, value_len, 974 + flags); 975 + if (!rc) 976 + rc = txCommit(tid, 1, &inode, 0); 977 + txEnd(tid); 978 + up(&ji->commit_sem); 979 + 980 + return rc; 981 } 982 983 static int can_get_xattr(struct inode *inode, const char *name) ··· 1122 1123 int jfs_removexattr(struct dentry *dentry, const char *name) 1124 { 1125 + struct inode *inode = dentry->d_inode; 1126 + struct jfs_inode_info *ji = JFS_IP(inode); 1127 + int rc; 1128 + tid_t tid; 1129 + 1130 + if ((rc = can_set_xattr(inode, name, NULL, 0))) 1131 + return rc; 1132 + 1133 + tid = txBegin(inode->i_sb, 0); 1134 + down(&ji->commit_sem); 1135 + rc = __jfs_setxattr(tid, dentry->d_inode, name, NULL, 0, XATTR_REPLACE); 1136 + if (!rc) 1137 + rc = txCommit(tid, 1, &inode, 0); 1138 + txEnd(tid); 1139 + up(&ji->commit_sem); 1140 + 1141 + return rc; 1142 } 1143 + 1144 + #ifdef CONFIG_JFS_SECURITY 1145 + int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir) 1146 + { 1147 + int rc; 1148 + size_t len; 1149 + void *value; 1150 + char *suffix; 1151 + char *name; 1152 + 1153 + rc = security_inode_init_security(inode, dir, &suffix, &value, &len); 1154 + if (rc) { 1155 + if (rc == -EOPNOTSUPP) 1156 + return 0; 1157 + return rc; 1158 + } 1159 + name = kmalloc(XATTR_SECURITY_PREFIX_LEN + 1 + strlen(suffix), 1160 + GFP_NOFS); 1161 + if (!name) { 1162 + rc = -ENOMEM; 1163 + goto kmalloc_failed; 1164 + } 1165 + strcpy(name, XATTR_SECURITY_PREFIX); 1166 + strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix); 1167 + 1168 + rc = __jfs_setxattr(tid, inode, name, value, len, 0); 1169 + 1170 + kfree(name); 1171 + kmalloc_failed: 1172 + kfree(suffix); 1173 + kfree(value); 1174 + 1175 + return rc; 1176 + } 1177 + #endif