X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fzpl_xattr.c;h=f274407e5930f02e79c09d0e16ab4a9f6078ddd9;hb=5c03efc379693f992ebe39c6a00c7297c4a304ea;hp=86e52f791ec762ef4a5049c43f58a3de545e8cfc;hpb=777d4af89137907adc91377327505f40c296035d;p=zfs.git diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c index 86e52f7..f274407 100644 --- a/module/zfs/zpl_xattr.c +++ b/module/zfs/zpl_xattr.c @@ -110,11 +110,11 @@ zpl_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size) struct inode *ip = dentry->d_inode; struct inode *dxip = NULL; loff_t pos = 3; /* skip '.', '..', and '.zfs' entries. */ - cred_t *cr; + cred_t *cr = CRED(); int error; xattr_filldir_t xf = { buffer_size, 0, buffer, ip }; - cr = (cred_t *)get_current_cred(); + crhold(cr); /* Lookup the xattr directory */ error = -zfs_lookup(ip, NULL, &dxip, LOOKUP_XATTR, cr, NULL, NULL); @@ -135,7 +135,7 @@ out: if (dxip) iput(dxip); - put_cred(cr); + crfree(cr); return (error); } @@ -145,10 +145,10 @@ zpl_xattr_get(struct inode *ip, const char *name, void *buf, size_t size) { struct inode *dxip = NULL; struct inode *xip = NULL; - cred_t *cr; + cred_t *cr = CRED(); int error; - cr = (cred_t *)get_current_cred(); + crhold(cr); /* Lookup the xattr directory */ error = -zfs_lookup(ip, NULL, &dxip, LOOKUP_XATTR, cr, NULL, NULL); @@ -173,7 +173,7 @@ out: if (dxip) iput(dxip); - put_cred(cr); + crfree(cr); if (error == -ENOENT) error = -ENODATA; @@ -188,11 +188,12 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value, struct inode *dxip = NULL; struct inode *xip = NULL; vattr_t *vap = NULL; - cred_t *cr; + cred_t *cr = CRED(); ssize_t wrote; int error; + const int xattr_mode = S_IFREG | 0644; - cr = (cred_t *)get_current_cred(); + crhold(cr); /* Lookup the xattr directory and create it if required. */ error = -zfs_lookup(ip, NULL, &dxip, LOOKUP_XATTR | CREATE_XATTR_DIR, @@ -230,10 +231,10 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value, /* Lookup failed create a new xattr. */ if (xip == NULL) { vap = kmem_zalloc(sizeof(vattr_t), KM_SLEEP); - vap->va_mode = S_IFREG | 0644; + vap->va_mode = xattr_mode; vap->va_mask = ATTR_MODE; - vap->va_uid = current_fsuid(); - vap->va_gid = current_fsgid(); + vap->va_uid = crgetfsuid(cr); + vap->va_gid = crgetfsgid(cr); error = -zfs_create(dxip, (char *)name, vap, 0, 0644, &xip, cr, 0, NULL); @@ -242,6 +243,11 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value, } ASSERT(xip != NULL); + + error = -zfs_freesp(ITOZ(xip), 0, 0, xattr_mode, TRUE); + if (error) + goto out; + wrote = zpl_write_common(xip, value, size, 0, UIO_SYSSPACE, 0, cr); if (wrote < 0) error = wrote; @@ -256,7 +262,7 @@ out: if (dxip) iput(dxip); - put_cred(cr); + crfree(cr); if (error == -ENOENT) error = -ENODATA; @@ -266,7 +272,7 @@ out: } static int -zpl_xattr_user_get(struct inode *ip, const char *name, +__zpl_xattr_user_get(struct inode *ip, const char *name, void *buffer, size_t size) { char *xattr_name; @@ -284,9 +290,10 @@ zpl_xattr_user_get(struct inode *ip, const char *name, return (error); } +ZPL_XATTR_GET_WRAPPER(zpl_xattr_user_get); static int -zpl_xattr_user_set(struct inode *ip, const char *name, +__zpl_xattr_user_set(struct inode *ip, const char *name, const void *value, size_t size, int flags) { char *xattr_name; @@ -304,6 +311,7 @@ zpl_xattr_user_set(struct inode *ip, const char *name, return (error); } +ZPL_XATTR_SET_WRAPPER(zpl_xattr_user_set); xattr_handler_t zpl_xattr_user_handler = { .prefix = XATTR_USER_PREFIX, @@ -312,7 +320,7 @@ xattr_handler_t zpl_xattr_user_handler = { }; static int -zpl_xattr_trusted_get(struct inode *ip, const char *name, +__zpl_xattr_trusted_get(struct inode *ip, const char *name, void *buffer, size_t size) { char *xattr_name; @@ -330,9 +338,10 @@ zpl_xattr_trusted_get(struct inode *ip, const char *name, return (error); } +ZPL_XATTR_GET_WRAPPER(zpl_xattr_trusted_get); static int -zpl_xattr_trusted_set(struct inode *ip, const char *name, +__zpl_xattr_trusted_set(struct inode *ip, const char *name, const void *value, size_t size, int flags) { char *xattr_name; @@ -350,6 +359,7 @@ zpl_xattr_trusted_set(struct inode *ip, const char *name, return (error); } +ZPL_XATTR_SET_WRAPPER(zpl_xattr_trusted_set); xattr_handler_t zpl_xattr_trusted_handler = { .prefix = XATTR_TRUSTED_PREFIX, @@ -358,7 +368,7 @@ xattr_handler_t zpl_xattr_trusted_handler = { }; static int -zpl_xattr_security_get(struct inode *ip, const char *name, +__zpl_xattr_security_get(struct inode *ip, const char *name, void *buffer, size_t size) { char *xattr_name; @@ -373,9 +383,10 @@ zpl_xattr_security_get(struct inode *ip, const char *name, return (error); } +ZPL_XATTR_GET_WRAPPER(zpl_xattr_security_get); static int -zpl_xattr_security_set(struct inode *ip, const char *name, +__zpl_xattr_security_set(struct inode *ip, const char *name, const void *value, size_t size, int flags) { char *xattr_name; @@ -390,16 +401,19 @@ zpl_xattr_security_set(struct inode *ip, const char *name, return (error); } +ZPL_XATTR_SET_WRAPPER(zpl_xattr_security_set); int -zpl_xattr_security_init(struct inode *ip, struct inode *dip) +zpl_xattr_security_init(struct inode *ip, struct inode *dip, + const struct qstr *qstr) { int error; size_t len; void *value; char *name; - error = security_inode_init_security(ip, dip, &name, &value, &len); + error = zpl_security_inode_init_security(ip, dip, qstr, + &name, &value, &len); if (error) { if (error == -EOPNOTSUPP) return 0; @@ -407,7 +421,7 @@ zpl_xattr_security_init(struct inode *ip, struct inode *dip) return (error); } - error = zpl_xattr_security_set(ip, name, value, len, 0); + error = __zpl_xattr_security_set(ip, name, value, len, 0); kfree(name); kfree(value);