* Cached values of inode properties
         */
        unsigned prop_compress;         /* per-file compression algorithm */
+       /*
+        * Force compression on the file using the defrag ioctl, could be
+        * different from prop_compress and takes precedence if set
+        */
+       unsigned defrag_compress;
 
        struct btrfs_delayed_node *delayed_node;
 
 
        /* bad compression ratios */
        if (BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS)
                return 0;
+       /* defrag ioctl */
+       if (BTRFS_I(inode)->defrag_compress)
+               return 1;
        if (btrfs_test_opt(fs_info, COMPRESS) ||
            BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS ||
            BTRFS_I(inode)->prop_compress)
                        goto cont;
                }
 
-               if (BTRFS_I(inode)->prop_compress)
+               if (BTRFS_I(inode)->defrag_compress)
+                       compress_type = BTRFS_I(inode)->defrag_compress;
+               else if (BTRFS_I(inode)->prop_compress)
                        compress_type = BTRFS_I(inode)->prop_compress;
 
                /*
 
        ei->runtime_flags = 0;
        ei->prop_compress = BTRFS_COMPRESS_NONE;
+       ei->defrag_compress = BTRFS_COMPRESS_NONE;
 
        ei->delayed_node = NULL;
 
 
 
                inode_lock(inode);
                if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)
-                       BTRFS_I(inode)->prop_compress = compress_type;
+                       BTRFS_I(inode)->defrag_compress = compress_type;
                ret = cluster_pages_for_defrag(inode, pages, i, cluster);
                if (ret < 0) {
                        inode_unlock(inode);
 out_ra:
        if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) {
                inode_lock(inode);
-               BTRFS_I(inode)->prop_compress = BTRFS_COMPRESS_NONE;
+               BTRFS_I(inode)->defrag_compress = BTRFS_COMPRESS_NONE;
                inode_unlock(inode);
        }
        if (!file)