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; |