swapctl(2) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

swapctl(2)

swapctl(2)                       System Calls                       swapctl(2)

NAME
       swapctl - manage swap space

SYNOPSIS
       #include <sys/stat.h>
       #include <sys/swap.h>

       int swapctl(int cmd, void *arg);

DESCRIPTION
       The swapctl() function adds, deletes, or returns information about swap
       resources.  cmd  specifies  one  of  the following options contained in
       <sys/swap.h>:

         SC_ADD        /* add a resource for swapping */
         SC_LIST       /* list the resources for swapping */
         SC_REMOVE     /* remove a resource for swapping */
         SC_GETNSWP    /* return number of swap resources */



       When SC_ADD or SC_REMOVE are specified the SC_PERSIST flag can be added
       with a bitwise-OR with the command

         SC_PERSIST    /* Make the change permanent over reboots */



       When SC_ADD or SC_REMOVE is specified, arg is a pointer  to  a  swapres
       structure containing the following members:

         char    *sr_name;    /* pathname of resource */
         off_t   sr_start;    /* offset to start of swap area */
         off_t   sr_length;   /* length of swap area */



       The  sr_start and sr_length members are specified in 512-byte blocks. A
       swap resource can only be removed by specifying the same values for the
       sr_start and sr_length members as were specified  when  it  was  added.
       Swap  resources  need  not  be  removed in the order in which they were
       added.


       When adding or removing ZFS volumes if SC_PERSIST is specified then up‐
       date the kvol_swap property of the ZFS volume so  the  change  persists
       across reboots.


       When  SC_LIST  is  specified, arg is a pointer to a swaptable structure
       containing the following members:


         int             swt_n;       /* number of swapents following */
         struct swapent  swt_ent[];   /* array of swt_n swapents */



       A swapent structure contains the following members:



         char   *ste_path;    /* name of the swap file */
         off_t  ste_start;    /* starting block for swapping */
         off_t  ste_length;   /* length of swap area */
         long   ste_pages;    /* number of pages for swapping */
         long   ste_free;     /* number of ste_pages free */
         long   ste_flags;    /* ST_INDEL bit set if swap file */
                              /* is now being deleted */



       The SC_LIST function causes swapctl() to return at most swt_n  entries.
       The  return  value  of  swapctl()  is the number actually returned. The
       ST_INDEL bit is turned on in ste_flags if  the  swap  file  is  in  the
       process  of  being  deleted.  The ST_ENCRYPTED bit is turned on if data
       written to the swap device is reported being encrypted by the  underly‐
       ing device layer, eg zfs(8) or lofi(4d).


       When SC_GETNSWP is specified, swapctl() returns as its value the number
       of swap resources in use. arg is ignored for this operation.


       The  SC_ADD  and  SC_REMOVE functions will fail if calling process does
       not have appropriate privileges.


       The behaviour when SC_PERSIST is set and SC_ADD or SC_REMOVE is not set
       is undefined.


       The behaviour when SC_PERSIST and the swap device is not a  ZFS  volume
       is undefined.

RETURN VALUES
       Upon successful completion, the function swapctl() returns a value of 0
       for SC_ADD or SC_REMOVE, the number of struct  swapent entries actually
       returned  for  SC_LIST,  or  the  number  of  swap resources in use for
       SC_GETNSWP. Upon failure, the function swapctl() returns a value of  −1
       and sets errno to indicate an error.

ERRORS
       Under  the  following conditions, the function swapctl() fails and sets
       errno to:

       EEXIST          Part of the range specified by sr_start  and  sr_length
                       is already being used for swapping on the specified re‐
                       source (SC_ADD).


       EFAULT          Either  arg,  sr_name, or ste_path points to an illegal
                       address.


       EINVAL          The specified function value is  not  valid,  the  path
                       specified  is  not a swap resource (SC_REMOVE), part of
                       the range specified by sr_start and sr_length lies out‐
                       side the resource specified (SC_ADD), or the  specified
                       swap area is less than one page (SC_ADD).


       EISDIR          The path specified for SC_ADD is a directory.


       ELOOP           Too many symbolic links were encountered in translating
                       the pathname provided to SC_ADD or SC_REMOVE.


       ENAMETOOLONG    The  length  of  a  component of the path specified for
                       SC_ADD or SC_REMOVE exceeds NAME_MAX characters or  the
                       length  of  the  path  exceeds  PATH_MAX characters and
                       _POSIX_NO_TRUNC is in effect.


       ENOENT          The pathname specified for SC_ADD or SC_REMOVE does not
                       exist.


       ENOMEM          An insufficient number of  struct   swapent  structures
                       were  provided  to  SC_LIST, or there were insufficient
                       system storage resources available during an SC_ADD  or
                       SC_REMOVE,  or  the  system  would not have enough swap
                       space after an SC_REMOVE.


       ENOSYS          The pathname specified for SC_ADD or SC_REMOVE is not a
                       file or block special device.


       ENOTDIR         Pathname provided to SC_ADD or  SC_REMOVE  contained  a
                       component in the path prefix that was not a directory.


       EPERM           The  {PRIV_SYS_MOUNT} was not asserted in the effective
                       set of the calling process.


       EROFS           The pathname specified for SC_ADD is a  read-only  file
                       system.



       Additionally,  the  swapctl()  function will fail for 32-bit interfaces
       if:

       EOVERFLOW    The amount of swap space configured on the machine is  too
                    large to be represented by a 32-bit quantity.


EXAMPLES
       Example 1 The usage of the SC_GETNSWP and SC_LIST commands.




       The  following  example  demonstrates  the  usage of the SC_GETNSWP and
       SC_LIST commands.


         #include <sys/stat.h>
         #include <sys/swap.h>
         #include <stdio.h>
         #include <limits.h>

         #define MAXSTRSIZE PATH_MAX

         int
         main(int argc, char **argv)
         {
             swaptbl_t      *s;
             int            n, num;
             char           *strtab;    /* string table for path names */

         again:
             if ((num = swapctl(SC_GETNSWP, 0)) == -1) {
                 perror("swapctl: GETNSWP");
                 exit(1);
             }
             if (num == 0) {
                 fprintf(stderr, "No Swap Devices Configured\n");
                 exit(2);
             }
             /* allocate swaptable for num+1 entries */
             if ((s = (swaptbl_t *)
                 malloc(num * sizeof(swapent_t) +
                     sizeof(struct swaptable))) ==
                 (void *) 0) {
                 fprintf(stderr, "Malloc Failed\n");
                 exit(3);
             }
             /* allocate num+1 string holders */
             if ((strtab = (char *)
                 malloc((num + 1) * MAXSTRSIZE)) == (void *) 0) {
                 fprintf(stderr, "Malloc Failed\n");
                 exit(3);
             }
             /* initialize string pointers */
             for (int i = 0; i < (num + 1); i++) {
                 s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
             }

             s->swt_n = num + 1;
             if ((n = swapctl(SC_LIST, s)) < 0) {
                 perror("swapctl");
                 exit(1);
             }
             if (n > num) {        /* more were added */
                 free(s);
                 free(strtab);
                 goto again;
             }
             for (int i = 0; i < n; i++) {
                 printf("%s %ld%s\n",
                     s->swt_ent[i].ste_path, s->swt_ent[i].ste_pages,
                     s->swt_ent[i].ste_flags & ST_ENCRYPTED ? " Encrypted" : "");
             }
             exit(0);
         }


SEE ALSO
       lofi(4d), privileges(7), zfs(8)

Oracle Solaris 11.4            25 February 2023                     swapctl(2)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3