Skip to content

Commit 61f5164

Browse files
Manoj NaikTrond Myklebust
authored andcommitted
NFS: Expand clone mounts to include other servers
Signed-off-by: Manoj Naik <manoj@almaden.ibm.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
1 parent c818ba4 commit 61f5164

File tree

1 file changed

+64
-47
lines changed

1 file changed

+64
-47
lines changed

fs/nfs/inode.c

Lines changed: 64 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,14 +1717,13 @@ struct nfs_clone_mount {
17171717
};
17181718

17191719
static struct super_block *nfs_clone_generic_sb(struct nfs_clone_mount *data,
1720-
struct super_block *(*clone_client)(struct nfs_server *, struct nfs_clone_mount *))
1720+
struct super_block *(*fill_sb)(struct nfs_server *, struct nfs_clone_mount *),
1721+
struct nfs_server *(*fill_server)(struct super_block *, struct nfs_clone_mount *))
17211722
{
17221723
struct nfs_server *server;
17231724
struct nfs_server *parent = NFS_SB(data->sb);
17241725
struct super_block *sb = ERR_PTR(-EINVAL);
17251726
void *err = ERR_PTR(-ENOMEM);
1726-
struct inode *root_inode;
1727-
struct nfs_fsinfo fsinfo;
17281727
int len;
17291728

17301729
server = kmalloc(sizeof(struct nfs_server), GFP_KERNEL);
@@ -1736,53 +1735,17 @@ static struct super_block *nfs_clone_generic_sb(struct nfs_clone_mount *data,
17361735
if (server->hostname == NULL)
17371736
goto free_server;
17381737
memcpy(server->hostname, parent->hostname, len);
1739-
server->fsid = data->fattr->fsid;
1740-
nfs_copy_fh(&server->fh, data->fh);
17411738
if (rpciod_up() != 0)
17421739
goto free_hostname;
17431740

1744-
sb = clone_client(server, data);
1741+
sb = fill_sb(server, data);
17451742
if (IS_ERR((err = sb)) || sb->s_root)
17461743
goto kill_rpciod;
17471744

1748-
sb->s_op = data->sb->s_op;
1749-
sb->s_blocksize = data->sb->s_blocksize;
1750-
sb->s_blocksize_bits = data->sb->s_blocksize_bits;
1751-
sb->s_maxbytes = data->sb->s_maxbytes;
1752-
1753-
server->client_sys = server->client_acl = ERR_PTR(-EINVAL);
1754-
err = ERR_PTR(-ENOMEM);
1755-
server->io_stats = nfs_alloc_iostats();
1756-
if (server->io_stats == NULL)
1745+
server = fill_server(sb, data);
1746+
if (IS_ERR((err = server)))
17571747
goto out_deactivate;
1758-
1759-
server->client = rpc_clone_client(parent->client);
1760-
if (IS_ERR((err = server->client)))
1761-
goto out_deactivate;
1762-
if (!IS_ERR(parent->client_sys)) {
1763-
server->client_sys = rpc_clone_client(parent->client_sys);
1764-
if (IS_ERR((err = server->client_sys)))
1765-
goto out_deactivate;
1766-
}
1767-
if (!IS_ERR(parent->client_acl)) {
1768-
server->client_acl = rpc_clone_client(parent->client_acl);
1769-
if (IS_ERR((err = server->client_acl)))
1770-
goto out_deactivate;
1771-
}
1772-
root_inode = nfs_fhget(sb, data->fh, data->fattr);
1773-
if (!root_inode)
1774-
goto out_deactivate;
1775-
sb->s_root = d_alloc_root(root_inode);
1776-
if (!sb->s_root)
1777-
goto out_put_root;
1778-
fsinfo.fattr = data->fattr;
1779-
if (NFS_PROTO(root_inode)->fsinfo(server, data->fh, &fsinfo) == 0)
1780-
nfs_super_set_maxbytes(sb, fsinfo.maxfilesize);
1781-
sb->s_root->d_op = server->rpc_ops->dentry_ops;
1782-
sb->s_flags |= MS_ACTIVE;
17831748
return sb;
1784-
out_put_root:
1785-
iput(root_inode);
17861749
out_deactivate:
17871750
up_write(&sb->s_umount);
17881751
deactivate_super(sb);
@@ -1955,21 +1918,73 @@ static struct file_system_type nfs_fs_type = {
19551918
.fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
19561919
};
19571920

1958-
static struct super_block *nfs_clone_client(struct nfs_server *server, struct nfs_clone_mount *data)
1921+
static struct super_block *nfs_clone_sb(struct nfs_server *server, struct nfs_clone_mount *data)
19591922
{
19601923
struct super_block *sb;
19611924

1925+
server->fsid = data->fattr->fsid;
1926+
nfs_copy_fh(&server->fh, data->fh);
19621927
sb = sget(&nfs_fs_type, nfs_compare_super, nfs_set_super, server);
19631928
if (!IS_ERR(sb) && sb->s_root == NULL && !(server->flags & NFS_MOUNT_NONLM))
19641929
lockd_up();
19651930
return sb;
19661931
}
19671932

1933+
static struct nfs_server *nfs_clone_server(struct super_block *sb, struct nfs_clone_mount *data)
1934+
{
1935+
struct nfs_server *server = NFS_SB(sb);
1936+
struct nfs_server *parent = NFS_SB(data->sb);
1937+
struct inode *root_inode;
1938+
struct nfs_fsinfo fsinfo;
1939+
void *err = ERR_PTR(-ENOMEM);
1940+
1941+
sb->s_op = data->sb->s_op;
1942+
sb->s_blocksize = data->sb->s_blocksize;
1943+
sb->s_blocksize_bits = data->sb->s_blocksize_bits;
1944+
sb->s_maxbytes = data->sb->s_maxbytes;
1945+
1946+
server->client_sys = server->client_acl = ERR_PTR(-EINVAL);
1947+
server->io_stats = nfs_alloc_iostats();
1948+
if (server->io_stats == NULL)
1949+
goto out;
1950+
1951+
server->client = rpc_clone_client(parent->client);
1952+
if (IS_ERR((err = server->client)))
1953+
goto out;
1954+
1955+
if (!IS_ERR(parent->client_sys)) {
1956+
server->client_sys = rpc_clone_client(parent->client_sys);
1957+
if (IS_ERR((err = server->client_sys)))
1958+
goto out;
1959+
}
1960+
if (!IS_ERR(parent->client_acl)) {
1961+
server->client_acl = rpc_clone_client(parent->client_acl);
1962+
if (IS_ERR((err = server->client_acl)))
1963+
goto out;
1964+
}
1965+
root_inode = nfs_fhget(sb, data->fh, data->fattr);
1966+
if (!root_inode)
1967+
goto out;
1968+
sb->s_root = d_alloc_root(root_inode);
1969+
if (!sb->s_root)
1970+
goto out_put_root;
1971+
fsinfo.fattr = data->fattr;
1972+
if (NFS_PROTO(root_inode)->fsinfo(server, data->fh, &fsinfo) == 0)
1973+
nfs_super_set_maxbytes(sb, fsinfo.maxfilesize);
1974+
sb->s_root->d_op = server->rpc_ops->dentry_ops;
1975+
sb->s_flags |= MS_ACTIVE;
1976+
return server;
1977+
out_put_root:
1978+
iput(root_inode);
1979+
out:
1980+
return err;
1981+
}
1982+
19681983
static struct super_block *nfs_clone_nfs_sb(struct file_system_type *fs_type,
19691984
int flags, const char *dev_name, void *raw_data)
19701985
{
19711986
struct nfs_clone_mount *data = raw_data;
1972-
return nfs_clone_generic_sb(data, nfs_clone_client);
1987+
return nfs_clone_generic_sb(data, nfs_clone_sb, nfs_clone_server);
19731988
}
19741989

19751990
static struct file_system_type clone_nfs_fs_type = {
@@ -2371,12 +2386,14 @@ static inline char *nfs4_dup_path(const struct dentry *dentry)
23712386
return path;
23722387
}
23732388

2374-
static struct super_block *nfs4_clone_client(struct nfs_server *server, struct nfs_clone_mount *data)
2389+
static struct super_block *nfs4_clone_sb(struct nfs_server *server, struct nfs_clone_mount *data)
23752390
{
23762391
const struct dentry *dentry = data->dentry;
23772392
struct nfs4_client *clp = server->nfs4_state;
23782393
struct super_block *sb;
23792394

2395+
server->fsid = data->fattr->fsid;
2396+
nfs_copy_fh(&server->fh, data->fh);
23802397
server->mnt_path = nfs4_dup_path(dentry);
23812398
if (IS_ERR(server->mnt_path)) {
23822399
sb = (struct super_block *)server->mnt_path;
@@ -2403,12 +2420,12 @@ static struct super_block *nfs_clone_nfs4_sb(struct file_system_type *fs_type,
24032420
int flags, const char *dev_name, void *raw_data)
24042421
{
24052422
struct nfs_clone_mount *data = raw_data;
2406-
return nfs_clone_generic_sb(data, nfs4_clone_client);
2423+
return nfs_clone_generic_sb(data, nfs4_clone_sb, nfs_clone_server);
24072424
}
24082425

24092426
static struct file_system_type clone_nfs4_fs_type = {
24102427
.owner = THIS_MODULE,
2411-
.name = "nfs",
2428+
.name = "nfs4",
24122429
.get_sb = nfs_clone_nfs4_sb,
24132430
.kill_sb = nfs4_kill_super,
24142431
.fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,

0 commit comments

Comments
 (0)