]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
ceph: validate correctness of some mount options
authorYan, Zheng <zyan@redhat.com>
Tue, 11 Jul 2017 10:49:44 +0000 (18:49 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 6 Sep 2017 17:56:42 +0000 (19:56 +0200)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/super.c
fs/ceph/super.h
include/linux/ceph/libceph.h

index caf9801712caa6ce91b7dcbf03ba4aa831def55c..1deb8810d7c7666db24352b46cb8de4b379be618 100644 (file)
@@ -243,21 +243,33 @@ static int parse_fsopt_token(char *c, void *private)
                fsopt->rsize = ALIGN(intval, PAGE_SIZE);
                break;
        case Opt_rasize:
-               fsopt->rasize = intval;
+               if (intval < 0)
+                       return -EINVAL;
+               fsopt->rasize = ALIGN(intval + PAGE_SIZE - 1, PAGE_SIZE);
                break;
        case Opt_caps_wanted_delay_min:
+               if (intval < 1)
+                       return -EINVAL;
                fsopt->caps_wanted_delay_min = intval;
                break;
        case Opt_caps_wanted_delay_max:
+               if (intval < 1)
+                       return -EINVAL;
                fsopt->caps_wanted_delay_max = intval;
                break;
        case Opt_readdir_max_entries:
+               if (intval < 1)
+                       return -EINVAL;
                fsopt->max_readdir = intval;
                break;
        case Opt_readdir_max_bytes:
+               if (intval < PAGE_SIZE && intval != 0)
+                       return -EINVAL;
                fsopt->max_readdir_bytes = intval;
                break;
        case Opt_congestion_kb:
+               if (intval < 1024) /* at least 1M */
+                       return -EINVAL;
                fsopt->congestion_kb = intval;
                break;
        case Opt_dirstat:
@@ -946,12 +958,7 @@ static int ceph_setup_bdi(struct super_block *sb, struct ceph_fs_client *fsc)
                return err;
 
        /* set ra_pages based on rasize mount option? */
-       if (fsc->mount_options->rasize >= PAGE_SIZE)
-               sb->s_bdi->ra_pages =
-                       (fsc->mount_options->rasize + PAGE_SIZE - 1)
-                       >> PAGE_SHIFT;
-       else
-               sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
+       sb->s_bdi->ra_pages = fsc->mount_options->rasize >> PAGE_SHIFT;
 
        /* set io_pages based on max osd read size */
        sb->s_bdi->io_pages = fsc->mount_options->rsize >> PAGE_SHIFT;
index eed2a67d8e52af75ebd97918af6f515035061dfd..279a2f401cf5f40929970e0eb37d7be0d43d7246 100644 (file)
 #define CEPH_MAX_READDIR_BYTES_DEFAULT  (512*1024)
 #define CEPH_SNAPDIRNAME_DEFAULT        ".snap"
 
+/*
+ * Delay telling the MDS we no longer want caps, in case we reopen
+ * the file.  Delay a minimum amount of time, even if we send a cap
+ * message for some other reason.  Otherwise, take the oppotunity to
+ * update the mds to avoid sending another message later.
+ */
+#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT      5  /* cap release delay */
+#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT     60  /* cap release delay */
+
 struct ceph_mount_options {
        int flags;
        int sb_flags;
index dca30ac9bd348a88f11d90dde60eca03bca253fc..4c846aabd9f646fed049130653934560fb2bba0b 100644 (file)
@@ -84,16 +84,6 @@ struct ceph_options {
 
 #define CEPH_AUTH_NAME_DEFAULT   "guest"
 
-/*
- * Delay telling the MDS we no longer want caps, in case we reopen
- * the file.  Delay a minimum amount of time, even if we send a cap
- * message for some other reason.  Otherwise, take the oppotunity to
- * update the mds to avoid sending another message later.
- */
-#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT      5  /* cap release delay */
-#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT     60  /* cap release delay */
-
-
 /* mount state */
 enum {
        CEPH_MOUNT_MOUNTING,