From: Binbin Zhou <zhoubinbin@loongson.cn> Date: Sun, 10 Jul 2022 13:36:04 +0000 (+0800) Subject: docs/zh_CN: core-api: Add watch_queue Chinese translation X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=c528be5ed203ece2bcb5680f015d18da76174653;p=linux.git docs/zh_CN: core-api: Add watch_queue Chinese translation Translate core-api/watch_queue.rst into Chinese. Last English version used: commit f5461124d59b ("Documentation: move watch_queue to core-api"). Signed-off-by: Binbin Zhou <zhoubinbin@loongson.cn> Reviewed-by: Wu XiangCheng <bobwxc@email.cn> Link: https://lore.kernel.org/r/20220710133604.31382-1-zhoubinbin@loongson.cn Signed-off-by: Jonathan Corbet <corbet@lwn.net> --- diff --git a/Documentation/translations/zh_CN/core-api/index.rst b/Documentation/translations/zh_CN/core-api/index.rst index 26d9913fc8b60..7ca44629860cd 100644 --- a/Documentation/translations/zh_CN/core-api/index.rst +++ b/Documentation/translations/zh_CN/core-api/index.rst @@ -28,6 +28,7 @@ printk-basics printk-formats workqueue + watch_queue symbol-namespaces æ°æ®ç»æåä½çº§å®ç¨ç¨åº diff --git a/Documentation/translations/zh_CN/core-api/watch_queue.rst b/Documentation/translations/zh_CN/core-api/watch_queue.rst new file mode 100644 index 0000000000000..23b17ae2e4e2e --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/watch_queue.rst @@ -0,0 +1,313 @@ +.. SPDX-License-Identifier: GPL-2.0+ + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/core-api/watch_queue.rst + +:ç¿»è¯: + +å¨å½¬å½¬ Binbin Zhou <zhoubinbin@loongson.cn> + +:æ ¡è¯: + +å¸å»¶è ¾ Yanteng Si <siyanteng@loongson.cn> +å´æ³æ Wu Xiangcheng <bobwxc@email.cn> + + +============ +éç¨éç¥æºå¶ +============ + +éç¨éç¥æºå¶æ¯å»ºç«å¨æ å管é驱å¨ä¹ä¸çï¼å®å¯ä»¥ææå°å°æ¥èªå æ ¸çéç¥æ¶æ¯æ¼æ¥å°ç¨ +æ·ç©ºé´æå¼ç管éä¸ãè¿å¯ä»¥ä¸ä»¥ä¸æ¹é¢ç»å使ç¨:: + + * Key/keyring éç¥ + +éç¥ç¼å²åºå¯ä»¥éè¿ä»¥ä¸æ¹å¼å¯ç¨ï¼ + + âGeneral setupâ/âGeneral notification queueâ + (CONFIG_WATCH_QUEUE) + +ææ¡£å å«ä»¥ä¸ç« èï¼ + +.. contents:: :local: + + +æ¦è¿° +==== + +该设æ½ä»¥ä¸ç§ç¹æ®æ¨¡å¼æå¼ç管éå½¢å¼åºç°ï¼ç®¡éçå é¨ç¯å½¢ç¼å²åºç¨äºä¿åå æ ¸çæçæ¶ +æ¯ãç¶åéè¿read()读åºè¿äºæ¶æ¯ã卿¤ç±»ç®¡éä¸ç¦ç¨æ¼æ¥ä»¥å类似çæä½ï¼å 为å®ä»¬å¸æ +å¨æäºæ åµä¸å°å ¶æ·»å çå 容è¿åå°ç¯ä¸-è¿å¯è½æç»ä¼ä¸éç¥æ¶æ¯éå ã + +管éçææè å¿ é¡»åè¯å æ ¸å®æ³éè¿è¯¥ç®¡éè§å¯åªäºæºãåªæè¿æ¥å°è¯¥ç®¡éä¸çæºæä¼å°æ¶ +æ¯æå ¥å ¶ä¸ã请注æï¼ä¸ä¸ªæºå¯è½ç»å®å°å¤ä¸ªç®¡éï¼å¹¶åæ¶å°æ¶æ¯æå ¥å°ææç®¡éä¸ã + +è¿å¯ä»¥å°è¿æ»¤å¨æ¾ç½®å¨ç®¡éä¸ï¼ä»¥ä¾¿å¨ä¸æå ´è¶£æ¶å¯ä»¥å¿½ç¥æäºæºç±»åååäºä»¶ã + +妿ç¯ä¸æ²¡æå¯ç¨çææ§½ï¼æè 没æé¢åé çæ¶æ¯ç¼å²åºå¯ç¨ï¼åå°ä¸¢å¼æ¶æ¯ãå¨è¿ä¸¤ç§æ +åµä¸ï¼read()é½ä¼å¨è¯»åç¼å²åºä¸å½åçæå䏿¡æ¶æ¯åï¼å°WATCH_META_LOSS_NOTIFICATION +æå ¥å°è¾åºç¼å²åºä¸ã + +请注æï¼å½çæä¸ä¸ªéç¥æ¶ï¼å æ ¸ä¸ä¼çå¾ æ¶è´¹è æ¶éå®ï¼èæ¯ç»§ç»æ§è¡ãè¿æå³çå¯ä»¥å¨ +ææèªæéçåæ¶çæéç¥ï¼å¹¶ä¸è¿å¯ä»¥ä¿æ¤å æ ¸ä¸è¢«ç¨æ·ç©ºé´æ éæ éæå°é»ç¢ã + + +æ¶æ¯ç»æ +======== + +éç¥æ¶æ¯ç±ä¸ä¸ªç®çç头é¨å¼å§:: + + struct watch_notification { + __u32 type:24; + __u32 subtype:8; + __u32 info; + }; + +âtypeâ表示éç¥è®°å½çæ¥æºï¼âsubtypeâè¡¨ç¤ºè¯¥æ¥æºçè®°å½ç±»åï¼è§ä¸æè§æµæºç« èï¼ã该类 +åä¹å¯ä»¥æ¯âWATCH_TYPE_METAâãè¿æ¯ä¸ä¸ªç±è§æµéåæ¬èº«å¨å é¨çæçç¹æ®è®°å½ç±»åãæä¸¤ +个åç±»åï¼ + + * WATCH_META_REMOVAL_NOTIFICATION + * WATCH_META_LOSS_NOTIFICATION + +第ä¸ä¸ªè¡¨ç¤ºå®è£ äºè§å¯ç对象已被å 餿鿝ï¼ç¬¬äºä¸ªè¡¨ç¤ºæäºæ¶æ¯å·²ä¸¢å¤±ã + +âinfoâ表示ä¸ç³»åä¸è¥¿ï¼å æ¬ï¼ + + * æ¶æ¯çé¿åº¦ï¼ä»¥åè为åä½ï¼å æ¬å¤´ï¼å¸¦æWATCH_INFO_LENGTHçæ©ç ï¼å¹¶æ + WATCH_INFO_LENGTH__SHIFTç§»ä½ï¼ãè¿è¡¨ç¤ºè®°å½ç大å°ï¼å¯è½å¨8å°127åèä¹é´ã + + * è§æµIDï¼å¸¦æWATCH_INFO_IDæ©ç ï¼å¹¶æWATCH_INFO_ID__SHIFTç§»ä½ï¼ãè¿è¡¨ç¤ºè§æµç主 + å«IDï¼å¯è½å¨0å°255ä¹é´ãå¤ä¸ªè§æµç»å¯ä»¥å ±äº«ä¸ä¸ªéåï¼è¿æä¾äºä¸ç§åºåå®ä»¬çæ¹æ³ã + + * ç¹å®ç±»åçåæ®µï¼WATCH_INFO_TYPE_INFOï¼ãè¿æ¯ç±éç¥ç产è 设置çï¼ä»¥æç¤ºç±»åå + åç±»åçæäºç¹å®å«ä¹ã + +é¤é¿åº¦å¤ï¼ä¿¡æ¯ä¸çææå 容é½å¯ä»¥ç¨äºè¿æ»¤ã + +头é¨åé¢å¯ä»¥æè¡¥å ä¿¡æ¯ãæ¤æ ¼å¼æ¯ç±ç±»åååç±»åå³å®çã + + +è§æµå表ï¼éç¥æºï¼API +===================== + +âè§æµåè¡¨âæ¯è®¢é éç¥æºçè§æµè çå表ãå表å¯ä»¥éå å°å¯¹è±¡ï¼æ¯å¦é®æè¶ 级åï¼ï¼ä¹å¯ +以æ¯å ¨å±çï¼æ¯å¦å¯¹äºè®¾å¤äºä»¶ï¼ãä»ç¨æ·ç©ºé´çè§åº¦æ¥çï¼ä¸ä¸ªéå ¨å±çè§æµå表éå¸¸æ¯ +éè¿å¼ç¨å®æå±ç对象æ¥å¼ç¨çï¼æ¯å¦ä½¿ç¨KEYCTL_NOTIFYå¹¶ç»å®ä¸ä¸ªå¯é¥åºåå·æ¥è§æµç¹å® +çå¯é¥ï¼ã + +为äºç®¡çè§æµåè¡¨ï¼æä¾äºä»¥ä¸å½æ°ï¼ + + * :: + + void init_watch_list(struct watch_list *wlist, + void (*release_watch)(struct watch *wlist)); + + åå§åä¸ä¸ªè§æµå表ã 妿 ``release_watch`` 䏿¯NULLï¼é£ä¹è¿è¡¨ç¤ºå½watch_list对 + è±¡è¢«éæ¯æ¶ï¼åºè¯¥è°ç¨å½æ°æ¥ä¸¢å¼è§æµåè¡¨å¯¹è¢«è§æµå¯¹è±¡çä»»ä½å¼ç¨ã + + * ``void remove_watch_list(struct watch_list *wlist);`` + + è¿å°å é¤è®¢é watch_listçææè§æµï¼å¹¶éæ¾å®ä»¬ï¼ç¶å鿝watch_list对象æ¬èº«ã + + +è§æµéåï¼éç¥è¾åºï¼API +======================= + +âè§æµéåâæ¯ç±åºç¨ç¨åºåé çç¨ä»¥è®°å½éç¥çç¼å²åºï¼å ¶å·¥ä½åçå®å ¨éèå¨ç®¡é设å¤é©± +å¨ä¸ï¼ä½å¿ é¡»è·å¾å¯¹å®çå¼ç¨æè½è®¾ç½®è§æµãå¯ä»¥éè¿ä»¥ä¸æ¹å¼è¿è¡ç®¡çï¼ + + * ``struct watch_queue *get_watch_queue(int fd);`` + + ç±äºè§æµéåå¨å æ ¸ä¸éè¿å®ç°ç¼å²åºç管éçæä»¶æè¿°ç¬¦è¡¨ç¤ºï¼ç¨æ·ç©ºé´å¿ é¡»éè¿ç³» + ç»è°ç¨ä¼ é该æä»¶æè¿°ç¬¦ï¼è¿å¯ä»¥ç¨äºä»ç³»ç»è°ç¨ä¸æ¥æ¾æåè§æµéåçä¸éææéã + + * ``void put_watch_queue(struct watch_queue *wqueue);`` + + è¯¥å½æ°ç¨ä»¥ä¸¢å¼ä» ``get_watch_queue()`` è·å¾çå¼ç¨ã + + +è§æµè®¢é API +=========== + +âè§æµâæ¯è§æµå表ä¸ç订é ï¼è¡¨ç¤ºè§æµéåï¼ä»è表示åºåå ¥éç¥è®°å½çç¼å²åºãè§æµéå +对象è¿å¯ä»¥æºå¸¦è¯¥å¯¹è±¡çè¿æ»¤è§åï¼ç±ç¨æ·ç©ºé´è®¾ç½®ãwatchç»æä½çæäºé¨åå¯ä»¥ç±é©±å¨ç¨ +åºè®¾ç½®:: + + struct watch { + union { + u32 info_id; /* å¨infoåæ®µä¸è¿è¡ORè¿ç®çID */ + ... + }; + void *private; /* è¢«è§æµå¯¹è±¡çç§ææ°æ® */ + u64 id; /* å 鍿 è¯ç¬¦ */ + ... + }; + +``info_id`` 弿¯ä»ç¨æ·ç©ºé´è·å¾å¹¶æWATCH_INFO_ID__SHIFTç§»ä½ç8使°åãå½éç¥åå ¥å ³ +èçè§æµéåç¼å²åºæ¶ï¼è¿å°ä¸struct watch_notification::infoçWATCH_INFO_IDåæ®µè¿ +è¡æè¿ç®ã + +``private`` åæ®µæ¯ä¸watch_listç¸å ³èç驱å¨ç¨åºæ°æ®ï¼å¹¶ç± ``watch_list::release_watch()`` +彿°æ¸ é¤ã + +``id`` åæ®µæ¯æºçIDã使ç¨ä¸åIDåå¸çéç¥å°è¢«å¿½ç¥ã + +æä¾ä»¥ä¸å½æ°æ¥ç®¡çè§æµ: + + * ``void init_watch(struct watch *watch, struct watch_queue *wqueue);`` + + åå§åä¸ä¸ªè§æµå¯¹è±¡ï¼æå®çæé设置å°è§å¯éåä¸ï¼ä½¿ç¨éå½çéå¶æ¥é¿å æ»éã + + * ``int add_watch_to_object(struct watch *watch, struct watch_list *wlist);`` + + å°è§æµè®¢é å°è§æµå表ï¼éç¥æºï¼ãwatchç»æä½ä¸çdriver-settableåæ®µå¿ é¡»å¨è°ç¨ + å®ä¹å设置ã + + * :: + + int remove_watch_from_object(struct watch_list *wlist, + struct watch_queue *wqueue, + u64 id, false); + + ä»è§æµå表ä¸å é¤ä¸ä¸ªè§æµï¼è¯¥è§æµå¿ 须䏿å®çè§æµéåï¼``wqueue``ï¼å对象æ è¯ + 符ï¼``id``ï¼å¹é ãéç¥ï¼``WATCH_META_REMOVAL_NOTIFICATION``ï¼è¢«åéå°è§æµéå + è¡¨ç¤ºè¯¥è§æµå·²è¢«å é¤ã + + * ``int remove_watch_from_object(struct watch_list *wlist, NULL, 0, true);`` + + ä»è§æµå表ä¸å 餿æè§æµãé¢è®¡è¿å°è¢«ç§°ä¸ºéæ¯åçåå¤å·¥ä½ï¼å±æ¶æ°çè§æµå°æ æ³ + 访é®è§æµå表ãéç¥ï¼``WATCH_META_REMOVAL_NOTIFICATION``ï¼è¢«åéå°æ¯ä¸ªè®¢é è§æµ + çè§æµéåï¼ä»¥è¡¨æè¯¥è§æµå·²è¢«å é¤ã + + +éç¥åå¸API +=========== + +è¦å°éç¥åå¸å°è§æµå表以便订é çè§æµå¯ä»¥çå°ï¼åºä½¿ç¨ä»¥ä¸å½æ°:: + + void post_watch_notification(struct watch_list *wlist, + struct watch_notification *n, + const struct cred *cred, + u64 id); + +åºé¢å 设置éç¥æ ¼å¼ï¼å¹¶åºä¼ å ¥ä¸ä¸ªæå头é¨ï¼``n``ï¼çæéãéç¥å¯è½å¤§äºæ¤å¼ï¼å¹¶ä¸ç¼ +岿§½ä¸ºåä½ç大å°å¨ ``n->info & WATCH_INFO_LENGTH`` 䏿³¨æã + +``cred`` ç»æä½è¡¨ç¤ºæºï¼å¯¹è±¡ï¼çè¯ä¹¦ï¼å¹¶ä¼ éç»LSMï¼ä¾å¦SELinuxï¼ä»¥å 许æç¦æ¢æ ¹æ®è¯¥é +åï¼å¯¹è±¡ï¼çè¯ä¹¦å¨æ¯ä¸ªåç¬éåä¸è®°å½æ³¨éã + +``id`` æ¯æºå¯¹è±¡IDï¼å¦å¯é¥ä¸çåºåå·ï¼ãåªæè®¾ç½®ç¸åIDçè§æµæè½çå°è¿ä¸ªéç¥ã + + +è§æµæº +====== + +ä»»ä½ç¹å®çç¼å²åºé½å¯ä»¥ä»å¤ä¸ªæºè·åä¿¡æ¯ã è¿äºæºå æ¬: + + * WATCH_TYPE_KEY_NOTIFY + + è¿ç§ç±»åçéç¥è¡¨ç¤ºå¯é¥åå¯é¥ç¯çååï¼å æ¬å¯é¥ç¯å 容æå¯é¥å±æ§çååã + + æ´å¤ä¿¡æ¯è¯·åè§Documentation/security/keys/core.rstã + + +äºä»¶è¿æ»¤ +======== + +å½åå»ºè§æµéååï¼æä»¬å¯ä»¥åºç¨ä¸ç»è¿æ»¤å¨ä»¥éå¶æ¥æ¶çäºä»¶:: + + struct watch_notification_filter filter = { + ... + }; + ioctl(fd, IOC_WATCH_QUEUE_SET_FILTER, &filter) + +è¿æ»¤å¨çæè¿°çç±»åå鿝:: + + struct watch_notification_filter { + __u32 nr_filters; + __u32 __reserved; + struct watch_notification_type_filter filters[]; + }; + +å ¶ä¸ânr_filtersâ表示filters[]æ°ç»ä¸è¿æ»¤å¨çæ°éï¼èâ__reservedâåºä¸º0ã +âfilterâæ°ç»æä»¥ä¸ç±»åçå ç´ :: + + struct watch_notification_type_filter { + __u32 type; + __u32 info_filter; + __u32 info_mask; + __u32 subtype_filter[8]; + }; + +å ¶ä¸ï¼ + + * ``type`` æ¯è¿æ»¤çäºä»¶ç±»åï¼åºç±»ä¼¼äºâWATCH_TYPE_KEY_NOTIFYâã + + * ``info_filter`` ä¸ ``info_mask`` å å½éç¥è®°å½çä¿¡æ¯å段çè¿æ»¤å¨ï¼åªæå¨ä»¥ä¸æ + åµï¼éç¥æä¼åå ¥ç¼å²åº:: + + (watch.info & info_mask) == info_filter + + ä¾å¦ï¼è¿å¯ä»¥ç¨äºå¿½ç¥ä¸å¨ä¸ä¸ªæè½½æ ä¸çè§æµç¹çäºä»¶ã + + * ``subtype_filter`` æ¯ä¸ä¸ªä½æ©ç ï¼è¡¨ç¤ºæå ´è¶£çåç±»åãsubtype_filter[0]ç + bit[0]对åºåç±»å0ï¼bit[1]对åºåç±»å1ï¼ä»¥æ¤ç±»æ¨ã + +è¥ioctl()çåæ°ä¸ºNULLï¼åè¿æ»¤å¨å°è¢«ç§»é¤ï¼å¹¶ä¸æ¥èªè§æµæºçææäºä»¶é½å°éè¿ã + + +ç¨æ·ç©ºé´ä»£ç ç¤ºä¾ +================ + +ç¼å²åºçå建å¦ä¸æç¤º:: + + pipe2(fds, O_TMPFILE); + ioctl(fds[1], IOC_WATCH_QUEUE_SET_SIZE, 256); + +å®å¯ä»¥è¢«è®¾ç½®ææ¥æ¶å¯é¥ç¯ååçéç¥:: + + keyctl(KEYCTL_WATCH_KEY, KEY_SPEC_SESSION_KEYRING, fds[1], 0x01); + +ç¶åï¼è¿äºéç¥å¯ä»¥è¢«å¦ä¸æ¹å¼æä½¿ç¨:: + + static void consumer(int rfd, struct watch_queue_buffer *buf) + { + unsigned char buffer[128]; + ssize_t buf_len; + + while (buf_len = read(rfd, buffer, sizeof(buffer)), + buf_len > 0 + ) { + void *p = buffer; + void *end = buffer + buf_len; + while (p < end) { + union { + struct watch_notification n; + unsigned char buf1[128]; + } n; + size_t largest, len; + + largest = end - p; + if (largest > 128) + largest = 128; + memcpy(&n, p, largest); + + len = (n->info & WATCH_INFO_LENGTH) >> + WATCH_INFO_LENGTH__SHIFT; + if (len == 0 || len > largest) + return; + + switch (n.n.type) { + case WATCH_TYPE_META: + got_meta(&n.n); + case WATCH_TYPE_KEY_NOTIFY: + saw_key_change(&n.n); + break; + } + + p += len; + } + } + }