Print this page
6385 Fix unlocking order in zfs_zget
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Andriy Gapon <avg@freebsd.org>
Approved by: Robert Mustacchi <rm@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/zfs_znode.c
          +++ new/usr/src/uts/common/fs/zfs/zfs_znode.c
↓ open down ↓ 1140 lines elided ↑ open up ↑
1141 1141  
1142 1142                  mutex_enter(&zp->z_lock);
1143 1143                  ASSERT3U(zp->z_id, ==, obj_num);
1144 1144                  if (zp->z_unlinked) {
1145 1145                          err = SET_ERROR(ENOENT);
1146 1146                  } else {
1147 1147                          VN_HOLD(ZTOV(zp));
1148 1148                          *zpp = zp;
1149 1149                          err = 0;
1150 1150                  }
1151      -                sa_buf_rele(db, NULL);
1152 1151                  mutex_exit(&zp->z_lock);
     1152 +                sa_buf_rele(db, NULL);
1153 1153                  ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
1154 1154                  return (err);
1155 1155          }
1156 1156  
1157 1157          /*
1158 1158           * Not found create new znode/vnode
1159 1159           * but only if file exists.
1160 1160           *
1161 1161           * There is a small window where zfs_vget() could
1162 1162           * find this object while a file create is still in
↓ open down ↓ 967 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX