diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 6 | ||||
-rw-r--r-- | fs/xfs/xfs_acl.c | 7 | ||||
-rw-r--r-- | fs/xfs/xfs_attr.c | 93 | ||||
-rw-r--r-- | fs/xfs/xfs_attr.h | 6 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.h | 2 |
5 files changed, 62 insertions, 52 deletions
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 98e87804991d..a42ba9d71156 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
@@ -505,14 +505,14 @@ xfs_attrmulti_attr_get( | |||
505 | { | 505 | { |
506 | char *kbuf; | 506 | char *kbuf; |
507 | int error = EFAULT; | 507 | int error = EFAULT; |
508 | 508 | ||
509 | if (*len > XATTR_SIZE_MAX) | 509 | if (*len > XATTR_SIZE_MAX) |
510 | return EINVAL; | 510 | return EINVAL; |
511 | kbuf = kmalloc(*len, GFP_KERNEL); | 511 | kbuf = kmalloc(*len, GFP_KERNEL); |
512 | if (!kbuf) | 512 | if (!kbuf) |
513 | return ENOMEM; | 513 | return ENOMEM; |
514 | 514 | ||
515 | error = xfs_attr_get(XFS_I(inode), name, kbuf, (int *)len, flags, NULL); | 515 | error = xfs_attr_get(XFS_I(inode), name, kbuf, (int *)len, flags); |
516 | if (error) | 516 | if (error) |
517 | goto out_kfree; | 517 | goto out_kfree; |
518 | 518 | ||
@@ -546,7 +546,7 @@ xfs_attrmulti_attr_set( | |||
546 | 546 | ||
547 | if (copy_from_user(kbuf, ubuf, len)) | 547 | if (copy_from_user(kbuf, ubuf, len)) |
548 | goto out_kfree; | 548 | goto out_kfree; |
549 | 549 | ||
550 | error = xfs_attr_set(XFS_I(inode), name, kbuf, len, flags); | 550 | error = xfs_attr_set(XFS_I(inode), name, kbuf, len, flags); |
551 | 551 | ||
552 | out_kfree: | 552 | out_kfree: |
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 796e76ef2713..ebee3a4f703a 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c | |||
@@ -334,14 +334,15 @@ xfs_acl_iaccess( | |||
334 | { | 334 | { |
335 | xfs_acl_t *acl; | 335 | xfs_acl_t *acl; |
336 | int rval; | 336 | int rval; |
337 | struct xfs_name acl_name = {SGI_ACL_FILE, SGI_ACL_FILE_SIZE}; | ||
337 | 338 | ||
338 | if (!(_ACL_ALLOC(acl))) | 339 | if (!(_ACL_ALLOC(acl))) |
339 | return -1; | 340 | return -1; |
340 | 341 | ||
341 | /* If the file has no ACL return -1. */ | 342 | /* If the file has no ACL return -1. */ |
342 | rval = sizeof(xfs_acl_t); | 343 | rval = sizeof(xfs_acl_t); |
343 | if (xfs_attr_fetch(ip, SGI_ACL_FILE, SGI_ACL_FILE_SIZE, | 344 | if (xfs_attr_fetch(ip, &acl_name, (char *)acl, &rval, |
344 | (char *)acl, &rval, ATTR_ROOT | ATTR_KERNACCESS, cr)) { | 345 | ATTR_ROOT | ATTR_KERNACCESS)) { |
345 | _ACL_FREE(acl); | 346 | _ACL_FREE(acl); |
346 | return -1; | 347 | return -1; |
347 | } | 348 | } |
@@ -579,7 +580,7 @@ xfs_acl_get_attr( | |||
579 | *error = xfs_attr_get(xfs_vtoi(vp), | 580 | *error = xfs_attr_get(xfs_vtoi(vp), |
580 | kind == _ACL_TYPE_ACCESS ? | 581 | kind == _ACL_TYPE_ACCESS ? |
581 | SGI_ACL_FILE : SGI_ACL_DEFAULT, | 582 | SGI_ACL_FILE : SGI_ACL_DEFAULT, |
582 | (char *)aclp, &len, flags, sys_cred); | 583 | (char *)aclp, &len, flags); |
583 | if (*error || (flags & ATTR_KERNOVAL)) | 584 | if (*error || (flags & ATTR_KERNOVAL)) |
584 | return; | 585 | return; |
585 | xfs_acl_get_endian(aclp); | 586 | xfs_acl_get_endian(aclp); |
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; |
diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index 786eba3121c4..6cfc9384fe35 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h | |||
@@ -158,14 +158,10 @@ struct xfs_da_args; | |||
158 | /* | 158 | /* |
159 | * Overall external interface routines. | 159 | * Overall external interface routines. |
160 | */ | 160 | */ |
161 | int xfs_attr_set_int(struct xfs_inode *, const char *, int, char *, int, int); | ||
162 | int xfs_attr_remove_int(struct xfs_inode *, const char *, int, int); | ||
163 | int xfs_attr_list_int(struct xfs_attr_list_context *); | ||
164 | int xfs_attr_inactive(struct xfs_inode *dp); | 161 | int xfs_attr_inactive(struct xfs_inode *dp); |
165 | 162 | ||
166 | int xfs_attr_shortform_getvalue(struct xfs_da_args *); | 163 | int xfs_attr_shortform_getvalue(struct xfs_da_args *); |
167 | int xfs_attr_fetch(struct xfs_inode *, const char *, int, | 164 | int xfs_attr_fetch(struct xfs_inode *, struct xfs_name *, char *, int *, int); |
168 | char *, int *, int, struct cred *); | ||
169 | int xfs_attr_rmtval_get(struct xfs_da_args *args); | 165 | int xfs_attr_rmtval_get(struct xfs_da_args *args); |
170 | 166 | ||
171 | #endif /* __XFS_ATTR_H__ */ | 167 | #endif /* __XFS_ATTR_H__ */ |
diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index ba798fccf72b..827afc997008 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h | |||
@@ -49,7 +49,7 @@ int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, | |||
49 | struct xfs_inode *src_ip, struct xfs_inode *target_dp, | 49 | struct xfs_inode *src_ip, struct xfs_inode *target_dp, |
50 | struct xfs_name *target_name, struct xfs_inode *target_ip); | 50 | struct xfs_name *target_name, struct xfs_inode *target_ip); |
51 | int xfs_attr_get(struct xfs_inode *ip, const char *name, char *value, | 51 | int xfs_attr_get(struct xfs_inode *ip, const char *name, char *value, |
52 | int *valuelenp, int flags, cred_t *cred); | 52 | int *valuelenp, int flags); |
53 | int xfs_attr_set(struct xfs_inode *dp, const char *name, char *value, | 53 | int xfs_attr_set(struct xfs_inode *dp, const char *name, char *value, |
54 | int valuelen, int flags); | 54 | int valuelen, int flags); |
55 | int xfs_attr_remove(struct xfs_inode *dp, const char *name, int flags); | 55 | int xfs_attr_remove(struct xfs_inode *dp, const char *name, int flags); |