mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
convert nfsctl
One instance per net-ns. There's a fixed subset (several files in root, an optional symlink in root + initially empty /clients/) + per-client subdirectory in /clients/. Clients can appear only after the filesystem is there and they are all gone before it gets through ->kill_sb(). Fixed subset created in fill_super(), regular files by simple_fill_super(), then a subdirectory and a symlink - manually. It is removed by kill_litter_super(). Per-client subdirectories are created by nfsd_client_mkdir() (populated with client-supplied list of files in them). Removed by nfsd_client_rmdir(), which is simple_recursive_removal(). All dentries except for the ones from simple_fill_super() come from * nfsd_mkdir() (subdirectory, dentry from simple_start_creating()). Called from fill_super() (creates initially empty /clients) and from nfsd_client_mkdir (creates a per-client subdirectory in /clients). * _nfsd_symlink() (symlink, dentry from simple_start_creating()), called from fill_super(). * nfsdfs_create_files() (regulars, dentry from simple_start_creating()), called only from nfsd_client_mkdir(). Turn d_instatiate() + inode_unlock() into d_make_persistent() + simple_done_creating() in nfsd_mkdir(), _nfsd_symlink() and nfsdfs_create_files() and we are done. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -1137,11 +1137,11 @@ static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *nc
|
||||
inode->i_private = ncl;
|
||||
kref_get(&ncl->cl_ref);
|
||||
}
|
||||
d_instantiate(dentry, inode);
|
||||
d_make_persistent(dentry, inode);
|
||||
inc_nlink(dir);
|
||||
fsnotify_mkdir(dir, dentry);
|
||||
inode_unlock(dir);
|
||||
return dentry;
|
||||
simple_done_creating(dentry);
|
||||
return dentry; // borrowed
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_SUNRPC_GSS)
|
||||
@@ -1170,9 +1170,9 @@ static void _nfsd_symlink(struct dentry *parent, const char *name,
|
||||
inode->i_link = (char *)content;
|
||||
inode->i_size = strlen(content);
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
d_make_persistent(dentry, inode);
|
||||
fsnotify_create(dir, dentry);
|
||||
inode_unlock(dir);
|
||||
simple_done_creating(dentry);
|
||||
}
|
||||
#else
|
||||
static inline void _nfsd_symlink(struct dentry *parent, const char *name,
|
||||
@@ -1228,11 +1228,11 @@ static int nfsdfs_create_files(struct dentry *root,
|
||||
kref_get(&ncl->cl_ref);
|
||||
inode->i_fop = files->ops;
|
||||
inode->i_private = ncl;
|
||||
d_instantiate(dentry, inode);
|
||||
d_make_persistent(dentry, inode);
|
||||
fsnotify_create(dir, dentry);
|
||||
if (fdentries)
|
||||
fdentries[i] = dentry;
|
||||
inode_unlock(dir);
|
||||
fdentries[i] = dentry; // borrowed
|
||||
simple_done_creating(dentry);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1346,7 +1346,7 @@ static void nfsd_umount(struct super_block *sb)
|
||||
|
||||
nfsd_shutdown_threads(net);
|
||||
|
||||
kill_litter_super(sb);
|
||||
kill_anon_super(sb);
|
||||
put_net(net);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user