wok-6.x annotate linux/stuff/aufs3-loopback.patch @ rev 15733

linux: add CONFIG_X86_MSR and CONFIG_EFI
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Jan 01 19:09:17 2014 +0100 (2014-01-01)
parents
children a1084fda7f23
rev   line source
pascal@15733 1 aufs3.2 loopback patch
pascal@15733 2
pascal@15733 3 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
pascal@15733 4 index 1e888c9..17b3109 100644
pascal@15733 5 --- a/drivers/block/loop.c
pascal@15733 6 +++ b/drivers/block/loop.c
pascal@15733 7 @@ -499,7 +499,7 @@ out:
pascal@15733 8 }
pascal@15733 9
pascal@15733 10 struct switch_request {
pascal@15733 11 - struct file *file;
pascal@15733 12 + struct file *file, *virt_file;
pascal@15733 13 struct completion wait;
pascal@15733 14 };
pascal@15733 15
pascal@15733 16 @@ -559,7 +559,8 @@ static int loop_thread(void *data)
pascal@15733 17 * First it needs to flush existing IO, it does this by sending a magic
pascal@15733 18 * BIO down the pipe. The completion of this BIO does the actual switch.
pascal@15733 19 */
pascal@15733 20 -static int loop_switch(struct loop_device *lo, struct file *file)
pascal@15733 21 +static int loop_switch(struct loop_device *lo, struct file *file,
pascal@15733 22 + struct file *virt_file)
pascal@15733 23 {
pascal@15733 24 struct switch_request w;
pascal@15733 25 struct bio *bio = bio_alloc(GFP_KERNEL, 0);
pascal@15733 26 @@ -567,6 +568,7 @@ static int loop_switch(struct loop_device *lo, struct file *file)
pascal@15733 27 return -ENOMEM;
pascal@15733 28 init_completion(&w.wait);
pascal@15733 29 w.file = file;
pascal@15733 30 + w.virt_file = virt_file;
pascal@15733 31 bio->bi_private = &w;
pascal@15733 32 bio->bi_bdev = NULL;
pascal@15733 33 loop_make_request(lo->lo_queue, bio);
pascal@15733 34 @@ -583,7 +585,7 @@ static int loop_flush(struct loop_device *lo)
pascal@15733 35 if (!lo->lo_thread)
pascal@15733 36 return 0;
pascal@15733 37
pascal@15733 38 - return loop_switch(lo, NULL);
pascal@15733 39 + return loop_switch(lo, NULL, NULL);
pascal@15733 40 }
pascal@15733 41
pascal@15733 42 /*
pascal@15733 43 @@ -602,6 +604,7 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
pascal@15733 44 mapping = file->f_mapping;
pascal@15733 45 mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask);
pascal@15733 46 lo->lo_backing_file = file;
pascal@15733 47 + lo->lo_backing_virt_file = p->virt_file;
pascal@15733 48 lo->lo_blocksize = S_ISBLK(mapping->host->i_mode) ?
pascal@15733 49 mapping->host->i_bdev->bd_block_size : PAGE_SIZE;
pascal@15733 50 lo->old_gfp_mask = mapping_gfp_mask(mapping);
pascal@15733 51 @@ -610,6 +613,13 @@ out:
pascal@15733 52 complete(&p->wait);
pascal@15733 53 }
pascal@15733 54
pascal@15733 55 +static struct file *loop_real_file(struct file *file)
pascal@15733 56 +{
pascal@15733 57 + struct file *f = NULL;
pascal@15733 58 + if (file->f_dentry->d_sb->s_op->real_loop)
pascal@15733 59 + f = file->f_dentry->d_sb->s_op->real_loop(file);
pascal@15733 60 + return f;
pascal@15733 61 +}
pascal@15733 62
pascal@15733 63 /*
pascal@15733 64 * loop_change_fd switched the backing store of a loopback device to
pascal@15733 65 @@ -623,6 +633,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
pascal@15733 66 unsigned int arg)
pascal@15733 67 {
pascal@15733 68 struct file *file, *old_file;
pascal@15733 69 + struct file *f, *virt_file = NULL, *old_virt_file;
pascal@15733 70 struct inode *inode;
pascal@15733 71 int error;
pascal@15733 72
pascal@15733 73 @@ -639,9 +650,16 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
pascal@15733 74 file = fget(arg);
pascal@15733 75 if (!file)
pascal@15733 76 goto out;
pascal@15733 77 + f = loop_real_file(file);
pascal@15733 78 + if (f) {
pascal@15733 79 + virt_file = file;
pascal@15733 80 + file = f;
pascal@15733 81 + get_file(file);
pascal@15733 82 + }
pascal@15733 83
pascal@15733 84 inode = file->f_mapping->host;
pascal@15733 85 old_file = lo->lo_backing_file;
pascal@15733 86 + old_virt_file = lo->lo_backing_virt_file;
pascal@15733 87
pascal@15733 88 error = -EINVAL;
pascal@15733 89
pascal@15733 90 @@ -653,17 +671,21 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
pascal@15733 91 goto out_putf;
pascal@15733 92
pascal@15733 93 /* and ... switch */
pascal@15733 94 - error = loop_switch(lo, file);
pascal@15733 95 + error = loop_switch(lo, file, virt_file);
pascal@15733 96 if (error)
pascal@15733 97 goto out_putf;
pascal@15733 98
pascal@15733 99 fput(old_file);
pascal@15733 100 + if (old_virt_file)
pascal@15733 101 + fput(old_virt_file);
pascal@15733 102 if (lo->lo_flags & LO_FLAGS_PARTSCAN)
pascal@15733 103 ioctl_by_bdev(bdev, BLKRRPART, 0);
pascal@15733 104 return 0;
pascal@15733 105
pascal@15733 106 out_putf:
pascal@15733 107 fput(file);
pascal@15733 108 + if (virt_file)
pascal@15733 109 + fput(virt_file);
pascal@15733 110 out:
pascal@15733 111 return error;
pascal@15733 112 }
pascal@15733 113 @@ -806,7 +828,7 @@ static void loop_config_discard(struct loop_device *lo)
pascal@15733 114 static int loop_set_fd(struct loop_device *lo, fmode_t mode,
pascal@15733 115 struct block_device *bdev, unsigned int arg)
pascal@15733 116 {
pascal@15733 117 - struct file *file, *f;
pascal@15733 118 + struct file *file, *f, *virt_file = NULL;
pascal@15733 119 struct inode *inode;
pascal@15733 120 struct address_space *mapping;
pascal@15733 121 unsigned lo_blocksize;
pascal@15733 122 @@ -821,6 +843,12 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
pascal@15733 123 file = fget(arg);
pascal@15733 124 if (!file)
pascal@15733 125 goto out;
pascal@15733 126 + f = loop_real_file(file);
pascal@15733 127 + if (f) {
pascal@15733 128 + virt_file = file;
pascal@15733 129 + file = f;
pascal@15733 130 + get_file(file);
pascal@15733 131 + }
pascal@15733 132
pascal@15733 133 error = -EBUSY;
pascal@15733 134 if (lo->lo_state != Lo_unbound)
pascal@15733 135 @@ -869,6 +897,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
pascal@15733 136 lo->lo_device = bdev;
pascal@15733 137 lo->lo_flags = lo_flags;
pascal@15733 138 lo->lo_backing_file = file;
pascal@15733 139 + lo->lo_backing_virt_file = virt_file;
pascal@15733 140 lo->transfer = transfer_none;
pascal@15733 141 lo->ioctl = NULL;
pascal@15733 142 lo->lo_sizelimit = 0;
pascal@15733 143 @@ -914,6 +943,7 @@ out_clr:
pascal@15733 144 lo->lo_thread = NULL;
pascal@15733 145 lo->lo_device = NULL;
pascal@15733 146 lo->lo_backing_file = NULL;
pascal@15733 147 + lo->lo_backing_virt_file = NULL;
pascal@15733 148 lo->lo_flags = 0;
pascal@15733 149 set_capacity(lo->lo_disk, 0);
pascal@15733 150 invalidate_bdev(bdev);
pascal@15733 151 @@ -923,6 +953,8 @@ out_clr:
pascal@15733 152 lo->lo_state = Lo_unbound;
pascal@15733 153 out_putf:
pascal@15733 154 fput(file);
pascal@15733 155 + if (virt_file)
pascal@15733 156 + fput(virt_file);
pascal@15733 157 out:
pascal@15733 158 /* This is safe: open() is still holding a reference. */
pascal@15733 159 module_put(THIS_MODULE);
pascal@15733 160 @@ -969,6 +1001,7 @@ loop_init_xfer(struct loop_device *lo, struct loop_func_table *xfer,
pascal@15733 161 static int loop_clr_fd(struct loop_device *lo)
pascal@15733 162 {
pascal@15733 163 struct file *filp = lo->lo_backing_file;
pascal@15733 164 + struct file *virt_filp = lo->lo_backing_virt_file;
pascal@15733 165 gfp_t gfp = lo->old_gfp_mask;
pascal@15733 166 struct block_device *bdev = lo->lo_device;
pascal@15733 167
pascal@15733 168 @@ -989,6 +1022,7 @@ static int loop_clr_fd(struct loop_device *lo)
pascal@15733 169
pascal@15733 170 spin_lock_irq(&lo->lo_lock);
pascal@15733 171 lo->lo_backing_file = NULL;
pascal@15733 172 + lo->lo_backing_virt_file = NULL;
pascal@15733 173 spin_unlock_irq(&lo->lo_lock);
pascal@15733 174
pascal@15733 175 loop_release_xfer(lo);
pascal@15733 176 @@ -1029,6 +1063,8 @@ static int loop_clr_fd(struct loop_device *lo)
pascal@15733 177 * bd_mutex which is usually taken before lo_ctl_mutex.
pascal@15733 178 */
pascal@15733 179 fput(filp);
pascal@15733 180 + if (virt_filp)
pascal@15733 181 + fput(virt_filp);
pascal@15733 182 return 0;
pascal@15733 183 }
pascal@15733 184
pascal@15733 185 diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c
pascal@15733 186 index d6318f08b..56555de 100644
pascal@15733 187 --- a/fs/aufs/f_op.c
pascal@15733 188 +++ b/fs/aufs/f_op.c
pascal@15733 189 @@ -355,7 +355,7 @@ static ssize_t aufs_splice_read(struct file *file, loff_t *ppos,
pascal@15733 190 err = -EINVAL;
pascal@15733 191 h_file = au_hf_top(file);
pascal@15733 192 get_file(h_file);
pascal@15733 193 - if (au_test_loopback_kthread()) {
pascal@15733 194 + if (0 && au_test_loopback_kthread()) {
pascal@15733 195 au_warn_loopback(h_file->f_dentry->d_sb);
pascal@15733 196 if (file->f_mapping != h_file->f_mapping) {
pascal@15733 197 file->f_mapping = h_file->f_mapping;
pascal@15733 198 diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c
pascal@15733 199 index ccae19c..15dc5c2 100644
pascal@15733 200 --- a/fs/aufs/loop.c
pascal@15733 201 +++ b/fs/aufs/loop.c
pascal@15733 202 @@ -133,3 +133,19 @@ void au_loopback_fin(void)
pascal@15733 203 {
pascal@15733 204 kfree(au_warn_loopback_array);
pascal@15733 205 }
pascal@15733 206 +
pascal@15733 207 +/* ---------------------------------------------------------------------- */
pascal@15733 208 +
pascal@15733 209 +/* support the loopback block device insude aufs */
pascal@15733 210 +
pascal@15733 211 +struct file *aufs_real_loop(struct file *file)
pascal@15733 212 +{
pascal@15733 213 + struct file *f;
pascal@15733 214 +
pascal@15733 215 + BUG_ON(!au_test_aufs(file->f_dentry->d_sb));
pascal@15733 216 + fi_read_lock(file);
pascal@15733 217 + f = au_hf_top(file);
pascal@15733 218 + fi_read_unlock(file);
pascal@15733 219 + AuDebugOn(!f);
pascal@15733 220 + return f;
pascal@15733 221 +}
pascal@15733 222 diff --git a/fs/aufs/loop.h b/fs/aufs/loop.h
pascal@15733 223 index 88d019c..8707c3a 100644
pascal@15733 224 --- a/fs/aufs/loop.h
pascal@15733 225 +++ b/fs/aufs/loop.h
pascal@15733 226 @@ -36,6 +36,8 @@ void au_warn_loopback(struct super_block *h_sb);
pascal@15733 227
pascal@15733 228 int au_loopback_init(void);
pascal@15733 229 void au_loopback_fin(void);
pascal@15733 230 +
pascal@15733 231 +struct file *aufs_real_loop(struct file *file);
pascal@15733 232 #else
pascal@15733 233 AuStubInt0(au_test_loopback_overlap, struct super_block *sb,
pascal@15733 234 struct dentry *h_adding)
pascal@15733 235 @@ -44,6 +46,8 @@ AuStubVoid(au_warn_loopback, struct super_block *h_sb)
pascal@15733 236
pascal@15733 237 AuStubInt0(au_loopback_init, void)
pascal@15733 238 AuStubVoid(au_loopback_fin, void)
pascal@15733 239 +
pascal@15733 240 +AuStub(struct file *, aufs_real_loop, return NULL, struct file *file)
pascal@15733 241 #endif /* BLK_DEV_LOOP */
pascal@15733 242
pascal@15733 243 #endif /* __KERNEL__ */
pascal@15733 244 diff --git a/fs/aufs/super.c b/fs/aufs/super.c
pascal@15733 245 index d105672..304f2e5 100644
pascal@15733 246 --- a/fs/aufs/super.c
pascal@15733 247 +++ b/fs/aufs/super.c
pascal@15733 248 @@ -823,7 +823,10 @@ static const struct super_operations aufs_sop = {
pascal@15733 249 .statfs = aufs_statfs,
pascal@15733 250 .put_super = aufs_put_super,
pascal@15733 251 .sync_fs = aufs_sync_fs,
pascal@15733 252 - .remount_fs = aufs_remount_fs
pascal@15733 253 + .remount_fs = aufs_remount_fs,
pascal@15733 254 +#ifdef CONFIG_AUFS_BDEV_LOOP
pascal@15733 255 + .real_loop = aufs_real_loop
pascal@15733 256 +#endif
pascal@15733 257 };
pascal@15733 258
pascal@15733 259 /* ---------------------------------------------------------------------- */
pascal@15733 260 diff --git a/include/linux/fs.h b/include/linux/fs.h
pascal@15733 261 index e0bc4ff..bd7b3a4 100644
pascal@15733 262 --- a/include/linux/fs.h
pascal@15733 263 +++ b/include/linux/fs.h
pascal@15733 264 @@ -1683,6 +1683,10 @@ struct super_operations {
pascal@15733 265 int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
pascal@15733 266 int (*nr_cached_objects)(struct super_block *);
pascal@15733 267 void (*free_cached_objects)(struct super_block *, int);
pascal@15733 268 +#if defined(CONFIG_BLK_DEV_LOOP) || defined(CONFIG_BLK_DEV_LOOP_MODULE)
pascal@15733 269 + /* and aufs */
pascal@15733 270 + struct file *(*real_loop)(struct file *);
pascal@15733 271 +#endif
pascal@15733 272 };
pascal@15733 273
pascal@15733 274 /*
pascal@15733 275 diff --git a/include/linux/loop.h b/include/linux/loop.h
pascal@15733 276 index 11a41a8..c190b78 100644
pascal@15733 277 --- a/include/linux/loop.h
pascal@15733 278 +++ b/include/linux/loop.h
pascal@15733 279 @@ -48,7 +48,7 @@ struct loop_device {
pascal@15733 280 int (*ioctl)(struct loop_device *, int cmd,
pascal@15733 281 unsigned long arg);
pascal@15733 282
pascal@15733 283 - struct file * lo_backing_file;
pascal@15733 284 + struct file * lo_backing_file, *lo_backing_virt_file;
pascal@15733 285 struct block_device *lo_device;
pascal@15733 286 unsigned lo_blocksize;
pascal@15733 287 void *key_data;