diff options
Diffstat (limited to 'fs/xfs/xfs_attr.c')
| -rw-r--r-- | fs/xfs/xfs_attr.c | 93 |
1 files changed, 53 insertions, 40 deletions
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 36d781ee5fcc..df151a859186 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c | |||
| @@ -101,14 +101,28 @@ STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args); | |||
| 101 | ktrace_t *xfs_attr_trace_buf; | 101 | ktrace_t *xfs_attr_trace_buf; |
| 102 | #endif | 102 | #endif |
| 103 | 103 | ||
| 104 | STATIC int | ||
| 105 | xfs_attr_name_to_xname( | ||
| 106 | struct xfs_name *xname, | ||
| 107 | const char *aname) | ||
| 108 | { | ||
| 109 | if (!aname) | ||
| 110 | return EINVAL; | ||
| 111 | xname->name = aname; | ||
| 112 | xname->len = strlen(aname); | ||
| 113 | if (xname->len >= MAXNAMELEN) | ||
| 114 | return EFAULT; /* match IRIX behaviour */ | ||
| 115 | |||
| 116 | return 0; | ||
| 117 | } | ||
| 104 | 118 | ||
| 105 | /*======================================================================== | 119 | /*======================================================================== |
| 106 | * Overall external interface routines. | 120 | * Overall external interface routines. |
| 107 | *========================================================================*/ | 121 | *========================================================================*/ |
| 108 | 122 | ||
| 109 | int | 123 | int |
| 110 | xfs_attr_fetch(xfs_inode_t *ip, const char *name, int namelen, | 124 | xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, |
| 111 | char *value, int *valuelenp, int flags, struct cred *cred) | 125 | char *value, int *valuelenp, int flags) |
| 112 | { | 126 | { |
| 113 | xfs_da_args_t args; | 127 | xfs_da_args_t args; |
| 114 | int error; | 128 | int error; |
| @@ -122,8 +136,8 @@ xfs_attr_fetch(xfs_inode_t *ip, const char *name, int namelen, | |||
| 122 | * Fill in the arg structure for this request. | 136 | * Fill in the arg structure for this request. |
| 123 | */ | 137 | */ |
| 124 | memset((char *)&args, 0, sizeof(args)); | 138 | memset((char *)&args, 0, sizeof(args)); |
| 125 | args.name = name; | 139 | args.name = name->name; |
| 126 | args.namelen = namelen; | 140 | args.namelen = name->len; |
| 127 | args.value = value; | 141 | args.value = value; |
| 128 | args.valuelen = *valuelenp; | 142 | args.valuelen = *valuelenp; |
| 129 | args.flags = flags; | 143 | args.flags = flags; |
| @@ -162,31 +176,29 @@ xfs_attr_get( | |||
| 162 | const char *name, | 176 | const char *name, |
| 163 | char *value, | 177 | char *value, |
| 164 | int *valuelenp, | 178 | int *valuelenp, |
| 165 | int flags, | 179 | int flags) |
| 166 | cred_t *cred) | ||
| 167 | { | 180 | { |
| 168 | int error, namelen; | 181 | int error; |
| 182 | struct xfs_name xname; | ||
| 169 | 183 | ||
| 170 | XFS_STATS_INC(xs_attr_get); | 184 | XFS_STATS_INC(xs_attr_get); |
| 171 | 185 | ||
| 172 | if (!name) | ||
| 173 | return(EINVAL); | ||
| 174 | namelen = strlen(name); | ||
| 175 | if (namelen >= MAXNAMELEN) | ||
| 176 | return(EFAULT); /* match IRIX behaviour */ | ||
| 177 | |||
| 178 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | 186 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) |
| 179 | return(EIO); | 187 | return(EIO); |
| 180 | 188 | ||
| 189 | error = xfs_attr_name_to_xname(&xname, name); | ||
| 190 | if (error) | ||
| 191 | return error; | ||
| 192 | |||
| 181 | xfs_ilock(ip, XFS_ILOCK_SHARED); | 193 | xfs_ilock(ip, XFS_ILOCK_SHARED); |
| 182 | error = xfs_attr_fetch(ip, name, namelen, value, valuelenp, flags, cred); | 194 | error = xfs_attr_fetch(ip, &xname, value, valuelenp, flags); |
| 183 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | 195 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
| 184 | return(error); | 196 | return(error); |
| 185 | } | 197 | } |
| 186 | 198 | ||
| 187 | int | 199 | STATIC int |
| 188 | xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | 200 | xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, |
| 189 | char *value, int valuelen, int flags) | 201 | char *value, int valuelen, int flags) |
| 190 | { | 202 | { |
| 191 | xfs_da_args_t args; | 203 | xfs_da_args_t args; |
| 192 | xfs_fsblock_t firstblock; | 204 | xfs_fsblock_t firstblock; |
| @@ -209,7 +221,7 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | |||
| 209 | */ | 221 | */ |
| 210 | if (XFS_IFORK_Q(dp) == 0) { | 222 | if (XFS_IFORK_Q(dp) == 0) { |
| 211 | int sf_size = sizeof(xfs_attr_sf_hdr_t) + | 223 | int sf_size = sizeof(xfs_attr_sf_hdr_t) + |
| 212 | XFS_ATTR_SF_ENTSIZE_BYNAME(namelen, valuelen); | 224 | XFS_ATTR_SF_ENTSIZE_BYNAME(name->len, valuelen); |
| 213 | 225 | ||
| 214 | if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) | 226 | if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) |
| 215 | return(error); | 227 | return(error); |
| @@ -219,8 +231,8 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | |||
| 219 | * Fill in the arg structure for this request. | 231 | * Fill in the arg structure for this request. |
| 220 | */ | 232 | */ |
| 221 | memset((char *)&args, 0, sizeof(args)); | 233 | memset((char *)&args, 0, sizeof(args)); |
| 222 | args.name = name; | 234 | args.name = name->name; |
| 223 | args.namelen = namelen; | 235 | args.namelen = name->len; |
| 224 | args.value = value; | 236 | args.value = value; |
| 225 | args.valuelen = valuelen; | 237 | args.valuelen = valuelen; |
| 226 | args.flags = flags; | 238 | args.flags = flags; |
| @@ -236,7 +248,7 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | |||
| 236 | * Determine space new attribute will use, and if it would be | 248 | * Determine space new attribute will use, and if it would be |
| 237 | * "local" or "remote" (note: local != inline). | 249 | * "local" or "remote" (note: local != inline). |
| 238 | */ | 250 | */ |
| 239 | size = xfs_attr_leaf_newentsize(namelen, valuelen, | 251 | size = xfs_attr_leaf_newentsize(name->len, valuelen, |
| 240 | mp->m_sb.sb_blocksize, &local); | 252 | mp->m_sb.sb_blocksize, &local); |
| 241 | 253 | ||
| 242 | nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); | 254 | nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); |
| @@ -429,26 +441,27 @@ xfs_attr_set( | |||
| 429 | int valuelen, | 441 | int valuelen, |
| 430 | int flags) | 442 | int flags) |
| 431 | { | 443 | { |
| 432 | int namelen; | 444 | int error; |
| 433 | 445 | struct xfs_name xname; | |
| 434 | namelen = strlen(name); | ||
| 435 | if (namelen >= MAXNAMELEN) | ||
| 436 | return EFAULT; /* match IRIX behaviour */ | ||
| 437 | 446 | ||
| 438 | XFS_STATS_INC(xs_attr_set); | 447 | XFS_STATS_INC(xs_attr_set); |
| 439 | 448 | ||
| 440 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) | 449 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) |
| 441 | return (EIO); | 450 | return (EIO); |
| 442 | 451 | ||
| 443 | return xfs_attr_set_int(dp, name, namelen, value, valuelen, flags); | 452 | error = xfs_attr_name_to_xname(&xname, name); |
| 453 | if (error) | ||
| 454 | return error; | ||
| 455 | |||
| 456 | return xfs_attr_set_int(dp, &xname, value, valuelen, flags); | ||
| 444 | } | 457 | } |
| 445 | 458 | ||
| 446 | /* | 459 | /* |
| 447 | * Generic handler routine to remove a name from an attribute list. | 460 | * Generic handler routine to remove a name from an attribute list. |
| 448 | * Transitions attribute list from Btree to shortform as necessary. | 461 | * Transitions attribute list from Btree to shortform as necessary. |
| 449 | */ | 462 | */ |
| 450 | int | 463 | STATIC int |
| 451 | xfs_attr_remove_int(xfs_inode_t *dp, const char *name, int namelen, int flags) | 464 | xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) |
| 452 | { | 465 | { |
| 453 | xfs_da_args_t args; | 466 | xfs_da_args_t args; |
| 454 | xfs_fsblock_t firstblock; | 467 | xfs_fsblock_t firstblock; |
| @@ -460,8 +473,8 @@ xfs_attr_remove_int(xfs_inode_t *dp, const char *name, int namelen, int flags) | |||
| 460 | * Fill in the arg structure for this request. | 473 | * Fill in the arg structure for this request. |
| 461 | */ | 474 | */ |
| 462 | memset((char *)&args, 0, sizeof(args)); | 475 | memset((char *)&args, 0, sizeof(args)); |
| 463 | args.name = name; | 476 | args.name = name->name; |
| 464 | args.namelen = namelen; | 477 | args.namelen = name->len; |
| 465 | args.flags = flags; | 478 | args.flags = flags; |
| 466 | args.hashval = xfs_da_hashname(args.name, args.namelen); | 479 | args.hashval = xfs_da_hashname(args.name, args.namelen); |
| 467 | args.dp = dp; | 480 | args.dp = dp; |
| @@ -575,17 +588,18 @@ xfs_attr_remove( | |||
| 575 | const char *name, | 588 | const char *name, |
| 576 | int flags) | 589 | int flags) |
| 577 | { | 590 | { |
| 578 | int namelen; | 591 | int error; |
| 579 | 592 | struct xfs_name xname; | |
| 580 | namelen = strlen(name); | ||
| 581 | if (namelen >= MAXNAMELEN) | ||
| 582 | return EFAULT; /* match IRIX behaviour */ | ||
| 583 | 593 | ||
| 584 | XFS_STATS_INC(xs_attr_remove); | 594 | XFS_STATS_INC(xs_attr_remove); |
| 585 | 595 | ||
| 586 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) | 596 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) |
| 587 | return (EIO); | 597 | return (EIO); |
| 588 | 598 | ||
| 599 | error = xfs_attr_name_to_xname(&xname, name); | ||
| 600 | if (error) | ||
| 601 | return error; | ||
| 602 | |||
| 589 | xfs_ilock(dp, XFS_ILOCK_SHARED); | 603 | xfs_ilock(dp, XFS_ILOCK_SHARED); |
| 590 | if (XFS_IFORK_Q(dp) == 0 || | 604 | if (XFS_IFORK_Q(dp) == 0 || |
| 591 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && | 605 | (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && |
| @@ -595,10 +609,10 @@ xfs_attr_remove( | |||
| 595 | } | 609 | } |
| 596 | xfs_iunlock(dp, XFS_ILOCK_SHARED); | 610 | xfs_iunlock(dp, XFS_ILOCK_SHARED); |
| 597 | 611 | ||
| 598 | return xfs_attr_remove_int(dp, name, namelen, flags); | 612 | return xfs_attr_remove_int(dp, &xname, flags); |
| 599 | } | 613 | } |
| 600 | 614 | ||
| 601 | int /* error */ | 615 | STATIC int |
| 602 | xfs_attr_list_int(xfs_attr_list_context_t *context) | 616 | xfs_attr_list_int(xfs_attr_list_context_t *context) |
| 603 | { | 617 | { |
| 604 | int error; | 618 | int error; |
| @@ -2522,8 +2536,7 @@ attr_generic_get( | |||
| 2522 | { | 2536 | { |
| 2523 | int error, asize = size; | 2537 | int error, asize = size; |
| 2524 | 2538 | ||
| 2525 | error = xfs_attr_get(xfs_vtoi(vp), name, data, | 2539 | error = xfs_attr_get(xfs_vtoi(vp), name, data, &asize, xflags); |
| 2526 | &asize, xflags, NULL); | ||
| 2527 | if (!error) | 2540 | if (!error) |
| 2528 | return asize; | 2541 | return asize; |
| 2529 | return -error; | 2542 | return -error; |
