diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 265 |
1 files changed, 126 insertions, 139 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 1293e0acd82b..c910413eaeca 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -451,9 +451,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata) | |||
451 | /* Save the delegation */ | 451 | /* Save the delegation */ |
452 | memcpy(stateid.data, delegation->stateid.data, sizeof(stateid.data)); | 452 | memcpy(stateid.data, delegation->stateid.data, sizeof(stateid.data)); |
453 | rcu_read_unlock(); | 453 | rcu_read_unlock(); |
454 | lock_kernel(); | ||
455 | ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode); | 454 | ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode); |
456 | unlock_kernel(); | ||
457 | if (ret != 0) | 455 | if (ret != 0) |
458 | goto out; | 456 | goto out; |
459 | ret = -EAGAIN; | 457 | ret = -EAGAIN; |
@@ -1139,8 +1137,9 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct path *path, int | |||
1139 | return res; | 1137 | return res; |
1140 | } | 1138 | } |
1141 | 1139 | ||
1142 | static int _nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, | 1140 | static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, |
1143 | struct iattr *sattr, struct nfs4_state *state) | 1141 | struct nfs_fattr *fattr, struct iattr *sattr, |
1142 | struct nfs4_state *state) | ||
1144 | { | 1143 | { |
1145 | struct nfs_server *server = NFS_SERVER(inode); | 1144 | struct nfs_server *server = NFS_SERVER(inode); |
1146 | struct nfs_setattrargs arg = { | 1145 | struct nfs_setattrargs arg = { |
@@ -1154,9 +1153,10 @@ static int _nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, | |||
1154 | .server = server, | 1153 | .server = server, |
1155 | }; | 1154 | }; |
1156 | struct rpc_message msg = { | 1155 | struct rpc_message msg = { |
1157 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], | 1156 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], |
1158 | .rpc_argp = &arg, | 1157 | .rpc_argp = &arg, |
1159 | .rpc_resp = &res, | 1158 | .rpc_resp = &res, |
1159 | .rpc_cred = cred, | ||
1160 | }; | 1160 | }; |
1161 | unsigned long timestamp = jiffies; | 1161 | unsigned long timestamp = jiffies; |
1162 | int status; | 1162 | int status; |
@@ -1166,7 +1166,6 @@ static int _nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, | |||
1166 | if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) { | 1166 | if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) { |
1167 | /* Use that stateid */ | 1167 | /* Use that stateid */ |
1168 | } else if (state != NULL) { | 1168 | } else if (state != NULL) { |
1169 | msg.rpc_cred = state->owner->so_cred; | ||
1170 | nfs4_copy_stateid(&arg.stateid, state, current->files); | 1169 | nfs4_copy_stateid(&arg.stateid, state, current->files); |
1171 | } else | 1170 | } else |
1172 | memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid)); | 1171 | memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid)); |
@@ -1177,15 +1176,16 @@ static int _nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, | |||
1177 | return status; | 1176 | return status; |
1178 | } | 1177 | } |
1179 | 1178 | ||
1180 | static int nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, | 1179 | static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, |
1181 | struct iattr *sattr, struct nfs4_state *state) | 1180 | struct nfs_fattr *fattr, struct iattr *sattr, |
1181 | struct nfs4_state *state) | ||
1182 | { | 1182 | { |
1183 | struct nfs_server *server = NFS_SERVER(inode); | 1183 | struct nfs_server *server = NFS_SERVER(inode); |
1184 | struct nfs4_exception exception = { }; | 1184 | struct nfs4_exception exception = { }; |
1185 | int err; | 1185 | int err; |
1186 | do { | 1186 | do { |
1187 | err = nfs4_handle_exception(server, | 1187 | err = nfs4_handle_exception(server, |
1188 | _nfs4_do_setattr(inode, fattr, sattr, state), | 1188 | _nfs4_do_setattr(inode, cred, fattr, sattr, state), |
1189 | &exception); | 1189 | &exception); |
1190 | } while (exception.retry); | 1190 | } while (exception.retry); |
1191 | return err; | 1191 | return err; |
@@ -1647,29 +1647,25 @@ static int | |||
1647 | nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, | 1647 | nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, |
1648 | struct iattr *sattr) | 1648 | struct iattr *sattr) |
1649 | { | 1649 | { |
1650 | struct rpc_cred *cred; | ||
1651 | struct inode *inode = dentry->d_inode; | 1650 | struct inode *inode = dentry->d_inode; |
1652 | struct nfs_open_context *ctx; | 1651 | struct rpc_cred *cred = NULL; |
1653 | struct nfs4_state *state = NULL; | 1652 | struct nfs4_state *state = NULL; |
1654 | int status; | 1653 | int status; |
1655 | 1654 | ||
1656 | nfs_fattr_init(fattr); | 1655 | nfs_fattr_init(fattr); |
1657 | 1656 | ||
1658 | cred = rpc_lookup_cred(); | ||
1659 | if (IS_ERR(cred)) | ||
1660 | return PTR_ERR(cred); | ||
1661 | |||
1662 | /* Search for an existing open(O_WRITE) file */ | 1657 | /* Search for an existing open(O_WRITE) file */ |
1663 | ctx = nfs_find_open_context(inode, cred, FMODE_WRITE); | 1658 | if (sattr->ia_valid & ATTR_FILE) { |
1664 | if (ctx != NULL) | 1659 | struct nfs_open_context *ctx; |
1660 | |||
1661 | ctx = nfs_file_open_context(sattr->ia_file); | ||
1662 | cred = ctx->cred; | ||
1665 | state = ctx->state; | 1663 | state = ctx->state; |
1664 | } | ||
1666 | 1665 | ||
1667 | status = nfs4_do_setattr(inode, fattr, sattr, state); | 1666 | status = nfs4_do_setattr(inode, cred, fattr, sattr, state); |
1668 | if (status == 0) | 1667 | if (status == 0) |
1669 | nfs_setattr_update_inode(inode, sattr); | 1668 | nfs_setattr_update_inode(inode, sattr); |
1670 | if (ctx != NULL) | ||
1671 | put_nfs_open_context(ctx); | ||
1672 | put_rpccred(cred); | ||
1673 | return status; | 1669 | return status; |
1674 | } | 1670 | } |
1675 | 1671 | ||
@@ -1897,17 +1893,16 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
1897 | goto out; | 1893 | goto out; |
1898 | } | 1894 | } |
1899 | state = nfs4_do_open(dir, &path, flags, sattr, cred); | 1895 | state = nfs4_do_open(dir, &path, flags, sattr, cred); |
1900 | put_rpccred(cred); | ||
1901 | d_drop(dentry); | 1896 | d_drop(dentry); |
1902 | if (IS_ERR(state)) { | 1897 | if (IS_ERR(state)) { |
1903 | status = PTR_ERR(state); | 1898 | status = PTR_ERR(state); |
1904 | goto out; | 1899 | goto out_putcred; |
1905 | } | 1900 | } |
1906 | d_add(dentry, igrab(state->inode)); | 1901 | d_add(dentry, igrab(state->inode)); |
1907 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); | 1902 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); |
1908 | if (flags & O_EXCL) { | 1903 | if (flags & O_EXCL) { |
1909 | struct nfs_fattr fattr; | 1904 | struct nfs_fattr fattr; |
1910 | status = nfs4_do_setattr(state->inode, &fattr, sattr, state); | 1905 | status = nfs4_do_setattr(state->inode, cred, &fattr, sattr, state); |
1911 | if (status == 0) | 1906 | if (status == 0) |
1912 | nfs_setattr_update_inode(state->inode, sattr); | 1907 | nfs_setattr_update_inode(state->inode, sattr); |
1913 | nfs_post_op_update_inode(state->inode, &fattr); | 1908 | nfs_post_op_update_inode(state->inode, &fattr); |
@@ -1916,6 +1911,8 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
1916 | status = nfs4_intent_set_file(nd, &path, state); | 1911 | status = nfs4_intent_set_file(nd, &path, state); |
1917 | else | 1912 | else |
1918 | nfs4_close_sync(&path, state, flags); | 1913 | nfs4_close_sync(&path, state, flags); |
1914 | out_putcred: | ||
1915 | put_rpccred(cred); | ||
1919 | out: | 1916 | out: |
1920 | return status; | 1917 | return status; |
1921 | } | 1918 | } |
@@ -2079,47 +2076,81 @@ static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *n | |||
2079 | return err; | 2076 | return err; |
2080 | } | 2077 | } |
2081 | 2078 | ||
2079 | struct nfs4_createdata { | ||
2080 | struct rpc_message msg; | ||
2081 | struct nfs4_create_arg arg; | ||
2082 | struct nfs4_create_res res; | ||
2083 | struct nfs_fh fh; | ||
2084 | struct nfs_fattr fattr; | ||
2085 | struct nfs_fattr dir_fattr; | ||
2086 | }; | ||
2087 | |||
2088 | static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir, | ||
2089 | struct qstr *name, struct iattr *sattr, u32 ftype) | ||
2090 | { | ||
2091 | struct nfs4_createdata *data; | ||
2092 | |||
2093 | data = kzalloc(sizeof(*data), GFP_KERNEL); | ||
2094 | if (data != NULL) { | ||
2095 | struct nfs_server *server = NFS_SERVER(dir); | ||
2096 | |||
2097 | data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE]; | ||
2098 | data->msg.rpc_argp = &data->arg; | ||
2099 | data->msg.rpc_resp = &data->res; | ||
2100 | data->arg.dir_fh = NFS_FH(dir); | ||
2101 | data->arg.server = server; | ||
2102 | data->arg.name = name; | ||
2103 | data->arg.attrs = sattr; | ||
2104 | data->arg.ftype = ftype; | ||
2105 | data->arg.bitmask = server->attr_bitmask; | ||
2106 | data->res.server = server; | ||
2107 | data->res.fh = &data->fh; | ||
2108 | data->res.fattr = &data->fattr; | ||
2109 | data->res.dir_fattr = &data->dir_fattr; | ||
2110 | nfs_fattr_init(data->res.fattr); | ||
2111 | nfs_fattr_init(data->res.dir_fattr); | ||
2112 | } | ||
2113 | return data; | ||
2114 | } | ||
2115 | |||
2116 | static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data) | ||
2117 | { | ||
2118 | int status = rpc_call_sync(NFS_CLIENT(dir), &data->msg, 0); | ||
2119 | if (status == 0) { | ||
2120 | update_changeattr(dir, &data->res.dir_cinfo); | ||
2121 | nfs_post_op_update_inode(dir, data->res.dir_fattr); | ||
2122 | status = nfs_instantiate(dentry, data->res.fh, data->res.fattr); | ||
2123 | } | ||
2124 | return status; | ||
2125 | } | ||
2126 | |||
2127 | static void nfs4_free_createdata(struct nfs4_createdata *data) | ||
2128 | { | ||
2129 | kfree(data); | ||
2130 | } | ||
2131 | |||
2082 | static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, | 2132 | static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, |
2083 | struct page *page, unsigned int len, struct iattr *sattr) | 2133 | struct page *page, unsigned int len, struct iattr *sattr) |
2084 | { | 2134 | { |
2085 | struct nfs_server *server = NFS_SERVER(dir); | 2135 | struct nfs4_createdata *data; |
2086 | struct nfs_fh fhandle; | 2136 | int status = -ENAMETOOLONG; |
2087 | struct nfs_fattr fattr, dir_fattr; | ||
2088 | struct nfs4_create_arg arg = { | ||
2089 | .dir_fh = NFS_FH(dir), | ||
2090 | .server = server, | ||
2091 | .name = &dentry->d_name, | ||
2092 | .attrs = sattr, | ||
2093 | .ftype = NF4LNK, | ||
2094 | .bitmask = server->attr_bitmask, | ||
2095 | }; | ||
2096 | struct nfs4_create_res res = { | ||
2097 | .server = server, | ||
2098 | .fh = &fhandle, | ||
2099 | .fattr = &fattr, | ||
2100 | .dir_fattr = &dir_fattr, | ||
2101 | }; | ||
2102 | struct rpc_message msg = { | ||
2103 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK], | ||
2104 | .rpc_argp = &arg, | ||
2105 | .rpc_resp = &res, | ||
2106 | }; | ||
2107 | int status; | ||
2108 | 2137 | ||
2109 | if (len > NFS4_MAXPATHLEN) | 2138 | if (len > NFS4_MAXPATHLEN) |
2110 | return -ENAMETOOLONG; | 2139 | goto out; |
2111 | 2140 | ||
2112 | arg.u.symlink.pages = &page; | 2141 | status = -ENOMEM; |
2113 | arg.u.symlink.len = len; | 2142 | data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK); |
2114 | nfs_fattr_init(&fattr); | 2143 | if (data == NULL) |
2115 | nfs_fattr_init(&dir_fattr); | 2144 | goto out; |
2145 | |||
2146 | data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK]; | ||
2147 | data->arg.u.symlink.pages = &page; | ||
2148 | data->arg.u.symlink.len = len; | ||
2116 | 2149 | ||
2117 | status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); | 2150 | status = nfs4_do_create(dir, dentry, data); |
2118 | if (!status) { | 2151 | |
2119 | update_changeattr(dir, &res.dir_cinfo); | 2152 | nfs4_free_createdata(data); |
2120 | nfs_post_op_update_inode(dir, res.dir_fattr); | 2153 | out: |
2121 | status = nfs_instantiate(dentry, &fhandle, &fattr); | ||
2122 | } | ||
2123 | return status; | 2154 | return status; |
2124 | } | 2155 | } |
2125 | 2156 | ||
@@ -2140,39 +2171,17 @@ static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, | |||
2140 | static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, | 2171 | static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, |
2141 | struct iattr *sattr) | 2172 | struct iattr *sattr) |
2142 | { | 2173 | { |
2143 | struct nfs_server *server = NFS_SERVER(dir); | 2174 | struct nfs4_createdata *data; |
2144 | struct nfs_fh fhandle; | 2175 | int status = -ENOMEM; |
2145 | struct nfs_fattr fattr, dir_fattr; | ||
2146 | struct nfs4_create_arg arg = { | ||
2147 | .dir_fh = NFS_FH(dir), | ||
2148 | .server = server, | ||
2149 | .name = &dentry->d_name, | ||
2150 | .attrs = sattr, | ||
2151 | .ftype = NF4DIR, | ||
2152 | .bitmask = server->attr_bitmask, | ||
2153 | }; | ||
2154 | struct nfs4_create_res res = { | ||
2155 | .server = server, | ||
2156 | .fh = &fhandle, | ||
2157 | .fattr = &fattr, | ||
2158 | .dir_fattr = &dir_fattr, | ||
2159 | }; | ||
2160 | struct rpc_message msg = { | ||
2161 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE], | ||
2162 | .rpc_argp = &arg, | ||
2163 | .rpc_resp = &res, | ||
2164 | }; | ||
2165 | int status; | ||
2166 | 2176 | ||
2167 | nfs_fattr_init(&fattr); | 2177 | data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR); |
2168 | nfs_fattr_init(&dir_fattr); | 2178 | if (data == NULL) |
2169 | 2179 | goto out; | |
2170 | status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); | 2180 | |
2171 | if (!status) { | 2181 | status = nfs4_do_create(dir, dentry, data); |
2172 | update_changeattr(dir, &res.dir_cinfo); | 2182 | |
2173 | nfs_post_op_update_inode(dir, res.dir_fattr); | 2183 | nfs4_free_createdata(data); |
2174 | status = nfs_instantiate(dentry, &fhandle, &fattr); | 2184 | out: |
2175 | } | ||
2176 | return status; | 2185 | return status; |
2177 | } | 2186 | } |
2178 | 2187 | ||
@@ -2242,56 +2251,34 @@ static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, | |||
2242 | static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, | 2251 | static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, |
2243 | struct iattr *sattr, dev_t rdev) | 2252 | struct iattr *sattr, dev_t rdev) |
2244 | { | 2253 | { |
2245 | struct nfs_server *server = NFS_SERVER(dir); | 2254 | struct nfs4_createdata *data; |
2246 | struct nfs_fh fh; | 2255 | int mode = sattr->ia_mode; |
2247 | struct nfs_fattr fattr, dir_fattr; | 2256 | int status = -ENOMEM; |
2248 | struct nfs4_create_arg arg = { | ||
2249 | .dir_fh = NFS_FH(dir), | ||
2250 | .server = server, | ||
2251 | .name = &dentry->d_name, | ||
2252 | .attrs = sattr, | ||
2253 | .bitmask = server->attr_bitmask, | ||
2254 | }; | ||
2255 | struct nfs4_create_res res = { | ||
2256 | .server = server, | ||
2257 | .fh = &fh, | ||
2258 | .fattr = &fattr, | ||
2259 | .dir_fattr = &dir_fattr, | ||
2260 | }; | ||
2261 | struct rpc_message msg = { | ||
2262 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE], | ||
2263 | .rpc_argp = &arg, | ||
2264 | .rpc_resp = &res, | ||
2265 | }; | ||
2266 | int status; | ||
2267 | int mode = sattr->ia_mode; | ||
2268 | |||
2269 | nfs_fattr_init(&fattr); | ||
2270 | nfs_fattr_init(&dir_fattr); | ||
2271 | 2257 | ||
2272 | BUG_ON(!(sattr->ia_valid & ATTR_MODE)); | 2258 | BUG_ON(!(sattr->ia_valid & ATTR_MODE)); |
2273 | BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode)); | 2259 | BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode)); |
2260 | |||
2261 | data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK); | ||
2262 | if (data == NULL) | ||
2263 | goto out; | ||
2264 | |||
2274 | if (S_ISFIFO(mode)) | 2265 | if (S_ISFIFO(mode)) |
2275 | arg.ftype = NF4FIFO; | 2266 | data->arg.ftype = NF4FIFO; |
2276 | else if (S_ISBLK(mode)) { | 2267 | else if (S_ISBLK(mode)) { |
2277 | arg.ftype = NF4BLK; | 2268 | data->arg.ftype = NF4BLK; |
2278 | arg.u.device.specdata1 = MAJOR(rdev); | 2269 | data->arg.u.device.specdata1 = MAJOR(rdev); |
2279 | arg.u.device.specdata2 = MINOR(rdev); | 2270 | data->arg.u.device.specdata2 = MINOR(rdev); |
2280 | } | 2271 | } |
2281 | else if (S_ISCHR(mode)) { | 2272 | else if (S_ISCHR(mode)) { |
2282 | arg.ftype = NF4CHR; | 2273 | data->arg.ftype = NF4CHR; |
2283 | arg.u.device.specdata1 = MAJOR(rdev); | 2274 | data->arg.u.device.specdata1 = MAJOR(rdev); |
2284 | arg.u.device.specdata2 = MINOR(rdev); | 2275 | data->arg.u.device.specdata2 = MINOR(rdev); |
2285 | } | 2276 | } |
2286 | else | ||
2287 | arg.ftype = NF4SOCK; | ||
2288 | 2277 | ||
2289 | status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); | 2278 | status = nfs4_do_create(dir, dentry, data); |
2290 | if (status == 0) { | 2279 | |
2291 | update_changeattr(dir, &res.dir_cinfo); | 2280 | nfs4_free_createdata(data); |
2292 | nfs_post_op_update_inode(dir, res.dir_fattr); | 2281 | out: |
2293 | status = nfs_instantiate(dentry, &fh, &fattr); | ||
2294 | } | ||
2295 | return status; | 2282 | return status; |
2296 | } | 2283 | } |
2297 | 2284 | ||
@@ -2706,6 +2693,8 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen) | |||
2706 | ret = nfs_revalidate_inode(server, inode); | 2693 | ret = nfs_revalidate_inode(server, inode); |
2707 | if (ret < 0) | 2694 | if (ret < 0) |
2708 | return ret; | 2695 | return ret; |
2696 | if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL) | ||
2697 | nfs_zap_acl_cache(inode); | ||
2709 | ret = nfs4_read_cached_acl(inode, buf, buflen); | 2698 | ret = nfs4_read_cached_acl(inode, buf, buflen); |
2710 | if (ret != -ENOENT) | 2699 | if (ret != -ENOENT) |
2711 | return ret; | 2700 | return ret; |
@@ -2733,7 +2722,8 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl | |||
2733 | nfs_inode_return_delegation(inode); | 2722 | nfs_inode_return_delegation(inode); |
2734 | buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | 2723 | buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); |
2735 | ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); | 2724 | ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); |
2736 | nfs_zap_caches(inode); | 2725 | nfs_access_zap_cache(inode); |
2726 | nfs_zap_acl_cache(inode); | ||
2737 | return ret; | 2727 | return ret; |
2738 | } | 2728 | } |
2739 | 2729 | ||
@@ -2767,8 +2757,7 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server) | |||
2767 | task->tk_status = 0; | 2757 | task->tk_status = 0; |
2768 | return -EAGAIN; | 2758 | return -EAGAIN; |
2769 | case -NFS4ERR_DELAY: | 2759 | case -NFS4ERR_DELAY: |
2770 | nfs_inc_server_stats((struct nfs_server *) server, | 2760 | nfs_inc_server_stats(server, NFSIOS_DELAY); |
2771 | NFSIOS_DELAY); | ||
2772 | case -NFS4ERR_GRACE: | 2761 | case -NFS4ERR_GRACE: |
2773 | rpc_delay(task, NFS4_POLL_RETRY_MAX); | 2762 | rpc_delay(task, NFS4_POLL_RETRY_MAX); |
2774 | task->tk_status = 0; | 2763 | task->tk_status = 0; |
@@ -2933,7 +2922,7 @@ static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cre | |||
2933 | 2922 | ||
2934 | int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) | 2923 | int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) |
2935 | { | 2924 | { |
2936 | long timeout; | 2925 | long timeout = 0; |
2937 | int err; | 2926 | int err; |
2938 | do { | 2927 | do { |
2939 | err = _nfs4_proc_setclientid_confirm(clp, cred); | 2928 | err = _nfs4_proc_setclientid_confirm(clp, cred); |
@@ -3725,8 +3714,6 @@ const struct nfs_rpc_ops nfs_v4_clientops = { | |||
3725 | .write_done = nfs4_write_done, | 3714 | .write_done = nfs4_write_done, |
3726 | .commit_setup = nfs4_proc_commit_setup, | 3715 | .commit_setup = nfs4_proc_commit_setup, |
3727 | .commit_done = nfs4_commit_done, | 3716 | .commit_done = nfs4_commit_done, |
3728 | .file_open = nfs_open, | ||
3729 | .file_release = nfs_release, | ||
3730 | .lock = nfs4_proc_lock, | 3717 | .lock = nfs4_proc_lock, |
3731 | .clear_acl_cache = nfs4_zap_acl_attr, | 3718 | .clear_acl_cache = nfs4_zap_acl_attr, |
3732 | }; | 3719 | }; |