int ll_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags) { struct inode *inode = d_inode(dentry); LASSERT(inode); LASSERT(name); CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), xattr %s\n", inode->i_ino, inode->i_generation, inode, name); ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_SETXATTR, 1); if ((strncmp(name, XATTR_TRUSTED_PREFIX, sizeof(XATTR_TRUSTED_PREFIX) - 1) == 0 && strcmp(name + sizeof(XATTR_TRUSTED_PREFIX) - 1, "lov") == 0) || (strncmp(name, XATTR_LUSTRE_PREFIX, sizeof(XATTR_LUSTRE_PREFIX) - 1) == 0 && strcmp(name + sizeof(XATTR_LUSTRE_PREFIX) - 1, "lov") == 0)) { struct lov_user_md *lump = (struct lov_user_md *)value; int rc = 0; if (size != 0 && size < sizeof(struct lov_user_md)) return -EINVAL; /* Attributes that are saved via getxattr will always have * the stripe_offset as 0. Instead, the MDS should be * allowed to pick the starting OST index. b=17846 */ if (lump && lump->lmm_stripe_offset == 0) lump->lmm_stripe_offset = -1; if (lump && S_ISREG(inode->i_mode)) { int flags = FMODE_WRITE; int lum_size = (lump->lmm_magic == LOV_USER_MAGIC_V1) ? sizeof(*lump) : sizeof(struct lov_user_md_v3); rc = ll_lov_setstripe_ea_info(inode, dentry, flags, lump, lum_size); /* b10667: rc always be 0 here for now */ rc = 0; } else if (S_ISDIR(inode->i_mode)) { rc = ll_dir_setstripe(inode, lump, 0); } return rc; } else if (strcmp(name, XATTR_NAME_LMA) == 0 || strcmp(name, XATTR_NAME_LINK) == 0) return 0; return ll_setxattr_common(inode, name, value, size, flags, OBD_MD_FLXATTR); }
int ll_removexattr(struct dentry *dentry, const char *name) { struct inode *inode = dentry->d_inode; LASSERT(inode); LASSERT(name); CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), xattr %s\n", inode->i_ino, inode->i_generation, inode, name); ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_REMOVEXATTR, 1); return ll_setxattr_common(inode, name, NULL, 0, 0, OBD_MD_FLXATTRRM); }