int nfs_chmod(struct file *filp, mode_t mode) { struct nfs_fh *fhandle; struct nfs_fattr temp_fattr; struct nfs_sattr temp_sattr; int status; DPRINTF(CLU_LEVEL,("nfs_chmod:\n")); demand(filp, bogus filp); fhandle = GETFHANDLE(filp); k2printf("nfs_chmod: nfs_proc_getattr\n"); status = nfs_proc_getattr(fhandle,&temp_fattr); if (status == 0) { /* ALLPERMS is 07777 */ temp_sattr.mode = ((temp_fattr.mode & ~ALLPERMS) | (mode & ALLPERMS)); DPRINTF(CLU_LEVEL,("nfs_chmod: nfs_proc_getattr returned %d, " "new mode %08x, old %08x, setmode: %08x\n", status,mode,temp_fattr.mode,temp_sattr.mode)); /* do only permissions, also should use macro definitions */ temp_sattr.uid = -1; temp_sattr.gid = -1; temp_sattr.size = -1; temp_sattr.atime.seconds = -1; temp_sattr.atime.useconds = -1; temp_sattr.mtime.seconds = -1; temp_sattr.mtime.useconds = -1; status = nfs_proc_setattr(fhandle, &temp_sattr, &temp_fattr); DPRINTF(CLU_LEVEL,("nfs_chmod: nfs_proc_setattr returned %d\n",status)); if (status == 0) { filp->f_mode = temp_sattr.mode; nfs_fill_stat(&temp_fattr, GETNFSCE(filp)); } return(status);} else { fprintf(stderr,"warning: nfs_chmod, was not able to do getattr\n" "on a NFS filp\n"); errno = EACCES; return -1; } }
int nfs_truncate(struct file *filp, off_t length) { struct nfs_fh *fhandle; struct nfs_fattr temp_fattr; struct nfs_sattr temp_sattr; int status; /* make sure you interact with bc to drop unneeded page */ DPRINTF(CLU_LEVEL,("nfs_truncate:\n")); demand(filp, bogus filp); fhandle = GETFHANDLE(filp); /* HBXX this is OVERKILL, should not flush all things. */ nfsc_sync(GETNFSCE(filp)); /* just to be sure the size if proper */ k2printf("nfs_truncate: nfs_proc_getattr\n"); status = nfs_proc_getattr(fhandle,&temp_fattr); if (status == 0) { temp_sattr.mode = temp_fattr.mode; /* do only permissions, also should use macro definitions */ temp_sattr.uid = -1; temp_sattr.gid = -1; temp_sattr.size = length; temp_sattr.atime.seconds = -1; temp_sattr.atime.useconds = -1; temp_sattr.mtime.seconds = -1; temp_sattr.mtime.useconds = -1; status = nfs_proc_setattr(fhandle, &temp_sattr, &temp_fattr); if (status == 0) { /* note that the f_pos is not changed */ nfs_flush_filp(filp); nfs_fill_stat(&temp_fattr, GETNFSCE(filp)); return(0); } errno = status; return(-1); } else { fprintf(stderr,"warning: nfs_truncate, was not able to do getattr\n" "on a NFS filp\n"); errno = status; return -1; } }
int nfs_chown(struct file *filp, uid_t owner, gid_t group) { struct nfs_fh *fhandle; struct nfs_fattr temp_fattr; struct nfs_sattr temp_sattr; int status; kprintf("nfs_chown: bogusly returning success for ease of use.\n"); return 0; /* XXX */ DPRINTF(CLU_LEVEL,("nfs_chown:\n")); demand(filp, bogus filp); fhandle = GETFHANDLE(filp); #if 0 k2printf("nfs_chown: nfs_proc_getattr\n"); status = nfs_proc_getattr(fhandle,&temp_fattr); #else status = 0; #endif if (status == 0) { temp_sattr.mode = -1; temp_sattr.uid = (owner == -1) ? -1 : owner; temp_sattr.gid = (group == -1) ? -1 : group; temp_sattr.size = -1; temp_sattr.atime.seconds = -1; temp_sattr.atime.useconds = -1; temp_sattr.mtime.seconds = -1; temp_sattr.mtime.useconds = -1; status = nfs_proc_setattr( fhandle, &temp_sattr, &temp_fattr); if (status == 0) { nfs_fill_stat(&temp_fattr, GETNFSCE(filp)); } return(status);} else { fprintf(stderr,"nfs_chown, was not able to do getattr\n" "on a NFS filp\n"); errno = EACCES; return -1; } }
int nfs_notify_change(struct inode *inode, struct iattr *attr) { struct nfs_sattr sattr; struct nfs_fattr fattr; int error; sattr.mode = (unsigned) -1; if (attr->ia_valid & ATTR_MODE) sattr.mode = attr->ia_mode; sattr.uid = (unsigned) -1; if (attr->ia_valid & ATTR_UID) sattr.uid = attr->ia_uid; sattr.gid = (unsigned) -1; if (attr->ia_valid & ATTR_GID) sattr.gid = attr->ia_gid; sattr.size = (unsigned) -1; if (attr->ia_valid & ATTR_SIZE) sattr.size = S_ISREG(inode->i_mode) ? attr->ia_size : -1; sattr.mtime.seconds = sattr.mtime.useconds = (unsigned) -1; if (attr->ia_valid & ATTR_MTIME) { sattr.mtime.seconds = attr->ia_mtime; sattr.mtime.useconds = 0; } sattr.atime.seconds = sattr.atime.useconds = (unsigned) -1; if (attr->ia_valid & ATTR_ATIME) { sattr.atime.seconds = attr->ia_atime; sattr.atime.useconds = 0; } error = nfs_proc_setattr(NFS_SERVER(inode), NFS_FH(inode), &sattr, &fattr); if (!error) nfs_refresh_inode(inode, &fattr); inode->i_dirt = 0; return error; }
/* 在网络文件系统当中,如果文件的inode被修改, * 则会调用该函数发起一个通知 */ int nfs_notify_change(int flags, struct inode *inode) { struct nfs_sattr sattr; struct nfs_fattr fattr; int error; if (flags & NOTIFY_MODE) sattr.mode = inode->i_mode; else sattr.mode = (unsigned) -1; if (flags & NOTIFY_UIDGID) { sattr.uid = inode->i_uid; sattr.gid = inode->i_gid; } else sattr.uid = sattr.gid = (unsigned) -1; if (flags & NOTIFY_SIZE) sattr.size = S_ISREG(inode->i_mode) ? inode->i_size : -1; else sattr.size = (unsigned) -1; if (flags & NOTIFY_TIME) { sattr.mtime.seconds = inode->i_mtime; sattr.mtime.useconds = 0; sattr.atime.seconds = inode->i_atime; sattr.atime.useconds = 0; } else { sattr.mtime.seconds = sattr.mtime.useconds = (unsigned) -1; sattr.atime.seconds = sattr.atime.useconds = (unsigned) -1; } error = nfs_proc_setattr(NFS_SERVER(inode), NFS_FH(inode), &sattr, &fattr); if (!error) nfs_refresh_inode(inode, &fattr); inode->i_dirt = 0; return error; }
int nfs_utimes(struct file *filp, const struct timeval *times) { struct nfs_fh *fhandle; struct nfs_fattr temp_fattr; struct nfs_sattr temp_sattr; int status; DPRINTF(CLU_LEVEL,("nfs_utimes:\n")); demand(filp, bogus filp); fhandle = GETFHANDLE(filp); #if 0 fprintf(stderr,"nfs_utimes: nfs_proc_getattr\n"); status = nfs_proc_getattr(fhandle,&temp_fattr); #else status = 0; #endif if (status == 0) { temp_sattr.mode = -1; temp_sattr.uid = -1; temp_sattr.gid = -1; temp_sattr.size = -1; if (times) { //fprintf(stderr,"time passed in\n"); temp_sattr.atime.seconds = times[0].tv_sec; temp_sattr.atime.useconds = times[0].tv_usec; temp_sattr.mtime.seconds = times[1].tv_sec; temp_sattr.mtime.useconds = times[1].tv_usec; } else { struct timeval times2; gettimeofday(×2,(struct timezone *)0); //fprintf(stderr,"times2.tv_sec = %ld\n",times2.tv_sec); temp_sattr.atime.seconds = times2.tv_sec; temp_sattr.atime.useconds = times2.tv_usec; temp_sattr.mtime.seconds = times2.tv_sec; temp_sattr.mtime.useconds = times2.tv_usec; } /* the owner will be the only one allowed to change the file */ status = nfs_proc_setattr(fhandle, &temp_sattr, &temp_fattr); //fprintf(stderr,"status: %d errno %d\n",status,errno); if (status == 0) { nfsc_p e = GETNFSCE(filp); nfs_fill_stat(&temp_fattr,e); nfs_flush_filp(filp); } return(status); } else { fprintf(stderr,"warning: nfs_utimes, was not able to do getattr\n" "on a NFS filp\n"); errno = EACCES; return -1; } }