• Alex Elder's avatar
    ceph: ensure prealloc_blob is in place when removing xattr · 83eb26af
    Alex Elder authored
    In __ceph_build_xattrs_blob(), if a ceph inode's extended attributes
    are marked dirty, all attributes recorded in its rb_tree index are
    formatted into a "blob" buffer.  The target buffer is recorded in
    ceph_inode->i_xattrs.prealloc_blob, and it is expected to exist and
    be of sufficient size to hold the attributes.
    
    The extended attributes are marked dirty in two cases: when a new
    attribute is added to the inode; or when one is removed.  In the
    former case work is done to ensure the prealloc_blob buffer is
    properly set up, but in the latter it is not.
    
    Change the logic in ceph_removexattr() so it matches what is
    done in ceph_setxattr().  Note that this is done in a way that
    keeps the two blocks of code nearly identical, in anticipation
    of a subsequent patch that encapsulates some of this logic into
    one or more helper routines.
    Signed-off-by: default avatarAlex Elder <elder@dreamhost.com>
    Signed-off-by: default avatarSage Weil <sage@newdream.net>
    83eb26af
xattr.c 21.2 KB