aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
Commit message (Expand)AuthorAge
* Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/ker...Linus Torvalds2013-04-14
|\
| * x86, mm: Patch out arch_flush_lazy_mmu_mode() when running on bare metalBoris Ostrovsky2013-04-10
* | Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/ke...Linus Torvalds2013-04-14
|\ \ | |/ |/|
| * perf/x86: Fix uninitialized pt_regs in intel_pmu_drain_bts_buffer()Stephane Eranian2013-03-21
* | Merge branch 'x86/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/ti...Linus Torvalds2013-03-24
|\ \
| * | x86, microcode_intel_early: Mark apply_microcode_early() as cpuinitH. Peter Anvin2013-03-21
| * | x86-32, microcode_intel_early: Fix crash with CONFIG_DEBUG_VIRTUALFenghua Yu2013-03-19
* | | Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/ke...Linus Torvalds2013-03-21
|\ \ \ | |/ / |/| / | |/
| * perf/x86: Add SNB/SNB-EP scheduling constraints for cycle_activity eventStephane Eranian2013-03-18
| * kprobes/x86: Check Interrupt Flag modifier when registering probeMasami Hiramatsu2013-03-18
* | perf,x86: fix wrmsr_on_cpu() warning on suspend/resumeLinus Torvalds2013-03-17
* | perf,x86: fix kernel crash with PEBS/BTS after suspend/resumeStephane Eranian2013-03-15
|/
* x86: Fix 32-bit *_cpu_data initializersKrzysztof Mazur2013-03-06
* x86, smpboot: Remove unused variableBorislav Petkov2013-03-05
* Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vir...Linus Torvalds2013-03-03
|\
| * more file_inode() open-coded instancesAl Viro2013-02-27
* | x86, ACPI, mm: Revert movablemem_map supportYinghai Lu2013-03-02
* | Merge git://git.kernel.org/pub/scm/virt/kvm/kvmLinus Torvalds2013-02-28
|\ \
| * | x86/kvm: Fix pvclock vsyscall fixmapPeter Hurley2013-02-28
* | | Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhan...Linus Torvalds2013-02-28
|\ \ \ | |/ / |/| |
| * | x86/nmi: export local_touch_nmi() symbol for modulesJacob Pan2013-01-17
* | | Merge branch 'akpm' (final batch from Andrew)Linus Torvalds2013-02-27
|\ \ \
| * | | hlist: drop the node parameter from iteratorsSasha Levin2013-02-27
| | |/ | |/|
* | | Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...Linus Torvalds2013-02-27
|\ \ \
| * | | x86, efi: remove duplicate code in setup_arch() by using, efi_is_native()Satoru Takeuchi2013-02-14
* | | | Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/ker...Linus Torvalds2013-02-27
|\ \ \ \ | |_|/ / |/| | |
| * | | x86: Make sure we can boot in the case the BDA contains pure garbageH. Peter Anvin2013-02-27
| * | | x86, doc: Fix incorrect comment about 64-bit code segment descriptorsKonrad Rzeszutek Wilk2013-02-25
* | | | Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vir...Linus Torvalds2013-02-26
|\ \ \ \
| * | | | new helper: file_inode(file)Al Viro2013-02-22
* | | | | Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/ker...Linus Torvalds2013-02-26
|\ \ \ \ \ | | |/ / / | |/| | |
| * | | | x86/apic: Fix parsing of the 'lapic' cmdline optionMathias Krause2013-02-20
* | | | | Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/ke...Linus Torvalds2013-02-26
|\ \ \ \ \
| * | | | | perf/x86: Add Intel IvyBridge event scheduling constraintsStephane Eranian2013-02-20
| |/ / / /
* | | | | Merge tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kern...Linus Torvalds2013-02-25
|\ \ \ \ \
| * | | | | taint: add explicit flag to show whether lock dep is still OK.Rusty Russell2013-01-21
| | |/ / / | |/| | |
* | | | | Merge tag 'kvm-3.9-1' of git://git.kernel.org/pub/scm/virt/kvm/kvmLinus Torvalds2013-02-24
|\ \ \ \ \
| * | | | | x86: pvclock kvm: align allocation size to page sizeMarcelo Tosatti2013-02-18
* | | | | | Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vir...Linus Torvalds2013-02-23
|\ \ \ \ \ \
| * | | | | | x86: convert to ksignalAl Viro2013-02-14
| * | | | | | x86: switch to generic old sigactionAl Viro2013-02-03
| * | | | | | x86,um: switch to generic old sigsuspend()Al Viro2013-02-03
| * | | | | | x86: get rid of pt_regs argument in vm86/vm86oldAl Viro2013-02-03
| * | | | | | x86: get rid of pt_regs argument in sigreturn variantsAl Viro2013-02-03
| * | | | | | x86: get rid of pt_regs argument of iopl(2)Al Viro2013-02-03
| * | | | | | amd64: get rid of useless RESTORE_TOP_OF_STACK in stub_execve()Al Viro2013-02-03
| | |/ / / / | |/| | | |
* | | | | | Merge branch 'akpm' (more incoming from Andrew)Linus Torvalds2013-02-23
|\ \ \ \ \ \
| * | | | | | acpi, memory-hotplug: parse SRAT before memblock is readyTang Chen2013-02-23
| * | | | | | cpu_hotplug: clear apicid to node when the cpu is hotremovedWen Congyang2013-02-23
* | | | | | | Merge branch 'x86/microcode' of git://git.kernel.org/pub/scm/linux/kernel/git...Linus Torvalds2013-02-22
|\ \ \ \ \ \ \
f='#n138'>138 139 140 141 142 143 144 145 146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  
                                  











                                                     



                               
                                            

      


                                            

                          

  










                                                                     
   

                                                                            
 


                                          



                                          







                                                
                                    

                                          
                                       
 

                                                        
 
                                     
                             
                                  
 





                                                                      
                                      
























                                                                         

 


                                        

                                                              






                                                         

                                                               









                                                 

                                                                















                                                  
                                        
 








                                                                   



                                                







                                                                    



          



                                          

  



                                          

  
                                            





                      
                                 
 
                                         

                                          
                                                  


                                      
/*
 * In-kernel MOUNT protocol client
 *
 * Copyright (C) 1997, Olaf Kirch <okir@monad.swb.de>
 */

