static int nfs_namespace_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) { if (NFS_FH(dentry->d_inode)->size != 0) return nfs_getattr(mnt, dentry, stat); generic_fillattr(dentry->d_inode, stat); return 0; }
static int nfs_namespace_getattr(const struct path *path, struct kstat *stat, u32 request_mask, unsigned int query_flags) { if (NFS_FH(d_inode(path->dentry))->size != 0) return nfs_getattr(path, stat, request_mask, query_flags); generic_fillattr(d_inode(path->dentry), stat); return 0; }
int nfs_seek(fs_cookie fs, fs_vnode _v, file_cookie _cookie, off_t pos, seek_type st) { nfs_fs *nfs = (nfs_fs *)fs; nfs_vnode *v = (nfs_vnode *)_v; nfs_cookie *cookie = (nfs_cookie *)_cookie; int err = NO_ERROR; uint8 attrstatbuf[NFS_ATTRSTAT_MAXLEN]; nfs_attrstat attrstat; off_t file_len; TRACE("nfs_seek: fsid 0x%x, vnid 0x%Lx, pos 0x%Lx, seek_type %d\n", nfs->id, VNODETOVNID(v), pos, st); if(v->st == STREAM_TYPE_DIR) return ERR_VFS_IS_DIR; mutex_lock(&v->lock); err = nfs_getattr(nfs, v, attrstatbuf, &attrstat); if(err < 0) goto out; file_len = attrstat.attributes->size; switch(st) { case _SEEK_SET: if(pos < 0) pos = 0; if(pos > file_len) pos = file_len; cookie->u.file.pos = pos; break; case _SEEK_CUR: if(pos + cookie->u.file.pos > file_len) cookie->u.file.pos = file_len; else if(pos + cookie->u.file.pos < 0) cookie->u.file.pos = 0; else cookie->u.file.pos += pos; break; case _SEEK_END: if(pos > 0) cookie->u.file.pos = file_len; else if(pos + file_len < 0) cookie->u.file.pos = 0; else cookie->u.file.pos = pos + file_len; break; default: err = ERR_INVALID_ARGS; } out: mutex_unlock(&v->lock); return err; }
int nfs_rstat(fs_cookie fs, fs_vnode _v, struct file_stat *stat) { nfs_fs *nfs = (nfs_fs *)fs; nfs_vnode *v = (nfs_vnode *)_v; uint8 attrstatbuf[NFS_ATTRSTAT_MAXLEN]; nfs_attrstat attrstat; int err; TRACE("nfs_rstat: fsid 0x%x, vnid 0x%Lx, stat %p\n", nfs->id, VNODETOVNID(v), stat); mutex_lock(&v->lock); err = nfs_getattr(nfs, v, attrstatbuf, &attrstat); if(err < 0) goto out; if(attrstat.status != NFS_OK) { err = ERR_IO_ERROR; goto out; } /* copy the stat over from the nfs attrstat */ stat->vnid = VNODETOVNID(v); stat->size = attrstat.attributes->size; switch(attrstat.attributes->ftype) { case NFREG: stat->type = STREAM_TYPE_FILE; break; case NFDIR: stat->type = STREAM_TYPE_DIR; break; default: stat->type = STREAM_TYPE_DEVICE; // XXX should have unknown type break; } err = NO_ERROR; out: mutex_unlock(&v->lock); return err; }