Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'nfs-for-5.17-1' of git://git.linux-nfs.org/projects/anna/linux-nfs

Pull NFS client updates from Anna Schumaker:
"New Features:

- Basic handling for case insensitive filesystems

- Initial support for fs_locations and server trunking

Bugfixes and Cleanups:

- Cleanups to how the "struct cred *" is handled for the
nfs_access_entry

- Ensure the server has an up to date ctimes before hardlinking or
renaming

- Update 'blocks used' after writeback, fallocate, and clone

- nfs_atomic_open() fixes

- Improvements to sunrpc tracing

- Various null check & indenting related cleanups

- Some improvements to the sunrpc sysfs code:
- Use default_groups in kobj_type
- Fix some potential races and reference leaks

- A few tracepoint cleanups in xprtrdma"

[ This should have gone in during the merge window, but didn't. The
original pull request - sent during the merge window - had gotten
marked as spam and discarded due missing DKIM headers in the email
from Anna. - Linus ]

* tag 'nfs-for-5.17-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (35 commits)
SUNRPC: Don't dereference xprt->snd_task if it's a cookie
xprtrdma: Remove definitions of RPCDBG_FACILITY
xprtrdma: Remove final dprintk call sites from xprtrdma
sunrpc: Fix potential race conditions in rpc_sysfs_xprt_state_change()
net/sunrpc: fix reference count leaks in rpc_sysfs_xprt_state_change
NFSv4.1 test and add 4.1 trunking transport
SUNRPC allow for unspecified transport time in rpc_clnt_add_xprt
NFSv4 handle port presence in fs_location server string
NFSv4 expose nfs_parse_server_name function
NFSv4.1 query for fs_location attr on a new file system
NFSv4 store server support for fs_location attribute
NFSv4 remove zero number of fs_locations entries error check
NFSv4: nfs_atomic_open() can race when looking up a non-regular file
NFSv4: Handle case where the lookup of a directory fails
NFSv42: Fallocate and clone should also request 'blocks used'
NFSv4: Allow writebacks to request 'blocks used'
SUNRPC: use default_groups in kobj_type
NFS: use default_groups in kobj_type
NFS: Fix the verifier for case sensitive filesystem in nfs_atomic_open()
NFS: Add a helper to remove case-insensitive aliases
...

+474 -207
+1 -1
fs/nfs/callback.h
··· 170 170 }; 171 171 172 172 struct cb_devicenotifyargs { 173 - int ndevs; 173 + uint32_t ndevs; 174 174 struct cb_devicenotifyitem *devs; 175 175 }; 176 176
+1 -1
fs/nfs/callback_proc.c
··· 358 358 struct cb_process_state *cps) 359 359 { 360 360 struct cb_devicenotifyargs *args = argp; 361 - int i; 361 + uint32_t i; 362 362 __be32 res = 0; 363 363 struct nfs_client *clp = cps->clp; 364 364 struct nfs_server *server = NULL;
+9 -9
fs/nfs/callback_xdr.c
··· 258 258 void *argp) 259 259 { 260 260 struct cb_devicenotifyargs *args = argp; 261 + uint32_t tmp, n, i; 261 262 __be32 *p; 262 263 __be32 status = 0; 263 - u32 tmp; 264 - int n, i; 265 - args->ndevs = 0; 266 264 267 265 /* Num of device notifications */ 268 266 p = xdr_inline_decode(xdr, sizeof(uint32_t)); ··· 269 271 goto out; 270 272 } 271 273 n = ntohl(*p++); 272 - if (n <= 0) 274 + if (n == 0) 273 275 goto out; 274 276 if (n > ULONG_MAX / sizeof(*args->devs)) { 275 277 status = htonl(NFS4ERR_BADXDR); ··· 328 330 dev->cbd_immediate = 0; 329 331 } 330 332 331 - args->ndevs++; 332 - 333 333 dprintk("%s: type %d layout 0x%x immediate %d\n", 334 334 __func__, dev->cbd_notify_type, dev->cbd_layout_type, 335 335 dev->cbd_immediate); 336 336 } 337 + args->ndevs = n; 338 + dprintk("%s: ndevs %d\n", __func__, args->ndevs); 339 + return 0; 340 + err: 341 + kfree(args->devs); 337 342 out: 343 + args->devs = NULL; 344 + args->ndevs = 0; 338 345 dprintk("%s: status %d ndevs %d\n", 339 346 __func__, ntohl(status), args->ndevs); 340 347 return status; 341 - err: 342 - kfree(args->devs); 343 - goto out; 344 348 } 345 349 346 350 static __be32 decode_sessionid(struct xdr_stream *xdr,
+7
fs/nfs/client.c
··· 856 856 server->namelen = pathinfo.max_namelen; 857 857 } 858 858 859 + if (clp->rpc_ops->discover_trunking != NULL && 860 + (server->caps & NFS_CAP_FS_LOCATIONS)) { 861 + error = clp->rpc_ops->discover_trunking(server, mntfh); 862 + if (error < 0) 863 + return error; 864 + } 865 + 859 866 return 0; 860 867 } 861 868
+118 -28
fs/nfs/dir.c
··· 1325 1325 EXPORT_SYMBOL_GPL(nfs_clear_verifier_delegated); 1326 1326 #endif /* IS_ENABLED(CONFIG_NFS_V4) */ 1327 1327 1328 + static int nfs_dentry_verify_change(struct inode *dir, struct dentry *dentry) 1329 + { 1330 + if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE) && 1331 + d_really_is_negative(dentry)) 1332 + return dentry->d_time == inode_peek_iversion_raw(dir); 1333 + return nfs_verify_change_attribute(dir, dentry->d_time); 1334 + } 1335 + 1328 1336 /* 1329 1337 * A check for whether or not the parent directory has changed. 1330 1338 * In the case it has, we assume that the dentries are untrustworthy ··· 1346 1338 return 1; 1347 1339 if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONE) 1348 1340 return 0; 1349 - if (!nfs_verify_change_attribute(dir, dentry->d_time)) 1341 + if (!nfs_dentry_verify_change(dir, dentry)) 1350 1342 return 0; 1351 1343 /* Revalidate nfsi->cache_change_attribute before we declare a match */ 1352 1344 if (nfs_mapping_need_revalidate_inode(dir)) { ··· 1355 1347 if (__nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0) 1356 1348 return 0; 1357 1349 } 1358 - if (!nfs_verify_change_attribute(dir, dentry->d_time)) 1350 + if (!nfs_dentry_verify_change(dir, dentry)) 1359 1351 return 0; 1360 1352 return 1; 1361 1353 } ··· 1444 1436 if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) 1445 1437 return 0; 1446 1438 if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) 1439 + return 1; 1440 + /* Case insensitive server? Revalidate negative dentries */ 1441 + if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE)) 1447 1442 return 1; 1448 1443 return !nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU); 1449 1444 } ··· 1548 1537 * If the lookup failed despite the dentry change attribute being 1549 1538 * a match, then we should revalidate the directory cache. 1550 1539 */ 1551 - if (!ret && nfs_verify_change_attribute(dir, dentry->d_time)) 1540 + if (!ret && nfs_dentry_verify_change(dir, dentry)) 1552 1541 nfs_mark_dir_for_revalidate(dir); 1553 1542 return nfs_lookup_revalidate_done(dir, dentry, inode, ret); 1554 1543 } ··· 1787 1776 dir_verifier = nfs_save_change_attribute(dir); 1788 1777 trace_nfs_lookup_enter(dir, dentry, flags); 1789 1778 error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr); 1790 - if (error == -ENOENT) 1779 + if (error == -ENOENT) { 1780 + if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE)) 1781 + dir_verifier = inode_peek_iversion_raw(dir); 1791 1782 goto no_entry; 1783 + } 1792 1784 if (error < 0) { 1793 1785 res = ERR_PTR(error); 1794 1786 goto out; ··· 1819 1805 return res; 1820 1806 } 1821 1807 EXPORT_SYMBOL_GPL(nfs_lookup); 1808 + 1809 + void nfs_d_prune_case_insensitive_aliases(struct inode *inode) 1810 + { 1811 + /* Case insensitive server? Revalidate dentries */ 1812 + if (inode && nfs_server_capable(inode, NFS_CAP_CASE_INSENSITIVE)) 1813 + d_prune_aliases(inode); 1814 + } 1815 + EXPORT_SYMBOL_GPL(nfs_d_prune_case_insensitive_aliases); 1822 1816 1823 1817 #if IS_ENABLED(CONFIG_NFS_V4) 1824 1818 static int nfs4_lookup_revalidate(struct dentry *, unsigned int); ··· 1889 1867 struct iattr attr = { .ia_valid = ATTR_OPEN }; 1890 1868 struct inode *inode; 1891 1869 unsigned int lookup_flags = 0; 1870 + unsigned long dir_verifier; 1892 1871 bool switched = false; 1893 1872 int created = 0; 1894 1873 int err; ··· 1963 1940 switch (err) { 1964 1941 case -ENOENT: 1965 1942 d_splice_alias(NULL, dentry); 1966 - nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1943 + if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE)) 1944 + dir_verifier = inode_peek_iversion_raw(dir); 1945 + else 1946 + dir_verifier = nfs_save_change_attribute(dir); 1947 + nfs_set_verifier(dentry, dir_verifier); 1967 1948 break; 1968 1949 case -EISDIR: 1969 1950 case -ENOTDIR: ··· 1995 1968 1996 1969 no_open: 1997 1970 res = nfs_lookup(dir, dentry, lookup_flags); 1971 + if (!res) { 1972 + inode = d_inode(dentry); 1973 + if ((lookup_flags & LOOKUP_DIRECTORY) && inode && 1974 + !S_ISDIR(inode->i_mode)) 1975 + res = ERR_PTR(-ENOTDIR); 1976 + else if (inode && S_ISREG(inode->i_mode)) 1977 + res = ERR_PTR(-EOPENSTALE); 1978 + } else if (!IS_ERR(res)) { 1979 + inode = d_inode(res); 1980 + if ((lookup_flags & LOOKUP_DIRECTORY) && inode && 1981 + !S_ISDIR(inode->i_mode)) { 1982 + dput(res); 1983 + res = ERR_PTR(-ENOTDIR); 1984 + } else if (inode && S_ISREG(inode->i_mode)) { 1985 + dput(res); 1986 + res = ERR_PTR(-EOPENSTALE); 1987 + } 1988 + } 1998 1989 if (switched) { 1999 1990 d_lookup_done(dentry); 2000 1991 if (!res) ··· 2231 2186 switch (error) { 2232 2187 case -ENOENT: 2233 2188 d_delete(dentry); 2234 - fallthrough; 2189 + nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 2190 + break; 2235 2191 case 0: 2192 + nfs_d_prune_case_insensitive_aliases(d_inode(dentry)); 2236 2193 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 2237 2194 } 2238 2195 } ··· 2427 2380 2428 2381 trace_nfs_link_enter(inode, dir, dentry); 2429 2382 d_drop(dentry); 2383 + if (S_ISREG(inode->i_mode)) 2384 + nfs_sync_inode(inode); 2430 2385 error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); 2431 2386 if (error == 0) { 2432 2387 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); ··· 2518 2469 } 2519 2470 } 2520 2471 2472 + if (S_ISREG(old_inode->i_mode)) 2473 + nfs_sync_inode(old_inode); 2521 2474 task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, NULL); 2522 2475 if (IS_ERR(task)) { 2523 2476 error = PTR_ERR(task); ··· 2580 2529 2581 2530 static void nfs_access_free_entry(struct nfs_access_entry *entry) 2582 2531 { 2583 - put_cred(entry->cred); 2532 + put_group_info(entry->group_info); 2584 2533 kfree_rcu(entry, rcu_head); 2585 2534 smp_mb__before_atomic(); 2586 2535 atomic_long_dec(&nfs_access_nr_entries); ··· 2706 2655 } 2707 2656 EXPORT_SYMBOL_GPL(nfs_access_zap_cache); 2708 2657 2658 + static int access_cmp(const struct cred *a, const struct nfs_access_entry *b) 2659 + { 2660 + struct group_info *ga, *gb; 2661 + int g; 2662 + 2663 + if (uid_lt(a->fsuid, b->fsuid)) 2664 + return -1; 2665 + if (uid_gt(a->fsuid, b->fsuid)) 2666 + return 1; 2667 + 2668 + if (gid_lt(a->fsgid, b->fsgid)) 2669 + return -1; 2670 + if (gid_gt(a->fsgid, b->fsgid)) 2671 + return 1; 2672 + 2673 + ga = a->group_info; 2674 + gb = b->group_info; 2675 + if (ga == gb) 2676 + return 0; 2677 + if (ga == NULL) 2678 + return -1; 2679 + if (gb == NULL) 2680 + return 1; 2681 + if (ga->ngroups < gb->ngroups) 2682 + return -1; 2683 + if (ga->ngroups > gb->ngroups) 2684 + return 1; 2685 + 2686 + for (g = 0; g < ga->ngroups; g++) { 2687 + if (gid_lt(ga->gid[g], gb->gid[g])) 2688 + return -1; 2689 + if (gid_gt(ga->gid[g], gb->gid[g])) 2690 + return 1; 2691 + } 2692 + return 0; 2693 + } 2694 + 2709 2695 static struct nfs_access_entry *nfs_access_search_rbtree(struct inode *inode, const struct cred *cred) 2710 2696 { 2711 2697 struct rb_node *n = NFS_I(inode)->access_cache.rb_node; ··· 2750 2662 while (n != NULL) { 2751 2663 struct nfs_access_entry *entry = 2752 2664 rb_entry(n, struct nfs_access_entry, rb_node); 2753 - int cmp = cred_fscmp(cred, entry->cred); 2665 + int cmp = access_cmp(cred, entry); 2754 2666 2755 2667 if (cmp < 0) 2756 2668 n = n->rb_left; ··· 2762 2674 return NULL; 2763 2675 } 2764 2676 2765 - static int nfs_access_get_cached_locked(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res, bool may_block) 2677 + static int nfs_access_get_cached_locked(struct inode *inode, const struct cred *cred, u32 *mask, bool may_block) 2766 2678 { 2767 2679 struct nfs_inode *nfsi = NFS_I(inode); 2768 2680 struct nfs_access_entry *cache; ··· 2792 2704 spin_lock(&inode->i_lock); 2793 2705 retry = false; 2794 2706 } 2795 - res->cred = cache->cred; 2796 - res->mask = cache->mask; 2707 + *mask = cache->mask; 2797 2708 list_move_tail(&cache->lru, &nfsi->access_cache_entry_lru); 2798 2709 err = 0; 2799 2710 out: ··· 2804 2717 return -ENOENT; 2805 2718 } 2806 2719 2807 - static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res) 2720 + static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cred, u32 *mask) 2808 2721 { 2809 2722 /* Only check the most recently returned cache entry, 2810 2723 * but do it without locking. ··· 2820 2733 lh = rcu_dereference(list_tail_rcu(&nfsi->access_cache_entry_lru)); 2821 2734 cache = list_entry(lh, struct nfs_access_entry, lru); 2822 2735 if (lh == &nfsi->access_cache_entry_lru || 2823 - cred_fscmp(cred, cache->cred) != 0) 2736 + access_cmp(cred, cache) != 0) 2824 2737 cache = NULL; 2825 2738 if (cache == NULL) 2826 2739 goto out; 2827 2740 if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS)) 2828 2741 goto out; 2829 - res->cred = cache->cred; 2830 - res->mask = cache->mask; 2742 + *mask = cache->mask; 2831 2743 err = 0; 2832 2744 out: 2833 2745 rcu_read_unlock(); 2834 2746 return err; 2835 2747 } 2836 2748 2837 - int nfs_access_get_cached(struct inode *inode, const struct cred *cred, struct 2838 - nfs_access_entry *res, bool may_block) 2749 + int nfs_access_get_cached(struct inode *inode, const struct cred *cred, 2750 + u32 *mask, bool may_block) 2839 2751 { 2840 2752 int status; 2841 2753 2842 - status = nfs_access_get_cached_rcu(inode, cred, res); 2754 + status = nfs_access_get_cached_rcu(inode, cred, mask); 2843 2755 if (status != 0) 2844 - status = nfs_access_get_cached_locked(inode, cred, res, 2756 + status = nfs_access_get_cached_locked(inode, cred, mask, 2845 2757 may_block); 2846 2758 2847 2759 return status; 2848 2760 } 2849 2761 EXPORT_SYMBOL_GPL(nfs_access_get_cached); 2850 2762 2851 - static void nfs_access_add_rbtree(struct inode *inode, struct nfs_access_entry *set) 2763 + static void nfs_access_add_rbtree(struct inode *inode, 2764 + struct nfs_access_entry *set, 2765 + const struct cred *cred) 2852 2766 { 2853 2767 struct nfs_inode *nfsi = NFS_I(inode); 2854 2768 struct rb_root *root_node = &nfsi->access_cache; ··· 2862 2774 while (*p != NULL) { 2863 2775 parent = *p; 2864 2776 entry = rb_entry(parent, struct nfs_access_entry, rb_node); 2865 - cmp = cred_fscmp(set->cred, entry->cred); 2777 + cmp = access_cmp(cred, entry); 2866 2778 2867 2779 if (cmp < 0) 2868 2780 p = &parent->rb_left; ··· 2884 2796 nfs_access_free_entry(entry); 2885 2797 } 2886 2798 2887 - void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set) 2799 + void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set, 2800 + const struct cred *cred) 2888 2801 { 2889 2802 struct nfs_access_entry *cache = kmalloc(sizeof(*cache), GFP_KERNEL); 2890 2803 if (cache == NULL) 2891 2804 return; 2892 2805 RB_CLEAR_NODE(&cache->rb_node); 2893 - cache->cred = get_cred(set->cred); 2806 + cache->fsuid = cred->fsuid; 2807 + cache->fsgid = cred->fsgid; 2808 + cache->group_info = get_group_info(cred->group_info); 2894 2809 cache->mask = set->mask; 2895 2810 2896 2811 /* The above field assignments must be visible ··· 2901 2810 * use rcu_assign_pointer, so just force the memory barrier. 2902 2811 */ 2903 2812 smp_wmb(); 2904 - nfs_access_add_rbtree(inode, cache); 2813 + nfs_access_add_rbtree(inode, cache, cred); 2905 2814 2906 2815 /* Update accounting */ 2907 2816 smp_mb__before_atomic(); ··· 2966 2875 2967 2876 trace_nfs_access_enter(inode); 2968 2877 2969 - status = nfs_access_get_cached(inode, cred, &cache, may_block); 2878 + status = nfs_access_get_cached(inode, cred, &cache.mask, may_block); 2970 2879 if (status == 0) 2971 2880 goto out_cached; 2972 2881 ··· 2986 2895 cache.mask |= NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP; 2987 2896 else 2988 2897 cache.mask |= NFS_ACCESS_EXECUTE; 2989 - cache.cred = cred; 2990 - status = NFS_PROTO(inode)->access(inode, &cache); 2898 + status = NFS_PROTO(inode)->access(inode, &cache, cred); 2991 2899 if (status != 0) { 2992 2900 if (status == -ESTALE) { 2993 2901 if (!S_ISDIR(inode->i_mode)) ··· 2996 2906 } 2997 2907 goto out; 2998 2908 } 2999 - nfs_access_add_cache(inode, &cache); 2909 + nfs_access_add_cache(inode, &cache, cred); 3000 2910 out_cached: 3001 2911 cache_mask = nfs_access_calc_mask(cache.mask, inode->i_mode); 3002 2912 if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0)
+1 -1
fs/nfs/filelayout/filelayout.h
··· 51 51 u32 stripe_count; 52 52 u8 *stripe_indices; 53 53 u32 ds_num; 54 - struct nfs4_pnfs_ds *ds_list[1]; 54 + struct nfs4_pnfs_ds *ds_list[]; 55 55 }; 56 56 57 57 struct nfs4_filelayout_segment {
+1 -3
fs/nfs/filelayout/filelayoutdev.c
··· 136 136 goto out_err_free_stripe_indices; 137 137 } 138 138 139 - dsaddr = kzalloc(sizeof(*dsaddr) + 140 - (sizeof(struct nfs4_pnfs_ds *) * (num - 1)), 141 - gfp_flags); 139 + dsaddr = kzalloc(struct_size(dsaddr, ds_list, num), gfp_flags); 142 140 if (!dsaddr) 143 141 goto out_err_free_stripe_indices; 144 142
+1
fs/nfs/internal.h
··· 373 373 extern unsigned long nfs_access_cache_scan(struct shrinker *shrink, 374 374 struct shrink_control *sc); 375 375 struct dentry *nfs_lookup(struct inode *, struct dentry *, unsigned int); 376 + void nfs_d_prune_case_insensitive_aliases(struct inode *inode); 376 377 int nfs_create(struct user_namespace *, struct inode *, struct dentry *, 377 378 umode_t, bool); 378 379 int nfs_mkdir(struct user_namespace *, struct inode *, struct dentry *,
+3 -2
fs/nfs/nfs3proc.c
··· 220 220 task_flags); 221 221 } 222 222 223 - static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry) 223 + static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry, 224 + const struct cred *cred) 224 225 { 225 226 struct nfs3_accessargs arg = { 226 227 .fh = NFS_FH(inode), ··· 232 231 .rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS], 233 232 .rpc_argp = &arg, 234 233 .rpc_resp = &res, 235 - .rpc_cred = entry->cred, 234 + .rpc_cred = cred, 236 235 }; 237 236 int status = -ENOMEM; 238 237
+8 -5
fs/nfs/nfs42proc.c
··· 46 46 { 47 47 struct inode *inode = file_inode(filep); 48 48 struct nfs_server *server = NFS_SERVER(inode); 49 - u32 bitmask[3]; 49 + u32 bitmask[NFS_BITMASK_SZ]; 50 50 struct nfs42_falloc_args args = { 51 51 .falloc_fh = NFS_FH(inode), 52 52 .falloc_offset = offset, ··· 69 69 return status; 70 70 } 71 71 72 - memcpy(bitmask, server->cache_consistency_bitmask, sizeof(bitmask)); 73 - if (server->attr_bitmask[1] & FATTR4_WORD1_SPACE_USED) 74 - bitmask[1] |= FATTR4_WORD1_SPACE_USED; 72 + nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask, inode, 73 + NFS_INO_INVALID_BLOCKS); 75 74 76 75 res.falloc_fattr = nfs_alloc_fattr(); 77 76 if (!res.falloc_fattr) ··· 1043 1044 struct inode *src_inode = file_inode(src_f); 1044 1045 struct inode *dst_inode = file_inode(dst_f); 1045 1046 struct nfs_server *server = NFS_SERVER(dst_inode); 1047 + __u32 dst_bitmask[NFS_BITMASK_SZ]; 1046 1048 struct nfs42_clone_args args = { 1047 1049 .src_fh = NFS_FH(src_inode), 1048 1050 .dst_fh = NFS_FH(dst_inode), 1049 1051 .src_offset = src_offset, 1050 1052 .dst_offset = dst_offset, 1051 1053 .count = count, 1052 - .dst_bitmask = server->cache_consistency_bitmask, 1054 + .dst_bitmask = dst_bitmask, 1053 1055 }; 1054 1056 struct nfs42_clone_res res = { 1055 1057 .server = server, ··· 1078 1078 res.dst_fattr = nfs_alloc_fattr(); 1079 1079 if (!res.dst_fattr) 1080 1080 return -ENOMEM; 1081 + 1082 + nfs4_bitmask_set(dst_bitmask, server->cache_consistency_bitmask, 1083 + dst_inode, NFS_INO_INVALID_BLOCKS); 1081 1084 1082 1085 status = nfs4_call_sync(server->client, server, msg, 1083 1086 &args.seq_args, &res.seq_res, 0);
+9 -5
fs/nfs/nfs4_fs.h
··· 260 260 }; 261 261 262 262 struct nfs4_mig_recovery_ops { 263 - int (*get_locations)(struct inode *, struct nfs4_fs_locations *, 264 - struct page *, const struct cred *); 263 + int (*get_locations)(struct nfs_server *, struct nfs_fh *, 264 + struct nfs4_fs_locations *, struct page *, const struct cred *); 265 265 int (*fsid_present)(struct inode *, const struct cred *); 266 266 }; 267 267 ··· 280 280 int nfs4_submount(struct fs_context *, struct nfs_server *); 281 281 int nfs4_replace_transport(struct nfs_server *server, 282 282 const struct nfs4_fs_locations *locations); 283 - 283 + size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr *sa, 284 + size_t salen, struct net *net, int port); 284 285 /* nfs4proc.c */ 285 286 extern int nfs4_handle_exception(struct nfs_server *, int, struct nfs4_exception *); 286 287 extern int nfs4_async_handle_error(struct rpc_task *task, ··· 303 302 extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle); 304 303 extern int nfs4_proc_fs_locations(struct rpc_clnt *, struct inode *, const struct qstr *, 305 304 struct nfs4_fs_locations *, struct page *); 306 - extern int nfs4_proc_get_locations(struct inode *, struct nfs4_fs_locations *, 307 - struct page *page, const struct cred *); 305 + extern int nfs4_proc_get_locations(struct nfs_server *, struct nfs_fh *, 306 + struct nfs4_fs_locations *, 307 + struct page *page, const struct cred *); 308 308 extern int nfs4_proc_fsid_present(struct inode *, const struct cred *); 309 309 extern struct rpc_clnt *nfs4_proc_lookup_mountpoint(struct inode *, 310 310 struct dentry *, ··· 317 315 const struct nfs_open_context *ctx, 318 316 const struct nfs_lock_context *l_ctx, 319 317 fmode_t fmode); 318 + extern void nfs4_bitmask_set(__u32 bitmask[], const __u32 src[], 319 + struct inode *inode, unsigned long cache_validity); 320 320 extern int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, 321 321 struct nfs_fattr *fattr, struct inode *inode); 322 322 extern int update_open_stateid(struct nfs4_state *state,
+4 -1
fs/nfs/nfs4client.c
··· 1343 1343 } 1344 1344 nfs_put_client(clp); 1345 1345 1346 - if (server->nfs_client->cl_hostname == NULL) 1346 + if (server->nfs_client->cl_hostname == NULL) { 1347 1347 server->nfs_client->cl_hostname = kstrdup(hostname, GFP_KERNEL); 1348 + if (server->nfs_client->cl_hostname == NULL) 1349 + return -ENOMEM; 1350 + } 1348 1351 nfs_server_insert_lists(server); 1349 1352 1350 1353 return nfs_probe_server(server, NFS_FH(d_inode(server->super->s_root)));
+12 -7
fs/nfs/nfs4namespace.c
··· 164 164 return 0; 165 165 } 166 166 167 - static size_t nfs_parse_server_name(char *string, size_t len, 168 - struct sockaddr *sa, size_t salen, struct net *net) 167 + size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr *sa, 168 + size_t salen, struct net *net, int port) 169 169 { 170 170 ssize_t ret; 171 171 172 172 ret = rpc_pton(net, string, len, sa, salen); 173 173 if (ret == 0) { 174 - ret = nfs_dns_resolve_name(net, string, len, sa, salen); 175 - if (ret < 0) 176 - ret = 0; 174 + ret = rpc_uaddr2sockaddr(net, string, len, sa, salen); 175 + if (ret == 0) { 176 + ret = nfs_dns_resolve_name(net, string, len, sa, salen); 177 + if (ret < 0) 178 + ret = 0; 179 + } 180 + } else if (port) { 181 + rpc_set_port(sa, port); 177 182 } 178 183 return ret; 179 184 } ··· 333 328 nfs_parse_server_name(buf->data, buf->len, 334 329 &ctx->nfs_server.address, 335 330 sizeof(ctx->nfs_server._address), 336 - fc->net_ns); 331 + fc->net_ns, 0); 337 332 if (ctx->nfs_server.addrlen == 0) 338 333 continue; 339 334 ··· 501 496 continue; 502 497 503 498 salen = nfs_parse_server_name(buf->data, buf->len, 504 - sap, addr_bufsize, net); 499 + sap, addr_bufsize, net, 0); 505 500 if (salen == 0) 506 501 continue; 507 502 rpc_set_port(sap, NFS_PORT);
+156 -41
fs/nfs/nfs4proc.c
··· 108 108 static int nfs41_free_stateid(struct nfs_server *, const nfs4_stateid *, 109 109 const struct cred *, bool); 110 110 #endif 111 - static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ], 112 - const __u32 *src, struct inode *inode, 113 - struct nfs_server *server, 114 - struct nfs4_label *label); 115 111 116 112 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 117 113 static inline struct nfs4_label * ··· 2649 2653 } else if ((fmode & FMODE_READ) && !opendata->file_created) 2650 2654 mask = NFS4_ACCESS_READ; 2651 2655 2652 - cache.cred = cred; 2653 2656 nfs_access_set_mask(&cache, opendata->o_res.access_result); 2654 - nfs_access_add_cache(state->inode, &cache); 2657 + nfs_access_add_cache(state->inode, &cache, cred); 2655 2658 2656 2659 flags = NFS4_ACCESS_READ | NFS4_ACCESS_EXECUTE | NFS4_ACCESS_LOOKUP; 2657 2660 if ((mask & ~cache.mask & flags) == 0) ··· 3665 3670 if (!nfs4_have_delegation(inode, FMODE_READ)) { 3666 3671 nfs4_bitmask_set(calldata->arg.bitmask_store, 3667 3672 server->cache_consistency_bitmask, 3668 - inode, server, NULL); 3673 + inode, 0); 3669 3674 calldata->arg.bitmask = calldata->arg.bitmask_store; 3670 3675 } else 3671 3676 calldata->arg.bitmask = NULL; ··· 3836 3841 FATTR4_WORD0_FH_EXPIRE_TYPE | 3837 3842 FATTR4_WORD0_LINK_SUPPORT | 3838 3843 FATTR4_WORD0_SYMLINK_SUPPORT | 3839 - FATTR4_WORD0_ACLSUPPORT; 3844 + FATTR4_WORD0_ACLSUPPORT | 3845 + FATTR4_WORD0_CASE_INSENSITIVE | 3846 + FATTR4_WORD0_CASE_PRESERVING; 3840 3847 if (minorversion) 3841 3848 bitmask[2] = FATTR4_WORD2_SUPPATTR_EXCLCREAT; 3842 3849 ··· 3867 3870 server->caps |= NFS_CAP_HARDLINKS; 3868 3871 if (res.has_symlinks != 0) 3869 3872 server->caps |= NFS_CAP_SYMLINKS; 3873 + if (res.case_insensitive) 3874 + server->caps |= NFS_CAP_CASE_INSENSITIVE; 3875 + if (res.case_preserving) 3876 + server->caps |= NFS_CAP_CASE_PRESERVING; 3870 3877 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 3871 3878 if (res.attr_bitmask[2] & FATTR4_WORD2_SECURITY_LABEL) 3872 3879 server->caps |= NFS_CAP_SECURITY_LABEL; 3873 3880 #endif 3881 + if (res.attr_bitmask[0] & FATTR4_WORD0_FS_LOCATIONS) 3882 + server->caps |= NFS_CAP_FS_LOCATIONS; 3874 3883 if (!(res.attr_bitmask[0] & FATTR4_WORD0_FILEID)) 3875 3884 server->fattr_valid &= ~NFS_ATTR_FATTR_FILEID; 3876 3885 if (!(res.attr_bitmask[1] & FATTR4_WORD1_MODE)) ··· 3932 3929 _nfs4_server_capabilities(server, fhandle), 3933 3930 &exception); 3934 3931 } while (exception.retry); 3932 + return err; 3933 + } 3934 + 3935 + static void test_fs_location_for_trunking(struct nfs4_fs_location *location, 3936 + struct nfs_client *clp, 3937 + struct nfs_server *server) 3938 + { 3939 + int i; 3940 + 3941 + for (i = 0; i < location->nservers; i++) { 3942 + struct nfs4_string *srv_loc = &location->servers[i]; 3943 + struct sockaddr addr; 3944 + size_t addrlen; 3945 + struct xprt_create xprt_args = { 3946 + .ident = 0, 3947 + .net = clp->cl_net, 3948 + }; 3949 + struct nfs4_add_xprt_data xprtdata = { 3950 + .clp = clp, 3951 + }; 3952 + struct rpc_add_xprt_test rpcdata = { 3953 + .add_xprt_test = clp->cl_mvops->session_trunk, 3954 + .data = &xprtdata, 3955 + }; 3956 + char *servername = NULL; 3957 + 3958 + if (!srv_loc->len) 3959 + continue; 3960 + 3961 + addrlen = nfs_parse_server_name(srv_loc->data, srv_loc->len, 3962 + &addr, sizeof(addr), 3963 + clp->cl_net, server->port); 3964 + if (!addrlen) 3965 + return; 3966 + xprt_args.dstaddr = &addr; 3967 + xprt_args.addrlen = addrlen; 3968 + servername = kmalloc(srv_loc->len + 1, GFP_KERNEL); 3969 + if (!servername) 3970 + return; 3971 + memcpy(servername, srv_loc->data, srv_loc->len); 3972 + servername[srv_loc->len] = '\0'; 3973 + xprt_args.servername = servername; 3974 + 3975 + xprtdata.cred = nfs4_get_clid_cred(clp); 3976 + rpc_clnt_add_xprt(clp->cl_rpcclient, &xprt_args, 3977 + rpc_clnt_setup_test_and_add_xprt, 3978 + &rpcdata); 3979 + if (xprtdata.cred) 3980 + put_cred(xprtdata.cred); 3981 + kfree(servername); 3982 + } 3983 + } 3984 + 3985 + static int _nfs4_discover_trunking(struct nfs_server *server, 3986 + struct nfs_fh *fhandle) 3987 + { 3988 + struct nfs4_fs_locations *locations = NULL; 3989 + struct page *page; 3990 + const struct cred *cred; 3991 + struct nfs_client *clp = server->nfs_client; 3992 + const struct nfs4_state_maintenance_ops *ops = 3993 + clp->cl_mvops->state_renewal_ops; 3994 + int status = -ENOMEM, i; 3995 + 3996 + cred = ops->get_state_renewal_cred(clp); 3997 + if (cred == NULL) { 3998 + cred = nfs4_get_clid_cred(clp); 3999 + if (cred == NULL) 4000 + return -ENOKEY; 4001 + } 4002 + 4003 + page = alloc_page(GFP_KERNEL); 4004 + locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL); 4005 + if (page == NULL || locations == NULL) 4006 + goto out; 4007 + 4008 + status = nfs4_proc_get_locations(server, fhandle, locations, page, 4009 + cred); 4010 + if (status) 4011 + goto out; 4012 + 4013 + for (i = 0; i < locations->nlocations; i++) 4014 + test_fs_location_for_trunking(&locations->locations[i], clp, 4015 + server); 4016 + out: 4017 + if (page) 4018 + __free_page(page); 4019 + kfree(locations); 4020 + return status; 4021 + } 4022 + 4023 + static int nfs4_discover_trunking(struct nfs_server *server, 4024 + struct nfs_fh *fhandle) 4025 + { 4026 + struct nfs4_exception exception = { 4027 + .interruptible = true, 4028 + }; 4029 + struct nfs_client *clp = server->nfs_client; 4030 + int err = 0; 4031 + 4032 + if (!nfs4_has_session(clp)) 4033 + goto out; 4034 + do { 4035 + err = nfs4_handle_exception(server, 4036 + _nfs4_discover_trunking(server, fhandle), 4037 + &exception); 4038 + } while (exception.retry); 4039 + out: 3935 4040 return err; 3936 4041 } 3937 4042 ··· 4552 4441 return err; 4553 4442 } 4554 4443 4555 - static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 4444 + static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry, 4445 + const struct cred *cred) 4556 4446 { 4557 4447 struct nfs_server *server = NFS_SERVER(inode); 4558 4448 struct nfs4_accessargs args = { ··· 4567 4455 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS], 4568 4456 .rpc_argp = &args, 4569 4457 .rpc_resp = &res, 4570 - .rpc_cred = entry->cred, 4458 + .rpc_cred = cred, 4571 4459 }; 4572 4460 int status = 0; 4573 4461 ··· 4587 4475 return status; 4588 4476 } 4589 4477 4590 - static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 4478 + static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry, 4479 + const struct cred *cred) 4591 4480 { 4592 4481 struct nfs4_exception exception = { 4593 4482 .interruptible = true, 4594 4483 }; 4595 4484 int err; 4596 4485 do { 4597 - err = _nfs4_proc_access(inode, entry); 4486 + err = _nfs4_proc_access(inode, entry, cred); 4598 4487 trace_nfs4_access(inode, err); 4599 4488 err = nfs4_handle_exception(NFS_SERVER(inode), err, 4600 4489 &exception); ··· 4776 4663 4777 4664 nfs_fattr_init(res->dir_attr); 4778 4665 4779 - if (inode) 4666 + if (inode) { 4780 4667 nfs4_inode_return_delegation(inode); 4668 + nfs_d_prune_case_insensitive_aliases(inode); 4669 + } 4781 4670 } 4782 4671 4783 4672 static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data) ··· 4845 4730 return 0; 4846 4731 4847 4732 if (task->tk_status == 0) { 4733 + nfs_d_prune_case_insensitive_aliases(d_inode(data->old_dentry)); 4848 4734 if (new_dir != old_dir) { 4849 4735 /* Note: If we moved a directory, nlink will change */ 4850 4736 nfs4_update_changeattr(old_dir, &res->old_cinfo, ··· 5538 5422 return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0; 5539 5423 } 5540 5424 5541 - static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ], const __u32 *src, 5542 - struct inode *inode, struct nfs_server *server, 5543 - struct nfs4_label *label) 5425 + void nfs4_bitmask_set(__u32 bitmask[], const __u32 src[], 5426 + struct inode *inode, unsigned long cache_validity) 5544 5427 { 5545 - unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity); 5428 + struct nfs_server *server = NFS_SERVER(inode); 5546 5429 unsigned int i; 5547 5430 5548 5431 memcpy(bitmask, src, sizeof(*bitmask) * NFS4_BITMASK_SZ); 5432 + cache_validity |= READ_ONCE(NFS_I(inode)->cache_validity); 5549 5433 5550 5434 if (cache_validity & NFS_INO_INVALID_CHANGE) 5551 5435 bitmask[0] |= FATTR4_WORD0_CHANGE; ··· 5557 5441 bitmask[1] |= FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP; 5558 5442 if (cache_validity & NFS_INO_INVALID_NLINK) 5559 5443 bitmask[1] |= FATTR4_WORD1_NUMLINKS; 5560 - if (label && label->len && cache_validity & NFS_INO_INVALID_LABEL) 5561 - bitmask[2] |= FATTR4_WORD2_SECURITY_LABEL; 5562 5444 if (cache_validity & NFS_INO_INVALID_CTIME) 5563 5445 bitmask[1] |= FATTR4_WORD1_TIME_METADATA; 5564 5446 if (cache_validity & NFS_INO_INVALID_MTIME) ··· 5583 5469 } else { 5584 5470 nfs4_bitmask_set(hdr->args.bitmask_store, 5585 5471 server->cache_consistency_bitmask, 5586 - hdr->inode, server, NULL); 5472 + hdr->inode, NFS_INO_INVALID_BLOCKS); 5587 5473 hdr->args.bitmask = hdr->args.bitmask_store; 5588 5474 } 5589 5475 ··· 6621 6507 data->args.fhandle = &data->fh; 6622 6508 data->args.stateid = &data->stateid; 6623 6509 nfs4_bitmask_set(data->args.bitmask_store, 6624 - server->cache_consistency_bitmask, inode, server, 6625 - NULL); 6510 + server->cache_consistency_bitmask, inode, 0); 6626 6511 data->args.bitmask = data->args.bitmask_store; 6627 6512 nfs_copy_fh(&data->fh, NFS_FH(inode)); 6628 6513 nfs4_stateid_copy(&data->stateid, stateid); ··· 7724 7611 const char *key, const void *buf, 7725 7612 size_t buflen, int flags) 7726 7613 { 7727 - struct nfs_access_entry cache; 7614 + u32 mask; 7728 7615 int ret; 7729 7616 7730 7617 if (!nfs_server_capable(inode, NFS_CAP_XATTR)) ··· 7739 7626 * do a cached access check for the XA* flags to possibly avoid 7740 7627 * doing an RPC and getting EACCES back. 7741 7628 */ 7742 - if (!nfs_access_get_cached(inode, current_cred(), &cache, true)) { 7743 - if (!(cache.mask & NFS_ACCESS_XAWRITE)) 7629 + if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) { 7630 + if (!(mask & NFS_ACCESS_XAWRITE)) 7744 7631 return -EACCES; 7745 7632 } 7746 7633 ··· 7761 7648 struct dentry *unused, struct inode *inode, 7762 7649 const char *key, void *buf, size_t buflen) 7763 7650 { 7764 - struct nfs_access_entry cache; 7651 + u32 mask; 7765 7652 ssize_t ret; 7766 7653 7767 7654 if (!nfs_server_capable(inode, NFS_CAP_XATTR)) 7768 7655 return -EOPNOTSUPP; 7769 7656 7770 - if (!nfs_access_get_cached(inode, current_cred(), &cache, true)) { 7771 - if (!(cache.mask & NFS_ACCESS_XAREAD)) 7657 + if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) { 7658 + if (!(mask & NFS_ACCESS_XAREAD)) 7772 7659 return -EACCES; 7773 7660 } 7774 7661 ··· 7793 7680 ssize_t ret, size; 7794 7681 char *buf; 7795 7682 size_t buflen; 7796 - struct nfs_access_entry cache; 7683 + u32 mask; 7797 7684 7798 7685 if (!nfs_server_capable(inode, NFS_CAP_XATTR)) 7799 7686 return 0; 7800 7687 7801 - if (!nfs_access_get_cached(inode, current_cred(), &cache, true)) { 7802 - if (!(cache.mask & NFS_ACCESS_XALIST)) 7688 + if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) { 7689 + if (!(mask & NFS_ACCESS_XALIST)) 7803 7690 return 0; 7804 7691 } 7805 7692 ··· 7931 7818 * appended to this compound to identify the client ID which is 7932 7819 * performing recovery. 7933 7820 */ 7934 - static int _nfs40_proc_get_locations(struct inode *inode, 7821 + static int _nfs40_proc_get_locations(struct nfs_server *server, 7822 + struct nfs_fh *fhandle, 7935 7823 struct nfs4_fs_locations *locations, 7936 7824 struct page *page, const struct cred *cred) 7937 7825 { 7938 - struct nfs_server *server = NFS_SERVER(inode); 7939 7826 struct rpc_clnt *clnt = server->client; 7940 7827 u32 bitmask[2] = { 7941 7828 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 7942 7829 }; 7943 7830 struct nfs4_fs_locations_arg args = { 7944 7831 .clientid = server->nfs_client->cl_clientid, 7945 - .fh = NFS_FH(inode), 7832 + .fh = fhandle, 7946 7833 .page = page, 7947 7834 .bitmask = bitmask, 7948 7835 .migration = 1, /* skip LOOKUP */ ··· 7988 7875 * When the client supports GETATTR(fs_locations_info), it can 7989 7876 * be plumbed in here. 7990 7877 */ 7991 - static int _nfs41_proc_get_locations(struct inode *inode, 7878 + static int _nfs41_proc_get_locations(struct nfs_server *server, 7879 + struct nfs_fh *fhandle, 7992 7880 struct nfs4_fs_locations *locations, 7993 7881 struct page *page, const struct cred *cred) 7994 7882 { 7995 - struct nfs_server *server = NFS_SERVER(inode); 7996 7883 struct rpc_clnt *clnt = server->client; 7997 7884 u32 bitmask[2] = { 7998 7885 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 7999 7886 }; 8000 7887 struct nfs4_fs_locations_arg args = { 8001 - .fh = NFS_FH(inode), 7888 + .fh = fhandle, 8002 7889 .page = page, 8003 7890 .bitmask = bitmask, 8004 7891 .migration = 1, /* skip LOOKUP */ ··· 8047 7934 * -NFS4ERR_LEASE_MOVED is returned if the server still has leases 8048 7935 * from this client that require migration recovery. 8049 7936 */ 8050 - int nfs4_proc_get_locations(struct inode *inode, 7937 + int nfs4_proc_get_locations(struct nfs_server *server, 7938 + struct nfs_fh *fhandle, 8051 7939 struct nfs4_fs_locations *locations, 8052 7940 struct page *page, const struct cred *cred) 8053 7941 { 8054 - struct nfs_server *server = NFS_SERVER(inode); 8055 7942 struct nfs_client *clp = server->nfs_client; 8056 7943 const struct nfs4_mig_recovery_ops *ops = 8057 7944 clp->cl_mvops->mig_recovery_ops; ··· 8064 7951 (unsigned long long)server->fsid.major, 8065 7952 (unsigned long long)server->fsid.minor, 8066 7953 clp->cl_hostname); 8067 - nfs_display_fhandle(NFS_FH(inode), __func__); 7954 + nfs_display_fhandle(fhandle, __func__); 8068 7955 8069 7956 do { 8070 - status = ops->get_locations(inode, locations, page, cred); 7957 + status = ops->get_locations(server, fhandle, locations, page, 7958 + cred); 8071 7959 if (status != -NFS4ERR_DELAY) 8072 7960 break; 8073 7961 nfs4_handle_exception(server, status, &exception); ··· 10537 10423 .free_client = nfs4_free_client, 10538 10424 .create_server = nfs4_create_server, 10539 10425 .clone_server = nfs_clone_server, 10426 + .discover_trunking = nfs4_discover_trunking, 10540 10427 }; 10541 10428 10542 10429 static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
+5 -1
fs/nfs/nfs4state.c
··· 2098 2098 } 2099 2099 2100 2100 inode = d_inode(server->super->s_root); 2101 - result = nfs4_proc_get_locations(inode, locations, page, cred); 2101 + result = nfs4_proc_get_locations(server, NFS_FH(inode), locations, 2102 + page, cred); 2102 2103 if (result) { 2103 2104 dprintk("<-- %s: failed to retrieve fs_locations: %d\n", 2104 2105 __func__, result); ··· 2107 2106 } 2108 2107 2109 2108 result = -NFS4ERR_NXIO; 2109 + if (!locations->nlocations) 2110 + goto out; 2111 + 2110 2112 if (!(locations->fattr.valid & NFS_ATTR_FATTR_V4_LOCATIONS)) { 2111 2113 dprintk("<-- %s: No fs_locations data, migration skipped\n", 2112 2114 __func__);
+44 -5
fs/nfs/nfs4xdr.c
··· 3533 3533 return 0; 3534 3534 } 3535 3535 3536 + static int decode_attr_case_insensitive(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res) 3537 + { 3538 + __be32 *p; 3539 + 3540 + *res = 0; 3541 + if (unlikely(bitmap[0] & (FATTR4_WORD0_CASE_INSENSITIVE - 1U))) 3542 + return -EIO; 3543 + if (likely(bitmap[0] & FATTR4_WORD0_CASE_INSENSITIVE)) { 3544 + p = xdr_inline_decode(xdr, 4); 3545 + if (unlikely(!p)) 3546 + return -EIO; 3547 + *res = be32_to_cpup(p); 3548 + bitmap[0] &= ~FATTR4_WORD0_CASE_INSENSITIVE; 3549 + } 3550 + dprintk("%s: case_insensitive=%s\n", __func__, *res == 0 ? "false" : "true"); 3551 + return 0; 3552 + } 3553 + 3554 + static int decode_attr_case_preserving(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res) 3555 + { 3556 + __be32 *p; 3557 + 3558 + *res = 0; 3559 + if (unlikely(bitmap[0] & (FATTR4_WORD0_CASE_PRESERVING - 1U))) 3560 + return -EIO; 3561 + if (likely(bitmap[0] & FATTR4_WORD0_CASE_PRESERVING)) { 3562 + p = xdr_inline_decode(xdr, 4); 3563 + if (unlikely(!p)) 3564 + return -EIO; 3565 + *res = be32_to_cpup(p); 3566 + bitmap[0] &= ~FATTR4_WORD0_CASE_PRESERVING; 3567 + } 3568 + dprintk("%s: case_preserving=%s\n", __func__, *res == 0 ? "false" : "true"); 3569 + return 0; 3570 + } 3571 + 3536 3572 static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid) 3537 3573 { 3538 3574 __be32 *p; ··· 3732 3696 if (unlikely(!p)) 3733 3697 goto out_eio; 3734 3698 n = be32_to_cpup(p); 3735 - if (n <= 0) 3736 - goto out_eio; 3737 3699 for (res->nlocations = 0; res->nlocations < n; res->nlocations++) { 3738 3700 u32 m; 3739 3701 struct nfs4_fs_location *loc; ··· 4234 4200 } else 4235 4201 printk(KERN_WARNING "%s: label too long (%u)!\n", 4236 4202 __func__, len); 4203 + if (label && label->label) 4204 + dprintk("%s: label=%.*s, len=%d, PI=%d, LFS=%d\n", 4205 + __func__, label->len, (char *)label->label, 4206 + label->len, label->pi, label->lfs); 4237 4207 } 4238 - if (label && label->label) 4239 - dprintk("%s: label=%s, len=%d, PI=%d, LFS=%d\n", __func__, 4240 - (char *)label->label, label->len, label->pi, label->lfs); 4241 4208 return status; 4242 4209 } 4243 4210 ··· 4446 4411 if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0) 4447 4412 goto xdr_error; 4448 4413 if ((status = decode_attr_aclsupport(xdr, bitmap, &res->acl_bitmask)) != 0) 4414 + goto xdr_error; 4415 + if ((status = decode_attr_case_insensitive(xdr, bitmap, &res->case_insensitive)) != 0) 4416 + goto xdr_error; 4417 + if ((status = decode_attr_case_preserving(xdr, bitmap, &res->case_preserving)) != 0) 4449 4418 goto xdr_error; 4450 4419 if ((status = decode_attr_exclcreat_supported(xdr, bitmap, 4451 4420 res->exclcreat_bitmask)) != 0)
+2 -1
fs/nfs/sysfs.c
··· 142 142 &nfs_netns_client_id.attr, 143 143 NULL, 144 144 }; 145 + ATTRIBUTE_GROUPS(nfs_netns_client); 145 146 146 147 static struct kobj_type nfs_netns_client_type = { 147 148 .release = nfs_netns_client_release, 148 - .default_attrs = nfs_netns_client_attrs, 149 + .default_groups = nfs_netns_client_groups, 149 150 .sysfs_ops = &kobj_sysfs_ops, 150 151 .namespace = nfs_netns_client_namespace, 151 152 };
+6 -4
include/linux/nfs_fs.h
··· 61 61 struct nfs_access_entry { 62 62 struct rb_node rb_node; 63 63 struct list_head lru; 64 - const struct cred * cred; 64 + kuid_t fsuid; 65 + kgid_t fsgid; 66 + struct group_info *group_info; 65 67 __u32 mask; 66 68 struct rcu_head rcu_head; 67 69 }; ··· 397 395 extern int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fattr *fattr); 398 396 extern int nfs_getattr(struct user_namespace *, const struct path *, 399 397 struct kstat *, u32, unsigned int); 400 - extern void nfs_access_add_cache(struct inode *, struct nfs_access_entry *); 398 + extern void nfs_access_add_cache(struct inode *, struct nfs_access_entry *, const struct cred *); 401 399 extern void nfs_access_set_mask(struct nfs_access_entry *, u32); 402 400 extern int nfs_permission(struct user_namespace *, struct inode *, int); 403 401 extern int nfs_open(struct inode *, struct file *); ··· 534 532 struct nfs_fattr *fattr); 535 533 extern int nfs_may_open(struct inode *inode, const struct cred *cred, int openflags); 536 534 extern void nfs_access_zap_cache(struct inode *inode); 537 - extern int nfs_access_get_cached(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res, 538 - bool may_block); 535 + extern int nfs_access_get_cached(struct inode *inode, const struct cred *cred, 536 + u32 *mask, bool may_block); 539 537 540 538 /* 541 539 * linux/fs/nfs/symlink.c
+3 -1
include/linux/nfs_fs_sb.h
··· 266 266 #define NFS_CAP_ACLS (1U << 3) 267 267 #define NFS_CAP_ATOMIC_OPEN (1U << 4) 268 268 #define NFS_CAP_LGOPEN (1U << 5) 269 + #define NFS_CAP_CASE_INSENSITIVE (1U << 6) 270 + #define NFS_CAP_CASE_PRESERVING (1U << 7) 269 271 #define NFS_CAP_POSIX_LOCK (1U << 14) 270 272 #define NFS_CAP_UIDGID_NOMAP (1U << 15) 271 273 #define NFS_CAP_STATEID_NFSV41 (1U << 16) ··· 284 282 #define NFS_CAP_COPY_NOTIFY (1U << 27) 285 283 #define NFS_CAP_XATTR (1U << 28) 286 284 #define NFS_CAP_READ_PLUS (1U << 29) 287 - 285 + #define NFS_CAP_FS_LOCATIONS (1U << 30) 288 286 #endif
+4 -1
include/linux/nfs_xdr.h
··· 1194 1194 u32 has_links; 1195 1195 u32 has_symlinks; 1196 1196 u32 fh_expire_type; 1197 + u32 case_insensitive; 1198 + u32 case_preserving; 1197 1199 }; 1198 1200 1199 1201 #define NFS4_PATHNAME_MAXCOMPONENTS 512 ··· 1739 1737 struct nfs_fh *, struct nfs_fattr *); 1740 1738 int (*lookupp) (struct inode *, struct nfs_fh *, 1741 1739 struct nfs_fattr *); 1742 - int (*access) (struct inode *, struct nfs_access_entry *); 1740 + int (*access) (struct inode *, struct nfs_access_entry *, const struct cred *); 1743 1741 int (*readlink)(struct inode *, struct page *, unsigned int, 1744 1742 unsigned int); 1745 1743 int (*create) (struct inode *, struct dentry *, ··· 1797 1795 struct nfs_server *(*create_server)(struct fs_context *); 1798 1796 struct nfs_server *(*clone_server)(struct nfs_server *, struct nfs_fh *, 1799 1797 struct nfs_fattr *, rpc_authflavor_t); 1798 + int (*discover_trunking)(struct nfs_server *, struct nfs_fh *); 1800 1799 }; 1801 1800 1802 1801 /*
+45 -25
include/trace/events/sunrpc.h
··· 794 794 795 795 RPC_SHOW_SOCK 796 796 797 + 798 + #include <trace/events/net_probe_common.h> 799 + 797 800 /* 798 801 * Now redefine the EM() and EMe() macros to map the enums to the strings 799 802 * that will be printed in the output. ··· 819 816 __field(unsigned int, socket_state) 820 817 __field(unsigned int, sock_state) 821 818 __field(unsigned long long, ino) 822 - __string(dstaddr, 823 - xprt->address_strings[RPC_DISPLAY_ADDR]) 824 - __string(dstport, 825 - xprt->address_strings[RPC_DISPLAY_PORT]) 819 + __array(__u8, saddr, sizeof(struct sockaddr_in6)) 820 + __array(__u8, daddr, sizeof(struct sockaddr_in6)) 826 821 ), 827 822 828 823 TP_fast_assign( 829 824 struct inode *inode = SOCK_INODE(socket); 825 + const struct sock *sk = socket->sk; 826 + const struct inet_sock *inet = inet_sk(sk); 827 + 828 + memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 829 + memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 830 + 831 + TP_STORE_ADDR_PORTS(__entry, inet, sk); 832 + 830 833 __entry->socket_state = socket->state; 831 834 __entry->sock_state = socket->sk->sk_state; 832 835 __entry->ino = (unsigned long long)inode->i_ino; 833 - __assign_str(dstaddr, 834 - xprt->address_strings[RPC_DISPLAY_ADDR]); 835 - __assign_str(dstport, 836 - xprt->address_strings[RPC_DISPLAY_PORT]); 836 + 837 837 ), 838 838 839 839 TP_printk( 840 - "socket:[%llu] dstaddr=%s/%s " 840 + "socket:[%llu] srcaddr=%pISpc dstaddr=%pISpc " 841 841 "state=%u (%s) sk_state=%u (%s)", 842 - __entry->ino, __get_str(dstaddr), __get_str(dstport), 842 + __entry->ino, 843 + __entry->saddr, 844 + __entry->daddr, 843 845 __entry->socket_state, 844 846 rpc_show_socket_state(__entry->socket_state), 845 847 __entry->sock_state, ··· 874 866 __field(unsigned int, socket_state) 875 867 __field(unsigned int, sock_state) 876 868 __field(unsigned long long, ino) 877 - __string(dstaddr, 878 - xprt->address_strings[RPC_DISPLAY_ADDR]) 879 - __string(dstport, 880 - xprt->address_strings[RPC_DISPLAY_PORT]) 869 + __array(__u8, saddr, sizeof(struct sockaddr_in6)) 870 + __array(__u8, daddr, sizeof(struct sockaddr_in6)) 881 871 ), 882 872 883 873 TP_fast_assign( 884 874 struct inode *inode = SOCK_INODE(socket); 875 + const struct sock *sk = socket->sk; 876 + const struct inet_sock *inet = inet_sk(sk); 877 + 878 + memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 879 + memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 880 + 881 + TP_STORE_ADDR_PORTS(__entry, inet, sk); 882 + 885 883 __entry->socket_state = socket->state; 886 884 __entry->sock_state = socket->sk->sk_state; 887 885 __entry->ino = (unsigned long long)inode->i_ino; 888 886 __entry->error = error; 889 - __assign_str(dstaddr, 890 - xprt->address_strings[RPC_DISPLAY_ADDR]); 891 - __assign_str(dstport, 892 - xprt->address_strings[RPC_DISPLAY_PORT]); 893 887 ), 894 888 895 889 TP_printk( 896 - "error=%d socket:[%llu] dstaddr=%s/%s " 890 + "error=%d socket:[%llu] srcaddr=%pISpc dstaddr=%pISpc " 897 891 "state=%u (%s) sk_state=%u (%s)", 898 892 __entry->error, 899 - __entry->ino, __get_str(dstaddr), __get_str(dstport), 893 + __entry->ino, 894 + __entry->saddr, 895 + __entry->daddr, 900 896 __entry->socket_state, 901 897 rpc_show_socket_state(__entry->socket_state), 902 898 __entry->sock_state, ··· 965 953 { BIT(XPRT_REMOVE), "REMOVE" }, \ 966 954 { BIT(XPRT_CONGESTED), "CONGESTED" }, \ 967 955 { BIT(XPRT_CWND_WAIT), "CWND_WAIT" }, \ 968 - { BIT(XPRT_WRITE_SPACE), "WRITE_SPACE" }) 956 + { BIT(XPRT_WRITE_SPACE), "WRITE_SPACE" }, \ 957 + { BIT(XPRT_SND_IS_COOKIE), "SND_IS_COOKIE" }) 969 958 970 959 DECLARE_EVENT_CLASS(rpc_xprt_lifetime_class, 971 960 TP_PROTO( ··· 1163 1150 __entry->task_id = -1; 1164 1151 __entry->client_id = -1; 1165 1152 } 1166 - __entry->snd_task_id = xprt->snd_task ? 1167 - xprt->snd_task->tk_pid : -1; 1153 + if (xprt->snd_task && 1154 + !test_bit(XPRT_SND_IS_COOKIE, &xprt->state)) 1155 + __entry->snd_task_id = xprt->snd_task->tk_pid; 1156 + else 1157 + __entry->snd_task_id = -1; 1168 1158 ), 1169 1159 1170 1160 TP_printk(SUNRPC_TRACE_TASK_SPECIFIER ··· 1212 1196 __entry->task_id = -1; 1213 1197 __entry->client_id = -1; 1214 1198 } 1215 - __entry->snd_task_id = xprt->snd_task ? 1216 - xprt->snd_task->tk_pid : -1; 1199 + if (xprt->snd_task && 1200 + !test_bit(XPRT_SND_IS_COOKIE, &xprt->state)) 1201 + __entry->snd_task_id = xprt->snd_task->tk_pid; 1202 + else 1203 + __entry->snd_task_id = -1; 1204 + 1217 1205 __entry->cong = xprt->cong; 1218 1206 __entry->cwnd = xprt->cwnd; 1219 1207 __entry->wait = test_bit(XPRT_CWND_WAIT, &xprt->state);
+2 -4
net/sunrpc/auth_gss/gss_generic_token.c
··· 222 222 if (ret) 223 223 return ret; 224 224 225 - if (!ret) { 226 - *buf_in = buf; 227 - *body_size = toksize; 228 - } 225 + *buf_in = buf; 226 + *body_size = toksize; 229 227 230 228 return ret; 231 229 }
+4 -1
net/sunrpc/clnt.c
··· 2900 2900 unsigned long connect_timeout; 2901 2901 unsigned long reconnect_timeout; 2902 2902 unsigned char resvport, reuseport; 2903 - int ret = 0; 2903 + int ret = 0, ident; 2904 2904 2905 2905 rcu_read_lock(); 2906 2906 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); ··· 2914 2914 reuseport = xprt->reuseport; 2915 2915 connect_timeout = xprt->connect_timeout; 2916 2916 reconnect_timeout = xprt->max_reconnect_timeout; 2917 + ident = xprt->xprt_class->ident; 2917 2918 rcu_read_unlock(); 2918 2919 2920 + if (!xprtargs->ident) 2921 + xprtargs->ident = ident; 2919 2922 xprt = xprt_create_transport(xprtargs); 2920 2923 if (IS_ERR(xprt)) { 2921 2924 ret = PTR_ERR(xprt);
+27 -20
net/sunrpc/sysfs.c
··· 295 295 online = 1; 296 296 else if (!strncmp(buf, "remove", 6)) 297 297 remove = 1; 298 - else 299 - return -EINVAL; 298 + else { 299 + count = -EINVAL; 300 + goto out_put; 301 + } 300 302 301 303 if (wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_KILLABLE)) { 302 304 count = -EINTR; ··· 309 307 goto release_tasks; 310 308 } 311 309 if (offline) { 312 - set_bit(XPRT_OFFLINE, &xprt->state); 313 - spin_lock(&xps->xps_lock); 314 - xps->xps_nactive--; 315 - spin_unlock(&xps->xps_lock); 310 + if (!test_and_set_bit(XPRT_OFFLINE, &xprt->state)) { 311 + spin_lock(&xps->xps_lock); 312 + xps->xps_nactive--; 313 + spin_unlock(&xps->xps_lock); 314 + } 316 315 } else if (online) { 317 - clear_bit(XPRT_OFFLINE, &xprt->state); 318 - spin_lock(&xps->xps_lock); 319 - xps->xps_nactive++; 320 - spin_unlock(&xps->xps_lock); 316 + if (test_and_clear_bit(XPRT_OFFLINE, &xprt->state)) { 317 + spin_lock(&xps->xps_lock); 318 + xps->xps_nactive++; 319 + spin_unlock(&xps->xps_lock); 320 + } 321 321 } else if (remove) { 322 322 if (test_bit(XPRT_OFFLINE, &xprt->state)) { 323 - set_bit(XPRT_REMOVE, &xprt->state); 324 - xprt_force_disconnect(xprt); 325 - if (test_bit(XPRT_CONNECTED, &xprt->state)) { 326 - if (!xprt->sending.qlen && 327 - !xprt->pending.qlen && 328 - !xprt->backlog.qlen && 329 - !atomic_long_read(&xprt->queuelen)) 330 - rpc_xprt_switch_remove_xprt(xps, xprt); 323 + if (!test_and_set_bit(XPRT_REMOVE, &xprt->state)) { 324 + xprt_force_disconnect(xprt); 325 + if (test_bit(XPRT_CONNECTED, &xprt->state)) { 326 + if (!xprt->sending.qlen && 327 + !xprt->pending.qlen && 328 + !xprt->backlog.qlen && 329 + !atomic_long_read(&xprt->queuelen)) 330 + rpc_xprt_switch_remove_xprt(xps, xprt); 331 + } 331 332 } 332 333 } else { 333 334 count = -EINVAL; ··· 427 422 &rpc_sysfs_xprt_change_state.attr, 428 423 NULL, 429 424 }; 425 + ATTRIBUTE_GROUPS(rpc_sysfs_xprt); 430 426 431 427 static struct kobj_attribute rpc_sysfs_xprt_switch_info = 432 428 __ATTR(xprt_switch_info, 0444, rpc_sysfs_xprt_switch_info_show, NULL); ··· 436 430 &rpc_sysfs_xprt_switch_info.attr, 437 431 NULL, 438 432 }; 433 + ATTRIBUTE_GROUPS(rpc_sysfs_xprt_switch); 439 434 440 435 static struct kobj_type rpc_sysfs_client_type = { 441 436 .release = rpc_sysfs_client_release, ··· 446 439 447 440 static struct kobj_type rpc_sysfs_xprt_switch_type = { 448 441 .release = rpc_sysfs_xprt_switch_release, 449 - .default_attrs = rpc_sysfs_xprt_switch_attrs, 442 + .default_groups = rpc_sysfs_xprt_switch_groups, 450 443 .sysfs_ops = &kobj_sysfs_ops, 451 444 .namespace = rpc_sysfs_xprt_switch_namespace, 452 445 }; 453 446 454 447 static struct kobj_type rpc_sysfs_xprt_type = { 455 448 .release = rpc_sysfs_xprt_release, 456 - .default_attrs = rpc_sysfs_xprt_attrs, 449 + .default_groups = rpc_sysfs_xprt_groups, 457 450 .sysfs_ops = &kobj_sysfs_ops, 458 451 .namespace = rpc_sysfs_xprt_namespace, 459 452 };
-4
net/sunrpc/xprtrdma/backchannel.c
··· 13 13 #include "xprt_rdma.h" 14 14 #include <trace/events/rpcrdma.h> 15 15 16 - #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 17 - # define RPCDBG_FACILITY RPCDBG_TRANS 18 - #endif 19 - 20 16 #undef RPCRDMA_BACKCHANNEL_DEBUG 21 17 22 18 /**
-4
net/sunrpc/xprtrdma/frwr_ops.c
··· 45 45 #include "xprt_rdma.h" 46 46 #include <trace/events/rpcrdma.h> 47 47 48 - #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 49 - # define RPCDBG_FACILITY RPCDBG_TRANS 50 - #endif 51 - 52 48 static void frwr_cid_init(struct rpcrdma_ep *ep, 53 49 struct rpcrdma_mr *mr) 54 50 {
-4
net/sunrpc/xprtrdma/rpc_rdma.c
··· 54 54 #include "xprt_rdma.h" 55 55 #include <trace/events/rpcrdma.h> 56 56 57 - #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 58 - # define RPCDBG_FACILITY RPCDBG_TRANS 59 - #endif 60 - 61 57 /* Returns size of largest RPC-over-RDMA header in a Call message 62 58 * 63 59 * The largest Call header contains a full-size Read list and a
-4
net/sunrpc/xprtrdma/transport.c
··· 60 60 #include "xprt_rdma.h" 61 61 #include <trace/events/rpcrdma.h> 62 62 63 - #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 64 - # define RPCDBG_FACILITY RPCDBG_TRANS 65 - #endif 66 - 67 63 /* 68 64 * tunables 69 65 */
-23
net/sunrpc/xprtrdma/verbs.c
··· 63 63 #include "xprt_rdma.h" 64 64 #include <trace/events/rpcrdma.h> 65 65 66 - /* 67 - * Globals/Macros 68 - */ 69 - 70 - #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 71 - # define RPCDBG_FACILITY RPCDBG_TRANS 72 - #endif 73 - 74 - /* 75 - * internal functions 76 - */ 77 66 static int rpcrdma_sendctxs_create(struct rpcrdma_xprt *r_xprt); 78 67 static void rpcrdma_sendctxs_destroy(struct rpcrdma_xprt *r_xprt); 79 68 static void rpcrdma_sendctx_put_locked(struct rpcrdma_xprt *r_xprt, ··· 263 274 ep->re_connect_status = -ENETUNREACH; 264 275 goto wake_connect_worker; 265 276 case RDMA_CM_EVENT_REJECTED: 266 - dprintk("rpcrdma: connection to %pISpc rejected: %s\n", 267 - sap, rdma_reject_msg(id, event->status)); 268 277 ep->re_connect_status = -ECONNREFUSED; 269 278 if (event->status == IB_CM_REJ_STALE_CONN) 270 279 ep->re_connect_status = -ENOTCONN; ··· 278 291 break; 279 292 } 280 293 281 - dprintk("RPC: %s: %pISpc on %s/frwr: %s\n", __func__, sap, 282 - ep->re_id->device->name, rdma_event_msg(event->event)); 283 294 return 0; 284 295 } 285 296 ··· 403 418 ep->re_attr.sq_sig_type = IB_SIGNAL_REQ_WR; 404 419 ep->re_attr.qp_type = IB_QPT_RC; 405 420 ep->re_attr.port_num = ~0; 406 - 407 - dprintk("RPC: %s: requested max: dtos: send %d recv %d; " 408 - "iovs: send %d recv %d\n", 409 - __func__, 410 - ep->re_attr.cap.max_send_wr, 411 - ep->re_attr.cap.max_recv_wr, 412 - ep->re_attr.cap.max_send_sge, 413 - ep->re_attr.cap.max_recv_sge); 414 421 415 422 ep->re_send_batch = ep->re_max_requests >> 3; 416 423 ep->re_send_count = ep->re_send_batch;
+1 -1
net/sunrpc/xprtsock.c
··· 1910 1910 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1911 1911 int ret; 1912 1912 1913 - if (RPC_IS_ASYNC(task)) { 1913 + if (RPC_IS_ASYNC(task)) { 1914 1914 /* 1915 1915 * We want the AF_LOCAL connect to be resolved in the 1916 1916 * filesystem namespace of the process making the rpc