In preparation for checkpoint/restart of file leases, add ->fl_type_prev field to 'struct file_lock'. This field is needed to correctly restore file leases in case of recursive checkpoint/restart of an in-progress lease. This ->fl_type_prev is only initialized in this patch. It will actually be used when restoring file leases after a checkpoint. Signed-off-by: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> --- fs/locks.c | 10 ++++++++++ include/linux/fs.h | 1 + 2 files changed, 11 insertions(+), 0 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index 0bd5af7..9a00876 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -184,6 +184,7 @@ void locks_init_lock(struct file_lock *fl) fl->fl_file = NULL; fl->fl_flags = 0; fl->fl_type = 0; + fl->fl_type_prev = 0; fl->fl_start = fl->fl_end = 0; fl->fl_break_time = 0UL; fl->fl_ops = NULL; @@ -227,6 +228,7 @@ void __locks_copy_lock(struct file_lock *new, const struct file_lock *fl) new->fl_file = NULL; new->fl_flags = fl->fl_flags; new->fl_type = fl->fl_type; + new->fl_type_prev = fl->fl_type_prev; new->fl_start = fl->fl_start; new->fl_end = fl->fl_end; new->fl_break_time = 0UL; @@ -293,6 +295,13 @@ static int assign_type(struct file_lock *fl, int type) case F_WRLCK: case F_UNLCK: fl->fl_type = type; + /* + * Clear ->fl_type_prev since this is a new lease type. + * break_lease() will use this cleared state to know + * if it must save the lease-type in case of checkpoint/ + * restart. + */ + fl->fl_type_prev = 0; break; default: return -EINVAL; @@ -1222,6 +1231,7 @@ int __break_lease(struct inode *inode, unsigned int mode) for (fl = flock; fl && IS_LEASE(fl); fl = fl->fl_next) { if (fl->fl_type != future) { + fl->fl_type_prev = fl->fl_type; fl->fl_type = future; fl->fl_break_time = break_time; /* lease must have lmops break callback */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 49d4eeb..299cc09 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1066,6 +1066,7 @@ struct file_lock { fl_owner_t fl_owner; unsigned char fl_flags; unsigned char fl_type; + unsigned char fl_type_prev; unsigned int fl_pid; struct pid *fl_nspid; wait_queue_head_t fl_wait; -- 1.6.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html