Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  msync.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * linux/mm/msync.c
 *
 * Copyright (C) 1994-1999  Linus Torvalds
 */


/*
 * The msync() system call.
 */

#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/file.h>
#include <linux/syscalls.h>
#include <linux/sched.h>

/*
 * MS_SYNC syncs the entire file - including mappings.
 *
 * MS_ASYNC does not start I/O (it used to, up to 2.5.67).
 * Nor does it marks the relevant pages dirty (it used to up to 2.6.17).
 * Now it doesn't do anything, since dirty pages are properly tracked.
 *
 * The application may now run fsync() to
 * write out the dirty pages and wait on the writeout and check the result.
 * Or the application may run fadvise(FADV_DONTNEED) against the fd to start
 * async writeout immediately.
 * So by _not_ starting I/O in MS_ASYNC we provide complete flexibility to
 * applications.
 */

SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
{
 unsigned long end;
 struct mm_struct *mm = current->mm;
 struct vm_area_struct *vma;
 int unmapped_error = 0;
 int error = -EINVAL;

 start = untagged_addr(start);

 if (flags & ~(MS_ASYNC | MS_INVALIDATE | MS_SYNC))
  goto out;
 if (offset_in_page(start))
  goto out;
 if ((flags & MS_ASYNC) && (flags & MS_SYNC))
  goto out;
 error = -ENOMEM;
 len = (len + ~PAGE_MASK) & PAGE_MASK;
 end = start + len;
 if (end < start)
  goto out;
 error = 0;
 if (end == start)
  goto out;
 /*
 * If the interval [start,end) covers some unmapped address ranges,
 * just ignore them, but return -ENOMEM at the end. Besides, if the
 * flag is MS_ASYNC (w/o MS_INVALIDATE) the result would be -ENOMEM
 * anyway and there is nothing left to do, so return immediately.
 */

 mmap_read_lock(mm);
 vma = find_vma(mm, start);
 for (;;) {
  struct file *file;
  loff_t fstart, fend;

  /* Still start < end. */
  error = -ENOMEM;
  if (!vma)
   goto out_unlock;
  /* Here start < vma->vm_end. */
  if (start < vma->vm_start) {
   if (flags == MS_ASYNC)
    goto out_unlock;
   start = vma->vm_start;
   if (start >= end)
    goto out_unlock;
   unmapped_error = -ENOMEM;
  }
  /* Here vma->vm_start <= start < vma->vm_end. */
  if ((flags & MS_INVALIDATE) &&
    (vma->vm_flags & VM_LOCKED)) {
   error = -EBUSY;
   goto out_unlock;
  }
  file = vma->vm_file;
  fstart = (start - vma->vm_start) +
    ((loff_t)vma->vm_pgoff << PAGE_SHIFT);
  fend = fstart + (min(end, vma->vm_end) - start) - 1;
  start = vma->vm_end;
  if ((flags & MS_SYNC) && file &&
    (vma->vm_flags & VM_SHARED)) {
   get_file(file);
   mmap_read_unlock(mm);
   error = vfs_fsync_range(file, fstart, fend, 1);
   fput(file);
   if (error || start >= end)
    goto out;
   mmap_read_lock(mm);
   vma = find_vma(mm, start);
  } else {
   if (start >= end) {
    error = 0;
    goto out_unlock;
   }
   vma = find_vma(mm, vma->vm_end);
  }
 }
out_unlock:
 mmap_read_unlock(mm);
out:
 return error ? : unmapped_error;
}

Messung V0.5
C=88 H=86 G=86

¤ Dauer der Verarbeitung: 0.24 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge