lkml.org 
[lkml]   [2017]   [Jan]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 092/116] bad_inode: add missing i_op initializers
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Miklos Szeredi <mszeredi@redhat.com>

    commit 3f9ca75516a7e581ff803f751a869c1da5ae5fa5 upstream.

    New inode operations were forgotten to be added to bad_inode. Most of the
    time the op is checked for NULL before being called but marking the inode
    bad and the check can race (very unlikely).

    However in case of ->get_link() only DCACHE_SYMLINK_TYPE is checked before
    calling the op, so there's no race and will definitely oops when trying to
    follow links on such a beast.

    Also remove comments about extinct ops.

    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/bad_inode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++----
    1 file changed, 51 insertions(+), 4 deletions(-)

    --- a/fs/bad_inode.c
    +++ b/fs/bad_inode.c
    @@ -106,6 +106,50 @@ static ssize_t bad_inode_listxattr(struc
    return -EIO;
    }

    +static const char *bad_inode_get_link(struct dentry *dentry,
    + struct inode *inode,
    + struct delayed_call *done)
    +{
    + return ERR_PTR(-EIO);
    +}
    +
    +static struct posix_acl *bad_inode_get_acl(struct inode *inode, int type)
    +{
    + return ERR_PTR(-EIO);
    +}
    +
    +static int bad_inode_fiemap(struct inode *inode,
    + struct fiemap_extent_info *fieinfo, u64 start,
    + u64 len)
    +{
    + return -EIO;
    +}
    +
    +static int bad_inode_update_time(struct inode *inode, struct timespec *time,
    + int flags)
    +{
    + return -EIO;
    +}
    +
    +static int bad_inode_atomic_open(struct inode *inode, struct dentry *dentry,
    + struct file *file, unsigned int open_flag,
    + umode_t create_mode, int *opened)
    +{
    + return -EIO;
    +}
    +
    +static int bad_inode_tmpfile(struct inode *inode, struct dentry *dentry,
    + umode_t mode)
    +{
    + return -EIO;
    +}
    +
    +static int bad_inode_set_acl(struct inode *inode, struct posix_acl *acl,
    + int type)
    +{
    + return -EIO;
    +}
    +
    static const struct inode_operations bad_inode_ops =
    {
    .create = bad_inode_create,
    @@ -118,14 +162,17 @@ static const struct inode_operations bad
    .mknod = bad_inode_mknod,
    .rename = bad_inode_rename2,
    .readlink = bad_inode_readlink,
    - /* follow_link must be no-op, otherwise unmounting this inode
    - won't work */
    - /* put_link returns void */
    - /* truncate returns void */
    .permission = bad_inode_permission,
    .getattr = bad_inode_getattr,
    .setattr = bad_inode_setattr,
    .listxattr = bad_inode_listxattr,
    + .get_link = bad_inode_get_link,
    + .get_acl = bad_inode_get_acl,
    + .fiemap = bad_inode_fiemap,
    + .update_time = bad_inode_update_time,
    + .atomic_open = bad_inode_atomic_open,
    + .tmpfile = bad_inode_tmpfile,
    + .set_acl = bad_inode_set_acl,
    };



    \
     
     \ /
      Last update: 2017-01-06 23:32    [W:5.433 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site