Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
0
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;
}