ceph: limit osd write size
authorYan, Zheng <zyan@redhat.com>
Tue, 11 Jul 2017 09:34:46 +0000 (17:34 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 6 Sep 2017 17:56:41 +0000 (19:56 +0200)
OSD has a configurable limitation of max write size. OSD return
error if write request size is larger than the limitation. For now,
set max write size to CEPH_MSG_MAX_DATA_LEN. It should be small
enough.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/addr.c
fs/ceph/file.c
fs/ceph/super.c
fs/ceph/super.h

index 63ca1732570b16e58681a46df853defd9097e166..149b10063be806a2daa068317eba9ce05b435b89 100644 (file)
@@ -779,10 +779,8 @@ static int ceph_writepages_start(struct address_space *mapping,
                mapping_set_error(mapping, -EIO);
                return -EIO; /* we're in a forced umount, don't write! */
        }
-       if (fsc->mount_options->wsize && fsc->mount_options->wsize < wsize)
+       if (fsc->mount_options->wsize < wsize)
                wsize = fsc->mount_options->wsize;
-       if (wsize < PAGE_SIZE)
-               wsize = PAGE_SIZE;
        max_pages_ever = wsize >> PAGE_SHIFT;
 
        pagevec_init(&pvec, 0);
index 85f0dba394a2697b353352fb6d3dc4cb259e0e3d..a39ff54cb372f71dac7ab80f9bfc9dbda840941b 100644 (file)
@@ -887,7 +887,9 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
                        break;
                }
 
-               if (!write)
+               if (write)
+                       size = min_t(u64, size, fsc->mount_options->wsize);
+               else
                        size = min_t(u64, size, fsc->mount_options->rsize);
 
                len = size;
index 2b2a260acb244ed2d17e0c2a05abc849e47b50b7..caf9801712caa6ce91b7dcbf03ba4aa831def55c 100644 (file)
@@ -233,7 +233,9 @@ static int parse_fsopt_token(char *c, void *private)
                break;
                /* misc */
        case Opt_wsize:
-               fsopt->wsize = intval;
+               if (intval < PAGE_SIZE || intval > CEPH_MAX_WRITE_SIZE)
+                       return -EINVAL;
+               fsopt->wsize = ALIGN(intval, PAGE_SIZE);
                break;
        case Opt_rsize:
                if (intval < PAGE_SIZE || intval > CEPH_MAX_READ_SIZE)
@@ -392,6 +394,7 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
        fsopt->sb_flags = flags;
        fsopt->flags = CEPH_MOUNT_OPT_DEFAULT;
 
+       fsopt->wsize = CEPH_MAX_WRITE_SIZE;
        fsopt->rsize = CEPH_MAX_READ_SIZE;
        fsopt->rasize = CEPH_RASIZE_DEFAULT;
        fsopt->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL);
index 2b1b021ad6b8c086ed2f2f16ecd2e6ddbb26d5bb..eed2a67d8e52af75ebd97918af6f515035061dfd 100644 (file)
@@ -48,6 +48,9 @@
 
 /* max size of osd read request, limited by libceph */
 #define CEPH_MAX_READ_SIZE              CEPH_MSG_MAX_DATA_LEN
+/* osd has a configurable limitaion of max write size.
+ * CEPH_MSG_MAX_DATA_LEN should be small enough. */
+#define CEPH_MAX_WRITE_SIZE            CEPH_MSG_MAX_DATA_LEN
 #define CEPH_RASIZE_DEFAULT             (8192*1024)    /* max readahead */
 #define CEPH_MAX_READDIR_DEFAULT        1024
 #define CEPH_MAX_READDIR_BYTES_DEFAULT  (512*1024)