Pull vfs fixes from Al Viro: "Assorted fixes from the last week or so" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: VFS: collect_mounts() should return an ERR_PTR bfs: iget_locked() doesn't return an ERR_PTR efs: iget_locked() doesn't return an ERR_PTR() proc: kill the extra proc_readfd_common()->dir_emit_dots() cope with potentially long ->d_dname() output for shmem/hugetlb
Unified · Split
| @@ -40,7 +40,7 @@ struct inode *bfs_iget(struct super_block *sb, unsigned long ino) · 39 unmodified lines | ||
| 40 | 40 | int block, off; |
| 41 | 41 | |
| 42 | 42 | inode = iget_locked(sb, ino); |
| 43 | − if (IS_ERR(inode)) | |
| 43 | + if (!inode) | |
| 44 | 44 | return ERR_PTR(-ENOMEM); |
| 45 | 45 | if (!(inode->i_state & I_NEW)) |
| 46 | 46 | return inode; |
| @@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen, · 2723 unmodified lines | ||
| 2724 | 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 | 2739 | * Write full pathname from the root of the filesystem into the buffer. |
| 2729 | 2740 | */ |
| @@ -57,7 +57,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino) · 56 unmodified lines | ||
| 57 | 57 | struct inode *inode; |
| 58 | 58 | |
| 59 | 59 | inode = iget_locked(super, ino); |
| 60 | − if (IS_ERR(inode)) | |
| 60 | + if (!inode) | |
| 61 | 61 | return ERR_PTR(-ENOMEM); |
| 62 | 62 | if (!(inode->i_state & I_NEW)) |
| 63 | 63 | return inode; |
| @@ -926,14 +926,8 @@ static int get_hstate_idx(int page_size_log) · 925 unmodified lines | ||
| 926 | 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 | 929 | static struct dentry_operations anon_ops = { |
| 936 | − .d_dname = hugetlb_dname | |
| 930 | + .d_dname = simple_dname | |
| 937 | 931 | }; |
| 938 | 932 | |
| 939 | 933 | /* |
| @@ -1429,7 +1429,7 @@ struct vfsmount *collect_mounts(struct path *path) · 1428 unmodified lines | ||
| 1429 | 1429 | CL_COPY_ALL | CL_PRIVATE); |
| 1430 | 1430 | namespace_unlock(); |
| 1431 | 1431 | if (IS_ERR(tree)) |
| 1432 | − return NULL; | |
| 1432 | + return ERR_CAST(tree); | |
| 1433 | 1433 | return &tree->mnt; |
| 1434 | 1434 | } |
| 1435 | 1435 | |
| @@ -228,8 +228,6 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx, · 227 unmodified lines | ||
| 228 | 228 | if (!p) |
| 229 | 229 | return -ENOENT; |
| 230 | 230 | |
| 231 | − if (!dir_emit_dots(file, ctx)) | |
| 232 | − goto out; | |
| 233 | 231 | if (!dir_emit_dots(file, ctx)) |
| 234 | 232 | goto out; |
| 235 | 233 | files = get_files_struct(p); |
| @@ -336,6 +336,7 @@ extern int d_validate(struct dentry *, struct dentry *); · 335 unmodified lines | ||
| 336 | 336 | * helper function for dentry_operations.d_dname() members |
| 337 | 337 | */ |
| 338 | 338 | extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); |
| 339 | +extern char *simple_dname(struct dentry *, char *, int); | |
| 339 | 340 | |
| 340 | 341 | extern char *__d_path(const struct path *, const struct path *, char *, int); |
| 341 | 342 | extern char *d_absolute_path(const struct path *, char *, int); |
| @@ -2909,14 +2909,8 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range); · 2908 unmodified lines | ||
| 2909 | 2909 | |
| 2910 | 2910 | /* common code */ |
| 2911 | 2911 | |
| 2912 | −static char *shmem_dname(struct dentry *dentry, char *buffer, int buflen) | |
| 2913 | −{ | |
| 2914 | − return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)", | |
| 2915 | − dentry->d_name.name); | |
| 2916 | −} | |
| 2917 | − | |
| 2918 | 2912 | static struct dentry_operations anon_ops = { |
| 2919 | − .d_dname = shmem_dname | |
| 2913 | + .d_dname = simple_dname | |
| 2920 | 2914 | }; |
| 2921 | 2915 | |
| 2922 | 2916 | /** |