aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/dir.c
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2014-02-20 08:54:28 -0500
committerJiri Kosina <jkosina@suse.cz>2014-02-20 08:54:28 -0500
commitd4263348f796f29546f90802177865dd4379dd0a (patch)
treeadcbdaebae584eee2f32fab95e826e8e49eef385 /fs/nfs/dir.c
parentbe873ac782f5ff5ee6675f83929f4fe6737eead2 (diff)
parent6d0abeca3242a88cab8232e4acd7e2bf088f3bc2 (diff)
Merge branch 'master' into for-next
Diffstat (limited to 'fs/nfs/dir.c')
-rw-r--r--fs/nfs/dir.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 812154aff981..4a48fe4b84b6 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -274,6 +274,15 @@ out_eof:
274 return -EBADCOOKIE; 274 return -EBADCOOKIE;
275} 275}
276 276
277static bool
278nfs_readdir_inode_mapping_valid(struct nfs_inode *nfsi)
279{
280 if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))
281 return false;
282 smp_rmb();
283 return !test_bit(NFS_INO_INVALIDATING, &nfsi->flags);
284}
285
277static 286static
278int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc) 287int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)
279{ 288{
@@ -287,8 +296,8 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des
287 struct nfs_open_dir_context *ctx = desc->file->private_data; 296 struct nfs_open_dir_context *ctx = desc->file->private_data;
288 297
289 new_pos = desc->current_index + i; 298 new_pos = desc->current_index + i;
290 if (ctx->attr_gencount != nfsi->attr_gencount 299 if (ctx->attr_gencount != nfsi->attr_gencount ||
291 || (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))) { 300 !nfs_readdir_inode_mapping_valid(nfsi)) {
292 ctx->duped = 0; 301 ctx->duped = 0;
293 ctx->attr_gencount = nfsi->attr_gencount; 302 ctx->attr_gencount = nfsi->attr_gencount;
294 } else if (new_pos < desc->ctx->pos) { 303 } else if (new_pos < desc->ctx->pos) {
@@ -1404,7 +1413,7 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
1404 /* Expect a negative dentry */ 1413 /* Expect a negative dentry */
1405 BUG_ON(dentry->d_inode); 1414 BUG_ON(dentry->d_inode);
1406 1415
1407 dfprintk(VFS, "NFS: atomic_open(%s/%ld), %pd\n", 1416 dfprintk(VFS, "NFS: atomic_open(%s/%lu), %pd\n",
1408 dir->i_sb->s_id, dir->i_ino, dentry); 1417 dir->i_sb->s_id, dir->i_ino, dentry);
1409 1418
1410 err = nfs_check_flags(open_flags); 1419 err = nfs_check_flags(open_flags);
@@ -1594,7 +1603,7 @@ int nfs_create(struct inode *dir, struct dentry *dentry,
1594 int open_flags = excl ? O_CREAT | O_EXCL : O_CREAT; 1603 int open_flags = excl ? O_CREAT | O_EXCL : O_CREAT;
1595 int error; 1604 int error;
1596 1605
1597 dfprintk(VFS, "NFS: create(%s/%ld), %pd\n", 1606 dfprintk(VFS, "NFS: create(%s/%lu), %pd\n",
1598 dir->i_sb->s_id, dir->i_ino, dentry); 1607 dir->i_sb->s_id, dir->i_ino, dentry);
1599 1608
1600 attr.ia_mode = mode; 1609 attr.ia_mode = mode;
@@ -1621,7 +1630,7 @@ nfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev)
1621 struct iattr attr; 1630 struct iattr attr;
1622 int status; 1631 int status;
1623 1632
1624 dfprintk(VFS, "NFS: mknod(%s/%ld), %pd\n", 1633 dfprintk(VFS, "NFS: mknod(%s/%lu), %pd\n",
1625 dir->i_sb->s_id, dir->i_ino, dentry); 1634 dir->i_sb->s_id, dir->i_ino, dentry);
1626 1635
1627 if (!new_valid_dev(rdev)) 1636 if (!new_valid_dev(rdev))
@@ -1650,7 +1659,7 @@ int nfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1650 struct iattr attr; 1659 struct iattr attr;
1651 int error; 1660 int error;
1652 1661
1653 dfprintk(VFS, "NFS: mkdir(%s/%ld), %pd\n", 1662 dfprintk(VFS, "NFS: mkdir(%s/%lu), %pd\n",
1654 dir->i_sb->s_id, dir->i_ino, dentry); 1663 dir->i_sb->s_id, dir->i_ino, dentry);
1655 1664
1656 attr.ia_valid = ATTR_MODE; 1665 attr.ia_valid = ATTR_MODE;
@@ -1678,7 +1687,7 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry)
1678{ 1687{
1679 int error; 1688 int error;
1680 1689
1681 dfprintk(VFS, "NFS: rmdir(%s/%ld), %pd\n", 1690 dfprintk(VFS, "NFS: rmdir(%s/%lu), %pd\n",
1682 dir->i_sb->s_id, dir->i_ino, dentry); 1691 dir->i_sb->s_id, dir->i_ino, dentry);
1683 1692
1684 trace_nfs_rmdir_enter(dir, dentry); 1693 trace_nfs_rmdir_enter(dir, dentry);
@@ -1747,7 +1756,7 @@ int nfs_unlink(struct inode *dir, struct dentry *dentry)
1747 int error; 1756 int error;
1748 int need_rehash = 0; 1757 int need_rehash = 0;
1749 1758
1750 dfprintk(VFS, "NFS: unlink(%s/%ld, %pd)\n", dir->i_sb->s_id, 1759 dfprintk(VFS, "NFS: unlink(%s/%lu, %pd)\n", dir->i_sb->s_id,
1751 dir->i_ino, dentry); 1760 dir->i_ino, dentry);
1752 1761
1753 trace_nfs_unlink_enter(dir, dentry); 1762 trace_nfs_unlink_enter(dir, dentry);
@@ -1798,7 +1807,7 @@ int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1798 unsigned int pathlen = strlen(symname); 1807 unsigned int pathlen = strlen(symname);
1799 int error; 1808 int error;
1800 1809
1801 dfprintk(VFS, "NFS: symlink(%s/%ld, %pd, %s)\n", dir->i_sb->s_id, 1810 dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s)\n", dir->i_sb->s_id,
1802 dir->i_ino, dentry, symname); 1811 dir->i_ino, dentry, symname);
1803 1812
1804 if (pathlen > PAGE_SIZE) 1813 if (pathlen > PAGE_SIZE)
@@ -1821,7 +1830,7 @@ int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1821 error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr); 1830 error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr);
1822 trace_nfs_symlink_exit(dir, dentry, error); 1831 trace_nfs_symlink_exit(dir, dentry, error);
1823 if (error != 0) { 1832 if (error != 0) {
1824 dfprintk(VFS, "NFS: symlink(%s/%ld, %pd, %s) error %d\n", 1833 dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s) error %d\n",
1825 dir->i_sb->s_id, dir->i_ino, 1834 dir->i_sb->s_id, dir->i_ino,
1826 dentry, symname, error); 1835 dentry, symname, error);
1827 d_drop(dentry); 1836 d_drop(dentry);
@@ -1837,6 +1846,11 @@ int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1837 GFP_KERNEL)) { 1846 GFP_KERNEL)) {
1838 SetPageUptodate(page); 1847 SetPageUptodate(page);
1839 unlock_page(page); 1848 unlock_page(page);
1849 /*
1850 * add_to_page_cache_lru() grabs an extra page refcount.
1851 * Drop it here to avoid leaking this page later.
1852 */
1853 page_cache_release(page);
1840 } else 1854 } else
1841 __free_page(page); 1855 __free_page(page);
1842 1856
@@ -2304,7 +2318,7 @@ out:
2304 if (!res && (mask & MAY_EXEC) && !execute_ok(inode)) 2318 if (!res && (mask & MAY_EXEC) && !execute_ok(inode))
2305 res = -EACCES; 2319 res = -EACCES;
2306 2320
2307 dfprintk(VFS, "NFS: permission(%s/%ld), mask=0x%x, res=%d\n", 2321 dfprintk(VFS, "NFS: permission(%s/%lu), mask=0x%x, res=%d\n",
2308 inode->i_sb->s_id, inode->i_ino, mask, res); 2322 inode->i_sb->s_id, inode->i_ino, mask, res);
2309 return res; 2323 return res;
2310out_notsup: 2324out_notsup: