Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6-microblaze.git] / fs / btrfs / ctree.h
index d130065..1d3c1e4 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/dynamic_debug.h>
 #include <linux/refcount.h>
 #include <linux/crc32c.h>
+#include <linux/iomap.h>
 #include "extent-io-tree.h"
 #include "extent_io.h"
 #include "extent_map.h"
@@ -65,12 +66,6 @@ struct btrfs_ref;
 
 #define BTRFS_OLDEST_GENERATION        0ULL
 
-/*
- * the max metadata block size.  This limit is somewhat artificial,
- * but the memmove costs go through the roof for larger blocks.
- */
-#define BTRFS_MAX_METADATA_BLOCKSIZE 65536
-
 /*
  * we can actually store much bigger names, but lets not confuse the rest
  * of linux
@@ -369,11 +364,9 @@ struct btrfs_path {
        unsigned int search_for_split:1;
        unsigned int keep_locks:1;
        unsigned int skip_locking:1;
-       unsigned int leave_spinning:1;
        unsigned int search_commit_root:1;
        unsigned int need_commit_sem:1;
        unsigned int skip_release_on_error:1;
-       unsigned int recurse:1;
 };
 #define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
                                        sizeof(struct btrfs_item))
@@ -468,10 +461,11 @@ struct btrfs_discard_ctl {
        struct btrfs_block_group *block_group;
        struct list_head discard_list[BTRFS_NR_DISCARD_LISTS];
        u64 prev_discard;
+       u64 prev_discard_time;
        atomic_t discardable_extents;
        atomic64_t discardable_bytes;
        u64 max_discard_size;
-       unsigned long delay;
+       u64 delay_ms;
        u32 iops_limit;
        u32 kbps_limit;
        u64 discard_extent_bytes;
@@ -558,6 +552,9 @@ enum {
 
        /* Indicate that the discard workqueue can service discards. */
        BTRFS_FS_DISCARD_RUNNING,
+
+       /* Indicate that we need to cleanup space cache v1 */
+       BTRFS_FS_CLEANUP_SPACE_CACHE_V1,
 };
 
 /*
@@ -911,6 +908,7 @@ struct btrfs_fs_info {
 
        /* Extent buffer radix tree */
        spinlock_t buffer_lock;
+       /* Entries are eb->start / sectorsize */
        struct radix_tree_root buffer_radix;
 
        /* next backup root to be overwritten */
