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 --- |