#include <linux/types.h>
#include <linux/socket.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/uio.h>
#include <linux/net.h>
#include <linux/in.h>
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/sched.h>
#include <linux/nfs_fs.h>

#ifdef RPC_DEBUG
# define NFSDBG_FACILITY	NFSDBG_MOUNT
#endif

static struct rpc_program	mnt_program;

struct mnt_fhstatus {
	u32 status;
	struct nfs_fh *fh;
};

/**
 * nfs_mount - Obtain an NFS file handle for the given host and path
 * @addr: pointer to server's address
 * @len: size of server's address
 * @hostname: name of server host, or NULL
 * @path: pointer to string containing export path to mount
 * @version: mount version to use for this request
 * @protocol: transport protocol to use for thie request
 * @fh: pointer to location to place returned file handle
 *
 * Uses default timeout parameters specified by underlying transport.
 */
int nfs_mount(struct sockaddr *addr, size_t len, char *hostname, char *path,
	      int version, int protocol, struct nfs_fh *fh)
{
	struct mnt_fhstatus	result = {
		.fh		= fh
	};
	struct rpc_message msg	= {
		.rpc_argp	= path,
		.rpc_resp	= &result,
	};
	struct rpc_create_args args = {
		.protocol	= protocol,
		.address	= addr,
		.addrsize	= len,
		.servername	= hostname,
		.program	= &mnt_program,
		.version	= version,
		.authflavor	= RPC_AUTH_UNIX,
		.flags		= 0,
	};
	struct rpc_clnt		*mnt_clnt;
	int			status;

	dprintk("NFS: sending MNT request for %s:%s\n",
		(hostname ? hostname : "server"), path);

	mnt_clnt = rpc_create(&args);
	if (IS_ERR(mnt_clnt))
		goto out_clnt_err;

	if (version == NFS_MNT3_VERSION)
		msg.rpc_proc = &mnt_clnt->cl_procinfo[MOUNTPROC3_MNT];
	else
		msg.rpc_proc = &mnt_clnt->cl_procinfo[MNTPROC_MNT];

	status = rpc_call_sync(mnt_clnt, &msg, 0);
	rpc_shutdown_client(mnt_clnt);

	if (status < 0)
		goto out_call_err;
	if (result.status != 0)
		goto out_mnt_err;

	dprintk("NFS: MNT request succeeded\n");
	status = 0;

out:
	return status;

out_clnt_err:
	status = PTR_ERR(mnt_clnt);
	dprintk("NFS: failed to create RPC client, status=%d\n", status);
	goto out;

out_call_err:
	dprintk("NFS: failed to start MNT request, status=%d\n", status);
	goto out;

out_mnt_err:
	dprintk("NFS: MNT server returned result %d\n", result.status);
	status = -EACCES;
	goto out;
}

