dir.c (8b0ad3d489cb107804bd8c78695532794eec73d5) | dir.c (1ca42382afd67bf58523d36b00fb4ff487d8173b) |
---|---|
1/* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir --- 1628 unchanged lines hidden (view full) --- 1637 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 1638 1639 if (!new_valid_dev(rdev)) 1640 return -EINVAL; 1641 1642 attr.ia_mode = mode; 1643 attr.ia_valid = ATTR_MODE; 1644 | 1/* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir --- 1628 unchanged lines hidden (view full) --- 1637 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 1638 1639 if (!new_valid_dev(rdev)) 1640 return -EINVAL; 1641 1642 attr.ia_mode = mode; 1643 attr.ia_valid = ATTR_MODE; 1644 |
1645 trace_nfs_mknod_enter(dir, dentry); |
|
1645 status = NFS_PROTO(dir)->mknod(dir, dentry, &attr, rdev); | 1646 status = NFS_PROTO(dir)->mknod(dir, dentry, &attr, rdev); |
1647 trace_nfs_mknod_exit(dir, dentry, status); |
|
1646 if (status != 0) 1647 goto out_err; 1648 return 0; 1649out_err: 1650 d_drop(dentry); 1651 return status; 1652} 1653EXPORT_SYMBOL_GPL(nfs_mknod); --- 7 unchanged lines hidden (view full) --- 1661 int error; 1662 1663 dfprintk(VFS, "NFS: mkdir(%s/%ld), %s\n", 1664 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 1665 1666 attr.ia_valid = ATTR_MODE; 1667 attr.ia_mode = mode | S_IFDIR; 1668 | 1648 if (status != 0) 1649 goto out_err; 1650 return 0; 1651out_err: 1652 d_drop(dentry); 1653 return status; 1654} 1655EXPORT_SYMBOL_GPL(nfs_mknod); --- 7 unchanged lines hidden (view full) --- 1663 int error; 1664 1665 dfprintk(VFS, "NFS: mkdir(%s/%ld), %s\n", 1666 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 1667 1668 attr.ia_valid = ATTR_MODE; 1669 attr.ia_mode = mode | S_IFDIR; 1670 |
1671 trace_nfs_mkdir_enter(dir, dentry); |
|
1669 error = NFS_PROTO(dir)->mkdir(dir, dentry, &attr); | 1672 error = NFS_PROTO(dir)->mkdir(dir, dentry, &attr); |
1673 trace_nfs_mkdir_exit(dir, dentry, error); |
|
1670 if (error != 0) 1671 goto out_err; 1672 return 0; 1673out_err: 1674 d_drop(dentry); 1675 return error; 1676} 1677EXPORT_SYMBOL_GPL(nfs_mkdir); --- 6 unchanged lines hidden (view full) --- 1684 1685int nfs_rmdir(struct inode *dir, struct dentry *dentry) 1686{ 1687 int error; 1688 1689 dfprintk(VFS, "NFS: rmdir(%s/%ld), %s\n", 1690 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 1691 | 1674 if (error != 0) 1675 goto out_err; 1676 return 0; 1677out_err: 1678 d_drop(dentry); 1679 return error; 1680} 1681EXPORT_SYMBOL_GPL(nfs_mkdir); --- 6 unchanged lines hidden (view full) --- 1688 1689int nfs_rmdir(struct inode *dir, struct dentry *dentry) 1690{ 1691 int error; 1692 1693 dfprintk(VFS, "NFS: rmdir(%s/%ld), %s\n", 1694 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 1695 |
1696 trace_nfs_rmdir_enter(dir, dentry); |
|
1692 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); 1693 /* Ensure the VFS deletes this inode */ 1694 if (error == 0 && dentry->d_inode != NULL) 1695 clear_nlink(dentry->d_inode); 1696 else if (error == -ENOENT) 1697 nfs_dentry_handle_enoent(dentry); | 1697 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); 1698 /* Ensure the VFS deletes this inode */ 1699 if (error == 0 && dentry->d_inode != NULL) 1700 clear_nlink(dentry->d_inode); 1701 else if (error == -ENOENT) 1702 nfs_dentry_handle_enoent(dentry); |
1703 trace_nfs_rmdir_exit(dir, dentry, error); |
|
1698 1699 return error; 1700} 1701EXPORT_SYMBOL_GPL(nfs_rmdir); 1702 1703/* 1704 * Remove a file after making sure there are no pending writes, 1705 * and after checking that the file has only one user. --- 11 unchanged lines hidden (view full) --- 1717 dentry->d_parent->d_name.name, dentry->d_name.name); 1718 1719 /* If the dentry was sillyrenamed, we simply call d_delete() */ 1720 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { 1721 error = 0; 1722 goto out; 1723 } 1724 | 1704 1705 return error; 1706} 1707EXPORT_SYMBOL_GPL(nfs_rmdir); 1708 1709/* 1710 * Remove a file after making sure there are no pending writes, 1711 * and after checking that the file has only one user. --- 11 unchanged lines hidden (view full) --- 1723 dentry->d_parent->d_name.name, dentry->d_name.name); 1724 1725 /* If the dentry was sillyrenamed, we simply call d_delete() */ 1726 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { 1727 error = 0; 1728 goto out; 1729 } 1730 |
1731 trace_nfs_remove_enter(dir, dentry); |
|
1725 if (inode != NULL) { 1726 NFS_PROTO(inode)->return_delegation(inode); 1727 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); 1728 if (error == 0) 1729 nfs_drop_nlink(inode); 1730 } else 1731 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); 1732 if (error == -ENOENT) 1733 nfs_dentry_handle_enoent(dentry); | 1732 if (inode != NULL) { 1733 NFS_PROTO(inode)->return_delegation(inode); 1734 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); 1735 if (error == 0) 1736 nfs_drop_nlink(inode); 1737 } else 1738 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); 1739 if (error == -ENOENT) 1740 nfs_dentry_handle_enoent(dentry); |
1741 trace_nfs_remove_exit(dir, dentry, error); |
|
1734out: 1735 return error; 1736} 1737 1738/* We do silly rename. In case sillyrename() returns -EBUSY, the inode 1739 * belongs to an active ".nfs..." file and we return -EBUSY. 1740 * 1741 * If sillyrename() returns 0, we do nothing, otherwise we unlink. 1742 */ 1743int nfs_unlink(struct inode *dir, struct dentry *dentry) 1744{ 1745 int error; 1746 int need_rehash = 0; 1747 1748 dfprintk(VFS, "NFS: unlink(%s/%ld, %s)\n", dir->i_sb->s_id, 1749 dir->i_ino, dentry->d_name.name); 1750 | 1742out: 1743 return error; 1744} 1745 1746/* We do silly rename. In case sillyrename() returns -EBUSY, the inode 1747 * belongs to an active ".nfs..." file and we return -EBUSY. 1748 * 1749 * If sillyrename() returns 0, we do nothing, otherwise we unlink. 1750 */ 1751int nfs_unlink(struct inode *dir, struct dentry *dentry) 1752{ 1753 int error; 1754 int need_rehash = 0; 1755 1756 dfprintk(VFS, "NFS: unlink(%s/%ld, %s)\n", dir->i_sb->s_id, 1757 dir->i_ino, dentry->d_name.name); 1758 |
1759 trace_nfs_unlink_enter(dir, dentry); |
|
1751 spin_lock(&dentry->d_lock); 1752 if (d_count(dentry) > 1) { 1753 spin_unlock(&dentry->d_lock); 1754 /* Start asynchronous writeout of the inode */ 1755 write_inode_now(dentry->d_inode, 0); 1756 error = nfs_sillyrename(dir, dentry); | 1760 spin_lock(&dentry->d_lock); 1761 if (d_count(dentry) > 1) { 1762 spin_unlock(&dentry->d_lock); 1763 /* Start asynchronous writeout of the inode */ 1764 write_inode_now(dentry->d_inode, 0); 1765 error = nfs_sillyrename(dir, dentry); |
1757 return error; | 1766 goto out; |
1758 } 1759 if (!d_unhashed(dentry)) { 1760 __d_drop(dentry); 1761 need_rehash = 1; 1762 } 1763 spin_unlock(&dentry->d_lock); 1764 error = nfs_safe_remove(dentry); 1765 if (!error || error == -ENOENT) { 1766 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1767 } else if (need_rehash) 1768 d_rehash(dentry); | 1767 } 1768 if (!d_unhashed(dentry)) { 1769 __d_drop(dentry); 1770 need_rehash = 1; 1771 } 1772 spin_unlock(&dentry->d_lock); 1773 error = nfs_safe_remove(dentry); 1774 if (!error || error == -ENOENT) { 1775 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1776 } else if (need_rehash) 1777 d_rehash(dentry); |
1778out: 1779 trace_nfs_unlink_exit(dir, dentry, error); |
|
1769 return error; 1770} 1771EXPORT_SYMBOL_GPL(nfs_unlink); 1772 1773/* 1774 * To create a symbolic link, most file systems instantiate a new inode, 1775 * add a page to it containing the path, then write it out to the disk 1776 * using prepare_write/commit_write. --- 30 unchanged lines hidden (view full) --- 1807 return -ENOMEM; 1808 1809 kaddr = kmap_atomic(page); 1810 memcpy(kaddr, symname, pathlen); 1811 if (pathlen < PAGE_SIZE) 1812 memset(kaddr + pathlen, 0, PAGE_SIZE - pathlen); 1813 kunmap_atomic(kaddr); 1814 | 1780 return error; 1781} 1782EXPORT_SYMBOL_GPL(nfs_unlink); 1783 1784/* 1785 * To create a symbolic link, most file systems instantiate a new inode, 1786 * add a page to it containing the path, then write it out to the disk 1787 * using prepare_write/commit_write. --- 30 unchanged lines hidden (view full) --- 1818 return -ENOMEM; 1819 1820 kaddr = kmap_atomic(page); 1821 memcpy(kaddr, symname, pathlen); 1822 if (pathlen < PAGE_SIZE) 1823 memset(kaddr + pathlen, 0, PAGE_SIZE - pathlen); 1824 kunmap_atomic(kaddr); 1825 |
1826 trace_nfs_symlink_enter(dir, dentry); |
|
1815 error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr); | 1827 error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr); |
1828 trace_nfs_symlink_exit(dir, dentry, error); |
|
1816 if (error != 0) { 1817 dfprintk(VFS, "NFS: symlink(%s/%ld, %s, %s) error %d\n", 1818 dir->i_sb->s_id, dir->i_ino, 1819 dentry->d_name.name, symname, error); 1820 d_drop(dentry); 1821 __free_page(page); 1822 return error; 1823 } --- 482 unchanged lines hidden --- | 1829 if (error != 0) { 1830 dfprintk(VFS, "NFS: symlink(%s/%ld, %s, %s) error %d\n", 1831 dir->i_sb->s_id, dir->i_ino, 1832 dentry->d_name.name, symname, error); 1833 d_drop(dentry); 1834 __free_page(page); 1835 return error; 1836 } --- 482 unchanged lines hidden --- |