Make ZFS filesystem id persistent across different machines
[zfs.git] / module / zfs / zfs_vnops.c
index 74b96b8..7561434 100644 (file)
@@ -63,6 +63,7 @@
 #include <sys/sid.h>
 #include <sys/mode.h>
 #include "fs/fs_subr.h"
+#include <sys/zfs_ctldir.h>
 #include <sys/zfs_fuid.h>
 #include <sys/zfs_sa.h>
 #include <sys/zfs_vnops.h>
@@ -867,7 +868,7 @@ iput_async(struct inode *ip, taskq_t *taskq)
 {
        ASSERT(atomic_read(&ip->i_count) > 0);
        if (atomic_read(&ip->i_count) == 1)
-               taskq_dispatch(taskq, (task_func_t *)iput, ip, TQ_SLEEP);
+               taskq_dispatch(taskq, (task_func_t *)iput, ip, TQ_PUSHPAGE);
        else
                iput(ip);
 }
@@ -933,7 +934,7 @@ zfs_get_data(void *arg, lr_write_t *lr, char *buf, zio_t *zio)
                return (ENOENT);
        }
 
-       zgd = (zgd_t *)kmem_zalloc(sizeof (zgd_t), KM_SLEEP);
+       zgd = (zgd_t *)kmem_zalloc(sizeof (zgd_t), KM_PUSHPAGE);
        zgd->zgd_zilog = zsb->z_log;
        zgd->zgd_private = zp;
 
@@ -2045,7 +2046,7 @@ zfs_readdir(struct inode *ip, void *dirent, filldir_t filldir,
                        dmu_prefetch(os, objnum, 0, 0);
                }
 
-               if (*pos >= 2) {
+               if (*pos > 2 || (*pos == 2 && !zfs_show_ctldir(zp))) {
                        zap_cursor_advance(&zc);
                        *pos = zap_cursor_serialize(&zc);
                } else {
@@ -3796,6 +3797,7 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc)
        uint64_t        mtime[2], ctime[2];
        sa_bulk_attr_t  bulk[3];
        int             cnt = 0;
+       int             sync;
 
 
        ASSERT(PageLocked(pp));
@@ -3832,7 +3834,10 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc)
 
        tx = dmu_tx_create(zsb->z_os);
 
-       dmu_tx_callback_register(tx, zfs_putpage_commit_cb, pp);
+       sync = ((zsb->z_os->os_sync == ZFS_SYNC_ALWAYS) ||
+               (wbc->sync_mode == WB_SYNC_ALL));
+       if (!sync)
+               dmu_tx_callback_register(tx, zfs_putpage_commit_cb, pp);
 
        dmu_tx_hold_write(tx, zp->z_id, pgoff, pglen);
 
@@ -3861,9 +3866,10 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc)
        dmu_tx_commit(tx);
        ASSERT3S(err, ==, 0);
 
-       if ((zsb->z_os->os_sync == ZFS_SYNC_ALWAYS) ||
-           (wbc->sync_mode == WB_SYNC_ALL))
+       if (sync) {
                zil_commit(zsb->z_log, zp->z_id);
+               zfs_putpage_commit_cb(pp, err);
+       }
 
        return (err);
 }
@@ -3876,9 +3882,10 @@ zfs_inactive(struct inode *ip)
        zfs_sb_t *zsb = ITOZSB(ip);
        int error;
 
-#ifdef HAVE_SNAPSHOT
-       /* Early return for snapshot inode? */
-#endif /* HAVE_SNAPSHOT */
+       if (zfsctl_is_node(ip)) {
+               zfsctl_inode_inactive(ip);
+               return;
+       }
 
        rw_enter(&zsb->z_teardown_inactive_lock, RW_READER);
        if (zp->z_sa_hdl == NULL) {