Deleted Added
full compact
ffs_vfsops.c (138412) ffs_vfsops.c (138509)
1/*
2 * Copyright (c) 1989, 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)ffs_vfsops.c 8.31 (Berkeley) 5/20/95
30 */
31
32#include <sys/cdefs.h>
1/*
2 * Copyright (c) 1989, 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)ffs_vfsops.c 8.31 (Berkeley) 5/20/95
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: head/sys/ufs/ffs/ffs_vfsops.c 138412 2004-12-05 22:41:02Z phk $");
33__FBSDID("$FreeBSD: head/sys/ufs/ffs/ffs_vfsops.c 138509 2004-12-07 08:15:41Z phk $");
34
35#include "opt_mac.h"
36#include "opt_quota.h"
37#include "opt_ufs.h"
38#include "opt_ffs.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>

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

76static int ffs_mountfs(struct vnode *, struct mount *, struct thread *);
77static void ffs_oldfscompat_read(struct fs *, struct ufsmount *,
78 ufs2_daddr_t);
79static void ffs_oldfscompat_write(struct fs *, struct ufsmount *);
80static void ffs_ifree(struct ufsmount *ump, struct inode *ip);
81static vfs_init_t ffs_init;
82static vfs_uninit_t ffs_uninit;
83static vfs_extattrctl_t ffs_extattrctl;
34
35#include "opt_mac.h"
36#include "opt_quota.h"
37#include "opt_ufs.h"
38#include "opt_ffs.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>

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

76static int ffs_mountfs(struct vnode *, struct mount *, struct thread *);
77static void ffs_oldfscompat_read(struct fs *, struct ufsmount *,
78 ufs2_daddr_t);
79static void ffs_oldfscompat_write(struct fs *, struct ufsmount *);
80static void ffs_ifree(struct ufsmount *ump, struct inode *ip);
81static vfs_init_t ffs_init;
82static vfs_uninit_t ffs_uninit;
83static vfs_extattrctl_t ffs_extattrctl;
84static vfs_omount_t ffs_omount;
84static vfs_cmount_t ffs_cmount;
85static vfs_mount_t ffs_mount;
85
86static struct vfsops ufs_vfsops = {
87 .vfs_extattrctl = ffs_extattrctl,
88 .vfs_fhtovp = ffs_fhtovp,
89 .vfs_init = ffs_init,
86
87static struct vfsops ufs_vfsops = {
88 .vfs_extattrctl = ffs_extattrctl,
89 .vfs_fhtovp = ffs_fhtovp,
90 .vfs_init = ffs_init,
90 .vfs_omount = ffs_omount,
91 .vfs_mount = ffs_mount,
92 .vfs_cmount = ffs_cmount,
91 .vfs_quotactl = ufs_quotactl,
92 .vfs_root = ufs_root,
93 .vfs_statfs = ffs_statfs,
94 .vfs_sync = ffs_sync,
95 .vfs_uninit = ffs_uninit,
96 .vfs_unmount = ffs_unmount,
97 .vfs_vget = ffs_vget,
98 .vfs_vptofh = ffs_vptofh,

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

103static b_strategy_t ffs_geom_strategy;
104
105static struct buf_ops ffs_ops = {
106 .bop_name = "FFS",
107 .bop_write = bufwrite,
108 .bop_strategy = ffs_geom_strategy,
109};
110
93 .vfs_quotactl = ufs_quotactl,
94 .vfs_root = ufs_root,
95 .vfs_statfs = ffs_statfs,
96 .vfs_sync = ffs_sync,
97 .vfs_uninit = ffs_uninit,
98 .vfs_unmount = ffs_unmount,
99 .vfs_vget = ffs_vget,
100 .vfs_vptofh = ffs_vptofh,

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

105static b_strategy_t ffs_geom_strategy;
106
107static struct buf_ops ffs_ops = {
108 .bop_name = "FFS",
109 .bop_write = bufwrite,
110 .bop_strategy = ffs_geom_strategy,
111};
112
111/*
112 * ffs_omount
113 *
114 * Called when mounting local physical media
115 *
116 * PARAMETERS:
117 * mountroot
118 * mp mount point structure
119 * path path to mount point
120 * data <unused>
121 * ndp <unused>
122 * p process (user credentials check [statfs])
123 *
124 * mount
125 * mp mount point structure
126 * path path to mount point
127 * data pointer to argument struct in user space
128 * ndp mount point namei() return (used for
129 * credentials on reload), reused to look
130 * up block device.
131 * p process (user credentials check)
132 *
133 * RETURNS: 0 Success
134 * !0 error number (errno.h)
135 *
136 * LOCK STATE:
137 *
138 * ENTRY
139 * mount point is locked
140 * EXIT
141 * mount point is locked
142 *
143 * NOTES:
144 * A NULL path can be used for a flag since the mount
145 * system call will fail with EFAULT in copyinstr in
146 * namei() if it is a genuine NULL from the user.
147 */
113static const char *ffs_opts[] = { "from", "export", NULL };
114
148static int
115static int
149ffs_omount(struct mount *mp, char *path, caddr_t data, struct thread *td)
116ffs_mount(struct mount *mp, struct thread *td)
150{
117{
151 size_t size;
152 struct vnode *devvp, *rootvp;
153 struct ufs_args args;
118 struct vnode *devvp;
154 struct ufsmount *ump = 0;
155 struct fs *fs;
156 int error, flags;
157 mode_t accessmode;
158 struct nameidata ndp;
119 struct ufsmount *ump = 0;
120 struct fs *fs;
121 int error, flags;
122 mode_t accessmode;
123 struct nameidata ndp;
124 struct export_args *export;
125 char *fspec;
126 int len;
159
127
128 if (vfs_filteropt(mp->mnt_optnew, ffs_opts))
129 return (EINVAL);
160 if (uma_inode == NULL) {
161 uma_inode = uma_zcreate("FFS inode",
162 sizeof(struct inode), NULL, NULL, NULL, NULL,
163 UMA_ALIGN_PTR, 0);
164 uma_ufs1 = uma_zcreate("FFS1 dinode",
165 sizeof(struct ufs1_dinode), NULL, NULL, NULL, NULL,
166 UMA_ALIGN_PTR, 0);
167 uma_ufs2 = uma_zcreate("FFS2 dinode",
168 sizeof(struct ufs2_dinode), NULL, NULL, NULL, NULL,
169 UMA_ALIGN_PTR, 0);
170 }
130 if (uma_inode == NULL) {
131 uma_inode = uma_zcreate("FFS inode",
132 sizeof(struct inode), NULL, NULL, NULL, NULL,
133 UMA_ALIGN_PTR, 0);
134 uma_ufs1 = uma_zcreate("FFS1 dinode",
135 sizeof(struct ufs1_dinode), NULL, NULL, NULL, NULL,
136 UMA_ALIGN_PTR, 0);
137 uma_ufs2 = uma_zcreate("FFS2 dinode",
138 sizeof(struct ufs2_dinode), NULL, NULL, NULL, NULL,
139 UMA_ALIGN_PTR, 0);
140 }
171 if ((mp->mnt_flag & MNT_ROOTFS) && mp->mnt_data == NULL) {
172 if ((error = bdevvp(rootdev, &rootvp))) {
173 printf("ffs_mountroot: can't find rootvp\n");
174 return (error);
175 }
176
141
177 if ((error = ffs_mountfs(rootvp, mp, td)) != 0)
178 return (error);
179 return (0);
180 }
142 fspec = vfs_getopts(mp->mnt_optnew, "from", &error);
143 if (error)
144 return (error);
181
182 /*
145
146 /*
183 * Get mount options, if any.
184 */
185 if (data != NULL) {
186 error = copyin(data, (caddr_t)&args, sizeof args);
187 if (error)
188 return (error);
189 } else {
190 memset(&args, 0, sizeof args);
191 }
192
193 /*
194 * If updating, check whether changing from read-only to
195 * read/write; if there is no device name, that's all we do.
196 */
197 if (mp->mnt_flag & MNT_UPDATE) {
198 ump = VFSTOUFS(mp);
199 fs = ump->um_fs;
200 devvp = ump->um_devvp;
147 * If updating, check whether changing from read-only to
148 * read/write; if there is no device name, that's all we do.
149 */
150 if (mp->mnt_flag & MNT_UPDATE) {
151 ump = VFSTOUFS(mp);
152 fs = ump->um_fs;
153 devvp = ump->um_devvp;
201 if (fs->fs_ronly == 0 && (mp->mnt_flag & MNT_RDONLY)) {
154 if (fs->fs_ronly == 0 &&
155 vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
202 if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
203 return (error);
204 /*
205 * Flush any dirty data.
206 */
207 if ((error = VFS_SYNC(mp, MNT_WAIT,
208 td->td_ucred, td)) != 0) {
209 vn_finished_write(mp);

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

229 fs->fs_pendinginodes != 0) {
230 printf("%s: %s: blocks %jd files %d\n",
231 fs->fs_fsmnt, "update error",
232 (intmax_t)fs->fs_pendingblocks,
233 fs->fs_pendinginodes);
234 fs->fs_pendingblocks = 0;
235 fs->fs_pendinginodes = 0;
236 }
156 if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
157 return (error);
158 /*
159 * Flush any dirty data.
160 */
161 if ((error = VFS_SYNC(mp, MNT_WAIT,
162 td->td_ucred, td)) != 0) {
163 vn_finished_write(mp);

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

183 fs->fs_pendinginodes != 0) {
184 printf("%s: %s: blocks %jd files %d\n",
185 fs->fs_fsmnt, "update error",
186 (intmax_t)fs->fs_pendingblocks,
187 fs->fs_pendinginodes);
188 fs->fs_pendingblocks = 0;
189 fs->fs_pendinginodes = 0;
190 }
237 fs->fs_ronly = 1;
238 if ((fs->fs_flags & (FS_UNCLEAN | FS_NEEDSFSCK)) == 0)
239 fs->fs_clean = 1;
240 if ((error = ffs_sbupdate(ump, MNT_WAIT)) != 0) {
241 fs->fs_ronly = 0;
242 fs->fs_clean = 0;
243 vn_finished_write(mp);
244 return (error);
245 }
246 vn_finished_write(mp);
247 DROP_GIANT();
248 g_topology_lock();
249 g_access(ump->um_cp, 0, -1, 0);
250 g_topology_unlock();
251 PICKUP_GIANT();
191 if ((fs->fs_flags & (FS_UNCLEAN | FS_NEEDSFSCK)) == 0)
192 fs->fs_clean = 1;
193 if ((error = ffs_sbupdate(ump, MNT_WAIT)) != 0) {
194 fs->fs_ronly = 0;
195 fs->fs_clean = 0;
196 vn_finished_write(mp);
197 return (error);
198 }
199 vn_finished_write(mp);
200 DROP_GIANT();
201 g_topology_lock();
202 g_access(ump->um_cp, 0, -1, 0);
203 g_topology_unlock();
204 PICKUP_GIANT();
205 fs->fs_ronly = 1;
206 mp->mnt_flag |= MNT_RDONLY;
252 }
253 if ((mp->mnt_flag & MNT_RELOAD) &&
254 (error = ffs_reload(mp, td)) != 0)
255 return (error);
207 }
208 if ((mp->mnt_flag & MNT_RELOAD) &&
209 (error = ffs_reload(mp, td)) != 0)
210 return (error);
256 if (fs->fs_ronly && (mp->mnt_kern_flag & MNTK_WANTRDWR)) {
211 if (fs->fs_ronly &&
212 !vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
257 /*
258 * If upgrade to read-write by non-root, then verify
259 * that user has necessary permissions on the device.
260 */
261 if (suser(td)) {
262 vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
263 if ((error = VOP_ACCESS(devvp, VREAD | VWRITE,
264 td->td_ucred, td)) != 0) {

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

294 error = g_access(ump->um_cp, 0, 1, 0);
295 g_topology_unlock();
296 PICKUP_GIANT();
297 if (error)
298 return (error);
299 if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
300 return (error);
301 fs->fs_ronly = 0;
213 /*
214 * If upgrade to read-write by non-root, then verify
215 * that user has necessary permissions on the device.
216 */
217 if (suser(td)) {
218 vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
219 if ((error = VOP_ACCESS(devvp, VREAD | VWRITE,
220 td->td_ucred, td)) != 0) {

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

250 error = g_access(ump->um_cp, 0, 1, 0);
251 g_topology_unlock();
252 PICKUP_GIANT();
253 if (error)
254 return (error);
255 if ((error = vn_start_write(NULL, &mp, V_WAIT)) != 0)
256 return (error);
257 fs->fs_ronly = 0;
258 mp->mnt_flag &= ~MNT_RDONLY;
302 fs->fs_clean = 0;
303 if ((error = ffs_sbupdate(ump, MNT_WAIT)) != 0) {
304 vn_finished_write(mp);
305 return (error);
306 }
307 /* check to see if we need to start softdep */
308 if ((fs->fs_flags & FS_DOSOFTDEP) &&
309 (error = softdep_mount(devvp, mp, fs, td->td_ucred))){

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

321 * Softdep_mount() clears it in an initial mount
322 * or ro->rw remount.
323 */
324 if (mp->mnt_flag & MNT_SOFTDEP)
325 mp->mnt_flag &= ~MNT_ASYNC;
326 /*
327 * If not updating name, process export requests.
328 */
259 fs->fs_clean = 0;
260 if ((error = ffs_sbupdate(ump, MNT_WAIT)) != 0) {
261 vn_finished_write(mp);
262 return (error);
263 }
264 /* check to see if we need to start softdep */
265 if ((fs->fs_flags & FS_DOSOFTDEP) &&
266 (error = softdep_mount(devvp, mp, fs, td->td_ucred))){

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

278 * Softdep_mount() clears it in an initial mount
279 * or ro->rw remount.
280 */
281 if (mp->mnt_flag & MNT_SOFTDEP)
282 mp->mnt_flag &= ~MNT_ASYNC;
283 /*
284 * If not updating name, process export requests.
285 */
329 if (args.fspec == 0)
330 return (vfs_export(mp, &args.export));
286 if (fspec == NULL) {
287 error = vfs_getopt(mp->mnt_optnew,
288 "export", (void **)&export, &len);
289 if (error || len != sizeof *export)
290 return (EINVAL);
291 return (vfs_export(mp, export));
292 }
331 /*
332 * If this is a snapshot request, take the snapshot.
333 */
334 if (mp->mnt_flag & MNT_SNAPSHOT)
293 /*
294 * If this is a snapshot request, take the snapshot.
295 */
296 if (mp->mnt_flag & MNT_SNAPSHOT)
335 return (ffs_snapshot(mp, args.fspec));
297 return (ffs_snapshot(mp, fspec));
336 }
337
338 /*
339 * Not an update, or updating the name: look up the name
340 * and verify that it refers to a sensible disk device.
341 */
298 }
299
300 /*
301 * Not an update, or updating the name: look up the name
302 * and verify that it refers to a sensible disk device.
303 */
342 NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
304 NDINIT(&ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, td);
343 if ((error = namei(&ndp)) != 0)
344 return (error);
345 NDFREE(&ndp, NDF_ONLY_PNBUF);
346 devvp = ndp.ni_vp;
347 if (!vn_isdisk(devvp, &error)) {
348 vrele(devvp);
349 return (error);
350 }

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

387 * the mount point is discarded by the upper level code.
388 * Note that vfs_mount() populates f_mntonname for us.
389 */
390 if ((error = ffs_mountfs(devvp, mp, td)) != 0) {
391 vrele(devvp);
392 return (error);
393 }
394 }
305 if ((error = namei(&ndp)) != 0)
306 return (error);
307 NDFREE(&ndp, NDF_ONLY_PNBUF);
308 devvp = ndp.ni_vp;
309 if (!vn_isdisk(devvp, &error)) {
310 vrele(devvp);
311 return (error);
312 }

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

349 * the mount point is discarded by the upper level code.
350 * Note that vfs_mount() populates f_mntonname for us.
351 */
352 if ((error = ffs_mountfs(devvp, mp, td)) != 0) {
353 vrele(devvp);
354 return (error);
355 }
356 }
395 /*
396 * Save "mounted from" device name info for mount point (NULL pad).
397 */
398 copyinstr(args.fspec, mp->mnt_stat.f_mntfromname, MNAMELEN - 1, &size);
399 bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
357 vfs_mountedfrom(mp, fspec);
400 return (0);
401}
402
403/*
358 return (0);
359}
360
361/*
362 * Compatibility with old mount system call.
363 */
364
365static int
366ffs_cmount(struct mntarg *ma, void *data, int flags, struct thread *td)
367{
368 struct ufs_args args;
369 int error;
370
371 if (data == NULL)
372 return (EINVAL);
373 error = copyin(data, &args, sizeof args);
374 if (error)
375 return (error);
376
377 ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
378 ma = mount_arg(ma, "export", &args.export, sizeof args.export);
379 error = kernel_mount(ma, flags);
380
381 return (error);
382}
383
384/*
404 * Reload all incore data for a filesystem (used after running fsck on
405 * the root filesystem and finding things to fix). The filesystem must
406 * be mounted read-only.
407 *
408 * Things to do to update the mount:
409 * 1) invalidate all cached meta-data.
410 * 2) re-read superblock from disk.
411 * 3) re-read summary information from disk.

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

567 struct buf *bp;
568 struct fs *fs;
569 struct cdev *dev;
570 void *space;
571 ufs2_daddr_t sblockloc;
572 int error, i, blks, size, ronly;
573 int32_t *lp;
574 struct ucred *cred;
385 * Reload all incore data for a filesystem (used after running fsck on
386 * the root filesystem and finding things to fix). The filesystem must
387 * be mounted read-only.
388 *
389 * Things to do to update the mount:
390 * 1) invalidate all cached meta-data.
391 * 2) re-read superblock from disk.
392 * 3) re-read summary information from disk.

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

548 struct buf *bp;
549 struct fs *fs;
550 struct cdev *dev;
551 void *space;
552 ufs2_daddr_t sblockloc;
553 int error, i, blks, size, ronly;
554 int32_t *lp;
555 struct ucred *cred;
575 size_t strsize;
576 struct g_consumer *cp;
577
578 dev = devvp->v_rdev;
579 cred = td ? td->td_ucred : NOCRED;
580
581 vfs_object_create(devvp, td, td->td_ucred);
582 ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
556 struct g_consumer *cp;
557
558 dev = devvp->v_rdev;
559 cred = td ? td->td_ucred : NOCRED;
560
561 vfs_object_create(devvp, td, td->td_ucred);
562 ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
583#if 0
584 /*
585 * XXX: check filesystem permissions, they may be more strict
586 * XXX: than what geom enforces.
587 * XXX: But since we're root, they wouldn't matter, would they ?
588 */
589 error = VOP_ACCESS(devvp, ronly ? FREAD : FREAD | FWRITE, FSCRED, td);
590 if (error) {
591 VOP_UNLOCK(devvp, 0, td);
592 return (error);
593 }
594#endif
595 DROP_GIANT();
596 g_topology_lock();
597 error = g_vfs_open(devvp, &cp, "ffs", ronly ? 0 : 1);
598
599 /*
600 * If we are a root mount, drop the E flag so fsck can do its magic.
601 * We will pick it up again when we remount R/W.
602 */

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

765 for (i = 0; i < MAXQUOTAS; i++)
766 ump->um_quotas[i] = NULLVP;
767#ifdef UFS_EXTATTR
768 ufs_extattr_uepm_init(&ump->um_extattr);
769#endif
770 /*
771 * Set FS local "last mounted on" information (NULL pad)
772 */
563 DROP_GIANT();
564 g_topology_lock();
565 error = g_vfs_open(devvp, &cp, "ffs", ronly ? 0 : 1);
566
567 /*
568 * If we are a root mount, drop the E flag so fsck can do its magic.
569 * We will pick it up again when we remount R/W.
570 */

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

733 for (i = 0; i < MAXQUOTAS; i++)
734 ump->um_quotas[i] = NULLVP;
735#ifdef UFS_EXTATTR
736 ufs_extattr_uepm_init(&ump->um_extattr);
737#endif
738 /*
739 * Set FS local "last mounted on" information (NULL pad)
740 */
773 copystr( mp->mnt_stat.f_mntonname, /* mount point*/
774 fs->fs_fsmnt, /* copy area*/
775 sizeof(fs->fs_fsmnt) - 1, /* max size*/
776 &strsize); /* real size*/
777 bzero( fs->fs_fsmnt + strsize, sizeof(fs->fs_fsmnt) - strsize);
741 vfs_mountedfrom(mp, fs->fs_fsmnt);
778
779 if( mp->mnt_flag & MNT_ROOTFS) {
780 /*
781 * Root mount; update timestamp in mount structure.
782 * this will be used by the common root mount code
783 * to update the system clock.
784 */
785 mp->mnt_time = fs->fs_time;

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

795 ffs_snapshot_mount(mp);
796 fs->fs_fmod = 1;
797 fs->fs_clean = 0;
798 (void) ffs_sbupdate(ump, MNT_WAIT);
799 }
800 /*
801 * Initialize filesystem stat information in mount struct.
802 */
742
743 if( mp->mnt_flag & MNT_ROOTFS) {
744 /*
745 * Root mount; update timestamp in mount structure.
746 * this will be used by the common root mount code
747 * to update the system clock.
748 */
749 mp->mnt_time = fs->fs_time;

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

759 ffs_snapshot_mount(mp);
760 fs->fs_fmod = 1;
761 fs->fs_clean = 0;
762 (void) ffs_sbupdate(ump, MNT_WAIT);
763 }
764 /*
765 * Initialize filesystem stat information in mount struct.
766 */
803 (void)VFS_STATFS(mp, &mp->mnt_stat, td);
804#ifdef UFS_EXTATTR
805#ifdef UFS_EXTATTR_AUTOSTART
806 /*
807 *
808 * Auto-starting does the following:
809 * - check for /.attribute in the fs, and extattr_start if so
810 * - for each file in .attribute, enable that file with
811 * an attribute of the same name.

--- 725 unchanged lines hidden ---
767#ifdef UFS_EXTATTR
768#ifdef UFS_EXTATTR_AUTOSTART
769 /*
770 *
771 * Auto-starting does the following:
772 * - check for /.attribute in the fs, and extattr_start if so
773 * - for each file in .attribute, enable that file with
774 * an attribute of the same name.

--- 725 unchanged lines hidden ---