static int nfs_mkdir(struct inode *dir, const char *name, int len, int mode) { struct nfs_sattr sattr; struct nfs_fattr fattr; struct nfs_fh fhandle; int error; if (!dir || !S_ISDIR(dir->i_mode)) { printk("nfs_mkdir: 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; error = nfs_proc_mkdir(NFS_SERVER(dir), NFS_FH(dir), name, &sattr, &fhandle, &fattr); if (!error) { if (fattr.fileid == dir->i_ino) printk("Sony NewsOS 4.1R buggy nfs server?\n"); else nfs_lookup_cache_add(dir, name, &fhandle, &fattr); } iput(dir); return error; }
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; }
static int nfs_lookup(struct inode *dir, const char *__name, int len, struct inode **result) { struct nfs_fh fhandle; struct nfs_fattr fattr; char name[len > NFS_MAXNAMLEN? 1 : len+1]; int error; *result = NULL; if (!dir || !S_ISDIR(dir->i_mode)) { printk("nfs_lookup: inode is NULL or not a directory\n"); iput(dir); return -ENOENT; } if (len > NFS_MAXNAMLEN) { iput(dir); return -ENAMETOOLONG; } memcpy(name,__name,len); name[len] = '\0'; if (len == 1 && name[0] == '.') { /* cheat for "." */ *result = dir; return 0; } if ((NFS_SERVER(dir)->flags & NFS_MOUNT_NOAC) || !nfs_lookup_cache_lookup(dir, name, &fhandle, &fattr)) { if ((error = nfs_proc_lookup(NFS_SERVER(dir), NFS_FH(dir), name, &fhandle, &fattr))) { iput(dir); return error; } nfs_lookup_cache_add(dir, name, &fhandle, &fattr); } if (!(*result = nfs_fhget(dir->i_sb, &fhandle, &fattr))) { iput(dir); return -EACCES; } iput(dir); return 0; }