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; }
int nfs_mkdir(struct file *dir_filp, const char *name, mode_t mode) { struct nfs_fh *dhandle, temp_fhandle; struct nfs_fattr temp_fattr; struct nfs_sattr temp_sattr; int status; DPRINTF(CLU_LEVEL,("nfs_mkdir:\n")); demand(dir_filp, bogus dir_filp); demand(name, empty name given to nfs_mkdir); dhandle = GETFHANDLE(dir_filp); k2printf("nfs_mkdir: nfs_proc_getattr\n"); status = nfs_proc_getattr(dhandle,&temp_fattr); if (status != 0) { fprintf(stderr,"nfs_mkdir, was not able to do getattr\n" "on a NFS filp\n"); errno = status; return -1; } temp_sattr.mode = ((temp_fattr.mode & 0xfffffe00) | (mode & 0x000001ff)); temp_sattr.uid = __current->uid; temp_sattr.gid = (temp_fattr.gid) ? temp_fattr.gid : __current->egid; temp_sattr.size = 1024; temp_sattr.atime.seconds = -1; temp_sattr.atime.useconds = -1; temp_sattr.mtime.seconds = -1; temp_sattr.mtime.useconds = -1; status = nfs_proc_mkdir(dhandle, name, &temp_sattr, &temp_fhandle, &temp_fattr); nfs_flush_filp(dir_filp); nfs_cache_remove(dir_filp,name); if (status == 0) { nfs_cache_add_devino(FHGETDEV(dhandle),temp_fattr.fileid,"..", GETNFSCE(dir_filp)); return 0; } else { errno = status; return -1; } }