write.c (c9d8f89d9816c1d16ada492aa547a4d692508c0d) write.c (dbae4c73f08b8a7980cc912954ade3d4c1fb6147)
1/*
2 * linux/fs/nfs/write.c
3 *
4 * Write file data over NFS.
5 *
6 * Copyright (C) 1996, 1997, Olaf Kirch <okir@monad.swb.de>
7 */
8

--- 764 unchanged lines hidden (view full) ---

773 return RPC_PRIORITY_LOW;
774 }
775 return RPC_PRIORITY_NORMAL;
776}
777
778/*
779 * Set up the argument/result storage required for the RPC call.
780 */
1/*
2 * linux/fs/nfs/write.c
3 *
4 * Write file data over NFS.
5 *
6 * Copyright (C) 1996, 1997, Olaf Kirch <okir@monad.swb.de>
7 */
8

--- 764 unchanged lines hidden (view full) ---

773 return RPC_PRIORITY_LOW;
774 }
775 return RPC_PRIORITY_NORMAL;
776}
777
778/*
779 * Set up the argument/result storage required for the RPC call.
780 */
781static void nfs_write_rpcsetup(struct nfs_page *req,
781static int nfs_write_rpcsetup(struct nfs_page *req,
782 struct nfs_write_data *data,
783 const struct rpc_call_ops *call_ops,
784 unsigned int count, unsigned int offset,
785 int how)
786{
787 struct inode *inode = req->wb_context->path.dentry->d_inode;
788 int flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
789 int priority = flush_task_priority(how);

--- 46 unchanged lines hidden (view full) ---

836 "(req %s/%Ld, %u bytes @ offset %Lu)\n",
837 data->task.tk_pid,
838 inode->i_sb->s_id,
839 (long long)NFS_FILEID(inode),
840 count,
841 (unsigned long long)data->args.offset);
842
843 task = rpc_run_task(&task_setup_data);
782 struct nfs_write_data *data,
783 const struct rpc_call_ops *call_ops,
784 unsigned int count, unsigned int offset,
785 int how)
786{
787 struct inode *inode = req->wb_context->path.dentry->d_inode;
788 int flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
789 int priority = flush_task_priority(how);

--- 46 unchanged lines hidden (view full) ---

836 "(req %s/%Ld, %u bytes @ offset %Lu)\n",
837 data->task.tk_pid,
838 inode->i_sb->s_id,
839 (long long)NFS_FILEID(inode),
840 count,
841 (unsigned long long)data->args.offset);
842
843 task = rpc_run_task(&task_setup_data);
844 if (!IS_ERR(task))
845 rpc_put_task(task);
844 if (IS_ERR(task))
845 return PTR_ERR(task);
846 rpc_put_task(task);
847 return 0;
846}
847
848/* If a nfs_flush_* function fails, it should remove reqs from @head and
849 * call this on each, which will prepare them to be retried on next
850 * writeback using standard nfs.
851 */
852static void nfs_redirty_request(struct nfs_page *req)
853{

--- 9 unchanged lines hidden (view full) ---

863static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int how)
864{
865 struct nfs_page *req = nfs_list_entry(head->next);
866 struct page *page = req->wb_page;
867 struct nfs_write_data *data;
868 size_t wsize = NFS_SERVER(inode)->wsize, nbytes;
869 unsigned int offset;
870 int requests = 0;
848}
849
850/* If a nfs_flush_* function fails, it should remove reqs from @head and
851 * call this on each, which will prepare them to be retried on next
852 * writeback using standard nfs.
853 */
854static void nfs_redirty_request(struct nfs_page *req)
855{

--- 9 unchanged lines hidden (view full) ---

865static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int how)
866{
867 struct nfs_page *req = nfs_list_entry(head->next);
868 struct page *page = req->wb_page;
869 struct nfs_write_data *data;
870 size_t wsize = NFS_SERVER(inode)->wsize, nbytes;
871 unsigned int offset;
872 int requests = 0;
873 int ret = 0;
871 LIST_HEAD(list);
872
873 nfs_list_remove_request(req);
874
875 nbytes = count;
876 do {
877 size_t len = min(nbytes, wsize);
878

--- 5 unchanged lines hidden (view full) ---

884 nbytes -= len;
885 } while (nbytes != 0);
886 atomic_set(&req->wb_complete, requests);
887
888 ClearPageError(page);
889 offset = 0;
890 nbytes = count;
891 do {
874 LIST_HEAD(list);
875
876 nfs_list_remove_request(req);
877
878 nbytes = count;
879 do {
880 size_t len = min(nbytes, wsize);
881

--- 5 unchanged lines hidden (view full) ---

887 nbytes -= len;
888 } while (nbytes != 0);
889 atomic_set(&req->wb_complete, requests);
890
891 ClearPageError(page);
892 offset = 0;
893 nbytes = count;
894 do {
895 int ret2;
896
892 data = list_entry(list.next, struct nfs_write_data, pages);
893 list_del_init(&data->pages);
894
895 data->pagevec[0] = page;
896
897 if (nbytes < wsize)
898 wsize = nbytes;
897 data = list_entry(list.next, struct nfs_write_data, pages);
898 list_del_init(&data->pages);
899
900 data->pagevec[0] = page;
901
902 if (nbytes < wsize)
903 wsize = nbytes;
899 nfs_write_rpcsetup(req, data, &nfs_write_partial_ops,
904 ret2 = nfs_write_rpcsetup(req, data, &nfs_write_partial_ops,
900 wsize, offset, how);
905 wsize, offset, how);
906 if (ret == 0)
907 ret = ret2;
901 offset += wsize;
902 nbytes -= wsize;
903 } while (nbytes != 0);
904
908 offset += wsize;
909 nbytes -= wsize;
910 } while (nbytes != 0);
911
905 return 0;
912 return ret;
906
907out_bad:
908 while (!list_empty(&list)) {
909 data = list_entry(list.next, struct nfs_write_data, pages);
910 list_del(&data->pages);
911 nfs_writedata_release(data);
912 }
913 nfs_redirty_request(req);

--- 24 unchanged lines hidden (view full) ---

938 nfs_list_remove_request(req);
939 nfs_list_add_request(req, &data->pages);
940 ClearPageError(req->wb_page);
941 *pages++ = req->wb_page;
942 }
943 req = nfs_list_entry(data->pages.next);
944
945 /* Set up the argument struct */
913
914out_bad:
915 while (!list_empty(&list)) {
916 data = list_entry(list.next, struct nfs_write_data, pages);
917 list_del(&data->pages);
918 nfs_writedata_release(data);
919 }
920 nfs_redirty_request(req);

