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