Skip to content

Commit

Permalink
Illumos 4638 - Panic in ZFS via rfs3_setattr()/rfs3_write(): dirtying…
Browse files Browse the repository at this point in the history
… snapshot!

4638 Panic in ZFS via rfs3_setattr()/rfs3_write(): dirtying snapshot!
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Ilya Usvyatsky <ilya.usvyatsky@nexenta.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Garrett D'Amore <garrett@damore.org>

References:
  https://www.illumos.org/issues/4638
  illumos/illumos-gate@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 <behlendorf1@llnl.gov>
  • Loading branch information
mtelka authored and behlendorf committed Jan 11, 2016
1 parent 53e0313 commit f3c9dca
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions module/zfs/zfs_vnops.c
Expand Up @@ -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.
*/

Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit f3c9dca

Please sign in to comment.