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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pull-nfsctl' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull nfsctl updates from Al Viro:
"nfsctl cleanups and a fix"

* tag 'pull-nfsctl' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
nfsd_get_inode(): lift setting ->i_{,f}op to callers.
nfsdfs_create_files(): switch to simple_start_creating()
_nfsd_symlink(): switch to simple_start_creating()
nfsd_mkdir(): switch to simple_start_creating()
nfsctl: symlink has no business bumping link count of parent directory

+54 -93
+54 -93
fs/nfsd/nfsctl.c
··· 1103 1103 * populating the filesystem. 1104 1104 */ 1105 1105 1106 - /* Basically copying rpc_get_inode. */ 1107 1106 static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode) 1108 1107 { 1109 1108 struct inode *inode = new_inode(sb); 1110 - if (!inode) 1111 - return NULL; 1112 - /* Following advice from simple_fill_super documentation: */ 1113 - inode->i_ino = iunique(sb, NFSD_MaxReserved); 1114 - inode->i_mode = mode; 1115 - simple_inode_init_ts(inode); 1116 - switch (mode & S_IFMT) { 1117 - case S_IFDIR: 1118 - inode->i_fop = &simple_dir_operations; 1119 - inode->i_op = &simple_dir_inode_operations; 1120 - inc_nlink(inode); 1121 - break; 1122 - case S_IFLNK: 1123 - inode->i_op = &simple_symlink_inode_operations; 1124 - break; 1125 - default: 1126 - break; 1109 + if (inode) { 1110 + /* Following advice from simple_fill_super documentation: */ 1111 + inode->i_ino = iunique(sb, NFSD_MaxReserved); 1112 + inode->i_mode = mode; 1113 + simple_inode_init_ts(inode); 1127 1114 } 1128 1115 return inode; 1129 - } 1130 - 1131 - static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode, struct nfsdfs_client *ncl) 1132 - { 1133 - struct inode *inode; 1134 - 1135 - inode = nfsd_get_inode(dir->i_sb, mode); 1136 - if (!inode) 1137 - return -ENOMEM; 1138 - if (ncl) { 1139 - inode->i_private = ncl; 1140 - kref_get(&ncl->cl_ref); 1141 - } 1142 - d_add(dentry, inode); 1143 - inc_nlink(dir); 1144 - fsnotify_mkdir(dir, dentry); 1145 - return 0; 1146 1116 } 1147 1117 1148 1118 static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *ncl, char *name) 1149 1119 { 1150 1120 struct inode *dir = parent->d_inode; 1151 1121 struct dentry *dentry; 1152 - int ret = -ENOMEM; 1122 + struct inode *inode; 1153 1123 1154 - inode_lock(dir); 1155 - dentry = d_alloc_name(parent, name); 1156 - if (!dentry) 1157 - goto out_err; 1158 - ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600, ncl); 1159 - if (ret) 1160 - goto out_err; 1161 - out: 1124 + inode = nfsd_get_inode(parent->d_sb, S_IFDIR | 0600); 1125 + if (!inode) 1126 + return ERR_PTR(-ENOMEM); 1127 + 1128 + dentry = simple_start_creating(parent, name); 1129 + if (IS_ERR(dentry)) { 1130 + iput(inode); 1131 + return dentry; 1132 + } 1133 + inode->i_fop = &simple_dir_operations; 1134 + inode->i_op = &simple_dir_inode_operations; 1135 + inc_nlink(inode); 1136 + if (ncl) { 1137 + inode->i_private = ncl; 1138 + kref_get(&ncl->cl_ref); 1139 + } 1140 + d_instantiate(dentry, inode); 1141 + inc_nlink(dir); 1142 + fsnotify_mkdir(dir, dentry); 1162 1143 inode_unlock(dir); 1163 1144 return dentry; 1164 - out_err: 1165 - dput(dentry); 1166 - dentry = ERR_PTR(ret); 1167 - goto out; 1168 1145 } 1169 1146 1170 1147 #if IS_ENABLED(CONFIG_SUNRPC_GSS) 1171 - static int __nfsd_symlink(struct inode *dir, struct dentry *dentry, 1172 - umode_t mode, const char *content) 1173 - { 1174 - struct inode *inode; 1175 - 1176 - inode = nfsd_get_inode(dir->i_sb, mode); 1177 - if (!inode) 1178 - return -ENOMEM; 1179 - 1180 - inode->i_link = (char *)content; 1181 - inode->i_size = strlen(content); 1182 - 1183 - d_add(dentry, inode); 1184 - inc_nlink(dir); 1185 - fsnotify_create(dir, dentry); 1186 - return 0; 1187 - } 1188 - 1189 1148 /* 1190 1149 * @content is assumed to be a NUL-terminated string that lives 1191 1150 * longer than the symlink itself. ··· 1153 1194 const char *content) 1154 1195 { 1155 1196 struct inode *dir = parent->d_inode; 1197 + struct inode *inode; 1156 1198 struct dentry *dentry; 1157 - int ret; 1158 1199 1159 - inode_lock(dir); 1160 - dentry = d_alloc_name(parent, name); 1161 - if (!dentry) 1162 - goto out; 1163 - ret = __nfsd_symlink(d_inode(parent), dentry, S_IFLNK | 0777, content); 1164 - if (ret) 1165 - dput(dentry); 1166 - out: 1200 + inode = nfsd_get_inode(dir->i_sb, S_IFLNK | 0777); 1201 + if (!inode) 1202 + return; 1203 + 1204 + dentry = simple_start_creating(parent, name); 1205 + if (IS_ERR(dentry)) { 1206 + iput(inode); 1207 + return; 1208 + } 1209 + 1210 + inode->i_op = &simple_symlink_inode_operations; 1211 + inode->i_link = (char *)content; 1212 + inode->i_size = strlen(content); 1213 + 1214 + d_instantiate(dentry, inode); 1215 + fsnotify_create(dir, dentry); 1167 1216 inode_unlock(dir); 1168 1217 } 1169 1218 #else ··· 1207 1240 1208 1241 /* XXX: cut'n'paste from simple_fill_super; figure out if we could share 1209 1242 * code instead. */ 1210 - static int nfsdfs_create_files(struct dentry *root, 1243 + static int nfsdfs_create_files(struct dentry *root, 1211 1244 const struct tree_descr *files, 1212 1245 struct nfsdfs_client *ncl, 1213 1246 struct dentry **fdentries) 1214 1247 { 1215 1248 struct inode *dir = d_inode(root); 1216 - struct inode *inode; 1217 1249 struct dentry *dentry; 1218 - int i; 1219 1250 1220 - inode_lock(dir); 1221 - for (i = 0; files->name && files->name[0]; i++, files++) { 1222 - dentry = d_alloc_name(root, files->name); 1223 - if (!dentry) 1224 - goto out; 1225 - inode = nfsd_get_inode(d_inode(root)->i_sb, 1226 - S_IFREG | files->mode); 1227 - if (!inode) { 1228 - dput(dentry); 1229 - goto out; 1251 + for (int i = 0; files->name && files->name[0]; i++, files++) { 1252 + struct inode *inode = nfsd_get_inode(root->d_sb, 1253 + S_IFREG | files->mode); 1254 + if (!inode) 1255 + return -ENOMEM; 1256 + dentry = simple_start_creating(root, files->name); 1257 + if (IS_ERR(dentry)) { 1258 + iput(inode); 1259 + return PTR_ERR(dentry); 1230 1260 } 1231 1261 kref_get(&ncl->cl_ref); 1232 1262 inode->i_fop = files->ops; 1233 1263 inode->i_private = ncl; 1234 - d_add(dentry, inode); 1264 + d_instantiate(dentry, inode); 1235 1265 fsnotify_create(dir, dentry); 1236 1266 if (fdentries) 1237 1267 fdentries[i] = dentry; 1268 + inode_unlock(dir); 1238 1269 } 1239 - inode_unlock(dir); 1240 1270 return 0; 1241 - out: 1242 - inode_unlock(dir); 1243 - return -ENOMEM; 1244 1271 } 1245 1272 1246 1273 /* on success, returns positive number unique to that client. */