• Eric Sandeen's avatar
    [PATCH] udf: initialize parts of inode earlier in create · 225add61
    Eric Sandeen authored
    I saw an oops down this path when trying to create a new file on a UDF
    filesystem which was internally marked as readonly, but mounted rw:
    
    udf_create
            udf_new_inode
                    new_inode
                            alloc_inode
                            	udf_alloc_inode
                    udf_new_block
                            returns EIO due to readonlyness
                    iput (on error)
                            udf_put_inode
                                    udf_discard_prealloc
                                            udf_next_aext
                                                    udf_current_aext
                                                            udf_get_fileshortad
                                                                    OOPS
    
    the udf_discard_prealloc() path was examining uninitialized fields of the
    udf inode.
    
    udf_discard_prealloc() already has this code to short-circuit the discard
    path if no extents are preallocated:
    
            if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB ||
                    inode->i_size == UDF_I_LENEXTENTS(inode))
            {
                    return;
            }
    
    so if we initialize UDF_I_LENEXTENTS(inode) = 0 earlier in udf_new_inode,
    we won't try to free the (not) preallocated blocks, since this will match
    the i_size = 0 set when the inode was initialized.
    Signed-off-by: default avatarEric Sandeen <sandeen@sandeen.net>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    225add61
ialloc.c 4.29 KB