/*
 * XDR encode/decode functions for MOUNT
 */
static int xdr_encode_dirpath(struct rpc_rqst *req, __be32 *p,
			      const char *path)
{
	p = xdr_encode_string(p, path);

	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p);
	return 0;
}

static int xdr_decode_fhstatus(struct rpc_rqst *req, __be32 *p,
			       struct mnt_fhstatus *res)
{
	struct nfs_fh *fh = res->fh;

	if ((res->status = ntohl(*p++)) == 0) {
		fh->size = NFS2_FHSIZE;
		memcpy(fh->data, p, NFS2_FHSIZE);
	}
	return 0;
}

static int xdr_decode_fhstatus3(struct rpc_rqst *req, __be32 *p,
				struct mnt_fhstatus *res)
{
	struct nfs_fh *fh = res->fh;

	if ((res->status = ntohl(*p++)) == 0) {
		int size = ntohl(*p++);
		if (size <= NFS3_FHSIZE) {
			fh->size = size;
			memcpy(fh->data, p, size);
		} else
			res->status = -EBADHANDLE;
	}
	return 0;
}

#define MNT_dirpath_sz		(1 + 256)
#define MNT_fhstatus_sz		(1 + 8)
#define MNT_fhstatus3_sz	(1 + 16)

static struct rpc_procinfo mnt_procedures[] = {
	[MNTPROC_MNT] = {
		.p_proc		= MNTPROC_MNT,
		.p_encode	= (kxdrproc_t) xdr_encode_dirpath,
		.p_decode	= (kxdrproc_t) xdr_decode_fhstatus,
		.p_arglen	= MNT_dirpath_sz,
		.p_replen	= MNT_fhstatus_sz,
		.p_statidx	= MNTPROC_MNT,
		.p_name		= "MOUNT",
	},
};

static struct rpc_procinfo mnt3_procedures[] = {
	[MOUNTPROC3_MNT] = {
		.p_proc		= MOUNTPROC3_MNT,
		.p_encode	= (kxdrproc_t) xdr_encode_dirpath,
		.p_decode	= (kxdrproc_t) xdr_decode_fhstatus3,
		.p_arglen	= MNT_dirpath_sz,
		.p_replen	= MNT_fhstatus3_sz,
		.p_statidx	= MOUNTPROC3_MNT,
		.p_name		= "MOUNT",
	},
};


static struct rpc_version mnt_version1 = {
	.number		= 1,
	.nrprocs	= 2,
	.procs		= mnt_procedures,
};

static struct rpc_version mnt_version3 = {
	.number		= 3,
	.nrprocs	= 2,
	.procs		= mnt3_procedures,
};

static struct rpc_version *mnt_version[] = {
	NULL,
	&mnt_version1,
	NULL,
	&mnt_version3,
};

static struct rpc_stat mnt_stats;

static struct rpc_program mnt_program = {
	.name		= "mount",
	.number		= NFS_MNT_PROGRAM,
	.nrvers		= ARRAY_SIZE(mnt_version),
	.version	= mnt_version,
	.stats		= &mnt_stats,
};