static int nfs_mount_fs(nfs_fs *nfs, const char *server_path) { uint8 sendbuf[256]; char buf[128]; nfs_mountargs args; size_t arglen; int err; rpc_set_port(&nfs->rpc, nfs->mount_port); args.dirpath = server_path; arglen = nfs_pack_mountargs(sendbuf, &args); err = rpc_call(&nfs->rpc, MOUNTPROG, MOUNTVERS, MOUNTPROC_MNT, sendbuf, arglen, buf, sizeof(buf)); if(err < 0) return err; #if NFS_TRACE TRACE("nfs_mount_fs: have root fhandle: "); dump_fhandle((const nfs_fhandle *)&buf[4]); TRACE("\n"); #endif // we should have the root handle now memcpy(&nfs->root_vnode->nfs_handle, &buf[4], sizeof(nfs->root_vnode->nfs_handle)); // set the rpc port to the nfs server rpc_set_port(&nfs->rpc, nfs->nfs_port); return 0; }
static void nfs_set_port(struct sockaddr *sap, int *port, const unsigned short default_port) { if (*port == NFS_UNSPEC_PORT) *port = default_port; rpc_set_port(sap, *port); }
static struct vfsmount *try_location(struct nfs_clone_mount *mountdata, char *page, char *page2, const struct nfs4_fs_location *location) { const size_t addr_bufsize = sizeof(struct sockaddr_storage); struct vfsmount *mnt = ERR_PTR(-ENOENT); char *mnt_path; unsigned int maxbuflen; unsigned int s; mnt_path = nfs4_pathname_string(&location->rootpath, page2, PAGE_SIZE); if (IS_ERR(mnt_path)) return ERR_CAST(mnt_path); mountdata->mnt_path = mnt_path; maxbuflen = mnt_path - 1 - page2; mountdata->addr = kmalloc(addr_bufsize, GFP_KERNEL); if (mountdata->addr == NULL) return ERR_PTR(-ENOMEM); for (s = 0; s < location->nservers; s++) { const struct nfs4_string *buf = &location->servers[s]; if (buf->len <= 0 || buf->len >= maxbuflen) continue; if (memchr(buf->data, IPV6_SCOPE_DELIMITER, buf->len)) continue; mountdata->addrlen = nfs_parse_server_name(buf->data, buf->len, mountdata->addr, addr_bufsize, NFS_SB(mountdata->sb)); if (mountdata->addrlen == 0) continue; rpc_set_port(mountdata->addr, NFS_PORT); memcpy(page2, buf->data, buf->len); page2[buf->len] = '\0'; mountdata->hostname = page2; snprintf(page, PAGE_SIZE, "%s:%s", mountdata->hostname, mountdata->mnt_path); mnt = vfs_kern_mount(&nfs4_referral_fs_type, 0, page, mountdata); if (!IS_ERR(mnt)) break; } kfree(mountdata->addr); return mnt; }
static int nfs_unmount_fs(nfs_fs *nfs) { uint8 sendbuf[256]; size_t arglen; nfs_mountargs args; int err; rpc_set_port(&nfs->rpc, nfs->mount_port); args.dirpath = nfs->server_path; arglen = nfs_pack_mountargs(sendbuf, &args); err = rpc_call(&nfs->rpc, MOUNTPROG, MOUNTVERS, MOUNTPROC_UMNT, sendbuf, arglen, NULL, 0); return err; }
/** * xprt_rdma_set_port - update server port with rpcbind result * @xprt: controlling RPC transport * @port: new port value * * Transport connect status is unchanged. */ static void xprt_rdma_set_port(struct rpc_xprt *xprt, u16 port) { struct sockaddr *sap = (struct sockaddr *)&xprt->addr; char buf[8]; dprintk("RPC: %s: setting port for xprt %p (%s:%s) to %u\n", __func__, xprt, xprt->address_strings[RPC_DISPLAY_ADDR], xprt->address_strings[RPC_DISPLAY_PORT], port); rpc_set_port(sap, port); kfree(xprt->address_strings[RPC_DISPLAY_PORT]); snprintf(buf, sizeof(buf), "%u", port); xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL); kfree(xprt->address_strings[RPC_DISPLAY_HEX_PORT]); snprintf(buf, sizeof(buf), "%4hx", port); xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL); }