Deleted Added
full compact
vfs_extattr.c (193511) vfs_extattr.c (195104)
1/*-
2 * Copyright (c) 1999-2001 Robert N. M. Watson
3 * All rights reserved.
4 *
5 * This software was developed by Robert Watson for the TrustedBSD Project.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 13 unchanged lines hidden (view full) ---

22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1999-2001 Robert N. M. Watson
3 * All rights reserved.
4 *
5 * This software was developed by Robert Watson for the TrustedBSD Project.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 13 unchanged lines hidden (view full) ---

22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/kern/vfs_extattr.c 193511 2009-06-05 14:55:22Z rwatson $");
30__FBSDID("$FreeBSD: head/sys/kern/vfs_extattr.c 195104 2009-06-27 13:58:44Z rwatson $");
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/lock.h>
35#include <sys/mount.h>
36#include <sys/mutex.h>
37#include <sys/sysproto.h>
38#include <sys/fcntl.h>

--- 26 unchanged lines hidden (view full) ---

65 } */ *uap;
66{
67 struct vnode *filename_vp;
68 struct nameidata nd;
69 struct mount *mp, *mp_writable;
70 char attrname[EXTATTR_MAXNAMELEN];
71 int vfslocked, fnvfslocked, error;
72
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/lock.h>
35#include <sys/mount.h>
36#include <sys/mutex.h>
37#include <sys/sysproto.h>
38#include <sys/fcntl.h>

--- 26 unchanged lines hidden (view full) ---

65 } */ *uap;
66{
67 struct vnode *filename_vp;
68 struct nameidata nd;
69 struct mount *mp, *mp_writable;
70 char attrname[EXTATTR_MAXNAMELEN];
71 int vfslocked, fnvfslocked, error;
72
73 AUDIT_ARG(cmd, uap->cmd);
74 AUDIT_ARG(value, uap->attrnamespace);
73 AUDIT_ARG_CMD(uap->cmd);
74 AUDIT_ARG_VALUE(uap->attrnamespace);
75 /*
76 * uap->attrname is not always defined. We check again later when we
77 * invoke the VFS call so as to pass in NULL there if needed.
78 */
79 if (uap->attrname != NULL) {
80 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN,
81 NULL);
82 if (error)
83 return (error);
84 }
75 /*
76 * uap->attrname is not always defined. We check again later when we
77 * invoke the VFS call so as to pass in NULL there if needed.
78 */
79 if (uap->attrname != NULL) {
80 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN,
81 NULL);
82 if (error)
83 return (error);
84 }
85 AUDIT_ARG(text, attrname);
85 AUDIT_ARG_TEXT(attrname);
86
87 vfslocked = fnvfslocked = 0;
88 mp = NULL;
89 filename_vp = NULL;
90 if (uap->filename != NULL) {
91 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE2,
92 UIO_USERSPACE, uap->filename, td);
93 error = namei(&nd);

--- 124 unchanged lines hidden (view full) ---

218 void *data;
219 size_t nbytes;
220 } */ *uap;
221{
222 struct file *fp;
223 char attrname[EXTATTR_MAXNAMELEN];
224 int vfslocked, error;
225
86
87 vfslocked = fnvfslocked = 0;
88 mp = NULL;
89 filename_vp = NULL;
90 if (uap->filename != NULL) {
91 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE2,
92 UIO_USERSPACE, uap->filename, td);
93 error = namei(&nd);

--- 124 unchanged lines hidden (view full) ---

218 void *data;
219 size_t nbytes;
220 } */ *uap;
221{
222 struct file *fp;
223 char attrname[EXTATTR_MAXNAMELEN];
224 int vfslocked, error;
225
226 AUDIT_ARG(fd, uap->fd);
227 AUDIT_ARG(value, uap->attrnamespace);
226 AUDIT_ARG_FD(uap->fd);
227 AUDIT_ARG_VALUE(uap->attrnamespace);
228 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
229 if (error)
230 return (error);
228 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
229 if (error)
230 return (error);
231 AUDIT_ARG(text, attrname);
231 AUDIT_ARG_TEXT(attrname);
232
233 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
234 if (error)
235 return (error);
236
237 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
238 error = extattr_set_vp(fp->f_vnode, uap->attrnamespace,
239 attrname, uap->data, uap->nbytes, td);

--- 13 unchanged lines hidden (view full) ---

253 void *data;
254 size_t nbytes;
255 } */ *uap;
256{
257 struct nameidata nd;
258 char attrname[EXTATTR_MAXNAMELEN];
259 int vfslocked, error;
260
232
233 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
234 if (error)
235 return (error);
236
237 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
238 error = extattr_set_vp(fp->f_vnode, uap->attrnamespace,
239 attrname, uap->data, uap->nbytes, td);

--- 13 unchanged lines hidden (view full) ---

253 void *data;
254 size_t nbytes;
255 } */ *uap;
256{
257 struct nameidata nd;
258 char attrname[EXTATTR_MAXNAMELEN];
259 int vfslocked, error;
260
261 AUDIT_ARG(value, uap->attrnamespace);
261 AUDIT_ARG_VALUE(uap->attrnamespace);
262 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
263 if (error)
264 return (error);
262 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
263 if (error)
264 return (error);
265 AUDIT_ARG(text, attrname);
265 AUDIT_ARG_TEXT(attrname);
266
267 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
268 uap->path, td);
269 error = namei(&nd);
270 if (error)
271 return (error);
272 NDFREE(&nd, NDF_ONLY_PNBUF);
273

