]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Mar 2010 18:47:00 +0000 (10:47 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Mar 2010 18:47:00 +0000 (10:47 -0800)
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (36 commits)
  ext4: fix up rb_root initializations to use RB_ROOT
  ext4: Code cleanup for EXT4_IOC_MOVE_EXT ioctl
  ext4: Fix the NULL reference in double_down_write_data_sem()
  ext4: Fix insertion point of extent in mext_insert_across_blocks()
  ext4: consolidate in_range() definitions
  ext4: cleanup to use ext4_grp_offs_to_block()
  ext4: cleanup to use ext4_group_first_block_no()
  ext4: Release page references acquired in ext4_da_block_invalidatepages
  ext4: Fix ext4_quota_write cross block boundary behaviour
  ext4: Convert BUG_ON checks to use ext4_error() instead
  ext4: Use direct_IO_no_locking in ext4 dio read
  ext4: use ext4_get_block_write in buffer write
  ext4: mechanical rename some of the direct I/O get_block's identifiers
  ext4: make "offset" consistent in ext4_check_dir_entry()
  ext4: Handle non empty on-disk orphan link
  ext4: explicitly remove inode from orphan list after failed direct io
  ext4: fix error handling in migrate
  ext4: deprecate obsoleted mount options
  ext4: Fix fencepost error in chosing choosing group vs file preallocation.
  jbd2: clean up an assertion in jbd2_journal_commit_transaction()
  ...

1  2 
fs/ext4/ext4.h
fs/ext4/file.c

diff --combined fs/ext4/ext4.h
index 4cedc91ec59d79306dd307bd9f46a7be95931044,9b179163f1dee41bdca4586fb797e83649cee833..6e5787a29b90108be0b9711dff68e90c95aed8e2
  #define ext4_debug(f, a...)   do {} while (0)
  #endif
  
+ #define EXT4_ERROR_INODE(inode, fmt, a...) \
+       ext4_error_inode(__func__, (inode), (fmt), ## a);
+ #define EXT4_ERROR_FILE(file, fmt, a...)      \
+       ext4_error_file(__func__, (file), (fmt), ## a);
  /* data type for block offset of block group */
  typedef int ext4_grpblk_t;
  
@@@ -133,14 -139,14 +139,14 @@@ struct mpage_da_data 
        int pages_written;
        int retval;
  };
- #define       DIO_AIO_UNWRITTEN       0x1
+ #define       EXT4_IO_UNWRITTEN       0x1
  typedef struct ext4_io_end {
        struct list_head        list;           /* per-file finished AIO list */
        struct inode            *inode;         /* file being written to */
        unsigned int            flag;           /* unwritten or not */
-       int                     error;          /* I/O error code */
-       ext4_lblk_t             offset;         /* offset in the file */
-       size_t                  size;           /* size of the extent */
+       struct page             *page;          /* page struct for buffer write */
+       loff_t                  offset;         /* offset in the file */
+       ssize_t                 size;           /* size of the extent */
        struct work_struct      work;           /* data work queue */
  } ext4_io_end_t;
  
@@@ -284,10 -290,12 +290,12 @@@ struct flex_groups 
  #define EXT4_TOPDIR_FL                        0x00020000 /* Top of directory hierarchies*/
  #define EXT4_HUGE_FILE_FL               0x00040000 /* Set to each huge file */
  #define EXT4_EXTENTS_FL                       0x00080000 /* Inode uses extents */
+ #define EXT4_EA_INODE_FL              0x00200000 /* Inode used for large EA */
+ #define EXT4_EOFBLOCKS_FL             0x00400000 /* Blocks allocated beyond EOF */
  #define EXT4_RESERVED_FL              0x80000000 /* reserved for ext4 lib */
  
- #define EXT4_FL_USER_VISIBLE          0x000BDFFF /* User visible flags */
- #define EXT4_FL_USER_MODIFIABLE               0x000B80FF /* User modifiable flags */
+ #define EXT4_FL_USER_VISIBLE          0x004BDFFF /* User visible flags */
+ #define EXT4_FL_USER_MODIFIABLE               0x004B80FF /* User modifiable flags */
  
  /* Flags that should be inherited by new inodes from their parent. */
  #define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
@@@ -313,17 -321,6 +321,6 @@@ static inline __u32 ext4_mask_flags(umo
                return flags & EXT4_OTHER_FLMASK;
  }
  
- /*
-  * Inode dynamic state flags
-  */
- #define EXT4_STATE_JDATA              0x00000001 /* journaled data exists */
- #define EXT4_STATE_NEW                        0x00000002 /* inode is newly created */
- #define EXT4_STATE_XATTR              0x00000004 /* has in-inode xattrs */
- #define EXT4_STATE_NO_EXPAND          0x00000008 /* No space for expansion */
- #define EXT4_STATE_DA_ALLOC_CLOSE     0x00000010 /* Alloc DA blks on close */
- #define EXT4_STATE_EXT_MIGRATE                0x00000020 /* Inode is migrating */
- #define EXT4_STATE_DIO_UNWRITTEN      0x00000040 /* need convert on dio done*/
  /* Used to pass group descriptor data when online resize is done */
  struct ext4_new_group_input {
        __u32 group;            /* Group number for this data */
@@@ -364,19 -361,20 +361,20 @@@ struct ext4_new_group_data 
        /* caller is from the direct IO path, request to creation of an
        unitialized extents if not allocated, split the uninitialized
        extent if blocks has been preallocated already*/
- #define EXT4_GET_BLOCKS_DIO                   0x0008
+ #define EXT4_GET_BLOCKS_PRE_IO                        0x0008
  #define EXT4_GET_BLOCKS_CONVERT                       0x0010
- #define EXT4_GET_BLOCKS_DIO_CREATE_EXT                (EXT4_GET_BLOCKS_DIO|\
+ #define EXT4_GET_BLOCKS_IO_CREATE_EXT         (EXT4_GET_BLOCKS_PRE_IO|\
+                                        EXT4_GET_BLOCKS_CREATE_UNINIT_EXT)
+       /* Convert extent to initialized after IO complete */
+ #define EXT4_GET_BLOCKS_IO_CONVERT_EXT                (EXT4_GET_BLOCKS_CONVERT|\
                                         EXT4_GET_BLOCKS_CREATE_UNINIT_EXT)
-       /* Convert extent to initialized after direct IO complete */
- #define EXT4_GET_BLOCKS_DIO_CONVERT_EXT               (EXT4_GET_BLOCKS_CONVERT|\
-                                        EXT4_GET_BLOCKS_DIO_CREATE_EXT)
  
  /*
   * Flags used by ext4_free_blocks
   */
  #define EXT4_FREE_BLOCKS_METADATA     0x0001
  #define EXT4_FREE_BLOCKS_FORGET               0x0002
+ #define EXT4_FREE_BLOCKS_VALIDATED    0x0004
  
  /*
   * ioctl commands
@@@ -630,7 -628,7 +628,7 @@@ struct ext4_inode_info 
         * near to their parent directory's inode.
         */
        ext4_group_t    i_block_group;
-       __u32   i_state;                /* Dynamic state flags for ext4 */
+       unsigned long   i_state_flags;          /* Dynamic state flags */
  
        ext4_lblk_t             i_dir_start_lookup;
  #ifdef CONFIG_EXT4_FS_XATTR
        qsize_t i_reserved_quota;
  #endif
  
-       /* completed async DIOs that might need unwritten extents handling */
-       struct list_head i_aio_dio_complete_list;
+       /* completed IOs that might need unwritten extents handling */
+       struct list_head i_completed_io_list;
+       spinlock_t i_completed_io_lock;
        /* current io_end structure for async DIO write*/
        ext4_io_end_t *cur_aio_dio;
  
  #define EXT4_MOUNT_QUOTA              0x80000 /* Some quota option set */
  #define EXT4_MOUNT_USRQUOTA           0x100000 /* "old" user quota */
  #define EXT4_MOUNT_GRPQUOTA           0x200000 /* "old" group quota */
+ #define EXT4_MOUNT_DIOREAD_NOLOCK     0x400000 /* Enable support for dio read nolocking */
  #define EXT4_MOUNT_JOURNAL_CHECKSUM   0x800000 /* Journal checksums */
  #define EXT4_MOUNT_JOURNAL_ASYNC_COMMIT       0x1000000 /* Journal Async Commit */
  #define EXT4_MOUNT_I_VERSION            0x2000000 /* i_version support */