--- 24 unchanged lines hidden (view full) ---

945 nfs_list_remove_request(req);
946 nfs_list_add_request(req, &data->pages);
947 ClearPageError(req->wb_page);
948 *pages++ = req->wb_page;
949 }
950 req = nfs_list_entry(data->pages.next);
951
952 /* Set up the argument struct */
946 nfs_write_rpcsetup(req, data, &nfs_write_full_ops, count, 0, how);
947
948 return 0;
953 return nfs_write_rpcsetup(req, data, &nfs_write_full_ops, count, 0, how);
949 out_bad:
950 while (!list_empty(head)) {
951 req = nfs_list_entry(head->next);
952 nfs_list_remove_request(req);
953 nfs_redirty_request(req);
954 }
955 return -ENOMEM;
956}

--- 221 unchanged lines hidden (view full) ---

1178
1179 put_nfs_open_context(wdata->args.context);
1180 nfs_commit_free(wdata);
1181}
1182
1183/*
1184 * Set up the argument/result storage required for the RPC call.
1185 */
954 out_bad:
955 while (!list_empty(head)) {
956 req = nfs_list_entry(head->next);
957 nfs_list_remove_request(req);
958 nfs_redirty_request(req);
959 }
960 return -ENOMEM;
961}

--- 221 unchanged lines hidden (view full) ---

1183
1184 put_nfs_open_context(wdata->args.context);
1185 nfs_commit_free(wdata);
1186}
1187
1188/*
1189 * Set up the argument/result storage required for the RPC call.
1190 */
1186static void nfs_commit_rpcsetup(struct list_head *head,
1191static int nfs_commit_rpcsetup(struct list_head *head,
1187 struct nfs_write_data *data,
1188 int how)
1189{
1190 struct nfs_page *first = nfs_list_entry(head->next);
1191 struct inode *inode = first->wb_context->path.dentry->d_inode;
1192 int flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
1193 int priority = flush_task_priority(how);
1194 struct rpc_task *task;

--- 32 unchanged lines hidden (view full) ---

1227 nfs_fattr_init(&data->fattr);
1228
1229 /* Set up the initial task struct. */
1230 NFS_PROTO(inode)->commit_setup(data, &msg);
1231
1232 dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid);
1233
1234 task = rpc_run_task(&task_setup_data);
1192 struct nfs_write_data *data,
1193 int how)
1194{
1195 struct nfs_page *first = nfs_list_entry(head->next);
1196 struct inode *inode = first->wb_context->path.dentry->d_inode;
1197 int flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
1198 int priority = flush_task_priority(how);
1199 struct rpc_task *task;

--- 32 unchanged lines hidden (view full) ---

1232 nfs_fattr_init(&data->fattr);
1233
1234 /* Set up the initial task struct. */
1235 NFS_PROTO(inode)->commit_setup(data, &msg);
1236
1237 dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid);
1238
1239 task = rpc_run_task(&task_setup_data);
1235 if (!IS_ERR(task))
1236 rpc_put_task(task);
1240 if (IS_ERR(task))
1241 return PTR_ERR(task);
1242 rpc_put_task(task);
1243 return 0;
1237}
1238
1239/*
1240 * Commit dirty pages
1241 */
1242static int
1243nfs_commit_list(struct inode *inode, struct list_head *head, int how)
1244{
1245 struct nfs_write_data *data;
1246 struct nfs_page *req;
1247
1248 data = nfs_commitdata_alloc();
1249
1250 if (!data)
1251 goto out_bad;
1252
1253 /* Set up the argument struct */
1244}
1245
1246/*
1247 * Commit dirty pages
1248 */
1249static int
1250nfs_commit_list(struct inode *inode, struct list_head *head, int how)
1251{
1252 struct nfs_write_data *data;
1253 struct nfs_page *req;
1254
1255 data = nfs_commitdata_alloc();
1256
1257 if (!data)
1258 goto out_bad;
1259
1260 /* Set up the argument struct */
1254 nfs_commit_rpcsetup(head, data, how);
1255
1256 return 0;
1261 return nfs_commit_rpcsetup(head, data, how);
1257 out_bad:
1258 while (!list_empty(head)) {
1259 req = nfs_list_entry(head->next);
1260 nfs_list_remove_request(req);
1261 nfs_mark_request_commit(req);
1262 dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
1263 dec_bdi_stat(req->wb_page->mapping->backing_dev_info,
1264 BDI_RECLAIMABLE);

--- 324 unchanged lines hidden ---
1262 out_bad:
1263 while (!list_empty(head)) {
1264 req = nfs_list_entry(head->next);
1265 nfs_list_remove_request(req);
1266 nfs_mark_request_commit(req);
1267 dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
1268 dec_bdi_stat(req->wb_page->mapping->backing_dev_info,
1269 BDI_RECLAIMABLE);

--- 324 unchanged lines hidden ---