aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/s390/CommonIO2
-rw-r--r--Documentation/s390/cds.txt52
-rw-r--r--Documentation/s390/driver-model.txt3
-rw-r--r--arch/s390/defconfig12
-rw-r--r--arch/s390/kernel/compat_linux.c2
-rw-r--r--arch/s390/kernel/syscalls.S1
-rw-r--r--drivers/s390/block/dasd.c1
-rw-r--r--drivers/s390/char/monwriter.c14
-rw-r--r--drivers/s390/cio/device_fsm.c4
-rw-r--r--drivers/s390/cio/qdio.c2
-rw-r--r--include/asm-s390/pgtable.h50
-rw-r--r--include/asm-s390/unistd.h3
12 files changed, 94 insertions, 52 deletions
diff --git a/Documentation/s390/CommonIO b/Documentation/s390/CommonIO
index 59d1166d41ee..d684a6ac69a8 100644
--- a/Documentation/s390/CommonIO
+++ b/Documentation/s390/CommonIO
@@ -66,7 +66,7 @@ Command line parameters
66 66
67 When a device is un-ignored, device recognition and sensing is performed and 67 When a device is un-ignored, device recognition and sensing is performed and
68 the device driver will be notified if possible, so the device will become 68 the device driver will be notified if possible, so the device will become
69 available to the system. 69 available to the system. Note that un-ignoring is performed asynchronously.
70 70
71 You can also add ranges of devices to be ignored by piping to 71 You can also add ranges of devices to be ignored by piping to
72 /proc/cio_ignore; "add <device range>, <device range>, ..." will ignore the 72 /proc/cio_ignore; "add <device range>, <device range>, ..." will ignore the
diff --git a/Documentation/s390/cds.txt b/Documentation/s390/cds.txt
index d80e5733827d..32a96cc39215 100644
--- a/Documentation/s390/cds.txt
+++ b/Documentation/s390/cds.txt
@@ -174,14 +174,10 @@ read_dev_chars() - Read Device Characteristics
174 174
175This routine returns the characteristics for the device specified. 175This routine returns the characteristics for the device specified.
176 176
177The function is meant to be called with an irq handler in place; that is, 177The function is meant to be called with the device already enabled; that is,
178at earliest during set_online() processing. 178at earliest during set_online() processing.
179 179
180While the request is processed synchronously, the device interrupt 180The ccw_device must not be locked prior to calling read_dev_chars().
181handler is called for final ending status. In case of error situations the
182interrupt handler may recover appropriately. The device irq handler can
183recognize the corresponding interrupts by the interruption parameter be
1840x00524443. The ccw_device must not be locked prior to calling read_dev_chars().
185 181
186The function may be called enabled or disabled. 182The function may be called enabled or disabled.
187 183
@@ -410,26 +406,7 @@ individual flag meanings.
410 406
411Usage Notes : 407Usage Notes :
412 408
413Prior to call ccw_device_start() the device driver must assure disabled state, 409ccw_device_start() must be called disabled and with the ccw device lock held.
414i.e. the I/O mask value in the PSW must be disabled. This can be accomplished
415by calling local_save_flags( flags). The current PSW flags are preserved and
416can be restored by local_irq_restore( flags) at a later time.
417
418If the device driver violates this rule while running in a uni-processor
419environment an interrupt might be presented prior to the ccw_device_start()
420routine returning to the device driver main path. In this case we will end in a
421deadlock situation as the interrupt handler will try to obtain the irq
422lock the device driver still owns (see below) !
423
424The driver must assure to hold the device specific lock. This can be
425accomplished by
426
427(i) spin_lock(get_ccwdev_lock(cdev)), or
428(ii) spin_lock_irqsave(get_ccwdev_lock(cdev), flags)
429
430Option (i) should be used if the calling routine is running disabled for
431I/O interrupts (see above) already. Option (ii) obtains the device gate und
432puts the CPU into I/O disabled state by preserving the current PSW flags.
433 410
434The device driver is allowed to issue the next ccw_device_start() call from 411The device driver is allowed to issue the next ccw_device_start() call from
435within its interrupt handler already. It is not required to schedule a 412within its interrupt handler already. It is not required to schedule a
@@ -488,7 +465,7 @@ int ccw_device_resume(struct ccw_device *cdev);
488 465
489cdev - ccw_device the resume operation is requested for 466cdev - ccw_device the resume operation is requested for
490 467
491The resume_IO() function returns: 468The ccw_device_resume() function returns:
492 469
493 0 - suspended channel program is resumed 470 0 - suspended channel program is resumed
494-EBUSY - status pending 471-EBUSY - status pending
@@ -507,6 +484,8 @@ a long-running channel program or the device might require to initially issue
507a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt() 484a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt()
508command is provided. 485command is provided.
509 486
487ccw_device_halt() must be called disabled and with the ccw device lock held.
488
510int ccw_device_halt(struct ccw_device *cdev, 489int ccw_device_halt(struct ccw_device *cdev,
511 unsigned long intparm); 490 unsigned long intparm);
512 491
@@ -517,7 +496,7 @@ intparm : interruption parameter; value is only used if no I/O
517 496
518The ccw_device_halt() function returns : 497The ccw_device_halt() function returns :
519 498
520 0 - successful completion or request successfully initiated 499 0 - request successfully initiated
521-EBUSY - the device is currently busy, or status pending. 500-EBUSY - the device is currently busy, or status pending.
522-ENODEV - cdev invalid. 501-ENODEV - cdev invalid.
523-EINVAL - The device is not operational or the ccw device is not online. 502-EINVAL - The device is not operational or the ccw device is not online.
@@ -533,6 +512,23 @@ can then perform an appropriate action. Prior to interrupt of an outstanding
533read to a network device (with or without PCI flag) a ccw_device_halt() 512read to a network device (with or without PCI flag) a ccw_device_halt()
534is required to end the pending operation. 513is required to end the pending operation.
535 514
515ccw_device_clear() - Terminage I/O Request Processing
516
517In order to terminate all I/O processing at the subchannel, the clear subchannel
518(CSCH) command is used. It can be issued via ccw_device_clear().
519
520ccw_device_clear() must be called disabled and with the ccw device lock held.
521
522int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm);
523
524cdev: ccw_device the clear operation is requested for
525intparm: interruption parameter (see ccw_device_halt())
526
527The ccw_device_clear() function returns:
528
529 0 - request successfully initiated
530-ENODEV - cdev invalid
531-EINVAL - The device is not operational or the ccw device is not online.
536 532
537Miscellaneous Support Routines 533Miscellaneous Support Routines
538 534
diff --git a/Documentation/s390/driver-model.txt b/Documentation/s390/driver-model.txt
index 62c082387aea..77bf450ec39b 100644
--- a/Documentation/s390/driver-model.txt
+++ b/Documentation/s390/driver-model.txt
@@ -239,6 +239,9 @@ status - Can be 'online' or 'offline'.
239 239
240type - The physical type of the channel path. 240type - The physical type of the channel path.
241 241
242shared - Whether the channel path is shared.
243
244cmg - The channel measurement group.
242 245
2433. System devices 2463. System devices
244----------------- 247-----------------
diff --git a/arch/s390/defconfig b/arch/s390/defconfig
index a3257398ea8d..c313e9a9304f 100644
--- a/arch/s390/defconfig
+++ b/arch/s390/defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.18 3# Linux kernel version: 2.6.19-rc2
4# Wed Oct 4 19:45:46 2006 4# Wed Oct 18 17:11:10 2006
5# 5#
6CONFIG_MMU=y 6CONFIG_MMU=y
7CONFIG_LOCKDEP_SUPPORT=y 7CONFIG_LOCKDEP_SUPPORT=y
@@ -211,6 +211,7 @@ CONFIG_INET6_XFRM_MODE_TRANSPORT=y
211CONFIG_INET6_XFRM_MODE_TUNNEL=y 211CONFIG_INET6_XFRM_MODE_TUNNEL=y
212CONFIG_INET6_XFRM_MODE_BEET=y 212CONFIG_INET6_XFRM_MODE_BEET=y
213# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set 213# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
214CONFIG_IPV6_SIT=y
214# CONFIG_IPV6_TUNNEL is not set 215# CONFIG_IPV6_TUNNEL is not set
215# CONFIG_IPV6_SUBTREES is not set 216# CONFIG_IPV6_SUBTREES is not set
216# CONFIG_IPV6_MULTIPLE_TABLES is not set 217# CONFIG_IPV6_MULTIPLE_TABLES is not set
@@ -528,6 +529,7 @@ CONFIG_EXT3_FS=y
528CONFIG_EXT3_FS_XATTR=y 529CONFIG_EXT3_FS_XATTR=y
529# CONFIG_EXT3_FS_POSIX_ACL is not set 530# CONFIG_EXT3_FS_POSIX_ACL is not set
530# CONFIG_EXT3_FS_SECURITY is not set 531# CONFIG_EXT3_FS_SECURITY is not set
532# CONFIG_EXT4DEV_FS is not set
531CONFIG_JBD=y 533CONFIG_JBD=y
532# CONFIG_JBD_DEBUG is not set 534# CONFIG_JBD_DEBUG is not set
533CONFIG_FS_MBCACHE=y 535CONFIG_FS_MBCACHE=y
@@ -646,10 +648,6 @@ CONFIG_MSDOS_PARTITION=y
646# CONFIG_NLS is not set 648# CONFIG_NLS is not set
647 649
648# 650#
649# Distributed Lock Manager
650#
651
652#
653# Instrumentation Support 651# Instrumentation Support
654# 652#
655 653
@@ -669,7 +667,6 @@ CONFIG_MAGIC_SYSRQ=y
669# CONFIG_UNUSED_SYMBOLS is not set 667# CONFIG_UNUSED_SYMBOLS is not set
670CONFIG_DEBUG_KERNEL=y 668CONFIG_DEBUG_KERNEL=y
671CONFIG_LOG_BUF_SHIFT=17 669CONFIG_LOG_BUF_SHIFT=17
672# CONFIG_DETECT_SOFTLOCKUP is not set
673# CONFIG_SCHEDSTATS is not set 670# CONFIG_SCHEDSTATS is not set
674# CONFIG_DEBUG_SLAB is not set 671# CONFIG_DEBUG_SLAB is not set
675CONFIG_DEBUG_PREEMPT=y 672CONFIG_DEBUG_PREEMPT=y
@@ -690,6 +687,7 @@ CONFIG_DEBUG_FS=y
690# CONFIG_FRAME_POINTER is not set 687# CONFIG_FRAME_POINTER is not set
691# CONFIG_UNWIND_INFO is not set 688# CONFIG_UNWIND_INFO is not set
692CONFIG_FORCED_INLINING=y 689CONFIG_FORCED_INLINING=y
690CONFIG_HEADERS_CHECK=y
693# CONFIG_RCU_TORTURE_TEST is not set 691# CONFIG_RCU_TORTURE_TEST is not set
694# CONFIG_LKDTM is not set 692# CONFIG_LKDTM is not set
695 693
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
index e15e1489aef5..2001767e1dc7 100644
--- a/arch/s390/kernel/compat_linux.c
+++ b/arch/s390/kernel/compat_linux.c
@@ -295,6 +295,7 @@ static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i)
295 * 295 *
296 * This is really horribly ugly. 296 * This is really horribly ugly.
297 */ 297 */
298#ifdef CONFIG_SYSVIPC
298asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) 299asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
299{ 300{
300 if (call >> 16) /* hack for backward compatibility */ 301 if (call >> 16) /* hack for backward compatibility */
@@ -338,6 +339,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
338 339
339 return -ENOSYS; 340 return -ENOSYS;
340} 341}
342#endif
341 343
342asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low) 344asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)
343{ 345{
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
index e59baec56520..a4ceae3dbcf1 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -320,3 +320,4 @@ SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
320SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) 320SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
321NI_SYSCALL /* 310 sys_move_pages */ 321NI_SYSCALL /* 310 sys_move_pages */
322SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) 322SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
323SYSCALL(sys_epoll_pwait,sys_epoll_pwait,sys_ni_syscall)
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index d0647d116eaa..79ffef6bfaf8 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -203,6 +203,7 @@ dasd_state_basic_to_known(struct dasd_device * device)
203 rc = dasd_flush_ccw_queue(device, 1); 203 rc = dasd_flush_ccw_queue(device, 1);
204 if (rc) 204 if (rc)
205 return rc; 205 return rc;
206 dasd_clear_timer(device);
206 207
207 DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device); 208 DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device);
208 if (device->debug_area != NULL) { 209 if (device->debug_area != NULL) {
diff --git a/drivers/s390/char/monwriter.c b/drivers/s390/char/monwriter.c
index abd02ed501cb..b9b0fc3f812b 100644
--- a/drivers/s390/char/monwriter.c
+++ b/drivers/s390/char/monwriter.c
@@ -73,12 +73,15 @@ static inline struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv,
73 struct mon_buf *entry, *next; 73 struct mon_buf *entry, *next;
74 74
75 list_for_each_entry_safe(entry, next, &monpriv->list, list) 75 list_for_each_entry_safe(entry, next, &monpriv->list, list)
76 if (entry->hdr.applid == monhdr->applid && 76 if ((entry->hdr.mon_function == monhdr->mon_function ||
77 monhdr->mon_function == MONWRITE_STOP_INTERVAL) &&
78 entry->hdr.applid == monhdr->applid &&
77 entry->hdr.record_num == monhdr->record_num && 79 entry->hdr.record_num == monhdr->record_num &&
78 entry->hdr.version == monhdr->version && 80 entry->hdr.version == monhdr->version &&
79 entry->hdr.release == monhdr->release && 81 entry->hdr.release == monhdr->release &&
80 entry->hdr.mod_level == monhdr->mod_level) 82 entry->hdr.mod_level == monhdr->mod_level)
81 return entry; 83 return entry;
84
82 return NULL; 85 return NULL;
83} 86}
84 87
@@ -92,7 +95,9 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
92 monhdr->mon_function > MONWRITE_START_CONFIG || 95 monhdr->mon_function > MONWRITE_START_CONFIG ||
93 monhdr->hdrlen != sizeof(struct monwrite_hdr)) 96 monhdr->hdrlen != sizeof(struct monwrite_hdr))
94 return -EINVAL; 97 return -EINVAL;
95 monbuf = monwrite_find_hdr(monpriv, monhdr); 98 monbuf = NULL;
99 if (monhdr->mon_function != MONWRITE_GEN_EVENT)
100 monbuf = monwrite_find_hdr(monpriv, monhdr);
96 if (monbuf) { 101 if (monbuf) {
97 if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) { 102 if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) {
98 monhdr->datalen = monbuf->hdr.datalen; 103 monhdr->datalen = monbuf->hdr.datalen;
@@ -104,7 +109,7 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
104 kfree(monbuf); 109 kfree(monbuf);
105 monbuf = NULL; 110 monbuf = NULL;
106 } 111 }
107 } else { 112 } else if (monhdr->mon_function != MONWRITE_STOP_INTERVAL) {
108 if (mon_buf_count >= mon_max_bufs) 113 if (mon_buf_count >= mon_max_bufs)
109 return -ENOSPC; 114 return -ENOSPC;
110 monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL); 115 monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL);
@@ -118,7 +123,8 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
118 } 123 }
119 monbuf->hdr = *monhdr; 124 monbuf->hdr = *monhdr;
120 list_add_tail(&monbuf->list, &monpriv->list); 125 list_add_tail(&monbuf->list, &monpriv->list);
121 mon_buf_count++; 126 if (monhdr->mon_function != MONWRITE_GEN_EVENT)
127 mon_buf_count++;
122 } 128 }
123 monpriv->current_buf = monbuf; 129 monpriv->current_buf = monbuf;
124 return 0; 130 return 0;
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index fcaf28d7b4eb..de3d0857db9f 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -578,9 +578,13 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
578 } 578 }
579 break; 579 break;
580 case -ETIME: 580 case -ETIME:
581 /* Reset oper notify indication after verify error. */
582 cdev->private->flags.donotify = 0;
581 ccw_device_done(cdev, DEV_STATE_BOXED); 583 ccw_device_done(cdev, DEV_STATE_BOXED);
582 break; 584 break;
583 default: 585 default:
586 /* Reset oper notify indication after verify error. */
587 cdev->private->flags.donotify = 0;
584 PREPARE_WORK(&cdev->private->kick_work, 588 PREPARE_WORK(&cdev->private->kick_work,
585 ccw_device_nopath_notify, cdev); 589 ccw_device_nopath_notify, cdev);
586 queue_work(ccw_device_notify_work, &cdev->private->kick_work); 590 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c
index 0648ce5bb684..476aa1da5cbc 100644
--- a/drivers/s390/cio/qdio.c
+++ b/drivers/s390/cio/qdio.c
@@ -3529,7 +3529,7 @@ do_QDIO(struct ccw_device *cdev,unsigned int callflags,
3529#ifdef CONFIG_QDIO_DEBUG 3529#ifdef CONFIG_QDIO_DEBUG
3530 char dbf_text[20]; 3530 char dbf_text[20];
3531 3531
3532 sprintf(dbf_text,"doQD%04x",cdev->private->sch_no); 3532 sprintf(dbf_text,"doQD%04x",cdev->private->schid.sch_no);
3533 QDIO_DBF_TEXT3(0,trace,dbf_text); 3533 QDIO_DBF_TEXT3(0,trace,dbf_text);
3534#endif /* CONFIG_QDIO_DEBUG */ 3534#endif /* CONFIG_QDIO_DEBUG */
3535 3535
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h
index 519f0a5ff181..36bb6dacf008 100644
--- a/include/asm-s390/pgtable.h
+++ b/include/asm-s390/pgtable.h
@@ -200,18 +200,45 @@ extern char empty_zero_page[PAGE_SIZE];
200 */ 200 */
201 201
202/* Hardware bits in the page table entry */ 202/* Hardware bits in the page table entry */
203#define _PAGE_RO 0x200 /* HW read-only */ 203#define _PAGE_RO 0x200 /* HW read-only bit */
204#define _PAGE_INVALID 0x400 /* HW invalid */ 204#define _PAGE_INVALID 0x400 /* HW invalid bit */
205#define _PAGE_SWT 0x001 /* SW pte type bit t */
206#define _PAGE_SWX 0x002 /* SW pte type bit x */
205 207
206/* Mask and six different types of pages. */ 208/* Six different types of pages. */
207#define _PAGE_TYPE_MASK 0x601
208#define _PAGE_TYPE_EMPTY 0x400 209#define _PAGE_TYPE_EMPTY 0x400
209#define _PAGE_TYPE_NONE 0x401 210#define _PAGE_TYPE_NONE 0x401
210#define _PAGE_TYPE_SWAP 0x600 211#define _PAGE_TYPE_SWAP 0x403
211#define _PAGE_TYPE_FILE 0x601 212#define _PAGE_TYPE_FILE 0x601 /* bit 0x002 is used for offset !! */
212#define _PAGE_TYPE_RO 0x200 213#define _PAGE_TYPE_RO 0x200
213#define _PAGE_TYPE_RW 0x000 214#define _PAGE_TYPE_RW 0x000
214 215
216/*
217 * PTE type bits are rather complicated. handle_pte_fault uses pte_present,
218 * pte_none and pte_file to find out the pte type WITHOUT holding the page
219 * table lock. ptep_clear_flush on the other hand uses ptep_clear_flush to
220 * invalidate a given pte. ipte sets the hw invalid bit and clears all tlbs
221 * for the page. The page table entry is set to _PAGE_TYPE_EMPTY afterwards.
222 * This change is done while holding the lock, but the intermediate step
223 * of a previously valid pte with the hw invalid bit set can be observed by
224 * handle_pte_fault. That makes it necessary that all valid pte types with
225 * the hw invalid bit set must be distinguishable from the four pte types
226 * empty, none, swap and file.
227 *
228 * irxt ipte irxt
229 * _PAGE_TYPE_EMPTY 1000 -> 1000
230 * _PAGE_TYPE_NONE 1001 -> 1001
231 * _PAGE_TYPE_SWAP 1011 -> 1011
232 * _PAGE_TYPE_FILE 11?1 -> 11?1
233 * _PAGE_TYPE_RO 0100 -> 1100
234 * _PAGE_TYPE_RW 0000 -> 1000
235 *
236 * pte_none is true for bits combinations 1000, 1100
237 * pte_present is true for bits combinations 0000, 0010, 0100, 0110, 1001
238 * pte_file is true for bits combinations 1101, 1111
239 * swap pte is 1011 and 0001, 0011, 0101, 0111, 1010 and 1110 are invalid.
240 */
241
215#ifndef __s390x__ 242#ifndef __s390x__
216 243
217/* Bits in the segment table entry */ 244/* Bits in the segment table entry */
@@ -365,18 +392,21 @@ static inline int pmd_bad(pmd_t pmd)
365 392
366static inline int pte_none(pte_t pte) 393static inline int pte_none(pte_t pte)
367{ 394{
368 return (pte_val(pte) & _PAGE_TYPE_MASK) == _PAGE_TYPE_EMPTY; 395 return (pte_val(pte) & _PAGE_INVALID) && !(pte_val(pte) & _PAGE_SWT);
369} 396}
370 397
371static inline int pte_present(pte_t pte) 398static inline int pte_present(pte_t pte)
372{ 399{
373 return !(pte_val(pte) & _PAGE_INVALID) || 400 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT | _PAGE_SWX;
374 (pte_val(pte) & _PAGE_TYPE_MASK) == _PAGE_TYPE_NONE; 401 return (pte_val(pte) & mask) == _PAGE_TYPE_NONE ||
402 (!(pte_val(pte) & _PAGE_INVALID) &&
403 !(pte_val(pte) & _PAGE_SWT));
375} 404}
376 405
377static inline int pte_file(pte_t pte) 406static inline int pte_file(pte_t pte)
378{ 407{
379 return (pte_val(pte) & _PAGE_TYPE_MASK) == _PAGE_TYPE_FILE; 408 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT;
409 return (pte_val(pte) & mask) == _PAGE_TYPE_FILE;
380} 410}
381 411
382#define pte_same(a,b) (pte_val(a) == pte_val(b)) 412#define pte_same(a,b) (pte_val(a) == pte_val(b))
diff --git a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h
index a19238cbcffa..71d3c21b84f0 100644
--- a/include/asm-s390/unistd.h
+++ b/include/asm-s390/unistd.h
@@ -249,8 +249,9 @@
249#define __NR_vmsplice 309 249#define __NR_vmsplice 309
250/* Number 310 is reserved for new sys_move_pages */ 250/* Number 310 is reserved for new sys_move_pages */
251#define __NR_getcpu 311 251#define __NR_getcpu 311
252#define __NR_epoll_pwait 312
252 253
253#define NR_syscalls 312 254#define NR_syscalls 313
254 255
255/* 256/*
256 * There are some system calls that are not present on 64 bit, some 257 * There are some system calls that are not present on 64 bit, some