@@@ -1014,7 -1014,7 +1014,7 @@@ struct ext4_sb_info 
        atomic_t s_lock_busy;
  
        /* locality groups */
 -      struct ext4_locality_group *s_locality_groups;
 +      struct ext4_locality_group __percpu *s_locality_groups;
  
        /* for write statistics */
        unsigned long s_sectors_written_start;
@@@ -1050,6 -1050,34 +1050,34 @@@ static inline int ext4_valid_inum(struc
                (ino >= EXT4_FIRST_INO(sb) &&
                 ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count));
  }
+ /*
+  * Inode dynamic state flags
+  */
+ enum {
+       EXT4_STATE_JDATA,               /* journaled data exists */
+       EXT4_STATE_NEW,                 /* inode is newly created */
+       EXT4_STATE_XATTR,               /* has in-inode xattrs */
+       EXT4_STATE_NO_EXPAND,           /* No space for expansion */
+       EXT4_STATE_DA_ALLOC_CLOSE,      /* Alloc DA blks on close */
+       EXT4_STATE_EXT_MIGRATE,         /* Inode is migrating */
+       EXT4_STATE_DIO_UNWRITTEN,       /* need convert on dio done*/
+ };
+ static inline int ext4_test_inode_state(struct inode *inode, int bit)
+ {
+       return test_bit(bit, &EXT4_I(inode)->i_state_flags);
+ }
+ static inline void ext4_set_inode_state(struct inode *inode, int bit)
+ {
+       set_bit(bit, &EXT4_I(inode)->i_state_flags);
+ }
+ static inline void ext4_clear_inode_state(struct inode *inode, int bit)
+ {
+       clear_bit(bit, &EXT4_I(inode)->i_state_flags);
+ }
  #else
  /* Assume that user mode programs are passing in an ext4fs superblock, not
   * a kernel struct super_block.  This will allow us to call the feature-test
  #define EXT4_FEATURE_INCOMPAT_64BIT           0x0080
  #define EXT4_FEATURE_INCOMPAT_MMP               0x0100
  #define EXT4_FEATURE_INCOMPAT_FLEX_BG         0x0200
+ #define EXT4_FEATURE_INCOMPAT_EA_INODE                0x0400 /* EA in inode */
+ #define EXT4_FEATURE_INCOMPAT_DIRDATA         0x1000 /* data in dirent */
  
  #define EXT4_FEATURE_COMPAT_SUPP      EXT2_FEATURE_COMPAT_EXT_ATTR
  #define EXT4_FEATURE_INCOMPAT_SUPP    (EXT4_FEATURE_INCOMPAT_FILETYPE| \
@@@ -1439,7 -1469,7 +1469,7 @@@ extern int ext4_block_truncate_page(han
                struct address_space *mapping, loff_t from);
  extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
  extern qsize_t *ext4_get_reserved_space(struct inode *inode);
- extern int flush_aio_dio_completed_IO(struct inode *inode);
+ extern int flush_completed_IO(struct inode *inode);
  extern void ext4_da_update_reserve_space(struct inode *inode,
                                        int used, int quota_claim);
  /* ioctl.c */
@@@ -1465,13 -1495,20 +1495,20 @@@ extern int ext4_group_extend(struct sup
                                ext4_fsblk_t n_blocks_count);
  
  /* super.c */
