diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/bfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/bio.c | 20 | ||||
| -rw-r--r-- | fs/dcache.c | 11 | ||||
| -rw-r--r-- | fs/efs/inode.c | 2 | ||||
| -rw-r--r-- | fs/gfs2/glock.c | 8 | ||||
| -rw-r--r-- | fs/gfs2/glops.c | 18 | ||||
| -rw-r--r-- | fs/gfs2/inode.c | 6 | ||||
| -rw-r--r-- | fs/gfs2/main.c | 2 | ||||
| -rw-r--r-- | fs/hugetlbfs/inode.c | 8 | ||||
| -rw-r--r-- | fs/namespace.c | 2 | ||||
| -rw-r--r-- | fs/nilfs2/segbuf.c | 5 | ||||
| -rw-r--r-- | fs/proc/fd.c | 2 | ||||
| -rw-r--r-- | fs/proc/generic.c | 2 | ||||
| -rw-r--r-- | fs/proc/root.c | 4 |
14 files changed, 59 insertions, 33 deletions
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 5e376bb93419..8defc6b3f9a2 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
| @@ -40,7 +40,7 @@ struct inode *bfs_iget(struct super_block *sb, unsigned long ino) | |||
| 40 | int block, off; | 40 | int block, off; |
| 41 | 41 | ||
| 42 | inode = iget_locked(sb, ino); | 42 | inode = iget_locked(sb, ino); |
| 43 | if (IS_ERR(inode)) | 43 | if (!inode) |
| 44 | return ERR_PTR(-ENOMEM); | 44 | return ERR_PTR(-ENOMEM); |
| 45 | if (!(inode->i_state & I_NEW)) | 45 | if (!(inode->i_state & I_NEW)) |
| 46 | return inode; | 46 | return inode; |
| @@ -1045,12 +1045,22 @@ static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs, | |||
| 1045 | int bio_uncopy_user(struct bio *bio) | 1045 | int bio_uncopy_user(struct bio *bio) |
| 1046 | { | 1046 | { |
| 1047 | struct bio_map_data *bmd = bio->bi_private; | 1047 | struct bio_map_data *bmd = bio->bi_private; |
| 1048 | int ret = 0; | 1048 | struct bio_vec *bvec; |
| 1049 | int ret = 0, i; | ||
| 1049 | 1050 | ||
| 1050 | if (!bio_flagged(bio, BIO_NULL_MAPPED)) | 1051 | if (!bio_flagged(bio, BIO_NULL_MAPPED)) { |
| 1051 | ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, | 1052 | /* |
| 1052 | bmd->nr_sgvecs, bio_data_dir(bio) == READ, | 1053 | * if we're in a workqueue, the request is orphaned, so |
| 1053 | 0, bmd->is_our_pages); | 1054 | * don't copy into a random user address space, just free. |
| 1055 | */ | ||
| 1056 | if (current->mm) | ||
| 1057 | ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, | ||
| 1058 | bmd->nr_sgvecs, bio_data_dir(bio) == READ, | ||
| 1059 | 0, bmd->is_our_pages); | ||
| 1060 | else if (bmd->is_our_pages) | ||
| 1061 | bio_for_each_segment_all(bvec, bio, i) | ||
| 1062 | __free_page(bvec->bv_page); | ||
| 1063 | } | ||
| 1054 | bio_free_map_data(bmd); | 1064 | bio_free_map_data(bmd); |
| 1055 | bio_put(bio); | 1065 | bio_put(bio); |
| 1056 | return ret; | 1066 | return ret; |
diff --git a/fs/dcache.c b/fs/dcache.c index 87bdb5329c3c..83cfb834db03 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen, | |||
| 2724 | return memcpy(buffer, temp, sz); | 2724 | return memcpy(buffer, temp, sz); |
| 2725 | } | 2725 | } |
| 2726 | 2726 | ||
| 2727 | char *simple_dname(struct dentry *dentry, char *buffer, int buflen) | ||
| 2728 | { | ||
| 2729 | char *end = buffer + buflen; | ||
| 2730 | /* these dentries are never renamed, so d_lock is not needed */ | ||
| 2731 | if (prepend(&end, &buflen, " (deleted)", 11) || | ||
| 2732 | prepend_name(&end, &buflen, &dentry->d_name) || | ||
| 2733 | prepend(&end, &buflen, "/", 1)) | ||
| 2734 | end = ERR_PTR(-ENAMETOOLONG); | ||
| 2735 | return end; | ||
| 2736 | } | ||
| 2737 | |||
| 2727 | /* | 2738 | /* |
| 2728 | * Write full pathname from the root of the filesystem into the buffer. | 2739 | * Write full pathname from the root of the filesystem into the buffer. |
| 2729 | */ | 2740 | */ |
diff --git a/fs/efs/inode.c b/fs/efs/inode.c index f3913eb2c474..d15ccf20f1b3 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c | |||
| @@ -57,7 +57,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino) | |||
| 57 | struct inode *inode; | 57 | struct inode *inode; |
| 58 | 58 | ||
| 59 | inode = iget_locked(super, ino); | 59 | inode = iget_locked(super, ino); |
| 60 | if (IS_ERR(inode)) | 60 | if (!inode) |
| 61 | return ERR_PTR(-ENOMEM); | 61 | return ERR_PTR(-ENOMEM); |
| 62 | if (!(inode->i_state & I_NEW)) | 62 | if (!(inode->i_state & I_NEW)) |
| 63 | return inode; | 63 | return inode; |
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 9435384562a2..544a809819c3 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
| @@ -1838,14 +1838,14 @@ int __init gfs2_glock_init(void) | |||
| 1838 | 1838 | ||
| 1839 | glock_workqueue = alloc_workqueue("glock_workqueue", WQ_MEM_RECLAIM | | 1839 | glock_workqueue = alloc_workqueue("glock_workqueue", WQ_MEM_RECLAIM | |
| 1840 | WQ_HIGHPRI | WQ_FREEZABLE, 0); | 1840 | WQ_HIGHPRI | WQ_FREEZABLE, 0); |
| 1841 | if (IS_ERR(glock_workqueue)) | 1841 | if (!glock_workqueue) |
| 1842 | return PTR_ERR(glock_workqueue); | 1842 | return -ENOMEM; |
| 1843 | gfs2_delete_workqueue = alloc_workqueue("delete_workqueue", | 1843 | gfs2_delete_workqueue = alloc_workqueue("delete_workqueue", |
| 1844 | WQ_MEM_RECLAIM | WQ_FREEZABLE, | 1844 | WQ_MEM_RECLAIM | WQ_FREEZABLE, |
| 1845 | 0); | 1845 | 0); |
| 1846 | if (IS_ERR(gfs2_delete_workqueue)) { | 1846 | if (!gfs2_delete_workqueue) { |
| 1847 | destroy_workqueue(glock_workqueue); | 1847 | destroy_workqueue(glock_workqueue); |
| 1848 | return PTR_ERR(gfs2_delete_workqueue); | 1848 | return -ENOMEM; |
| 1849 | } | 1849 | } |
| 1850 | 1850 | ||
| 1851 | register_shrinker(&glock_shrinker); | 1851 | register_shrinker(&glock_shrinker); |
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 5f2e5224c51c..e2e0a90396e7 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
| @@ -47,7 +47,8 @@ static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh) | |||
| 47 | * None of the buffers should be dirty, locked, or pinned. | 47 | * None of the buffers should be dirty, locked, or pinned. |
| 48 | */ | 48 | */ |
| 49 | 49 | ||
| 50 | static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | 50 | static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync, |
| 51 | unsigned int nr_revokes) | ||
| 51 | { | 52 | { |
| 52 | struct gfs2_sbd *sdp = gl->gl_sbd; | 53 | struct gfs2_sbd *sdp = gl->gl_sbd; |
| 53 | struct list_head *head = &gl->gl_ail_list; | 54 | struct list_head *head = &gl->gl_ail_list; |
| @@ -57,7 +58,9 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | |||
| 57 | 58 | ||
| 58 | gfs2_log_lock(sdp); | 59 | gfs2_log_lock(sdp); |
| 59 | spin_lock(&sdp->sd_ail_lock); | 60 | spin_lock(&sdp->sd_ail_lock); |
| 60 | list_for_each_entry_safe(bd, tmp, head, bd_ail_gl_list) { | 61 | list_for_each_entry_safe_reverse(bd, tmp, head, bd_ail_gl_list) { |
| 62 | if (nr_revokes == 0) | ||
| 63 | break; | ||
| 61 | bh = bd->bd_bh; | 64 | bh = bd->bd_bh; |
| 62 | if (bh->b_state & b_state) { | 65 | if (bh->b_state & b_state) { |
| 63 | if (fsync) | 66 | if (fsync) |
| @@ -65,6 +68,7 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | |||
| 65 | gfs2_ail_error(gl, bh); | 68 | gfs2_ail_error(gl, bh); |
| 66 | } | 69 | } |
| 67 | gfs2_trans_add_revoke(sdp, bd); | 70 | gfs2_trans_add_revoke(sdp, bd); |
| 71 | nr_revokes--; | ||
| 68 | } | 72 | } |
| 69 | GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count)); | 73 | GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count)); |
| 70 | spin_unlock(&sdp->sd_ail_lock); | 74 | spin_unlock(&sdp->sd_ail_lock); |
| @@ -91,7 +95,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) | |||
| 91 | WARN_ON_ONCE(current->journal_info); | 95 | WARN_ON_ONCE(current->journal_info); |
| 92 | current->journal_info = &tr; | 96 | current->journal_info = &tr; |
| 93 | 97 | ||
| 94 | __gfs2_ail_flush(gl, 0); | 98 | __gfs2_ail_flush(gl, 0, tr.tr_revokes); |
| 95 | 99 | ||
| 96 | gfs2_trans_end(sdp); | 100 | gfs2_trans_end(sdp); |
| 97 | gfs2_log_flush(sdp, NULL); | 101 | gfs2_log_flush(sdp, NULL); |
| @@ -101,15 +105,19 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | |||
| 101 | { | 105 | { |
| 102 | struct gfs2_sbd *sdp = gl->gl_sbd; | 106 | struct gfs2_sbd *sdp = gl->gl_sbd; |
| 103 | unsigned int revokes = atomic_read(&gl->gl_ail_count); | 107 | unsigned int revokes = atomic_read(&gl->gl_ail_count); |
| 108 | unsigned int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64); | ||
| 104 | int ret; | 109 | int ret; |
| 105 | 110 | ||
| 106 | if (!revokes) | 111 | if (!revokes) |
| 107 | return; | 112 | return; |
| 108 | 113 | ||
| 109 | ret = gfs2_trans_begin(sdp, 0, revokes); | 114 | while (revokes > max_revokes) |
| 115 | max_revokes += (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header)) / sizeof(u64); | ||
| 116 | |||
| 117 | ret = gfs2_trans_begin(sdp, 0, max_revokes); | ||
| 110 | if (ret) | 118 | if (ret) |
| 111 | return; | 119 | return; |
| 112 | __gfs2_ail_flush(gl, fsync); | 120 | __gfs2_ail_flush(gl, fsync, max_revokes); |
| 113 | gfs2_trans_end(sdp); | 121 | gfs2_trans_end(sdp); |
| 114 | gfs2_log_flush(sdp, NULL); | 122 | gfs2_log_flush(sdp, NULL); |
| 115 | } | 123 | } |
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index bbb2715171cd..64915eeae5a7 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
| @@ -594,7 +594,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, | |||
| 594 | } | 594 | } |
| 595 | gfs2_glock_dq_uninit(ghs); | 595 | gfs2_glock_dq_uninit(ghs); |
| 596 | if (IS_ERR(d)) | 596 | if (IS_ERR(d)) |
| 597 | return PTR_RET(d); | 597 | return PTR_ERR(d); |
| 598 | return error; | 598 | return error; |
| 599 | } else if (error != -ENOENT) { | 599 | } else if (error != -ENOENT) { |
| 600 | goto fail_gunlock; | 600 | goto fail_gunlock; |
| @@ -1750,6 +1750,10 @@ static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name, | |||
| 1750 | struct gfs2_holder gh; | 1750 | struct gfs2_holder gh; |
| 1751 | int ret; | 1751 | int ret; |
| 1752 | 1752 | ||
| 1753 | /* For selinux during lookup */ | ||
| 1754 | if (gfs2_glock_is_locked_by_me(ip->i_gl)) | ||
| 1755 | return generic_getxattr(dentry, name, data, size); | ||
| 1756 | |||
| 1753 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); | 1757 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); |
| 1754 | ret = gfs2_glock_nq(&gh); | 1758 | ret = gfs2_glock_nq(&gh); |
| 1755 | if (ret == 0) { | 1759 | if (ret == 0) { |
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c index e04d0e09ee7b..7b0f5043cf24 100644 --- a/fs/gfs2/main.c +++ b/fs/gfs2/main.c | |||
| @@ -155,7 +155,7 @@ static int __init init_gfs2_fs(void) | |||
| 155 | goto fail_wq; | 155 | goto fail_wq; |
| 156 | 156 | ||
| 157 | gfs2_control_wq = alloc_workqueue("gfs2_control", | 157 | gfs2_control_wq = alloc_workqueue("gfs2_control", |
| 158 | WQ_NON_REENTRANT | WQ_UNBOUND | WQ_FREEZABLE, 0); | 158 | WQ_UNBOUND | WQ_FREEZABLE, 0); |
| 159 | if (!gfs2_control_wq) | 159 | if (!gfs2_control_wq) |
| 160 | goto fail_recovery; | 160 | goto fail_recovery; |
| 161 | 161 | ||
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 34423978b170..d19b30ababf1 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -926,14 +926,8 @@ static int get_hstate_idx(int page_size_log) | |||
| 926 | return h - hstates; | 926 | return h - hstates; |
| 927 | } | 927 | } |
| 928 | 928 | ||
| 929 | static char *hugetlb_dname(struct dentry *dentry, char *buffer, int buflen) | ||
| 930 | { | ||
| 931 | return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)", | ||
| 932 | dentry->d_name.name); | ||
| 933 | } | ||
| 934 | |||
| 935 | static struct dentry_operations anon_ops = { | 929 | static struct dentry_operations anon_ops = { |
| 936 | .d_dname = hugetlb_dname | 930 | .d_dname = simple_dname |
| 937 | }; | 931 | }; |
| 938 | 932 | ||
| 939 | /* | 933 | /* |
diff --git a/fs/namespace.c b/fs/namespace.c index 7b1ca9ba0b0a..a45ba4f267fe 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -1429,7 +1429,7 @@ struct vfsmount *collect_mounts(struct path *path) | |||
| 1429 | CL_COPY_ALL | CL_PRIVATE); | 1429 | CL_COPY_ALL | CL_PRIVATE); |
| 1430 | namespace_unlock(); | 1430 | namespace_unlock(); |
| 1431 | if (IS_ERR(tree)) | 1431 | if (IS_ERR(tree)) |
| 1432 | return NULL; | 1432 | return ERR_CAST(tree); |
| 1433 | return &tree->mnt; | 1433 | return &tree->mnt; |
| 1434 | } | 1434 | } |
| 1435 | 1435 | ||
diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index dc9a913784ab..2d8be51f90dc 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c | |||
| @@ -345,8 +345,7 @@ static void nilfs_end_bio_write(struct bio *bio, int err) | |||
| 345 | 345 | ||
| 346 | if (err == -EOPNOTSUPP) { | 346 | if (err == -EOPNOTSUPP) { |
| 347 | set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); | 347 | set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); |
| 348 | bio_put(bio); | 348 | /* to be detected by nilfs_segbuf_submit_bio() */ |
| 349 | /* to be detected by submit_seg_bio() */ | ||
| 350 | } | 349 | } |
| 351 | 350 | ||
| 352 | if (!uptodate) | 351 | if (!uptodate) |
| @@ -377,12 +376,12 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, | |||
| 377 | bio->bi_private = segbuf; | 376 | bio->bi_private = segbuf; |
| 378 | bio_get(bio); | 377 | bio_get(bio); |
| 379 | submit_bio(mode, bio); | 378 | submit_bio(mode, bio); |
| 379 | segbuf->sb_nbio++; | ||
| 380 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) { | 380 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) { |
| 381 | bio_put(bio); | 381 | bio_put(bio); |
| 382 | err = -EOPNOTSUPP; | 382 | err = -EOPNOTSUPP; |
| 383 | goto failed; | 383 | goto failed; |
| 384 | } | 384 | } |
| 385 | segbuf->sb_nbio++; | ||
| 386 | bio_put(bio); | 385 | bio_put(bio); |
| 387 | 386 | ||
| 388 | wi->bio = NULL; | 387 | wi->bio = NULL; |
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index 75f2890abbd8..0ff80f9b930f 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c | |||
| @@ -230,8 +230,6 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx, | |||
| 230 | 230 | ||
| 231 | if (!dir_emit_dots(file, ctx)) | 231 | if (!dir_emit_dots(file, ctx)) |
| 232 | goto out; | 232 | goto out; |
| 233 | if (!dir_emit_dots(file, ctx)) | ||
| 234 | goto out; | ||
| 235 | files = get_files_struct(p); | 233 | files = get_files_struct(p); |
| 236 | if (!files) | 234 | if (!files) |
| 237 | goto out; | 235 | goto out; |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 94441a407337..737e15615b04 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
| @@ -271,7 +271,7 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *file, | |||
| 271 | de = next; | 271 | de = next; |
| 272 | } while (de); | 272 | } while (de); |
| 273 | spin_unlock(&proc_subdir_lock); | 273 | spin_unlock(&proc_subdir_lock); |
| 274 | return 0; | 274 | return 1; |
| 275 | } | 275 | } |
| 276 | 276 | ||
| 277 | int proc_readdir(struct file *file, struct dir_context *ctx) | 277 | int proc_readdir(struct file *file, struct dir_context *ctx) |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 229e366598da..e0a790da726d 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
| @@ -205,7 +205,9 @@ static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentr | |||
| 205 | static int proc_root_readdir(struct file *file, struct dir_context *ctx) | 205 | static int proc_root_readdir(struct file *file, struct dir_context *ctx) |
| 206 | { | 206 | { |
| 207 | if (ctx->pos < FIRST_PROCESS_ENTRY) { | 207 | if (ctx->pos < FIRST_PROCESS_ENTRY) { |
| 208 | proc_readdir(file, ctx); | 208 | int error = proc_readdir(file, ctx); |
| 209 | if (unlikely(error <= 0)) | ||
| 210 | return error; | ||
| 209 | ctx->pos = FIRST_PROCESS_ENTRY; | 211 | ctx->pos = FIRST_PROCESS_ENTRY; |
| 210 | } | 212 | } |
| 211 | 213 | ||
