名 前
sync_file_range − フ ァ イ ル セ グ メ ン ト を デ ィ ス ク と 同 期 す る
書 式
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <fcntl.h>
int
sync_file_range(int fd, off64_t
offset, off64_t nbytes,
unsigned int flags);
説 明
sync_file_range() を 使 う と 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd で 参 照 さ れ る オ ー プ ン さ れ た フ ァ イ ル の デ ィ ス ク と の 同 期 に 関 し て 、 き め 細 か な 制 御 が 可 能 と な る 。
offset
は 、 同 期 を 行
う フ ァ イ ル の
領 域 の 開 始 バ
イ ト で あ る 。
nbytes に は 同 期 を
行 う 領 域 の 長
さ を バ イ ト 単
位 で 指 定 す る
。 nbytes が 0 の 場 合
は 、 offset か ら フ
ァ イ ル 末 尾 ま
で の 全 バ イ ト
を 同 期 す る 。
同 期 は シ ス テ
ム の ペ ー ジ サ
イ ズ の 単 位 で
行 わ れ る 。 offset
は ペ ー ジ 境 界
に あ わ せ て 切
り 下 げ ら れ 、
(offset+nbytes−1) は ペ ー
ジ 境 界 に あ わ
せ て 切 り 上 げ
ら れ る 。 ビ ッ
ト マ ス ク 引 き
数 flags に は 以 下
の 値 を 指 定 す
る こ と が で き
る :
SYNC_FILE_RANGE_WAIT_BEFORE 何 ら か
の 書 き 込 み を
行 う 前 に 、 指
定 さ れ た 領 域
の ペ ー ジ で 書
き 出 し を 行 う
よ う に デ バ イ
ス ド ラ イ バ に
す で に 要 求 が
発 行 さ れ て い
る ペ ー ジ の 書
き 出 し が 全 て
完 了 す る の を
待 つ 。
SYNC_FILE_RANGE_WRITE 指 定 さ
れ た 領 域 の ペ
ー ジ で 、 書 き
出 し 要 求 が 発
行 さ れ て い な
い 全 て の dirty (キ ャ
ッ シ ュ だ け が
変 更 さ れ て い
る ) ペ ー ジ の 書
き 出 し を 開 始
す る 。 リ ク エ
ス ト キ ュ ー の
大 き さ よ り 多
く 書 き 込 も う
と し た 場 合 に
は 、 こ の 処 理
は 停 止 (block) す る
可 能 性 が あ る
点 に 注 意 す る
こ と 。
SYNC_FILE_RANGE_WAIT_AFTER 何 ら か
の 書 き 込 み 後
に 、 指 定 さ れ
た 領 域 の 全 て
の ペ ー ジ の 書
き 出 し が 行 わ
れ る の を 待 つ
。
flags
に 0 を 指 定 し た
場 合 、 何 も し
な い こ と を 表
す 。 警 告 こ の
シ ス テ ム コ ー
ル は 非 常 に 危
険 で あ り 、 移
植 性 が 必 要 な
プ ロ グ ラ ム で
使 用 す べ き で
は な い 。 こ れ
ら の 操 作 で は
ど れ も フ ァ イ
ル の メ タ デ ー
タ の 書 き 出 し
を 行 わ な い 。
し た が っ て 、
ア プ リ ケ ー シ
ョ ン に よ り 作
成 済 み の デ ィ
ス ク ブ ロ ッ ク
の 上 書 き の 実
行 が 確 実 に 行
わ れ な い 限 り
、 ク ラ ッ シ ュ
の 後 で も デ ー
タ が 利 用 で き
る 保 証 は な い
。 書 き 込 み が
上 書 き だ け で
あ る か を 知 る
た め の ユ ー ザ
ー イ ン タ ー フ
ェ ー ス は 存 在
し な い 。 (btrfs な
ど の ) copy−on−write 動
作 を 使 っ た フ
ァ イ ル シ ス テ
ム で は 、 既 存
の 割 り 当 て 済
み の ブ ロ ッ ク
に 対 す る 上 書
き 自 体 が で き
な い 。 前 も っ
て 割 り 当 て ら
れ た 領 域 に 書
き 込 み を 行 う
場 合 、 多 く の
フ ァ イ ル シ ス
テ ム で は block allocator へ
の 書 き 込 み も
必 要 と な る が
、 こ の シ ス テ
ム コ ー ル は block allocator
の デ ィ ス ク へ
の 同 期 を 行 わ
な い 。 こ の シ
ス テ ム コ ー ル
は デ ィ ス ク 書
き 込 み キ ャ ッ
シ ュ の フ ラ ッ
シ ュ を 行 わ な
い の で 、 揮 発
性 の デ ィ ス ク
書 き 込 み キ ャ
ッ シ ュ を 使 っ
た シ ス テ ム で
は こ の シ ス テ
ム コ ー ル で は
デ ー タ の 一 貫
性 を 確 保 で き
な い こ と に な
る 。 詳 細
SYNC_FILE_RANGE_WAIT_BEFORE と
SYNC_FILE_RANGE_WAIT_AFTER は I/O エ
ラ ー や ENOSPC 状 態
を 検 出 し 、 呼
び 出 し 元 に こ
れ ら の 情 報 を
返 す 。
flags
の 役 に 立 つ ビ
ッ ト の 組 み 合
わ せ を 以 下 に
示 す :
SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE
指 定 さ れ た 範
囲 内 の ペ ー ジ
で 、 sync_file_range() が 呼
び 出 さ れ た 際
に dirty で あ っ た 全
て の ペ ー ジ が
、 確 実 に 書 き
出 し 対 象 と な
る よ う に す る
。 こ れ は 、
start−write−for−data−integrity
操 作 (デ ー タ 完
全 性 確 保 の た
め の 書 き 込 み
開 始 の 操 作 ) で
あ る 。
SYNC_FILE_RANGE_WRITE 指 定 さ
れ た 範 囲 内 の
ペ ー ジ で 、 現
在 書 き 出 し 中
で な い 全 て の dirty
ペ ー ジ の 書 き
出 し を 開 始 す
る 。 こ れ は 非
同 期 の デ ィ ス
ク へ の フ ラ ッ
シ ュ (flush−to−disk) 操
作 で あ る 。 デ
ー タ 完 全 性 確
保 が 必 要 な 操
作 と し て は 適
切 で は な い 。
SYNC_FILE_RANGE_WAIT_BEFORE (or
SYNC_FILE_RANGE_WAIT_AFTER) 指 定
さ れ た 範 囲 内
の 全 て の ペ ー
ジ の 書 き 出 し
の 完 了 を 待 つ
。 こ の フ ラ グ
は 、 前 に 行 わ
れ た 操 作
SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE
の 後 に 使 用 で
き 、 こ の 操 作
の 完 了 を 待 ち
、 結 果 を 取 得
す る こ と が で
き る 。
SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE |
SYNC_FILE_RANGE_WAIT_AFTER こ れ は
write−for−data−integrity 操 作
(デ ー タ 完 全 性
確 保 の た め の
書 き 込 み ) で あ
り 、 指 定 さ れ
た 範 囲 内 の 、
sync_file_range() が 呼 ば れ
た 時 点 で dirty な 全
て の ペ ー ジ が
デ ィ ス ク に 格
納 さ れ る こ と
が 保 証 さ れ る
。
返 り 値
成 功 の 場 合 、 sync_file_range() は 0 を 返 す 。 失 敗 の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。
エ ラ ー
EBADF |
fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。 | ||
EINVAL |
flags に 不 正 な ビ ッ ト が 指 定 さ れ て い る 。 ま た は offset か nbytes が 不 正 で あ る 。 | ||
EIO |
I/O エ ラ ー 。 | ||
ENOMEM |
メ モ リ ー 不 足 で あ る 。
ENOSPC デ ィ ス ク 領 域 不 足 で あ る 。 |
||
ESPIPE |
fd が 、 通 常 の フ ァ イ ル 、 ブ ロ ッ ク デ バ イ ス 、 デ ィ レ ク ト リ 、 シ ン ボ リ ッ ク リ ン ク 以 外 の も の を 指 し て い る 。
バ ー ジ ョ ン
sync_file_range() は カ ー ネ ル 2.6.17 で Linux に 登 場 し た 。
準 拠
こ の シ ス テ ム コ ー ル は Linux 独 自 で あ り 、 移 植 性 が 必 要 な プ ロ グ ラ ム で は 使 用 を 避 け る べ き で あ る 。
注 意
sync_file_range2() い く つ か の ア ー キ テ ク チ ャ ー (例 え ば 、 PowerPC や ARM) で は 、 64 ビ ッ ト の 引 き 数 は 適 切 な レ ジ ス タ ー の 組 に 割 り 当 て る 必 要 が あ る 。 こ の よ う な ア ー キ テ ク チ ャ ー で は 、 「 書 式 」 に 書 か れ て い る sync_file_range() の 呼 び 出 し シ グ ネ チ ャ ー で 、 引 き 数 fd と offset の 間 の パ デ ィ ン グ (詰 め も の ) で レ ジ ス タ ー が 一 つ 消 費 さ れ て し ま う (詳 細 は syscall(2) 参 照 )。 そ の た め 、 こ れ ら の ア ー キ テ ク チ ャ ー で は 引 き 数 が 適 切 な 順 序 に な っ た 別 の シ ス テ ム コ ー ル が 定 義 さ れ て い る 。
int
sync_file_range2(int fd, unsigned int
flags,
off64_t offset, off64_t
nbytes); 上 記 の 点
以 外 は 、 こ の
シ ス テ ム コ ー
ル の 動 作 は
sync_file_range() と 全 く 同
じ で あ る 。 こ
の シ ス テ ム コ
ー ル に 対 す る
ラ イ ブ ラ リ に
よ る サ ポ ー ト
は glibc で は 提 供 さ
れ て い な い 。
こ の バ ー ジ ョ
ン の シ ス テ ム
コ ー ル は 、 Linux 2.6.20
で ARM ア ー キ テ ク
チ ャ ー で 初 め
て 登 場 し 、
arm_sync_file_range() と い う
名 前 で あ っ た
。 Linux 2.6.22 で 、 同 様
の シ ス テ ム コ
ー ル が PowerPC 用 に
追 加 さ れ た 際
に 、 シ ス テ ム
コ ー ル の 名 前
が 変 更 さ れ た
。 glibc に よ る サ ポ
ー ト が 提 供 さ
れ て い る ア ー
キ テ ク チ ャ ー
で は 、 glibc の ラ ッ
パ ー 関 数 は
sync_file_range() と い う 名
前 で sync_file_range2() を
適 切 に 使 用 す
る よ う に な っ
て い る 。
関 連 項 目
fdatasync(2), fsync(2), msync(2), sync(2)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。