Module Name: src Committed By: dholland Date: Sat May 17 07:09:59 UTC 2014
Modified Files: src/sys/ufs/lfs: lfs_vnops.c ulfs_extern.h Log Message: Merge ulfs_mkdir into lfs_mkdir. To generate a diff of this commit: cvs rdiff -u -r1.266 -r1.267 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.11 -r1.12 src/sys/ufs/lfs/ulfs_extern.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.266 src/sys/ufs/lfs/lfs_vnops.c:1.267 --- src/sys/ufs/lfs/lfs_vnops.c:1.266 Sat May 17 07:09:36 2014 +++ src/sys/ufs/lfs/lfs_vnops.c Sat May 17 07:09:59 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.266 2014/05/17 07:09:36 dholland Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.267 2014/05/17 07:09:59 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.266 2014/05/17 07:09:36 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.267 2014/05/17 07:09:59 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -952,37 +952,77 @@ lfs_create(void *v) } int -ulfs_mkdir(void *v) +lfs_mkdir(void *v) { - struct vop_mkdir_v3_args /* { - struct vnode *a_dvp; - struct vnode **a_vpp; - struct componentname *a_cnp; - struct vattr *a_vap; + struct vop_mkdir_v3_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; } */ *ap = v; - struct vnode *dvp = ap->a_dvp, *tvp; - struct vattr *vap = ap->a_vap; - struct componentname *cnp = ap->a_cnp; - struct inode *ip, *dp = VTOI(dvp); - struct buf *bp; - struct lfs_dirtemplate dirtemplate; - struct lfs_direct *newdir; - int error, dmode; - struct ulfsmount *ump = dp->i_ump; - struct lfs *fs = ump->um_lfs; - int dirblksiz = fs->um_dirblksiz; + struct lfs *fs; + struct vnode *dvp, *tvp, **vpp; + struct inode *dp, *ip; + struct componentname *cnp; + struct vattr *vap; struct ulfs_lookup_results *ulr; + struct buf *bp; + struct lfs_dirtemplate dirtemplate; + struct lfs_direct *newdir; + int dirblksiz; + int dmode; + int error; - fstrans_start(dvp->v_mount, FSTRANS_SHARED); + dvp = ap->a_dvp; + tvp = NULL; + vpp = ap->a_vpp; + cnp = ap->a_cnp; + vap = ap->a_vap; + + dp = VTOI(dvp); + ip = NULL; + + KASSERT(vpp != NULL); + KASSERT(*vpp == NULL); /* XXX should handle this material another way */ ulr = &dp->i_crap; ULFS_CHECK_CRAPCOUNTER(dp); + fs = VFSTOULFS(dvp->v_mount)->um_lfs; + ASSERT_NO_SEGLOCK(fs); + if (fs->lfs_ronly) { + return EROFS; + } + dirblksiz = fs->um_dirblksiz; + + /* + * Get a new vnode *before* adjusting the dirop count, to + * avoid a deadlock in getnewvnode(), if we have a stacked + * filesystem mounted on top of us. + * + * NB: this means we have to destroy the new vnode on error. + */ + + error = getnewvnode(VT_LFS, dvp->v_mount, lfs_vnodeop_p, NULL, vpp); + if (error) { + DLOG((DLOG_ALLOC, "lfs_mkdir: dvp %p error %d\n", dvp, error)); + return error; + } + error = lfs_set_dirop(dvp, NULL); + if (error) { + ungetnewvnode(*vpp); + *vpp = NULL; + return error; + } + + fstrans_start(dvp->v_mount, FSTRANS_SHARED); + if ((nlink_t)dp->i_nlink >= LINK_MAX) { error = EMLINK; goto out; } + dmode = vap->va_mode & ACCESSPERMS; dmode |= LFS_IFDIR; /* @@ -990,10 +1030,10 @@ ulfs_mkdir(void *v) * but not have it entered in the parent directory. The entry is * made later after writing "." and ".." entries. */ - if ((error = lfs_valloc(dvp, dmode, cnp->cn_cred, ap->a_vpp)) != 0) + if ((error = lfs_valloc(dvp, dmode, cnp->cn_cred, vpp)) != 0) goto out; - tvp = *ap->a_vpp; + tvp = *vpp; ip = VTOI(tvp); ip->i_uid = kauth_cred_geteuid(cnp->cn_cred); @@ -1005,7 +1045,7 @@ ulfs_mkdir(void *v) lfs_vfree(tvp, ip->i_number, dmode); fstrans_done(dvp->v_mount); vput(tvp); - return (error); + goto out2; } #endif ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; @@ -1021,8 +1061,6 @@ ulfs_mkdir(void *v) /* * Bump link count in parent directory to reflect work done below. - * Should be done before reference is created so cleanup is - * possible if we crash. */ dp->i_nlink++; DIP_ASSIGN(dp, nlink, dp->i_nlink); @@ -1064,9 +1102,7 @@ ulfs_mkdir(void *v) memcpy((void *)bp->b_data, (void *)&dirtemplate, sizeof dirtemplate); /* - * Directory set up, now install it's entry in the parent directory. - * We must write out the buffer containing the new directory body - * before entering the new name in the parent. + * Directory set up; now install its entry in the parent directory. */ if ((error = VOP_BWRITE(bp->b_vp, bp)) != 0) goto bad; @@ -1096,57 +1132,12 @@ ulfs_mkdir(void *v) lfs_unmark_vnode(tvp); vput(tvp); } - out: - fstrans_done(dvp->v_mount); - return (error); -} - -int -lfs_mkdir(void *v) -{ - struct vop_mkdir_v3_args /* { - struct vnode *a_dvp; - struct vnode **a_vpp; - struct componentname *a_cnp; - struct vattr *a_vap; - } */ *ap = v; - struct lfs *fs; - struct vnode *dvp, **vpp; - int error; - - dvp = ap->a_dvp; - vpp = ap->a_vpp; - - KASSERT(vpp != NULL); - KASSERT(*vpp == NULL); - - fs = VFSTOULFS(dvp->v_mount)->um_lfs; - ASSERT_NO_SEGLOCK(fs); - if (fs->lfs_ronly) { - return EROFS; - } - - /* - * Get a new vnode *before* adjusting the dirop count, to - * avoid a deadlock in getnewvnode(), if we have a stacked - * filesystem mounted on top of us. - * - * NB: this means we have to destroy the new vnode on error. - */ - - error = getnewvnode(VT_LFS, dvp->v_mount, lfs_vnodeop_p, NULL, vpp); - if (error) { - DLOG((DLOG_ALLOC, "lfs_mkdir: dvp %p error %d\n", dvp, error)); - return error; - } - error = lfs_set_dirop(dvp, NULL); - if (error) { - ungetnewvnode(*vpp); - *vpp = NULL; - return error; - } - error = ulfs_mkdir(ap); +out: + fstrans_done(dvp->v_mount); +#if defined(LFS_QUOTA) || defined(LFS_QUOTA2) +out2: +#endif UNMARK_VNODE(dvp); UNMARK_VNODE(*vpp); Index: src/sys/ufs/lfs/ulfs_extern.h diff -u src/sys/ufs/lfs/ulfs_extern.h:1.11 src/sys/ufs/lfs/ulfs_extern.h:1.12 --- src/sys/ufs/lfs/ulfs_extern.h:1.11 Sat May 17 07:09:36 2014 +++ src/sys/ufs/lfs/ulfs_extern.h Sat May 17 07:09:59 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_extern.h,v 1.11 2014/05/17 07:09:36 dholland Exp $ */ +/* $NetBSD: ulfs_extern.h,v 1.12 2014/05/17 07:09:59 dholland Exp $ */ /* from NetBSD: ufs_extern.h,v 1.72 2012/05/09 00:21:18 riastradh Exp */ /*- @@ -75,8 +75,6 @@ int ulfs_inactive(void *); int ulfs_link(void *); #define ulfs_lock genfs_lock int ulfs_lookup(void *); -int ulfs_mkdir(void *); -int ulfs_mknod(void *); #define ulfs_mmap genfs_mmap #define ulfs_revoke genfs_revoke int ulfs_open(void *);