diff options
Diffstat (limited to 'module')
-rw-r--r-- | module/os/linux/zfs/zfs_acl.c | 4 | ||||
-rw-r--r-- | module/zfs/zfs_rlock.c | 15 |
2 files changed, 17 insertions, 2 deletions
diff --git a/module/os/linux/zfs/zfs_acl.c b/module/os/linux/zfs/zfs_acl.c index 67efee175..4c21350c0 100644 --- a/module/os/linux/zfs/zfs_acl.c +++ b/module/os/linux/zfs/zfs_acl.c @@ -2159,8 +2159,8 @@ static int zfs_zaccess_dataset_check(znode_t *zp, uint32_t v4_mode) { if ((v4_mode & WRITE_MASK) && (zfs_is_readonly(ZTOZSB(zp))) && - (!S_ISDEV(ZTOI(zp)->i_mode) || - (S_ISDEV(ZTOI(zp)->i_mode) && (v4_mode & WRITE_MASK_ATTRS)))) { + (!Z_ISDEV(ZTOI(zp)->i_mode) || + (Z_ISDEV(ZTOI(zp)->i_mode) && (v4_mode & WRITE_MASK_ATTRS)))) { return (SET_ERROR(EROFS)); } diff --git a/module/zfs/zfs_rlock.c b/module/zfs/zfs_rlock.c index 3158f4320..091b37f9f 100644 --- a/module/zfs/zfs_rlock.c +++ b/module/zfs/zfs_rlock.c @@ -38,6 +38,20 @@ * rangelock_reduce(lr, off, len); // optional * rangelock_exit(lr); * + * Range locking rules + * -------------------- + * 1. When truncating a file (zfs_create, zfs_setattr, zfs_space) the whole + * file range needs to be locked as RL_WRITER. Only then can the pages be + * freed etc and zp_size reset. zp_size must be set within range lock. + * 2. For writes and punching holes (zfs_write & zfs_space) just the range + * being written or freed needs to be locked as RL_WRITER. + * Multiple writes at the end of the file must coordinate zp_size updates + * to ensure data isn't lost. A compare and swap loop is currently used + * to ensure the file size is at least the offset last written. + * 3. For reads (zfs_read, zfs_get_data & zfs_putapage) just the range being + * read needs to be locked as RL_READER. A check against zp_size can then + * be made for reading beyond end of file. + * * AVL tree * -------- * An AVL tree is used to maintain the state of the existing ranges @@ -99,6 +113,7 @@ #include <sys/zfs_context.h> #include <sys/zfs_rlock.h> + /* * AVL comparison function used to order range locks * Locks are ordered on the start offset of the range. |