static int nfs_create(struct inode *dir, const char *name, int len, int mode, struct inode **result) { struct nfs_sattr sattr; struct nfs_fattr fattr; struct nfs_fh fhandle; int error; *result = NULL; if (!dir || !S_ISDIR(dir->i_mode)) { printk("nfs_create: inode is NULL or not a directory\n"); iput(dir); return -ENOENT; } if (len > NFS_MAXNAMLEN) { iput(dir); return -ENAMETOOLONG; } sattr.mode = mode; sattr.uid = sattr.gid = sattr.size = (unsigned) -1; sattr.atime.seconds = sattr.mtime.seconds = (unsigned) -1; if ((error = nfs_proc_create(NFS_SERVER(dir), NFS_FH(dir), name, &sattr, &fhandle, &fattr))) { iput(dir); return error; } if (!(*result = nfs_fhget(dir->i_sb, &fhandle, &fattr))) { iput(dir); return -EACCES; } nfs_lookup_cache_add(dir, name, &fhandle, &fattr); iput(dir); return 0; }
static int nfs_mknod(struct inode *dir, const char *name, int len, int mode, int rdev) { struct nfs_sattr sattr; struct nfs_fattr fattr; struct nfs_fh fhandle; int error; if (!dir || !S_ISDIR(dir->i_mode)) { printk("nfs_mknod: inode is NULL or not a directory\n"); iput(dir); return -ENOENT; } if (len > NFS_MAXNAMLEN) { iput(dir); return -ENAMETOOLONG; } if (S_ISFIFO(mode)) sattr.mode = (mode & ~S_IFMT) | S_IFCHR; else sattr.mode = mode; sattr.uid = sattr.gid = (unsigned) -1; if (S_ISCHR(mode) || S_ISBLK(mode)) sattr.size = rdev; /* get out your barf bag */ else sattr.size = (unsigned) -1; sattr.atime.seconds = sattr.mtime.seconds = (unsigned) -1; error = nfs_proc_create(NFS_SERVER(dir), NFS_FH(dir), name, &sattr, &fhandle, &fattr); if (error == -EINVAL && (S_ISFIFO(mode))) { sattr.mode = mode; error = nfs_proc_create(NFS_SERVER(dir), NFS_FH(dir), name, &sattr, &fhandle, &fattr); } if (!error) { nfs_lookup_cache_add(dir, name, &fhandle, &fattr); /* The parent dir inode count may have changed ! */ nfs_lookup_cache_remove( NULL, dir, NULL); } iput(dir); return error; }