diff options
author | Jiri Kosina <jkosina@suse.cz> | 2014-02-20 08:54:28 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2014-02-20 08:54:28 -0500 |
commit | d4263348f796f29546f90802177865dd4379dd0a (patch) | |
tree | adcbdaebae584eee2f32fab95e826e8e49eef385 /fs/nfs/dir.c | |
parent | be873ac782f5ff5ee6675f83929f4fe6737eead2 (diff) | |
parent | 6d0abeca3242a88cab8232e4acd7e2bf088f3bc2 (diff) |
Merge branch 'master' into for-next
Diffstat (limited to 'fs/nfs/dir.c')
-rw-r--r-- | fs/nfs/dir.c | 36 |
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 | ||
277 | static bool | ||
278 | nfs_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 | |||
277 | static | 286 | static |
278 | int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc) | 287 | int 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; |
2310 | out_notsup: | 2324 | out_notsup: |