Deleted Added
full compact
union_vnops.c (178484) union_vnops.c (178491)
1/*-
2 * Copyright (c) 1992, 1993, 1994, 1995 Jan-Simon Pendry.
3 * Copyright (c) 1992, 1993, 1994, 1995
4 * The Regents of the University of California.
5 * Copyright (c) 2005, 2006 Masanori Ozawa <ozawa@ongs.co.jp>, ONGS Inc.
6 * Copyright (c) 2006 Daichi Goto <daichi@freebsd.org>
7 * All rights reserved.
8 *

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

29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)union_vnops.c 8.32 (Berkeley) 6/23/95
1/*-
2 * Copyright (c) 1992, 1993, 1994, 1995 Jan-Simon Pendry.
3 * Copyright (c) 1992, 1993, 1994, 1995
4 * The Regents of the University of California.
5 * Copyright (c) 2005, 2006 Masanori Ozawa <ozawa@ongs.co.jp>, ONGS Inc.
6 * Copyright (c) 2006 Daichi Goto <daichi@freebsd.org>
7 * All rights reserved.
8 *

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

29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)union_vnops.c 8.32 (Berkeley) 6/23/95
37 * $FreeBSD: head/sys/fs/unionfs/union_vnops.c 178484 2008-04-25 09:44:47Z daichi $
37 * $FreeBSD: head/sys/fs/unionfs/union_vnops.c 178491 2008-04-25 11:37:20Z daichi $
38 *
39 */
40
41#include <sys/param.h>
42#include <sys/systm.h>
43#include <sys/conf.h>
44#include <sys/kernel.h>
45#include <sys/lock.h>

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

498 unsp->uns_lower_opencnt++;
499 unsp->uns_lower_openmode = ap->a_mode;
500 }
501 ap->a_vp->v_object = targetvp->v_object;
502 }
503
504unionfs_open_abort:
505 if (error != 0)
38 *
39 */
40
41#include <sys/param.h>
42#include <sys/systm.h>
43#include <sys/conf.h>
44#include <sys/kernel.h>
45#include <sys/lock.h>

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

498 unsp->uns_lower_opencnt++;
499 unsp->uns_lower_openmode = ap->a_mode;
500 }
501 ap->a_vp->v_object = targetvp->v_object;
502 }
503
504unionfs_open_abort:
505 if (error != 0)
506 unionfs_tryrem_node_status(unp, td, unsp);
506 unionfs_tryrem_node_status(unp, unsp);
507
508 UNIONFS_INTERNAL_DEBUG("unionfs_open: leave (%d)\n", error);
509
510 return (error);
511}
512
513static int
514unionfs_close(struct vop_close_args *ap)

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

564 }
565 if (unsp->uns_lower_opencnt > 0)
566 ap->a_vp->v_object = unp->un_lowervp->v_object;
567 }
568 } else
569 unsp->uns_lower_opencnt--;
570
571unionfs_close_abort:
507
508 UNIONFS_INTERNAL_DEBUG("unionfs_open: leave (%d)\n", error);
509
510 return (error);
511}
512
513static int
514unionfs_close(struct vop_close_args *ap)

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

564 }
565 if (unsp->uns_lower_opencnt > 0)
566 ap->a_vp->v_object = unp->un_lowervp->v_object;
567 }
568 } else
569 unsp->uns_lower_opencnt--;
570
571unionfs_close_abort:
572 unionfs_tryrem_node_status(unp, td, unsp);
572 unionfs_tryrem_node_status(unp, unsp);
573
574 if (locked != 0)
575 VOP_UNLOCK(ap->a_vp, 0);
576
577 UNIONFS_INTERNAL_DEBUG("unionfs_close: leave (%d)\n", error);
578
579 return (error);
580}

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

872 struct vnode *ovp;
873
874 UNIONFS_INTERNAL_DEBUG("unionfs_ioctl: enter\n");
875
876 vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
877 unp = VTOUNIONFS(ap->a_vp);
878 unionfs_get_node_status(unp, ap->a_td, &unsp);
879 ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
573
574 if (locked != 0)
575 VOP_UNLOCK(ap->a_vp, 0);
576
577 UNIONFS_INTERNAL_DEBUG("unionfs_close: leave (%d)\n", error);
578
579 return (error);
580}

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

872 struct vnode *ovp;
873
874 UNIONFS_INTERNAL_DEBUG("unionfs_ioctl: enter\n");
875
876 vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
877 unp = VTOUNIONFS(ap->a_vp);
878 unionfs_get_node_status(unp, ap->a_td, &unsp);
879 ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
880 unionfs_tryrem_node_status(unp, ap->a_td, unsp);
880 unionfs_tryrem_node_status(unp, unsp);
881 VOP_UNLOCK(ap->a_vp, 0);
882
883 if (ovp == NULLVP)
884 return (EBADF);
885
886 error = VOP_IOCTL(ovp, ap->a_command, ap->a_data, ap->a_fflag,
887 ap->a_cred, ap->a_td);
888

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

897 struct unionfs_node *unp;
898 struct unionfs_node_status *unsp;
899 struct vnode *ovp;
900
901 vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
902 unp = VTOUNIONFS(ap->a_vp);
903 unionfs_get_node_status(unp, ap->a_td, &unsp);
904 ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
881 VOP_UNLOCK(ap->a_vp, 0);
882
883 if (ovp == NULLVP)
884 return (EBADF);
885
886 error = VOP_IOCTL(ovp, ap->a_command, ap->a_data, ap->a_fflag,
887 ap->a_cred, ap->a_td);
888

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

897 struct unionfs_node *unp;
898 struct unionfs_node_status *unsp;
899 struct vnode *ovp;
900
901 vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
902 unp = VTOUNIONFS(ap->a_vp);
903 unionfs_get_node_status(unp, ap->a_td, &unsp);
904 ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
905 unionfs_tryrem_node_status(unp, ap->a_td, unsp);
905 unionfs_tryrem_node_status(unp, unsp);
906 VOP_UNLOCK(ap->a_vp, 0);
907
908 if (ovp == NULLVP)
909 return (EBADF);
910
911 return (VOP_POLL(ovp, ap->a_events, ap->a_cred, ap->a_td));
912}
913
914static int
915unionfs_fsync(struct vop_fsync_args *ap)
916{
917 struct unionfs_node *unp;
918 struct unionfs_node_status *unsp;
919 struct vnode *ovp;
920
921 unp = VTOUNIONFS(ap->a_vp);
922 unionfs_get_node_status(unp, ap->a_td, &unsp);
923 ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
906 VOP_UNLOCK(ap->a_vp, 0);
907
908 if (ovp == NULLVP)
909 return (EBADF);
910
911 return (VOP_POLL(ovp, ap->a_events, ap->a_cred, ap->a_td));
912}
913
914static int
915unionfs_fsync(struct vop_fsync_args *ap)
916{
917 struct unionfs_node *unp;
918 struct unionfs_node_status *unsp;
919 struct vnode *ovp;
920
921 unp = VTOUNIONFS(ap->a_vp);
922 unionfs_get_node_status(unp, ap->a_td, &unsp);
923 ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
924 unionfs_tryrem_node_status(unp, ap->a_td, unsp);
924 unionfs_tryrem_node_status(unp, unsp);
925
926 if (ovp == NULLVP)
927 return (EBADF);
928
929 return (VOP_FSYNC(ovp, ap->a_waitfor, ap->a_td));
930}
931
932static int

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

1421 /* check the open count. unionfs needs to open before readdir. */
1422 if (VOP_ISLOCKED(ap->a_vp) != LK_EXCLUSIVE) {
1423 vn_lock(ap->a_vp, LK_UPGRADE | LK_RETRY);
1424 locked = 1;
1425 }
1426 unionfs_get_node_status(unp, td, &unsp);
1427 if ((uvp != NULLVP && unsp->uns_upper_opencnt <= 0) ||
1428 (lvp != NULLVP && unsp->uns_lower_opencnt <= 0)) {
925
926 if (ovp == NULLVP)
927 return (EBADF);
928
929 return (VOP_FSYNC(ovp, ap->a_waitfor, ap->a_td));
930}
931
932static int

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

1421 /* check the open count. unionfs needs to open before readdir. */
1422 if (VOP_ISLOCKED(ap->a_vp) != LK_EXCLUSIVE) {
1423 vn_lock(ap->a_vp, LK_UPGRADE | LK_RETRY);
1424 locked = 1;
1425 }
1426 unionfs_get_node_status(unp, td, &unsp);
1427 if ((uvp != NULLVP && unsp->uns_upper_opencnt <= 0) ||
1428 (lvp != NULLVP && unsp->uns_lower_opencnt <= 0)) {
1429 unionfs_tryrem_node_status(unp, td, unsp);
1429 unionfs_tryrem_node_status(unp, unsp);
1430 error = EBADF;
1431 }
1432 if (locked == 1)
1433 vn_lock(ap->a_vp, LK_DOWNGRADE | LK_RETRY);
1434 if (error != 0)
1435 goto unionfs_readdir_exit;
1436
1437 /* upper only */

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

1887 error = VOP_OPEN(uvp, unsp->uns_lower_openmode,
1888 td->td_ucred, td, NULL);
1889 if (error)
1890 goto unionfs_advlock_abort;
1891 unsp->uns_upper_opencnt++;
1892 VOP_CLOSE(unp->un_lowervp, unsp->uns_lower_openmode, td->td_ucred, td);
1893 unsp->uns_lower_opencnt--;
1894 } else
1430 error = EBADF;
1431 }
1432 if (locked == 1)
1433 vn_lock(ap->a_vp, LK_DOWNGRADE | LK_RETRY);
1434 if (error != 0)
1435 goto unionfs_readdir_exit;
1436
1437 /* upper only */

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

1887 error = VOP_OPEN(uvp, unsp->uns_lower_openmode,
1888 td->td_ucred, td, NULL);
1889 if (error)
1890 goto unionfs_advlock_abort;
1891 unsp->uns_upper_opencnt++;
1892 VOP_CLOSE(unp->un_lowervp, unsp->uns_lower_openmode, td->td_ucred, td);
1893 unsp->uns_lower_opencnt--;
1894 } else
1895 unionfs_tryrem_node_status(unp, td, unsp);
1895 unionfs_tryrem_node_status(unp, unsp);
1896 }
1897
1898 VOP_UNLOCK(vp, 0);
1899
1900 error = VOP_ADVLOCK(uvp, ap->a_id, ap->a_op, ap->a_fl, ap->a_flags);
1901
1902 UNIONFS_INTERNAL_DEBUG("unionfs_advlock: leave (%d)\n", error);
1903

--- 425 unchanged lines hidden ---
1896 }
1897
1898 VOP_UNLOCK(vp, 0);
1899
1900 error = VOP_ADVLOCK(uvp, ap->a_id, ap->a_op, ap->a_fl, ap->a_flags);
1901
1902 UNIONFS_INTERNAL_DEBUG("unionfs_advlock: leave (%d)\n", error);
1903

--- 425 unchanged lines hidden ---