--- 16 unchanged lines hidden (view full) ---

290 void *data;
291 size_t nbytes;
292 } */ *uap;
293{
294 struct nameidata nd;
295 char attrname[EXTATTR_MAXNAMELEN];
296 int vfslocked, error;
297
266
267 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
268 uap->path, td);
269 error = namei(&nd);
270 if (error)
271 return (error);
272 NDFREE(&nd, NDF_ONLY_PNBUF);
273

--- 16 unchanged lines hidden (view full) ---

290 void *data;
291 size_t nbytes;
292 } */ *uap;
293{
294 struct nameidata nd;
295 char attrname[EXTATTR_MAXNAMELEN];
296 int vfslocked, error;
297
298 AUDIT_ARG(value, uap->attrnamespace);
298 AUDIT_ARG_VALUE(uap->attrnamespace);
299 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
300 if (error)
301 return (error);
299 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
300 if (error)
301 return (error);
302 AUDIT_ARG(text, attrname);
302 AUDIT_ARG_TEXT(attrname);
303
304 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
305 uap->path, td);
306 error = namei(&nd);
307 if (error)
308 return (error);
309 NDFREE(&nd, NDF_ONLY_PNBUF);
310

--- 87 unchanged lines hidden (view full) ---

398 void *data;
399 size_t nbytes;
400 } */ *uap;
401{
402 struct file *fp;
403 char attrname[EXTATTR_MAXNAMELEN];
404 int vfslocked, error;
405
303
304 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
305 uap->path, td);
306 error = namei(&nd);
307 if (error)
308 return (error);
309 NDFREE(&nd, NDF_ONLY_PNBUF);
310

--- 87 unchanged lines hidden (view full) ---

398 void *data;
399 size_t nbytes;
400 } */ *uap;
401{
402 struct file *fp;
403 char attrname[EXTATTR_MAXNAMELEN];
404 int vfslocked, error;
405
406 AUDIT_ARG(fd, uap->fd);
407 AUDIT_ARG(value, uap->attrnamespace);
406 AUDIT_ARG_FD(uap->fd);
407 AUDIT_ARG_VALUE(uap->attrnamespace);
408 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
409 if (error)
410 return (error);
408 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
409 if (error)
410 return (error);
411 AUDIT_ARG(text, attrname);
411 AUDIT_ARG_TEXT(attrname);
412
413 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
414 if (error)
415 return (error);
416
417 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
418 error = extattr_get_vp(fp->f_vnode, uap->attrnamespace,
419 attrname, uap->data, uap->nbytes, td);

--- 13 unchanged lines hidden (view full) ---

433 void *data;
434 size_t nbytes;
435 } */ *uap;
436{
437 struct nameidata nd;
438 char attrname[EXTATTR_MAXNAMELEN];
439 int vfslocked, error;
440
412
413 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
414 if (error)
415 return (error);
416
417 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
418 error = extattr_get_vp(fp->f_vnode, uap->attrnamespace,
419 attrname, uap->data, uap->nbytes, td);

--- 13 unchanged lines hidden (view full) ---

433 void *data;
434 size_t nbytes;
435 } */ *uap;
436{
437 struct nameidata nd;
438 char attrname[EXTATTR_MAXNAMELEN];
439 int vfslocked, error;
440
441 AUDIT_ARG(value, uap->attrnamespace);
441 AUDIT_ARG_VALUE(uap->attrnamespace);
442 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
443 if (error)
444 return (error);
442 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
443 if (error)
444 return (error);
445 AUDIT_ARG(text, attrname);
445 AUDIT_ARG_TEXT(attrname);
446
447 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
448 uap->path, td);
449 error = namei(&nd);
450 if (error)
451 return (error);
452 NDFREE(&nd, NDF_ONLY_PNBUF);
453

