diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/Kconfig | 2 | ||||
| -rw-r--r-- | fs/cifs/cifsproto.h | 1 | ||||
| -rw-r--r-- | fs/cifs/connect.c | 8 | ||||
| -rw-r--r-- | fs/cifs/inode.c | 7 | ||||
| -rw-r--r-- | fs/cifs/misc.c | 14 | ||||
| -rw-r--r-- | fs/cifs/readdir.c | 7 | ||||
| -rw-r--r-- | fs/compat.c | 2 | ||||
| -rw-r--r-- | fs/ext4/ext4.h | 1 | ||||
| -rw-r--r-- | fs/ext4/extents.c | 36 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 24 | ||||
| -rw-r--r-- | fs/ext4/namei.c | 16 | ||||
| -rw-r--r-- | fs/fuse/dir.c | 4 | ||||
| -rw-r--r-- | fs/fuse/file.c | 5 | ||||
| -rw-r--r-- | fs/nilfs2/ioctl.c | 33 | ||||
| -rw-r--r-- | fs/sysfs/dir.c | 4 |
15 files changed, 94 insertions, 70 deletions
diff --git a/fs/Kconfig b/fs/Kconfig index 2126078a38ed..64d44efad7a5 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
| @@ -135,7 +135,7 @@ config TMPFS_POSIX_ACL | |||
| 135 | 135 | ||
| 136 | config HUGETLBFS | 136 | config HUGETLBFS |
| 137 | bool "HugeTLB file system support" | 137 | bool "HugeTLB file system support" |
| 138 | depends on X86 || IA64 || PPC_BOOK3S_64 || SPARC64 || (S390 && 64BIT) || \ | 138 | depends on X86 || IA64 || SPARC64 || (S390 && 64BIT) || \ |
| 139 | SYS_SUPPORTS_HUGETLBFS || BROKEN | 139 | SYS_SUPPORTS_HUGETLBFS || BROKEN |
| 140 | help | 140 | help |
| 141 | hugetlbfs is a filesystem backing for HugeTLB pages, based on | 141 | hugetlbfs is a filesystem backing for HugeTLB pages, based on |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 6928c24d1d42..5646727e33f5 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
| @@ -388,4 +388,5 @@ extern int CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon, | |||
| 388 | const struct nls_table *nls_codepage, int remap_special_chars); | 388 | const struct nls_table *nls_codepage, int remap_special_chars); |
| 389 | extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, | 389 | extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, |
| 390 | const int netfid, __u64 *pExtAttrBits, __u64 *pMask); | 390 | const int netfid, __u64 *pExtAttrBits, __u64 *pMask); |
| 391 | extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb); | ||
| 391 | #endif /* _CIFSPROTO_H */ | 392 | #endif /* _CIFSPROTO_H */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index b09098079916..63ea83ff687f 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -2220,16 +2220,8 @@ is_path_accessible(int xid, struct cifsTconInfo *tcon, | |||
| 2220 | struct cifs_sb_info *cifs_sb, const char *full_path) | 2220 | struct cifs_sb_info *cifs_sb, const char *full_path) |
| 2221 | { | 2221 | { |
| 2222 | int rc; | 2222 | int rc; |
| 2223 | __u64 inode_num; | ||
| 2224 | FILE_ALL_INFO *pfile_info; | 2223 | FILE_ALL_INFO *pfile_info; |
| 2225 | 2224 | ||
| 2226 | rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num, | ||
| 2227 | cifs_sb->local_nls, | ||
| 2228 | cifs_sb->mnt_cifs_flags & | ||
| 2229 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 2230 | if (rc != -EOPNOTSUPP) | ||
| 2231 | return rc; | ||
| 2232 | |||
| 2233 | pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); | 2225 | pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); |
| 2234 | if (pfile_info == NULL) | 2226 | if (pfile_info == NULL) |
| 2235 | return -ENOMEM; | 2227 | return -ENOMEM; |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 5e2492535daa..cababd8a52df 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -512,13 +512,10 @@ int cifs_get_inode_info(struct inode **pinode, | |||
| 512 | cifs_sb->local_nls, | 512 | cifs_sb->local_nls, |
| 513 | cifs_sb->mnt_cifs_flags & | 513 | cifs_sb->mnt_cifs_flags & |
| 514 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 514 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 515 | if (rc1) { | 515 | if (rc1 || !fattr.cf_uniqueid) { |
| 516 | cFYI(1, ("GetSrvInodeNum rc %d", rc1)); | 516 | cFYI(1, ("GetSrvInodeNum rc %d", rc1)); |
| 517 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | 517 | fattr.cf_uniqueid = iunique(sb, ROOT_I); |
| 518 | /* disable serverino if call not supported */ | 518 | cifs_autodisable_serverino(cifs_sb); |
| 519 | if (rc1 == -EINVAL) | ||
| 520 | cifs_sb->mnt_cifs_flags &= | ||
| 521 | ~CIFS_MOUNT_SERVER_INUM; | ||
| 522 | } | 519 | } |
| 523 | } else { | 520 | } else { |
| 524 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | 521 | fattr.cf_uniqueid = iunique(sb, ROOT_I); |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 0241b25ac33f..1e25efcb55c8 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
| @@ -715,3 +715,17 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen, | |||
| 715 | ctoUCS_out: | 715 | ctoUCS_out: |
| 716 | return i; | 716 | return i; |
| 717 | } | 717 | } |
| 718 | |||
| 719 | void | ||
| 720 | cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) | ||
| 721 | { | ||
| 722 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { | ||
| 723 | cifs_sb->mnt_cifs_flags &= CIFS_MOUNT_SERVER_INUM; | ||
| 724 | cERROR(1, ("Autodisabling the use of server inode numbers on " | ||
| 725 | "%s. This server doesn't seem to support them " | ||
| 726 | "properly. Hardlinks will not be recognized on this " | ||
| 727 | "mount. Consider mounting with the \"noserverino\" " | ||
| 728 | "option to silence this message.", | ||
| 729 | cifs_sb->tcon->treeName)); | ||
| 730 | } | ||
| 731 | } | ||
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 1f098ca71636..f84062f9a985 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -727,11 +727,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir, | |||
| 727 | cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *) | 727 | cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *) |
| 728 | pfindEntry, cifs_sb); | 728 | pfindEntry, cifs_sb); |
| 729 | 729 | ||
| 730 | /* FIXME: make _to_fattr functions fill this out */ | 730 | if (inum && (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) { |
| 731 | if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO) | ||
| 732 | fattr.cf_uniqueid = inum; | 731 | fattr.cf_uniqueid = inum; |
| 733 | else | 732 | } else { |
| 734 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | 733 | fattr.cf_uniqueid = iunique(sb, ROOT_I); |
| 734 | cifs_autodisable_serverino(cifs_sb); | ||
| 735 | } | ||
| 735 | 736 | ||
| 736 | ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid); | 737 | ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid); |
| 737 | tmp_dentry = cifs_readdir_lookup(file->f_dentry, &qstring, &fattr); | 738 | tmp_dentry = cifs_readdir_lookup(file->f_dentry, &qstring, &fattr); |
diff --git a/fs/compat.c b/fs/compat.c index d576b552e8e2..6c19040ffeef 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1532,6 +1532,8 @@ int compat_do_execve(char * filename, | |||
| 1532 | if (retval < 0) | 1532 | if (retval < 0) |
| 1533 | goto out; | 1533 | goto out; |
| 1534 | 1534 | ||
| 1535 | current->stack_start = current->mm->start_stack; | ||
| 1536 | |||
| 1535 | /* execve succeeded */ | 1537 | /* execve succeeded */ |
| 1536 | current->fs->in_exec = 0; | 1538 | current->fs->in_exec = 0; |
| 1537 | current->in_execve = 0; | 1539 | current->in_execve = 0; |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 00d153f2f261..8825515eeddd 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -322,6 +322,7 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) | |||
| 322 | #define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */ | 322 | #define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */ |
| 323 | #define EXT4_STATE_DA_ALLOC_CLOSE 0x00000010 /* Alloc DA blks on close */ | 323 | #define EXT4_STATE_DA_ALLOC_CLOSE 0x00000010 /* Alloc DA blks on close */ |
| 324 | #define EXT4_STATE_EXT_MIGRATE 0x00000020 /* Inode is migrating */ | 324 | #define EXT4_STATE_EXT_MIGRATE 0x00000020 /* Inode is migrating */ |
| 325 | #define EXT4_STATE_DIO_UNWRITTEN 0x00000040 /* need convert on dio done*/ | ||
| 325 | 326 | ||
| 326 | /* Used to pass group descriptor data when online resize is done */ | 327 | /* Used to pass group descriptor data when online resize is done */ |
| 327 | struct ext4_new_group_input { | 328 | struct ext4_new_group_input { |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 10539e364283..715264b4bae4 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -2807,6 +2807,8 @@ fix_extent_len: | |||
| 2807 | * into three uninitialized extent(at most). After IO complete, the part | 2807 | * into three uninitialized extent(at most). After IO complete, the part |
| 2808 | * being filled will be convert to initialized by the end_io callback function | 2808 | * being filled will be convert to initialized by the end_io callback function |
| 2809 | * via ext4_convert_unwritten_extents(). | 2809 | * via ext4_convert_unwritten_extents(). |
| 2810 | * | ||
| 2811 | * Returns the size of uninitialized extent to be written on success. | ||
| 2810 | */ | 2812 | */ |
| 2811 | static int ext4_split_unwritten_extents(handle_t *handle, | 2813 | static int ext4_split_unwritten_extents(handle_t *handle, |
| 2812 | struct inode *inode, | 2814 | struct inode *inode, |
| @@ -2824,7 +2826,6 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 2824 | unsigned int allocated, ee_len, depth; | 2826 | unsigned int allocated, ee_len, depth; |
| 2825 | ext4_fsblk_t newblock; | 2827 | ext4_fsblk_t newblock; |
| 2826 | int err = 0; | 2828 | int err = 0; |
| 2827 | int ret = 0; | ||
| 2828 | 2829 | ||
| 2829 | ext_debug("ext4_split_unwritten_extents: inode %lu," | 2830 | ext_debug("ext4_split_unwritten_extents: inode %lu," |
| 2830 | "iblock %llu, max_blocks %u\n", inode->i_ino, | 2831 | "iblock %llu, max_blocks %u\n", inode->i_ino, |
| @@ -2842,12 +2843,12 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 2842 | ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); | 2843 | ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); |
| 2843 | 2844 | ||
| 2844 | /* | 2845 | /* |
| 2845 | * if the entire unintialized extent length less than | 2846 | * If the uninitialized extent begins at the same logical |
| 2846 | * the size of extent to write, there is no need to split | 2847 | * block where the write begins, and the write completely |
| 2847 | * uninitialized extent | 2848 | * covers the extent, then we don't need to split it. |
| 2848 | */ | 2849 | */ |
| 2849 | if (allocated <= max_blocks) | 2850 | if ((iblock == ee_block) && (allocated <= max_blocks)) |
| 2850 | return ret; | 2851 | return allocated; |
| 2851 | 2852 | ||
| 2852 | err = ext4_ext_get_access(handle, inode, path + depth); | 2853 | err = ext4_ext_get_access(handle, inode, path + depth); |
| 2853 | if (err) | 2854 | if (err) |
| @@ -3048,12 +3049,18 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
| 3048 | ret = ext4_split_unwritten_extents(handle, | 3049 | ret = ext4_split_unwritten_extents(handle, |
| 3049 | inode, path, iblock, | 3050 | inode, path, iblock, |
| 3050 | max_blocks, flags); | 3051 | max_blocks, flags); |
| 3051 | /* flag the io_end struct that we need convert when IO done */ | 3052 | /* |
| 3053 | * Flag the inode(non aio case) or end_io struct (aio case) | ||
| 3054 | * that this IO needs to convertion to written when IO is | ||
| 3055 | * completed | ||
| 3056 | */ | ||
| 3052 | if (io) | 3057 | if (io) |
| 3053 | io->flag = DIO_AIO_UNWRITTEN; | 3058 | io->flag = DIO_AIO_UNWRITTEN; |
| 3059 | else | ||
| 3060 | EXT4_I(inode)->i_state |= EXT4_STATE_DIO_UNWRITTEN; | ||
| 3054 | goto out; | 3061 | goto out; |
| 3055 | } | 3062 | } |
| 3056 | /* DIO end_io complete, convert the filled extent to written */ | 3063 | /* async DIO end_io complete, convert the filled extent to written */ |
| 3057 | if (flags == EXT4_GET_BLOCKS_DIO_CONVERT_EXT) { | 3064 | if (flags == EXT4_GET_BLOCKS_DIO_CONVERT_EXT) { |
| 3058 | ret = ext4_convert_unwritten_extents_dio(handle, inode, | 3065 | ret = ext4_convert_unwritten_extents_dio(handle, inode, |
| 3059 | path); | 3066 | path); |
| @@ -3295,10 +3302,16 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3295 | * To avoid unecessary convertion for every aio dio rewrite | 3302 | * To avoid unecessary convertion for every aio dio rewrite |
| 3296 | * to the mid of file, here we flag the IO that is really | 3303 | * to the mid of file, here we flag the IO that is really |
| 3297 | * need the convertion. | 3304 | * need the convertion. |
| 3298 | * | 3305 | * For non asycn direct IO case, flag the inode state |
| 3306 | * that we need to perform convertion when IO is done. | ||
| 3299 | */ | 3307 | */ |
| 3300 | if (io && flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) | 3308 | if (flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) { |
| 3301 | io->flag = DIO_AIO_UNWRITTEN; | 3309 | if (io) |
| 3310 | io->flag = DIO_AIO_UNWRITTEN; | ||
| 3311 | else | ||
| 3312 | EXT4_I(inode)->i_state |= | ||
| 3313 | EXT4_STATE_DIO_UNWRITTEN;; | ||
| 3314 | } | ||
| 3302 | } | 3315 | } |
| 3303 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); | 3316 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); |
| 3304 | if (err) { | 3317 | if (err) { |
| @@ -3519,6 +3532,7 @@ retry: | |||
| 3519 | * | 3532 | * |
| 3520 | * This function is called from the direct IO end io call back | 3533 | * This function is called from the direct IO end io call back |
| 3521 | * function, to convert the fallocated extents after IO is completed. | 3534 | * function, to convert the fallocated extents after IO is completed. |
| 3535 | * Returns 0 on success. | ||
| 3522 | */ | 3536 | */ |
| 3523 | int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, | 3537 | int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, |
| 3524 | loff_t len) | 3538 | loff_t len) |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 5c5bc5dafff8..2c8caa51addb 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -193,7 +193,7 @@ static int try_to_extend_transaction(handle_t *handle, struct inode *inode) | |||
| 193 | * so before we call here everything must be consistently dirtied against | 193 | * so before we call here everything must be consistently dirtied against |
| 194 | * this transaction. | 194 | * this transaction. |
| 195 | */ | 195 | */ |
| 196 | int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode, | 196 | int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode, |
| 197 | int nblocks) | 197 | int nblocks) |
| 198 | { | 198 | { |
| 199 | int ret; | 199 | int ret; |
| @@ -209,6 +209,7 @@ static int try_to_extend_transaction(handle_t *handle, struct inode *inode) | |||
| 209 | up_write(&EXT4_I(inode)->i_data_sem); | 209 | up_write(&EXT4_I(inode)->i_data_sem); |
| 210 | ret = ext4_journal_restart(handle, blocks_for_truncate(inode)); | 210 | ret = ext4_journal_restart(handle, blocks_for_truncate(inode)); |
| 211 | down_write(&EXT4_I(inode)->i_data_sem); | 211 | down_write(&EXT4_I(inode)->i_data_sem); |
| 212 | ext4_discard_preallocations(inode); | ||
| 212 | 213 | ||
| 213 | return ret; | 214 | return ret; |
| 214 | } | 215 | } |
| @@ -3445,8 +3446,6 @@ out: | |||
| 3445 | return ret; | 3446 | return ret; |
| 3446 | } | 3447 | } |
| 3447 | 3448 | ||
| 3448 | /* Maximum number of blocks we map for direct IO at once. */ | ||
| 3449 | |||
| 3450 | static int ext4_get_block_dio_write(struct inode *inode, sector_t iblock, | 3449 | static int ext4_get_block_dio_write(struct inode *inode, sector_t iblock, |
| 3451 | struct buffer_head *bh_result, int create) | 3450 | struct buffer_head *bh_result, int create) |
| 3452 | { | 3451 | { |
| @@ -3654,13 +3653,14 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | |||
| 3654 | ext4_io_end_t *io_end = iocb->private; | 3653 | ext4_io_end_t *io_end = iocb->private; |
| 3655 | struct workqueue_struct *wq; | 3654 | struct workqueue_struct *wq; |
| 3656 | 3655 | ||
| 3656 | /* if not async direct IO or dio with 0 bytes write, just return */ | ||
| 3657 | if (!io_end || !size) | ||
| 3658 | return; | ||
| 3659 | |||
| 3657 | ext_debug("ext4_end_io_dio(): io_end 0x%p" | 3660 | ext_debug("ext4_end_io_dio(): io_end 0x%p" |
| 3658 | "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", | 3661 | "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", |
| 3659 | iocb->private, io_end->inode->i_ino, iocb, offset, | 3662 | iocb->private, io_end->inode->i_ino, iocb, offset, |
| 3660 | size); | 3663 | size); |
| 3661 | /* if not async direct IO or dio with 0 bytes write, just return */ | ||
| 3662 | if (!io_end || !size) | ||
| 3663 | return; | ||
| 3664 | 3664 | ||
| 3665 | /* if not aio dio with unwritten extents, just free io and return */ | 3665 | /* if not aio dio with unwritten extents, just free io and return */ |
| 3666 | if (io_end->flag != DIO_AIO_UNWRITTEN){ | 3666 | if (io_end->flag != DIO_AIO_UNWRITTEN){ |
| @@ -3771,13 +3771,19 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | |||
| 3771 | if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) { | 3771 | if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) { |
| 3772 | ext4_free_io_end(iocb->private); | 3772 | ext4_free_io_end(iocb->private); |
| 3773 | iocb->private = NULL; | 3773 | iocb->private = NULL; |
| 3774 | } else if (ret > 0) | 3774 | } else if (ret > 0 && (EXT4_I(inode)->i_state & |
| 3775 | EXT4_STATE_DIO_UNWRITTEN)) { | ||
| 3776 | int err; | ||
| 3775 | /* | 3777 | /* |
| 3776 | * for non AIO case, since the IO is already | 3778 | * for non AIO case, since the IO is already |
| 3777 | * completed, we could do the convertion right here | 3779 | * completed, we could do the convertion right here |
| 3778 | */ | 3780 | */ |
| 3779 | ret = ext4_convert_unwritten_extents(inode, | 3781 | err = ext4_convert_unwritten_extents(inode, |
| 3780 | offset, ret); | 3782 | offset, ret); |
| 3783 | if (err < 0) | ||
| 3784 | ret = err; | ||
| 3785 | EXT4_I(inode)->i_state &= ~EXT4_STATE_DIO_UNWRITTEN; | ||
| 3786 | } | ||
| 3781 | return ret; | 3787 | return ret; |
| 3782 | } | 3788 | } |
| 3783 | 3789 | ||
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 7c8fe80bacdd..6d2c1b897fc7 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -1518,12 +1518,8 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1518 | return retval; | 1518 | return retval; |
| 1519 | 1519 | ||
| 1520 | if (blocks == 1 && !dx_fallback && | 1520 | if (blocks == 1 && !dx_fallback && |
| 1521 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) { | 1521 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) |
| 1522 | retval = make_indexed_dir(handle, dentry, inode, bh); | 1522 | return make_indexed_dir(handle, dentry, inode, bh); |
| 1523 | if (retval == -ENOSPC) | ||
| 1524 | brelse(bh); | ||
| 1525 | return retval; | ||
| 1526 | } | ||
| 1527 | brelse(bh); | 1523 | brelse(bh); |
| 1528 | } | 1524 | } |
| 1529 | bh = ext4_append(handle, dir, &block, &retval); | 1525 | bh = ext4_append(handle, dir, &block, &retval); |
| @@ -1532,10 +1528,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1532 | de = (struct ext4_dir_entry_2 *) bh->b_data; | 1528 | de = (struct ext4_dir_entry_2 *) bh->b_data; |
| 1533 | de->inode = 0; | 1529 | de->inode = 0; |
| 1534 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); | 1530 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); |
| 1535 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | 1531 | return add_dirent_to_buf(handle, dentry, inode, de, bh); |
| 1536 | if (retval == -ENOSPC) | ||
| 1537 | brelse(bh); | ||
| 1538 | return retval; | ||
| 1539 | } | 1532 | } |
| 1540 | 1533 | ||
| 1541 | /* | 1534 | /* |
| @@ -1664,8 +1657,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1664 | if (!de) | 1657 | if (!de) |
| 1665 | goto cleanup; | 1658 | goto cleanup; |
| 1666 | err = add_dirent_to_buf(handle, dentry, inode, de, bh); | 1659 | err = add_dirent_to_buf(handle, dentry, inode, de, bh); |
| 1667 | if (err != -ENOSPC) | 1660 | bh = NULL; |
| 1668 | bh = NULL; | ||
| 1669 | goto cleanup; | 1661 | goto cleanup; |
| 1670 | 1662 | ||
| 1671 | journal_error: | 1663 | journal_error: |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 992f6c9410bb..8ada78aade58 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
| @@ -712,8 +712,10 @@ static int fuse_rename(struct inode *olddir, struct dentry *oldent, | |||
| 712 | fuse_invalidate_attr(newdir); | 712 | fuse_invalidate_attr(newdir); |
| 713 | 713 | ||
| 714 | /* newent will end up negative */ | 714 | /* newent will end up negative */ |
| 715 | if (newent->d_inode) | 715 | if (newent->d_inode) { |
| 716 | fuse_invalidate_attr(newent->d_inode); | ||
| 716 | fuse_invalidate_entry_cache(newent); | 717 | fuse_invalidate_entry_cache(newent); |
| 718 | } | ||
| 717 | } else if (err == -EINTR) { | 719 | } else if (err == -EINTR) { |
| 718 | /* If request was interrupted, DEITY only knows if the | 720 | /* If request was interrupted, DEITY only knows if the |
| 719 | rename actually took place. If the invalidation | 721 | rename actually took place. If the invalidation |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index a3492f7d207c..c18913a777ae 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
| @@ -1063,7 +1063,8 @@ ssize_t fuse_direct_io(struct file *file, const char __user *buf, | |||
| 1063 | break; | 1063 | break; |
| 1064 | } | 1064 | } |
| 1065 | } | 1065 | } |
| 1066 | fuse_put_request(fc, req); | 1066 | if (!IS_ERR(req)) |
| 1067 | fuse_put_request(fc, req); | ||
| 1067 | if (res > 0) | 1068 | if (res > 0) |
| 1068 | *ppos = pos; | 1069 | *ppos = pos; |
| 1069 | 1070 | ||
| @@ -1599,7 +1600,7 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov, | |||
| 1599 | kaddr += copy; | 1600 | kaddr += copy; |
| 1600 | } | 1601 | } |
| 1601 | 1602 | ||
| 1602 | kunmap(map); | 1603 | kunmap(page); |
| 1603 | } | 1604 | } |
| 1604 | 1605 | ||
| 1605 | return 0; | 1606 | return 0; |
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 6572ea4bc4df..d24057d58f17 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
| @@ -297,7 +297,18 @@ static int nilfs_ioctl_move_inode_block(struct inode *inode, | |||
| 297 | (unsigned long long)vdesc->vd_vblocknr); | 297 | (unsigned long long)vdesc->vd_vblocknr); |
| 298 | return ret; | 298 | return ret; |
| 299 | } | 299 | } |
| 300 | bh->b_private = vdesc; | 300 | if (unlikely(!list_empty(&bh->b_assoc_buffers))) { |
| 301 | printk(KERN_CRIT "%s: conflicting %s buffer: ino=%llu, " | ||
| 302 | "cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu\n", | ||
| 303 | __func__, vdesc->vd_flags ? "node" : "data", | ||
| 304 | (unsigned long long)vdesc->vd_ino, | ||
| 305 | (unsigned long long)vdesc->vd_cno, | ||
| 306 | (unsigned long long)vdesc->vd_offset, | ||
| 307 | (unsigned long long)vdesc->vd_blocknr, | ||
| 308 | (unsigned long long)vdesc->vd_vblocknr); | ||
| 309 | brelse(bh); | ||
| 310 | return -EEXIST; | ||
| 311 | } | ||
| 301 | list_add_tail(&bh->b_assoc_buffers, buffers); | 312 | list_add_tail(&bh->b_assoc_buffers, buffers); |
| 302 | return 0; | 313 | return 0; |
| 303 | } | 314 | } |
| @@ -335,24 +346,10 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs, | |||
| 335 | list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { | 346 | list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { |
| 336 | ret = nilfs_gccache_wait_and_mark_dirty(bh); | 347 | ret = nilfs_gccache_wait_and_mark_dirty(bh); |
| 337 | if (unlikely(ret < 0)) { | 348 | if (unlikely(ret < 0)) { |
| 338 | if (ret == -EEXIST) { | 349 | WARN_ON(ret == -EEXIST); |
| 339 | vdesc = bh->b_private; | ||
| 340 | printk(KERN_CRIT | ||
| 341 | "%s: conflicting %s buffer: " | ||
| 342 | "ino=%llu, cno=%llu, offset=%llu, " | ||
| 343 | "blocknr=%llu, vblocknr=%llu\n", | ||
| 344 | __func__, | ||
| 345 | vdesc->vd_flags ? "node" : "data", | ||
| 346 | (unsigned long long)vdesc->vd_ino, | ||
| 347 | (unsigned long long)vdesc->vd_cno, | ||
| 348 | (unsigned long long)vdesc->vd_offset, | ||
| 349 | (unsigned long long)vdesc->vd_blocknr, | ||
| 350 | (unsigned long long)vdesc->vd_vblocknr); | ||
| 351 | } | ||
| 352 | goto failed; | 350 | goto failed; |
| 353 | } | 351 | } |
| 354 | list_del_init(&bh->b_assoc_buffers); | 352 | list_del_init(&bh->b_assoc_buffers); |
| 355 | bh->b_private = NULL; | ||
| 356 | brelse(bh); | 353 | brelse(bh); |
| 357 | } | 354 | } |
| 358 | return nmembs; | 355 | return nmembs; |
| @@ -360,7 +357,6 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs, | |||
| 360 | failed: | 357 | failed: |
| 361 | list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { | 358 | list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { |
| 362 | list_del_init(&bh->b_assoc_buffers); | 359 | list_del_init(&bh->b_assoc_buffers); |
| 363 | bh->b_private = NULL; | ||
| 364 | brelse(bh); | 360 | brelse(bh); |
| 365 | } | 361 | } |
| 366 | return ret; | 362 | return ret; |
| @@ -471,7 +467,6 @@ int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *nilfs, | |||
| 471 | return 0; | 467 | return 0; |
| 472 | 468 | ||
| 473 | failed: | 469 | failed: |
| 474 | nilfs_remove_all_gcinode(nilfs); | ||
| 475 | printk(KERN_ERR "NILFS: GC failed during preparation: %s: err=%d\n", | 470 | printk(KERN_ERR "NILFS: GC failed during preparation: %s: err=%d\n", |
| 476 | msg, ret); | 471 | msg, ret); |
| 477 | return ret; | 472 | return ret; |
| @@ -560,6 +555,8 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, | |||
| 560 | else | 555 | else |
| 561 | ret = nilfs_clean_segments(inode->i_sb, argv, kbufs); | 556 | ret = nilfs_clean_segments(inode->i_sb, argv, kbufs); |
| 562 | 557 | ||
| 558 | if (ret < 0) | ||
| 559 | nilfs_remove_all_gcinode(nilfs); | ||
| 563 | clear_nilfs_gc_running(nilfs); | 560 | clear_nilfs_gc_running(nilfs); |
| 564 | 561 | ||
| 565 | out_free: | 562 | out_free: |
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 5fad489ce5bc..e0201837d244 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/completion.h> | 21 | #include <linux/completion.h> |
| 22 | #include <linux/mutex.h> | 22 | #include <linux/mutex.h> |
| 23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| 24 | #include <linux/security.h> | ||
| 24 | #include "sysfs.h" | 25 | #include "sysfs.h" |
| 25 | 26 | ||
| 26 | DEFINE_MUTEX(sysfs_mutex); | 27 | DEFINE_MUTEX(sysfs_mutex); |
| @@ -285,6 +286,9 @@ void release_sysfs_dirent(struct sysfs_dirent * sd) | |||
| 285 | sysfs_put(sd->s_symlink.target_sd); | 286 | sysfs_put(sd->s_symlink.target_sd); |
| 286 | if (sysfs_type(sd) & SYSFS_COPY_NAME) | 287 | if (sysfs_type(sd) & SYSFS_COPY_NAME) |
| 287 | kfree(sd->s_name); | 288 | kfree(sd->s_name); |
| 289 | if (sd->s_iattr && sd->s_iattr->ia_secdata) | ||
| 290 | security_release_secctx(sd->s_iattr->ia_secdata, | ||
| 291 | sd->s_iattr->ia_secdata_len); | ||
| 288 | kfree(sd->s_iattr); | 292 | kfree(sd->s_iattr); |
| 289 | sysfs_free_ino(sd->s_ino); | 293 | sysfs_free_ino(sd->s_ino); |
| 290 | kmem_cache_free(sysfs_dir_cachep, sd); | 294 | kmem_cache_free(sysfs_dir_cachep, sd); |
