Btrfs: Add mount -o compress-force
[pandora-kernel.git] / fs / btrfs / inode.c
index da76cad..f46c572 100644 (file)
@@ -483,7 +483,8 @@ again:
                nr_pages_ret = 0;
 
                /* flag the file so we don't compress in the future */
-               BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
+               if (!btrfs_test_opt(root, FORCE_COMPRESS))
+                       BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
        }
        if (will_compress) {
                *num_added += 1;
@@ -3796,6 +3797,12 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
 
        if (location.type == BTRFS_INODE_ITEM_KEY) {
                inode = btrfs_iget(dir->i_sb, &location, root);
+               if (unlikely(root->clean_orphans) &&
+                   !(inode->i_sb->s_flags & MS_RDONLY)) {
+                       down_read(&root->fs_info->cleanup_work_sem);
+                       btrfs_orphan_cleanup(root);
+                       up_read(&root->fs_info->cleanup_work_sem);
+               }
                return inode;
        }
 
@@ -3995,7 +4002,11 @@ skip:
 
        /* Reached end of directory/root. Bump pos past the last item. */
        if (key_type == BTRFS_DIR_INDEX_KEY)
-               filp->f_pos = INT_LIMIT(off_t);
+               /*
+                * 32-bit glibc will use getdents64, but then strtol -
+                * so the last number we can serve is this.
+                */
+               filp->f_pos = 0x7fffffff;
        else
                filp->f_pos++;
 nopos:
@@ -5802,23 +5813,23 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
        while (num_bytes > 0) {
                alloc_size = min(num_bytes, root->fs_info->max_extent);
 
+               trans = btrfs_start_transaction(root, 1);
+
                ret = btrfs_reserve_extent(trans, root, alloc_size,
                                           root->sectorsize, 0, alloc_hint,
                                           (u64)-1, &ins, 1);
                if (ret) {
                        WARN_ON(1);
-                       break;
+                       goto stop_trans;
                }
 
                ret = btrfs_reserve_metadata_space(root, 3);
                if (ret) {
                        btrfs_free_reserved_extent(root, ins.objectid,
                                                   ins.offset);
-                       break;
+                       goto stop_trans;
                }
 
-               trans = btrfs_start_transaction(root, 1);
-
                ret = insert_reserved_file_extent(trans, inode,
                                                  cur_offset, ins.objectid,
                                                  ins.offset, ins.offset,
@@ -5847,6 +5858,11 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
                btrfs_unreserve_metadata_space(root, 3);
        }
        return ret;
+
+stop_trans:
+       btrfs_end_transaction(trans, root);
+       return ret;
+
 }
 
 static long btrfs_fallocate(struct inode *inode, int mode,