mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
nilfs2: move ioctl interface and disk layout to uapi separately
The header file "include/linux/nilfs2_fs.h" is composed of parts for ioctl and disk format, and both are intended to be shared with user space programs. This moves them to the uapi directory "include/uapi/linux" splitting the file to "nilfs2_api.h" and "nilfs2_ondisk.h". The following minor changes are accompanied by this migration: - nilfs_direct_node struct in nilfs2/direct.h is converged to nilfs2_ondisk.h because it's an on-disk structure. - inline functions nilfs_rec_len_from_disk() and nilfs_rec_len_to_disk() are moved to nilfs2/dir.c. Link: http://lkml.kernel.org/r/1465825507-3407-4-git-send-email-konishi.ryusuke@lab.ntt.co.jp Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4ce5c3426c
commit
e63e88bc53
18 changed files with 348 additions and 329 deletions
|
@ -267,7 +267,8 @@ among NILFS2 files can be depicted as follows:
|
|||
`-- file (ino=yy)
|
||||
( regular file, directory, or symlink )
|
||||
|
||||
For detail on the format of each file, please see include/linux/nilfs2_fs.h.
|
||||
For detail on the format of each file, please see nilfs2_ondisk.h
|
||||
located at include/uapi/linux directory.
|
||||
|
||||
There are no patents or other intellectual property that we protect
|
||||
with regard to the design of NILFS2. It is allowed to replicate the
|
||||
|
|
|
@ -248,7 +248,7 @@ Code Seq#(hex) Include File Comments
|
|||
'm' 00 drivers/scsi/megaraid/megaraid_ioctl.h conflict!
|
||||
'm' 00-1F net/irda/irmod.h conflict!
|
||||
'n' 00-7F linux/ncp_fs.h and fs/ncpfs/ioctl.c
|
||||
'n' 80-8F linux/nilfs2_fs.h NILFS2
|
||||
'n' 80-8F uapi/linux/nilfs2_api.h NILFS2
|
||||
'n' E0-FF linux/matroxfb.h matroxfb
|
||||
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
|
||||
'o' 00-03 mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps)
|
||||
|
|
|
@ -8258,8 +8258,9 @@ T: git git://github.com/konis/nilfs2.git
|
|||
S: Supported
|
||||
F: Documentation/filesystems/nilfs2.txt
|
||||
F: fs/nilfs2/
|
||||
F: include/linux/nilfs2_fs.h
|
||||
F: include/trace/events/nilfs2.h
|
||||
F: include/uapi/linux/nilfs2_api.h
|
||||
F: include/uapi/linux/nilfs2_ondisk.h
|
||||
|
||||
NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER
|
||||
M: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include <linux/nilfs2_ondisk.h> /* nilfs_binfo, nilfs_inode, etc */
|
||||
#include "alloc.h"
|
||||
#include "dat.h"
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include <linux/nilfs2_ondisk.h> /* nilfs_btree_node */
|
||||
#include "btnode.h"
|
||||
#include "bmap.h"
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "mdt.h"
|
||||
#include "cpfile.h"
|
||||
|
||||
|
|
|
@ -21,7 +21,8 @@
|
|||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include <linux/nilfs2_api.h> /* nilfs_cpstat */
|
||||
#include <linux/nilfs2_ondisk.h> /* nilfs_inode, nilfs_checkpoint */
|
||||
|
||||
|
||||
int nilfs_cpfile_get_checkpoint(struct inode *, __u64, int,
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/nilfs2_ondisk.h> /* nilfs_inode, nilfs_checkpoint */
|
||||
|
||||
|
||||
struct nilfs_palloc_req;
|
||||
|
|
|
@ -42,6 +42,28 @@
|
|||
#include "nilfs.h"
|
||||
#include "page.h"
|
||||
|
||||
static inline unsigned int nilfs_rec_len_from_disk(__le16 dlen)
|
||||
{
|
||||
unsigned int len = le16_to_cpu(dlen);
|
||||
|
||||
#if (PAGE_SIZE >= 65536)
|
||||
if (len == NILFS_MAX_REC_LEN)
|
||||
return 1 << 16;
|
||||
#endif
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline __le16 nilfs_rec_len_to_disk(unsigned int len)
|
||||
{
|
||||
#if (PAGE_SIZE >= 65536)
|
||||
if (len == (1 << 16))
|
||||
return cpu_to_le16(NILFS_MAX_REC_LEN);
|
||||
|
||||
BUG_ON(len > (1 << 16));
|
||||
#endif
|
||||
return cpu_to_le16(len);
|
||||
}
|
||||
|
||||
/*
|
||||
* nilfs uses block-sized chunks. Arguably, sector-sized ones would be
|
||||
* more robust, but we have what we have
|
||||
|
|
|
@ -24,16 +24,6 @@
|
|||
#include "bmap.h"
|
||||
|
||||
|
||||
/**
|
||||
* struct nilfs_direct_node - direct node
|
||||
* @dn_flags: flags
|
||||
* @dn_pad: padding
|
||||
*/
|
||||
struct nilfs_direct_node {
|
||||
__u8 dn_flags;
|
||||
__u8 pad[7];
|
||||
};
|
||||
|
||||
#define NILFS_DIRECT_NBLOCKS (NILFS_BMAP_SIZE / sizeof(__le64) - 1)
|
||||
#define NILFS_DIRECT_KEY_MIN 0
|
||||
#define NILFS_DIRECT_KEY_MAX (NILFS_DIRECT_NBLOCKS - 1)
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "mdt.h"
|
||||
#include "alloc.h"
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <linux/compat.h> /* compat_ptr() */
|
||||
#include <linux/mount.h> /* mnt_want_write_file(), mnt_drop_write_file() */
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "nilfs.h"
|
||||
#include "segment.h"
|
||||
#include "bmap.h"
|
||||
|
|
|
@ -23,7 +23,8 @@
|
|||
#include <linux/buffer_head.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include <linux/nilfs2_api.h>
|
||||
#include <linux/nilfs2_ondisk.h>
|
||||
#include "the_nilfs.h"
|
||||
#include "bmap.h"
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "nilfs.h"
|
||||
|
||||
struct nilfs_root;
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "mdt.h"
|
||||
#include "sufile.h"
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "mdt.h"
|
||||
|
||||
|
||||
|
|
292
include/uapi/linux/nilfs2_api.h
Normal file
292
include/uapi/linux/nilfs2_api.h
Normal file
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
* nilfs2_api.h - NILFS2 user space API
|
||||
*
|
||||
* Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_NILFS2_API_H
|
||||
#define _LINUX_NILFS2_API_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
/**
|
||||
* struct nilfs_cpinfo - checkpoint information
|
||||
* @ci_flags: flags
|
||||
* @ci_pad: padding
|
||||
* @ci_cno: checkpoint number
|
||||
* @ci_create: creation timestamp
|
||||
* @ci_nblk_inc: number of blocks incremented by this checkpoint
|
||||
* @ci_inodes_count: inodes count
|
||||
* @ci_blocks_count: blocks count
|
||||
* @ci_next: next checkpoint number in snapshot list
|
||||
*/
|
||||
struct nilfs_cpinfo {
|
||||
__u32 ci_flags;
|
||||
__u32 ci_pad;
|
||||
__u64 ci_cno;
|
||||
__u64 ci_create;
|
||||
__u64 ci_nblk_inc;
|
||||
__u64 ci_inodes_count;
|
||||
__u64 ci_blocks_count;
|
||||
__u64 ci_next;
|
||||
};
|
||||
|
||||
/* checkpoint flags */
|
||||
enum {
|
||||
NILFS_CPINFO_SNAPSHOT,
|
||||
NILFS_CPINFO_INVALID,
|
||||
NILFS_CPINFO_SKETCH,
|
||||
NILFS_CPINFO_MINOR,
|
||||
};
|
||||
|
||||
#define NILFS_CPINFO_FNS(flag, name) \
|
||||
static inline int \
|
||||
nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \
|
||||
{ \
|
||||
return !!(cpinfo->ci_flags & (1UL << NILFS_CPINFO_##flag)); \
|
||||
}
|
||||
|
||||
NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
|
||||
NILFS_CPINFO_FNS(INVALID, invalid)
|
||||
NILFS_CPINFO_FNS(MINOR, minor)
|
||||
|
||||
/**
|
||||
* nilfs_suinfo - segment usage information
|
||||
* @sui_lastmod: timestamp of last modification
|
||||
* @sui_nblocks: number of written blocks in segment
|
||||
* @sui_flags: segment usage flags
|
||||
*/
|
||||
struct nilfs_suinfo {
|
||||
__u64 sui_lastmod;
|
||||
__u32 sui_nblocks;
|
||||
__u32 sui_flags;
|
||||
};
|
||||
|
||||
/* segment usage flags */
|
||||
enum {
|
||||
NILFS_SUINFO_ACTIVE,
|
||||
NILFS_SUINFO_DIRTY,
|
||||
NILFS_SUINFO_ERROR,
|
||||
};
|
||||
|
||||
#define NILFS_SUINFO_FNS(flag, name) \
|
||||
static inline int \
|
||||
nilfs_suinfo_##name(const struct nilfs_suinfo *si) \
|
||||
{ \
|
||||
return si->sui_flags & (1UL << NILFS_SUINFO_##flag); \
|
||||
}
|
||||
|
||||
NILFS_SUINFO_FNS(ACTIVE, active)
|
||||
NILFS_SUINFO_FNS(DIRTY, dirty)
|
||||
NILFS_SUINFO_FNS(ERROR, error)
|
||||
|
||||
static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
|
||||
{
|
||||
return !si->sui_flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* nilfs_suinfo_update - segment usage information update
|
||||
* @sup_segnum: segment number
|
||||
* @sup_flags: flags for which fields are active in sup_sui
|
||||
* @sup_reserved: reserved necessary for alignment
|
||||
* @sup_sui: segment usage information
|
||||
*/
|
||||
struct nilfs_suinfo_update {
|
||||
__u64 sup_segnum;
|
||||
__u32 sup_flags;
|
||||
__u32 sup_reserved;
|
||||
struct nilfs_suinfo sup_sui;
|
||||
};
|
||||
|
||||
enum {
|
||||
NILFS_SUINFO_UPDATE_LASTMOD,
|
||||
NILFS_SUINFO_UPDATE_NBLOCKS,
|
||||
NILFS_SUINFO_UPDATE_FLAGS,
|
||||
__NR_NILFS_SUINFO_UPDATE_FIELDS,
|
||||
};
|
||||
|
||||
#define NILFS_SUINFO_UPDATE_FNS(flag, name) \
|
||||
static inline void \
|
||||
nilfs_suinfo_update_set_##name(struct nilfs_suinfo_update *sup) \
|
||||
{ \
|
||||
sup->sup_flags |= 1UL << NILFS_SUINFO_UPDATE_##flag; \
|
||||
} \
|
||||
static inline void \
|
||||
nilfs_suinfo_update_clear_##name(struct nilfs_suinfo_update *sup) \
|
||||
{ \
|
||||
sup->sup_flags &= ~(1UL << NILFS_SUINFO_UPDATE_##flag); \
|
||||
} \
|
||||
static inline int \
|
||||
nilfs_suinfo_update_##name(const struct nilfs_suinfo_update *sup) \
|
||||
{ \
|
||||
return !!(sup->sup_flags & (1UL << NILFS_SUINFO_UPDATE_##flag));\
|
||||
}
|
||||
|
||||
NILFS_SUINFO_UPDATE_FNS(LASTMOD, lastmod)
|
||||
NILFS_SUINFO_UPDATE_FNS(NBLOCKS, nblocks)
|
||||
NILFS_SUINFO_UPDATE_FNS(FLAGS, flags)
|
||||
|
||||
enum {
|
||||
NILFS_CHECKPOINT,
|
||||
NILFS_SNAPSHOT,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_cpmode - change checkpoint mode structure
|
||||
* @cm_cno: checkpoint number
|
||||
* @cm_mode: mode of checkpoint
|
||||
* @cm_pad: padding
|
||||
*/
|
||||
struct nilfs_cpmode {
|
||||
__u64 cm_cno;
|
||||
__u32 cm_mode;
|
||||
__u32 cm_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_argv - argument vector
|
||||
* @v_base: pointer on data array from userspace
|
||||
* @v_nmembs: number of members in data array
|
||||
* @v_size: size of data array in bytes
|
||||
* @v_flags: flags
|
||||
* @v_index: start number of target data items
|
||||
*/
|
||||
struct nilfs_argv {
|
||||
__u64 v_base;
|
||||
__u32 v_nmembs; /* number of members */
|
||||
__u16 v_size; /* size of members */
|
||||
__u16 v_flags;
|
||||
__u64 v_index;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_period - period of checkpoint numbers
|
||||
* @p_start: start checkpoint number (inclusive)
|
||||
* @p_end: end checkpoint number (exclusive)
|
||||
*/
|
||||
struct nilfs_period {
|
||||
__u64 p_start;
|
||||
__u64 p_end;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_cpstat - checkpoint statistics
|
||||
* @cs_cno: checkpoint number
|
||||
* @cs_ncps: number of checkpoints
|
||||
* @cs_nsss: number of snapshots
|
||||
*/
|
||||
struct nilfs_cpstat {
|
||||
__u64 cs_cno;
|
||||
__u64 cs_ncps;
|
||||
__u64 cs_nsss;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_sustat - segment usage statistics
|
||||
* @ss_nsegs: number of segments
|
||||
* @ss_ncleansegs: number of clean segments
|
||||
* @ss_ndirtysegs: number of dirty segments
|
||||
* @ss_ctime: creation time of the last segment
|
||||
* @ss_nongc_ctime: creation time of the last segment not for GC
|
||||
* @ss_prot_seq: least sequence number of segments which must not be reclaimed
|
||||
*/
|
||||
struct nilfs_sustat {
|
||||
__u64 ss_nsegs;
|
||||
__u64 ss_ncleansegs;
|
||||
__u64 ss_ndirtysegs;
|
||||
__u64 ss_ctime;
|
||||
__u64 ss_nongc_ctime;
|
||||
__u64 ss_prot_seq;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_vinfo - virtual block number information
|
||||
* @vi_vblocknr: virtual block number
|
||||
* @vi_start: start checkpoint number (inclusive)
|
||||
* @vi_end: end checkpoint number (exclusive)
|
||||
* @vi_blocknr: disk block number
|
||||
*/
|
||||
struct nilfs_vinfo {
|
||||
__u64 vi_vblocknr;
|
||||
__u64 vi_start;
|
||||
__u64 vi_end;
|
||||
__u64 vi_blocknr;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_vdesc - descriptor of virtual block number
|
||||
* @vd_ino: inode number
|
||||
* @vd_cno: checkpoint number
|
||||
* @vd_vblocknr: virtual block number
|
||||
* @vd_period: period of checkpoint numbers
|
||||
* @vd_blocknr: disk block number
|
||||
* @vd_offset: logical block offset inside a file
|
||||
* @vd_flags: flags (data or node block)
|
||||
* @vd_pad: padding
|
||||
*/
|
||||
struct nilfs_vdesc {
|
||||
__u64 vd_ino;
|
||||
__u64 vd_cno;
|
||||
__u64 vd_vblocknr;
|
||||
struct nilfs_period vd_period;
|
||||
__u64 vd_blocknr;
|
||||
__u64 vd_offset;
|
||||
__u32 vd_flags;
|
||||
__u32 vd_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_bdesc - descriptor of disk block number
|
||||
* @bd_ino: inode number
|
||||
* @bd_oblocknr: disk block address (for skipping dead blocks)
|
||||
* @bd_blocknr: disk block address
|
||||
* @bd_offset: logical block offset inside a file
|
||||
* @bd_level: level in the b-tree organization
|
||||
* @bd_pad: padding
|
||||
*/
|
||||
struct nilfs_bdesc {
|
||||
__u64 bd_ino;
|
||||
__u64 bd_oblocknr;
|
||||
__u64 bd_blocknr;
|
||||
__u64 bd_offset;
|
||||
__u32 bd_level;
|
||||
__u32 bd_pad;
|
||||
};
|
||||
|
||||
#define NILFS_IOCTL_IDENT 'n'
|
||||
|
||||
#define NILFS_IOCTL_CHANGE_CPMODE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
|
||||
#define NILFS_IOCTL_DELETE_CHECKPOINT \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
|
||||
#define NILFS_IOCTL_GET_CPINFO \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_CPSTAT \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
|
||||
#define NILFS_IOCTL_GET_SUINFO \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_SUSTAT \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
|
||||
#define NILFS_IOCTL_GET_VINFO \
|
||||
_IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_BDESCS \
|
||||
_IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_CLEAN_SEGMENTS \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
|
||||
#define NILFS_IOCTL_SYNC \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
|
||||
#define NILFS_IOCTL_RESIZE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
|
||||
#define NILFS_IOCTL_SET_ALLOC_RANGE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2])
|
||||
#define NILFS_IOCTL_SET_SUINFO \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8D, struct nilfs_argv)
|
||||
|
||||
#endif /* _LINUX_NILFS2_API_H */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* nilfs2_fs.h - NILFS2 on-disk structures and common declarations.
|
||||
* nilfs2_ondisk.h - NILFS2 on-disk structures
|
||||
*
|
||||
* Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
|
||||
*
|
||||
|
@ -7,13 +7,6 @@
|
|||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* Written by Koji Sato and Ryusuke Konishi.
|
||||
*/
|
||||
/*
|
||||
* linux/include/linux/ext2_fs.h
|
||||
|
@ -30,16 +23,15 @@
|
|||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_NILFS_FS_H
|
||||
#define _LINUX_NILFS_FS_H
|
||||
#ifndef _LINUX_NILFS2_ONDISK_H
|
||||
#define _LINUX_NILFS2_ONDISK_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
|
||||
#define NILFS_INODE_BMAP_SIZE 7
|
||||
|
||||
/**
|
||||
* struct nilfs_inode - structure of an inode on disk
|
||||
* @i_blocks: blocks count
|
||||
|
@ -56,7 +48,7 @@
|
|||
* @i_bmap: block mapping
|
||||
* @i_xattr: extended attributes
|
||||
* @i_generation: file generation (for NFS)
|
||||
* @i_pad: padding
|
||||
* @i_pad: padding
|
||||
*/
|
||||
struct nilfs_inode {
|
||||
__le64 i_blocks;
|
||||
|
@ -338,29 +330,7 @@ enum {
|
|||
#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1)
|
||||
#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \
|
||||
~NILFS_DIR_ROUND)
|
||||
#define NILFS_MAX_REC_LEN ((1<<16)-1)
|
||||
|
||||
static inline unsigned int nilfs_rec_len_from_disk(__le16 dlen)
|
||||
{
|
||||
unsigned int len = le16_to_cpu(dlen);
|
||||
|
||||
#if !defined(__KERNEL__) || (PAGE_SIZE >= 65536)
|
||||
if (len == NILFS_MAX_REC_LEN)
|
||||
return 1 << 16;
|
||||
#endif
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline __le16 nilfs_rec_len_to_disk(unsigned int len)
|
||||
{
|
||||
#if !defined(__KERNEL__) || (PAGE_SIZE >= 65536)
|
||||
if (len == (1 << 16))
|
||||
return cpu_to_le16(NILFS_MAX_REC_LEN);
|
||||
else if (len > (1 << 16))
|
||||
BUG();
|
||||
#endif
|
||||
return cpu_to_le16(len);
|
||||
}
|
||||
#define NILFS_MAX_REC_LEN ((1 << 16) - 1)
|
||||
|
||||
/**
|
||||
* struct nilfs_finfo - file information
|
||||
|
@ -374,11 +344,10 @@ struct nilfs_finfo {
|
|||
__le64 fi_cno;
|
||||
__le32 fi_nblocks;
|
||||
__le32 fi_ndatablk;
|
||||
/* array of virtual block numbers */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_binfo_v - information for the block to which a virtual block number is assigned
|
||||
* struct nilfs_binfo_v - information on a data block (except DAT)
|
||||
* @bi_vblocknr: virtual block number
|
||||
* @bi_blkoff: block offset
|
||||
*/
|
||||
|
@ -388,7 +357,7 @@ struct nilfs_binfo_v {
|
|||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_binfo_dat - information for the block which belongs to the DAT file
|
||||
* struct nilfs_binfo_dat - information on a DAT node block
|
||||
* @bi_blkoff: block offset
|
||||
* @bi_level: level
|
||||
* @bi_pad: padding
|
||||
|
@ -454,7 +423,7 @@ struct nilfs_segment_summary {
|
|||
#define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */
|
||||
|
||||
/**
|
||||
* struct nilfs_btree_node - B-tree node
|
||||
* struct nilfs_btree_node - header of B-tree node block
|
||||
* @bn_flags: flags
|
||||
* @bn_level: level
|
||||
* @bn_nchildren: number of children
|
||||
|
@ -475,6 +444,16 @@ struct nilfs_btree_node {
|
|||
#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
|
||||
#define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */
|
||||
|
||||
/**
|
||||
* struct nilfs_direct_node - header of built-in bmap array
|
||||
* @dn_flags: flags
|
||||
* @dn_pad: padding
|
||||
*/
|
||||
struct nilfs_direct_node {
|
||||
__u8 dn_flags;
|
||||
__u8 pad[7];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_palloc_group_desc - block group descriptor
|
||||
* @pg_nfrees: number of free entries in block group
|
||||
|
@ -573,40 +552,6 @@ NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
|
|||
NILFS_CHECKPOINT_FNS(INVALID, invalid)
|
||||
NILFS_CHECKPOINT_FNS(MINOR, minor)
|
||||
|
||||
/**
|
||||
* struct nilfs_cpinfo - checkpoint information
|
||||
* @ci_flags: flags
|
||||
* @ci_pad: padding
|
||||
* @ci_cno: checkpoint number
|
||||
* @ci_create: creation timestamp
|
||||
* @ci_nblk_inc: number of blocks incremented by this checkpoint
|
||||
* @ci_inodes_count: inodes count
|
||||
* @ci_blocks_count: blocks count
|
||||
* @ci_next: next checkpoint number in snapshot list
|
||||
*/
|
||||
struct nilfs_cpinfo {
|
||||
__u32 ci_flags;
|
||||
__u32 ci_pad;
|
||||
__u64 ci_cno;
|
||||
__u64 ci_create;
|
||||
__u64 ci_nblk_inc;
|
||||
__u64 ci_inodes_count;
|
||||
__u64 ci_blocks_count;
|
||||
__u64 ci_next;
|
||||
};
|
||||
|
||||
#define NILFS_CPINFO_FNS(flag, name) \
|
||||
static inline int \
|
||||
nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \
|
||||
{ \
|
||||
return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \
|
||||
}
|
||||
|
||||
NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
|
||||
NILFS_CPINFO_FNS(INVALID, invalid)
|
||||
NILFS_CPINFO_FNS(MINOR, minor)
|
||||
|
||||
|
||||
/**
|
||||
* struct nilfs_cpfile_header - checkpoint file header
|
||||
* @ch_ncheckpoints: number of checkpoints
|
||||
|
@ -619,7 +564,7 @@ struct nilfs_cpfile_header {
|
|||
struct nilfs_snapshot_list ch_snapshot_list;
|
||||
};
|
||||
|
||||
#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \
|
||||
#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \
|
||||
((sizeof(struct nilfs_cpfile_header) + \
|
||||
sizeof(struct nilfs_checkpoint) - 1) / \
|
||||
sizeof(struct nilfs_checkpoint))
|
||||
|
@ -643,8 +588,6 @@ enum {
|
|||
NILFS_SEGMENT_USAGE_ACTIVE,
|
||||
NILFS_SEGMENT_USAGE_DIRTY,
|
||||
NILFS_SEGMENT_USAGE_ERROR,
|
||||
|
||||
/* ... */
|
||||
};
|
||||
|
||||
#define NILFS_SEGMENT_USAGE_FNS(flag, name) \
|
||||
|
@ -699,236 +642,9 @@ struct nilfs_sufile_header {
|
|||
/* ... */
|
||||
};
|
||||
|
||||
#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \
|
||||
#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \
|
||||
((sizeof(struct nilfs_sufile_header) + \
|
||||
sizeof(struct nilfs_segment_usage) - 1) / \
|
||||
sizeof(struct nilfs_segment_usage))
|
||||
|
||||
/**
|
||||
* nilfs_suinfo - segment usage information
|
||||
* @sui_lastmod: timestamp of last modification
|
||||
* @sui_nblocks: number of written blocks in segment
|
||||
* @sui_flags: segment usage flags
|
||||
*/
|
||||
struct nilfs_suinfo {
|
||||
__u64 sui_lastmod;
|
||||
__u32 sui_nblocks;
|
||||
__u32 sui_flags;
|
||||
};
|
||||
|
||||
#define NILFS_SUINFO_FNS(flag, name) \
|
||||
static inline int \
|
||||
nilfs_suinfo_##name(const struct nilfs_suinfo *si) \
|
||||
{ \
|
||||
return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag); \
|
||||
}
|
||||
|
||||
NILFS_SUINFO_FNS(ACTIVE, active)
|
||||
NILFS_SUINFO_FNS(DIRTY, dirty)
|
||||
NILFS_SUINFO_FNS(ERROR, error)
|
||||
|
||||
static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
|
||||
{
|
||||
return !si->sui_flags;
|
||||
}
|
||||
|
||||
/* ioctl */
|
||||
/**
|
||||
* nilfs_suinfo_update - segment usage information update
|
||||
* @sup_segnum: segment number
|
||||
* @sup_flags: flags for which fields are active in sup_sui
|
||||
* @sup_reserved: reserved necessary for alignment
|
||||
* @sup_sui: segment usage information
|
||||
*/
|
||||
struct nilfs_suinfo_update {
|
||||
__u64 sup_segnum;
|
||||
__u32 sup_flags;
|
||||
__u32 sup_reserved;
|
||||
struct nilfs_suinfo sup_sui;
|
||||
};
|
||||
|
||||
enum {
|
||||
NILFS_SUINFO_UPDATE_LASTMOD,
|
||||
NILFS_SUINFO_UPDATE_NBLOCKS,
|
||||
NILFS_SUINFO_UPDATE_FLAGS,
|
||||
__NR_NILFS_SUINFO_UPDATE_FIELDS,
|
||||
};
|
||||
|
||||
#define NILFS_SUINFO_UPDATE_FNS(flag, name) \
|
||||
static inline void \
|
||||
nilfs_suinfo_update_set_##name(struct nilfs_suinfo_update *sup) \
|
||||
{ \
|
||||
sup->sup_flags |= 1UL << NILFS_SUINFO_UPDATE_##flag; \
|
||||
} \
|
||||
static inline void \
|
||||
nilfs_suinfo_update_clear_##name(struct nilfs_suinfo_update *sup) \
|
||||
{ \
|
||||
sup->sup_flags &= ~(1UL << NILFS_SUINFO_UPDATE_##flag); \
|
||||
} \
|
||||
static inline int \
|
||||
nilfs_suinfo_update_##name(const struct nilfs_suinfo_update *sup) \
|
||||
{ \
|
||||
return !!(sup->sup_flags & (1UL << NILFS_SUINFO_UPDATE_##flag));\
|
||||
}
|
||||
|
||||
NILFS_SUINFO_UPDATE_FNS(LASTMOD, lastmod)
|
||||
NILFS_SUINFO_UPDATE_FNS(NBLOCKS, nblocks)
|
||||
NILFS_SUINFO_UPDATE_FNS(FLAGS, flags)
|
||||
|
||||
enum {
|
||||
NILFS_CHECKPOINT,
|
||||
NILFS_SNAPSHOT,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_cpmode - change checkpoint mode structure
|
||||
* @cm_cno: checkpoint number
|
||||
* @cm_mode: mode of checkpoint
|
||||
* @cm_pad: padding
|
||||
*/
|
||||
struct nilfs_cpmode {
|
||||
__u64 cm_cno;
|
||||
__u32 cm_mode;
|
||||
__u32 cm_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_argv - argument vector
|
||||
* @v_base: pointer on data array from userspace
|
||||
* @v_nmembs: number of members in data array
|
||||
* @v_size: size of data array in bytes
|
||||
* @v_flags: flags
|
||||
* @v_index: start number of target data items
|
||||
*/
|
||||
struct nilfs_argv {
|
||||
__u64 v_base;
|
||||
__u32 v_nmembs; /* number of members */
|
||||
__u16 v_size; /* size of members */
|
||||
__u16 v_flags;
|
||||
__u64 v_index;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_period - period of checkpoint numbers
|
||||
* @p_start: start checkpoint number (inclusive)
|
||||
* @p_end: end checkpoint number (exclusive)
|
||||
*/
|
||||
struct nilfs_period {
|
||||
__u64 p_start;
|
||||
__u64 p_end;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_cpstat - checkpoint statistics
|
||||
* @cs_cno: checkpoint number
|
||||
* @cs_ncps: number of checkpoints
|
||||
* @cs_nsss: number of snapshots
|
||||
*/
|
||||
struct nilfs_cpstat {
|
||||
__u64 cs_cno;
|
||||
__u64 cs_ncps;
|
||||
__u64 cs_nsss;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_sustat - segment usage statistics
|
||||
* @ss_nsegs: number of segments
|
||||
* @ss_ncleansegs: number of clean segments
|
||||
* @ss_ndirtysegs: number of dirty segments
|
||||
* @ss_ctime: creation time of the last segment
|
||||
* @ss_nongc_ctime: creation time of the last segment not for GC
|
||||
* @ss_prot_seq: least sequence number of segments which must not be reclaimed
|
||||
*/
|
||||
struct nilfs_sustat {
|
||||
__u64 ss_nsegs;
|
||||
__u64 ss_ncleansegs;
|
||||
__u64 ss_ndirtysegs;
|
||||
__u64 ss_ctime;
|
||||
__u64 ss_nongc_ctime;
|
||||
__u64 ss_prot_seq;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_vinfo - virtual block number information
|
||||
* @vi_vblocknr: virtual block number
|
||||
* @vi_start: start checkpoint number (inclusive)
|
||||
* @vi_end: end checkpoint number (exclusive)
|
||||
* @vi_blocknr: disk block number
|
||||
*/
|
||||
struct nilfs_vinfo {
|
||||
__u64 vi_vblocknr;
|
||||
__u64 vi_start;
|
||||
__u64 vi_end;
|
||||
__u64 vi_blocknr;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_vdesc - descriptor of virtual block number
|
||||
* @vd_ino: inode number
|
||||
* @vd_cno: checkpoint number
|
||||
* @vd_vblocknr: virtual block number
|
||||
* @vd_period: period of checkpoint numbers
|
||||
* @vd_blocknr: disk block number
|
||||
* @vd_offset: logical block offset inside a file
|
||||
* @vd_flags: flags (data or node block)
|
||||
* @vd_pad: padding
|
||||
*/
|
||||
struct nilfs_vdesc {
|
||||
__u64 vd_ino;
|
||||
__u64 vd_cno;
|
||||
__u64 vd_vblocknr;
|
||||
struct nilfs_period vd_period;
|
||||
__u64 vd_blocknr;
|
||||
__u64 vd_offset;
|
||||
__u32 vd_flags;
|
||||
__u32 vd_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_bdesc - descriptor of disk block number
|
||||
* @bd_ino: inode number
|
||||
* @bd_oblocknr: disk block address (for skipping dead blocks)
|
||||
* @bd_blocknr: disk block address
|
||||
* @bd_offset: logical block offset inside a file
|
||||
* @bd_level: level in the b-tree organization
|
||||
* @bd_pad: padding
|
||||
*/
|
||||
struct nilfs_bdesc {
|
||||
__u64 bd_ino;
|
||||
__u64 bd_oblocknr;
|
||||
__u64 bd_blocknr;
|
||||
__u64 bd_offset;
|
||||
__u32 bd_level;
|
||||
__u32 bd_pad;
|
||||
};
|
||||
|
||||
#define NILFS_IOCTL_IDENT 'n'
|
||||
|
||||
#define NILFS_IOCTL_CHANGE_CPMODE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
|
||||
#define NILFS_IOCTL_DELETE_CHECKPOINT \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
|
||||
#define NILFS_IOCTL_GET_CPINFO \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_CPSTAT \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
|
||||
#define NILFS_IOCTL_GET_SUINFO \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_SUSTAT \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
|
||||
#define NILFS_IOCTL_GET_VINFO \
|
||||
_IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_BDESCS \
|
||||
_IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_CLEAN_SEGMENTS \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
|
||||
#define NILFS_IOCTL_SYNC \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
|
||||
#define NILFS_IOCTL_RESIZE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
|
||||
#define NILFS_IOCTL_SET_ALLOC_RANGE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2])
|
||||
#define NILFS_IOCTL_SET_SUINFO \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8D, struct nilfs_argv)
|
||||
|
||||
#endif /* _LINUX_NILFS_FS_H */
|
||||
#endif /* _LINUX_NILFS2_ONDISK_H */
|
Loading…
Reference in a new issue