From: Marcel Telka Date: Sun, 10 Jan 2016 22:31:24 +0000 (+0100) Subject: Illumos 4638 - Panic in ZFS via rfs3_setattr()/rfs3_write(): dirtying snapshot! X-Git-Tag: zfs-0.7.0-rc1~318 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3c9dca0937a7ca4fde2e47093cdae69f92dfb07;p=zfs Illumos 4638 - Panic in ZFS via rfs3_setattr()/rfs3_write(): dirtying snapshot! 4638 Panic in ZFS via rfs3_setattr()/rfs3_write(): dirtying snapshot! Reviewed by: Alek Pinchuk Reviewed by: Ilya Usvyatsky Reviewed by: Dan McDonald Reviewed by: Matthew Ahrens Reviewed by: Garrett D'Amore Approved by: Garrett D'Amore References: https://www.illumos.org/issues/4638 https://github.com/illumos/illumos-gate/commit/2144b12 Porting notes: - [module/zfs/zfs_vnops.c] - 3558fd7 Prototype/structure update for Linux - 2cf7f52 Linux compat 2.6.39: mount_nodev() - Use zfs_is_readonly() wrapper - Remove first line of comment which doesn't apply Ported-by: kernelOfTruth kerneloftruth@gmail.com Signed-off-by: Brian Behlendorf --- diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index 174c918ab..64412a69d 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013 by Delphix. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2015 by Chunwei Chen. All rights reserved. */ @@ -621,6 +622,15 @@ zfs_write(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr) SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), NULL, &zp->z_pflags, 8); + /* + * Callers might not be able to detect properly that we are read-only, + * so check it explicitly here. + */ + if (zfs_is_readonly(zsb)) { + ZFS_EXIT(zsb); + return (SET_ERROR(EROFS)); + } + /* * If immutable or not appending then return EPERM */ @@ -4378,6 +4388,15 @@ zfs_space(struct inode *ip, int cmd, flock64_t *bfp, int flag, return (SET_ERROR(EINVAL)); } + /* + * Callers might not be able to detect properly that we are read-only, + * so check it explicitly here. + */ + if (zfs_is_readonly(zsb)) { + ZFS_EXIT(zsb); + return (SET_ERROR(EROFS)); + } + if ((error = convoff(ip, bfp, 0, offset))) { ZFS_EXIT(zsb); return (error);