The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/fs/nfsctl.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  *      fs/nfsctl.c
    3  *
    4  *      This should eventually move to userland.
    5  *
    6  */
    7 #include <linux/types.h>
    8 #include <linux/file.h>
    9 #include <linux/fs.h>
   10 #include <linux/nfsd/syscall.h>
   11 #include <linux/cred.h>
   12 #include <linux/sched.h>
   13 #include <linux/linkage.h>
   14 #include <linux/namei.h>
   15 #include <linux/mount.h>
   16 #include <linux/syscalls.h>
   17 #include <asm/uaccess.h>
   18 
   19 /*
   20  * open a file on nfsd fs
   21  */
   22 
   23 static struct file *do_open(char *name, int flags)
   24 {
   25         struct nameidata nd;
   26         struct vfsmount *mnt;
   27         int error;
   28 
   29         mnt = do_kern_mount("nfsd", 0, "nfsd", NULL);
   30         if (IS_ERR(mnt))
   31                 return (struct file *)mnt;
   32 
   33         error = vfs_path_lookup(mnt->mnt_root, mnt, name, 0, &nd);
   34         mntput(mnt);    /* drop do_kern_mount reference */
   35         if (error)
   36                 return ERR_PTR(error);
   37 
   38         if (flags == O_RDWR)
   39                 error = may_open(&nd.path, MAY_READ|MAY_WRITE, flags);
   40         else
   41                 error = may_open(&nd.path, MAY_WRITE, flags);
   42 
   43         if (!error)
   44                 return dentry_open(nd.path.dentry, nd.path.mnt, flags,
   45                                    current_cred());
   46 
   47         path_put(&nd.path);
   48         return ERR_PTR(error);
   49 }
   50 
   51 static struct {
   52         char *name; int wsize; int rsize;
   53 } map[] = {
   54         [NFSCTL_SVC] = {
   55                 .name   = ".svc",
   56                 .wsize  = sizeof(struct nfsctl_svc)
   57         },
   58         [NFSCTL_ADDCLIENT] = {
   59                 .name   = ".add",
   60                 .wsize  = sizeof(struct nfsctl_client)
   61         },
   62         [NFSCTL_DELCLIENT] = {
   63                 .name   = ".del",
   64                 .wsize  = sizeof(struct nfsctl_client)
   65         },
   66         [NFSCTL_EXPORT] = {
   67                 .name   = ".export",
   68                 .wsize  = sizeof(struct nfsctl_export)
   69         },
   70         [NFSCTL_UNEXPORT] = {
   71                 .name   = ".unexport",
   72                 .wsize  = sizeof(struct nfsctl_export)
   73         },
   74         [NFSCTL_GETFD] = {
   75                 .name   = ".getfd",
   76                 .wsize  = sizeof(struct nfsctl_fdparm),
   77                 .rsize  = NFS_FHSIZE
   78         },
   79         [NFSCTL_GETFS] = {
   80                 .name   = ".getfs",
   81                 .wsize  = sizeof(struct nfsctl_fsparm),
   82                 .rsize  = sizeof(struct knfsd_fh)
   83         },
   84 };
   85 
   86 SYSCALL_DEFINE3(nfsservctl, int, cmd, struct nfsctl_arg __user *, arg,
   87                 void __user *, res)
   88 {
   89         struct file *file;
   90         void __user *p = &arg->u;
   91         int version;
   92         int err;
   93 
   94         if (copy_from_user(&version, &arg->ca_version, sizeof(int)))
   95                 return -EFAULT;
   96 
   97         if (version != NFSCTL_VERSION)
   98                 return -EINVAL;
   99 
  100         if (cmd < 0 || cmd >= ARRAY_SIZE(map) || !map[cmd].name)
  101                 return -EINVAL;
  102 
  103         file = do_open(map[cmd].name, map[cmd].rsize ? O_RDWR : O_WRONLY);      
  104         if (IS_ERR(file))
  105                 return PTR_ERR(file);
  106         err = file->f_op->write(file, p, map[cmd].wsize, &file->f_pos);
  107         if (err >= 0 && map[cmd].rsize)
  108                 err = file->f_op->read(file, res, map[cmd].rsize, &file->f_pos);
  109         if (err >= 0)
  110                 err = 0;
  111         fput(file);
  112         return err;
  113 }

Cache object: 08bc21fb7abd64345df70614728f133d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.