1994-05-24 10:09:53 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 1991, 1993, 1994
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
1997-02-10 02:22:35 +00:00
|
|
|
* @(#)ffs_extern.h 8.6 (Berkeley) 3/30/95
|
1999-08-28 01:08:13 +00:00
|
|
|
* $FreeBSD$
|
1994-05-24 10:09:53 +00:00
|
|
|
*/
|
|
|
|
|
1996-05-01 02:16:17 +00:00
|
|
|
#ifndef _UFS_FFS_EXTERN_H
|
|
|
|
#define _UFS_FFS_EXTERN_H
|
|
|
|
|
2011-06-16 23:40:10 +00:00
|
|
|
#ifndef _KERNEL
|
|
|
|
#error "No user-serving parts inside"
|
|
|
|
#else
|
|
|
|
|
1997-02-10 02:22:35 +00:00
|
|
|
struct buf;
|
2001-05-30 23:08:40 +00:00
|
|
|
struct cg;
|
1994-05-24 10:09:53 +00:00
|
|
|
struct fid;
|
|
|
|
struct fs;
|
|
|
|
struct inode;
|
1998-02-03 21:52:02 +00:00
|
|
|
struct malloc_type;
|
1994-05-24 10:09:53 +00:00
|
|
|
struct mount;
|
2001-09-12 08:38:13 +00:00
|
|
|
struct thread;
|
1997-08-16 19:16:27 +00:00
|
|
|
struct sockaddr;
|
1994-05-24 10:09:53 +00:00
|
|
|
struct statfs;
|
1998-02-03 21:52:02 +00:00
|
|
|
struct ucred;
|
1994-05-24 10:09:53 +00:00
|
|
|
struct vnode;
|
1998-03-23 14:12:37 +00:00
|
|
|
struct vop_fsync_args;
|
1998-02-03 21:52:02 +00:00
|
|
|
struct vop_reallocblks_args;
|
2010-04-24 07:05:35 +00:00
|
|
|
struct workhead;
|
1994-05-24 10:09:53 +00:00
|
|
|
|
2009-01-27 21:48:47 +00:00
|
|
|
int ffs_alloc(struct inode *, ufs2_daddr_t, ufs2_daddr_t, int, int,
|
|
|
|
struct ucred *, ufs2_daddr_t *);
|
2002-06-21 06:18:05 +00:00
|
|
|
int ffs_balloc_ufs1(struct vnode *a_vp, off_t a_startoffset, int a_size,
|
|
|
|
struct ucred *a_cred, int a_flags, struct buf **a_bpp);
|
|
|
|
int ffs_balloc_ufs2(struct vnode *a_vp, off_t a_startoffset, int a_size,
|
2002-03-19 22:40:48 +00:00
|
|
|
struct ucred *a_cred, int a_flags, struct buf **a_bpp);
|
|
|
|
int ffs_blkatoff(struct vnode *, off_t, char **, struct buf **);
|
2005-01-24 10:02:11 +00:00
|
|
|
void ffs_blkfree(struct ufsmount *, struct fs *, struct vnode *,
|
2011-06-15 23:19:09 +00:00
|
|
|
ufs2_daddr_t, long, ino_t, enum vtype, struct workhead *);
|
2002-06-21 06:18:05 +00:00
|
|
|
ufs2_daddr_t ffs_blkpref_ufs1(struct inode *, ufs_lbn_t, int, ufs1_daddr_t *);
|
|
|
|
ufs2_daddr_t ffs_blkpref_ufs2(struct inode *, ufs_lbn_t, int, ufs2_daddr_t *);
|
2003-02-22 00:29:51 +00:00
|
|
|
int ffs_checkfreefile(struct fs *, struct vnode *, ino_t);
|
2002-06-21 06:18:05 +00:00
|
|
|
void ffs_clrblock(struct fs *, u_char *, ufs1_daddr_t);
|
2010-04-24 07:05:35 +00:00
|
|
|
void ffs_clusteracct(struct fs *, struct cg *, ufs1_daddr_t, int);
|
Cylinder group bitmaps and blocks containing inode for a snapshot
file are after snaplock, while other ffs device buffers are before
snaplock in global lock order. By itself, this could cause deadlock
when bdwrite() tries to flush dirty buffers on snapshotted ffs. If,
during the flush, COW activity for snapshot needs to allocate block
and ffs_alloccg() selects the cylinder group that is being written
by bdwrite(), then kernel would panic due to recursive buffer lock
acquision.
Avoid dealing with buffers in bdwrite() that are from other side of
snaplock divisor in the lock order then the buffer being written. Add
new BOP, bop_bdwrite(), to do dirty buffer flushing for same vnode in
the bdwrite(). Default implementation, bufbdflush(), refactors the code
from bdwrite(). For ffs device buffers, specialized implementation is
used.
Reviewed by: tegge, jeff, Russell Cattelan (cattelan xfs org, xfs changes)
Tested by: Peter Holm
X-MFC after: 3 weeks (if ever: it changes ABI)
2007-01-23 10:01:19 +00:00
|
|
|
void ffs_bdflush(struct bufobj *, struct buf *);
|
2004-10-26 06:25:56 +00:00
|
|
|
int ffs_copyonwrite(struct vnode *, struct buf *);
|
2002-03-19 22:40:48 +00:00
|
|
|
int ffs_flushfiles(struct mount *, int, struct thread *);
|
|
|
|
void ffs_fragacct(struct fs *, int, int32_t [], int);
|
2005-01-24 10:02:11 +00:00
|
|
|
int ffs_freefile(struct ufsmount *, struct fs *, struct vnode *, ino_t,
|
2010-04-24 07:05:35 +00:00
|
|
|
int, struct workhead *);
|
2011-06-15 18:05:08 +00:00
|
|
|
void ffs_fserr(struct fs *, ino_t, char *);
|
2002-06-21 06:18:05 +00:00
|
|
|
int ffs_isblock(struct fs *, u_char *, ufs1_daddr_t);
|
2010-04-24 07:05:35 +00:00
|
|
|
int ffs_isfreeblock(struct fs *, u_char *, ufs1_daddr_t);
|
2002-12-27 10:23:03 +00:00
|
|
|
void ffs_load_inode(struct buf *, struct inode *, struct fs *, ino_t);
|
2002-03-19 22:40:48 +00:00
|
|
|
int ffs_mountroot(void);
|
2010-04-24 07:05:35 +00:00
|
|
|
void ffs_oldfscompat_write(struct fs *, struct ufsmount *);
|
2002-03-19 22:40:48 +00:00
|
|
|
int ffs_reallocblks(struct vop_reallocblks_args *);
|
Add support to UFS2 to provide storage for extended attributes.
As this code is not actually used by any of the existing
interfaces, it seems unlikely to break anything (famous
last words).
The internal kernel interface to manipulate these attributes
is invoked using two new IO_ flags: IO_NORMAL and IO_EXT.
These flags may be specified in the ioflags word of VOP_READ,
VOP_WRITE, and VOP_TRUNCATE. Specifying IO_NORMAL means that
you want to do I/O to the normal data part of the file and
IO_EXT means that you want to do I/O to the extended attributes
part of the file. IO_NORMAL and IO_EXT are mutually exclusive
for VOP_READ and VOP_WRITE, but may be specified individually
or together in the case of VOP_TRUNCATE. For example, when
removing a file, VOP_TRUNCATE is called with both IO_NORMAL
and IO_EXT set. For backward compatibility, if neither IO_NORMAL
nor IO_EXT is set, then IO_NORMAL is assumed.
Note that the BA_ and IO_ flags have been `merged' so that they
may both be used in the same flags word. This merger is possible
by assigning the IO_ flags to the low sixteen bits and the BA_
flags the high sixteen bits. This works because the high sixteen
bits of the IO_ word is reserved for read-ahead and help with
write clustering so will never be used for flags. This merge
lets us get away from code of the form:
if (ioflags & IO_SYNC)
flags |= BA_SYNC;
For the future, I have considered adding a new field to the
vattr structure, va_extsize. This addition could then be
exported through the stat structure to allow applications to
find out the size of the extended attribute storage and also
would provide a more standard interface for truncating them
(via VOP_SETATTR rather than VOP_TRUNCATE).
I am also contemplating adding a pathconf parameter (for
concreteness, lets call it _PC_MAX_EXTSIZE) which would
let an application determine the maximum size of the extended
atribute storage.
Sponsored by: DARPA & NAI Labs.
2002-07-19 07:29:39 +00:00
|
|
|
int ffs_realloccg(struct inode *, ufs2_daddr_t, ufs2_daddr_t,
|
2009-01-27 21:48:47 +00:00
|
|
|
ufs2_daddr_t, int, int, int, struct ucred *, struct buf **);
|
2006-10-31 21:48:54 +00:00
|
|
|
int ffs_sbupdate(struct ufsmount *, int, int);
|
2002-06-21 06:18:05 +00:00
|
|
|
void ffs_setblock(struct fs *, u_char *, ufs1_daddr_t);
|
2011-06-12 19:27:05 +00:00
|
|
|
int ffs_snapblkfree(struct fs *, struct vnode *, ufs2_daddr_t, long, ino_t,
|
2011-06-15 23:19:09 +00:00
|
|
|
enum vtype, struct workhead *);
|
2002-03-19 22:40:48 +00:00
|
|
|
void ffs_snapremove(struct vnode *vp);
|
|
|
|
int ffs_snapshot(struct mount *mp, char *snapfile);
|
|
|
|
void ffs_snapshot_mount(struct mount *mp);
|
|
|
|
void ffs_snapshot_unmount(struct mount *mp);
|
2008-09-16 11:51:06 +00:00
|
|
|
void process_deferred_inactive(struct mount *mp);
|
2011-06-12 19:27:05 +00:00
|
|
|
void ffs_sync_snap(struct mount *, int);
|
2005-02-08 16:25:50 +00:00
|
|
|
int ffs_syncvnode(struct vnode *vp, int waitfor);
|
2002-03-19 22:40:48 +00:00
|
|
|
int ffs_truncate(struct vnode *, off_t, int, struct ucred *, struct thread *);
|
|
|
|
int ffs_update(struct vnode *, int);
|
|
|
|
int ffs_valloc(struct vnode *, int, struct ucred *, struct vnode **);
|
VFS mega cleanup commit (x/N)
1. Add new file "sys/kern/vfs_default.c" where default actions for
VOPs go. Implement proper defaults for ABORTOP, BWRITE, LEASE,
POLL, REVOKE and STRATEGY. Various stuff spread over the entire
tree belongs here.
2. Change VOP_BLKATOFF to a normal function in cd9660.
3. Kill VOP_BLKATOFF, VOP_TRUNCATE, VOP_VFREE, VOP_VALLOC. These
are private interface functions between UFS and the underlying
storage manager layer (FFS/LFS/MFS/EXT2FS). The functions now
live in struct ufsmount instead.
4. Remove a kludge of VOP_ functions in all filesystems, that did
nothing but obscure the simplicity and break the expandability.
If a filesystem doesn't implement VOP_FOO, it shouldn't have an
entry for it in its vnops table. The system will try to DTRT
if it is not implemented. There are still some cruft left, but
the bulk of it is done.
5. Fix another VCALL in vfs_cache.c (thanks Bruce!)
1997-10-16 10:50:27 +00:00
|
|
|
|
2002-03-19 22:40:48 +00:00
|
|
|
int ffs_vfree(struct vnode *, ino_t, int);
|
2002-08-13 10:05:50 +00:00
|
|
|
vfs_vget_t ffs_vget;
|
2008-08-28 09:18:20 +00:00
|
|
|
int ffs_vgetf(struct mount *, ino_t, int, struct vnode **, int);
|
|
|
|
|
|
|
|
#define FFSV_FORCEINSMQ 0x0001
|
1994-05-24 10:09:53 +00:00
|
|
|
|
2005-02-08 21:03:52 +00:00
|
|
|
extern struct vop_vector ffs_vnodeops1;
|
|
|
|
extern struct vop_vector ffs_fifoops1;
|
|
|
|
extern struct vop_vector ffs_vnodeops2;
|
|
|
|
extern struct vop_vector ffs_fifoops2;
|
1996-05-01 02:16:17 +00:00
|
|
|
|
1998-03-08 09:59:44 +00:00
|
|
|
/*
|
|
|
|
* Soft update function prototypes.
|
|
|
|
*/
|
2006-03-08 23:43:39 +00:00
|
|
|
|
|
|
|
int softdep_check_suspend(struct mount *, struct vnode *,
|
|
|
|
int, int, int, int);
|
|
|
|
void softdep_get_depcounts(struct mount *, int *, int *);
|
2002-03-19 22:40:48 +00:00
|
|
|
void softdep_initialize(void);
|
2002-07-01 11:00:47 +00:00
|
|
|
void softdep_uninitialize(void);
|
2002-03-19 22:40:48 +00:00
|
|
|
int softdep_mount(struct vnode *, struct mount *, struct fs *,
|
|
|
|
struct ucred *);
|
2010-04-24 07:05:35 +00:00
|
|
|
void softdep_unmount(struct mount *);
|
|
|
|
int softdep_move_dependencies(struct buf *, struct buf *);
|
2002-03-19 22:40:48 +00:00
|
|
|
int softdep_flushworklist(struct mount *, int *, struct thread *);
|
|
|
|
int softdep_flushfiles(struct mount *, int, struct thread *);
|
|
|
|
void softdep_update_inodeblock(struct inode *, struct buf *, int);
|
|
|
|
void softdep_load_inodeblock(struct inode *);
|
|
|
|
void softdep_freefile(struct vnode *, ino_t, int);
|
2011-04-05 21:26:05 +00:00
|
|
|
int softdep_request_cleanup(struct fs *, struct vnode *,
|
|
|
|
struct ucred *, int);
|
Add support to UFS2 to provide storage for extended attributes.
As this code is not actually used by any of the existing
interfaces, it seems unlikely to break anything (famous
last words).
The internal kernel interface to manipulate these attributes
is invoked using two new IO_ flags: IO_NORMAL and IO_EXT.
These flags may be specified in the ioflags word of VOP_READ,
VOP_WRITE, and VOP_TRUNCATE. Specifying IO_NORMAL means that
you want to do I/O to the normal data part of the file and
IO_EXT means that you want to do I/O to the extended attributes
part of the file. IO_NORMAL and IO_EXT are mutually exclusive
for VOP_READ and VOP_WRITE, but may be specified individually
or together in the case of VOP_TRUNCATE. For example, when
removing a file, VOP_TRUNCATE is called with both IO_NORMAL
and IO_EXT set. For backward compatibility, if neither IO_NORMAL
nor IO_EXT is set, then IO_NORMAL is assumed.
Note that the BA_ and IO_ flags have been `merged' so that they
may both be used in the same flags word. This merger is possible
by assigning the IO_ flags to the low sixteen bits and the BA_
flags the high sixteen bits. This works because the high sixteen
bits of the IO_ word is reserved for read-ahead and help with
write clustering so will never be used for flags. This merge
lets us get away from code of the form:
if (ioflags & IO_SYNC)
flags |= BA_SYNC;
For the future, I have considered adding a new field to the
vattr structure, va_extsize. This addition could then be
exported through the stat structure to allow applications to
find out the size of the extended attribute storage and also
would provide a more standard interface for truncating them
(via VOP_SETATTR rather than VOP_TRUNCATE).
I am also contemplating adding a pathconf parameter (for
concreteness, lets call it _PC_MAX_EXTSIZE) which would
let an application determine the maximum size of the extended
atribute storage.
Sponsored by: DARPA & NAI Labs.
2002-07-19 07:29:39 +00:00
|
|
|
void softdep_setup_freeblocks(struct inode *, off_t, int);
|
2011-06-20 03:25:09 +00:00
|
|
|
void softdep_setup_inomapdep(struct buf *, struct inode *, ino_t, int);
|
2010-04-24 07:05:35 +00:00
|
|
|
void softdep_setup_blkmapdep(struct buf *, struct mount *, ufs2_daddr_t,
|
|
|
|
int, int);
|
2002-06-21 06:18:05 +00:00
|
|
|
void softdep_setup_allocdirect(struct inode *, ufs_lbn_t, ufs2_daddr_t,
|
|
|
|
ufs2_daddr_t, long, long, struct buf *);
|
Add support to UFS2 to provide storage for extended attributes.
As this code is not actually used by any of the existing
interfaces, it seems unlikely to break anything (famous
last words).
The internal kernel interface to manipulate these attributes
is invoked using two new IO_ flags: IO_NORMAL and IO_EXT.
These flags may be specified in the ioflags word of VOP_READ,
VOP_WRITE, and VOP_TRUNCATE. Specifying IO_NORMAL means that
you want to do I/O to the normal data part of the file and
IO_EXT means that you want to do I/O to the extended attributes
part of the file. IO_NORMAL and IO_EXT are mutually exclusive
for VOP_READ and VOP_WRITE, but may be specified individually
or together in the case of VOP_TRUNCATE. For example, when
removing a file, VOP_TRUNCATE is called with both IO_NORMAL
and IO_EXT set. For backward compatibility, if neither IO_NORMAL
nor IO_EXT is set, then IO_NORMAL is assumed.
Note that the BA_ and IO_ flags have been `merged' so that they
may both be used in the same flags word. This merger is possible
by assigning the IO_ flags to the low sixteen bits and the BA_
flags the high sixteen bits. This works because the high sixteen
bits of the IO_ word is reserved for read-ahead and help with
write clustering so will never be used for flags. This merge
lets us get away from code of the form:
if (ioflags & IO_SYNC)
flags |= BA_SYNC;
For the future, I have considered adding a new field to the
vattr structure, va_extsize. This addition could then be
exported through the stat structure to allow applications to
find out the size of the extended attribute storage and also
would provide a more standard interface for truncating them
(via VOP_SETATTR rather than VOP_TRUNCATE).
I am also contemplating adding a pathconf parameter (for
concreteness, lets call it _PC_MAX_EXTSIZE) which would
let an application determine the maximum size of the extended
atribute storage.
Sponsored by: DARPA & NAI Labs.
2002-07-19 07:29:39 +00:00
|
|
|
void softdep_setup_allocext(struct inode *, ufs_lbn_t, ufs2_daddr_t,
|
|
|
|
ufs2_daddr_t, long, long, struct buf *);
|
2002-03-19 22:40:48 +00:00
|
|
|
void softdep_setup_allocindir_meta(struct buf *, struct inode *,
|
2002-06-21 06:18:05 +00:00
|
|
|
struct buf *, int, ufs2_daddr_t);
|
2002-03-19 22:40:48 +00:00
|
|
|
void softdep_setup_allocindir_page(struct inode *, ufs_lbn_t,
|
2002-06-21 06:18:05 +00:00
|
|
|
struct buf *, int, ufs2_daddr_t, ufs2_daddr_t, struct buf *);
|
2010-04-24 07:05:35 +00:00
|
|
|
void softdep_setup_blkfree(struct mount *, struct buf *, ufs2_daddr_t, int,
|
|
|
|
struct workhead *);
|
|
|
|
void softdep_setup_inofree(struct mount *, struct buf *, ino_t,
|
|
|
|
struct workhead *);
|
|
|
|
void softdep_setup_sbupdate(struct ufsmount *, struct fs *, struct buf *);
|
2002-03-19 22:40:48 +00:00
|
|
|
void softdep_fsync_mountdev(struct vnode *);
|
2005-02-08 16:25:50 +00:00
|
|
|
int softdep_sync_metadata(struct vnode *);
|
2011-06-10 22:48:35 +00:00
|
|
|
int softdep_sync_buf(struct vnode *, struct buf *, int);
|
2006-03-02 05:50:23 +00:00
|
|
|
int softdep_process_worklist(struct mount *, int);
|
|
|
|
int softdep_fsync(struct vnode *);
|
|
|
|
int softdep_waitidle(struct mount *);
|
2010-04-24 07:05:35 +00:00
|
|
|
int softdep_prealloc(struct vnode *, int);
|
|
|
|
int softdep_journal_lookup(struct mount *, struct vnode **);
|
2011-06-10 22:48:35 +00:00
|
|
|
void softdep_journal_freeblocks(struct inode *, struct ucred *, off_t, int);
|
|
|
|
void softdep_journal_fsync(struct inode *);
|
2011-06-12 19:27:05 +00:00
|
|
|
void softdep_buf_append(struct buf *, struct workhead *);
|
|
|
|
void softdep_inode_append(struct inode *, struct ucred *, struct workhead *);
|
|
|
|
void softdep_freework(struct workhead *);
|
2011-06-10 22:48:35 +00:00
|
|
|
|
2010-04-24 07:05:35 +00:00
|
|
|
|
2011-03-23 05:13:54 +00:00
|
|
|
/*
|
|
|
|
* Things to request flushing in softdep_request_cleanup()
|
|
|
|
*/
|
|
|
|
#define FLUSH_INODES 1
|
|
|
|
#define FLUSH_INODES_WAIT 2
|
|
|
|
#define FLUSH_BLOCKS 3
|
|
|
|
#define FLUSH_BLOCKS_WAIT 4
|
1998-03-08 09:59:44 +00:00
|
|
|
|
2008-09-16 10:59:35 +00:00
|
|
|
int ffs_rdonly(struct inode *);
|
|
|
|
|
2011-06-12 19:27:05 +00:00
|
|
|
TAILQ_HEAD(snaphead, inode);
|
|
|
|
|
|
|
|
struct snapdata {
|
|
|
|
LIST_ENTRY(snapdata) sn_link;
|
|
|
|
struct snaphead sn_head;
|
|
|
|
daddr_t sn_listsize;
|
|
|
|
daddr_t *sn_blklist;
|
|
|
|
struct lock sn_lock;
|
|
|
|
};
|
2011-06-16 23:40:10 +00:00
|
|
|
|
2011-06-13 16:05:41 +00:00
|
|
|
#endif /* _KERNEL */
|
2011-06-12 19:27:05 +00:00
|
|
|
|
1996-05-01 02:16:17 +00:00
|
|
|
#endif /* !_UFS_FFS_EXTERN_H */
|