@@ -933,6 +931,10 @@ struct btrfs_fs_info {
        /* Cached block sizes */
        u32 nodesize;
        u32 sectorsize;
+       /* ilog2 of sectorsize, use to avoid 64bit division */
+       u32 sectorsize_bits;
+       u32 csum_size;
+       u32 csums_per_leaf;
        u32 stripesize;
 
        /* Block groups and devices containing active swapfiles. */
@@ -950,6 +952,18 @@ struct btrfs_fs_info {
        /* Type of exclusive operation running */
        unsigned long exclusive_operation;
 
+       /*
+        * Zone size > 0 when in ZONED mode, otherwise it's used for a check
+        * if the mode is enabled
+        */
+       union {
+               u64 zone_size;
+               u64 zoned;
+       };
+
+       /* Max size to emit ZONE_APPEND write command */
+       u64 max_zone_append_size;
+
 #ifdef CONFIG_BTRFS_FS_REF_VERIFY
        spinlock_t ref_verify_lock;
        struct rb_root block_tree;
@@ -1020,7 +1034,7 @@ enum {
        BTRFS_ROOT_DEAD_RELOC_TREE,
        /* Mark dead root stored on device whose cleanup needs to be resumed */
        BTRFS_ROOT_DEAD_TREE,
-       /* The root has a log tree. Used only for subvolume roots. */
+       /* The root has a log tree. Used for subvolume roots and the tree root. */
        BTRFS_ROOT_HAS_LOG_TREE,
        /* Qgroup flushing is in progress */
        BTRFS_ROOT_QGROUP_FLUSHING,
@@ -1059,15 +1073,6 @@ struct btrfs_root {
        spinlock_t accounting_lock;
        struct btrfs_block_rsv *block_rsv;
 
-       /* free ino cache stuff */
-       struct btrfs_free_space_ctl *free_ino_ctl;
-       enum btrfs_caching_type ino_cache_state;
-       spinlock_t ino_cache_lock;
-       wait_queue_head_t ino_cache_wait;
-       struct btrfs_free_space_ctl *free_ino_pinned;
-       u64 ino_cache_progress;
-       struct inode *ino_cache_inode;
-
        struct mutex log_mutex;
        wait_queue_head_t log_writer_wait;
        wait_queue_head_t log_commit_wait[2];
@@ -1226,6 +1231,63 @@ struct btrfs_replace_extent_info {
        int insertions;
 };
 
+/* Arguments for btrfs_drop_extents() */
+struct btrfs_drop_extents_args {
+       /* Input parameters */
+
+       /*
+        * If NULL, btrfs_drop_extents() will allocate and free its own path.
+        * If 'replace_extent' is true, this must not be NULL. Also the path
+        * is always released except if 'replace_extent' is true and
+        * btrfs_drop_extents() sets 'extent_inserted' to true, in which case
+        * the path is kept locked.
+        */
+       struct btrfs_path *path;
+       /* Start offset of the range to drop extents from */
+       u64 start;
+       /* End (exclusive, last byte + 1) of the range to drop extents from */
+       u64 end;
+       /* If true drop all the extent maps in the range */
+       bool drop_cache;
+       /*
+        * If true it means we want to insert a new extent after dropping all
+        * the extents in the range. If this is true, the 'extent_item_size'
+        * parameter must be set as well and the 'extent_inserted' field will
+        * be set to true by btrfs_drop_extents() if it could insert the new
+        * extent.
+        * Note: when this is set to true the path must not be NULL.
+        */
+       bool replace_extent;
+       /*
+        * Used if 'replace_extent' is true. Size of the file extent item to
+        * insert after dropping all existing extents in the range
+        */
+       u32 extent_item_size;
+
+       /* Output parameters */
+
+       /*
+        * Set to the minimum between the input parameter 'end' and the end
+        * (exclusive, last byte + 1) of the last dropped extent. This is always
+        * set even if btrfs_drop_extents() returns an error.
+        */
+       u64 drop_end;
+       /*
+        * The number of allocated bytes found in the range. This can be smaller
+        * than the range's length when there are holes in the range.
+        */
+       u64 bytes_found;
+       /*
+        * Only set if 'replace_extent' is true. Set to true if we were able
+        * to insert a replacement extent after dropping all extents in the
+        * range, otherwise set to false by btrfs_drop_extents().
+        * Also, if btrfs_drop_extents() has set this to true it means it
+        * returned with the path locked, otherwise if it has set this to
+        * false it has returned with the path released.
+        */
+       bool extent_inserted;
+};
+
 struct btrfs_file_private {
        void *filldir_buf;
 };
@@ -1284,7 +1346,7 @@ static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info)
 #define BTRFS_MOUNT_USER_SUBVOL_RM_ALLOWED (1 << 14)
 #define BTRFS_MOUNT_ENOSPC_DEBUG        (1 << 15)
 #define BTRFS_MOUNT_AUTO_DEFRAG                (1 << 16)
-#define BTRFS_MOUNT_INODE_MAP_CACHE    (1 << 17)
+/* bit 17 is free */
 #define BTRFS_MOUNT_USEBACKUPROOT      (1 << 18)
 #define BTRFS_MOUNT_SKIP_BALANCE       (1 << 19)
 #define BTRFS_MOUNT_CHECK_INTEGRITY    (1 << 20)
@@ -1297,6 +1359,8 @@ static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info)
 #define BTRFS_MOUNT_NOLOGREPLAY                (1 << 27)
 #define BTRFS_MOUNT_REF_VERIFY         (1 << 28)
 #define BTRFS_MOUNT_DISCARD_ASYNC      (1 << 29)
+#define BTRFS_MOUNT_IGNOREBADROOTS     (1 << 30)
+#define BTRFS_MOUNT_IGNOREDATACSUMS    (1 << 31)
 
 #define BTRFS_DEFAULT_COMMIT_INTERVAL  (30)
 #define BTRFS_DEFAULT_MAX_INLINE       (2048)
@@ -1329,9 +1393,7 @@ do {                                                                      \
  * transaction commit)
  */
 
-#define BTRFS_PENDING_SET_INODE_MAP_CACHE      (0)
-#define BTRFS_PENDING_CLEAR_INODE_MAP_CACHE    (1)
-#define BTRFS_PENDING_COMMIT                   (2)
+#define BTRFS_PENDING_COMMIT                   (0)
 
 #define btrfs_test_pending(info, opt)  \
        test_bit(BTRFS_PENDING_##opt, &(info)->pending_changes)
@@ -1404,7 +1466,7 @@ struct btrfs_map_token {
 };
 
 #define BTRFS_BYTES_TO_BLKS(fs_info, bytes) \
-                               ((bytes) >> (fs_info)->sb->s_blocksize_bits)
+                               ((bytes) >> (fs_info)->sectorsize_bits)
 
 static inline void btrfs_init_map_token(struct btrfs_map_token *token,
                                        struct extent_buffer *eb)
@@ -1489,13 +1551,14 @@ static inline void btrfs_set_token_##name(struct btrfs_map_token *token,\
 #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits)            \
 static inline u##bits btrfs_##name(const struct extent_buffer *eb)     \
 {                                                                      \
-       const type *p = page_address(eb->pages[0]);                     \
+       const type *p = page_address(eb->pages[0]) +                    \
+                       offset_in_page(eb->start);                      \
        return get_unaligned_le##bits(&p->member);                      \
 }                                                                      \
 static inline void btrfs_set_##name(const struct extent_buffer *eb,    \
                                    u##bits val)                        \
 {                                                                      \
-       type *p = page_address(eb->pages[0]);                           \
+       type *p = page_address(eb->pages[0]) + offset_in_page(eb->start); \
        put_unaligned_le##bits(val, &p->member);                        \
 }
 
@@ -2085,6 +2148,7 @@ BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
 BTRFS_SETGET_STACK_FUNCS(root_generation, struct btrfs_root_item,
                         generation, 64);
 BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
+BTRFS_SETGET_STACK_FUNCS(root_drop_level, struct btrfs_root_item, drop_level, 8);
 BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
 BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
 BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
@@ -2517,7 +2581,17 @@ int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb,
                                     enum btrfs_inline_ref_type is_data);
 u64 hash_extent_data_ref(u64 root_objectid, u64 owner, u64 offset);
 
-u64 btrfs_csum_bytes_to_leaves(struct btrfs_fs_info *fs_info, u64 csum_bytes);
+/*
+ * Take the number of bytes to be checksummmed and figure out how many leaves
+ * it would require to store the csums for that many bytes.
+ */
+static inline u64 btrfs_csum_bytes_to_leaves(
+                       const struct btrfs_fs_info *fs_info, u64 csum_bytes)
+{
+       const u64 num_csums = csum_bytes >> fs_info->sectorsize_bits;
+
+       return DIV_ROUND_UP_ULL(num_csums, fs_info->csums_per_leaf);
+}
 
 /*
  * Use this if we would be adding new items, as we could split nodes as we cow
@@ -2592,7 +2666,6 @@ int btrfs_free_reserved_extent(struct btrfs_fs_info *fs_info,
                               u64 start, u64 len, int delalloc);
 int btrfs_pin_reserved_extent(struct btrfs_trans_handle *trans, u64 start,
                              u64 len);
-void btrfs_prepare_extent_commit(struct btrfs_fs_info *fs_info);
 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans);
 int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
                         struct btrfs_ref *generic_ref);
@@ -2939,8 +3012,7 @@ struct btrfs_inode_extref *btrfs_find_name_in_ext_backref(
 struct btrfs_dio_private;
 int btrfs_del_csums(struct btrfs_trans_handle *trans,
                    struct btrfs_root *root, u64 bytenr, u64 len);
-blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio,
-                                  u64 offset, u8 *dst);
+blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, u8 *dst);
 int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
                             struct btrfs_root *root,
                             u64 objectid, u64 pos,
@@ -2967,13 +3039,13 @@ int btrfs_inode_clear_file_extent_range(struct btrfs_inode *inode, u64 start,
                                        u64 len);
 int btrfs_inode_set_file_extent_range(struct btrfs_inode *inode, u64 start,
                                      u64 len);
-void btrfs_inode_safe_disk_i_size_write(struct inode *inode, u64 new_i_size);
+void btrfs_inode_safe_disk_i_size_write(struct btrfs_inode *inode, u64 new_i_size);
 u64 btrfs_file_extent_end(const struct btrfs_path *path);
 
 /* inode.c */
 blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio,
                                   int mirror_num, unsigned long bio_flags);
-int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u64 phy_offset,
+int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset,
                           struct page *page, u64 start, u64 end, int mirror);
 struct extent_map *btrfs_get_extent_fiemap(struct btrfs_inode *inode,
                                           u64 start, u64 len);
@@ -2993,11 +3065,11 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
                   struct btrfs_inode *parent_inode, struct btrfs_inode *inode,
                   const char *name, int name_len, int add_backref, u64 index);
 int btrfs_delete_subvolume(struct inode *dir, struct dentry *dentry);
-int btrfs_truncate_block(struct inode *inode, loff_t from, loff_t len,
-                       int front);
+int btrfs_truncate_block(struct btrfs_inode *inode, loff_t from, loff_t len,
+                        int front);
 int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
                               struct btrfs_root *root,
-                              struct inode *inode, u64 new_size,
+                              struct btrfs_inode *inode, u64 new_size,
                               u32 min_type);
 
 int btrfs_start_delalloc_snapshot(struct btrfs_root *root);
@@ -3037,14 +3109,13 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
                                    struct page *page, size_t pg_offset,
                                    u64 start, u64 end);
 int btrfs_update_inode(struct btrfs_trans_handle *trans,
-                             struct btrfs_root *root,
-                             struct inode *inode);
+                      struct btrfs_root *root, struct btrfs_inode *inode);
 int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans,
-                               struct btrfs_root *root, struct inode *inode);
+                               struct btrfs_root *root, struct btrfs_inode *inode);
 int btrfs_orphan_add(struct btrfs_trans_handle *trans,
                struct btrfs_inode *inode);
 int btrfs_orphan_cleanup(struct btrfs_root *root);
-int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size);
+int btrfs_cont_expand(struct btrfs_inode *inode, loff_t oldsize, loff_t size);
 void btrfs_add_delayed_iput(struct inode *inode);
 void btrfs_run_delayed_iputs(struct btrfs_fs_info *fs_info);
 int btrfs_wait_on_delayed_iputs(struct btrfs_fs_info *fs_info);
@@ -3062,7 +3133,18 @@ int btrfs_writepage_cow_fixup(struct page *page, u64 start, u64 end);
 void btrfs_writepage_endio_finish_ordered(struct page *page, u64 start,
                                          u64 end, int uptodate);
 extern const struct dentry_operations btrfs_dentry_operations;
-ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter);
+extern const struct iomap_ops btrfs_dio_iomap_ops;
+extern const struct iomap_dio_ops btrfs_dio_ops;
+
+/* Inode locking type flags, by default the exclusive lock is taken */
+#define BTRFS_ILOCK_SHARED     (1U << 0)
+#define BTRFS_ILOCK_TRY        (1U << 1)
+
+int btrfs_inode_lock(struct inode *inode, unsigned int ilock_flags);
+void btrfs_inode_unlock(struct inode *inode, unsigned int ilock_flags);
+void btrfs_update_inode_bytes(struct btrfs_inode *inode,
+                             const u64 add_bytes,
+                             const u64 del_bytes);
 
 /* ioctl.c */
 long btrfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
@@ -3092,16 +3174,9 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync);
 void btrfs_drop_extent_cache(struct btrfs_inode *inode, u64 start, u64 end,
                             int skip_pinned);
 extern const struct file_operations btrfs_file_operations;
-int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
-                        struct btrfs_root *root, struct btrfs_inode *inode,
-                        struct btrfs_path *path, u64 start, u64 end,
-                        u64 *drop_end, int drop_cache,
-                        int replace_extent,
-                        u32 extent_item_size,
-                        int *key_inserted);
 int btrfs_drop_extents(struct btrfs_trans_handle *trans,
-                      struct btrfs_root *root, struct inode *inode, u64 start,
-                      u64 end, int drop_cache);
+                      struct btrfs_root *root, struct btrfs_inode *inode,
+                      struct btrfs_drop_extents_args *args);
 int btrfs_replace_file_extents(struct inode *inode, struct btrfs_path *path,
                           const u64 start, const u64 end,
                           struct btrfs_replace_extent_info *extent_info,
@@ -3111,7 +3186,7 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
 int btrfs_release_file(struct inode *inode, struct file *file);
 int btrfs_dirty_pages(struct btrfs_inode *inode, struct page **pages,
                      size_t num_pages, loff_t pos, size_t write_bytes,
-                     struct extent_state **cached);
+                     struct extent_state **cached, bool noreserve);
 int btrfs_fdatawrite_range(struct inode *inode, loff_t start, loff_t end);
 int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos,
                           size_t *write_bytes);
@@ -3290,6 +3365,39 @@ static inline void assertfail(const char *expr, const char* file, int line) { }
 #define ASSERT(expr)   (void)(expr)
 #endif
 
+/*
+ * Get the correct offset inside the page of extent buffer.
+ *
+ * @eb:                target extent buffer
+ * @start:     offset inside the extent buffer
+ *
+ * Will handle both sectorsize == PAGE_SIZE and sectorsize < PAGE_SIZE cases.
+ */
+static inline size_t get_eb_offset_in_page(const struct extent_buffer *eb,
+                                          unsigned long offset)
+{
+       /*
+        * For sectorsize == PAGE_SIZE case, eb->start will always be aligned
+        * to PAGE_SIZE, thus adding it won't cause any difference.
+        *
+        * For sectorsize < PAGE_SIZE, we must only read the data that belongs
+        * to the eb, thus we have to take the eb->start into consideration.
+        */
+       return offset_in_page(offset + eb->start);
+}
+
+static inline unsigned long get_eb_page_index(unsigned long offset)
+{
+       /*
+        * For sectorsize == PAGE_SIZE case, plain >> PAGE_SHIFT is enough.
+        *
+        * For sectorsize < PAGE_SIZE case, we only support 64K PAGE_SIZE,
+        * and have ensured that all tree blocks are contained in one page,
+        * thus we always get index == 0.
+        */
+       return offset >> PAGE_SHIFT;
+}
+
 /*
  * Use that for functions that are conditionally exported for sanity tests but
  * otherwise static
@@ -3599,4 +3707,9 @@ static inline int btrfs_is_testing(struct btrfs_fs_info *fs_info)
 }
 #endif
 
+static inline bool btrfs_is_zoned(const struct btrfs_fs_info *fs_info)
+{
+       return fs_info->zoned != 0;
+}
+
 #endif