Пример #1
0
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;
}
Пример #2
0
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;
  }
}