X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=ipc%2Fshm.c;h=7e199fa1960f86087c557bcc39b08d304c2b8f7b;hb=cc79dd1ba9c1021c2ac6ae200a65ec38ee8db351;hp=8247c49ec073c236d183ead9f51ab1f4b3779337;hpb=150a8dcf109f68f322bf112c7604f2d950303f00;p=~andy%2Flinux diff --git a/ipc/shm.c b/ipc/shm.c index 8247c49ec07..7e199fa1960 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -491,10 +491,20 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) sprintf (name, "SYSV%08x", key); if (shmflg & SHM_HUGETLB) { + struct hstate *hs = hstate_sizelog((shmflg >> SHM_HUGE_SHIFT) + & SHM_HUGE_MASK); + size_t hugesize; + + if (!hs) { + error = -EINVAL; + goto no_file; + } + hugesize = ALIGN(size, huge_page_size(hs)); + /* hugetlb_file_setup applies strict accounting */ if (shmflg & SHM_NORESERVE) acctflag = VM_NORESERVE; - file = hugetlb_file_setup(name, 0, size, acctflag, + file = hugetlb_file_setup(name, hugesize, acctflag, &shp->mlock_user, HUGETLB_SHMFS_INODE, (shmflg >> SHM_HUGE_SHIFT) & SHM_HUGE_MASK); } else {