|
@@ -13,11 +13,7 @@
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
* GNU General Public License for more details.
|
|
|
*
|
|
|
- * You should have received a copy of the GNU General Public License
|
|
|
- * along with this program; if not, write to the Free Software
|
|
|
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
- *
|
|
|
- * Written by Ryusuke Konishi <ryusuke@osrg.net>
|
|
|
+ * Written by Ryusuke Konishi.
|
|
|
*
|
|
|
*/
|
|
|
|
|
@@ -49,18 +45,26 @@
|
|
|
*/
|
|
|
#define SC_N_INODEVEC 16 /* Size of locally allocated inode vector */
|
|
|
|
|
|
-#define SC_MAX_SEGDELTA 64 /* Upper limit of the number of segments
|
|
|
- appended in collection retry loop */
|
|
|
+#define SC_MAX_SEGDELTA 64 /*
|
|
|
+ * Upper limit of the number of segments
|
|
|
+ * appended in collection retry loop
|
|
|
+ */
|
|
|
|
|
|
/* Construction mode */
|
|
|
enum {
|
|
|
SC_LSEG_SR = 1, /* Make a logical segment having a super root */
|
|
|
- SC_LSEG_DSYNC, /* Flush data blocks of a given file and make
|
|
|
- a logical segment without a super root */
|
|
|
- SC_FLUSH_FILE, /* Flush data files, leads to segment writes without
|
|
|
- creating a checkpoint */
|
|
|
- SC_FLUSH_DAT, /* Flush DAT file. This also creates segments without
|
|
|
- a checkpoint */
|
|
|
+ SC_LSEG_DSYNC, /*
|
|
|
+ * Flush data blocks of a given file and make
|
|
|
+ * a logical segment without a super root.
|
|
|
+ */
|
|
|
+ SC_FLUSH_FILE, /*
|
|
|
+ * Flush data files, leads to segment writes without
|
|
|
+ * creating a checkpoint.
|
|
|
+ */
|
|
|
+ SC_FLUSH_DAT, /*
|
|
|
+ * Flush DAT file. This also creates segments
|
|
|
+ * without a checkpoint.
|
|
|
+ */
|
|
|
};
|
|
|
|
|
|
/* Stage numbers of dirty block collection */
|
|
@@ -154,17 +158,15 @@ static int nilfs_prepare_segment_lock(struct nilfs_transaction_info *ti)
|
|
|
if (cur_ti) {
|
|
|
if (cur_ti->ti_magic == NILFS_TI_MAGIC)
|
|
|
return ++cur_ti->ti_count;
|
|
|
- else {
|
|
|
- /*
|
|
|
- * If journal_info field is occupied by other FS,
|
|
|
- * it is saved and will be restored on
|
|
|
- * nilfs_transaction_commit().
|
|
|
- */
|
|
|
- printk(KERN_WARNING
|
|
|
- "NILFS warning: journal info from a different "
|
|
|
- "FS\n");
|
|
|
- save = current->journal_info;
|
|
|
- }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If journal_info field is occupied by other FS,
|
|
|
+ * it is saved and will be restored on
|
|
|
+ * nilfs_transaction_commit().
|
|
|
+ */
|
|
|
+ printk(KERN_WARNING
|
|
|
+ "NILFS warning: journal info from a different FS\n");
|
|
|
+ save = current->journal_info;
|
|
|
}
|
|
|
if (!ti) {
|
|
|
ti = kmem_cache_alloc(nilfs_transaction_cachep, GFP_NOFS);
|
|
@@ -397,10 +399,10 @@ static void nilfs_transaction_unlock(struct super_block *sb)
|
|
|
|
|
|
static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci,
|
|
|
struct nilfs_segsum_pointer *ssp,
|
|
|
- unsigned bytes)
|
|
|
+ unsigned int bytes)
|
|
|
{
|
|
|
struct nilfs_segment_buffer *segbuf = sci->sc_curseg;
|
|
|
- unsigned blocksize = sci->sc_super->s_blocksize;
|
|
|
+ unsigned int blocksize = sci->sc_super->s_blocksize;
|
|
|
void *p;
|
|
|
|
|
|
if (unlikely(ssp->offset + bytes > blocksize)) {
|
|
@@ -422,8 +424,8 @@ static int nilfs_segctor_reset_segment_buffer(struct nilfs_sc_info *sci)
|
|
|
{
|
|
|
struct nilfs_segment_buffer *segbuf = sci->sc_curseg;
|
|
|
struct buffer_head *sumbh;
|
|
|
- unsigned sumbytes;
|
|
|
- unsigned flags = 0;
|
|
|
+ unsigned int sumbytes;
|
|
|
+ unsigned int flags = 0;
|
|
|
int err;
|
|
|
|
|
|
if (nilfs_doing_gc())
|
|
@@ -444,8 +446,10 @@ static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci)
|
|
|
{
|
|
|
sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks;
|
|
|
if (NILFS_SEGBUF_IS_LAST(sci->sc_curseg, &sci->sc_segbufs))
|
|
|
- return -E2BIG; /* The current segment is filled up
|
|
|
- (internal code) */
|
|
|
+ return -E2BIG; /*
|
|
|
+ * The current segment is filled up
|
|
|
+ * (internal code)
|
|
|
+ */
|
|
|
sci->sc_curseg = NILFS_NEXT_SEGBUF(sci->sc_curseg);
|
|
|
return nilfs_segctor_reset_segment_buffer(sci);
|
|
|
}
|
|
@@ -472,9 +476,9 @@ static int nilfs_segctor_add_super_root(struct nilfs_sc_info *sci)
|
|
|
*/
|
|
|
static int nilfs_segctor_segsum_block_required(
|
|
|
struct nilfs_sc_info *sci, const struct nilfs_segsum_pointer *ssp,
|
|
|
- unsigned binfo_size)
|
|
|
+ unsigned int binfo_size)
|
|
|
{
|
|
|
- unsigned blocksize = sci->sc_super->s_blocksize;
|
|
|
+ unsigned int blocksize = sci->sc_super->s_blocksize;
|
|
|
/* Size of finfo and binfo is enough small against blocksize */
|
|
|
|
|
|
return ssp->offset + binfo_size +
|
|
@@ -533,7 +537,7 @@ static void nilfs_segctor_end_finfo(struct nilfs_sc_info *sci,
|
|
|
static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci,
|
|
|
struct buffer_head *bh,
|
|
|
struct inode *inode,
|
|
|
- unsigned binfo_size)
|
|
|
+ unsigned int binfo_size)
|
|
|
{
|
|
|
struct nilfs_segment_buffer *segbuf;
|
|
|
int required, err = 0;
|
|
@@ -617,7 +621,7 @@ static void nilfs_write_file_node_binfo(struct nilfs_sc_info *sci,
|
|
|
*vblocknr = binfo->bi_v.bi_vblocknr;
|
|
|
}
|
|
|
|
|
|
-static struct nilfs_sc_operations nilfs_sc_file_ops = {
|
|
|
+static const struct nilfs_sc_operations nilfs_sc_file_ops = {
|
|
|
.collect_data = nilfs_collect_file_data,
|
|
|
.collect_node = nilfs_collect_file_node,
|
|
|
.collect_bmap = nilfs_collect_file_bmap,
|
|
@@ -666,7 +670,7 @@ static void nilfs_write_dat_node_binfo(struct nilfs_sc_info *sci,
|
|
|
*binfo_dat = binfo->bi_dat;
|
|
|
}
|
|
|
|
|
|
-static struct nilfs_sc_operations nilfs_sc_dat_ops = {
|
|
|
+static const struct nilfs_sc_operations nilfs_sc_dat_ops = {
|
|
|
.collect_data = nilfs_collect_dat_data,
|
|
|
.collect_node = nilfs_collect_file_node,
|
|
|
.collect_bmap = nilfs_collect_dat_bmap,
|
|
@@ -674,7 +678,7 @@ static struct nilfs_sc_operations nilfs_sc_dat_ops = {
|
|
|
.write_node_binfo = nilfs_write_dat_node_binfo,
|
|
|
};
|
|
|
|
|
|
-static struct nilfs_sc_operations nilfs_sc_dsync_ops = {
|
|
|
+static const struct nilfs_sc_operations nilfs_sc_dsync_ops = {
|
|
|
.collect_data = nilfs_collect_file_data,
|
|
|
.collect_node = NULL,
|
|
|
.collect_bmap = NULL,
|
|
@@ -777,7 +781,7 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs,
|
|
|
{
|
|
|
struct nilfs_inode_info *ii, *n;
|
|
|
struct nilfs_inode_info *ivec[SC_N_INODEVEC], **pii;
|
|
|
- unsigned nv = 0;
|
|
|
+ unsigned int nv = 0;
|
|
|
|
|
|
while (!list_empty(head)) {
|
|
|
spin_lock(&nilfs->ns_inode_lock);
|
|
@@ -875,9 +879,11 @@ static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci)
|
|
|
err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, 1,
|
|
|
&raw_cp, &bh_cp);
|
|
|
if (likely(!err)) {
|
|
|
- /* The following code is duplicated with cpfile. But, it is
|
|
|
- needed to collect the checkpoint even if it was not newly
|
|
|
- created */
|
|
|
+ /*
|
|
|
+ * The following code is duplicated with cpfile. But, it is
|
|
|
+ * needed to collect the checkpoint even if it was not newly
|
|
|
+ * created.
|
|
|
+ */
|
|
|
mark_buffer_dirty(bh_cp);
|
|
|
nilfs_mdt_mark_dirty(nilfs->ns_cpfile);
|
|
|
nilfs_cpfile_put_checkpoint(
|
|
@@ -958,7 +964,7 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci,
|
|
|
{
|
|
|
struct buffer_head *bh_sr;
|
|
|
struct nilfs_super_root *raw_sr;
|
|
|
- unsigned isz, srsz;
|
|
|
+ unsigned int isz, srsz;
|
|
|
|
|
|
bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root;
|
|
|
raw_sr = (struct nilfs_super_root *)bh_sr->b_data;
|
|
@@ -1043,7 +1049,7 @@ static size_t nilfs_segctor_buffer_rest(struct nilfs_sc_info *sci)
|
|
|
|
|
|
static int nilfs_segctor_scan_file(struct nilfs_sc_info *sci,
|
|
|
struct inode *inode,
|
|
|
- struct nilfs_sc_operations *sc_ops)
|
|
|
+ const struct nilfs_sc_operations *sc_ops)
|
|
|
{
|
|
|
LIST_HEAD(data_buffers);
|
|
|
LIST_HEAD(node_buffers);
|
|
@@ -1406,8 +1412,10 @@ static void nilfs_free_incomplete_logs(struct list_head *logs,
|
|
|
if (atomic_read(&segbuf->sb_err)) {
|
|
|
/* Case 1: The first segment failed */
|
|
|
if (segbuf->sb_pseg_start != segbuf->sb_fseg_start)
|
|
|
- /* Case 1a: Partial segment appended into an existing
|
|
|
- segment */
|
|
|
+ /*
|
|
|
+ * Case 1a: Partial segment appended into an existing
|
|
|
+ * segment
|
|
|
+ */
|
|
|
nilfs_terminate_segment(nilfs, segbuf->sb_fseg_start,
|
|
|
segbuf->sb_fseg_end);
|
|
|
else /* Case 1b: New full segment */
|
|
@@ -1550,7 +1558,7 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci,
|
|
|
sector_t blocknr;
|
|
|
unsigned long nfinfo = segbuf->sb_sum.nfinfo;
|
|
|
unsigned long nblocks = 0, ndatablk = 0;
|
|
|
- struct nilfs_sc_operations *sc_op = NULL;
|
|
|
+ const struct nilfs_sc_operations *sc_op = NULL;
|
|
|
struct nilfs_segsum_pointer ssp;
|
|
|
struct nilfs_finfo *finfo = NULL;
|
|
|
union nilfs_binfo binfo;
|
|
@@ -1631,8 +1639,10 @@ static int nilfs_segctor_assign(struct nilfs_sc_info *sci, int mode)
|
|
|
static void nilfs_begin_page_io(struct page *page)
|
|
|
{
|
|
|
if (!page || PageWriteback(page))
|
|
|
- /* For split b-tree node pages, this function may be called
|
|
|
- twice. We ignore the 2nd or later calls by this check. */
|
|
|
+ /*
|
|
|
+ * For split b-tree node pages, this function may be called
|
|
|
+ * twice. We ignore the 2nd or later calls by this check.
|
|
|
+ */
|
|
|
return;
|
|
|
|
|
|
lock_page(page);
|
|
@@ -1942,7 +1952,7 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci,
|
|
|
ifile, ii->vfs_inode.i_ino, &ibh);
|
|
|
if (unlikely(err)) {
|
|
|
nilfs_warning(sci->sc_super, __func__,
|
|
|
- "failed to get inode block.\n");
|
|
|
+ "failed to get inode block.");
|
|
|
return err;
|
|
|
}
|
|
|
mark_buffer_dirty(ibh);
|
|
@@ -2395,6 +2405,7 @@ static int nilfs_segctor_construct(struct nilfs_sc_info *sci, int mode)
|
|
|
static void nilfs_construction_timeout(unsigned long data)
|
|
|
{
|
|
|
struct task_struct *p = (struct task_struct *)data;
|
|
|
+
|
|
|
wake_up_process(p);
|
|
|
}
|
|
|
|
|
@@ -2555,10 +2566,10 @@ static int nilfs_segctor_thread(void *arg)
|
|
|
|
|
|
if (timeout || sci->sc_seq_request != sci->sc_seq_done)
|
|
|
mode = SC_LSEG_SR;
|
|
|
- else if (!sci->sc_flush_request)
|
|
|
- break;
|
|
|
- else
|
|
|
+ else if (sci->sc_flush_request)
|
|
|
mode = nilfs_segctor_flush_mode(sci);
|
|
|
+ else
|
|
|
+ break;
|
|
|
|
|
|
spin_unlock(&sci->sc_state_lock);
|
|
|
nilfs_segctor_thread_construct(sci, mode);
|
|
@@ -2684,8 +2695,10 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci)
|
|
|
{
|
|
|
int ret, retrycount = NILFS_SC_CLEANUP_RETRY;
|
|
|
|
|
|
- /* The segctord thread was stopped and its timer was removed.
|
|
|
- But some tasks remain. */
|
|
|
+ /*
|
|
|
+ * The segctord thread was stopped and its timer was removed.
|
|
|
+ * But some tasks remain.
|
|
|
+ */
|
|
|
do {
|
|
|
struct nilfs_transaction_info ti;
|
|
|
|
|
@@ -2727,13 +2740,13 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
|
|
|
|
|
|
if (!list_empty(&sci->sc_dirty_files)) {
|
|
|
nilfs_warning(sci->sc_super, __func__,
|
|
|
- "dirty file(s) after the final construction\n");
|
|
|
+ "dirty file(s) after the final construction");
|
|
|
nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1);
|
|
|
}
|
|
|
|
|
|
if (!list_empty(&sci->sc_iput_queue)) {
|
|
|
nilfs_warning(sci->sc_super, __func__,
|
|
|
- "iput queue is not empty\n");
|
|
|
+ "iput queue is not empty");
|
|
|
nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1);
|
|
|
}
|
|
|
|
|
@@ -2810,7 +2823,7 @@ void nilfs_detach_log_writer(struct super_block *sb)
|
|
|
if (!list_empty(&nilfs->ns_dirty_files)) {
|
|
|
list_splice_init(&nilfs->ns_dirty_files, &garbage_list);
|
|
|
nilfs_warning(sb, __func__,
|
|
|
- "Hit dirty file after stopped log writer\n");
|
|
|
+ "Hit dirty file after stopped log writer");
|
|
|
}
|
|
|
spin_unlock(&nilfs->ns_inode_lock);
|
|
|
up_write(&nilfs->ns_segctor_sem);
|