--- 16 unchanged lines hidden (view full) ---

470 void *data;
471 size_t nbytes;
472 } */ *uap;
473{
474 struct nameidata nd;
475 char attrname[EXTATTR_MAXNAMELEN];
476 int vfslocked, error;
477
446
447 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
448 uap->path, td);
449 error = namei(&nd);
450 if (error)
451 return (error);
452 NDFREE(&nd, NDF_ONLY_PNBUF);
453

--- 16 unchanged lines hidden (view full) ---

470 void *data;
471 size_t nbytes;
472 } */ *uap;
473{
474 struct nameidata nd;
475 char attrname[EXTATTR_MAXNAMELEN];
476 int vfslocked, error;
477
478 AUDIT_ARG(value, uap->attrnamespace);
478 AUDIT_ARG_VALUE(uap->attrnamespace);
479 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
480 if (error)
481 return (error);
479 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
480 if (error)
481 return (error);
482 AUDIT_ARG(text, attrname);
482 AUDIT_ARG_TEXT(attrname);
483
484 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
485 uap->path, td);
486 error = namei(&nd);
487 if (error)
488 return (error);
489 NDFREE(&nd, NDF_ONLY_PNBUF);
490

--- 57 unchanged lines hidden (view full) ---

548 int attrnamespace;
549 const char *attrname;
550 } */ *uap;
551{
552 struct file *fp;
553 char attrname[EXTATTR_MAXNAMELEN];
554 int vfslocked, error;
555
483
484 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
485 uap->path, td);
486 error = namei(&nd);
487 if (error)
488 return (error);
489 NDFREE(&nd, NDF_ONLY_PNBUF);
490

--- 57 unchanged lines hidden (view full) ---

548 int attrnamespace;
549 const char *attrname;
550 } */ *uap;
551{
552 struct file *fp;
553 char attrname[EXTATTR_MAXNAMELEN];
554 int vfslocked, error;
555
556 AUDIT_ARG(fd, uap->fd);
557 AUDIT_ARG(value, uap->attrnamespace);
556 AUDIT_ARG_FD(uap->fd);
557 AUDIT_ARG_VALUE(uap->attrnamespace);
558 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
559 if (error)
560 return (error);
558 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
559 if (error)
560 return (error);
561 AUDIT_ARG(text, attrname);
561 AUDIT_ARG_TEXT(attrname);
562
563 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
564 if (error)
565 return (error);
566
567 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
568 error = extattr_delete_vp(fp->f_vnode, uap->attrnamespace,
569 attrname, td);

--- 10 unchanged lines hidden (view full) ---

580 int attrnamespace;
581 const char *attrname;
582 } */ *uap;
583{
584 struct nameidata nd;
585 char attrname[EXTATTR_MAXNAMELEN];
586 int vfslocked, error;
587
562
563 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
564 if (error)
565 return (error);
566
567 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
568 error = extattr_delete_vp(fp->f_vnode, uap->attrnamespace,
569 attrname, td);

--- 10 unchanged lines hidden (view full) ---

580 int attrnamespace;
581 const char *attrname;
582 } */ *uap;
583{
584 struct nameidata nd;
585 char attrname[EXTATTR_MAXNAMELEN];
586 int vfslocked, error;
587
588 AUDIT_ARG(value, uap->attrnamespace);
588 AUDIT_ARG_VALUE(uap->attrnamespace);
589 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
590 if (error)
591 return(error);
589 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
590 if (error)
591 return(error);
592 AUDIT_ARG(text, attrname);
592 AUDIT_ARG_TEXT(attrname);
593
594 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
595 uap->path, td);
596 error = namei(&nd);
597 if (error)
598 return(error);
599 NDFREE(&nd, NDF_ONLY_PNBUF);
600

--- 12 unchanged lines hidden (view full) ---

613 int attrnamespace;
614 const char *attrname;
615 } */ *uap;
616{
617 struct nameidata nd;
618 char attrname[EXTATTR_MAXNAMELEN];
619 int vfslocked, error;
620
593
594 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
595 uap->path, td);
596 error = namei(&nd);
597 if (error)
598 return(error);
599 NDFREE(&nd, NDF_ONLY_PNBUF);
600

--- 12 unchanged lines hidden (view full) ---

613 int attrnamespace;
614 const char *attrname;
615 } */ *uap;
616{
617 struct nameidata nd;
618 char attrname[EXTATTR_MAXNAMELEN];
619 int vfslocked, error;
620
621 AUDIT_ARG(value, uap->attrnamespace);
621 AUDIT_ARG_VALUE(uap->attrnamespace);
622 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
623 if (error)
624 return(error);
622 error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL);
623 if (error)
624 return(error);
625 AUDIT_ARG(text, attrname);
625 AUDIT_ARG_TEXT(attrname);
626
627 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
628 uap->path, td);
629 error = namei(&nd);
630 if (error)
631 return(error);
632 NDFREE(&nd, NDF_ONLY_PNBUF);
633

--- 78 unchanged lines hidden (view full) ---

712 int attrnamespace;
713 void *data;
714 size_t nbytes;
715 } */ *uap;
716{
717 struct file *fp;
718 int vfslocked, error;
719
626
627 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
628 uap->path, td);
629 error = namei(&nd);
630 if (error)
631 return(error);
632 NDFREE(&nd, NDF_ONLY_PNBUF);
633

--- 78 unchanged lines hidden (view full) ---

712 int attrnamespace;
713 void *data;
714 size_t nbytes;
715 } */ *uap;
716{
717 struct file *fp;
718 int vfslocked, error;
719
720 AUDIT_ARG(fd, uap->fd);
721 AUDIT_ARG(value, uap->attrnamespace);
720 AUDIT_ARG_FD(uap->fd);
721 AUDIT_ARG_VALUE(uap->attrnamespace);
722 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
723 if (error)
724 return (error);
725
726 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
727 error = extattr_list_vp(fp->f_vnode, uap->attrnamespace, uap->data,
728 uap->nbytes, td);
729

--- 10 unchanged lines hidden (view full) ---

740 int attrnamespace;
741 void *data;
742 size_t nbytes;
743 } */ *uap;
744{
745 struct nameidata nd;
746 int vfslocked, error;
747
722 error = getvnode(td->td_proc->p_fd, uap->fd, &fp);
723 if (error)
724 return (error);
725
726 vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
727 error = extattr_list_vp(fp->f_vnode, uap->attrnamespace, uap->data,
728 uap->nbytes, td);
729

--- 10 unchanged lines hidden (view full) ---

740 int attrnamespace;
741 void *data;
742 size_t nbytes;
743 } */ *uap;
744{
745 struct nameidata nd;
746 int vfslocked, error;
747
748 AUDIT_ARG(value, uap->attrnamespace);
748 AUDIT_ARG_VALUE(uap->attrnamespace);
749 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
750 uap->path, td);
751 error = namei(&nd);
752 if (error)
753 return (error);
754 NDFREE(&nd, NDF_ONLY_PNBUF);
755
756 vfslocked = NDHASGIANT(&nd);

--- 13 unchanged lines hidden (view full) ---

770 int attrnamespace;
771 void *data;
772 size_t nbytes;
773 } */ *uap;
774{
775 struct nameidata nd;
776 int vfslocked, error;
777
749 NDINIT(&nd, LOOKUP, MPSAFE | FOLLOW | AUDITVNODE1, UIO_USERSPACE,
750 uap->path, td);
751 error = namei(&nd);
752 if (error)
753 return (error);
754 NDFREE(&nd, NDF_ONLY_PNBUF);
755
756 vfslocked = NDHASGIANT(&nd);

--- 13 unchanged lines hidden (view full) ---

770 int attrnamespace;
771 void *data;
772 size_t nbytes;
773 } */ *uap;
774{
775 struct nameidata nd;
776 int vfslocked, error;
777
778 AUDIT_ARG(value, uap->attrnamespace);
778 AUDIT_ARG_VALUE(uap->attrnamespace);
779 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
780 uap->path, td);
781 error = namei(&nd);
782 if (error)
783 return (error);
784 NDFREE(&nd, NDF_ONLY_PNBUF);
785
786 vfslocked = NDHASGIANT(&nd);
787 error = extattr_list_vp(nd.ni_vp, uap->attrnamespace, uap->data,
788 uap->nbytes, td);
789
790 vrele(nd.ni_vp);
791 VFS_UNLOCK_GIANT(vfslocked);
792 return (error);
793}
779 NDINIT(&nd, LOOKUP, MPSAFE | NOFOLLOW | AUDITVNODE1, UIO_USERSPACE,
780 uap->path, td);
781 error = namei(&nd);
782 if (error)
783 return (error);
784 NDFREE(&nd, NDF_ONLY_PNBUF);
785
786 vfslocked = NDHASGIANT(&nd);
787 error = extattr_list_vp(nd.ni_vp, uap->attrnamespace, uap->data,
788 uap->nbytes, td);
789
790 vrele(nd.ni_vp);
791 VFS_UNLOCK_GIANT(vfslocked);
792 return (error);
793}