@@ -1236,63 +1236,34 @@ static inline void _nfsd_symlink(struct dentry *parent, const char *name,
1236
1236
1237
1237
#endif
1238
1238
1239
- static void clear_ncl (struct inode * inode )
1239
+ static void clear_ncl (struct dentry * dentry )
1240
1240
{
1241
+ struct inode * inode = d_inode (dentry );
1241
1242
struct nfsdfs_client * ncl = inode -> i_private ;
1242
1243
1244
+ spin_lock (& inode -> i_lock );
1243
1245
inode -> i_private = NULL ;
1246
+ spin_unlock (& inode -> i_lock );
1244
1247
kref_put (& ncl -> cl_ref , ncl -> cl_release );
1245
1248
}
1246
1249
1247
- static struct nfsdfs_client * __get_nfsdfs_client (struct inode * inode )
1248
- {
1249
- struct nfsdfs_client * nc = inode -> i_private ;
1250
-
1251
- if (nc )
1252
- kref_get (& nc -> cl_ref );
1253
- return nc ;
1254
- }
1255
-
1256
1250
struct nfsdfs_client * get_nfsdfs_client (struct inode * inode )
1257
1251
{
1258
1252
struct nfsdfs_client * nc ;
1259
1253
1260
- inode_lock_shared (inode );
1261
- nc = __get_nfsdfs_client (inode );
1262
- inode_unlock_shared (inode );
1254
+ spin_lock (& inode -> i_lock );
1255
+ nc = inode -> i_private ;
1256
+ if (nc )
1257
+ kref_get (& nc -> cl_ref );
1258
+ spin_unlock (& inode -> i_lock );
1263
1259
return nc ;
1264
1260
}
1265
- /* from __rpc_unlink */
1266
- static void nfsdfs_remove_file (struct inode * dir , struct dentry * dentry )
1267
- {
1268
- int ret ;
1269
-
1270
- clear_ncl (d_inode (dentry ));
1271
- dget (dentry );
1272
- ret = simple_unlink (dir , dentry );
1273
- d_drop (dentry );
1274
- fsnotify_unlink (dir , dentry );
1275
- dput (dentry );
1276
- WARN_ON_ONCE (ret );
1277
- }
1278
-
1279
- static void nfsdfs_remove_files (struct dentry * root )
1280
- {
1281
- struct dentry * dentry , * tmp ;
1282
-
1283
- list_for_each_entry_safe (dentry , tmp , & root -> d_subdirs , d_child ) {
1284
- if (!simple_positive (dentry )) {
1285
- WARN_ON_ONCE (1 ); /* I think this can't happen? */
1286
- continue ;
1287
- }
1288
- nfsdfs_remove_file (d_inode (root ), dentry );
1289
- }
1290
- }
1291
1261
1292
1262
/* XXX: cut'n'paste from simple_fill_super; figure out if we could share
1293
1263
* code instead. */
1294
1264
static int nfsdfs_create_files (struct dentry * root ,
1295
1265
const struct tree_descr * files ,
1266
+ struct nfsdfs_client * ncl ,
1296
1267
struct dentry * * fdentries )
1297
1268
{
1298
1269
struct inode * dir = d_inode (root );
@@ -1311,8 +1282,9 @@ static int nfsdfs_create_files(struct dentry *root,
1311
1282
dput (dentry );
1312
1283
goto out ;
1313
1284
}
1285
+ kref_get (& ncl -> cl_ref );
1314
1286
inode -> i_fop = files -> ops ;
1315
- inode -> i_private = __get_nfsdfs_client ( dir ) ;
1287
+ inode -> i_private = ncl ;
1316
1288
d_add (dentry , inode );
1317
1289
fsnotify_create (dir , dentry );
1318
1290
if (fdentries )
@@ -1321,7 +1293,6 @@ static int nfsdfs_create_files(struct dentry *root,
1321
1293
inode_unlock (dir );
1322
1294
return 0 ;
1323
1295
out :
1324
- nfsdfs_remove_files (root );
1325
1296
inode_unlock (dir );
1326
1297
return - ENOMEM ;
1327
1298
}
@@ -1341,7 +1312,7 @@ struct dentry *nfsd_client_mkdir(struct nfsd_net *nn,
1341
1312
dentry = nfsd_mkdir (nn -> nfsd_client_dir , ncl , name );
1342
1313
if (IS_ERR (dentry )) /* XXX: tossing errors? */
1343
1314
return NULL ;
1344
- ret = nfsdfs_create_files (dentry , files , fdentries );
1315
+ ret = nfsdfs_create_files (dentry , files , ncl , fdentries );
1345
1316
if (ret ) {
1346
1317
nfsd_client_rmdir (dentry );
1347
1318
return NULL ;
@@ -1352,20 +1323,7 @@ struct dentry *nfsd_client_mkdir(struct nfsd_net *nn,
1352
1323
/* Taken from __rpc_rmdir: */
1353
1324
void nfsd_client_rmdir (struct dentry * dentry )
1354
1325
{
1355
- struct inode * dir = d_inode (dentry -> d_parent );
1356
- struct inode * inode = d_inode (dentry );
1357
- int ret ;
1358
-
1359
- inode_lock (dir );
1360
- nfsdfs_remove_files (dentry );
1361
- clear_ncl (inode );
1362
- dget (dentry );
1363
- ret = simple_rmdir (dir , dentry );
1364
- WARN_ON_ONCE (ret );
1365
- d_drop (dentry );
1366
- fsnotify_rmdir (dir , dentry );
1367
- dput (dentry );
1368
- inode_unlock (dir );
1326
+ simple_recursive_removal (dentry , clear_ncl );
1369
1327
}
1370
1328
1371
1329
static int nfsd_fill_super (struct super_block * sb , struct fs_context * fc )
0 commit comments