hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/nfs/nfs3proc.c
....@@ -110,10 +110,15 @@
110110 .rpc_resp = fattr,
111111 };
112112 int status;
113
+ unsigned short task_flags = 0;
114
+
115
+ /* Is this is an attribute revalidation, subject to softreval? */
116
+ if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
117
+ task_flags |= RPC_TASK_TIMEOUT;
113118
114119 dprintk("NFS call getattr\n");
115120 nfs_fattr_init(fattr);
116
- status = rpc_call_sync(server->client, &msg, 0);
121
+ status = rpc_call_sync(server->client, &msg, task_flags);
117122 dprintk("NFS reply getattr: %d\n", status);
118123 return status;
119124 }
....@@ -140,23 +145,23 @@
140145 nfs_fattr_init(fattr);
141146 status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
142147 if (status == 0) {
148
+ nfs_setattr_update_inode(inode, sattr, fattr);
143149 if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
144150 nfs_zap_acl_cache(inode);
145
- nfs_setattr_update_inode(inode, sattr, fattr);
146151 }
147152 dprintk("NFS reply setattr: %d\n", status);
148153 return status;
149154 }
150155
151156 static int
152
-nfs3_proc_lookup(struct inode *dir, const struct qstr *name,
157
+nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
153158 struct nfs_fh *fhandle, struct nfs_fattr *fattr,
154159 struct nfs4_label *label)
155160 {
156161 struct nfs3_diropargs arg = {
157162 .fh = NFS_FH(dir),
158
- .name = name->name,
159
- .len = name->len
163
+ .name = dentry->d_name.name,
164
+ .len = dentry->d_name.len
160165 };
161166 struct nfs3_diropres res = {
162167 .fh = fhandle,
....@@ -168,20 +173,25 @@
168173 .rpc_resp = &res,
169174 };
170175 int status;
176
+ unsigned short task_flags = 0;
171177
172
- dprintk("NFS call lookup %s\n", name->name);
178
+ /* Is this is an attribute revalidation, subject to softreval? */
179
+ if (nfs_lookup_is_soft_revalidate(dentry))
180
+ task_flags |= RPC_TASK_TIMEOUT;
181
+
173182 res.dir_attr = nfs_alloc_fattr();
174183 if (res.dir_attr == NULL)
175184 return -ENOMEM;
176185
186
+ dprintk("NFS call lookup %pd2\n", dentry);
177187 nfs_fattr_init(fattr);
178
- status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
188
+ status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
179189 nfs_refresh_inode(dir, res.dir_attr);
180190 if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) {
181191 msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
182192 msg.rpc_argp = fhandle;
183193 msg.rpc_resp = fattr;
184
- status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
194
+ status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
185195 }
186196 nfs_free_fattr(res.dir_attr);
187197 dprintk("NFS reply lookup: %d\n", status);
....@@ -279,15 +289,17 @@
279289 return data;
280290 }
281291
282
-static int nfs3_do_create(struct inode *dir, struct dentry *dentry, struct nfs3_createdata *data)
292
+static struct dentry *
293
+nfs3_do_create(struct inode *dir, struct dentry *dentry, struct nfs3_createdata *data)
283294 {
284295 int status;
285296
286297 status = rpc_call_sync(NFS_CLIENT(dir), &data->msg, 0);
287298 nfs_post_op_update_inode(dir, data->res.dir_attr);
288
- if (status == 0)
289
- status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
290
- return status;
299
+ if (status != 0)
300
+ return ERR_PTR(status);
301
+
302
+ return nfs_add_or_obtain(dentry, data->res.fh, data->res.fattr, NULL);
291303 }
292304
293305 static void nfs3_free_createdata(struct nfs3_createdata *data)
....@@ -304,6 +316,7 @@
304316 {
305317 struct posix_acl *default_acl, *acl;
306318 struct nfs3_createdata *data;
319
+ struct dentry *d_alias;
307320 int status = -ENOMEM;
308321
309322 dprintk("NFS call create %pd\n", dentry);
....@@ -330,7 +343,8 @@
330343 goto out;
331344
332345 for (;;) {
333
- status = nfs3_do_create(dir, dentry, data);
346
+ d_alias = nfs3_do_create(dir, dentry, data);
347
+ status = PTR_ERR_OR_ZERO(d_alias);
334348
335349 if (status != -ENOTSUPP)
336350 break;
....@@ -355,6 +369,9 @@
355369 if (status != 0)
356370 goto out_release_acls;
357371
372
+ if (d_alias)
373
+ dentry = d_alias;
374
+
358375 /* When we created the file with exclusive semantics, make
359376 * sure we set the attributes afterwards. */
360377 if (data->arg.create.createmode == NFS3_CREATE_EXCLUSIVE) {
....@@ -372,11 +389,13 @@
372389 nfs_post_op_update_inode(d_inode(dentry), data->res.fattr);
373390 dprintk("NFS reply setattr (post-create): %d\n", status);
374391 if (status != 0)
375
- goto out_release_acls;
392
+ goto out_dput;
376393 }
377394
378395 status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
379396
397
+out_dput:
398
+ dput(d_alias);
380399 out_release_acls:
381400 posix_acl_release(acl);
382401 posix_acl_release(default_acl);
....@@ -504,6 +523,7 @@
504523 unsigned int len, struct iattr *sattr)
505524 {
506525 struct nfs3_createdata *data;
526
+ struct dentry *d_alias;
507527 int status = -ENOMEM;
508528
509529 if (len > NFS3_MAXPATHLEN)
....@@ -522,7 +542,11 @@
522542 data->arg.symlink.pathlen = len;
523543 data->arg.symlink.sattr = sattr;
524544
525
- status = nfs3_do_create(dir, dentry, data);
545
+ d_alias = nfs3_do_create(dir, dentry, data);
546
+ status = PTR_ERR_OR_ZERO(d_alias);
547
+
548
+ if (status == 0)
549
+ dput(d_alias);
526550
527551 nfs3_free_createdata(data);
528552 out:
....@@ -535,6 +559,7 @@
535559 {
536560 struct posix_acl *default_acl, *acl;
537561 struct nfs3_createdata *data;
562
+ struct dentry *d_alias;
538563 int status = -ENOMEM;
539564
540565 dprintk("NFS call mkdir %pd\n", dentry);
....@@ -553,12 +578,18 @@
553578 data->arg.mkdir.len = dentry->d_name.len;
554579 data->arg.mkdir.sattr = sattr;
555580
556
- status = nfs3_do_create(dir, dentry, data);
581
+ d_alias = nfs3_do_create(dir, dentry, data);
582
+ status = PTR_ERR_OR_ZERO(d_alias);
583
+
557584 if (status != 0)
558585 goto out_release_acls;
559586
587
+ if (d_alias)
588
+ dentry = d_alias;
589
+
560590 status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
561591
592
+ dput(d_alias);
562593 out_release_acls:
563594 posix_acl_release(acl);
564595 posix_acl_release(default_acl);
....@@ -607,7 +638,7 @@
607638 * readdirplus.
608639 */
609640 static int
610
-nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
641
+nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred,
611642 u64 cookie, struct page **pages, unsigned int count, bool plus)
612643 {
613644 struct inode *dir = d_inode(dentry);
....@@ -628,7 +659,7 @@
628659 .rpc_proc = &nfs3_procedures[NFS3PROC_READDIR],
629660 .rpc_argp = &arg,
630661 .rpc_resp = &res,
631
- .rpc_cred = cred
662
+ .rpc_cred = cred,
632663 };
633664 int status = -ENOMEM;
634665
....@@ -660,6 +691,7 @@
660691 {
661692 struct posix_acl *default_acl, *acl;
662693 struct nfs3_createdata *data;
694
+ struct dentry *d_alias;
663695 int status = -ENOMEM;
664696
665697 dprintk("NFS call mknod %pd %u:%u\n", dentry,
....@@ -698,12 +730,17 @@
698730 goto out_release_acls;
699731 }
700732
701
- status = nfs3_do_create(dir, dentry, data);
733
+ d_alias = nfs3_do_create(dir, dentry, data);
734
+ status = PTR_ERR_OR_ZERO(d_alias);
702735 if (status != 0)
703736 goto out_release_acls;
704737
738
+ if (d_alias)
739
+ dentry = d_alias;
740
+
705741 status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
706742
743
+ dput(d_alias);
707744 out_release_acls:
708745 posix_acl_release(acl);
709746 posix_acl_release(default_acl);
....@@ -786,12 +823,16 @@
786823 static int nfs3_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
787824 {
788825 struct inode *inode = hdr->inode;
826
+ struct nfs_server *server = NFS_SERVER(inode);
789827
790828 if (hdr->pgio_done_cb != NULL)
791829 return hdr->pgio_done_cb(task, hdr);
792830
793831 if (nfs3_async_handle_jukebox(task, inode))
794832 return -EAGAIN;
833
+
834
+ if (task->tk_status >= 0 && !server->read_hdrsize)
835
+ cmpxchg(&server->read_hdrsize, 0, hdr->res.replen);
795836
796837 nfs_invalidate_atime(inode);
797838 nfs_refresh_inode(inode, &hdr->fattr);
....@@ -802,6 +843,7 @@
802843 struct rpc_message *msg)
803844 {
804845 msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ];
846
+ hdr->args.replen = NFS_SERVER(hdr->inode)->read_hdrsize;
805847 }
806848
807849 static int nfs3_proc_pgio_rpc_prepare(struct rpc_task *task,
....@@ -958,7 +1000,7 @@
9581000 .nlmclnt_ops = &nlmclnt_fl_close_lock_ops,
9591001 .getroot = nfs3_proc_get_root,
9601002 .submount = nfs_submount,
961
- .try_mount = nfs_try_mount,
1003
+ .try_get_tree = nfs_try_get_tree,
9621004 .getattr = nfs3_proc_getattr,
9631005 .setattr = nfs3_proc_setattr,
9641006 .lookup = nfs3_proc_lookup,