*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
*/
/* Portions Copyright 2007 Jeremy Teo */
if ((mode & FMODE_WRITE) && (zp->z_pflags & ZFS_APPENDONLY) &&
((flag & O_APPEND) == 0)) {
ZFS_EXIT(zsb);
- return (EPERM);
+ return (SET_ERROR(EPERM));
}
/* Virus scan eligible files on open */
!(zp->z_pflags & ZFS_AV_QUARANTINED) && zp->z_size > 0) {
if (zfs_vscan(ip, cr, 0) != 0) {
ZFS_EXIT(zsb);
- return (EACCES);
+ return (SET_ERROR(EACCES));
}
}
file_sz = zp->z_size;
if (noff >= file_sz) {
- return (ENXIO);
+ return (SET_ERROR(ENXIO));
}
if (cmd == SEEK_HOLE)
*off = file_sz;
return (0);
}
- return (ENXIO);
+ return (SET_ERROR(ENXIO));
}
if (noff < *off)
if (zp->z_pflags & ZFS_AV_QUARANTINED) {
ZFS_EXIT(zsb);
- return (EACCES);
+ return (SET_ERROR(EACCES));
}
/*
*/
if (uio->uio_loffset < (offset_t)0) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
/*
if (mandatory_lock(ip) &&
!lock_may_read(ip, uio->uio_loffset, uio->uio_resid)) {
ZFS_EXIT(zsb);
- return (EAGAIN);
+ return (SET_ERROR(EAGAIN));
}
/*
if (error) {
/* convert checksum errors into IO errors */
if (error == ECKSUM)
- error = EIO;
+ error = SET_ERROR(EIO);
break;
}
((zp->z_pflags & ZFS_APPENDONLY) && !(ioflag & FAPPEND) &&
(uio->uio_loffset < zp->z_size))) {
ZFS_EXIT(zsb);
- return (EPERM);
+ return (SET_ERROR(EPERM));
}
zilog = zsb->z_log;
woff = ioflag & FAPPEND ? zp->z_size : uio->uio_loffset;
if (woff < 0) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
/*
*/
if (mandatory_lock(ip) && !lock_may_write(ip, woff, n)) {
ZFS_EXIT(zsb);
- return (EAGAIN);
+ return (SET_ERROR(EAGAIN));
}
/*
if (woff >= limit) {
zfs_range_unlock(rl);
ZFS_EXIT(zsb);
- return (EFBIG);
+ return (SET_ERROR(EFBIG));
}
if ((woff + n) > limit || woff > (limit - n))
zfs_owner_overquota(zsb, zp, B_TRUE)) {
if (abuf != NULL)
dmu_return_arcbuf(abuf);
- error = EDQUOT;
+ error = SET_ERROR(EDQUOT);
break;
}
* Nothing to do if the file has been removed
*/
if (zfs_zget(zsb, object, &zp) != 0)
- return (ENOENT);
+ return (SET_ERROR(ENOENT));
if (zp->z_unlinked) {
/*
* Release the vnode asynchronously as we currently have the
* txg stopped from syncing.
*/
iput_async(ZTOI(zp), dsl_pool_iput_taskq(dmu_objset_pool(os)));
- return (ENOENT);
+ return (SET_ERROR(ENOENT));
}
zgd = (zgd_t *)kmem_zalloc(sizeof (zgd_t), KM_PUSHPAGE);
zgd->zgd_rl = zfs_range_lock(zp, offset, size, RL_READER);
/* test for truncation needs to be done while range locked */
if (offset >= zp->z_size) {
- error = ENOENT;
+ error = SET_ERROR(ENOENT);
} else {
error = dmu_read(os, object, offset, size, buf,
DMU_READ_NO_PREFETCH);
}
/* test for truncation needs to be done while range locked */
if (lr->lr_offset >= zp->z_size)
- error = ENOENT;
+ error = SET_ERROR(ENOENT);
#ifdef DEBUG
if (zil_fault_io) {
- error = EIO;
+ error = SET_ERROR(EIO);
zil_fault_io = 0;
}
#endif
if (!(flags & (LOOKUP_XATTR | FIGNORECASE))) {
if (!S_ISDIR(dip->i_mode)) {
- return (ENOTDIR);
+ return (SET_ERROR(ENOTDIR));
} else if (zdp->z_sa_hdl == NULL) {
- return (EIO);
+ return (SET_ERROR(EIO));
}
if (nm[0] == 0 || (nm[0] == '.' && nm[1] == '\0')) {
}
if (tvp == DNLC_NO_VNODE) {
iput(tvp);
- return (ENOENT);
+ return (SET_ERROR(ENOENT));
} else {
*vpp = tvp;
return (specvp_check(vpp, cr));
*/
if (zdp->z_pflags & ZFS_XATTR) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
if ((error = zfs_get_xattrdir(zdp, ipp, cr, flags))) {
if (!S_ISDIR(dip->i_mode)) {
ZFS_EXIT(zsb);
- return (ENOTDIR);
+ return (SET_ERROR(ENOTDIR));
}
/*
if (zsb->z_utf8 && u8_validate(nm, strlen(nm),
NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
ZFS_EXIT(zsb);
- return (EILSEQ);
+ return (SET_ERROR(EILSEQ));
}
error = zfs_dirlook(zdp, nm, ipp, flags, direntflags, realpnp);
if (zsb->z_use_fuids == B_FALSE &&
(vsecp || IS_EPHEMERAL(uid) || IS_EPHEMERAL(gid)))
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
ZFS_ENTER(zsb);
ZFS_VERIFY_ZP(dzp);
if (zsb->z_utf8 && u8_validate(name, strlen(name),
NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
ZFS_EXIT(zsb);
- return (EILSEQ);
+ return (SET_ERROR(EILSEQ));
}
if (vap->va_mask & ATTR_XVATTR) {
if (have_acl)
zfs_acl_ids_free(&acl_ids);
if (strcmp(name, "..") == 0)
- error = EISDIR;
+ error = SET_ERROR(EISDIR);
ZFS_EXIT(zsb);
return (error);
}
if ((dzp->z_pflags & ZFS_XATTR) && !S_ISREG(vap->va_mode)) {
if (have_acl)
zfs_acl_ids_free(&acl_ids);
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
goto out;
}
if (zfs_acl_ids_overquota(zsb, &acl_ids)) {
zfs_acl_ids_free(&acl_ids);
- error = EDQUOT;
+ error = SET_ERROR(EDQUOT);
goto out;
}
* Can't truncate an existing file if in exclusive mode.
*/
if (excl) {
- error = EEXIST;
+ error = SET_ERROR(EEXIST);
goto out;
}
/*
* Can't open a directory for writing.
*/
if (S_ISDIR(ZTOI(zp)->i_mode)) {
- error = EISDIR;
+ error = SET_ERROR(EISDIR);
goto out;
}
/*
* Need to use rmdir for removing directories.
*/
if (S_ISDIR(ip->i_mode)) {
- error = EPERM;
+ error = SET_ERROR(EPERM);
goto out;
}
uid = crgetuid(cr);
if (zsb->z_use_fuids == B_FALSE &&
(vsecp || IS_EPHEMERAL(uid) || IS_EPHEMERAL(gid)))
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
ZFS_ENTER(zsb);
ZFS_VERIFY_ZP(dzp);
if (dzp->z_pflags & ZFS_XATTR) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
if (zsb->z_utf8 && u8_validate(dirname,
strlen(dirname), NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
ZFS_EXIT(zsb);
- return (EILSEQ);
+ return (SET_ERROR(EILSEQ));
}
if (flags & FIGNORECASE)
zf |= ZCILOOK;
zfs_acl_ids_free(&acl_ids);
zfs_dirent_unlock(dl);
ZFS_EXIT(zsb);
- return (EDQUOT);
+ return (SET_ERROR(EDQUOT));
}
/*
}
if (!S_ISDIR(ip->i_mode)) {
- error = ENOTDIR;
+ error = SET_ERROR(ENOTDIR);
goto out;
}
if (ip == cwd) {
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
goto out;
}
(u_longlong_t)offset,
zap.za_integer_length,
(u_longlong_t)zap.za_num_integers);
- error = ENXIO;
+ error = SET_ERROR(ENXIO);
goto update;
}
((mask & ATTR_GID) && IS_EPHEMERAL(vap->va_gid)) ||
(mask & ATTR_XVATTR))) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
if (mask & ATTR_SIZE && S_ISDIR(ip->i_mode)) {
ZFS_EXIT(zsb);
- return (EISDIR);
+ return (SET_ERROR(EISDIR));
}
if (mask & ATTR_SIZE && !S_ISREG(ip->i_mode) && !S_ISFIFO(ip->i_mode)) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
/*
*zlpp = zl;
if (oidp == szp->z_id) /* We're a descendant of szp */
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
if (oidp == rootid) /* We've hit the top */
return (0);
if (tdip->i_sb != sdip->i_sb) {
ZFS_EXIT(zsb);
- return (EXDEV);
+ return (SET_ERROR(EXDEV));
}
tdzp = ITOZ(tdip);
if (zsb->z_utf8 && u8_validate(tnm,
strlen(tnm), NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
ZFS_EXIT(zsb);
- return (EILSEQ);
+ return (SET_ERROR(EILSEQ));
}
if (flags & FIGNORECASE)
*/
if ((tdzp->z_pflags & ZFS_XATTR) != (sdzp->z_pflags & ZFS_XATTR)) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
/*
*/
if (S_ISDIR(ZTOI(szp)->i_mode)) {
if (!S_ISDIR(ZTOI(tzp)->i_mode)) {
- error = ENOTDIR;
+ error = SET_ERROR(ENOTDIR);
goto out;
}
} else {
if (S_ISDIR(ZTOI(tzp)->i_mode)) {
- error = EISDIR;
+ error = SET_ERROR(EISDIR);
goto out;
}
}
if (zsb->z_utf8 && u8_validate(name, strlen(name),
NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
ZFS_EXIT(zsb);
- return (EILSEQ);
+ return (SET_ERROR(EILSEQ));
}
if (flags & FIGNORECASE)
zflg |= ZCILOOK;
if (len > MAXPATHLEN) {
ZFS_EXIT(zsb);
- return (ENAMETOOLONG);
+ return (SET_ERROR(ENAMETOOLONG));
}
if ((error = zfs_acl_ids_create(dzp, 0,
zfs_acl_ids_free(&acl_ids);
zfs_dirent_unlock(dl);
ZFS_EXIT(zsb);
- return (EDQUOT);
+ return (SET_ERROR(EDQUOT));
}
tx = dmu_tx_create(zsb->z_os);
fuid_dirtied = zsb->z_fuid_dirty;
*/
if (S_ISDIR(sip->i_mode)) {
ZFS_EXIT(zsb);
- return (EPERM);
+ return (SET_ERROR(EPERM));
}
if (sip->i_sb != tdip->i_sb) {
ZFS_EXIT(zsb);
- return (EXDEV);
+ return (SET_ERROR(EXDEV));
}
szp = ITOZ(sip);
}
if (parent == zsb->z_shares_dir) {
ZFS_EXIT(zsb);
- return (EPERM);
+ return (SET_ERROR(EPERM));
}
if (zsb->z_utf8 && u8_validate(name,
strlen(name), NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
ZFS_EXIT(zsb);
- return (EILSEQ);
+ return (SET_ERROR(EILSEQ));
}
#ifdef HAVE_PN_UTILS
if (flags & FIGNORECASE)
*/
if ((szp->z_pflags & ZFS_XATTR) != (dzp->z_pflags & ZFS_XATTR)) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
owner = zfs_fuid_map_id(zsb, szp->z_uid, cr, ZFS_OWNER);
if (owner != crgetuid(cr) && secpolicy_basic_link(cr) != 0) {
ZFS_EXIT(zsb);
- return (EPERM);
+ return (SET_ERROR(EPERM));
}
if ((error = zfs_zaccess(dzp, ACE_ADD_FILE, 0, B_FALSE, cr))) {
if (err) {
/* convert checksum errors into IO errors */
if (err == ECKSUM)
- err = EIO;
+ err = SET_ERROR(EIO);
return (err);
}
cur_pp = pl[++page_idx];
if ((vm_flags & VM_WRITE) && (zp->z_pflags &
(ZFS_IMMUTABLE | ZFS_READONLY | ZFS_APPENDONLY))) {
ZFS_EXIT(zsb);
- return (EPERM);
+ return (SET_ERROR(EPERM));
}
if ((vm_flags & (VM_READ | VM_EXEC)) &&
(zp->z_pflags & ZFS_AV_QUARANTINED)) {
ZFS_EXIT(zsb);
- return (EACCES);
+ return (SET_ERROR(EACCES));
}
if (off < 0 || len > MAXOFFSET_T - off) {
ZFS_EXIT(zsb);
- return (ENXIO);
+ return (SET_ERROR(ENXIO));
}
ZFS_EXIT(zsb);
case 0:
break;
default:
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
if (lckdat->l_start < 0)
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
switch (whence) {
case 1:
case 0:
break;
default:
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
lckdat->l_whence = (short)whence;
if (cmd != F_FREESP) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
if ((error = convoff(ip, bfp, 0, offset))) {
if (bfp->l_len < 0) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
/*
if (fidp->fid_len < size) {
fidp->fid_len = size;
ZFS_EXIT(zsb);
- return (ENOSPC);
+ return (SET_ERROR(ENOSPC));
}
zfid = (zfid_short_t *)fidp;
int preamble, postamble;
if (xuio->xu_type != UIOTYPE_ZEROCOPY)
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
ZFS_ENTER(zsb);
ZFS_VERIFY_ZP(zp);
blksz = max_blksz;
if (size < blksz || zp->z_blksz != blksz) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
/*
* Caller requests buffers for write before knowing where the
/* avoid potential complexity of dealing with it */
if (blksz > max_blksz) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
maxsize = zp->z_size - uio->uio_loffset;
if (size < blksz) {
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
break;
default:
ZFS_EXIT(zsb);
- return (EINVAL);
+ return (SET_ERROR(EINVAL));
}
uio->uio_extflg = UIO_XUIO;