static struct file *do_open(char *name, int flags) { struct nameidata nd; struct vfsmount *mnt; int error; mnt = do_kern_mount("nfsd", 0, "nfsd", NULL); if (IS_ERR(mnt)) return (struct file *)mnt; error = vfs_path_lookup(mnt->mnt_root, mnt, name, 0, &nd); mntput(mnt); /* drop do_kern_mount reference */ if (error) return ERR_PTR(error); if (flags == O_RDWR) error = may_open(&nd,MAY_READ|MAY_WRITE,FMODE_READ|FMODE_WRITE); else error = may_open(&nd, MAY_WRITE, FMODE_WRITE); if (!error) return dentry_open(nd.path.dentry, nd.path.mnt, flags); path_put(&nd.path); return ERR_PTR(error); }
static struct file *do_open(char *name, int flags) { struct nameidata nd; int error; nd.mnt = do_kern_mount("nfsd", 0, "nfsd", NULL); if (IS_ERR(nd.mnt)) return (struct file *)nd.mnt; nd.dentry = dget(nd.mnt->mnt_root); nd.last_type = LAST_ROOT; nd.flags = 0; nd.depth = 0; error = path_walk(name, &nd); if (error) return ERR_PTR(error); if (flags == O_RDWR) error = may_open(&nd,MAY_READ|MAY_WRITE,FMODE_READ|FMODE_WRITE); else error = may_open(&nd, MAY_WRITE, FMODE_WRITE); if (!error) return dentry_open(nd.dentry, nd.mnt, flags); path_release(&nd); return ERR_PTR(error); }