- extern void ext4_error(struct super_block *, const char *, const char *, ...)
+ extern void __ext4_error(struct super_block *, const char *, const char *, ...)
+       __attribute__ ((format (printf, 3, 4)));
+ #define ext4_error(sb, message...)    __ext4_error(sb, __func__, ## message)
+ extern void ext4_error_inode(const char *, struct inode *, const char *, ...)
+       __attribute__ ((format (printf, 3, 4)));
+ extern void ext4_error_file(const char *, struct file *, const char *, ...)
        __attribute__ ((format (printf, 3, 4)));
  extern void __ext4_std_error(struct super_block *, const char *, int);
  extern void ext4_abort(struct super_block *, const char *, const char *, ...)
        __attribute__ ((format (printf, 3, 4)));
- extern void ext4_warning(struct super_block *, const char *, const char *, ...)
+ extern void __ext4_warning(struct super_block *, const char *,
+                         const char *, ...)
        __attribute__ ((format (printf, 3, 4)));
+ #define ext4_warning(sb, message...)  __ext4_warning(sb, __func__, ## message)
  extern void ext4_msg(struct super_block *, const char *, const char *, ...)
        __attribute__ ((format (printf, 3, 4)));
  extern void ext4_grp_locked_error(struct super_block *, ext4_group_t,
@@@ -1744,7 -1781,7 +1781,7 @@@ extern void ext4_ext_release(struct sup
  extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset,
                          loff_t len);
  extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset,
-                         loff_t len);
+                         ssize_t len);
  extern int ext4_get_blocks(handle_t *handle, struct inode *inode,
                           sector_t block, unsigned int max_blocks,
                           struct buffer_head *bh, int flags);
@@@ -1756,6 -1793,15 +1793,15 @@@ extern int ext4_move_extents(struct fil
                             __u64 len, __u64 *moved_len);
  
  
+ /* BH_Uninit flag: blocks are allocated but uninitialized on disk */
+ enum ext4_state_bits {
+       BH_Uninit       /* blocks are allocated but uninitialized on disk */
+         = BH_JBDPrivateStart,
+ };
+ BUFFER_FNS(Uninit, uninit)
+ TAS_BUFFER_FNS(Uninit, uninit)
  /*
   * Add new method to test wether block and inode bitmaps are properly
   * initialized. With uninit_bg reading the block from disk is not enough
@@@ -1773,6 -1819,8 +1819,8 @@@ static inline void set_bitmap_uptodate(
        set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
  }
  
+ #define in_range(b, first, len)       ((b) >= (first) && (b) <= (first) + (len) - 1)
  #endif        /* __KERNEL__ */
  
  #endif        /* _EXT4_H */
diff --combined fs/ext4/file.c
index 56eee3d796c2e7122e84e99e957ac7ff5cbd2dfd,f6071ce0b1553a7d973665dff42ef23ebc21cdcd..503a489274021f82c47533e8e58477859b51200b
@@@ -35,9 -35,9 +35,9 @@@
   */
  static int ext4_release_file(struct inode *inode, struct file *filp)
  {
-       if (EXT4_I(inode)->i_state & EXT4_STATE_DA_ALLOC_CLOSE) {
+       if (ext4_test_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE)) {
                ext4_alloc_da_blocks(inode);
-               EXT4_I(inode)->i_state &= ~EXT4_STATE_DA_ALLOC_CLOSE;
+               ext4_clear_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE);
        }
        /* if we are the last writer on the inode, drop the block reservation */
        if ((filp->f_mode & FMODE_WRITE) &&
@@@ -116,9 -116,11 +116,9 @@@ static int ext4_file_open(struct inode 
                 * devices or filesystem images.
                 */
                memset(buf, 0, sizeof(buf));
 -              path.mnt = mnt->mnt_parent;
 -              path.dentry = mnt->mnt_mountpoint;
 -              path_get(&path);
 +              path.mnt = mnt;
 +              path.dentry = mnt->mnt_root;
                cp = d_path(&path, buf, sizeof(buf));
 -              path_put(&path);
                if (!IS_ERR(cp)) {
                        memcpy(sbi->s_es->s_last_mounted, cp,
                               sizeof(sbi->s_es->s_last_mounted));